diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..07361bc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.png filter=lfs diff=lfs merge=lfs -text +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.jpg filter=lfs diff=lfs merge=lfs -text +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.mesh filter=lfs diff=lfs merge=lfs -text +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.ico filter=lfs diff=lfs merge=lfs -text +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.hdr filter=lfs diff=lfs merge=lfs -text +tradeshow/knx-demo/3d-Alexa-knx-demo/**/*.uip filter=lfs diff=lfs merge=lfs -text diff --git a/.gitmodules b/.gitmodules index 4784266..2ecbb11 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ [submodule "tradeshow/enterprise-kinectdatavis/src/libfreenect"] path = tradeshow/enterprise-kinectdatavis/src/libfreenect url = https://github.com/OpenKinect/libfreenect.git -[submodule "basicsuite/qtwebbrowser/tqtc-qtwebbrowser"] - path = basicsuite/qtwebbrowser/tqtc-qtwebbrowser - url = ssh://codereview.qt-project.org:29418/qt-apps/qtwebbrowser - diff --git a/basicsuite/.gitignore b/basicsuite/.gitignore new file mode 100644 index 0000000..3cb11b4 --- /dev/null +++ b/basicsuite/.gitignore @@ -0,0 +1,6 @@ +*.o +moc_* +Makefile +*.pro.user +*.so +*.moc diff --git a/basicsuite/about-b2qt/demo.xml b/basicsuite/about-b2qt/demo.xml new file mode 100644 index 0000000..193022f --- /dev/null +++ b/basicsuite/about-b2qt/demo.xml @@ -0,0 +1,7 @@ + + + + +Provides an introduction to what Qt for Device Creation is all about. + + diff --git a/basicsuite/advancedcustommaterial/ControlSlider.qml b/basicsuite/advancedcustommaterial/ControlSlider.qml new file mode 100644 index 0000000..ed93add --- /dev/null +++ b/basicsuite/advancedcustommaterial/ControlSlider.qml @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +Rectangle { + id: sliderRoot + width: parent.width + height: parent.height * .1 + color: _backgroundColor + property alias text: sliderText.text + property alias value: slider.value + property alias minimumValue: slider.minimumValue + property alias maximumValue: slider.maximumValue + + Text { + id: sliderText + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: parent.height * .1 + color: "white" + font.bold: true + font.pixelSize: parent.height * .3 + } + Slider { + id: slider + anchors {left: parent.left; top: sliderText.bottom; right: parent.right; bottom: parent.bottom; margins: parent.height *.1} + style: SliderStyle { + groove: Rectangle { + implicitWidth: 200 + implicitHeight: 8 + color: _secondaryGrey + radius: 8 + + Rectangle { + implicitWidth: styleData.handlePosition + implicitHeight: 8 + color: _darkGreen + radius: 8 + } + } + handle: Rectangle { + anchors.centerIn: parent + color: _primaryGreen + implicitWidth: sliderRoot.height *.4 + implicitHeight: implicitWidth + radius: implicitWidth / 2 + } + } + } + Rectangle { + height: 2 + anchors { left:parent.left; right: parent.right; bottom: parent.bottom } + color: "black" + } +} diff --git a/basicsuite/advancedcustommaterial/SceneRoot.qml b/basicsuite/advancedcustommaterial/SceneRoot.qml new file mode 100644 index 0000000..a15fb02 --- /dev/null +++ b/basicsuite/advancedcustommaterial/SceneRoot.qml @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt3D.Core 2.0 +import Qt3D.Render 2.0 +import Qt3D.Extras 2.0 +import Qt3D.Input 2.0 +import QtQuick 2.0 as QQ2 + + +Entity { + id: sceneRoot + + Camera { + id: camera + projectionType: CameraLens.PerspectiveProjection + fieldOfView: 45 + nearPlane: 0.1 + farPlane: 1000.0 + position: Qt.vector3d(0.0, 4.0, 15.0) + upVector: Qt.vector3d(0.0, 1.0, 0.0) + viewCenter: Qt.vector3d(0.0, -2.0, 0.0) + } + + FirstPersonCameraController { + camera: camera + } + + Entity { + DirectionalLight { + id: directional + worldDirection: Qt.vector3d(0.3, -1.0, 5.0).normalized(); + color: "#fff2a3" + intensity: 0.01 + } + Transform { + id: lightpostransform + translation: Qt.vector3d(0.0, 50.0, 60.0) + } + components: [lightpostransform, directional] + } + + Entity { + PointLight { + id: pointL + color: "#fff2a3" + } + Transform{ + id: plightpostransform + translation: Qt.vector3d(0.0, 4.0, 15.0) + } + components: [plightpostransform, pointL] + } + + components: [ + RenderSettings { + activeFrameGraph: ForwardRenderer { + id: renderer + clearColor: "black" + camera: camera + } + }, + InputSettings { } + ] + + Water { } +} diff --git a/basicsuite/advancedcustommaterial/Water.qml b/basicsuite/advancedcustommaterial/Water.qml new file mode 100644 index 0000000..54967fa --- /dev/null +++ b/basicsuite/advancedcustommaterial/Water.qml @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt3D.Core 2.0 +import Qt3D.Render 2.0 +import Qt3D.Input 2.0 +import Qt3D.Extras 2.0 +import QtQuick 2.0 as QQ2 + + + Entity { + id: water + + WaterMaterial { + id: watermaterial + + property real tox: 0.0 + property real toy: 0.0 + property real vertY: 1.0 + property real waveRandomAnim: 0.0 + + diffuse: "textures/WaterDiffuse.jpg" + normal: "textures/WaterNormal.jpg" + specular: "textures/WaterSpecular.jpg" + wave: "textures/Waterwave.jpg" + sky: "textures/sky.jpg" + foam: "textures/foam.jpg" + + textureScale: slidertexscale.value + wavescale: vertY * sliderwavespeed.value + specularity: sliderspecularity.value + offsetx: tox * slidertexturespeed.value + offsety: toy * slidertexturespeed.value + normalAmount: slidernormal.value + waveheight: sliderwaveheight.value + waveStrenght: sliderdistortion.value + shininess: 100 + waveRandom: waveRandomAnim + } + + Mesh { + id: watermesh + source: "models/waterPlane.obj" + } + + Transform { + id: waterTransform + property real scale: 1.0 + property real rotx: 0.0 + scale3D: Qt.vector3d(scale, scale, scale) + rotationY: slidermeshrotation.value + } + + Entity { + id: waterEntity + components: [watermesh, watermaterial, waterTransform] + } + + QQ2.SequentialAnimation { + QQ2.NumberAnimation { + target: watermaterial + property: "waveRandomAnim" + to: 3.0 + duration: 4000 + easing.type: Easing.Linear + } + QQ2.NumberAnimation { + target: watermaterial + property: "waveRandomAnim" + to: 1.0 + duration: 4000 + easing.type: Easing.Linear + } + } + + QQ2.SequentialAnimation { + running: true + loops: QQ2.Animation.Infinite + QQ2.ParallelAnimation { + QQ2.NumberAnimation { + target: watermaterial + property: "toy" + to: 10.0 + duration: 100000 + } + QQ2.NumberAnimation { + target: watermaterial + property: "tox" + to: 10.0 + duration: 100000 + } + } + QQ2.ParallelAnimation { + QQ2.NumberAnimation { + target: watermaterial + property: "toy" + to: 0.0 + duration: 0 + } + QQ2.NumberAnimation { + target: watermaterial + property: "tox" + to: 0.0 + duration: 0 + } + } + } + + QQ2.SequentialAnimation { + running: true + loops: QQ2.Animation.Infinite + QQ2.NumberAnimation { + target: watermaterial + property: "vertY" + to: 200 + duration: 200000 + easing.type: Easing.Linear + } + QQ2.NumberAnimation { + target: watermaterial + property: "vertY" + to: 2 + duration: 200000 + easing.type: Easing.Linear + } + } +} + diff --git a/basicsuite/advancedcustommaterial/WaterMaterial.qml b/basicsuite/advancedcustommaterial/WaterMaterial.qml new file mode 100644 index 0000000..6ea3007 --- /dev/null +++ b/basicsuite/advancedcustommaterial/WaterMaterial.qml @@ -0,0 +1,263 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt3D.Core 2.0 +import Qt3D.Render 2.0 + +Material { + id: root + + property color ambient: Qt.rgba(0.15, 0.35, 0.50, 1.0) + property alias diffuse: diffuseTextureImage.source + property alias normal: normalTextureImage.source + property alias wave: waveTextureImage.source + property alias specular: specularTextureImage.source + property alias sky: skyTextureImage.source + property alias foam: foamTextureImage.source + + property color specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) + property real shininess: 150.0 + property real textureScale: 1.0 + property real offsetx: 0.0 + property real offsety: 0.0 + property real wavescale: 0.0 + property real specularity: 1.0 + property real waveheight: 0.1 + property real waveStrenght: 0.1 + property real normalAmount: 2.0 + property real waveRandom: 1.0 + + parameters: [ + Parameter { name: "ka"; value: Qt.vector3d(root.ambient.r, root.ambient.g, root.ambient.b) }, + Parameter { + name: "foamTexture" + value: Texture2D { + id: foamTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + maximumAnisotropy: 16.0 + TextureImage { id: foamTextureImage } + } + }, + Parameter { + name: "skyTexture" + value: Texture2D { + id: skyTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + maximumAnisotropy: 16.0 + TextureImage { id: skyTextureImage } + } + }, + Parameter { + name: "waveTexture" + value: Texture2D { + id: waveTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + maximumAnisotropy: 16.0 + TextureImage { id: waveTextureImage } + } + }, + Parameter { + name: "specularTexture" + value: Texture2D { + id: specularTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + maximumAnisotropy: 16.0 + TextureImage { id: specularTextureImage } + } + }, + Parameter { + name: "diffuseTexture" + value: Texture2D { + id: diffuseTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + maximumAnisotropy: 16.0 + TextureImage { id: diffuseTextureImage } + } + }, + Parameter { + name: "normalTexture" + value: Texture2D { + id: normalTexture + minificationFilter: Texture.LinearMipMapLinear + magnificationFilter: Texture.Linear + wrapMode { + x: WrapMode.Repeat + y: WrapMode.Repeat + } + generateMipMaps: true + + maximumAnisotropy: 16.0 + TextureImage { id: normalTextureImage } + } + }, + Parameter { + name: "specularColor" + value: Qt.vector3d(root.specularColor.r, root.specularColor.g, root.specularColor.b) + }, + Parameter { name: "shininess"; value: root.shininess }, + Parameter { name: "texCoordScale"; value: textureScale }, + Parameter { name: "offsetx"; value: root.offsetx }, + Parameter { name: "offsety"; value: root.offsety }, + Parameter { name: "vertYpos"; value: root.wavescale }, + Parameter { name: "specularity"; value: root.specularity }, + Parameter { name: "waveheight"; value: root.waveheight }, + Parameter { name: "waveStrenght"; value: root.waveStrenght }, + Parameter { name: "waveRandom"; value: root.waveRandom }, + Parameter { name: "normalAmount"; value: root.normalAmount } + ] + + + effect: Effect { + property url vertex: "shaders/gl3/water.vert" + property url fragment: "shaders/gl3/water.frag" + property url vertexES: "shaders/es2/water.vert" + property url fragmentES: "shaders/es2/water.frag" + + FilterKey { + id: forward + name: "renderingStyle" + value: "forward" + } + ShaderProgram { + id: gl3Shader + vertexShaderCode: loadSource(parent.vertex) + fragmentShaderCode: loadSource(parent.fragment) + } + ShaderProgram { + id: esShader + vertexShaderCode: loadSource(parent.vertexES) + fragmentShaderCode: loadSource(parent.fragmentES) + } + + AlphaCoverage { id: alphaCoverage } + + DepthTest { + id: depth + depthFunction: DepthTest.Less } + + techniques: [ + // OpenGL 3.1 + Technique { + filterKeys: [ forward ] + graphicsApiFilter { + api: GraphicsApiFilter.OpenGL + profile: GraphicsApiFilter.CoreProfile + majorVersion: 3 + minorVersion: 1 + } + renderPasses: RenderPass { + shaderProgram: gl3Shader + renderStates: [alphaCoverage ] + } + }, + + // OpenGLES 2.0 + Technique { + filterKeys: [ forward ] + graphicsApiFilter { + api: GraphicsApiFilter.OpenGLES + majorVersion: 2 + minorVersion: 0 + } + renderPasses: RenderPass { + shaderProgram: esShader + renderStates: [ alphaCoverage ] + } + }, + + // OpenGL ES 2 + Technique { + filterKeys: [ forward ] + graphicsApiFilter { + api: GraphicsApiFilter.OpenGLES + profile: GraphicsApiFilter.NoProfile + majorVersion: 2 + minorVersion: 0 + } + renderPasses: RenderPass { + shaderProgram: esShader + renderStates: [ alphaCoverage ] + } + } + ] + } +} + + diff --git a/basicsuite/advancedcustommaterial/advancedcustommaterial.pro b/basicsuite/advancedcustommaterial/advancedcustommaterial.pro new file mode 100644 index 0000000..a02d283 --- /dev/null +++ b/basicsuite/advancedcustommaterial/advancedcustommaterial.pro @@ -0,0 +1,20 @@ +TARGET = custommaterial + +include(../shared/shared.pri) +b2qtdemo_deploy_defaults() + +content.files = \ + main.qml \ + SceneRoot.qml \ + ControlSlider.qml \ + Water.qml \ + WaterMaterial.qml \ + models \ + shaders \ + textures + +content.path = $$DESTPATH + +OTHER_FILES += $${content.files} + +INSTALLS += target content diff --git a/basicsuite/advancedcustommaterial/demo.xml b/basicsuite/advancedcustommaterial/demo.xml new file mode 100644 index 0000000..ce9abef --- /dev/null +++ b/basicsuite/advancedcustommaterial/demo.xml @@ -0,0 +1,9 @@ + + + + +This example demonstrates advanced materials in Qt3D. + +Demo shows complex shaders and demonstrates controlling your shader properties with QtQuick user interface and Animation. Water is a 3D mesh, that is modeled and uv mapped inside Blender, and then brought into Scene 3D as an .obj file. + + diff --git a/basicsuite/advancedcustommaterial/main.qml b/basicsuite/advancedcustommaterial/main.qml new file mode 100644 index 0000000..135907a --- /dev/null +++ b/basicsuite/advancedcustommaterial/main.qml @@ -0,0 +1,150 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Scene3D 2.0 +import Qt3D.Render 2.0 +import QtQuick.Controls 1.4 + +Rectangle { + id: scene + visible: true + property bool colorChange: true + anchors.fill: parent + color: "#2d2d2d" + + transform: Rotation { + id: sceneRotation + axis.x: 1 + axis.y: 0 + axis.z: 0 + origin.x: scene.width / 2 + origin.y: scene.height / 2 + } + Rectangle { + id: controlsbg + anchors { left: parent.left; top: parent.top; bottom:parent.bottom } + width: parent.width * .3 + color: _backgroundColor + + Column { + anchors.fill: parent + + ControlSlider { + id: slidertexscale + text: "TEXTURE SCALE" + value: 1.0 + minimumValue: 0.3 + } + ControlSlider { + id: slidertexturespeed + text: "TEXTURE SPEED" + value: 1.1 + maximumValue: 4.0 + minimumValue: 0.0 + } + ControlSlider { + id: sliderspecularity + text: "SPECULARITY" + value: 1.0 + maximumValue: 3.0 + minimumValue: 0.0 + } + ControlSlider { + id: sliderdistortion + text: "DISTORTION" + value: 0.015 + maximumValue: 0.1 + minimumValue: 0.0 + } + ControlSlider { + id: slidernormal + text: "NORMAL AMOUNT" + value: 2.2 + maximumValue: 4.0 + minimumValue: 0.0 + } + ControlSlider { + id: sliderwavespeed + text: "WAVE SPEED" + value: 0.75 + maximumValue: 4.0 + minimumValue: 0.1 + } + ControlSlider { + id: sliderwaveheight + text: "WAVE HEIGHT" + value: 0.2 + maximumValue: 0.5 + minimumValue: 0.02 + } + ControlSlider { + id: slidermeshrotation + text: "MESH ROTATION" + value: 35.0 + maximumValue: 360.0 + minimumValue: 0.0 + } + } + } + + Scene3D { + id: scene3d + anchors { left: controlsbg.right; top:parent.top; right: parent.right; bottom: parent.bottom } + focus: true + aspects: ["input", "logic"] + cameraAspectRatioMode: Scene3D.AutomaticAspectRatio + + SceneRoot { + id: root + } + } +} + diff --git a/basicsuite/advancedcustommaterial/models/waterPlane.obj b/basicsuite/advancedcustommaterial/models/waterPlane.obj new file mode 100644 index 0000000..5d27eba --- /dev/null +++ b/basicsuite/advancedcustommaterial/models/waterPlane.obj @@ -0,0 +1,52263 @@ +# Blender v2.77 (sub 0) OBJ File: 'CustomShaderExampleModels.blend' +# www.blender.org +mtllib waterPlane2.mtl +o Plane +v -5.906582 -2.000000 5.906582 +v 5.906582 -2.000000 5.906582 +v -5.906582 -2.000000 -5.906582 +v 5.906582 -2.000000 -5.906582 +v 5.906583 -1.989998 -5.814293 +v 5.906583 -1.989998 -5.906583 +v 5.814293 -1.989998 -5.906583 +v 0.000000 -1.989998 -5.906583 +v -0.092290 -1.989998 -5.906583 +v 5.906583 -1.990000 0.092290 +v 5.906583 -1.990000 -0.000000 +v 5.906583 -1.990001 3.045582 +v 5.906583 -1.990001 2.953292 +v -2.953291 -1.989998 -5.906583 +v -3.045582 -1.989998 -5.906583 +v 2.953291 -1.989998 -5.906583 +v 2.861001 -1.989998 -5.906583 +v 5.906583 -1.989999 -2.861001 +v 5.906583 -1.989999 -2.953291 +v 5.906583 -1.989999 -1.384355 +v 5.906583 -1.989999 -1.476646 +v 1.476646 -1.989998 -5.906583 +v 1.384355 -1.989998 -5.906583 +v -4.429937 -1.989998 -5.906583 +v -4.522227 -1.989998 -5.906583 +v 5.906583 -1.990002 4.522227 +v 5.906583 -1.990002 4.429936 +v 5.906583 -1.990001 1.568936 +v 5.906583 -1.990001 1.476646 +v -1.476646 -1.989998 -5.906583 +v -1.568936 -1.989998 -5.906583 +v 4.429937 -1.989998 -5.906583 +v 4.337647 -1.989998 -5.906583 +v 5.906583 -1.989998 -4.337647 +v 5.906583 -1.989998 -4.429937 +v 5.906583 -1.989998 -3.599324 +v 5.906583 -1.989998 -3.691614 +v 3.691614 -1.989998 -5.906583 +v 3.599324 -1.989998 -5.906583 +v -2.214968 -1.989998 -5.906583 +v -2.307259 -1.989998 -5.906583 +v 5.906583 -1.990001 2.307259 +v 5.906583 -1.990001 2.214968 +v 5.906583 -1.990002 5.260550 +v 5.906583 -1.990002 5.168260 +v -5.168260 -1.989998 -5.906583 +v -5.260550 -1.989998 -5.906583 +v 0.738323 -1.989998 -5.906583 +v 0.646033 -1.989998 -5.906583 +v 5.906583 -1.990000 -0.646033 +v 5.906583 -1.990000 -0.738323 +v 5.906583 -1.989999 -2.122678 +v 5.906583 -1.989999 -2.214968 +v 2.214968 -1.989998 -5.906583 +v 2.122678 -1.989998 -5.906583 +v -3.691614 -1.989998 -5.906583 +v -3.783905 -1.989998 -5.906583 +v 5.906583 -1.990002 3.783905 +v 5.906583 -1.990002 3.691614 +v 5.906583 -1.990000 0.830613 +v 5.906583 -1.990000 0.738323 +v -0.738323 -1.989998 -5.906583 +v -0.830613 -1.989998 -5.906583 +v 5.168260 -1.989998 -5.906583 +v 5.075970 -1.989998 -5.906583 +v 5.906583 -1.989998 -5.075970 +v 5.906583 -1.989998 -5.168261 +v 5.906583 -1.989998 -4.706809 +v 5.906583 -1.989998 -4.799099 +v 4.799098 -1.989998 -5.906583 +v 4.706808 -1.989998 -5.906583 +v -1.107484 -1.989998 -5.906583 +v -1.199775 -1.989998 -5.906583 +v 5.906583 -1.990001 1.199775 +v 5.906583 -1.990000 1.107484 +v 5.906583 -1.990002 4.153066 +v 5.906583 -1.990002 4.060775 +v -4.060776 -1.989998 -5.906583 +v -4.153066 -1.989998 -5.906583 +v 1.845807 -1.989998 -5.906583 +v 1.753517 -1.989998 -5.906583 +v 5.906583 -1.989999 -1.753517 +v 5.906583 -1.989999 -1.845807 +v 5.906583 -1.990000 -0.276871 +v 5.906583 -1.990000 -0.369161 +v 0.369161 -1.989998 -5.906583 +v 0.276871 -1.989998 -5.906583 +v -5.537421 -1.989998 -5.906583 +v -5.629711 -1.989998 -5.906583 +v 5.906583 -1.990002 5.629711 +v 5.906583 -1.990002 5.537421 +v 5.906583 -1.990001 2.676420 +v 5.906583 -1.990001 2.584130 +v -2.584130 -1.989998 -5.906583 +v -2.676420 -1.989998 -5.906583 +v 3.322453 -1.989998 -5.906583 +v 3.230163 -1.989998 -5.906583 +v 5.906583 -1.989999 -3.230162 +v 5.906583 -1.989999 -3.322453 +v 5.906583 -1.989998 -3.968485 +v 5.906583 -1.989998 -4.060776 +v 4.060776 -1.989998 -5.906583 +v 3.968485 -1.989998 -5.906583 +v -1.845807 -1.989998 -5.906583 +v -1.938097 -1.989998 -5.906583 +v 5.906583 -1.990001 1.938097 +v 5.906583 -1.990001 1.845807 +v 5.906583 -1.990002 4.891388 +v 5.906583 -1.990002 4.799098 +v -4.799098 -1.989998 -5.906583 +v -4.891389 -1.989998 -5.906583 +v 1.107484 -1.989998 -5.906583 +v 1.015194 -1.989998 -5.906583 +v 5.906583 -1.990000 -1.015194 +v 5.906583 -1.990000 -1.107484 +v 5.906583 -1.989999 -2.491840 +v 5.906583 -1.989999 -2.584130 +v 2.584130 -1.989998 -5.906583 +v 2.491840 -1.989998 -5.906583 +v -3.322453 -1.989998 -5.906583 +v -3.414743 -1.989998 -5.906583 +v 5.906583 -1.990001 3.414743 +v 5.906583 -1.990001 3.322453 +v 5.906583 -1.990000 0.461452 +v 5.906583 -1.990000 0.369161 +v -0.369161 -1.989998 -5.906583 +v -0.461452 -1.989998 -5.906583 +v 5.537421 -1.989998 -5.906583 +v 5.445131 -1.989998 -5.906583 +v 5.906583 -1.989998 -5.445132 +v 5.906583 -1.989998 -5.537422 +v 5.906583 -1.989998 -5.260551 +v 5.906583 -1.989998 -5.352841 +v 5.352840 -1.989998 -5.906583 +v 5.260550 -1.989998 -5.906583 +v -0.553742 -1.989998 -5.906583 +v -0.646033 -1.989998 -5.906583 +v 5.906583 -1.990000 0.646032 +v 5.906583 -1.990000 0.553742 +v 5.906583 -1.990002 3.599324 +v 5.906583 -1.990001 3.507034 +v -3.507033 -1.989998 -5.906583 +v -3.599324 -1.989998 -5.906583 +v 2.399549 -1.989998 -5.906583 +v 2.307259 -1.989998 -5.906583 +v 5.906583 -1.989999 -2.307259 +v 5.906583 -1.989999 -2.399549 +v 5.906583 -1.990000 -0.830613 +v 5.906583 -1.990000 -0.922903 +v 0.922904 -1.989998 -5.906583 +v 0.830613 -1.989998 -5.906583 +v -4.983679 -1.989998 -5.906583 +v -5.075970 -1.989998 -5.906583 +v 5.906583 -1.990002 5.075969 +v 5.906583 -1.990002 4.983679 +v 5.906583 -1.990001 2.122678 +v 5.906583 -1.990001 2.030388 +v -2.030388 -1.989998 -5.906583 +v -2.122678 -1.989998 -5.906583 +v 3.876195 -1.989998 -5.906583 +v 3.783905 -1.989998 -5.906583 +v 5.906583 -1.989998 -3.783904 +v 5.906583 -1.989998 -3.876195 +v 5.906583 -1.989999 -3.045582 +v 5.906583 -1.989999 -3.137872 +v 3.137872 -1.989998 -5.906583 +v 3.045582 -1.989998 -5.906583 +v -2.768711 -1.989998 -5.906583 +v -2.861001 -1.989998 -5.906583 +v 5.906583 -1.990001 2.861001 +v 5.906583 -1.990001 2.768711 +v 5.906583 -1.990002 5.814292 +v 5.906583 -1.990002 5.722002 +v -5.722002 -1.989998 -5.906583 +v -5.814293 -1.989998 -5.906583 +v 0.184581 -1.989998 -5.906583 +v 0.092290 -1.989998 -5.906583 +v 5.906583 -1.990000 -0.092290 +v 5.906583 -1.990000 -0.184581 +v 5.906583 -1.989999 -1.568936 +v 5.906583 -1.989999 -1.661227 +v 1.661226 -1.989998 -5.906583 +v 1.568936 -1.989998 -5.906583 +v -4.245357 -1.989998 -5.906583 +v -4.337647 -1.989998 -5.906583 +v 5.906583 -1.990002 4.337646 +v 5.906583 -1.990002 4.245356 +v 5.906583 -1.990001 1.384355 +v 5.906583 -1.990001 1.292065 +v -1.292065 -1.989998 -5.906583 +v -1.384355 -1.989998 -5.906583 +v 4.614518 -1.989998 -5.906583 +v 4.522227 -1.989998 -5.906583 +v 5.906583 -1.989998 -4.522228 +v 5.906583 -1.989998 -4.614518 +v 5.906583 -1.989998 -4.891389 +v 5.906583 -1.989998 -4.983680 +v 4.983679 -1.989998 -5.906583 +v 4.891389 -1.989998 -5.906583 +v -0.922904 -1.989998 -5.906583 +v -1.015194 -1.989998 -5.906583 +v 5.906583 -1.990000 1.015194 +v 5.906583 -1.990000 0.922904 +v 5.906583 -1.990002 3.968486 +v 5.906583 -1.990002 3.876195 +v -3.876195 -1.989998 -5.906583 +v -3.968485 -1.989998 -5.906583 +v 2.030388 -1.989998 -5.906583 +v 1.938097 -1.989998 -5.906583 +v 5.906583 -1.989999 -1.938098 +v 5.906583 -1.989999 -2.030388 +v 5.906583 -1.990000 -0.461452 +v 5.906583 -1.990000 -0.553742 +v 0.553742 -1.989998 -5.906583 +v 0.461452 -1.989998 -5.906583 +v -5.352840 -1.989998 -5.906583 +v -5.445131 -1.989998 -5.906583 +v 5.906583 -1.990002 5.445131 +v 5.906583 -1.990002 5.352840 +v 5.906583 -1.990001 2.491840 +v 5.906583 -1.990001 2.399549 +v -2.399549 -1.989998 -5.906583 +v -2.491840 -1.989998 -5.906583 +v 3.507033 -1.989998 -5.906583 +v 3.414743 -1.989998 -5.906583 +v 5.906583 -1.989999 -3.414743 +v 5.906583 -1.989999 -3.507034 +v 5.906583 -1.989998 -4.153067 +v 5.906583 -1.989998 -4.245357 +v 4.245357 -1.989998 -5.906583 +v 4.153066 -1.989998 -5.906583 +v -1.661226 -1.989998 -5.906583 +v -1.753517 -1.989998 -5.906583 +v 5.906583 -1.990001 1.753517 +v 5.906583 -1.990001 1.661226 +v 5.906583 -1.990002 4.706808 +v 5.906583 -1.990002 4.614517 +v -4.614518 -1.989998 -5.906583 +v -4.706808 -1.989998 -5.906583 +v 1.292065 -1.989998 -5.906583 +v 1.199775 -1.989998 -5.906583 +v 5.906583 -1.989999 -1.199775 +v 5.906583 -1.989999 -1.292065 +v 5.906583 -1.989999 -2.676420 +v 5.906583 -1.989999 -2.768710 +v 2.768711 -1.989998 -5.906583 +v 2.676420 -1.989998 -5.906583 +v -3.137872 -1.989998 -5.906583 +v -3.230163 -1.989998 -5.906583 +v 5.906583 -1.990001 3.230162 +v 5.906583 -1.990001 3.137872 +v 5.906583 -1.990000 0.276871 +v 5.906583 -1.990000 0.184581 +v -0.184581 -1.989998 -5.906583 +v -0.276871 -1.989998 -5.906583 +v 5.722002 -1.989998 -5.906583 +v 5.629711 -1.989998 -5.906583 +v 5.906583 -1.989998 -5.629712 +v 5.906583 -1.989998 -5.722003 +v -5.906583 -1.989999 -1.938098 +v -5.906583 -1.989999 -2.030388 +v -5.906583 -1.989999 -1.845807 +v -5.906583 -1.989999 -2.122678 +v -5.906583 -1.989999 -2.214968 +v -5.906583 -1.989999 -1.568936 +v -5.906583 -1.989999 -1.661227 +v -5.906583 -1.989999 -1.476646 +v -5.906583 -1.989999 -1.753517 +v -5.906583 -1.989999 -2.676420 +v -5.906583 -1.989999 -2.768710 +v -5.906583 -1.989999 -2.584130 +v -5.906583 -1.989999 -2.861001 +v -5.906583 -1.989999 -2.953291 +v -5.906583 -1.989999 -2.307259 +v -5.906583 -1.989999 -2.399549 +v -5.906583 -1.989999 -2.491840 +v -5.906583 -1.990000 -0.461452 +v -5.906583 -1.990000 -0.553742 +v -5.906583 -1.990000 -0.369161 +v -5.906583 -1.990000 -0.646033 +v -5.906583 -1.990000 -0.738323 +v -5.906583 -1.990000 -0.092290 +v -5.906583 -1.990000 -0.184581 +v -5.906583 -1.990000 -0.000000 +v -5.906583 -1.990000 -0.276871 +v -5.906583 -1.989999 -1.199775 +v -5.906583 -1.989999 -1.292065 +v -5.906583 -1.990000 -1.107484 +v -5.906583 -1.989999 -1.384355 +v -5.906583 -1.990000 -0.830613 +v -5.906583 -1.990000 -0.922903 +v -5.906583 -1.990000 -1.015194 +v -5.906583 -1.989998 -4.891389 +v -5.906583 -1.989998 -4.983680 +v -5.906583 -1.989998 -4.799099 +v -5.906583 -1.989998 -5.075970 +v -5.906583 -1.989998 -5.168261 +v -5.906583 -1.989998 -4.522228 +v -5.906583 -1.989998 -4.614518 +v -5.906583 -1.989998 -4.429937 +v -5.906583 -1.989998 -4.706809 +v -5.906583 -1.989998 -5.629712 +v -5.906583 -1.989998 -5.722003 +v -5.906583 -1.989998 -5.537422 +v -5.906583 -1.989998 -5.814293 +v -5.906583 -1.989998 -5.906583 +v -5.906583 -1.989998 -5.260551 +v -5.906583 -1.989998 -5.352841 +v -5.906583 -1.989998 -5.445132 +v -5.906583 -1.989999 -3.414743 +v -5.906583 -1.989999 -3.507034 +v -5.906583 -1.989999 -3.322453 +v -5.906583 -1.989998 -3.599324 +v -5.906583 -1.989998 -3.691614 +v -5.906583 -1.989999 -3.045582 +v -5.906583 -1.989999 -3.137872 +v -5.906583 -1.989999 -3.230162 +v -5.906583 -1.989998 -4.153067 +v -5.906583 -1.989998 -4.245357 +v -5.906583 -1.989998 -4.060776 +v -5.906583 -1.989998 -4.337647 +v -5.906583 -1.989998 -3.783904 +v -5.906583 -1.989998 -3.876195 +v -5.906583 -1.989998 -3.968485 +v -2.030388 -1.990002 5.906582 +v -1.938097 -1.990002 5.906582 +v -1.845807 -1.990002 5.906582 +v -2.214968 -1.990002 5.906582 +v -2.122678 -1.990002 5.906582 +v -1.661226 -1.990002 5.906582 +v -1.568936 -1.990002 5.906582 +v -1.476646 -1.990002 5.906582 +v -1.753517 -1.990002 5.906582 +v -2.768711 -1.990002 5.906582 +v -2.676420 -1.990002 5.906582 +v -2.584130 -1.990002 5.906582 +v -2.953291 -1.990002 5.906582 +v -2.861001 -1.990002 5.906582 +v -2.399549 -1.990002 5.906582 +v -2.307259 -1.990002 5.906582 +v -2.491840 -1.990002 5.906582 +v -0.553742 -1.990002 5.906582 +v -0.461452 -1.990002 5.906582 +v -0.369161 -1.990002 5.906582 +v -0.738323 -1.990002 5.906582 +v -0.646033 -1.990002 5.906582 +v -0.184581 -1.990002 5.906582 +v -0.092290 -1.990002 5.906582 +v 0.000000 -1.990002 5.906582 +v -0.276871 -1.990002 5.906582 +v -1.292065 -1.990002 5.906582 +v -1.199775 -1.990002 5.906582 +v -1.107484 -1.990002 5.906582 +v -1.384355 -1.990002 5.906582 +v -0.922904 -1.990002 5.906582 +v -0.830613 -1.990002 5.906582 +v -1.015194 -1.990002 5.906582 +v -5.906583 -1.990002 3.968486 +v -5.906583 -1.990002 3.876195 +v -5.906583 -1.990002 4.060775 +v -5.906583 -1.990002 3.783905 +v -5.906583 -1.990002 3.691614 +v -5.906583 -1.990002 4.337646 +v -5.906583 -1.990002 4.245356 +v -5.906583 -1.990002 4.429936 +v -5.906583 -1.990002 4.153066 +v -5.906583 -1.990001 3.230162 +v -5.906583 -1.990001 3.137872 +v -5.906583 -1.990001 3.322453 +v -5.906583 -1.990001 3.045582 +v -5.906583 -1.990001 2.953292 +v -5.906583 -1.990002 3.599324 +v -5.906583 -1.990001 3.507034 +v -5.906583 -1.990001 3.414743 +v -4.983679 -1.990002 5.906582 +v -4.891389 -1.990002 5.906582 +v -4.799098 -1.990002 5.906582 +v -5.168260 -1.990002 5.906582 +v -5.075970 -1.990002 5.906582 +v -4.614518 -1.990002 5.906582 +v -4.522227 -1.990002 5.906582 +v -4.429937 -1.990002 5.906582 +v -4.706808 -1.990002 5.906582 +v -5.906583 -1.990002 5.445131 +v -5.906583 -1.990002 5.352840 +v -5.906583 -1.990002 5.537421 +v -5.906583 -1.990002 5.260550 +v -5.906583 -1.990002 5.168260 +v -5.722002 -1.990002 5.906582 +v -5.629711 -1.990002 5.906582 +v -5.537421 -1.990002 5.906582 +v -5.906583 -1.990002 5.814292 +v -5.906583 -1.990002 5.722002 +v -5.906583 -1.990002 5.906582 +v -5.814293 -1.990002 5.906582 +v -5.906583 -1.990002 5.629711 +v -5.352840 -1.990002 5.906582 +v -5.260550 -1.990002 5.906582 +v -5.445131 -1.990002 5.906582 +v -5.906583 -1.990002 4.706808 +v -5.906583 -1.990002 4.614517 +v -5.906583 -1.990002 4.799098 +v -5.906583 -1.990002 4.522227 +v -5.906583 -1.990002 5.075969 +v -5.906583 -1.990002 4.983679 +v -5.906583 -1.990002 4.891388 +v -3.507033 -1.990002 5.906582 +v -3.414743 -1.990002 5.906582 +v -3.322453 -1.990002 5.906582 +v -3.691614 -1.990002 5.906582 +v -3.599324 -1.990002 5.906582 +v -3.137872 -1.990002 5.906582 +v -3.045582 -1.990002 5.906582 +v -3.230163 -1.990002 5.906582 +v -4.245357 -1.990002 5.906582 +v -4.153066 -1.990002 5.906582 +v -4.060776 -1.990002 5.906582 +v -4.337647 -1.990002 5.906582 +v -3.876195 -1.990002 5.906582 +v -3.783905 -1.990002 5.906582 +v -3.968485 -1.990002 5.906582 +v -5.906583 -1.990000 1.015194 +v -5.906583 -1.990000 0.922904 +v -5.906583 -1.990000 1.107484 +v -5.906583 -1.990000 0.830613 +v -5.906583 -1.990000 0.738323 +v -5.906583 -1.990001 1.384355 +v -5.906583 -1.990001 1.292065 +v -5.906583 -1.990001 1.476646 +v -5.906583 -1.990001 1.199775 +v -5.906583 -1.990000 0.276871 +v -5.906583 -1.990000 0.184581 +v -5.906583 -1.990000 0.369161 +v -5.906583 -1.990000 0.092290 +v -5.906583 -1.990000 0.646032 +v -5.906583 -1.990000 0.553742 +v -5.906583 -1.990000 0.461452 +v -5.906583 -1.990001 2.491840 +v -5.906583 -1.990001 2.399549 +v -5.906583 -1.990001 2.584130 +v -5.906583 -1.990001 2.307259 +v -5.906583 -1.990001 2.214968 +v -5.906583 -1.990001 2.861001 +v -5.906583 -1.990001 2.768711 +v -5.906583 -1.990001 2.676420 +v -5.906583 -1.990001 1.753517 +v -5.906583 -1.990001 1.661226 +v -5.906583 -1.990001 1.845807 +v -5.906583 -1.990001 1.568936 +v -5.906583 -1.990001 2.122678 +v -5.906583 -1.990001 2.030388 +v -5.906583 -1.990001 1.938097 +v 3.876195 -1.990002 5.906582 +v 3.968485 -1.990002 5.906582 +v 4.060776 -1.990002 5.906582 +v 3.691614 -1.990002 5.906582 +v 3.783905 -1.990002 5.906582 +v 4.245357 -1.990002 5.906582 +v 4.337647 -1.990002 5.906582 +v 4.429937 -1.990002 5.906582 +v 4.153066 -1.990002 5.906582 +v 3.137872 -1.990002 5.906582 +v 3.230163 -1.990002 5.906582 +v 3.322453 -1.990002 5.906582 +v 2.953291 -1.990002 5.906582 +v 3.045582 -1.990002 5.906582 +v 3.507033 -1.990002 5.906582 +v 3.599324 -1.990002 5.906582 +v 3.414743 -1.990002 5.906582 +v 5.352840 -1.990002 5.906582 +v 5.445131 -1.990002 5.906582 +v 5.537421 -1.990002 5.906582 +v 5.168260 -1.990002 5.906582 +v 5.260550 -1.990002 5.906582 +v 5.722002 -1.990002 5.906582 +v 5.814293 -1.990002 5.906582 +v 5.906583 -1.990002 5.906582 +v 5.629711 -1.990002 5.906582 +v 4.614518 -1.990002 5.906582 +v 4.706808 -1.990002 5.906582 +v 4.799098 -1.990002 5.906582 +v 4.522227 -1.990002 5.906582 +v 4.983679 -1.990002 5.906582 +v 5.075970 -1.990002 5.906582 +v 4.891389 -1.990002 5.906582 +v 0.922904 -1.990002 5.906582 +v 1.015194 -1.990002 5.906582 +v 1.107484 -1.990002 5.906582 +v 0.738323 -1.990002 5.906582 +v 0.830613 -1.990002 5.906582 +v 1.292065 -1.990002 5.906582 +v 1.384355 -1.990002 5.906582 +v 1.476646 -1.990002 5.906582 +v 1.199775 -1.990002 5.906582 +v 0.184581 -1.990002 5.906582 +v 0.276871 -1.990002 5.906582 +v 0.369161 -1.990002 5.906582 +v 0.092290 -1.990002 5.906582 +v 0.553742 -1.990002 5.906582 +v 0.646033 -1.990002 5.906582 +v 0.461452 -1.990002 5.906582 +v 2.399549 -1.990002 5.906582 +v 2.491840 -1.990002 5.906582 +v 2.584130 -1.990002 5.906582 +v 2.214968 -1.990002 5.906582 +v 2.307259 -1.990002 5.906582 +v 2.768711 -1.990002 5.906582 +v 2.861001 -1.990002 5.906582 +v 2.676420 -1.990002 5.906582 +v 1.661226 -1.990002 5.906582 +v 1.753517 -1.990002 5.906582 +v 1.845807 -1.990002 5.906582 +v 1.568936 -1.990002 5.906582 +v 2.030388 -1.990002 5.906582 +v 2.122678 -1.990002 5.906582 +v 1.938097 -1.990002 5.906582 +v 5.906583 0.010002 -5.814293 +v 5.906583 0.010002 -5.906583 +v 5.814293 0.010002 -5.906583 +v 0.000000 0.010002 -5.906583 +v -0.092290 0.010002 -5.906583 +v 5.906583 0.010000 0.092290 +v 5.906583 0.010000 -0.000000 +v 5.906583 0.009999 3.045582 +v 5.906583 0.009999 2.953291 +v -2.953291 0.010002 -5.906583 +v -3.045582 0.010002 -5.906583 +v 2.953291 0.010002 -5.906583 +v 2.861001 0.010002 -5.906583 +v 5.906583 0.010001 -2.861001 +v 5.906583 0.010001 -2.953291 +v 5.906583 0.010001 -1.384355 +v 5.906583 0.010001 -1.476646 +v 1.476646 0.010002 -5.906583 +v 1.384355 0.010002 -5.906583 +v -4.429937 0.010002 -5.906583 +v -4.522227 0.010002 -5.906583 +v 5.906583 0.009998 4.522227 +v 5.906583 0.009998 4.429937 +v 5.906583 0.009999 1.568936 +v 5.906583 0.009999 1.476646 +v -1.476646 0.010002 -5.906583 +v -1.568936 0.010002 -5.906583 +v 4.429937 0.010002 -5.906583 +v 4.337647 0.010002 -5.906583 +v 5.906583 0.010002 -4.337647 +v 5.906583 0.010002 -4.429937 +v 5.906583 0.010001 -3.599324 +v 5.906583 0.010002 -3.691614 +v 3.691614 0.010002 -5.906583 +v 3.599324 0.010002 -5.906583 +v -2.214968 0.010002 -5.906583 +v -2.307259 0.010002 -5.906583 +v 5.906583 0.009999 2.307259 +v 5.906583 0.009999 2.214968 +v 5.906583 0.009998 5.260550 +v 5.906583 0.009998 5.168260 +v -5.168260 0.010002 -5.906583 +v -5.260550 0.010002 -5.906583 +v 0.738323 0.010002 -5.906583 +v 0.646033 0.010002 -5.906583 +v 5.906583 0.010000 -0.646033 +v 5.906583 0.010000 -0.738323 +v 5.906583 0.010001 -2.122678 +v 5.906583 0.010001 -2.214968 +v 2.214968 0.010002 -5.906583 +v 2.122678 0.010002 -5.906583 +v -3.691614 0.010002 -5.906583 +v -3.783905 0.010002 -5.906583 +v 5.906583 0.009998 3.783905 +v 5.906583 0.009998 3.691614 +v 5.906583 0.010000 0.830613 +v 5.906583 0.010000 0.738323 +v -0.738323 0.010002 -5.906583 +v -0.830613 0.010002 -5.906583 +v 5.168260 0.010002 -5.906583 +v 5.075970 0.010002 -5.906583 +v 5.906583 0.010002 -5.075970 +v 5.906583 0.010002 -5.168260 +v 5.906583 0.010002 -4.706808 +v 5.906583 0.010002 -4.799098 +v 4.799098 0.010002 -5.906583 +v 4.706808 0.010002 -5.906583 +v -1.107484 0.010002 -5.906583 +v -1.199775 0.010002 -5.906583 +v 5.906583 0.010000 1.199775 +v 5.906583 0.010000 1.107484 +v 5.906583 0.009998 4.153066 +v 5.906583 0.009998 4.060776 +v -4.060776 0.010002 -5.906583 +v -4.153066 0.010002 -5.906583 +v 1.845807 0.010002 -5.906583 +v 1.753517 0.010002 -5.906583 +v 5.906583 0.010001 -1.753517 +v 5.906583 0.010001 -1.845807 +v 5.906583 0.010000 -0.276871 +v 5.906583 0.010000 -0.369161 +v 0.369161 0.010002 -5.906583 +v 0.276871 0.010002 -5.906583 +v -5.537421 0.010002 -5.906583 +v -5.629711 0.010002 -5.906583 +v 5.906583 0.009998 5.629711 +v 5.906583 0.009998 5.537421 +v 5.906583 0.009999 2.676420 +v 5.906583 0.009999 2.584130 +v -2.584130 0.010002 -5.906583 +v -2.676420 0.010002 -5.906583 +v 3.322453 0.010002 -5.906583 +v 3.230163 0.010002 -5.906583 +v 5.906583 0.010001 -3.230163 +v 5.906583 0.010001 -3.322453 +v 5.906583 0.010002 -3.968485 +v 5.906583 0.010002 -4.060776 +v 4.060776 0.010002 -5.906583 +v 3.968485 0.010002 -5.906583 +v -1.845807 0.010002 -5.906583 +v -1.938097 0.010002 -5.906583 +v 5.906583 0.009999 1.938097 +v 5.906583 0.009999 1.845807 +v 5.906583 0.009998 4.891389 +v 5.906583 0.009998 4.799098 +v -4.799098 0.010002 -5.906583 +v -4.891389 0.010002 -5.906583 +v 1.107484 0.010002 -5.906583 +v 1.015194 0.010002 -5.906583 +v 5.906583 0.010000 -1.015194 +v 5.906583 0.010000 -1.107484 +v 5.906583 0.010001 -2.491840 +v 5.906583 0.010001 -2.584130 +v 2.584130 0.010002 -5.906583 +v 2.491840 0.010002 -5.906583 +v -3.322453 0.010002 -5.906583 +v -3.414743 0.010002 -5.906583 +v 5.906583 0.009999 3.414743 +v 5.906583 0.009999 3.322453 +v 5.906583 0.010000 0.461452 +v 5.906583 0.010000 0.369161 +v -0.369161 0.010002 -5.906583 +v -0.461452 0.010002 -5.906583 +v 5.537421 0.010002 -5.906583 +v 5.445131 0.010002 -5.906583 +v 5.906583 0.010002 -5.445131 +v 5.906583 0.010002 -5.537421 +v 5.906583 0.010002 -5.260550 +v 5.906583 0.010002 -5.352840 +v 5.352840 0.010002 -5.906583 +v 5.260550 0.010002 -5.906583 +v -0.553742 0.010002 -5.906583 +v -0.646033 0.010002 -5.906583 +v 5.906583 0.010000 0.646033 +v 5.906583 0.010000 0.553742 +v 5.906583 0.009999 3.599324 +v 5.906583 0.009999 3.507033 +v -3.507033 0.010002 -5.906583 +v -3.599324 0.010002 -5.906583 +v 2.399549 0.010002 -5.906583 +v 2.307259 0.010002 -5.906583 +v 5.906583 0.010001 -2.307259 +v 5.906583 0.010001 -2.399549 +v 5.906583 0.010000 -0.830613 +v 5.906583 0.010000 -0.922904 +v 0.922904 0.010002 -5.906583 +v 0.830613 0.010002 -5.906583 +v -4.983679 0.010002 -5.906583 +v -5.075970 0.010002 -5.906583 +v 5.906583 0.009998 5.075970 +v 5.906583 0.009998 4.983679 +v 5.906583 0.009999 2.122678 +v 5.906583 0.009999 2.030388 +v -2.030388 0.010002 -5.906583 +v -2.122678 0.010002 -5.906583 +v 3.876195 0.010002 -5.906583 +v 3.783905 0.010002 -5.906583 +v 5.906583 0.010002 -3.783905 +v 5.906583 0.010002 -3.876195 +v 5.906583 0.010001 -3.045582 +v 5.906583 0.010001 -3.137872 +v 3.137872 0.010002 -5.906583 +v 3.045582 0.010002 -5.906583 +v -2.768711 0.010002 -5.906583 +v -2.861001 0.010002 -5.906583 +v 5.906583 0.009999 2.861001 +v 5.906583 0.009999 2.768711 +v 5.906583 0.009998 5.814293 +v 5.906583 0.009998 5.722002 +v -5.722002 0.010002 -5.906583 +v -5.814293 0.010002 -5.906583 +v 0.184581 0.010002 -5.906583 +v 0.092290 0.010002 -5.906583 +v 5.906583 0.010000 -0.092290 +v 5.906583 0.010000 -0.184581 +v 5.906583 0.010001 -1.568936 +v 5.906583 0.010001 -1.661226 +v 1.661226 0.010002 -5.906583 +v 1.568936 0.010002 -5.906583 +v -4.245357 0.010002 -5.906583 +v -4.337647 0.010002 -5.906583 +v 5.906583 0.009998 4.337647 +v 5.906583 0.009998 4.245357 +v 5.906583 0.009999 1.384355 +v 5.906583 0.009999 1.292065 +v -1.292065 0.010002 -5.906583 +v -1.384355 0.010002 -5.906583 +v 4.614518 0.010002 -5.906583 +v 4.522227 0.010002 -5.906583 +v 5.906583 0.010002 -4.522227 +v 5.906583 0.010002 -4.614518 +v 5.906583 0.010002 -4.891389 +v 5.906583 0.010002 -4.983679 +v 4.983679 0.010002 -5.906583 +v 4.891389 0.010002 -5.906583 +v -0.922904 0.010002 -5.906583 +v -1.015194 0.010002 -5.906583 +v 5.906583 0.010000 1.015194 +v 5.906583 0.010000 0.922904 +v 5.906583 0.009998 3.968485 +v 5.906583 0.009998 3.876195 +v -3.876195 0.010002 -5.906583 +v -3.968485 0.010002 -5.906583 +v 2.030388 0.010002 -5.906583 +v 1.938097 0.010002 -5.906583 +v 5.906583 0.010001 -1.938097 +v 5.906583 0.010001 -2.030388 +v 5.906583 0.010000 -0.461452 +v 5.906583 0.010000 -0.553742 +v 0.553742 0.010002 -5.906583 +v 0.461452 0.010002 -5.906583 +v -5.352840 0.010002 -5.906583 +v -5.445131 0.010002 -5.906583 +v 5.906583 0.009998 5.445131 +v 5.906583 0.009998 5.352840 +v 5.906583 0.009999 2.491840 +v 5.906583 0.009999 2.399549 +v -2.399549 0.010002 -5.906583 +v -2.491840 0.010002 -5.906583 +v 3.507033 0.010002 -5.906583 +v 3.414743 0.010002 -5.906583 +v 5.906583 0.010001 -3.414743 +v 5.906583 0.010001 -3.507033 +v 5.906583 0.010002 -4.153066 +v 5.906583 0.010002 -4.245357 +v 4.245357 0.010002 -5.906583 +v 4.153066 0.010002 -5.906583 +v -1.661226 0.010002 -5.906583 +v -1.753517 0.010002 -5.906583 +v 5.906583 0.009999 1.753517 +v 5.906583 0.009999 1.661226 +v 5.906583 0.009998 4.706808 +v 5.906583 0.009998 4.614518 +v -4.614518 0.010002 -5.906583 +v -4.706808 0.010002 -5.906583 +v 1.292065 0.010002 -5.906583 +v 1.199775 0.010002 -5.906583 +v 5.906583 0.010000 -1.199775 +v 5.906583 0.010001 -1.292065 +v 5.906583 0.010001 -2.676420 +v 5.906583 0.010001 -2.768711 +v 2.768711 0.010002 -5.906583 +v 2.676420 0.010002 -5.906583 +v -3.137872 0.010002 -5.906583 +v -3.230163 0.010002 -5.906583 +v 5.906583 0.009999 3.230163 +v 5.906583 0.009999 3.137872 +v 5.906583 0.010000 0.276871 +v 5.906583 0.010000 0.184581 +v -0.184581 0.010002 -5.906583 +v -0.276871 0.010002 -5.906583 +v 5.722002 0.010002 -5.906583 +v 5.629711 0.010002 -5.906583 +v 5.906583 0.010002 -5.629711 +v 5.906583 0.010002 -5.722002 +v -5.906583 0.010001 -1.938097 +v -5.906583 0.010001 -2.030388 +v -5.906583 0.010001 -1.845807 +v -5.906583 0.010001 -2.122678 +v -5.906583 0.010001 -2.214968 +v -5.906583 0.010001 -1.568936 +v -5.906583 0.010001 -1.661226 +v -5.906583 0.010001 -1.476646 +v -5.906583 0.010001 -1.753517 +v -5.906583 0.010001 -2.676420 +v -5.906583 0.010001 -2.768711 +v -5.906583 0.010001 -2.584130 +v -5.906583 0.010001 -2.861001 +v -5.906583 0.010001 -2.953291 +v -5.906583 0.010001 -2.307259 +v -5.906583 0.010001 -2.399549 +v -5.906583 0.010001 -2.491840 +v -5.906583 0.010000 -0.461452 +v -5.906583 0.010000 -0.553742 +v -5.906583 0.010000 -0.369161 +v -5.906583 0.010000 -0.646033 +v -5.906583 0.010000 -0.738323 +v -5.906583 0.010000 -0.092290 +v -5.906583 0.010000 -0.184581 +v -5.906583 0.010000 -0.000000 +v -5.906583 0.010000 -0.276871 +v -5.906583 0.010000 -1.199775 +v -5.906583 0.010001 -1.292065 +v -5.906583 0.010000 -1.107484 +v -5.906583 0.010001 -1.384355 +v -5.906583 0.010000 -0.830613 +v -5.906583 0.010000 -0.922904 +v -5.906583 0.010000 -1.015194 +v -5.906583 0.010002 -4.891389 +v -5.906583 0.010002 -4.983679 +v -5.906583 0.010002 -4.799098 +v -5.906583 0.010002 -5.075970 +v -5.906583 0.010002 -5.168260 +v -5.906583 0.010002 -4.522227 +v -5.906583 0.010002 -4.614518 +v -5.906583 0.010002 -4.429937 +v -5.906583 0.010002 -4.706808 +v -5.906583 0.010002 -5.629711 +v -5.906583 0.010002 -5.722002 +v -5.906583 0.010002 -5.537421 +v -5.906583 0.010002 -5.814293 +v -5.906583 0.010002 -5.906583 +v -5.906583 0.010002 -5.260550 +v -5.906583 0.010002 -5.352840 +v -5.906583 0.010002 -5.445131 +v -5.906583 0.010001 -3.414743 +v -5.906583 0.010001 -3.507033 +v -5.906583 0.010001 -3.322453 +v -5.906583 0.010001 -3.599324 +v -5.906583 0.010002 -3.691614 +v -5.906583 0.010001 -3.045582 +v -5.906583 0.010001 -3.137872 +v -5.906583 0.010001 -3.230163 +v -5.906583 0.010002 -4.153066 +v -5.906583 0.010002 -4.245357 +v -5.906583 0.010002 -4.060776 +v -5.906583 0.010002 -4.337647 +v -5.906583 0.010002 -3.783905 +v -5.906583 0.010002 -3.876195 +v -5.906583 0.010002 -3.968485 +v -2.030388 0.009998 5.906583 +v -1.938097 0.009998 5.906583 +v -1.845807 0.009998 5.906583 +v -2.214968 0.009998 5.906583 +v -2.122678 0.009998 5.906583 +v -1.661226 0.009998 5.906583 +v -1.568936 0.009998 5.906583 +v -1.476646 0.009998 5.906583 +v -1.753517 0.009998 5.906583 +v -2.768711 0.009998 5.906583 +v -2.676420 0.009998 5.906583 +v -2.584130 0.009998 5.906583 +v -2.953291 0.009998 5.906583 +v -2.861001 0.009998 5.906583 +v -2.399549 0.009998 5.906583 +v -2.307259 0.009998 5.906583 +v -2.491840 0.009998 5.906583 +v -0.553742 0.009998 5.906583 +v -0.461452 0.009998 5.906583 +v -0.369161 0.009998 5.906583 +v -0.738323 0.009998 5.906583 +v -0.646033 0.009998 5.906583 +v -0.184581 0.009998 5.906583 +v -0.092290 0.009998 5.906583 +v 0.000000 0.009998 5.906583 +v -0.276871 0.009998 5.906583 +v -1.292065 0.009998 5.906583 +v -1.199775 0.009998 5.906583 +v -1.107484 0.009998 5.906583 +v -1.384355 0.009998 5.906583 +v -0.922904 0.009998 5.906583 +v -0.830613 0.009998 5.906583 +v -1.015194 0.009998 5.906583 +v -5.906583 0.009998 3.968485 +v -5.906583 0.009998 3.876195 +v -5.906583 0.009998 4.060776 +v -5.906583 0.009998 3.783905 +v -5.906583 0.009998 3.691614 +v -5.906583 0.009998 4.337647 +v -5.906583 0.009998 4.245357 +v -5.906583 0.009998 4.429937 +v -5.906583 0.009998 4.153066 +v -5.906583 0.009999 3.230163 +v -5.906583 0.009999 3.137872 +v -5.906583 0.009999 3.322453 +v -5.906583 0.009999 3.045582 +v -5.906583 0.009999 2.953291 +v -5.906583 0.009999 3.599324 +v -5.906583 0.009999 3.507033 +v -5.906583 0.009999 3.414743 +v -4.983679 0.009998 5.906583 +v -4.891389 0.009998 5.906583 +v -4.799098 0.009998 5.906583 +v -5.168260 0.009998 5.906583 +v -5.075970 0.009998 5.906583 +v -4.614518 0.009998 5.906583 +v -4.522227 0.009998 5.906583 +v -4.429937 0.009998 5.906583 +v -4.706808 0.009998 5.906583 +v -5.906583 0.009998 5.445131 +v -5.906583 0.009998 5.352840 +v -5.906583 0.009998 5.537421 +v -5.906583 0.009998 5.260550 +v -5.906583 0.009998 5.168260 +v -5.722002 0.009998 5.906583 +v -5.629711 0.009998 5.906583 +v -5.537421 0.009998 5.906583 +v -5.906583 0.009998 5.814293 +v -5.906583 0.009998 5.722002 +v -5.906583 0.009998 5.906583 +v -5.814293 0.009998 5.906583 +v -5.906583 0.009998 5.629711 +v -5.352840 0.009998 5.906583 +v -5.260550 0.009998 5.906583 +v -5.445131 0.009998 5.906583 +v -5.906583 0.009998 4.706808 +v -5.906583 0.009998 4.614518 +v -5.906583 0.009998 4.799098 +v -5.906583 0.009998 4.522227 +v -5.906583 0.009998 5.075970 +v -5.906583 0.009998 4.983679 +v -5.906583 0.009998 4.891389 +v -3.507033 0.009998 5.906583 +v -3.414743 0.009998 5.906583 +v -3.322453 0.009998 5.906583 +v -3.691614 0.009998 5.906583 +v -3.599324 0.009998 5.906583 +v -3.137872 0.009998 5.906583 +v -3.045582 0.009998 5.906583 +v -3.230163 0.009998 5.906583 +v -4.245357 0.009998 5.906583 +v -4.153066 0.009998 5.906583 +v -4.060776 0.009998 5.906583 +v -4.337647 0.009998 5.906583 +v -3.876195 0.009998 5.906583 +v -3.783905 0.009998 5.906583 +v -3.968485 0.009998 5.906583 +v -5.906583 0.010000 1.015194 +v -5.906583 0.010000 0.922904 +v -5.906583 0.010000 1.107484 +v -5.906583 0.010000 0.830613 +v -5.906583 0.010000 0.738323 +v -5.906583 0.009999 1.384355 +v -5.906583 0.009999 1.292065 +v -5.906583 0.009999 1.476646 +v -5.906583 0.010000 1.199775 +v -5.906583 0.010000 0.276871 +v -5.906583 0.010000 0.184581 +v -5.906583 0.010000 0.369161 +v -5.906583 0.010000 0.092290 +v -5.906583 0.010000 0.646033 +v -5.906583 0.010000 0.553742 +v -5.906583 0.010000 0.461452 +v -5.906583 0.009999 2.491840 +v -5.906583 0.009999 2.399549 +v -5.906583 0.009999 2.584130 +v -5.906583 0.009999 2.307259 +v -5.906583 0.009999 2.214968 +v -5.906583 0.009999 2.861001 +v -5.906583 0.009999 2.768711 +v -5.906583 0.009999 2.676420 +v -5.906583 0.009999 1.753517 +v -5.906583 0.009999 1.661226 +v -5.906583 0.009999 1.845807 +v -5.906583 0.009999 1.568936 +v -5.906583 0.009999 2.122678 +v -5.906583 0.009999 2.030388 +v -5.906583 0.009999 1.938097 +v 3.876195 0.009998 5.906583 +v 3.968485 0.009998 5.906583 +v 4.060776 0.009998 5.906583 +v 3.691614 0.009998 5.906583 +v 3.783905 0.009998 5.906583 +v 4.245357 0.009998 5.906583 +v 4.337647 0.009998 5.906583 +v 4.429937 0.009998 5.906583 +v 4.153066 0.009998 5.906583 +v 3.137872 0.009998 5.906583 +v 3.230163 0.009998 5.906583 +v 3.322453 0.009998 5.906583 +v 2.953291 0.009998 5.906583 +v 3.045582 0.009998 5.906583 +v 3.507033 0.009998 5.906583 +v 3.599324 0.009998 5.906583 +v 3.414743 0.009998 5.906583 +v 5.352840 0.009998 5.906583 +v 5.445131 0.009998 5.906583 +v 5.537421 0.009998 5.906583 +v 5.168260 0.009998 5.906583 +v 5.260550 0.009998 5.906583 +v 5.722002 0.009998 5.906583 +v 5.814293 0.009998 5.906583 +v 5.906583 0.009998 5.906583 +v 5.629711 0.009998 5.906583 +v 4.614518 0.009998 5.906583 +v 4.706808 0.009998 5.906583 +v 4.799098 0.009998 5.906583 +v 4.522227 0.009998 5.906583 +v 4.983679 0.009998 5.906583 +v 5.075970 0.009998 5.906583 +v 4.891389 0.009998 5.906583 +v 0.922904 0.009998 5.906583 +v 1.015194 0.009998 5.906583 +v 1.107484 0.009998 5.906583 +v 0.738323 0.009998 5.906583 +v 0.830613 0.009998 5.906583 +v 1.292065 0.009998 5.906583 +v 1.384355 0.009998 5.906583 +v 1.476646 0.009998 5.906583 +v 1.199775 0.009998 5.906583 +v 0.184581 0.009998 5.906583 +v 0.276871 0.009998 5.906583 +v 0.369161 0.009998 5.906583 +v 0.092290 0.009998 5.906583 +v 0.553742 0.009998 5.906583 +v 0.646033 0.009998 5.906583 +v 0.461452 0.009998 5.906583 +v 2.399549 0.009998 5.906583 +v 2.491840 0.009998 5.906583 +v 2.584130 0.009998 5.906583 +v 2.214968 0.009998 5.906583 +v 2.307259 0.009998 5.906583 +v 2.768711 0.009998 5.906583 +v 2.861001 0.009998 5.906583 +v 2.676420 0.009998 5.906583 +v 1.661226 0.009998 5.906583 +v 1.753517 0.009998 5.906583 +v 1.845807 0.009998 5.906583 +v 1.568936 0.009998 5.906583 +v 2.030388 0.009998 5.906583 +v 2.122678 0.009998 5.906583 +v 1.938097 0.009998 5.906583 +v 5.814293 0.010002 -5.814293 +v 5.906583 0.010002 -5.814293 +v 5.906583 0.010002 -5.906583 +v 5.814293 0.010002 -5.906583 +v -0.092290 0.010002 -5.814293 +v 0.000000 0.010002 -5.814293 +v 0.000000 0.010002 -5.906583 +v -0.092290 0.010002 -5.906583 +v -0.092290 0.010000 0.092290 +v 0.000000 0.010000 0.092290 +v 0.000000 0.010000 -0.000000 +v -0.092290 0.010000 -0.000000 +v 5.814293 0.010000 0.092290 +v 5.906583 0.010000 0.092290 +v 5.906583 0.010000 -0.000000 +v 5.814293 0.010000 -0.000000 +v 2.861001 0.010000 0.092290 +v 2.953291 0.010000 0.092290 +v 2.953291 0.010000 -0.000000 +v 2.861001 0.010000 -0.000000 +v 2.861001 0.009999 3.045582 +v 2.953291 0.009999 3.045582 +v 2.953291 0.009999 2.953291 +v 2.861001 0.009999 2.953291 +v 5.814293 0.009999 3.045582 +v 5.906583 0.009999 3.045582 +v 5.906583 0.009999 2.953291 +v 5.814293 0.009999 2.953291 +v -3.045582 0.010000 0.092290 +v -2.953291 0.010000 0.092290 +v -2.953291 0.010000 -0.000000 +v -3.045582 0.010000 -0.000000 +v -3.045582 0.009999 3.045582 +v -2.953291 0.009999 3.045582 +v -2.953291 0.009999 2.953291 +v -3.045582 0.009999 2.953291 +v -0.092290 0.009999 3.045582 +v 0.000000 0.009999 3.045582 +v 0.000000 0.009999 2.953291 +v -0.092290 0.009999 2.953291 +v -3.045582 0.010002 -5.814293 +v -2.953291 0.010002 -5.814293 +v -2.953291 0.010002 -5.906583 +v -3.045582 0.010002 -5.906583 +v -3.045582 0.010001 -2.861001 +v -2.953291 0.010001 -2.861001 +v -2.953291 0.010001 -2.953291 +v -3.045582 0.010001 -2.953291 +v -0.092290 0.010001 -2.861001 +v 0.000000 0.010001 -2.861001 +v 0.000000 0.010001 -2.953291 +v -0.092290 0.010001 -2.953291 +v 2.861001 0.010002 -5.814293 +v 2.953291 0.010002 -5.814293 +v 2.953291 0.010002 -5.906583 +v 2.861001 0.010002 -5.906583 +v 2.861001 0.010001 -2.861001 +v 2.953291 0.010001 -2.861001 +v 2.953291 0.010001 -2.953291 +v 2.861001 0.010001 -2.953291 +v 5.814293 0.010001 -2.861001 +v 5.906583 0.010001 -2.861001 +v 5.906583 0.010001 -2.953291 +v 5.814293 0.010001 -2.953291 +v 4.337647 0.010001 -2.861001 +v 4.429937 0.010001 -2.861001 +v 4.429937 0.010001 -2.953291 +v 4.337647 0.010001 -2.953291 +v 4.337647 0.010001 -1.384355 +v 4.429937 0.010001 -1.384355 +v 4.429937 0.010001 -1.476646 +v 4.337647 0.010001 -1.476646 +v 5.814293 0.010001 -1.384355 +v 5.906583 0.010001 -1.384355 +v 5.906583 0.010001 -1.476646 +v 5.814293 0.010001 -1.476646 +v 1.384355 0.010001 -2.861001 +v 1.476646 0.010001 -2.861001 +v 1.476646 0.010001 -2.953291 +v 1.384355 0.010001 -2.953291 +v 1.384355 0.010001 -1.384355 +v 1.476646 0.010001 -1.384355 +v 1.476646 0.010001 -1.476646 +v 1.384355 0.010001 -1.476646 +v 2.861001 0.010001 -1.384355 +v 2.953291 0.010001 -1.384355 +v 2.953291 0.010001 -1.476646 +v 2.861001 0.010001 -1.476646 +v 1.384355 0.010002 -5.814293 +v 1.476646 0.010002 -5.814293 +v 1.476646 0.010002 -5.906583 +v 1.384355 0.010002 -5.906583 +v 1.384355 0.010002 -4.337647 +v 1.476646 0.010002 -4.337647 +v 1.476646 0.010002 -4.429937 +v 1.384355 0.010002 -4.429937 +v 2.861001 0.010002 -4.337647 +v 2.953291 0.010002 -4.337647 +v 2.953291 0.010002 -4.429937 +v 2.861001 0.010002 -4.429937 +v -1.568936 0.010001 -2.861001 +v -1.476646 0.010001 -2.861001 +v -1.476646 0.010001 -2.953291 +v -1.568936 0.010001 -2.953291 +v -1.568936 0.010001 -1.384355 +v -1.476646 0.010001 -1.384355 +v -1.476646 0.010001 -1.476646 +v -1.568936 0.010001 -1.476646 +v -0.092290 0.010001 -1.384355 +v 0.000000 0.010001 -1.384355 +v 0.000000 0.010001 -1.476646 +v -0.092290 0.010001 -1.476646 +v -4.522227 0.010001 -2.861001 +v -4.429937 0.010001 -2.861001 +v -4.429937 0.010001 -2.953291 +v -4.522227 0.010001 -2.953291 +v -4.522227 0.010001 -1.384355 +v -4.429937 0.010001 -1.384355 +v -4.429937 0.010001 -1.476646 +v -4.522227 0.010001 -1.476646 +v -3.045582 0.010001 -1.384355 +v -2.953291 0.010001 -1.384355 +v -2.953291 0.010001 -1.476646 +v -3.045582 0.010001 -1.476646 +v -4.522227 0.010002 -5.814293 +v -4.429937 0.010002 -5.814293 +v -4.429937 0.010002 -5.906583 +v -4.522227 0.010002 -5.906583 +v -4.522227 0.010002 -4.337647 +v -4.429937 0.010002 -4.337647 +v -4.429937 0.010002 -4.429937 +v -4.522227 0.010002 -4.429937 +v -3.045582 0.010002 -4.337647 +v -2.953291 0.010002 -4.337647 +v -2.953291 0.010002 -4.429937 +v -3.045582 0.010002 -4.429937 +v -1.568936 0.009999 3.045582 +v -1.476646 0.009999 3.045582 +v -1.476646 0.009999 2.953291 +v -1.568936 0.009999 2.953291 +v -1.568936 0.009998 4.522227 +v -1.476646 0.009998 4.522227 +v -1.476646 0.009998 4.429937 +v -1.568936 0.009998 4.429937 +v -0.092290 0.009998 4.522227 +v 0.000000 0.009998 4.522227 +v 0.000000 0.009998 4.429937 +v -0.092290 0.009998 4.429937 +v -4.522227 0.009999 3.045582 +v -4.429937 0.009999 3.045582 +v -4.429937 0.009999 2.953291 +v -4.522227 0.009999 2.953291 +v -4.522227 0.009998 4.522227 +v -4.429937 0.009998 4.522227 +v -4.429937 0.009998 4.429937 +v -4.522227 0.009998 4.429937 +v -3.045582 0.009998 4.522227 +v -2.953291 0.009998 4.522227 +v -2.953291 0.009998 4.429937 +v -3.045582 0.009998 4.429937 +v -4.522227 0.010000 0.092290 +v -4.429937 0.010000 0.092290 +v -4.429937 0.010000 -0.000000 +v -4.522227 0.010000 -0.000000 +v -4.522227 0.009999 1.568936 +v -4.429937 0.009999 1.568936 +v -4.429937 0.009999 1.476646 +v -4.522227 0.009999 1.476646 +v -3.045582 0.009999 1.568936 +v -2.953291 0.009999 1.568936 +v -2.953291 0.009999 1.476646 +v -3.045582 0.009999 1.476646 +v 4.337647 0.009999 3.045582 +v 4.429937 0.009999 3.045582 +v 4.429937 0.009999 2.953291 +v 4.337647 0.009999 2.953291 +v 4.337647 0.009998 4.522227 +v 4.429937 0.009998 4.522227 +v 4.429937 0.009998 4.429937 +v 4.337647 0.009998 4.429937 +v 5.814293 0.009998 4.522227 +v 5.906583 0.009998 4.522227 +v 5.906583 0.009998 4.429937 +v 5.814293 0.009998 4.429937 +v 1.384355 0.009999 3.045582 +v 1.476646 0.009999 3.045582 +v 1.476646 0.009999 2.953291 +v 1.384355 0.009999 2.953291 +v 1.384355 0.009998 4.522227 +v 1.476646 0.009998 4.522227 +v 1.476646 0.009998 4.429937 +v 1.384355 0.009998 4.429937 +v 2.861001 0.009998 4.522227 +v 2.953291 0.009998 4.522227 +v 2.953291 0.009998 4.429937 +v 2.861001 0.009998 4.429937 +v 1.384355 0.010000 0.092290 +v 1.476646 0.010000 0.092290 +v 1.476646 0.010000 -0.000000 +v 1.384355 0.010000 -0.000000 +v 1.384355 0.009999 1.568936 +v 1.476646 0.009999 1.568936 +v 1.476646 0.009999 1.476646 +v 1.384355 0.009999 1.476646 +v 2.861001 0.009999 1.568936 +v 2.953291 0.009999 1.568936 +v 2.953291 0.009999 1.476646 +v 2.861001 0.009999 1.476646 +v 4.337647 0.010000 0.092290 +v 4.429937 0.010000 0.092290 +v 4.429937 0.010000 -0.000000 +v 4.337647 0.010000 -0.000000 +v 4.337647 0.009999 1.568936 +v 4.429937 0.009999 1.568936 +v 4.429937 0.009999 1.476646 +v 4.337647 0.009999 1.476646 +v 5.814293 0.009999 1.568936 +v 5.906583 0.009999 1.568936 +v 5.906583 0.009999 1.476646 +v 5.814293 0.009999 1.476646 +v -1.568936 0.010000 0.092290 +v -1.476646 0.010000 0.092290 +v -1.476646 0.010000 -0.000000 +v -1.568936 0.010000 -0.000000 +v -1.568936 0.009999 1.568936 +v -1.476646 0.009999 1.568936 +v -1.476646 0.009999 1.476646 +v -1.568936 0.009999 1.476646 +v -0.092290 0.009999 1.568936 +v 0.000000 0.009999 1.568936 +v 0.000000 0.009999 1.476646 +v -0.092290 0.009999 1.476646 +v -1.568936 0.010002 -5.814293 +v -1.476646 0.010002 -5.814293 +v -1.476646 0.010002 -5.906583 +v -1.568936 0.010002 -5.906583 +v -1.568936 0.010002 -4.337647 +v -1.476646 0.010002 -4.337647 +v -1.476646 0.010002 -4.429937 +v -1.568936 0.010002 -4.429937 +v -0.092290 0.010002 -4.337647 +v 0.000000 0.010002 -4.337647 +v 0.000000 0.010002 -4.429937 +v -0.092290 0.010002 -4.429937 +v 4.337647 0.010002 -5.814293 +v 4.429937 0.010002 -5.814293 +v 4.429937 0.010002 -5.906583 +v 4.337647 0.010002 -5.906583 +v 4.337647 0.010002 -4.337647 +v 4.429937 0.010002 -4.337647 +v 4.429937 0.010002 -4.429937 +v 4.337647 0.010002 -4.429937 +v 5.814293 0.010002 -4.337647 +v 5.906583 0.010002 -4.337647 +v 5.906583 0.010002 -4.429937 +v 5.814293 0.010002 -4.429937 +v 5.075970 0.010002 -4.337647 +v 5.168260 0.010002 -4.337647 +v 5.168260 0.010002 -4.429937 +v 5.075970 0.010002 -4.429937 +v 5.075970 0.010001 -3.599324 +v 5.168260 0.010001 -3.599324 +v 5.168260 0.010002 -3.691614 +v 5.075970 0.010002 -3.691614 +v 5.814293 0.010001 -3.599324 +v 5.906583 0.010001 -3.599324 +v 5.906583 0.010002 -3.691614 +v 5.814293 0.010002 -3.691614 +v 3.599324 0.010002 -4.337647 +v 3.691614 0.010002 -4.337647 +v 3.691614 0.010002 -4.429937 +v 3.599324 0.010002 -4.429937 +v 3.599324 0.010001 -3.599324 +v 3.691614 0.010001 -3.599324 +v 3.691614 0.010002 -3.691614 +v 3.599324 0.010002 -3.691614 +v 4.337647 0.010001 -3.599324 +v 4.429937 0.010001 -3.599324 +v 4.429937 0.010002 -3.691614 +v 4.337647 0.010002 -3.691614 +v 3.599324 0.010002 -5.814293 +v 3.691614 0.010002 -5.814293 +v 3.691614 0.010002 -5.906583 +v 3.599324 0.010002 -5.906583 +v 3.599324 0.010002 -5.075970 +v 3.691614 0.010002 -5.075970 +v 3.691614 0.010002 -5.168260 +v 3.599324 0.010002 -5.168260 +v 4.337647 0.010002 -5.075970 +v 4.429937 0.010002 -5.075970 +v 4.429937 0.010002 -5.168260 +v 4.337647 0.010002 -5.168260 +v -0.830613 0.010002 -4.337647 +v -0.738323 0.010002 -4.337647 +v -0.738323 0.010002 -4.429937 +v -0.830613 0.010002 -4.429937 +v -0.830613 0.010001 -3.599324 +v -0.738323 0.010001 -3.599324 +v -0.738323 0.010002 -3.691614 +v -0.830613 0.010002 -3.691614 +v -0.092290 0.010001 -3.599324 +v 0.000000 0.010001 -3.599324 +v 0.000000 0.010002 -3.691614 +v -0.092290 0.010002 -3.691614 +v -2.307259 0.010002 -4.337647 +v -2.214968 0.010002 -4.337647 +v -2.214968 0.010002 -4.429937 +v -2.307259 0.010002 -4.429937 +v -2.307259 0.010001 -3.599324 +v -2.214968 0.010001 -3.599324 +v -2.214968 0.010002 -3.691614 +v -2.307259 0.010002 -3.691614 +v -1.568936 0.010001 -3.599324 +v -1.476646 0.010001 -3.599324 +v -1.476646 0.010002 -3.691614 +v -1.568936 0.010002 -3.691614 +v -2.307259 0.010002 -5.814293 +v -2.214968 0.010002 -5.814293 +v -2.214968 0.010002 -5.906583 +v -2.307259 0.010002 -5.906583 +v -2.307259 0.010002 -5.075970 +v -2.214968 0.010002 -5.075970 +v -2.214968 0.010002 -5.168260 +v -2.307259 0.010002 -5.168260 +v -1.568936 0.010002 -5.075970 +v -1.476646 0.010002 -5.075970 +v -1.476646 0.010002 -5.168260 +v -1.568936 0.010002 -5.168260 +v -0.830613 0.009999 1.568936 +v -0.738323 0.009999 1.568936 +v -0.738323 0.009999 1.476646 +v -0.830613 0.009999 1.476646 +v -0.830613 0.009999 2.307259 +v -0.738323 0.009999 2.307259 +v -0.738323 0.009999 2.214968 +v -0.830613 0.009999 2.214968 +v -0.092290 0.009999 2.307259 +v 0.000000 0.009999 2.307259 +v 0.000000 0.009999 2.214968 +v -0.092290 0.009999 2.214968 +v -2.307259 0.009999 1.568936 +v -2.214968 0.009999 1.568936 +v -2.214968 0.009999 1.476646 +v -2.307259 0.009999 1.476646 +v -2.307259 0.009999 2.307259 +v -2.214968 0.009999 2.307259 +v -2.214968 0.009999 2.214968 +v -2.307259 0.009999 2.214968 +v -1.568936 0.009999 2.307259 +v -1.476646 0.009999 2.307259 +v -1.476646 0.009999 2.214968 +v -1.568936 0.009999 2.214968 +v -2.307259 0.010000 0.092290 +v -2.214968 0.010000 0.092290 +v -2.214968 0.010000 -0.000000 +v -2.307259 0.010000 -0.000000 +v -2.307259 0.010000 0.830613 +v -2.214968 0.010000 0.830613 +v -2.214968 0.010000 0.738323 +v -2.307259 0.010000 0.738323 +v -1.568936 0.010000 0.830613 +v -1.476646 0.010000 0.830613 +v -1.476646 0.010000 0.738323 +v -1.568936 0.010000 0.738323 +v 5.075970 0.009999 1.568936 +v 5.168260 0.009999 1.568936 +v 5.168260 0.009999 1.476646 +v 5.075970 0.009999 1.476646 +v 5.075970 0.009999 2.307259 +v 5.168260 0.009999 2.307259 +v 5.168260 0.009999 2.214968 +v 5.075970 0.009999 2.214968 +v 5.814293 0.009999 2.307259 +v 5.906583 0.009999 2.307259 +v 5.906583 0.009999 2.214968 +v 5.814293 0.009999 2.214968 +v 3.599324 0.009999 1.568936 +v 3.691614 0.009999 1.568936 +v 3.691614 0.009999 1.476646 +v 3.599324 0.009999 1.476646 +v 3.599324 0.009999 2.307259 +v 3.691614 0.009999 2.307259 +v 3.691614 0.009999 2.214968 +v 3.599324 0.009999 2.214968 +v 4.337647 0.009999 2.307259 +v 4.429937 0.009999 2.307259 +v 4.429937 0.009999 2.214968 +v 4.337647 0.009999 2.214968 +v 3.599324 0.010000 0.092290 +v 3.691614 0.010000 0.092290 +v 3.691614 0.010000 -0.000000 +v 3.599324 0.010000 -0.000000 +v 3.599324 0.010000 0.830613 +v 3.691614 0.010000 0.830613 +v 3.691614 0.010000 0.738323 +v 3.599324 0.010000 0.738323 +v 4.337647 0.010000 0.830613 +v 4.429937 0.010000 0.830613 +v 4.429937 0.010000 0.738323 +v 4.337647 0.010000 0.738323 +v 2.122678 0.009999 1.568936 +v 2.214968 0.009999 1.568936 +v 2.214968 0.009999 1.476646 +v 2.122678 0.009999 1.476646 +v 2.122678 0.009999 2.307259 +v 2.214968 0.009999 2.307259 +v 2.214968 0.009999 2.214968 +v 2.122678 0.009999 2.214968 +v 2.861001 0.009999 2.307259 +v 2.953291 0.009999 2.307259 +v 2.953291 0.009999 2.214968 +v 2.861001 0.009999 2.214968 +v 0.646033 0.009999 1.568936 +v 0.738323 0.009999 1.568936 +v 0.738323 0.009999 1.476646 +v 0.646033 0.009999 1.476646 +v 0.646033 0.009999 2.307259 +v 0.738323 0.009999 2.307259 +v 0.738323 0.009999 2.214968 +v 0.646033 0.009999 2.214968 +v 1.384355 0.009999 2.307259 +v 1.476646 0.009999 2.307259 +v 1.476646 0.009999 2.214968 +v 1.384355 0.009999 2.214968 +v 0.646033 0.010000 0.092290 +v 0.738323 0.010000 0.092290 +v 0.738323 0.010000 -0.000000 +v 0.646033 0.010000 -0.000000 +v 0.646033 0.010000 0.830613 +v 0.738323 0.010000 0.830613 +v 0.738323 0.010000 0.738323 +v 0.646033 0.010000 0.738323 +v 1.384355 0.010000 0.830613 +v 1.476646 0.010000 0.830613 +v 1.476646 0.010000 0.738323 +v 1.384355 0.010000 0.738323 +v 2.122678 0.009998 4.522227 +v 2.214968 0.009998 4.522227 +v 2.214968 0.009998 4.429937 +v 2.122678 0.009998 4.429937 +v 2.122678 0.009998 5.260550 +v 2.214968 0.009998 5.260550 +v 2.214968 0.009998 5.168260 +v 2.122678 0.009998 5.168260 +v 2.861001 0.009998 5.260550 +v 2.953291 0.009998 5.260550 +v 2.953291 0.009998 5.168260 +v 2.861001 0.009998 5.168260 +v 0.646033 0.009998 4.522227 +v 0.738323 0.009998 4.522227 +v 0.738323 0.009998 4.429937 +v 0.646033 0.009998 4.429937 +v 0.646033 0.009998 5.260550 +v 0.738323 0.009998 5.260550 +v 0.738323 0.009998 5.168260 +v 0.646033 0.009998 5.168260 +v 1.384355 0.009998 5.260550 +v 1.476646 0.009998 5.260550 +v 1.476646 0.009998 5.168260 +v 1.384355 0.009998 5.168260 +v 0.646033 0.009999 3.045582 +v 0.738323 0.009999 3.045582 +v 0.738323 0.009999 2.953291 +v 0.646033 0.009999 2.953291 +v 0.646033 0.009998 3.783905 +v 0.738323 0.009998 3.783905 +v 0.738323 0.009998 3.691614 +v 0.646033 0.009998 3.691614 +v 1.384355 0.009998 3.783905 +v 1.476646 0.009998 3.783905 +v 1.476646 0.009998 3.691614 +v 1.384355 0.009998 3.691614 +v 5.075970 0.009998 4.522227 +v 5.168260 0.009998 4.522227 +v 5.168260 0.009998 4.429937 +v 5.075970 0.009998 4.429937 +v 5.075970 0.009998 5.260550 +v 5.168260 0.009998 5.260550 +v 5.168260 0.009998 5.168260 +v 5.075970 0.009998 5.168260 +v 5.814293 0.009998 5.260550 +v 5.906583 0.009998 5.260550 +v 5.906583 0.009998 5.168260 +v 5.814293 0.009998 5.168260 +v 3.599324 0.009998 4.522227 +v 3.691614 0.009998 4.522227 +v 3.691614 0.009998 4.429937 +v 3.599324 0.009998 4.429937 +v 3.599324 0.009998 5.260550 +v 3.691614 0.009998 5.260550 +v 3.691614 0.009998 5.168260 +v 3.599324 0.009998 5.168260 +v 4.337647 0.009998 5.260550 +v 4.429937 0.009998 5.260550 +v 4.429937 0.009998 5.168260 +v 4.337647 0.009998 5.168260 +v 3.599324 0.009999 3.045582 +v 3.691614 0.009999 3.045582 +v 3.691614 0.009999 2.953291 +v 3.599324 0.009999 2.953291 +v 3.599324 0.009998 3.783905 +v 3.691614 0.009998 3.783905 +v 3.691614 0.009998 3.691614 +v 3.599324 0.009998 3.691614 +v 4.337647 0.009998 3.783905 +v 4.429937 0.009998 3.783905 +v 4.429937 0.009998 3.691614 +v 4.337647 0.009998 3.691614 +v -3.783905 0.009999 1.568936 +v -3.691614 0.009999 1.568936 +v -3.691614 0.009999 1.476646 +v -3.783905 0.009999 1.476646 +v -3.783905 0.009999 2.307259 +v -3.691614 0.009999 2.307259 +v -3.691614 0.009999 2.214968 +v -3.783905 0.009999 2.214968 +v -3.045582 0.009999 2.307259 +v -2.953291 0.009999 2.307259 +v -2.953291 0.009999 2.214968 +v -3.045582 0.009999 2.214968 +v -5.260550 0.009999 1.568936 +v -5.168260 0.009999 1.568936 +v -5.168260 0.009999 1.476646 +v -5.260550 0.009999 1.476646 +v -5.260550 0.009999 2.307259 +v -5.168260 0.009999 2.307259 +v -5.168260 0.009999 2.214968 +v -5.260550 0.009999 2.214968 +v -4.522227 0.009999 2.307259 +v -4.429937 0.009999 2.307259 +v -4.429937 0.009999 2.214968 +v -4.522227 0.009999 2.214968 +v -5.260550 0.010000 0.092290 +v -5.168260 0.010000 0.092290 +v -5.168260 0.010000 -0.000000 +v -5.260550 0.010000 -0.000000 +v -5.260550 0.010000 0.830613 +v -5.168260 0.010000 0.830613 +v -5.168260 0.010000 0.738323 +v -5.260550 0.010000 0.738323 +v -4.522227 0.010000 0.830613 +v -4.429937 0.010000 0.830613 +v -4.429937 0.010000 0.738323 +v -4.522227 0.010000 0.738323 +v -3.783905 0.009998 4.522227 +v -3.691614 0.009998 4.522227 +v -3.691614 0.009998 4.429937 +v -3.783905 0.009998 4.429937 +v -3.783905 0.009998 5.260550 +v -3.691614 0.009998 5.260550 +v -3.691614 0.009998 5.168260 +v -3.783905 0.009998 5.168260 +v -3.045582 0.009998 5.260550 +v -2.953291 0.009998 5.260550 +v -2.953291 0.009998 5.168260 +v -3.045582 0.009998 5.168260 +v -5.260550 0.009998 4.522227 +v -5.168260 0.009998 4.522227 +v -5.168260 0.009998 4.429937 +v -5.260550 0.009998 4.429937 +v -5.260550 0.009998 5.260550 +v -5.168260 0.009998 5.260550 +v -5.168260 0.009998 5.168260 +v -5.260550 0.009998 5.168260 +v -4.522227 0.009998 5.260550 +v -4.429937 0.009998 5.260550 +v -4.429937 0.009998 5.168260 +v -4.522227 0.009998 5.168260 +v -5.260550 0.009999 3.045582 +v -5.168260 0.009999 3.045582 +v -5.168260 0.009999 2.953291 +v -5.260550 0.009999 2.953291 +v -5.260550 0.009998 3.783905 +v -5.168260 0.009998 3.783905 +v -5.168260 0.009998 3.691614 +v -5.260550 0.009998 3.691614 +v -4.522227 0.009998 3.783905 +v -4.429937 0.009998 3.783905 +v -4.429937 0.009998 3.691614 +v -4.522227 0.009998 3.691614 +v -0.830613 0.009998 4.522227 +v -0.738323 0.009998 4.522227 +v -0.738323 0.009998 4.429937 +v -0.830613 0.009998 4.429937 +v -0.830613 0.009998 5.260550 +v -0.738323 0.009998 5.260550 +v -0.738323 0.009998 5.168260 +v -0.830613 0.009998 5.168260 +v -0.092290 0.009998 5.260550 +v 0.000000 0.009998 5.260550 +v 0.000000 0.009998 5.168260 +v -0.092290 0.009998 5.168260 +v -2.307259 0.009998 4.522227 +v -2.214968 0.009998 4.522227 +v -2.214968 0.009998 4.429937 +v -2.307259 0.009998 4.429937 +v -2.307259 0.009998 5.260550 +v -2.214968 0.009998 5.260550 +v -2.214968 0.009998 5.168260 +v -2.307259 0.009998 5.168260 +v -1.568936 0.009998 5.260550 +v -1.476646 0.009998 5.260550 +v -1.476646 0.009998 5.168260 +v -1.568936 0.009998 5.168260 +v -2.307259 0.009999 3.045582 +v -2.214968 0.009999 3.045582 +v -2.214968 0.009999 2.953291 +v -2.307259 0.009999 2.953291 +v -2.307259 0.009998 3.783905 +v -2.214968 0.009998 3.783905 +v -2.214968 0.009998 3.691614 +v -2.307259 0.009998 3.691614 +v -1.568936 0.009998 3.783905 +v -1.476646 0.009998 3.783905 +v -1.476646 0.009998 3.691614 +v -1.568936 0.009998 3.691614 +v -3.783905 0.010002 -4.337647 +v -3.691614 0.010002 -4.337647 +v -3.691614 0.010002 -4.429937 +v -3.783905 0.010002 -4.429937 +v -3.783905 0.010001 -3.599324 +v -3.691614 0.010001 -3.599324 +v -3.691614 0.010002 -3.691614 +v -3.783905 0.010002 -3.691614 +v -3.045582 0.010001 -3.599324 +v -2.953291 0.010001 -3.599324 +v -2.953291 0.010002 -3.691614 +v -3.045582 0.010002 -3.691614 +v -5.260550 0.010002 -4.337647 +v -5.168260 0.010002 -4.337647 +v -5.168260 0.010002 -4.429937 +v -5.260550 0.010002 -4.429937 +v -5.260550 0.010001 -3.599324 +v -5.168260 0.010001 -3.599324 +v -5.168260 0.010002 -3.691614 +v -5.260550 0.010002 -3.691614 +v -4.522227 0.010001 -3.599324 +v -4.429937 0.010001 -3.599324 +v -4.429937 0.010002 -3.691614 +v -4.522227 0.010002 -3.691614 +v -5.260550 0.010002 -5.814293 +v -5.168260 0.010002 -5.814293 +v -5.168260 0.010002 -5.906583 +v -5.260550 0.010002 -5.906583 +v -5.260550 0.010002 -5.075970 +v -5.168260 0.010002 -5.075970 +v -5.168260 0.010002 -5.168260 +v -5.260550 0.010002 -5.168260 +v -4.522227 0.010002 -5.075970 +v -4.429937 0.010002 -5.075970 +v -4.429937 0.010002 -5.168260 +v -4.522227 0.010002 -5.168260 +v -3.783905 0.010001 -1.384355 +v -3.691614 0.010001 -1.384355 +v -3.691614 0.010001 -1.476646 +v -3.783905 0.010001 -1.476646 +v -3.783905 0.010000 -0.646033 +v -3.691614 0.010000 -0.646033 +v -3.691614 0.010000 -0.738323 +v -3.783905 0.010000 -0.738323 +v -3.045582 0.010000 -0.646033 +v -2.953291 0.010000 -0.646033 +v -2.953291 0.010000 -0.738323 +v -3.045582 0.010000 -0.738323 +v -5.260550 0.010001 -1.384355 +v -5.168260 0.010001 -1.384355 +v -5.168260 0.010001 -1.476646 +v -5.260550 0.010001 -1.476646 +v -5.260550 0.010000 -0.646033 +v -5.168260 0.010000 -0.646033 +v -5.168260 0.010000 -0.738323 +v -5.260550 0.010000 -0.738323 +v -4.522227 0.010000 -0.646033 +v -4.429937 0.010000 -0.646033 +v -4.429937 0.010000 -0.738323 +v -4.522227 0.010000 -0.738323 +v -5.260550 0.010001 -2.861001 +v -5.168260 0.010001 -2.861001 +v -5.168260 0.010001 -2.953291 +v -5.260550 0.010001 -2.953291 +v -5.260550 0.010001 -2.122678 +v -5.168260 0.010001 -2.122678 +v -5.168260 0.010001 -2.214968 +v -5.260550 0.010001 -2.214968 +v -4.522227 0.010001 -2.122678 +v -4.429937 0.010001 -2.122678 +v -4.429937 0.010001 -2.214968 +v -4.522227 0.010001 -2.214968 +v -0.830613 0.010001 -1.384355 +v -0.738323 0.010001 -1.384355 +v -0.738323 0.010001 -1.476646 +v -0.830613 0.010001 -1.476646 +v -0.830613 0.010000 -0.646033 +v -0.738323 0.010000 -0.646033 +v -0.738323 0.010000 -0.738323 +v -0.830613 0.010000 -0.738323 +v -0.092290 0.010000 -0.646033 +v 0.000000 0.010000 -0.646033 +v 0.000000 0.010000 -0.738323 +v -0.092290 0.010000 -0.738323 +v -2.307259 0.010001 -1.384355 +v -2.214968 0.010001 -1.384355 +v -2.214968 0.010001 -1.476646 +v -2.307259 0.010001 -1.476646 +v -2.307259 0.010000 -0.646033 +v -2.214968 0.010000 -0.646033 +v -2.214968 0.010000 -0.738323 +v -2.307259 0.010000 -0.738323 +v -1.568936 0.010000 -0.646033 +v -1.476646 0.010000 -0.646033 +v -1.476646 0.010000 -0.738323 +v -1.568936 0.010000 -0.738323 +v -2.307259 0.010001 -2.861001 +v -2.214968 0.010001 -2.861001 +v -2.214968 0.010001 -2.953291 +v -2.307259 0.010001 -2.953291 +v -2.307259 0.010001 -2.122678 +v -2.214968 0.010001 -2.122678 +v -2.214968 0.010001 -2.214968 +v -2.307259 0.010001 -2.214968 +v -1.568936 0.010001 -2.122678 +v -1.476646 0.010001 -2.122678 +v -1.476646 0.010001 -2.214968 +v -1.568936 0.010001 -2.214968 +v 2.122678 0.010002 -4.337647 +v 2.214968 0.010002 -4.337647 +v 2.214968 0.010002 -4.429937 +v 2.122678 0.010002 -4.429937 +v 2.122678 0.010001 -3.599324 +v 2.214968 0.010001 -3.599324 +v 2.214968 0.010002 -3.691614 +v 2.122678 0.010002 -3.691614 +v 2.861001 0.010001 -3.599324 +v 2.953291 0.010001 -3.599324 +v 2.953291 0.010002 -3.691614 +v 2.861001 0.010002 -3.691614 +v 0.646033 0.010002 -4.337647 +v 0.738323 0.010002 -4.337647 +v 0.738323 0.010002 -4.429937 +v 0.646033 0.010002 -4.429937 +v 0.646033 0.010001 -3.599324 +v 0.738323 0.010001 -3.599324 +v 0.738323 0.010002 -3.691614 +v 0.646033 0.010002 -3.691614 +v 1.384355 0.010001 -3.599324 +v 1.476646 0.010001 -3.599324 +v 1.476646 0.010002 -3.691614 +v 1.384355 0.010002 -3.691614 +v 0.646033 0.010002 -5.814293 +v 0.738323 0.010002 -5.814293 +v 0.738323 0.010002 -5.906583 +v 0.646033 0.010002 -5.906583 +v 0.646033 0.010002 -5.075970 +v 0.738323 0.010002 -5.075970 +v 0.738323 0.010002 -5.168260 +v 0.646033 0.010002 -5.168260 +v 1.384355 0.010002 -5.075970 +v 1.476646 0.010002 -5.075970 +v 1.476646 0.010002 -5.168260 +v 1.384355 0.010002 -5.168260 +v 2.122678 0.010001 -1.384355 +v 2.214968 0.010001 -1.384355 +v 2.214968 0.010001 -1.476646 +v 2.122678 0.010001 -1.476646 +v 2.122678 0.010000 -0.646033 +v 2.214968 0.010000 -0.646033 +v 2.214968 0.010000 -0.738323 +v 2.122678 0.010000 -0.738323 +v 2.861001 0.010000 -0.646033 +v 2.953291 0.010000 -0.646033 +v 2.953291 0.010000 -0.738323 +v 2.861001 0.010000 -0.738323 +v 0.646033 0.010001 -1.384355 +v 0.738323 0.010001 -1.384355 +v 0.738323 0.010001 -1.476646 +v 0.646033 0.010001 -1.476646 +v 0.646033 0.010000 -0.646033 +v 0.738323 0.010000 -0.646033 +v 0.738323 0.010000 -0.738323 +v 0.646033 0.010000 -0.738323 +v 1.384355 0.010000 -0.646033 +v 1.476646 0.010000 -0.646033 +v 1.476646 0.010000 -0.738323 +v 1.384355 0.010000 -0.738323 +v 0.646033 0.010001 -2.861001 +v 0.738323 0.010001 -2.861001 +v 0.738323 0.010001 -2.953291 +v 0.646033 0.010001 -2.953291 +v 0.646033 0.010001 -2.122678 +v 0.738323 0.010001 -2.122678 +v 0.738323 0.010001 -2.214968 +v 0.646033 0.010001 -2.214968 +v 1.384355 0.010001 -2.122678 +v 1.476646 0.010001 -2.122678 +v 1.476646 0.010001 -2.214968 +v 1.384355 0.010001 -2.214968 +v 5.075970 0.010001 -1.384355 +v 5.168260 0.010001 -1.384355 +v 5.168260 0.010001 -1.476646 +v 5.075970 0.010001 -1.476646 +v 5.075970 0.010000 -0.646033 +v 5.168260 0.010000 -0.646033 +v 5.168260 0.010000 -0.738323 +v 5.075970 0.010000 -0.738323 +v 5.814293 0.010000 -0.646033 +v 5.906583 0.010000 -0.646033 +v 5.906583 0.010000 -0.738323 +v 5.814293 0.010000 -0.738323 +v 3.599324 0.010001 -1.384355 +v 3.691614 0.010001 -1.384355 +v 3.691614 0.010001 -1.476646 +v 3.599324 0.010001 -1.476646 +v 3.599324 0.010000 -0.646033 +v 3.691614 0.010000 -0.646033 +v 3.691614 0.010000 -0.738323 +v 3.599324 0.010000 -0.738323 +v 4.337647 0.010000 -0.646033 +v 4.429937 0.010000 -0.646033 +v 4.429937 0.010000 -0.738323 +v 4.337647 0.010000 -0.738323 +v 3.599324 0.010001 -2.861001 +v 3.691614 0.010001 -2.861001 +v 3.691614 0.010001 -2.953291 +v 3.599324 0.010001 -2.953291 +v 3.599324 0.010001 -2.122678 +v 3.691614 0.010001 -2.122678 +v 3.691614 0.010001 -2.214968 +v 3.599324 0.010001 -2.214968 +v 4.337647 0.010001 -2.122678 +v 4.429937 0.010001 -2.122678 +v 4.429937 0.010001 -2.214968 +v 4.337647 0.010001 -2.214968 +v 5.075970 0.010001 -2.861001 +v 5.168260 0.010001 -2.861001 +v 5.168260 0.010001 -2.953291 +v 5.075970 0.010001 -2.953291 +v 5.075970 0.010001 -2.122678 +v 5.168260 0.010001 -2.122678 +v 5.168260 0.010001 -2.214968 +v 5.075970 0.010001 -2.214968 +v 5.814293 0.010001 -2.122678 +v 5.906583 0.010001 -2.122678 +v 5.906583 0.010001 -2.214968 +v 5.814293 0.010001 -2.214968 +v 2.122678 0.010001 -2.861001 +v 2.214968 0.010001 -2.861001 +v 2.214968 0.010001 -2.953291 +v 2.122678 0.010001 -2.953291 +v 2.122678 0.010001 -2.122678 +v 2.214968 0.010001 -2.122678 +v 2.214968 0.010001 -2.214968 +v 2.122678 0.010001 -2.214968 +v 2.861001 0.010001 -2.122678 +v 2.953291 0.010001 -2.122678 +v 2.953291 0.010001 -2.214968 +v 2.861001 0.010001 -2.214968 +v 2.122678 0.010002 -5.814293 +v 2.214968 0.010002 -5.814293 +v 2.214968 0.010002 -5.906583 +v 2.122678 0.010002 -5.906583 +v 2.122678 0.010002 -5.075970 +v 2.214968 0.010002 -5.075970 +v 2.214968 0.010002 -5.168260 +v 2.122678 0.010002 -5.168260 +v 2.861001 0.010002 -5.075970 +v 2.953291 0.010002 -5.075970 +v 2.953291 0.010002 -5.168260 +v 2.861001 0.010002 -5.168260 +v -0.830613 0.010001 -2.861001 +v -0.738323 0.010001 -2.861001 +v -0.738323 0.010001 -2.953291 +v -0.830613 0.010001 -2.953291 +v -0.830613 0.010001 -2.122678 +v -0.738323 0.010001 -2.122678 +v -0.738323 0.010001 -2.214968 +v -0.830613 0.010001 -2.214968 +v -0.092290 0.010001 -2.122678 +v 0.000000 0.010001 -2.122678 +v 0.000000 0.010001 -2.214968 +v -0.092290 0.010001 -2.214968 +v -3.783905 0.010001 -2.861001 +v -3.691614 0.010001 -2.861001 +v -3.691614 0.010001 -2.953291 +v -3.783905 0.010001 -2.953291 +v -3.783905 0.010001 -2.122678 +v -3.691614 0.010001 -2.122678 +v -3.691614 0.010001 -2.214968 +v -3.783905 0.010001 -2.214968 +v -3.045582 0.010001 -2.122678 +v -2.953291 0.010001 -2.122678 +v -2.953291 0.010001 -2.214968 +v -3.045582 0.010001 -2.214968 +v -3.783905 0.010002 -5.814293 +v -3.691614 0.010002 -5.814293 +v -3.691614 0.010002 -5.906583 +v -3.783905 0.010002 -5.906583 +v -3.783905 0.010002 -5.075970 +v -3.691614 0.010002 -5.075970 +v -3.691614 0.010002 -5.168260 +v -3.783905 0.010002 -5.168260 +v -3.045582 0.010002 -5.075970 +v -2.953291 0.010002 -5.075970 +v -2.953291 0.010002 -5.168260 +v -3.045582 0.010002 -5.168260 +v -0.830613 0.009999 3.045582 +v -0.738323 0.009999 3.045582 +v -0.738323 0.009999 2.953291 +v -0.830613 0.009999 2.953291 +v -0.830613 0.009998 3.783905 +v -0.738323 0.009998 3.783905 +v -0.738323 0.009998 3.691614 +v -0.830613 0.009998 3.691614 +v -0.092290 0.009998 3.783905 +v 0.000000 0.009998 3.783905 +v 0.000000 0.009998 3.691614 +v -0.092290 0.009998 3.691614 +v -3.783905 0.009999 3.045582 +v -3.691614 0.009999 3.045582 +v -3.691614 0.009999 2.953291 +v -3.783905 0.009999 2.953291 +v -3.783905 0.009998 3.783905 +v -3.691614 0.009998 3.783905 +v -3.691614 0.009998 3.691614 +v -3.783905 0.009998 3.691614 +v -3.045582 0.009998 3.783905 +v -2.953291 0.009998 3.783905 +v -2.953291 0.009998 3.691614 +v -3.045582 0.009998 3.691614 +v -3.783905 0.010000 0.092290 +v -3.691614 0.010000 0.092290 +v -3.691614 0.010000 -0.000000 +v -3.783905 0.010000 -0.000000 +v -3.783905 0.010000 0.830613 +v -3.691614 0.010000 0.830613 +v -3.691614 0.010000 0.738323 +v -3.783905 0.010000 0.738323 +v -3.045582 0.010000 0.830613 +v -2.953291 0.010000 0.830613 +v -2.953291 0.010000 0.738323 +v -3.045582 0.010000 0.738323 +v 5.075970 0.009999 3.045582 +v 5.168260 0.009999 3.045582 +v 5.168260 0.009999 2.953291 +v 5.075970 0.009999 2.953291 +v 5.075970 0.009998 3.783905 +v 5.168260 0.009998 3.783905 +v 5.168260 0.009998 3.691614 +v 5.075970 0.009998 3.691614 +v 5.814293 0.009998 3.783905 +v 5.906583 0.009998 3.783905 +v 5.906583 0.009998 3.691614 +v 5.814293 0.009998 3.691614 +v 2.122678 0.009999 3.045582 +v 2.214968 0.009999 3.045582 +v 2.214968 0.009999 2.953291 +v 2.122678 0.009999 2.953291 +v 2.122678 0.009998 3.783905 +v 2.214968 0.009998 3.783905 +v 2.214968 0.009998 3.691614 +v 2.122678 0.009998 3.691614 +v 2.861001 0.009998 3.783905 +v 2.953291 0.009998 3.783905 +v 2.953291 0.009998 3.691614 +v 2.861001 0.009998 3.691614 +v 2.122678 0.010000 0.092290 +v 2.214968 0.010000 0.092290 +v 2.214968 0.010000 -0.000000 +v 2.122678 0.010000 -0.000000 +v 2.122678 0.010000 0.830613 +v 2.214968 0.010000 0.830613 +v 2.214968 0.010000 0.738323 +v 2.122678 0.010000 0.738323 +v 2.861001 0.010000 0.830613 +v 2.953291 0.010000 0.830613 +v 2.953291 0.010000 0.738323 +v 2.861001 0.010000 0.738323 +v 5.075970 0.010000 0.092290 +v 5.168260 0.010000 0.092290 +v 5.168260 0.010000 -0.000000 +v 5.075970 0.010000 -0.000000 +v 5.075970 0.010000 0.830613 +v 5.168260 0.010000 0.830613 +v 5.168260 0.010000 0.738323 +v 5.075970 0.010000 0.738323 +v 5.814293 0.010000 0.830613 +v 5.906583 0.010000 0.830613 +v 5.906583 0.010000 0.738323 +v 5.814293 0.010000 0.738323 +v -0.830613 0.010000 0.092290 +v -0.738323 0.010000 0.092290 +v -0.738323 0.010000 -0.000000 +v -0.830613 0.010000 -0.000000 +v -0.830613 0.010000 0.830613 +v -0.738323 0.010000 0.830613 +v -0.738323 0.010000 0.738323 +v -0.830613 0.010000 0.738323 +v -0.092290 0.010000 0.830613 +v 0.000000 0.010000 0.830613 +v 0.000000 0.010000 0.738323 +v -0.092290 0.010000 0.738323 +v -0.830613 0.010002 -5.814293 +v -0.738323 0.010002 -5.814293 +v -0.738323 0.010002 -5.906583 +v -0.830613 0.010002 -5.906583 +v -0.830613 0.010002 -5.075970 +v -0.738323 0.010002 -5.075970 +v -0.738323 0.010002 -5.168260 +v -0.830613 0.010002 -5.168260 +v -0.092290 0.010002 -5.075970 +v 0.000000 0.010002 -5.075970 +v 0.000000 0.010002 -5.168260 +v -0.092290 0.010002 -5.168260 +v 5.075970 0.010002 -5.814293 +v 5.168260 0.010002 -5.814293 +v 5.168260 0.010002 -5.906583 +v 5.075970 0.010002 -5.906583 +v 5.075970 0.010002 -5.075970 +v 5.168260 0.010002 -5.075970 +v 5.168260 0.010002 -5.168260 +v 5.075970 0.010002 -5.168260 +v 5.814293 0.010002 -5.075970 +v 5.906583 0.010002 -5.075970 +v 5.906583 0.010002 -5.168260 +v 5.814293 0.010002 -5.168260 +v 5.445131 0.010002 -5.075970 +v 5.537421 0.010002 -5.075970 +v 5.537421 0.010002 -5.168260 +v 5.445131 0.010002 -5.168260 +v 5.445131 0.010002 -4.706808 +v 5.537421 0.010002 -4.706808 +v 5.537421 0.010002 -4.799098 +v 5.445131 0.010002 -4.799098 +v 5.814293 0.010002 -4.706808 +v 5.906583 0.010002 -4.706808 +v 5.906583 0.010002 -4.799098 +v 5.814293 0.010002 -4.799098 +v 4.706808 0.010002 -5.075970 +v 4.799098 0.010002 -5.075970 +v 4.799098 0.010002 -5.168260 +v 4.706808 0.010002 -5.168260 +v 4.706808 0.010002 -4.706808 +v 4.799098 0.010002 -4.706808 +v 4.799098 0.010002 -4.799098 +v 4.706808 0.010002 -4.799098 +v 5.075970 0.010002 -4.706808 +v 5.168260 0.010002 -4.706808 +v 5.168260 0.010002 -4.799098 +v 5.075970 0.010002 -4.799098 +v 4.706808 0.010002 -5.814293 +v 4.799098 0.010002 -5.814293 +v 4.799098 0.010002 -5.906583 +v 4.706808 0.010002 -5.906583 +v 4.706808 0.010002 -5.445131 +v 4.799098 0.010002 -5.445131 +v 4.799098 0.010002 -5.537421 +v 4.706808 0.010002 -5.537421 +v 5.075970 0.010002 -5.445131 +v 5.168260 0.010002 -5.445131 +v 5.168260 0.010002 -5.537421 +v 5.075970 0.010002 -5.537421 +v -0.461452 0.010002 -5.075970 +v -0.369161 0.010002 -5.075970 +v -0.369161 0.010002 -5.168260 +v -0.461452 0.010002 -5.168260 +v -0.461452 0.010002 -4.706808 +v -0.369161 0.010002 -4.706808 +v -0.369161 0.010002 -4.799098 +v -0.461452 0.010002 -4.799098 +v -0.092290 0.010002 -4.706808 +v 0.000000 0.010002 -4.706808 +v 0.000000 0.010002 -4.799098 +v -0.092290 0.010002 -4.799098 +v -1.199775 0.010002 -5.075970 +v -1.107484 0.010002 -5.075970 +v -1.107484 0.010002 -5.168260 +v -1.199775 0.010002 -5.168260 +v -1.199775 0.010002 -4.706808 +v -1.107484 0.010002 -4.706808 +v -1.107484 0.010002 -4.799098 +v -1.199775 0.010002 -4.799098 +v -0.830613 0.010002 -4.706808 +v -0.738323 0.010002 -4.706808 +v -0.738323 0.010002 -4.799098 +v -0.830613 0.010002 -4.799098 +v -1.199775 0.010002 -5.814293 +v -1.107484 0.010002 -5.814293 +v -1.107484 0.010002 -5.906583 +v -1.199775 0.010002 -5.906583 +v -1.199775 0.010002 -5.445131 +v -1.107484 0.010002 -5.445131 +v -1.107484 0.010002 -5.537421 +v -1.199775 0.010002 -5.537421 +v -0.830613 0.010002 -5.445131 +v -0.738323 0.010002 -5.445131 +v -0.738323 0.010002 -5.537421 +v -0.830613 0.010002 -5.537421 +v -0.461452 0.010000 0.830613 +v -0.369161 0.010000 0.830613 +v -0.369161 0.010000 0.738323 +v -0.461452 0.010000 0.738323 +v -0.461452 0.010000 1.199775 +v -0.369161 0.010000 1.199775 +v -0.369161 0.010000 1.107484 +v -0.461452 0.010000 1.107484 +v -0.092290 0.010000 1.199775 +v 0.000000 0.010000 1.199775 +v 0.000000 0.010000 1.107484 +v -0.092290 0.010000 1.107484 +v -1.199775 0.010000 0.830613 +v -1.107484 0.010000 0.830613 +v -1.107484 0.010000 0.738323 +v -1.199775 0.010000 0.738323 +v -1.199775 0.010000 1.199775 +v -1.107484 0.010000 1.199775 +v -1.107484 0.010000 1.107484 +v -1.199775 0.010000 1.107484 +v -0.830613 0.010000 1.199775 +v -0.738323 0.010000 1.199775 +v -0.738323 0.010000 1.107484 +v -0.830613 0.010000 1.107484 +v -1.199775 0.010000 0.092290 +v -1.107484 0.010000 0.092290 +v -1.107484 0.010000 -0.000000 +v -1.199775 0.010000 -0.000000 +v -1.199775 0.010000 0.461452 +v -1.107484 0.010000 0.461452 +v -1.107484 0.010000 0.369161 +v -1.199775 0.010000 0.369161 +v -0.830613 0.010000 0.461452 +v -0.738323 0.010000 0.461452 +v -0.738323 0.010000 0.369161 +v -0.830613 0.010000 0.369161 +v 5.445131 0.010000 0.830613 +v 5.537421 0.010000 0.830613 +v 5.537421 0.010000 0.738323 +v 5.445131 0.010000 0.738323 +v 5.445131 0.010000 1.199775 +v 5.537421 0.010000 1.199775 +v 5.537421 0.010000 1.107484 +v 5.445131 0.010000 1.107484 +v 5.814293 0.010000 1.199775 +v 5.906583 0.010000 1.199775 +v 5.906583 0.010000 1.107484 +v 5.814293 0.010000 1.107484 +v 4.706808 0.010000 0.830613 +v 4.799098 0.010000 0.830613 +v 4.799098 0.010000 0.738323 +v 4.706808 0.010000 0.738323 +v 4.706808 0.010000 1.199775 +v 4.799098 0.010000 1.199775 +v 4.799098 0.010000 1.107484 +v 4.706808 0.010000 1.107484 +v 5.075970 0.010000 1.199775 +v 5.168260 0.010000 1.199775 +v 5.168260 0.010000 1.107484 +v 5.075970 0.010000 1.107484 +v 4.706808 0.010000 0.092290 +v 4.799098 0.010000 0.092290 +v 4.799098 0.010000 -0.000000 +v 4.706808 0.010000 -0.000000 +v 4.706808 0.010000 0.461452 +v 4.799098 0.010000 0.461452 +v 4.799098 0.010000 0.369161 +v 4.706808 0.010000 0.369161 +v 5.075970 0.010000 0.461452 +v 5.168260 0.010000 0.461452 +v 5.168260 0.010000 0.369161 +v 5.075970 0.010000 0.369161 +v 2.491840 0.010000 0.830613 +v 2.584130 0.010000 0.830613 +v 2.584130 0.010000 0.738323 +v 2.491840 0.010000 0.738323 +v 2.491840 0.010000 1.199775 +v 2.584130 0.010000 1.199775 +v 2.584130 0.010000 1.107484 +v 2.491840 0.010000 1.107484 +v 2.861001 0.010000 1.199775 +v 2.953291 0.010000 1.199775 +v 2.953291 0.010000 1.107484 +v 2.861001 0.010000 1.107484 +v 1.753517 0.010000 0.830613 +v 1.845807 0.010000 0.830613 +v 1.845807 0.010000 0.738323 +v 1.753517 0.010000 0.738323 +v 1.753517 0.010000 1.199775 +v 1.845807 0.010000 1.199775 +v 1.845807 0.010000 1.107484 +v 1.753517 0.010000 1.107484 +v 2.122678 0.010000 1.199775 +v 2.214968 0.010000 1.199775 +v 2.214968 0.010000 1.107484 +v 2.122678 0.010000 1.107484 +v 1.753517 0.010000 0.092290 +v 1.845807 0.010000 0.092290 +v 1.845807 0.010000 -0.000000 +v 1.753517 0.010000 -0.000000 +v 1.753517 0.010000 0.461452 +v 1.845807 0.010000 0.461452 +v 1.845807 0.010000 0.369161 +v 1.753517 0.010000 0.369161 +v 2.122678 0.010000 0.461452 +v 2.214968 0.010000 0.461452 +v 2.214968 0.010000 0.369161 +v 2.122678 0.010000 0.369161 +v 2.491840 0.009998 3.783905 +v 2.584130 0.009998 3.783905 +v 2.584130 0.009998 3.691614 +v 2.491840 0.009998 3.691614 +v 2.491840 0.009998 4.153066 +v 2.584130 0.009998 4.153066 +v 2.584130 0.009998 4.060776 +v 2.491840 0.009998 4.060776 +v 2.861001 0.009998 4.153066 +v 2.953291 0.009998 4.153066 +v 2.953291 0.009998 4.060776 +v 2.861001 0.009998 4.060776 +v 1.753517 0.009998 3.783905 +v 1.845807 0.009998 3.783905 +v 1.845807 0.009998 3.691614 +v 1.753517 0.009998 3.691614 +v 1.753517 0.009998 4.153066 +v 1.845807 0.009998 4.153066 +v 1.845807 0.009998 4.060776 +v 1.753517 0.009998 4.060776 +v 2.122678 0.009998 4.153066 +v 2.214968 0.009998 4.153066 +v 2.214968 0.009998 4.060776 +v 2.122678 0.009998 4.060776 +v 1.753517 0.009999 3.045582 +v 1.845807 0.009999 3.045582 +v 1.845807 0.009999 2.953291 +v 1.753517 0.009999 2.953291 +v 1.753517 0.009999 3.414743 +v 1.845807 0.009999 3.414743 +v 1.845807 0.009999 3.322453 +v 1.753517 0.009999 3.322453 +v 2.122678 0.009999 3.414743 +v 2.214968 0.009999 3.414743 +v 2.214968 0.009999 3.322453 +v 2.122678 0.009999 3.322453 +v 5.445131 0.009998 3.783905 +v 5.537421 0.009998 3.783905 +v 5.537421 0.009998 3.691614 +v 5.445131 0.009998 3.691614 +v 5.445131 0.009998 4.153066 +v 5.537421 0.009998 4.153066 +v 5.537421 0.009998 4.060776 +v 5.445131 0.009998 4.060776 +v 5.814293 0.009998 4.153066 +v 5.906583 0.009998 4.153066 +v 5.906583 0.009998 4.060776 +v 5.814293 0.009998 4.060776 +v 4.706808 0.009998 3.783905 +v 4.799098 0.009998 3.783905 +v 4.799098 0.009998 3.691614 +v 4.706808 0.009998 3.691614 +v 4.706808 0.009998 4.153066 +v 4.799098 0.009998 4.153066 +v 4.799098 0.009998 4.060776 +v 4.706808 0.009998 4.060776 +v 5.075970 0.009998 4.153066 +v 5.168260 0.009998 4.153066 +v 5.168260 0.009998 4.060776 +v 5.075970 0.009998 4.060776 +v 4.706808 0.009999 3.045582 +v 4.799098 0.009999 3.045582 +v 4.799098 0.009999 2.953291 +v 4.706808 0.009999 2.953291 +v 4.706808 0.009999 3.414743 +v 4.799098 0.009999 3.414743 +v 4.799098 0.009999 3.322453 +v 4.706808 0.009999 3.322453 +v 5.075970 0.009999 3.414743 +v 5.168260 0.009999 3.414743 +v 5.168260 0.009999 3.322453 +v 5.075970 0.009999 3.322453 +v -3.414743 0.010000 0.830613 +v -3.322453 0.010000 0.830613 +v -3.322453 0.010000 0.738323 +v -3.414743 0.010000 0.738323 +v -3.414743 0.010000 1.199775 +v -3.322453 0.010000 1.199775 +v -3.322453 0.010000 1.107484 +v -3.414743 0.010000 1.107484 +v -3.045582 0.010000 1.199775 +v -2.953291 0.010000 1.199775 +v -2.953291 0.010000 1.107484 +v -3.045582 0.010000 1.107484 +v -4.153066 0.010000 0.830613 +v -4.060776 0.010000 0.830613 +v -4.060776 0.010000 0.738323 +v -4.153066 0.010000 0.738323 +v -4.153066 0.010000 1.199775 +v -4.060776 0.010000 1.199775 +v -4.060776 0.010000 1.107484 +v -4.153066 0.010000 1.107484 +v -3.783905 0.010000 1.199775 +v -3.691614 0.010000 1.199775 +v -3.691614 0.010000 1.107484 +v -3.783905 0.010000 1.107484 +v -4.153066 0.010000 0.092290 +v -4.060776 0.010000 0.092290 +v -4.060776 0.010000 -0.000000 +v -4.153066 0.010000 -0.000000 +v -4.153066 0.010000 0.461452 +v -4.060776 0.010000 0.461452 +v -4.060776 0.010000 0.369161 +v -4.153066 0.010000 0.369161 +v -3.783905 0.010000 0.461452 +v -3.691614 0.010000 0.461452 +v -3.691614 0.010000 0.369161 +v -3.783905 0.010000 0.369161 +v -3.414743 0.009998 3.783905 +v -3.322453 0.009998 3.783905 +v -3.322453 0.009998 3.691614 +v -3.414743 0.009998 3.691614 +v -3.414743 0.009998 4.153066 +v -3.322453 0.009998 4.153066 +v -3.322453 0.009998 4.060776 +v -3.414743 0.009998 4.060776 +v -3.045582 0.009998 4.153066 +v -2.953291 0.009998 4.153066 +v -2.953291 0.009998 4.060776 +v -3.045582 0.009998 4.060776 +v -4.153066 0.009998 3.783905 +v -4.060776 0.009998 3.783905 +v -4.060776 0.009998 3.691614 +v -4.153066 0.009998 3.691614 +v -4.153066 0.009998 4.153066 +v -4.060776 0.009998 4.153066 +v -4.060776 0.009998 4.060776 +v -4.153066 0.009998 4.060776 +v -3.783905 0.009998 4.153066 +v -3.691614 0.009998 4.153066 +v -3.691614 0.009998 4.060776 +v -3.783905 0.009998 4.060776 +v -4.153066 0.009999 3.045582 +v -4.060776 0.009999 3.045582 +v -4.060776 0.009999 2.953291 +v -4.153066 0.009999 2.953291 +v -4.153066 0.009999 3.414743 +v -4.060776 0.009999 3.414743 +v -4.060776 0.009999 3.322453 +v -4.153066 0.009999 3.322453 +v -3.783905 0.009999 3.414743 +v -3.691614 0.009999 3.414743 +v -3.691614 0.009999 3.322453 +v -3.783905 0.009999 3.322453 +v -0.461452 0.009998 3.783905 +v -0.369161 0.009998 3.783905 +v -0.369161 0.009998 3.691614 +v -0.461452 0.009998 3.691614 +v -0.461452 0.009998 4.153066 +v -0.369161 0.009998 4.153066 +v -0.369161 0.009998 4.060776 +v -0.461452 0.009998 4.060776 +v -0.092290 0.009998 4.153066 +v 0.000000 0.009998 4.153066 +v 0.000000 0.009998 4.060776 +v -0.092290 0.009998 4.060776 +v -1.199775 0.009998 3.783905 +v -1.107484 0.009998 3.783905 +v -1.107484 0.009998 3.691614 +v -1.199775 0.009998 3.691614 +v -1.199775 0.009998 4.153066 +v -1.107484 0.009998 4.153066 +v -1.107484 0.009998 4.060776 +v -1.199775 0.009998 4.060776 +v -0.830613 0.009998 4.153066 +v -0.738323 0.009998 4.153066 +v -0.738323 0.009998 4.060776 +v -0.830613 0.009998 4.060776 +v -1.199775 0.009999 3.045582 +v -1.107484 0.009999 3.045582 +v -1.107484 0.009999 2.953291 +v -1.199775 0.009999 2.953291 +v -1.199775 0.009999 3.414743 +v -1.107484 0.009999 3.414743 +v -1.107484 0.009999 3.322453 +v -1.199775 0.009999 3.322453 +v -0.830613 0.009999 3.414743 +v -0.738323 0.009999 3.414743 +v -0.738323 0.009999 3.322453 +v -0.830613 0.009999 3.322453 +v -3.414743 0.010002 -5.075970 +v -3.322453 0.010002 -5.075970 +v -3.322453 0.010002 -5.168260 +v -3.414743 0.010002 -5.168260 +v -3.414743 0.010002 -4.706808 +v -3.322453 0.010002 -4.706808 +v -3.322453 0.010002 -4.799098 +v -3.414743 0.010002 -4.799098 +v -3.045582 0.010002 -4.706808 +v -2.953291 0.010002 -4.706808 +v -2.953291 0.010002 -4.799098 +v -3.045582 0.010002 -4.799098 +v -4.153066 0.010002 -5.075970 +v -4.060776 0.010002 -5.075970 +v -4.060776 0.010002 -5.168260 +v -4.153066 0.010002 -5.168260 +v -4.153066 0.010002 -4.706808 +v -4.060776 0.010002 -4.706808 +v -4.060776 0.010002 -4.799098 +v -4.153066 0.010002 -4.799098 +v -3.783905 0.010002 -4.706808 +v -3.691614 0.010002 -4.706808 +v -3.691614 0.010002 -4.799098 +v -3.783905 0.010002 -4.799098 +v -4.153066 0.010002 -5.814293 +v -4.060776 0.010002 -5.814293 +v -4.060776 0.010002 -5.906583 +v -4.153066 0.010002 -5.906583 +v -4.153066 0.010002 -5.445131 +v -4.060776 0.010002 -5.445131 +v -4.060776 0.010002 -5.537421 +v -4.153066 0.010002 -5.537421 +v -3.783905 0.010002 -5.445131 +v -3.691614 0.010002 -5.445131 +v -3.691614 0.010002 -5.537421 +v -3.783905 0.010002 -5.537421 +v -3.414743 0.010001 -2.122678 +v -3.322453 0.010001 -2.122678 +v -3.322453 0.010001 -2.214968 +v -3.414743 0.010001 -2.214968 +v -3.414743 0.010001 -1.753517 +v -3.322453 0.010001 -1.753517 +v -3.322453 0.010001 -1.845807 +v -3.414743 0.010001 -1.845807 +v -3.045582 0.010001 -1.753517 +v -2.953291 0.010001 -1.753517 +v -2.953291 0.010001 -1.845807 +v -3.045582 0.010001 -1.845807 +v -4.153066 0.010001 -2.122678 +v -4.060776 0.010001 -2.122678 +v -4.060776 0.010001 -2.214968 +v -4.153066 0.010001 -2.214968 +v -4.153066 0.010001 -1.753517 +v -4.060776 0.010001 -1.753517 +v -4.060776 0.010001 -1.845807 +v -4.153066 0.010001 -1.845807 +v -3.783905 0.010001 -1.753517 +v -3.691614 0.010001 -1.753517 +v -3.691614 0.010001 -1.845807 +v -3.783905 0.010001 -1.845807 +v -4.153066 0.010001 -2.861001 +v -4.060776 0.010001 -2.861001 +v -4.060776 0.010001 -2.953291 +v -4.153066 0.010001 -2.953291 +v -4.153066 0.010001 -2.491840 +v -4.060776 0.010001 -2.491840 +v -4.060776 0.010001 -2.584130 +v -4.153066 0.010001 -2.584130 +v -3.783905 0.010001 -2.491840 +v -3.691614 0.010001 -2.491840 +v -3.691614 0.010001 -2.584130 +v -3.783905 0.010001 -2.584130 +v -0.461452 0.010001 -2.122678 +v -0.369161 0.010001 -2.122678 +v -0.369161 0.010001 -2.214968 +v -0.461452 0.010001 -2.214968 +v -0.461452 0.010001 -1.753517 +v -0.369161 0.010001 -1.753517 +v -0.369161 0.010001 -1.845807 +v -0.461452 0.010001 -1.845807 +v -0.092290 0.010001 -1.753517 +v 0.000000 0.010001 -1.753517 +v 0.000000 0.010001 -1.845807 +v -0.092290 0.010001 -1.845807 +v -1.199775 0.010001 -2.122678 +v -1.107484 0.010001 -2.122678 +v -1.107484 0.010001 -2.214968 +v -1.199775 0.010001 -2.214968 +v -1.199775 0.010001 -1.753517 +v -1.107484 0.010001 -1.753517 +v -1.107484 0.010001 -1.845807 +v -1.199775 0.010001 -1.845807 +v -0.830613 0.010001 -1.753517 +v -0.738323 0.010001 -1.753517 +v -0.738323 0.010001 -1.845807 +v -0.830613 0.010001 -1.845807 +v -1.199775 0.010001 -2.861001 +v -1.107484 0.010001 -2.861001 +v -1.107484 0.010001 -2.953291 +v -1.199775 0.010001 -2.953291 +v -1.199775 0.010001 -2.491840 +v -1.107484 0.010001 -2.491840 +v -1.107484 0.010001 -2.584130 +v -1.199775 0.010001 -2.584130 +v -0.830613 0.010001 -2.491840 +v -0.738323 0.010001 -2.491840 +v -0.738323 0.010001 -2.584130 +v -0.830613 0.010001 -2.584130 +v 2.491840 0.010002 -5.075970 +v 2.584130 0.010002 -5.075970 +v 2.584130 0.010002 -5.168260 +v 2.491840 0.010002 -5.168260 +v 2.491840 0.010002 -4.706808 +v 2.584130 0.010002 -4.706808 +v 2.584130 0.010002 -4.799098 +v 2.491840 0.010002 -4.799098 +v 2.861001 0.010002 -4.706808 +v 2.953291 0.010002 -4.706808 +v 2.953291 0.010002 -4.799098 +v 2.861001 0.010002 -4.799098 +v 1.753517 0.010002 -5.075970 +v 1.845807 0.010002 -5.075970 +v 1.845807 0.010002 -5.168260 +v 1.753517 0.010002 -5.168260 +v 1.753517 0.010002 -4.706808 +v 1.845807 0.010002 -4.706808 +v 1.845807 0.010002 -4.799098 +v 1.753517 0.010002 -4.799098 +v 2.122678 0.010002 -4.706808 +v 2.214968 0.010002 -4.706808 +v 2.214968 0.010002 -4.799098 +v 2.122678 0.010002 -4.799098 +v 1.753517 0.010002 -5.814293 +v 1.845807 0.010002 -5.814293 +v 1.845807 0.010002 -5.906583 +v 1.753517 0.010002 -5.906583 +v 1.753517 0.010002 -5.445131 +v 1.845807 0.010002 -5.445131 +v 1.845807 0.010002 -5.537421 +v 1.753517 0.010002 -5.537421 +v 2.122678 0.010002 -5.445131 +v 2.214968 0.010002 -5.445131 +v 2.214968 0.010002 -5.537421 +v 2.122678 0.010002 -5.537421 +v 2.491840 0.010001 -2.122678 +v 2.584130 0.010001 -2.122678 +v 2.584130 0.010001 -2.214968 +v 2.491840 0.010001 -2.214968 +v 2.491840 0.010001 -1.753517 +v 2.584130 0.010001 -1.753517 +v 2.584130 0.010001 -1.845807 +v 2.491840 0.010001 -1.845807 +v 2.861001 0.010001 -1.753517 +v 2.953291 0.010001 -1.753517 +v 2.953291 0.010001 -1.845807 +v 2.861001 0.010001 -1.845807 +v 1.753517 0.010001 -2.122678 +v 1.845807 0.010001 -2.122678 +v 1.845807 0.010001 -2.214968 +v 1.753517 0.010001 -2.214968 +v 1.753517 0.010001 -1.753517 +v 1.845807 0.010001 -1.753517 +v 1.845807 0.010001 -1.845807 +v 1.753517 0.010001 -1.845807 +v 2.122678 0.010001 -1.753517 +v 2.214968 0.010001 -1.753517 +v 2.214968 0.010001 -1.845807 +v 2.122678 0.010001 -1.845807 +v 1.753517 0.010001 -2.861001 +v 1.845807 0.010001 -2.861001 +v 1.845807 0.010001 -2.953291 +v 1.753517 0.010001 -2.953291 +v 1.753517 0.010001 -2.491840 +v 1.845807 0.010001 -2.491840 +v 1.845807 0.010001 -2.584130 +v 1.753517 0.010001 -2.584130 +v 2.122678 0.010001 -2.491840 +v 2.214968 0.010001 -2.491840 +v 2.214968 0.010001 -2.584130 +v 2.122678 0.010001 -2.584130 +v 5.445131 0.010001 -2.122678 +v 5.537421 0.010001 -2.122678 +v 5.537421 0.010001 -2.214968 +v 5.445131 0.010001 -2.214968 +v 5.445131 0.010001 -1.753517 +v 5.537421 0.010001 -1.753517 +v 5.537421 0.010001 -1.845807 +v 5.445131 0.010001 -1.845807 +v 5.814293 0.010001 -1.753517 +v 5.906583 0.010001 -1.753517 +v 5.906583 0.010001 -1.845807 +v 5.814293 0.010001 -1.845807 +v 4.706808 0.010001 -2.122678 +v 4.799098 0.010001 -2.122678 +v 4.799098 0.010001 -2.214968 +v 4.706808 0.010001 -2.214968 +v 4.706808 0.010001 -1.753517 +v 4.799098 0.010001 -1.753517 +v 4.799098 0.010001 -1.845807 +v 4.706808 0.010001 -1.845807 +v 5.075970 0.010001 -1.753517 +v 5.168260 0.010001 -1.753517 +v 5.168260 0.010001 -1.845807 +v 5.075970 0.010001 -1.845807 +v 4.706808 0.010001 -2.861001 +v 4.799098 0.010001 -2.861001 +v 4.799098 0.010001 -2.953291 +v 4.706808 0.010001 -2.953291 +v 4.706808 0.010001 -2.491840 +v 4.799098 0.010001 -2.491840 +v 4.799098 0.010001 -2.584130 +v 4.706808 0.010001 -2.584130 +v 5.075970 0.010001 -2.491840 +v 5.168260 0.010001 -2.491840 +v 5.168260 0.010001 -2.584130 +v 5.075970 0.010001 -2.584130 +v 3.968485 0.010001 -2.122678 +v 4.060776 0.010001 -2.122678 +v 4.060776 0.010001 -2.214968 +v 3.968485 0.010001 -2.214968 +v 3.968485 0.010001 -1.753517 +v 4.060776 0.010001 -1.753517 +v 4.060776 0.010001 -1.845807 +v 3.968485 0.010001 -1.845807 +v 4.337647 0.010001 -1.753517 +v 4.429937 0.010001 -1.753517 +v 4.429937 0.010001 -1.845807 +v 4.337647 0.010001 -1.845807 +v 3.230163 0.010001 -2.122678 +v 3.322453 0.010001 -2.122678 +v 3.322453 0.010001 -2.214968 +v 3.230163 0.010001 -2.214968 +v 3.230163 0.010001 -1.753517 +v 3.322453 0.010001 -1.753517 +v 3.322453 0.010001 -1.845807 +v 3.230163 0.010001 -1.845807 +v 3.599324 0.010001 -1.753517 +v 3.691614 0.010001 -1.753517 +v 3.691614 0.010001 -1.845807 +v 3.599324 0.010001 -1.845807 +v 3.230163 0.010001 -2.861001 +v 3.322453 0.010001 -2.861001 +v 3.322453 0.010001 -2.953291 +v 3.230163 0.010001 -2.953291 +v 3.230163 0.010001 -2.491840 +v 3.322453 0.010001 -2.491840 +v 3.322453 0.010001 -2.584130 +v 3.230163 0.010001 -2.584130 +v 3.599324 0.010001 -2.491840 +v 3.691614 0.010001 -2.491840 +v 3.691614 0.010001 -2.584130 +v 3.599324 0.010001 -2.584130 +v 3.968485 0.010000 -0.646033 +v 4.060776 0.010000 -0.646033 +v 4.060776 0.010000 -0.738323 +v 3.968485 0.010000 -0.738323 +v 3.968485 0.010000 -0.276871 +v 4.060776 0.010000 -0.276871 +v 4.060776 0.010000 -0.369161 +v 3.968485 0.010000 -0.369161 +v 4.337647 0.010000 -0.276871 +v 4.429937 0.010000 -0.276871 +v 4.429937 0.010000 -0.369161 +v 4.337647 0.010000 -0.369161 +v 3.230163 0.010000 -0.646033 +v 3.322453 0.010000 -0.646033 +v 3.322453 0.010000 -0.738323 +v 3.230163 0.010000 -0.738323 +v 3.230163 0.010000 -0.276871 +v 3.322453 0.010000 -0.276871 +v 3.322453 0.010000 -0.369161 +v 3.230163 0.010000 -0.369161 +v 3.599324 0.010000 -0.276871 +v 3.691614 0.010000 -0.276871 +v 3.691614 0.010000 -0.369161 +v 3.599324 0.010000 -0.369161 +v 3.230163 0.010001 -1.384355 +v 3.322453 0.010001 -1.384355 +v 3.322453 0.010001 -1.476646 +v 3.230163 0.010001 -1.476646 +v 3.230163 0.010000 -1.015194 +v 3.322453 0.010000 -1.015194 +v 3.322453 0.010000 -1.107484 +v 3.230163 0.010000 -1.107484 +v 3.599324 0.010000 -1.015194 +v 3.691614 0.010000 -1.015194 +v 3.691614 0.010000 -1.107484 +v 3.599324 0.010000 -1.107484 +v 5.445131 0.010000 -0.646033 +v 5.537421 0.010000 -0.646033 +v 5.537421 0.010000 -0.738323 +v 5.445131 0.010000 -0.738323 +v 5.445131 0.010000 -0.276871 +v 5.537421 0.010000 -0.276871 +v 5.537421 0.010000 -0.369161 +v 5.445131 0.010000 -0.369161 +v 5.814293 0.010000 -0.276871 +v 5.906583 0.010000 -0.276871 +v 5.906583 0.010000 -0.369161 +v 5.814293 0.010000 -0.369161 +v 4.706808 0.010000 -0.646033 +v 4.799098 0.010000 -0.646033 +v 4.799098 0.010000 -0.738323 +v 4.706808 0.010000 -0.738323 +v 4.706808 0.010000 -0.276871 +v 4.799098 0.010000 -0.276871 +v 4.799098 0.010000 -0.369161 +v 4.706808 0.010000 -0.369161 +v 5.075970 0.010000 -0.276871 +v 5.168260 0.010000 -0.276871 +v 5.168260 0.010000 -0.369161 +v 5.075970 0.010000 -0.369161 +v 4.706808 0.010001 -1.384355 +v 4.799098 0.010001 -1.384355 +v 4.799098 0.010001 -1.476646 +v 4.706808 0.010001 -1.476646 +v 4.706808 0.010000 -1.015194 +v 4.799098 0.010000 -1.015194 +v 4.799098 0.010000 -1.107484 +v 4.706808 0.010000 -1.107484 +v 5.075970 0.010000 -1.015194 +v 5.168260 0.010000 -1.015194 +v 5.168260 0.010000 -1.107484 +v 5.075970 0.010000 -1.107484 +v 1.015194 0.010001 -2.122678 +v 1.107484 0.010001 -2.122678 +v 1.107484 0.010001 -2.214968 +v 1.015194 0.010001 -2.214968 +v 1.015194 0.010001 -1.753517 +v 1.107484 0.010001 -1.753517 +v 1.107484 0.010001 -1.845807 +v 1.015194 0.010001 -1.845807 +v 1.384355 0.010001 -1.753517 +v 1.476646 0.010001 -1.753517 +v 1.476646 0.010001 -1.845807 +v 1.384355 0.010001 -1.845807 +v 0.276871 0.010001 -2.122678 +v 0.369161 0.010001 -2.122678 +v 0.369161 0.010001 -2.214968 +v 0.276871 0.010001 -2.214968 +v 0.276871 0.010001 -1.753517 +v 0.369161 0.010001 -1.753517 +v 0.369161 0.010001 -1.845807 +v 0.276871 0.010001 -1.845807 +v 0.646033 0.010001 -1.753517 +v 0.738323 0.010001 -1.753517 +v 0.738323 0.010001 -1.845807 +v 0.646033 0.010001 -1.845807 +v 0.276871 0.010001 -2.861001 +v 0.369161 0.010001 -2.861001 +v 0.369161 0.010001 -2.953291 +v 0.276871 0.010001 -2.953291 +v 0.276871 0.010001 -2.491840 +v 0.369161 0.010001 -2.491840 +v 0.369161 0.010001 -2.584130 +v 0.276871 0.010001 -2.584130 +v 0.646033 0.010001 -2.491840 +v 0.738323 0.010001 -2.491840 +v 0.738323 0.010001 -2.584130 +v 0.646033 0.010001 -2.584130 +v 1.015194 0.010000 -0.646033 +v 1.107484 0.010000 -0.646033 +v 1.107484 0.010000 -0.738323 +v 1.015194 0.010000 -0.738323 +v 1.015194 0.010000 -0.276871 +v 1.107484 0.010000 -0.276871 +v 1.107484 0.010000 -0.369161 +v 1.015194 0.010000 -0.369161 +v 1.384355 0.010000 -0.276871 +v 1.476646 0.010000 -0.276871 +v 1.476646 0.010000 -0.369161 +v 1.384355 0.010000 -0.369161 +v 0.276871 0.010000 -0.646033 +v 0.369161 0.010000 -0.646033 +v 0.369161 0.010000 -0.738323 +v 0.276871 0.010000 -0.738323 +v 0.276871 0.010000 -0.276871 +v 0.369161 0.010000 -0.276871 +v 0.369161 0.010000 -0.369161 +v 0.276871 0.010000 -0.369161 +v 0.646033 0.010000 -0.276871 +v 0.738323 0.010000 -0.276871 +v 0.738323 0.010000 -0.369161 +v 0.646033 0.010000 -0.369161 +v 0.276871 0.010001 -1.384355 +v 0.369161 0.010001 -1.384355 +v 0.369161 0.010001 -1.476646 +v 0.276871 0.010001 -1.476646 +v 0.276871 0.010000 -1.015194 +v 0.369161 0.010000 -1.015194 +v 0.369161 0.010000 -1.107484 +v 0.276871 0.010000 -1.107484 +v 0.646033 0.010000 -1.015194 +v 0.738323 0.010000 -1.015194 +v 0.738323 0.010000 -1.107484 +v 0.646033 0.010000 -1.107484 +v 2.491840 0.010000 -0.646033 +v 2.584130 0.010000 -0.646033 +v 2.584130 0.010000 -0.738323 +v 2.491840 0.010000 -0.738323 +v 2.491840 0.010000 -0.276871 +v 2.584130 0.010000 -0.276871 +v 2.584130 0.010000 -0.369161 +v 2.491840 0.010000 -0.369161 +v 2.861001 0.010000 -0.276871 +v 2.953291 0.010000 -0.276871 +v 2.953291 0.010000 -0.369161 +v 2.861001 0.010000 -0.369161 +v 1.753517 0.010000 -0.646033 +v 1.845807 0.010000 -0.646033 +v 1.845807 0.010000 -0.738323 +v 1.753517 0.010000 -0.738323 +v 1.753517 0.010000 -0.276871 +v 1.845807 0.010000 -0.276871 +v 1.845807 0.010000 -0.369161 +v 1.753517 0.010000 -0.369161 +v 2.122678 0.010000 -0.276871 +v 2.214968 0.010000 -0.276871 +v 2.214968 0.010000 -0.369161 +v 2.122678 0.010000 -0.369161 +v 1.753517 0.010001 -1.384355 +v 1.845807 0.010001 -1.384355 +v 1.845807 0.010001 -1.476646 +v 1.753517 0.010001 -1.476646 +v 1.753517 0.010000 -1.015194 +v 1.845807 0.010000 -1.015194 +v 1.845807 0.010000 -1.107484 +v 1.753517 0.010000 -1.107484 +v 2.122678 0.010000 -1.015194 +v 2.214968 0.010000 -1.015194 +v 2.214968 0.010000 -1.107484 +v 2.122678 0.010000 -1.107484 +v 1.015194 0.010002 -5.075970 +v 1.107484 0.010002 -5.075970 +v 1.107484 0.010002 -5.168260 +v 1.015194 0.010002 -5.168260 +v 1.015194 0.010002 -4.706808 +v 1.107484 0.010002 -4.706808 +v 1.107484 0.010002 -4.799098 +v 1.015194 0.010002 -4.799098 +v 1.384355 0.010002 -4.706808 +v 1.476646 0.010002 -4.706808 +v 1.476646 0.010002 -4.799098 +v 1.384355 0.010002 -4.799098 +v 0.276871 0.010002 -5.075970 +v 0.369161 0.010002 -5.075970 +v 0.369161 0.010002 -5.168260 +v 0.276871 0.010002 -5.168260 +v 0.276871 0.010002 -4.706808 +v 0.369161 0.010002 -4.706808 +v 0.369161 0.010002 -4.799098 +v 0.276871 0.010002 -4.799098 +v 0.646033 0.010002 -4.706808 +v 0.738323 0.010002 -4.706808 +v 0.738323 0.010002 -4.799098 +v 0.646033 0.010002 -4.799098 +v 0.276871 0.010002 -5.814293 +v 0.369161 0.010002 -5.814293 +v 0.369161 0.010002 -5.906583 +v 0.276871 0.010002 -5.906583 +v 0.276871 0.010002 -5.445131 +v 0.369161 0.010002 -5.445131 +v 0.369161 0.010002 -5.537421 +v 0.276871 0.010002 -5.537421 +v 0.646033 0.010002 -5.445131 +v 0.738323 0.010002 -5.445131 +v 0.738323 0.010002 -5.537421 +v 0.646033 0.010002 -5.537421 +v 1.015194 0.010001 -3.599324 +v 1.107484 0.010001 -3.599324 +v 1.107484 0.010002 -3.691614 +v 1.015194 0.010002 -3.691614 +v 1.015194 0.010001 -3.230163 +v 1.107484 0.010001 -3.230163 +v 1.107484 0.010001 -3.322453 +v 1.015194 0.010001 -3.322453 +v 1.384355 0.010001 -3.230163 +v 1.476646 0.010001 -3.230163 +v 1.476646 0.010001 -3.322453 +v 1.384355 0.010001 -3.322453 +v 0.276871 0.010001 -3.599324 +v 0.369161 0.010001 -3.599324 +v 0.369161 0.010002 -3.691614 +v 0.276871 0.010002 -3.691614 +v 0.276871 0.010001 -3.230163 +v 0.369161 0.010001 -3.230163 +v 0.369161 0.010001 -3.322453 +v 0.276871 0.010001 -3.322453 +v 0.646033 0.010001 -3.230163 +v 0.738323 0.010001 -3.230163 +v 0.738323 0.010001 -3.322453 +v 0.646033 0.010001 -3.322453 +v 0.276871 0.010002 -4.337647 +v 0.369161 0.010002 -4.337647 +v 0.369161 0.010002 -4.429937 +v 0.276871 0.010002 -4.429937 +v 0.276871 0.010002 -3.968485 +v 0.369161 0.010002 -3.968485 +v 0.369161 0.010002 -4.060776 +v 0.276871 0.010002 -4.060776 +v 0.646033 0.010002 -3.968485 +v 0.738323 0.010002 -3.968485 +v 0.738323 0.010002 -4.060776 +v 0.646033 0.010002 -4.060776 +v 2.491840 0.010001 -3.599324 +v 2.584130 0.010001 -3.599324 +v 2.584130 0.010002 -3.691614 +v 2.491840 0.010002 -3.691614 +v 2.491840 0.010001 -3.230163 +v 2.584130 0.010001 -3.230163 +v 2.584130 0.010001 -3.322453 +v 2.491840 0.010001 -3.322453 +v 2.861001 0.010001 -3.230163 +v 2.953291 0.010001 -3.230163 +v 2.953291 0.010001 -3.322453 +v 2.861001 0.010001 -3.322453 +v 1.753517 0.010001 -3.599324 +v 1.845807 0.010001 -3.599324 +v 1.845807 0.010002 -3.691614 +v 1.753517 0.010002 -3.691614 +v 1.753517 0.010001 -3.230163 +v 1.845807 0.010001 -3.230163 +v 1.845807 0.010001 -3.322453 +v 1.753517 0.010001 -3.322453 +v 2.122678 0.010001 -3.230163 +v 2.214968 0.010001 -3.230163 +v 2.214968 0.010001 -3.322453 +v 2.122678 0.010001 -3.322453 +v 1.753517 0.010002 -4.337647 +v 1.845807 0.010002 -4.337647 +v 1.845807 0.010002 -4.429937 +v 1.753517 0.010002 -4.429937 +v 1.753517 0.010002 -3.968485 +v 1.845807 0.010002 -3.968485 +v 1.845807 0.010002 -4.060776 +v 1.753517 0.010002 -4.060776 +v 2.122678 0.010002 -3.968485 +v 2.214968 0.010002 -3.968485 +v 2.214968 0.010002 -4.060776 +v 2.122678 0.010002 -4.060776 +v -1.938097 0.010001 -2.122678 +v -1.845807 0.010001 -2.122678 +v -1.845807 0.010001 -2.214968 +v -1.938097 0.010001 -2.214968 +v -1.938097 0.010001 -1.753517 +v -1.845807 0.010001 -1.753517 +v -1.845807 0.010001 -1.845807 +v -1.938097 0.010001 -1.845807 +v -1.568936 0.010001 -1.753517 +v -1.476646 0.010001 -1.753517 +v -1.476646 0.010001 -1.845807 +v -1.568936 0.010001 -1.845807 +v -2.676420 0.010001 -2.122678 +v -2.584130 0.010001 -2.122678 +v -2.584130 0.010001 -2.214968 +v -2.676420 0.010001 -2.214968 +v -2.676420 0.010001 -1.753517 +v -2.584130 0.010001 -1.753517 +v -2.584130 0.010001 -1.845807 +v -2.676420 0.010001 -1.845807 +v -2.307259 0.010001 -1.753517 +v -2.214968 0.010001 -1.753517 +v -2.214968 0.010001 -1.845807 +v -2.307259 0.010001 -1.845807 +v -2.676420 0.010001 -2.861001 +v -2.584130 0.010001 -2.861001 +v -2.584130 0.010001 -2.953291 +v -2.676420 0.010001 -2.953291 +v -2.676420 0.010001 -2.491840 +v -2.584130 0.010001 -2.491840 +v -2.584130 0.010001 -2.584130 +v -2.676420 0.010001 -2.584130 +v -2.307259 0.010001 -2.491840 +v -2.214968 0.010001 -2.491840 +v -2.214968 0.010001 -2.584130 +v -2.307259 0.010001 -2.584130 +v -1.938097 0.010000 -0.646033 +v -1.845807 0.010000 -0.646033 +v -1.845807 0.010000 -0.738323 +v -1.938097 0.010000 -0.738323 +v -1.938097 0.010000 -0.276871 +v -1.845807 0.010000 -0.276871 +v -1.845807 0.010000 -0.369161 +v -1.938097 0.010000 -0.369161 +v -1.568936 0.010000 -0.276871 +v -1.476646 0.010000 -0.276871 +v -1.476646 0.010000 -0.369161 +v -1.568936 0.010000 -0.369161 +v -2.676420 0.010000 -0.646033 +v -2.584130 0.010000 -0.646033 +v -2.584130 0.010000 -0.738323 +v -2.676420 0.010000 -0.738323 +v -2.676420 0.010000 -0.276871 +v -2.584130 0.010000 -0.276871 +v -2.584130 0.010000 -0.369161 +v -2.676420 0.010000 -0.369161 +v -2.307259 0.010000 -0.276871 +v -2.214968 0.010000 -0.276871 +v -2.214968 0.010000 -0.369161 +v -2.307259 0.010000 -0.369161 +v -2.676420 0.010001 -1.384355 +v -2.584130 0.010001 -1.384355 +v -2.584130 0.010001 -1.476646 +v -2.676420 0.010001 -1.476646 +v -2.676420 0.010000 -1.015194 +v -2.584130 0.010000 -1.015194 +v -2.584130 0.010000 -1.107484 +v -2.676420 0.010000 -1.107484 +v -2.307259 0.010000 -1.015194 +v -2.214968 0.010000 -1.015194 +v -2.214968 0.010000 -1.107484 +v -2.307259 0.010000 -1.107484 +v -0.461452 0.010000 -0.646033 +v -0.369161 0.010000 -0.646033 +v -0.369161 0.010000 -0.738323 +v -0.461452 0.010000 -0.738323 +v -0.461452 0.010000 -0.276871 +v -0.369161 0.010000 -0.276871 +v -0.369161 0.010000 -0.369161 +v -0.461452 0.010000 -0.369161 +v -0.092290 0.010000 -0.276871 +v 0.000000 0.010000 -0.276871 +v 0.000000 0.010000 -0.369161 +v -0.092290 0.010000 -0.369161 +v -1.199775 0.010000 -0.646033 +v -1.107484 0.010000 -0.646033 +v -1.107484 0.010000 -0.738323 +v -1.199775 0.010000 -0.738323 +v -1.199775 0.010000 -0.276871 +v -1.107484 0.010000 -0.276871 +v -1.107484 0.010000 -0.369161 +v -1.199775 0.010000 -0.369161 +v -0.830613 0.010000 -0.276871 +v -0.738323 0.010000 -0.276871 +v -0.738323 0.010000 -0.369161 +v -0.830613 0.010000 -0.369161 +v -1.199775 0.010001 -1.384355 +v -1.107484 0.010001 -1.384355 +v -1.107484 0.010001 -1.476646 +v -1.199775 0.010001 -1.476646 +v -1.199775 0.010000 -1.015194 +v -1.107484 0.010000 -1.015194 +v -1.107484 0.010000 -1.107484 +v -1.199775 0.010000 -1.107484 +v -0.830613 0.010000 -1.015194 +v -0.738323 0.010000 -1.015194 +v -0.738323 0.010000 -1.107484 +v -0.830613 0.010000 -1.107484 +v -4.891389 0.010001 -2.122678 +v -4.799098 0.010001 -2.122678 +v -4.799098 0.010001 -2.214968 +v -4.891389 0.010001 -2.214968 +v -4.891389 0.010001 -1.753517 +v -4.799098 0.010001 -1.753517 +v -4.799098 0.010001 -1.845807 +v -4.891389 0.010001 -1.845807 +v -4.522227 0.010001 -1.753517 +v -4.429937 0.010001 -1.753517 +v -4.429937 0.010001 -1.845807 +v -4.522227 0.010001 -1.845807 +v -5.629711 0.010001 -2.122678 +v -5.537421 0.010001 -2.122678 +v -5.537421 0.010001 -2.214968 +v -5.629711 0.010001 -2.214968 +v -5.629711 0.010001 -1.753517 +v -5.537421 0.010001 -1.753517 +v -5.537421 0.010001 -1.845807 +v -5.629711 0.010001 -1.845807 +v -5.260550 0.010001 -1.753517 +v -5.168260 0.010001 -1.753517 +v -5.168260 0.010001 -1.845807 +v -5.260550 0.010001 -1.845807 +v -5.629711 0.010001 -2.861001 +v -5.537421 0.010001 -2.861001 +v -5.537421 0.010001 -2.953291 +v -5.629711 0.010001 -2.953291 +v -5.629711 0.010001 -2.491840 +v -5.537421 0.010001 -2.491840 +v -5.537421 0.010001 -2.584130 +v -5.629711 0.010001 -2.584130 +v -5.260550 0.010001 -2.491840 +v -5.168260 0.010001 -2.491840 +v -5.168260 0.010001 -2.584130 +v -5.260550 0.010001 -2.584130 +v -4.891389 0.010000 -0.646033 +v -4.799098 0.010000 -0.646033 +v -4.799098 0.010000 -0.738323 +v -4.891389 0.010000 -0.738323 +v -4.891389 0.010000 -0.276871 +v -4.799098 0.010000 -0.276871 +v -4.799098 0.010000 -0.369161 +v -4.891389 0.010000 -0.369161 +v -4.522227 0.010000 -0.276871 +v -4.429937 0.010000 -0.276871 +v -4.429937 0.010000 -0.369161 +v -4.522227 0.010000 -0.369161 +v -5.629711 0.010000 -0.646033 +v -5.537421 0.010000 -0.646033 +v -5.537421 0.010000 -0.738323 +v -5.629711 0.010000 -0.738323 +v -5.629711 0.010000 -0.276871 +v -5.537421 0.010000 -0.276871 +v -5.537421 0.010000 -0.369161 +v -5.629711 0.010000 -0.369161 +v -5.260550 0.010000 -0.276871 +v -5.168260 0.010000 -0.276871 +v -5.168260 0.010000 -0.369161 +v -5.260550 0.010000 -0.369161 +v -5.629711 0.010001 -1.384355 +v -5.537421 0.010001 -1.384355 +v -5.537421 0.010001 -1.476646 +v -5.629711 0.010001 -1.476646 +v -5.629711 0.010000 -1.015194 +v -5.537421 0.010000 -1.015194 +v -5.537421 0.010000 -1.107484 +v -5.629711 0.010000 -1.107484 +v -5.260550 0.010000 -1.015194 +v -5.168260 0.010000 -1.015194 +v -5.168260 0.010000 -1.107484 +v -5.260550 0.010000 -1.107484 +v -3.414743 0.010000 -0.646033 +v -3.322453 0.010000 -0.646033 +v -3.322453 0.010000 -0.738323 +v -3.414743 0.010000 -0.738323 +v -3.414743 0.010000 -0.276871 +v -3.322453 0.010000 -0.276871 +v -3.322453 0.010000 -0.369161 +v -3.414743 0.010000 -0.369161 +v -3.045582 0.010000 -0.276871 +v -2.953291 0.010000 -0.276871 +v -2.953291 0.010000 -0.369161 +v -3.045582 0.010000 -0.369161 +v -4.153066 0.010000 -0.646033 +v -4.060776 0.010000 -0.646033 +v -4.060776 0.010000 -0.738323 +v -4.153066 0.010000 -0.738323 +v -4.153066 0.010000 -0.276871 +v -4.060776 0.010000 -0.276871 +v -4.060776 0.010000 -0.369161 +v -4.153066 0.010000 -0.369161 +v -3.783905 0.010000 -0.276871 +v -3.691614 0.010000 -0.276871 +v -3.691614 0.010000 -0.369161 +v -3.783905 0.010000 -0.369161 +v -4.153066 0.010001 -1.384355 +v -4.060776 0.010001 -1.384355 +v -4.060776 0.010001 -1.476646 +v -4.153066 0.010001 -1.476646 +v -4.153066 0.010000 -1.015194 +v -4.060776 0.010000 -1.015194 +v -4.060776 0.010000 -1.107484 +v -4.153066 0.010000 -1.107484 +v -3.783905 0.010000 -1.015194 +v -3.691614 0.010000 -1.015194 +v -3.691614 0.010000 -1.107484 +v -3.783905 0.010000 -1.107484 +v -4.891389 0.010002 -5.075970 +v -4.799098 0.010002 -5.075970 +v -4.799098 0.010002 -5.168260 +v -4.891389 0.010002 -5.168260 +v -4.891389 0.010002 -4.706808 +v -4.799098 0.010002 -4.706808 +v -4.799098 0.010002 -4.799098 +v -4.891389 0.010002 -4.799098 +v -4.522227 0.010002 -4.706808 +v -4.429937 0.010002 -4.706808 +v -4.429937 0.010002 -4.799098 +v -4.522227 0.010002 -4.799098 +v -5.629711 0.010002 -5.075970 +v -5.537421 0.010002 -5.075970 +v -5.537421 0.010002 -5.168260 +v -5.629711 0.010002 -5.168260 +v -5.629711 0.010002 -4.706808 +v -5.537421 0.010002 -4.706808 +v -5.537421 0.010002 -4.799098 +v -5.629711 0.010002 -4.799098 +v -5.260550 0.010002 -4.706808 +v -5.168260 0.010002 -4.706808 +v -5.168260 0.010002 -4.799098 +v -5.260550 0.010002 -4.799098 +v -5.629711 0.010002 -5.814293 +v -5.537421 0.010002 -5.814293 +v -5.537421 0.010002 -5.906583 +v -5.629711 0.010002 -5.906583 +v -5.629711 0.010002 -5.445131 +v -5.537421 0.010002 -5.445131 +v -5.537421 0.010002 -5.537421 +v -5.629711 0.010002 -5.537421 +v -5.260550 0.010002 -5.445131 +v -5.168260 0.010002 -5.445131 +v -5.168260 0.010002 -5.537421 +v -5.260550 0.010002 -5.537421 +v -4.891389 0.010001 -3.599324 +v -4.799098 0.010001 -3.599324 +v -4.799098 0.010002 -3.691614 +v -4.891389 0.010002 -3.691614 +v -4.891389 0.010001 -3.230163 +v -4.799098 0.010001 -3.230163 +v -4.799098 0.010001 -3.322453 +v -4.891389 0.010001 -3.322453 +v -4.522227 0.010001 -3.230163 +v -4.429937 0.010001 -3.230163 +v -4.429937 0.010001 -3.322453 +v -4.522227 0.010001 -3.322453 +v -5.629711 0.010001 -3.599324 +v -5.537421 0.010001 -3.599324 +v -5.537421 0.010002 -3.691614 +v -5.629711 0.010002 -3.691614 +v -5.629711 0.010001 -3.230163 +v -5.537421 0.010001 -3.230163 +v -5.537421 0.010001 -3.322453 +v -5.629711 0.010001 -3.322453 +v -5.260550 0.010001 -3.230163 +v -5.168260 0.010001 -3.230163 +v -5.168260 0.010001 -3.322453 +v -5.260550 0.010001 -3.322453 +v -5.629711 0.010002 -4.337647 +v -5.537421 0.010002 -4.337647 +v -5.537421 0.010002 -4.429937 +v -5.629711 0.010002 -4.429937 +v -5.629711 0.010002 -3.968485 +v -5.537421 0.010002 -3.968485 +v -5.537421 0.010002 -4.060776 +v -5.629711 0.010002 -4.060776 +v -5.260550 0.010002 -3.968485 +v -5.168260 0.010002 -3.968485 +v -5.168260 0.010002 -4.060776 +v -5.260550 0.010002 -4.060776 +v -3.414743 0.010001 -3.599324 +v -3.322453 0.010001 -3.599324 +v -3.322453 0.010002 -3.691614 +v -3.414743 0.010002 -3.691614 +v -3.414743 0.010001 -3.230163 +v -3.322453 0.010001 -3.230163 +v -3.322453 0.010001 -3.322453 +v -3.414743 0.010001 -3.322453 +v -3.045582 0.010001 -3.230163 +v -2.953291 0.010001 -3.230163 +v -2.953291 0.010001 -3.322453 +v -3.045582 0.010001 -3.322453 +v -4.153066 0.010001 -3.599324 +v -4.060776 0.010001 -3.599324 +v -4.060776 0.010002 -3.691614 +v -4.153066 0.010002 -3.691614 +v -4.153066 0.010001 -3.230163 +v -4.060776 0.010001 -3.230163 +v -4.060776 0.010001 -3.322453 +v -4.153066 0.010001 -3.322453 +v -3.783905 0.010001 -3.230163 +v -3.691614 0.010001 -3.230163 +v -3.691614 0.010001 -3.322453 +v -3.783905 0.010001 -3.322453 +v -4.153066 0.010002 -4.337647 +v -4.060776 0.010002 -4.337647 +v -4.060776 0.010002 -4.429937 +v -4.153066 0.010002 -4.429937 +v -4.153066 0.010002 -3.968485 +v -4.060776 0.010002 -3.968485 +v -4.060776 0.010002 -4.060776 +v -4.153066 0.010002 -4.060776 +v -3.783905 0.010002 -3.968485 +v -3.691614 0.010002 -3.968485 +v -3.691614 0.010002 -4.060776 +v -3.783905 0.010002 -4.060776 +v -1.938097 0.009998 3.783905 +v -1.845807 0.009998 3.783905 +v -1.845807 0.009998 3.691614 +v -1.938097 0.009998 3.691614 +v -1.938097 0.009998 4.153066 +v -1.845807 0.009998 4.153066 +v -1.845807 0.009998 4.060776 +v -1.938097 0.009998 4.060776 +v -1.568936 0.009998 4.153066 +v -1.476646 0.009998 4.153066 +v -1.476646 0.009998 4.060776 +v -1.568936 0.009998 4.060776 +v -2.676420 0.009998 3.783905 +v -2.584130 0.009998 3.783905 +v -2.584130 0.009998 3.691614 +v -2.676420 0.009998 3.691614 +v -2.676420 0.009998 4.153066 +v -2.584130 0.009998 4.153066 +v -2.584130 0.009998 4.060776 +v -2.676420 0.009998 4.060776 +v -2.307259 0.009998 4.153066 +v -2.214968 0.009998 4.153066 +v -2.214968 0.009998 4.060776 +v -2.307259 0.009998 4.060776 +v -2.676420 0.009999 3.045582 +v -2.584130 0.009999 3.045582 +v -2.584130 0.009999 2.953291 +v -2.676420 0.009999 2.953291 +v -2.676420 0.009999 3.414743 +v -2.584130 0.009999 3.414743 +v -2.584130 0.009999 3.322453 +v -2.676420 0.009999 3.322453 +v -2.307259 0.009999 3.414743 +v -2.214968 0.009999 3.414743 +v -2.214968 0.009999 3.322453 +v -2.307259 0.009999 3.322453 +v -1.938097 0.009998 5.260550 +v -1.845807 0.009998 5.260550 +v -1.845807 0.009998 5.168260 +v -1.938097 0.009998 5.168260 +v -1.938097 0.009998 5.629711 +v -1.845807 0.009998 5.629711 +v -1.845807 0.009998 5.537421 +v -1.938097 0.009998 5.537421 +v -1.568936 0.009998 5.629711 +v -1.476646 0.009998 5.629711 +v -1.476646 0.009998 5.537421 +v -1.568936 0.009998 5.537421 +v -2.676420 0.009998 5.260550 +v -2.584130 0.009998 5.260550 +v -2.584130 0.009998 5.168260 +v -2.676420 0.009998 5.168260 +v -2.676420 0.009998 5.629711 +v -2.584130 0.009998 5.629711 +v -2.584130 0.009998 5.537421 +v -2.676420 0.009998 5.537421 +v -2.307259 0.009998 5.629711 +v -2.214968 0.009998 5.629711 +v -2.214968 0.009998 5.537421 +v -2.307259 0.009998 5.537421 +v -2.676420 0.009998 4.522227 +v -2.584130 0.009998 4.522227 +v -2.584130 0.009998 4.429937 +v -2.676420 0.009998 4.429937 +v -2.676420 0.009998 4.891389 +v -2.584130 0.009998 4.891389 +v -2.584130 0.009998 4.799098 +v -2.676420 0.009998 4.799098 +v -2.307259 0.009998 4.891389 +v -2.214968 0.009998 4.891389 +v -2.214968 0.009998 4.799098 +v -2.307259 0.009998 4.799098 +v -0.461452 0.009998 5.260550 +v -0.369161 0.009998 5.260550 +v -0.369161 0.009998 5.168260 +v -0.461452 0.009998 5.168260 +v -0.461452 0.009998 5.629711 +v -0.369161 0.009998 5.629711 +v -0.369161 0.009998 5.537421 +v -0.461452 0.009998 5.537421 +v -0.092290 0.009998 5.629711 +v 0.000000 0.009998 5.629711 +v 0.000000 0.009998 5.537421 +v -0.092290 0.009998 5.537421 +v -1.199775 0.009998 5.260550 +v -1.107484 0.009998 5.260550 +v -1.107484 0.009998 5.168260 +v -1.199775 0.009998 5.168260 +v -1.199775 0.009998 5.629711 +v -1.107484 0.009998 5.629711 +v -1.107484 0.009998 5.537421 +v -1.199775 0.009998 5.537421 +v -0.830613 0.009998 5.629711 +v -0.738323 0.009998 5.629711 +v -0.738323 0.009998 5.537421 +v -0.830613 0.009998 5.537421 +v -1.199775 0.009998 4.522227 +v -1.107484 0.009998 4.522227 +v -1.107484 0.009998 4.429937 +v -1.199775 0.009998 4.429937 +v -1.199775 0.009998 4.891389 +v -1.107484 0.009998 4.891389 +v -1.107484 0.009998 4.799098 +v -1.199775 0.009998 4.799098 +v -0.830613 0.009998 4.891389 +v -0.738323 0.009998 4.891389 +v -0.738323 0.009998 4.799098 +v -0.830613 0.009998 4.799098 +v -4.891389 0.009998 3.783905 +v -4.799098 0.009998 3.783905 +v -4.799098 0.009998 3.691614 +v -4.891389 0.009998 3.691614 +v -4.891389 0.009998 4.153066 +v -4.799098 0.009998 4.153066 +v -4.799098 0.009998 4.060776 +v -4.891389 0.009998 4.060776 +v -4.522227 0.009998 4.153066 +v -4.429937 0.009998 4.153066 +v -4.429937 0.009998 4.060776 +v -4.522227 0.009998 4.060776 +v -5.629711 0.009998 3.783905 +v -5.537421 0.009998 3.783905 +v -5.537421 0.009998 3.691614 +v -5.629711 0.009998 3.691614 +v -5.629711 0.009998 4.153066 +v -5.537421 0.009998 4.153066 +v -5.537421 0.009998 4.060776 +v -5.629711 0.009998 4.060776 +v -5.260550 0.009998 4.153066 +v -5.168260 0.009998 4.153066 +v -5.168260 0.009998 4.060776 +v -5.260550 0.009998 4.060776 +v -5.629711 0.009999 3.045582 +v -5.537421 0.009999 3.045582 +v -5.537421 0.009999 2.953291 +v -5.629711 0.009999 2.953291 +v -5.629711 0.009999 3.414743 +v -5.537421 0.009999 3.414743 +v -5.537421 0.009999 3.322453 +v -5.629711 0.009999 3.322453 +v -5.260550 0.009999 3.414743 +v -5.168260 0.009999 3.414743 +v -5.168260 0.009999 3.322453 +v -5.260550 0.009999 3.322453 +v -4.891389 0.009998 5.260550 +v -4.799098 0.009998 5.260550 +v -4.799098 0.009998 5.168260 +v -4.891389 0.009998 5.168260 +v -4.891389 0.009998 5.629711 +v -4.799098 0.009998 5.629711 +v -4.799098 0.009998 5.537421 +v -4.891389 0.009998 5.537421 +v -4.522227 0.009998 5.629711 +v -4.429937 0.009998 5.629711 +v -4.429937 0.009998 5.537421 +v -4.522227 0.009998 5.537421 +v -5.629711 0.009998 5.260550 +v -5.537421 0.009998 5.260550 +v -5.537421 0.009998 5.168260 +v -5.629711 0.009998 5.168260 +v -5.629711 0.009998 5.629711 +v -5.537421 0.009998 5.629711 +v -5.537421 0.009998 5.537421 +v -5.629711 0.009998 5.537421 +v -5.260550 0.009998 5.629711 +v -5.168260 0.009998 5.629711 +v -5.168260 0.009998 5.537421 +v -5.260550 0.009998 5.537421 +v -5.629711 0.009998 4.522227 +v -5.537421 0.009998 4.522227 +v -5.537421 0.009998 4.429937 +v -5.629711 0.009998 4.429937 +v -5.629711 0.009998 4.891389 +v -5.537421 0.009998 4.891389 +v -5.537421 0.009998 4.799098 +v -5.629711 0.009998 4.799098 +v -5.260550 0.009998 4.891389 +v -5.168260 0.009998 4.891389 +v -5.168260 0.009998 4.799098 +v -5.260550 0.009998 4.799098 +v -3.414743 0.009998 5.260550 +v -3.322453 0.009998 5.260550 +v -3.322453 0.009998 5.168260 +v -3.414743 0.009998 5.168260 +v -3.414743 0.009998 5.629711 +v -3.322453 0.009998 5.629711 +v -3.322453 0.009998 5.537421 +v -3.414743 0.009998 5.537421 +v -3.045582 0.009998 5.629711 +v -2.953291 0.009998 5.629711 +v -2.953291 0.009998 5.537421 +v -3.045582 0.009998 5.537421 +v -4.153066 0.009998 5.260550 +v -4.060776 0.009998 5.260550 +v -4.060776 0.009998 5.168260 +v -4.153066 0.009998 5.168260 +v -4.153066 0.009998 5.629711 +v -4.060776 0.009998 5.629711 +v -4.060776 0.009998 5.537421 +v -4.153066 0.009998 5.537421 +v -3.783905 0.009998 5.629711 +v -3.691614 0.009998 5.629711 +v -3.691614 0.009998 5.537421 +v -3.783905 0.009998 5.537421 +v -4.153066 0.009998 4.522227 +v -4.060776 0.009998 4.522227 +v -4.060776 0.009998 4.429937 +v -4.153066 0.009998 4.429937 +v -4.153066 0.009998 4.891389 +v -4.060776 0.009998 4.891389 +v -4.060776 0.009998 4.799098 +v -4.153066 0.009998 4.799098 +v -3.783905 0.009998 4.891389 +v -3.691614 0.009998 4.891389 +v -3.691614 0.009998 4.799098 +v -3.783905 0.009998 4.799098 +v -4.891389 0.010000 0.830613 +v -4.799098 0.010000 0.830613 +v -4.799098 0.010000 0.738323 +v -4.891389 0.010000 0.738323 +v -4.891389 0.010000 1.199775 +v -4.799098 0.010000 1.199775 +v -4.799098 0.010000 1.107484 +v -4.891389 0.010000 1.107484 +v -4.522227 0.010000 1.199775 +v -4.429937 0.010000 1.199775 +v -4.429937 0.010000 1.107484 +v -4.522227 0.010000 1.107484 +v -5.629711 0.010000 0.830613 +v -5.537421 0.010000 0.830613 +v -5.537421 0.010000 0.738323 +v -5.629711 0.010000 0.738323 +v -5.629711 0.010000 1.199775 +v -5.537421 0.010000 1.199775 +v -5.537421 0.010000 1.107484 +v -5.629711 0.010000 1.107484 +v -5.260550 0.010000 1.199775 +v -5.168260 0.010000 1.199775 +v -5.168260 0.010000 1.107484 +v -5.260550 0.010000 1.107484 +v -5.629711 0.010000 0.092290 +v -5.537421 0.010000 0.092290 +v -5.537421 0.010000 -0.000000 +v -5.629711 0.010000 -0.000000 +v -5.629711 0.010000 0.461452 +v -5.537421 0.010000 0.461452 +v -5.537421 0.010000 0.369161 +v -5.629711 0.010000 0.369161 +v -5.260550 0.010000 0.461452 +v -5.168260 0.010000 0.461452 +v -5.168260 0.010000 0.369161 +v -5.260550 0.010000 0.369161 +v -4.891389 0.009999 2.307259 +v -4.799098 0.009999 2.307259 +v -4.799098 0.009999 2.214968 +v -4.891389 0.009999 2.214968 +v -4.891389 0.009999 2.676420 +v -4.799098 0.009999 2.676420 +v -4.799098 0.009999 2.584130 +v -4.891389 0.009999 2.584130 +v -4.522227 0.009999 2.676420 +v -4.429937 0.009999 2.676420 +v -4.429937 0.009999 2.584130 +v -4.522227 0.009999 2.584130 +v -5.629711 0.009999 2.307259 +v -5.537421 0.009999 2.307259 +v -5.537421 0.009999 2.214968 +v -5.629711 0.009999 2.214968 +v -5.629711 0.009999 2.676420 +v -5.537421 0.009999 2.676420 +v -5.537421 0.009999 2.584130 +v -5.629711 0.009999 2.584130 +v -5.260550 0.009999 2.676420 +v -5.168260 0.009999 2.676420 +v -5.168260 0.009999 2.584130 +v -5.260550 0.009999 2.584130 +v -5.629711 0.009999 1.568936 +v -5.537421 0.009999 1.568936 +v -5.537421 0.009999 1.476646 +v -5.629711 0.009999 1.476646 +v -5.629711 0.009999 1.938097 +v -5.537421 0.009999 1.938097 +v -5.537421 0.009999 1.845807 +v -5.629711 0.009999 1.845807 +v -5.260550 0.009999 1.938097 +v -5.168260 0.009999 1.938097 +v -5.168260 0.009999 1.845807 +v -5.260550 0.009999 1.845807 +v -3.414743 0.009999 2.307259 +v -3.322453 0.009999 2.307259 +v -3.322453 0.009999 2.214968 +v -3.414743 0.009999 2.214968 +v -3.414743 0.009999 2.676420 +v -3.322453 0.009999 2.676420 +v -3.322453 0.009999 2.584130 +v -3.414743 0.009999 2.584130 +v -3.045582 0.009999 2.676420 +v -2.953291 0.009999 2.676420 +v -2.953291 0.009999 2.584130 +v -3.045582 0.009999 2.584130 +v -4.153066 0.009999 2.307259 +v -4.060776 0.009999 2.307259 +v -4.060776 0.009999 2.214968 +v -4.153066 0.009999 2.214968 +v -4.153066 0.009999 2.676420 +v -4.060776 0.009999 2.676420 +v -4.060776 0.009999 2.584130 +v -4.153066 0.009999 2.584130 +v -3.783905 0.009999 2.676420 +v -3.691614 0.009999 2.676420 +v -3.691614 0.009999 2.584130 +v -3.783905 0.009999 2.584130 +v -4.153066 0.009999 1.568936 +v -4.060776 0.009999 1.568936 +v -4.060776 0.009999 1.476646 +v -4.153066 0.009999 1.476646 +v -4.153066 0.009999 1.938097 +v -4.060776 0.009999 1.938097 +v -4.060776 0.009999 1.845807 +v -4.153066 0.009999 1.845807 +v -3.783905 0.009999 1.938097 +v -3.691614 0.009999 1.938097 +v -3.691614 0.009999 1.845807 +v -3.783905 0.009999 1.845807 +v 3.968485 0.009998 3.783905 +v 4.060776 0.009998 3.783905 +v 4.060776 0.009998 3.691614 +v 3.968485 0.009998 3.691614 +v 3.968485 0.009998 4.153066 +v 4.060776 0.009998 4.153066 +v 4.060776 0.009998 4.060776 +v 3.968485 0.009998 4.060776 +v 4.337647 0.009998 4.153066 +v 4.429937 0.009998 4.153066 +v 4.429937 0.009998 4.060776 +v 4.337647 0.009998 4.060776 +v 3.230163 0.009998 3.783905 +v 3.322453 0.009998 3.783905 +v 3.322453 0.009998 3.691614 +v 3.230163 0.009998 3.691614 +v 3.230163 0.009998 4.153066 +v 3.322453 0.009998 4.153066 +v 3.322453 0.009998 4.060776 +v 3.230163 0.009998 4.060776 +v 3.599324 0.009998 4.153066 +v 3.691614 0.009998 4.153066 +v 3.691614 0.009998 4.060776 +v 3.599324 0.009998 4.060776 +v 3.230163 0.009999 3.045582 +v 3.322453 0.009999 3.045582 +v 3.322453 0.009999 2.953291 +v 3.230163 0.009999 2.953291 +v 3.230163 0.009999 3.414743 +v 3.322453 0.009999 3.414743 +v 3.322453 0.009999 3.322453 +v 3.230163 0.009999 3.322453 +v 3.599324 0.009999 3.414743 +v 3.691614 0.009999 3.414743 +v 3.691614 0.009999 3.322453 +v 3.599324 0.009999 3.322453 +v 3.968485 0.009998 5.260550 +v 4.060776 0.009998 5.260550 +v 4.060776 0.009998 5.168260 +v 3.968485 0.009998 5.168260 +v 3.968485 0.009998 5.629711 +v 4.060776 0.009998 5.629711 +v 4.060776 0.009998 5.537421 +v 3.968485 0.009998 5.537421 +v 4.337647 0.009998 5.629711 +v 4.429937 0.009998 5.629711 +v 4.429937 0.009998 5.537421 +v 4.337647 0.009998 5.537421 +v 3.230163 0.009998 5.260550 +v 3.322453 0.009998 5.260550 +v 3.322453 0.009998 5.168260 +v 3.230163 0.009998 5.168260 +v 3.230163 0.009998 5.629711 +v 3.322453 0.009998 5.629711 +v 3.322453 0.009998 5.537421 +v 3.230163 0.009998 5.537421 +v 3.599324 0.009998 5.629711 +v 3.691614 0.009998 5.629711 +v 3.691614 0.009998 5.537421 +v 3.599324 0.009998 5.537421 +v 3.230163 0.009998 4.522227 +v 3.322453 0.009998 4.522227 +v 3.322453 0.009998 4.429937 +v 3.230163 0.009998 4.429937 +v 3.230163 0.009998 4.891389 +v 3.322453 0.009998 4.891389 +v 3.322453 0.009998 4.799098 +v 3.230163 0.009998 4.799098 +v 3.599324 0.009998 4.891389 +v 3.691614 0.009998 4.891389 +v 3.691614 0.009998 4.799098 +v 3.599324 0.009998 4.799098 +v 5.445131 0.009998 5.260550 +v 5.537421 0.009998 5.260550 +v 5.537421 0.009998 5.168260 +v 5.445131 0.009998 5.168260 +v 5.445131 0.009998 5.629711 +v 5.537421 0.009998 5.629711 +v 5.537421 0.009998 5.537421 +v 5.445131 0.009998 5.537421 +v 5.814293 0.009998 5.629711 +v 5.906583 0.009998 5.629711 +v 5.906583 0.009998 5.537421 +v 5.814293 0.009998 5.537421 +v 4.706808 0.009998 5.260550 +v 4.799098 0.009998 5.260550 +v 4.799098 0.009998 5.168260 +v 4.706808 0.009998 5.168260 +v 4.706808 0.009998 5.629711 +v 4.799098 0.009998 5.629711 +v 4.799098 0.009998 5.537421 +v 4.706808 0.009998 5.537421 +v 5.075970 0.009998 5.629711 +v 5.168260 0.009998 5.629711 +v 5.168260 0.009998 5.537421 +v 5.075970 0.009998 5.537421 +v 4.706808 0.009998 4.522227 +v 4.799098 0.009998 4.522227 +v 4.799098 0.009998 4.429937 +v 4.706808 0.009998 4.429937 +v 4.706808 0.009998 4.891389 +v 4.799098 0.009998 4.891389 +v 4.799098 0.009998 4.799098 +v 4.706808 0.009998 4.799098 +v 5.075970 0.009998 4.891389 +v 5.168260 0.009998 4.891389 +v 5.168260 0.009998 4.799098 +v 5.075970 0.009998 4.799098 +v 1.015194 0.009998 3.783905 +v 1.107484 0.009998 3.783905 +v 1.107484 0.009998 3.691614 +v 1.015194 0.009998 3.691614 +v 1.015194 0.009998 4.153066 +v 1.107484 0.009998 4.153066 +v 1.107484 0.009998 4.060776 +v 1.015194 0.009998 4.060776 +v 1.384355 0.009998 4.153066 +v 1.476646 0.009998 4.153066 +v 1.476646 0.009998 4.060776 +v 1.384355 0.009998 4.060776 +v 0.276871 0.009998 3.783905 +v 0.369161 0.009998 3.783905 +v 0.369161 0.009998 3.691614 +v 0.276871 0.009998 3.691614 +v 0.276871 0.009998 4.153066 +v 0.369161 0.009998 4.153066 +v 0.369161 0.009998 4.060776 +v 0.276871 0.009998 4.060776 +v 0.646033 0.009998 4.153066 +v 0.738323 0.009998 4.153066 +v 0.738323 0.009998 4.060776 +v 0.646033 0.009998 4.060776 +v 0.276871 0.009999 3.045582 +v 0.369161 0.009999 3.045582 +v 0.369161 0.009999 2.953291 +v 0.276871 0.009999 2.953291 +v 0.276871 0.009999 3.414743 +v 0.369161 0.009999 3.414743 +v 0.369161 0.009999 3.322453 +v 0.276871 0.009999 3.322453 +v 0.646033 0.009999 3.414743 +v 0.738323 0.009999 3.414743 +v 0.738323 0.009999 3.322453 +v 0.646033 0.009999 3.322453 +v 1.015194 0.009998 5.260550 +v 1.107484 0.009998 5.260550 +v 1.107484 0.009998 5.168260 +v 1.015194 0.009998 5.168260 +v 1.015194 0.009998 5.629711 +v 1.107484 0.009998 5.629711 +v 1.107484 0.009998 5.537421 +v 1.015194 0.009998 5.537421 +v 1.384355 0.009998 5.629711 +v 1.476646 0.009998 5.629711 +v 1.476646 0.009998 5.537421 +v 1.384355 0.009998 5.537421 +v 0.276871 0.009998 5.260550 +v 0.369161 0.009998 5.260550 +v 0.369161 0.009998 5.168260 +v 0.276871 0.009998 5.168260 +v 0.276871 0.009998 5.629711 +v 0.369161 0.009998 5.629711 +v 0.369161 0.009998 5.537421 +v 0.276871 0.009998 5.537421 +v 0.646033 0.009998 5.629711 +v 0.738323 0.009998 5.629711 +v 0.738323 0.009998 5.537421 +v 0.646033 0.009998 5.537421 +v 0.276871 0.009998 4.522227 +v 0.369161 0.009998 4.522227 +v 0.369161 0.009998 4.429937 +v 0.276871 0.009998 4.429937 +v 0.276871 0.009998 4.891389 +v 0.369161 0.009998 4.891389 +v 0.369161 0.009998 4.799098 +v 0.276871 0.009998 4.799098 +v 0.646033 0.009998 4.891389 +v 0.738323 0.009998 4.891389 +v 0.738323 0.009998 4.799098 +v 0.646033 0.009998 4.799098 +v 2.491840 0.009998 5.260550 +v 2.584130 0.009998 5.260550 +v 2.584130 0.009998 5.168260 +v 2.491840 0.009998 5.168260 +v 2.491840 0.009998 5.629711 +v 2.584130 0.009998 5.629711 +v 2.584130 0.009998 5.537421 +v 2.491840 0.009998 5.537421 +v 2.861001 0.009998 5.629711 +v 2.953291 0.009998 5.629711 +v 2.953291 0.009998 5.537421 +v 2.861001 0.009998 5.537421 +v 1.753517 0.009998 5.260550 +v 1.845807 0.009998 5.260550 +v 1.845807 0.009998 5.168260 +v 1.753517 0.009998 5.168260 +v 1.753517 0.009998 5.629711 +v 1.845807 0.009998 5.629711 +v 1.845807 0.009998 5.537421 +v 1.753517 0.009998 5.537421 +v 2.122678 0.009998 5.629711 +v 2.214968 0.009998 5.629711 +v 2.214968 0.009998 5.537421 +v 2.122678 0.009998 5.537421 +v 1.753517 0.009998 4.522227 +v 1.845807 0.009998 4.522227 +v 1.845807 0.009998 4.429937 +v 1.753517 0.009998 4.429937 +v 1.753517 0.009998 4.891389 +v 1.845807 0.009998 4.891389 +v 1.845807 0.009998 4.799098 +v 1.753517 0.009998 4.799098 +v 2.122678 0.009998 4.891389 +v 2.214968 0.009998 4.891389 +v 2.214968 0.009998 4.799098 +v 2.122678 0.009998 4.799098 +v 1.015194 0.010000 0.830613 +v 1.107484 0.010000 0.830613 +v 1.107484 0.010000 0.738323 +v 1.015194 0.010000 0.738323 +v 1.015194 0.010000 1.199775 +v 1.107484 0.010000 1.199775 +v 1.107484 0.010000 1.107484 +v 1.015194 0.010000 1.107484 +v 1.384355 0.010000 1.199775 +v 1.476646 0.010000 1.199775 +v 1.476646 0.010000 1.107484 +v 1.384355 0.010000 1.107484 +v 0.276871 0.010000 0.830613 +v 0.369161 0.010000 0.830613 +v 0.369161 0.010000 0.738323 +v 0.276871 0.010000 0.738323 +v 0.276871 0.010000 1.199775 +v 0.369161 0.010000 1.199775 +v 0.369161 0.010000 1.107484 +v 0.276871 0.010000 1.107484 +v 0.646033 0.010000 1.199775 +v 0.738323 0.010000 1.199775 +v 0.738323 0.010000 1.107484 +v 0.646033 0.010000 1.107484 +v 0.276871 0.010000 0.092290 +v 0.369161 0.010000 0.092290 +v 0.369161 0.010000 -0.000000 +v 0.276871 0.010000 -0.000000 +v 0.276871 0.010000 0.461452 +v 0.369161 0.010000 0.461452 +v 0.369161 0.010000 0.369161 +v 0.276871 0.010000 0.369161 +v 0.646033 0.010000 0.461452 +v 0.738323 0.010000 0.461452 +v 0.738323 0.010000 0.369161 +v 0.646033 0.010000 0.369161 +v 1.015194 0.009999 2.307259 +v 1.107484 0.009999 2.307259 +v 1.107484 0.009999 2.214968 +v 1.015194 0.009999 2.214968 +v 1.015194 0.009999 2.676420 +v 1.107484 0.009999 2.676420 +v 1.107484 0.009999 2.584130 +v 1.015194 0.009999 2.584130 +v 1.384355 0.009999 2.676420 +v 1.476646 0.009999 2.676420 +v 1.476646 0.009999 2.584130 +v 1.384355 0.009999 2.584130 +v 0.276871 0.009999 2.307259 +v 0.369161 0.009999 2.307259 +v 0.369161 0.009999 2.214968 +v 0.276871 0.009999 2.214968 +v 0.276871 0.009999 2.676420 +v 0.369161 0.009999 2.676420 +v 0.369161 0.009999 2.584130 +v 0.276871 0.009999 2.584130 +v 0.646033 0.009999 2.676420 +v 0.738323 0.009999 2.676420 +v 0.738323 0.009999 2.584130 +v 0.646033 0.009999 2.584130 +v 0.276871 0.009999 1.568936 +v 0.369161 0.009999 1.568936 +v 0.369161 0.009999 1.476646 +v 0.276871 0.009999 1.476646 +v 0.276871 0.009999 1.938097 +v 0.369161 0.009999 1.938097 +v 0.369161 0.009999 1.845807 +v 0.276871 0.009999 1.845807 +v 0.646033 0.009999 1.938097 +v 0.738323 0.009999 1.938097 +v 0.738323 0.009999 1.845807 +v 0.646033 0.009999 1.845807 +v 2.491840 0.009999 2.307259 +v 2.584130 0.009999 2.307259 +v 2.584130 0.009999 2.214968 +v 2.491840 0.009999 2.214968 +v 2.491840 0.009999 2.676420 +v 2.584130 0.009999 2.676420 +v 2.584130 0.009999 2.584130 +v 2.491840 0.009999 2.584130 +v 2.861001 0.009999 2.676420 +v 2.953291 0.009999 2.676420 +v 2.953291 0.009999 2.584130 +v 2.861001 0.009999 2.584130 +v 1.753517 0.009999 2.307259 +v 1.845807 0.009999 2.307259 +v 1.845807 0.009999 2.214968 +v 1.753517 0.009999 2.214968 +v 1.753517 0.009999 2.676420 +v 1.845807 0.009999 2.676420 +v 1.845807 0.009999 2.584130 +v 1.753517 0.009999 2.584130 +v 2.122678 0.009999 2.676420 +v 2.214968 0.009999 2.676420 +v 2.214968 0.009999 2.584130 +v 2.122678 0.009999 2.584130 +v 1.753517 0.009999 1.568936 +v 1.845807 0.009999 1.568936 +v 1.845807 0.009999 1.476646 +v 1.753517 0.009999 1.476646 +v 1.753517 0.009999 1.938097 +v 1.845807 0.009999 1.938097 +v 1.845807 0.009999 1.845807 +v 1.753517 0.009999 1.845807 +v 2.122678 0.009999 1.938097 +v 2.214968 0.009999 1.938097 +v 2.214968 0.009999 1.845807 +v 2.122678 0.009999 1.845807 +v 3.968485 0.010000 0.830613 +v 4.060776 0.010000 0.830613 +v 4.060776 0.010000 0.738323 +v 3.968485 0.010000 0.738323 +v 3.968485 0.010000 1.199775 +v 4.060776 0.010000 1.199775 +v 4.060776 0.010000 1.107484 +v 3.968485 0.010000 1.107484 +v 4.337647 0.010000 1.199775 +v 4.429937 0.010000 1.199775 +v 4.429937 0.010000 1.107484 +v 4.337647 0.010000 1.107484 +v 3.230163 0.010000 0.830613 +v 3.322453 0.010000 0.830613 +v 3.322453 0.010000 0.738323 +v 3.230163 0.010000 0.738323 +v 3.230163 0.010000 1.199775 +v 3.322453 0.010000 1.199775 +v 3.322453 0.010000 1.107484 +v 3.230163 0.010000 1.107484 +v 3.599324 0.010000 1.199775 +v 3.691614 0.010000 1.199775 +v 3.691614 0.010000 1.107484 +v 3.599324 0.010000 1.107484 +v 3.230163 0.010000 0.092290 +v 3.322453 0.010000 0.092290 +v 3.322453 0.010000 -0.000000 +v 3.230163 0.010000 -0.000000 +v 3.230163 0.010000 0.461452 +v 3.322453 0.010000 0.461452 +v 3.322453 0.010000 0.369161 +v 3.230163 0.010000 0.369161 +v 3.599324 0.010000 0.461452 +v 3.691614 0.010000 0.461452 +v 3.691614 0.010000 0.369161 +v 3.599324 0.010000 0.369161 +v 3.968485 0.009999 2.307259 +v 4.060776 0.009999 2.307259 +v 4.060776 0.009999 2.214968 +v 3.968485 0.009999 2.214968 +v 3.968485 0.009999 2.676420 +v 4.060776 0.009999 2.676420 +v 4.060776 0.009999 2.584130 +v 3.968485 0.009999 2.584130 +v 4.337647 0.009999 2.676420 +v 4.429937 0.009999 2.676420 +v 4.429937 0.009999 2.584130 +v 4.337647 0.009999 2.584130 +v 3.230163 0.009999 2.307259 +v 3.322453 0.009999 2.307259 +v 3.322453 0.009999 2.214968 +v 3.230163 0.009999 2.214968 +v 3.230163 0.009999 2.676420 +v 3.322453 0.009999 2.676420 +v 3.322453 0.009999 2.584130 +v 3.230163 0.009999 2.584130 +v 3.599324 0.009999 2.676420 +v 3.691614 0.009999 2.676420 +v 3.691614 0.009999 2.584130 +v 3.599324 0.009999 2.584130 +v 3.230163 0.009999 1.568936 +v 3.322453 0.009999 1.568936 +v 3.322453 0.009999 1.476646 +v 3.230163 0.009999 1.476646 +v 3.230163 0.009999 1.938097 +v 3.322453 0.009999 1.938097 +v 3.322453 0.009999 1.845807 +v 3.230163 0.009999 1.845807 +v 3.599324 0.009999 1.938097 +v 3.691614 0.009999 1.938097 +v 3.691614 0.009999 1.845807 +v 3.599324 0.009999 1.845807 +v 5.445131 0.009999 2.307259 +v 5.537421 0.009999 2.307259 +v 5.537421 0.009999 2.214968 +v 5.445131 0.009999 2.214968 +v 5.445131 0.009999 2.676420 +v 5.537421 0.009999 2.676420 +v 5.537421 0.009999 2.584130 +v 5.445131 0.009999 2.584130 +v 5.814293 0.009999 2.676420 +v 5.906583 0.009999 2.676420 +v 5.906583 0.009999 2.584130 +v 5.814293 0.009999 2.584130 +v 4.706808 0.009999 2.307259 +v 4.799098 0.009999 2.307259 +v 4.799098 0.009999 2.214968 +v 4.706808 0.009999 2.214968 +v 4.706808 0.009999 2.676420 +v 4.799098 0.009999 2.676420 +v 4.799098 0.009999 2.584130 +v 4.706808 0.009999 2.584130 +v 5.075970 0.009999 2.676420 +v 5.168260 0.009999 2.676420 +v 5.168260 0.009999 2.584130 +v 5.075970 0.009999 2.584130 +v 4.706808 0.009999 1.568936 +v 4.799098 0.009999 1.568936 +v 4.799098 0.009999 1.476646 +v 4.706808 0.009999 1.476646 +v 4.706808 0.009999 1.938097 +v 4.799098 0.009999 1.938097 +v 4.799098 0.009999 1.845807 +v 4.706808 0.009999 1.845807 +v 5.075970 0.009999 1.938097 +v 5.168260 0.009999 1.938097 +v 5.168260 0.009999 1.845807 +v 5.075970 0.009999 1.845807 +v -1.938097 0.010000 0.830613 +v -1.845807 0.010000 0.830613 +v -1.845807 0.010000 0.738323 +v -1.938097 0.010000 0.738323 +v -1.938097 0.010000 1.199775 +v -1.845807 0.010000 1.199775 +v -1.845807 0.010000 1.107484 +v -1.938097 0.010000 1.107484 +v -1.568936 0.010000 1.199775 +v -1.476646 0.010000 1.199775 +v -1.476646 0.010000 1.107484 +v -1.568936 0.010000 1.107484 +v -2.676420 0.010000 0.830613 +v -2.584130 0.010000 0.830613 +v -2.584130 0.010000 0.738323 +v -2.676420 0.010000 0.738323 +v -2.676420 0.010000 1.199775 +v -2.584130 0.010000 1.199775 +v -2.584130 0.010000 1.107484 +v -2.676420 0.010000 1.107484 +v -2.307259 0.010000 1.199775 +v -2.214968 0.010000 1.199775 +v -2.214968 0.010000 1.107484 +v -2.307259 0.010000 1.107484 +v -2.676420 0.010000 0.092290 +v -2.584130 0.010000 0.092290 +v -2.584130 0.010000 -0.000000 +v -2.676420 0.010000 -0.000000 +v -2.676420 0.010000 0.461452 +v -2.584130 0.010000 0.461452 +v -2.584130 0.010000 0.369161 +v -2.676420 0.010000 0.369161 +v -2.307259 0.010000 0.461452 +v -2.214968 0.010000 0.461452 +v -2.214968 0.010000 0.369161 +v -2.307259 0.010000 0.369161 +v -1.938097 0.009999 2.307259 +v -1.845807 0.009999 2.307259 +v -1.845807 0.009999 2.214968 +v -1.938097 0.009999 2.214968 +v -1.938097 0.009999 2.676420 +v -1.845807 0.009999 2.676420 +v -1.845807 0.009999 2.584130 +v -1.938097 0.009999 2.584130 +v -1.568936 0.009999 2.676420 +v -1.476646 0.009999 2.676420 +v -1.476646 0.009999 2.584130 +v -1.568936 0.009999 2.584130 +v -2.676420 0.009999 2.307259 +v -2.584130 0.009999 2.307259 +v -2.584130 0.009999 2.214968 +v -2.676420 0.009999 2.214968 +v -2.676420 0.009999 2.676420 +v -2.584130 0.009999 2.676420 +v -2.584130 0.009999 2.584130 +v -2.676420 0.009999 2.584130 +v -2.307259 0.009999 2.676420 +v -2.214968 0.009999 2.676420 +v -2.214968 0.009999 2.584130 +v -2.307259 0.009999 2.584130 +v -2.676420 0.009999 1.568936 +v -2.584130 0.009999 1.568936 +v -2.584130 0.009999 1.476646 +v -2.676420 0.009999 1.476646 +v -2.676420 0.009999 1.938097 +v -2.584130 0.009999 1.938097 +v -2.584130 0.009999 1.845807 +v -2.676420 0.009999 1.845807 +v -2.307259 0.009999 1.938097 +v -2.214968 0.009999 1.938097 +v -2.214968 0.009999 1.845807 +v -2.307259 0.009999 1.845807 +v -0.461452 0.009999 2.307259 +v -0.369161 0.009999 2.307259 +v -0.369161 0.009999 2.214968 +v -0.461452 0.009999 2.214968 +v -0.461452 0.009999 2.676420 +v -0.369161 0.009999 2.676420 +v -0.369161 0.009999 2.584130 +v -0.461452 0.009999 2.584130 +v -0.092290 0.009999 2.676420 +v 0.000000 0.009999 2.676420 +v 0.000000 0.009999 2.584130 +v -0.092290 0.009999 2.584130 +v -1.199775 0.009999 2.307259 +v -1.107484 0.009999 2.307259 +v -1.107484 0.009999 2.214968 +v -1.199775 0.009999 2.214968 +v -1.199775 0.009999 2.676420 +v -1.107484 0.009999 2.676420 +v -1.107484 0.009999 2.584130 +v -1.199775 0.009999 2.584130 +v -0.830613 0.009999 2.676420 +v -0.738323 0.009999 2.676420 +v -0.738323 0.009999 2.584130 +v -0.830613 0.009999 2.584130 +v -1.199775 0.009999 1.568936 +v -1.107484 0.009999 1.568936 +v -1.107484 0.009999 1.476646 +v -1.199775 0.009999 1.476646 +v -1.199775 0.009999 1.938097 +v -1.107484 0.009999 1.938097 +v -1.107484 0.009999 1.845807 +v -1.199775 0.009999 1.845807 +v -0.830613 0.009999 1.938097 +v -0.738323 0.009999 1.938097 +v -0.738323 0.009999 1.845807 +v -0.830613 0.009999 1.845807 +v -1.938097 0.010002 -5.075970 +v -1.845807 0.010002 -5.075970 +v -1.845807 0.010002 -5.168260 +v -1.938097 0.010002 -5.168260 +v -1.938097 0.010002 -4.706808 +v -1.845807 0.010002 -4.706808 +v -1.845807 0.010002 -4.799098 +v -1.938097 0.010002 -4.799098 +v -1.568936 0.010002 -4.706808 +v -1.476646 0.010002 -4.706808 +v -1.476646 0.010002 -4.799098 +v -1.568936 0.010002 -4.799098 +v -2.676420 0.010002 -5.075970 +v -2.584130 0.010002 -5.075970 +v -2.584130 0.010002 -5.168260 +v -2.676420 0.010002 -5.168260 +v -2.676420 0.010002 -4.706808 +v -2.584130 0.010002 -4.706808 +v -2.584130 0.010002 -4.799098 +v -2.676420 0.010002 -4.799098 +v -2.307259 0.010002 -4.706808 +v -2.214968 0.010002 -4.706808 +v -2.214968 0.010002 -4.799098 +v -2.307259 0.010002 -4.799098 +v -2.676420 0.010002 -5.814293 +v -2.584130 0.010002 -5.814293 +v -2.584130 0.010002 -5.906583 +v -2.676420 0.010002 -5.906583 +v -2.676420 0.010002 -5.445131 +v -2.584130 0.010002 -5.445131 +v -2.584130 0.010002 -5.537421 +v -2.676420 0.010002 -5.537421 +v -2.307259 0.010002 -5.445131 +v -2.214968 0.010002 -5.445131 +v -2.214968 0.010002 -5.537421 +v -2.307259 0.010002 -5.537421 +v -1.938097 0.010001 -3.599324 +v -1.845807 0.010001 -3.599324 +v -1.845807 0.010002 -3.691614 +v -1.938097 0.010002 -3.691614 +v -1.938097 0.010001 -3.230163 +v -1.845807 0.010001 -3.230163 +v -1.845807 0.010001 -3.322453 +v -1.938097 0.010001 -3.322453 +v -1.568936 0.010001 -3.230163 +v -1.476646 0.010001 -3.230163 +v -1.476646 0.010001 -3.322453 +v -1.568936 0.010001 -3.322453 +v -2.676420 0.010001 -3.599324 +v -2.584130 0.010001 -3.599324 +v -2.584130 0.010002 -3.691614 +v -2.676420 0.010002 -3.691614 +v -2.676420 0.010001 -3.230163 +v -2.584130 0.010001 -3.230163 +v -2.584130 0.010001 -3.322453 +v -2.676420 0.010001 -3.322453 +v -2.307259 0.010001 -3.230163 +v -2.214968 0.010001 -3.230163 +v -2.214968 0.010001 -3.322453 +v -2.307259 0.010001 -3.322453 +v -2.676420 0.010002 -4.337647 +v -2.584130 0.010002 -4.337647 +v -2.584130 0.010002 -4.429937 +v -2.676420 0.010002 -4.429937 +v -2.676420 0.010002 -3.968485 +v -2.584130 0.010002 -3.968485 +v -2.584130 0.010002 -4.060776 +v -2.676420 0.010002 -4.060776 +v -2.307259 0.010002 -3.968485 +v -2.214968 0.010002 -3.968485 +v -2.214968 0.010002 -4.060776 +v -2.307259 0.010002 -4.060776 +v -0.461452 0.010001 -3.599324 +v -0.369161 0.010001 -3.599324 +v -0.369161 0.010002 -3.691614 +v -0.461452 0.010002 -3.691614 +v -0.461452 0.010001 -3.230163 +v -0.369161 0.010001 -3.230163 +v -0.369161 0.010001 -3.322453 +v -0.461452 0.010001 -3.322453 +v -0.092290 0.010001 -3.230163 +v 0.000000 0.010001 -3.230163 +v 0.000000 0.010001 -3.322453 +v -0.092290 0.010001 -3.322453 +v -1.199775 0.010001 -3.599324 +v -1.107484 0.010001 -3.599324 +v -1.107484 0.010002 -3.691614 +v -1.199775 0.010002 -3.691614 +v -1.199775 0.010001 -3.230163 +v -1.107484 0.010001 -3.230163 +v -1.107484 0.010001 -3.322453 +v -1.199775 0.010001 -3.322453 +v -0.830613 0.010001 -3.230163 +v -0.738323 0.010001 -3.230163 +v -0.738323 0.010001 -3.322453 +v -0.830613 0.010001 -3.322453 +v -1.199775 0.010002 -4.337647 +v -1.107484 0.010002 -4.337647 +v -1.107484 0.010002 -4.429937 +v -1.199775 0.010002 -4.429937 +v -1.199775 0.010002 -3.968485 +v -1.107484 0.010002 -3.968485 +v -1.107484 0.010002 -4.060776 +v -1.199775 0.010002 -4.060776 +v -0.830613 0.010002 -3.968485 +v -0.738323 0.010002 -3.968485 +v -0.738323 0.010002 -4.060776 +v -0.830613 0.010002 -4.060776 +v 3.968485 0.010002 -5.075970 +v 4.060776 0.010002 -5.075970 +v 4.060776 0.010002 -5.168260 +v 3.968485 0.010002 -5.168260 +v 3.968485 0.010002 -4.706808 +v 4.060776 0.010002 -4.706808 +v 4.060776 0.010002 -4.799098 +v 3.968485 0.010002 -4.799098 +v 4.337647 0.010002 -4.706808 +v 4.429937 0.010002 -4.706808 +v 4.429937 0.010002 -4.799098 +v 4.337647 0.010002 -4.799098 +v 3.230163 0.010002 -5.075970 +v 3.322453 0.010002 -5.075970 +v 3.322453 0.010002 -5.168260 +v 3.230163 0.010002 -5.168260 +v 3.230163 0.010002 -4.706808 +v 3.322453 0.010002 -4.706808 +v 3.322453 0.010002 -4.799098 +v 3.230163 0.010002 -4.799098 +v 3.599324 0.010002 -4.706808 +v 3.691614 0.010002 -4.706808 +v 3.691614 0.010002 -4.799098 +v 3.599324 0.010002 -4.799098 +v 3.230163 0.010002 -5.814293 +v 3.322453 0.010002 -5.814293 +v 3.322453 0.010002 -5.906583 +v 3.230163 0.010002 -5.906583 +v 3.230163 0.010002 -5.445131 +v 3.322453 0.010002 -5.445131 +v 3.322453 0.010002 -5.537421 +v 3.230163 0.010002 -5.537421 +v 3.599324 0.010002 -5.445131 +v 3.691614 0.010002 -5.445131 +v 3.691614 0.010002 -5.537421 +v 3.599324 0.010002 -5.537421 +v 3.968485 0.010001 -3.599324 +v 4.060776 0.010001 -3.599324 +v 4.060776 0.010002 -3.691614 +v 3.968485 0.010002 -3.691614 +v 3.968485 0.010001 -3.230163 +v 4.060776 0.010001 -3.230163 +v 4.060776 0.010001 -3.322453 +v 3.968485 0.010001 -3.322453 +v 4.337647 0.010001 -3.230163 +v 4.429937 0.010001 -3.230163 +v 4.429937 0.010001 -3.322453 +v 4.337647 0.010001 -3.322453 +v 3.230163 0.010001 -3.599324 +v 3.322453 0.010001 -3.599324 +v 3.322453 0.010002 -3.691614 +v 3.230163 0.010002 -3.691614 +v 3.230163 0.010001 -3.230163 +v 3.322453 0.010001 -3.230163 +v 3.322453 0.010001 -3.322453 +v 3.230163 0.010001 -3.322453 +v 3.599324 0.010001 -3.230163 +v 3.691614 0.010001 -3.230163 +v 3.691614 0.010001 -3.322453 +v 3.599324 0.010001 -3.322453 +v 3.230163 0.010002 -4.337647 +v 3.322453 0.010002 -4.337647 +v 3.322453 0.010002 -4.429937 +v 3.230163 0.010002 -4.429937 +v 3.230163 0.010002 -3.968485 +v 3.322453 0.010002 -3.968485 +v 3.322453 0.010002 -4.060776 +v 3.230163 0.010002 -4.060776 +v 3.599324 0.010002 -3.968485 +v 3.691614 0.010002 -3.968485 +v 3.691614 0.010002 -4.060776 +v 3.599324 0.010002 -4.060776 +v 5.445131 0.010001 -3.599324 +v 5.537421 0.010001 -3.599324 +v 5.537421 0.010002 -3.691614 +v 5.445131 0.010002 -3.691614 +v 5.445131 0.010001 -3.230163 +v 5.537421 0.010001 -3.230163 +v 5.537421 0.010001 -3.322453 +v 5.445131 0.010001 -3.322453 +v 5.814293 0.010001 -3.230163 +v 5.906583 0.010001 -3.230163 +v 5.906583 0.010001 -3.322453 +v 5.814293 0.010001 -3.322453 +v 4.706808 0.010001 -3.599324 +v 4.799098 0.010001 -3.599324 +v 4.799098 0.010002 -3.691614 +v 4.706808 0.010002 -3.691614 +v 4.706808 0.010001 -3.230163 +v 4.799098 0.010001 -3.230163 +v 4.799098 0.010001 -3.322453 +v 4.706808 0.010001 -3.322453 +v 5.075970 0.010001 -3.230163 +v 5.168260 0.010001 -3.230163 +v 5.168260 0.010001 -3.322453 +v 5.075970 0.010001 -3.322453 +v 4.706808 0.010002 -4.337647 +v 4.799098 0.010002 -4.337647 +v 4.799098 0.010002 -4.429937 +v 4.706808 0.010002 -4.429937 +v 4.706808 0.010002 -3.968485 +v 4.799098 0.010002 -3.968485 +v 4.799098 0.010002 -4.060776 +v 4.706808 0.010002 -4.060776 +v 5.075970 0.010002 -3.968485 +v 5.168260 0.010002 -3.968485 +v 5.168260 0.010002 -4.060776 +v 5.075970 0.010002 -4.060776 +v 5.445131 0.010002 -4.337647 +v 5.537421 0.010002 -4.337647 +v 5.537421 0.010002 -4.429937 +v 5.445131 0.010002 -4.429937 +v 5.445131 0.010002 -3.968485 +v 5.537421 0.010002 -3.968485 +v 5.537421 0.010002 -4.060776 +v 5.445131 0.010002 -4.060776 +v 5.814293 0.010002 -3.968485 +v 5.906583 0.010002 -3.968485 +v 5.906583 0.010002 -4.060776 +v 5.814293 0.010002 -4.060776 +v 3.968485 0.010002 -4.337647 +v 4.060776 0.010002 -4.337647 +v 4.060776 0.010002 -4.429937 +v 3.968485 0.010002 -4.429937 +v 3.968485 0.010002 -3.968485 +v 4.060776 0.010002 -3.968485 +v 4.060776 0.010002 -4.060776 +v 3.968485 0.010002 -4.060776 +v 4.337647 0.010002 -3.968485 +v 4.429937 0.010002 -3.968485 +v 4.429937 0.010002 -4.060776 +v 4.337647 0.010002 -4.060776 +v 3.968485 0.010002 -5.814293 +v 4.060776 0.010002 -5.814293 +v 4.060776 0.010002 -5.906583 +v 3.968485 0.010002 -5.906583 +v 3.968485 0.010002 -5.445131 +v 4.060776 0.010002 -5.445131 +v 4.060776 0.010002 -5.537421 +v 3.968485 0.010002 -5.537421 +v 4.337647 0.010002 -5.445131 +v 4.429937 0.010002 -5.445131 +v 4.429937 0.010002 -5.537421 +v 4.337647 0.010002 -5.537421 +v -0.461452 0.010002 -4.337647 +v -0.369161 0.010002 -4.337647 +v -0.369161 0.010002 -4.429937 +v -0.461452 0.010002 -4.429937 +v -0.461452 0.010002 -3.968485 +v -0.369161 0.010002 -3.968485 +v -0.369161 0.010002 -4.060776 +v -0.461452 0.010002 -4.060776 +v -0.092290 0.010002 -3.968485 +v 0.000000 0.010002 -3.968485 +v 0.000000 0.010002 -4.060776 +v -0.092290 0.010002 -4.060776 +v -1.938097 0.010002 -4.337647 +v -1.845807 0.010002 -4.337647 +v -1.845807 0.010002 -4.429937 +v -1.938097 0.010002 -4.429937 +v -1.938097 0.010002 -3.968485 +v -1.845807 0.010002 -3.968485 +v -1.845807 0.010002 -4.060776 +v -1.938097 0.010002 -4.060776 +v -1.568936 0.010002 -3.968485 +v -1.476646 0.010002 -3.968485 +v -1.476646 0.010002 -4.060776 +v -1.568936 0.010002 -4.060776 +v -1.938097 0.010002 -5.814293 +v -1.845807 0.010002 -5.814293 +v -1.845807 0.010002 -5.906583 +v -1.938097 0.010002 -5.906583 +v -1.938097 0.010002 -5.445131 +v -1.845807 0.010002 -5.445131 +v -1.845807 0.010002 -5.537421 +v -1.938097 0.010002 -5.537421 +v -1.568936 0.010002 -5.445131 +v -1.476646 0.010002 -5.445131 +v -1.476646 0.010002 -5.537421 +v -1.568936 0.010002 -5.537421 +v -0.461452 0.009999 1.568936 +v -0.369161 0.009999 1.568936 +v -0.369161 0.009999 1.476646 +v -0.461452 0.009999 1.476646 +v -0.461452 0.009999 1.938097 +v -0.369161 0.009999 1.938097 +v -0.369161 0.009999 1.845807 +v -0.461452 0.009999 1.845807 +v -0.092290 0.009999 1.938097 +v 0.000000 0.009999 1.938097 +v 0.000000 0.009999 1.845807 +v -0.092290 0.009999 1.845807 +v -1.938097 0.009999 1.568936 +v -1.845807 0.009999 1.568936 +v -1.845807 0.009999 1.476646 +v -1.938097 0.009999 1.476646 +v -1.938097 0.009999 1.938097 +v -1.845807 0.009999 1.938097 +v -1.845807 0.009999 1.845807 +v -1.938097 0.009999 1.845807 +v -1.568936 0.009999 1.938097 +v -1.476646 0.009999 1.938097 +v -1.476646 0.009999 1.845807 +v -1.568936 0.009999 1.845807 +v -1.938097 0.010000 0.092290 +v -1.845807 0.010000 0.092290 +v -1.845807 0.010000 -0.000000 +v -1.938097 0.010000 -0.000000 +v -1.938097 0.010000 0.461452 +v -1.845807 0.010000 0.461452 +v -1.845807 0.010000 0.369161 +v -1.938097 0.010000 0.369161 +v -1.568936 0.010000 0.461452 +v -1.476646 0.010000 0.461452 +v -1.476646 0.010000 0.369161 +v -1.568936 0.010000 0.369161 +v 5.445131 0.009999 1.568936 +v 5.537421 0.009999 1.568936 +v 5.537421 0.009999 1.476646 +v 5.445131 0.009999 1.476646 +v 5.445131 0.009999 1.938097 +v 5.537421 0.009999 1.938097 +v 5.537421 0.009999 1.845807 +v 5.445131 0.009999 1.845807 +v 5.814293 0.009999 1.938097 +v 5.906583 0.009999 1.938097 +v 5.906583 0.009999 1.845807 +v 5.814293 0.009999 1.845807 +v 3.968485 0.009999 1.568936 +v 4.060776 0.009999 1.568936 +v 4.060776 0.009999 1.476646 +v 3.968485 0.009999 1.476646 +v 3.968485 0.009999 1.938097 +v 4.060776 0.009999 1.938097 +v 4.060776 0.009999 1.845807 +v 3.968485 0.009999 1.845807 +v 4.337647 0.009999 1.938097 +v 4.429937 0.009999 1.938097 +v 4.429937 0.009999 1.845807 +v 4.337647 0.009999 1.845807 +v 3.968485 0.010000 0.092290 +v 4.060776 0.010000 0.092290 +v 4.060776 0.010000 -0.000000 +v 3.968485 0.010000 -0.000000 +v 3.968485 0.010000 0.461452 +v 4.060776 0.010000 0.461452 +v 4.060776 0.010000 0.369161 +v 3.968485 0.010000 0.369161 +v 4.337647 0.010000 0.461452 +v 4.429937 0.010000 0.461452 +v 4.429937 0.010000 0.369161 +v 4.337647 0.010000 0.369161 +v 2.491840 0.009999 1.568936 +v 2.584130 0.009999 1.568936 +v 2.584130 0.009999 1.476646 +v 2.491840 0.009999 1.476646 +v 2.491840 0.009999 1.938097 +v 2.584130 0.009999 1.938097 +v 2.584130 0.009999 1.845807 +v 2.491840 0.009999 1.845807 +v 2.861001 0.009999 1.938097 +v 2.953291 0.009999 1.938097 +v 2.953291 0.009999 1.845807 +v 2.861001 0.009999 1.845807 +v 1.015194 0.009999 1.568936 +v 1.107484 0.009999 1.568936 +v 1.107484 0.009999 1.476646 +v 1.015194 0.009999 1.476646 +v 1.015194 0.009999 1.938097 +v 1.107484 0.009999 1.938097 +v 1.107484 0.009999 1.845807 +v 1.015194 0.009999 1.845807 +v 1.384355 0.009999 1.938097 +v 1.476646 0.009999 1.938097 +v 1.476646 0.009999 1.845807 +v 1.384355 0.009999 1.845807 +v 1.015194 0.010000 0.092290 +v 1.107484 0.010000 0.092290 +v 1.107484 0.010000 -0.000000 +v 1.015194 0.010000 -0.000000 +v 1.015194 0.010000 0.461452 +v 1.107484 0.010000 0.461452 +v 1.107484 0.010000 0.369161 +v 1.015194 0.010000 0.369161 +v 1.384355 0.010000 0.461452 +v 1.476646 0.010000 0.461452 +v 1.476646 0.010000 0.369161 +v 1.384355 0.010000 0.369161 +v 2.491840 0.009998 4.522227 +v 2.584130 0.009998 4.522227 +v 2.584130 0.009998 4.429937 +v 2.491840 0.009998 4.429937 +v 2.491840 0.009998 4.891389 +v 2.584130 0.009998 4.891389 +v 2.584130 0.009998 4.799098 +v 2.491840 0.009998 4.799098 +v 2.861001 0.009998 4.891389 +v 2.953291 0.009998 4.891389 +v 2.953291 0.009998 4.799098 +v 2.861001 0.009998 4.799098 +v 1.015194 0.009998 4.522227 +v 1.107484 0.009998 4.522227 +v 1.107484 0.009998 4.429937 +v 1.015194 0.009998 4.429937 +v 1.015194 0.009998 4.891389 +v 1.107484 0.009998 4.891389 +v 1.107484 0.009998 4.799098 +v 1.015194 0.009998 4.799098 +v 1.384355 0.009998 4.891389 +v 1.476646 0.009998 4.891389 +v 1.476646 0.009998 4.799098 +v 1.384355 0.009998 4.799098 +v 1.015194 0.009999 3.045582 +v 1.107484 0.009999 3.045582 +v 1.107484 0.009999 2.953291 +v 1.015194 0.009999 2.953291 +v 1.015194 0.009999 3.414743 +v 1.107484 0.009999 3.414743 +v 1.107484 0.009999 3.322453 +v 1.015194 0.009999 3.322453 +v 1.384355 0.009999 3.414743 +v 1.476646 0.009999 3.414743 +v 1.476646 0.009999 3.322453 +v 1.384355 0.009999 3.322453 +v 5.445131 0.009998 4.522227 +v 5.537421 0.009998 4.522227 +v 5.537421 0.009998 4.429937 +v 5.445131 0.009998 4.429937 +v 5.445131 0.009998 4.891389 +v 5.537421 0.009998 4.891389 +v 5.537421 0.009998 4.799098 +v 5.445131 0.009998 4.799098 +v 5.814293 0.009998 4.891389 +v 5.906583 0.009998 4.891389 +v 5.906583 0.009998 4.799098 +v 5.814293 0.009998 4.799098 +v 3.968485 0.009998 4.522227 +v 4.060776 0.009998 4.522227 +v 4.060776 0.009998 4.429937 +v 3.968485 0.009998 4.429937 +v 3.968485 0.009998 4.891389 +v 4.060776 0.009998 4.891389 +v 4.060776 0.009998 4.799098 +v 3.968485 0.009998 4.799098 +v 4.337647 0.009998 4.891389 +v 4.429937 0.009998 4.891389 +v 4.429937 0.009998 4.799098 +v 4.337647 0.009998 4.799098 +v 3.968485 0.009999 3.045582 +v 4.060776 0.009999 3.045582 +v 4.060776 0.009999 2.953291 +v 3.968485 0.009999 2.953291 +v 3.968485 0.009999 3.414743 +v 4.060776 0.009999 3.414743 +v 4.060776 0.009999 3.322453 +v 3.968485 0.009999 3.322453 +v 4.337647 0.009999 3.414743 +v 4.429937 0.009999 3.414743 +v 4.429937 0.009999 3.322453 +v 4.337647 0.009999 3.322453 +v -3.414743 0.009999 1.568936 +v -3.322453 0.009999 1.568936 +v -3.322453 0.009999 1.476646 +v -3.414743 0.009999 1.476646 +v -3.414743 0.009999 1.938097 +v -3.322453 0.009999 1.938097 +v -3.322453 0.009999 1.845807 +v -3.414743 0.009999 1.845807 +v -3.045582 0.009999 1.938097 +v -2.953291 0.009999 1.938097 +v -2.953291 0.009999 1.845807 +v -3.045582 0.009999 1.845807 +v -4.891389 0.009999 1.568936 +v -4.799098 0.009999 1.568936 +v -4.799098 0.009999 1.476646 +v -4.891389 0.009999 1.476646 +v -4.891389 0.009999 1.938097 +v -4.799098 0.009999 1.938097 +v -4.799098 0.009999 1.845807 +v -4.891389 0.009999 1.845807 +v -4.522227 0.009999 1.938097 +v -4.429937 0.009999 1.938097 +v -4.429937 0.009999 1.845807 +v -4.522227 0.009999 1.845807 +v -4.891389 0.010000 0.092290 +v -4.799098 0.010000 0.092290 +v -4.799098 0.010000 -0.000000 +v -4.891389 0.010000 -0.000000 +v -4.891389 0.010000 0.461452 +v -4.799098 0.010000 0.461452 +v -4.799098 0.010000 0.369161 +v -4.891389 0.010000 0.369161 +v -4.522227 0.010000 0.461452 +v -4.429937 0.010000 0.461452 +v -4.429937 0.010000 0.369161 +v -4.522227 0.010000 0.369161 +v -3.414743 0.009998 4.522227 +v -3.322453 0.009998 4.522227 +v -3.322453 0.009998 4.429937 +v -3.414743 0.009998 4.429937 +v -3.414743 0.009998 4.891389 +v -3.322453 0.009998 4.891389 +v -3.322453 0.009998 4.799098 +v -3.414743 0.009998 4.799098 +v -3.045582 0.009998 4.891389 +v -2.953291 0.009998 4.891389 +v -2.953291 0.009998 4.799098 +v -3.045582 0.009998 4.799098 +v -4.891389 0.009998 4.522227 +v -4.799098 0.009998 4.522227 +v -4.799098 0.009998 4.429937 +v -4.891389 0.009998 4.429937 +v -4.891389 0.009998 4.891389 +v -4.799098 0.009998 4.891389 +v -4.799098 0.009998 4.799098 +v -4.891389 0.009998 4.799098 +v -4.522227 0.009998 4.891389 +v -4.429937 0.009998 4.891389 +v -4.429937 0.009998 4.799098 +v -4.522227 0.009998 4.799098 +v -4.891389 0.009999 3.045582 +v -4.799098 0.009999 3.045582 +v -4.799098 0.009999 2.953291 +v -4.891389 0.009999 2.953291 +v -4.891389 0.009999 3.414743 +v -4.799098 0.009999 3.414743 +v -4.799098 0.009999 3.322453 +v -4.891389 0.009999 3.322453 +v -4.522227 0.009999 3.414743 +v -4.429937 0.009999 3.414743 +v -4.429937 0.009999 3.322453 +v -4.522227 0.009999 3.322453 +v -0.461452 0.009998 4.522227 +v -0.369161 0.009998 4.522227 +v -0.369161 0.009998 4.429937 +v -0.461452 0.009998 4.429937 +v -0.461452 0.009998 4.891389 +v -0.369161 0.009998 4.891389 +v -0.369161 0.009998 4.799098 +v -0.461452 0.009998 4.799098 +v -0.092290 0.009998 4.891389 +v 0.000000 0.009998 4.891389 +v 0.000000 0.009998 4.799098 +v -0.092290 0.009998 4.799098 +v -1.938097 0.009998 4.522227 +v -1.845807 0.009998 4.522227 +v -1.845807 0.009998 4.429937 +v -1.938097 0.009998 4.429937 +v -1.938097 0.009998 4.891389 +v -1.845807 0.009998 4.891389 +v -1.845807 0.009998 4.799098 +v -1.938097 0.009998 4.799098 +v -1.568936 0.009998 4.891389 +v -1.476646 0.009998 4.891389 +v -1.476646 0.009998 4.799098 +v -1.568936 0.009998 4.799098 +v -1.938097 0.009999 3.045582 +v -1.845807 0.009999 3.045582 +v -1.845807 0.009999 2.953291 +v -1.938097 0.009999 2.953291 +v -1.938097 0.009999 3.414743 +v -1.845807 0.009999 3.414743 +v -1.845807 0.009999 3.322453 +v -1.938097 0.009999 3.322453 +v -1.568936 0.009999 3.414743 +v -1.476646 0.009999 3.414743 +v -1.476646 0.009999 3.322453 +v -1.568936 0.009999 3.322453 +v -3.414743 0.010002 -4.337647 +v -3.322453 0.010002 -4.337647 +v -3.322453 0.010002 -4.429937 +v -3.414743 0.010002 -4.429937 +v -3.414743 0.010002 -3.968485 +v -3.322453 0.010002 -3.968485 +v -3.322453 0.010002 -4.060776 +v -3.414743 0.010002 -4.060776 +v -3.045582 0.010002 -3.968485 +v -2.953291 0.010002 -3.968485 +v -2.953291 0.010002 -4.060776 +v -3.045582 0.010002 -4.060776 +v -4.891389 0.010002 -4.337647 +v -4.799098 0.010002 -4.337647 +v -4.799098 0.010002 -4.429937 +v -4.891389 0.010002 -4.429937 +v -4.891389 0.010002 -3.968485 +v -4.799098 0.010002 -3.968485 +v -4.799098 0.010002 -4.060776 +v -4.891389 0.010002 -4.060776 +v -4.522227 0.010002 -3.968485 +v -4.429937 0.010002 -3.968485 +v -4.429937 0.010002 -4.060776 +v -4.522227 0.010002 -4.060776 +v -4.891389 0.010002 -5.814293 +v -4.799098 0.010002 -5.814293 +v -4.799098 0.010002 -5.906583 +v -4.891389 0.010002 -5.906583 +v -4.891389 0.010002 -5.445131 +v -4.799098 0.010002 -5.445131 +v -4.799098 0.010002 -5.537421 +v -4.891389 0.010002 -5.537421 +v -4.522227 0.010002 -5.445131 +v -4.429937 0.010002 -5.445131 +v -4.429937 0.010002 -5.537421 +v -4.522227 0.010002 -5.537421 +v -3.414743 0.010001 -1.384355 +v -3.322453 0.010001 -1.384355 +v -3.322453 0.010001 -1.476646 +v -3.414743 0.010001 -1.476646 +v -3.414743 0.010000 -1.015194 +v -3.322453 0.010000 -1.015194 +v -3.322453 0.010000 -1.107484 +v -3.414743 0.010000 -1.107484 +v -3.045582 0.010000 -1.015194 +v -2.953291 0.010000 -1.015194 +v -2.953291 0.010000 -1.107484 +v -3.045582 0.010000 -1.107484 +v -4.891389 0.010001 -1.384355 +v -4.799098 0.010001 -1.384355 +v -4.799098 0.010001 -1.476646 +v -4.891389 0.010001 -1.476646 +v -4.891389 0.010000 -1.015194 +v -4.799098 0.010000 -1.015194 +v -4.799098 0.010000 -1.107484 +v -4.891389 0.010000 -1.107484 +v -4.522227 0.010000 -1.015194 +v -4.429937 0.010000 -1.015194 +v -4.429937 0.010000 -1.107484 +v -4.522227 0.010000 -1.107484 +v -4.891389 0.010001 -2.861001 +v -4.799098 0.010001 -2.861001 +v -4.799098 0.010001 -2.953291 +v -4.891389 0.010001 -2.953291 +v -4.891389 0.010001 -2.491840 +v -4.799098 0.010001 -2.491840 +v -4.799098 0.010001 -2.584130 +v -4.891389 0.010001 -2.584130 +v -4.522227 0.010001 -2.491840 +v -4.429937 0.010001 -2.491840 +v -4.429937 0.010001 -2.584130 +v -4.522227 0.010001 -2.584130 +v -0.461452 0.010001 -1.384355 +v -0.369161 0.010001 -1.384355 +v -0.369161 0.010001 -1.476646 +v -0.461452 0.010001 -1.476646 +v -0.461452 0.010000 -1.015194 +v -0.369161 0.010000 -1.015194 +v -0.369161 0.010000 -1.107484 +v -0.461452 0.010000 -1.107484 +v -0.092290 0.010000 -1.015194 +v 0.000000 0.010000 -1.015194 +v 0.000000 0.010000 -1.107484 +v -0.092290 0.010000 -1.107484 +v -1.938097 0.010001 -1.384355 +v -1.845807 0.010001 -1.384355 +v -1.845807 0.010001 -1.476646 +v -1.938097 0.010001 -1.476646 +v -1.938097 0.010000 -1.015194 +v -1.845807 0.010000 -1.015194 +v -1.845807 0.010000 -1.107484 +v -1.938097 0.010000 -1.107484 +v -1.568936 0.010000 -1.015194 +v -1.476646 0.010000 -1.015194 +v -1.476646 0.010000 -1.107484 +v -1.568936 0.010000 -1.107484 +v -1.938097 0.010001 -2.861001 +v -1.845807 0.010001 -2.861001 +v -1.845807 0.010001 -2.953291 +v -1.938097 0.010001 -2.953291 +v -1.938097 0.010001 -2.491840 +v -1.845807 0.010001 -2.491840 +v -1.845807 0.010001 -2.584130 +v -1.938097 0.010001 -2.584130 +v -1.568936 0.010001 -2.491840 +v -1.476646 0.010001 -2.491840 +v -1.476646 0.010001 -2.584130 +v -1.568936 0.010001 -2.584130 +v 2.491840 0.010002 -4.337647 +v 2.584130 0.010002 -4.337647 +v 2.584130 0.010002 -4.429937 +v 2.491840 0.010002 -4.429937 +v 2.491840 0.010002 -3.968485 +v 2.584130 0.010002 -3.968485 +v 2.584130 0.010002 -4.060776 +v 2.491840 0.010002 -4.060776 +v 2.861001 0.010002 -3.968485 +v 2.953291 0.010002 -3.968485 +v 2.953291 0.010002 -4.060776 +v 2.861001 0.010002 -4.060776 +v 1.015194 0.010002 -4.337647 +v 1.107484 0.010002 -4.337647 +v 1.107484 0.010002 -4.429937 +v 1.015194 0.010002 -4.429937 +v 1.015194 0.010002 -3.968485 +v 1.107484 0.010002 -3.968485 +v 1.107484 0.010002 -4.060776 +v 1.015194 0.010002 -4.060776 +v 1.384355 0.010002 -3.968485 +v 1.476646 0.010002 -3.968485 +v 1.476646 0.010002 -4.060776 +v 1.384355 0.010002 -4.060776 +v 1.015194 0.010002 -5.814293 +v 1.107484 0.010002 -5.814293 +v 1.107484 0.010002 -5.906583 +v 1.015194 0.010002 -5.906583 +v 1.015194 0.010002 -5.445131 +v 1.107484 0.010002 -5.445131 +v 1.107484 0.010002 -5.537421 +v 1.015194 0.010002 -5.537421 +v 1.384355 0.010002 -5.445131 +v 1.476646 0.010002 -5.445131 +v 1.476646 0.010002 -5.537421 +v 1.384355 0.010002 -5.537421 +v 2.491840 0.010001 -1.384355 +v 2.584130 0.010001 -1.384355 +v 2.584130 0.010001 -1.476646 +v 2.491840 0.010001 -1.476646 +v 2.491840 0.010000 -1.015194 +v 2.584130 0.010000 -1.015194 +v 2.584130 0.010000 -1.107484 +v 2.491840 0.010000 -1.107484 +v 2.861001 0.010000 -1.015194 +v 2.953291 0.010000 -1.015194 +v 2.953291 0.010000 -1.107484 +v 2.861001 0.010000 -1.107484 +v 1.015194 0.010001 -1.384355 +v 1.107484 0.010001 -1.384355 +v 1.107484 0.010001 -1.476646 +v 1.015194 0.010001 -1.476646 +v 1.015194 0.010000 -1.015194 +v 1.107484 0.010000 -1.015194 +v 1.107484 0.010000 -1.107484 +v 1.015194 0.010000 -1.107484 +v 1.384355 0.010000 -1.015194 +v 1.476646 0.010000 -1.015194 +v 1.476646 0.010000 -1.107484 +v 1.384355 0.010000 -1.107484 +v 1.015194 0.010001 -2.861001 +v 1.107484 0.010001 -2.861001 +v 1.107484 0.010001 -2.953291 +v 1.015194 0.010001 -2.953291 +v 1.015194 0.010001 -2.491840 +v 1.107484 0.010001 -2.491840 +v 1.107484 0.010001 -2.584130 +v 1.015194 0.010001 -2.584130 +v 1.384355 0.010001 -2.491840 +v 1.476646 0.010001 -2.491840 +v 1.476646 0.010001 -2.584130 +v 1.384355 0.010001 -2.584130 +v 5.445131 0.010001 -1.384355 +v 5.537421 0.010001 -1.384355 +v 5.537421 0.010001 -1.476646 +v 5.445131 0.010001 -1.476646 +v 5.445131 0.010000 -1.015194 +v 5.537421 0.010000 -1.015194 +v 5.537421 0.010000 -1.107484 +v 5.445131 0.010000 -1.107484 +v 5.814293 0.010000 -1.015194 +v 5.906583 0.010000 -1.015194 +v 5.906583 0.010000 -1.107484 +v 5.814293 0.010000 -1.107484 +v 3.968485 0.010001 -1.384355 +v 4.060776 0.010001 -1.384355 +v 4.060776 0.010001 -1.476646 +v 3.968485 0.010001 -1.476646 +v 3.968485 0.010000 -1.015194 +v 4.060776 0.010000 -1.015194 +v 4.060776 0.010000 -1.107484 +v 3.968485 0.010000 -1.107484 +v 4.337647 0.010000 -1.015194 +v 4.429937 0.010000 -1.015194 +v 4.429937 0.010000 -1.107484 +v 4.337647 0.010000 -1.107484 +v 3.968485 0.010001 -2.861001 +v 4.060776 0.010001 -2.861001 +v 4.060776 0.010001 -2.953291 +v 3.968485 0.010001 -2.953291 +v 3.968485 0.010001 -2.491840 +v 4.060776 0.010001 -2.491840 +v 4.060776 0.010001 -2.584130 +v 3.968485 0.010001 -2.584130 +v 4.337647 0.010001 -2.491840 +v 4.429937 0.010001 -2.491840 +v 4.429937 0.010001 -2.584130 +v 4.337647 0.010001 -2.584130 +v 5.445131 0.010001 -2.861001 +v 5.537421 0.010001 -2.861001 +v 5.537421 0.010001 -2.953291 +v 5.445131 0.010001 -2.953291 +v 5.445131 0.010001 -2.491840 +v 5.537421 0.010001 -2.491840 +v 5.537421 0.010001 -2.584130 +v 5.445131 0.010001 -2.584130 +v 5.814293 0.010001 -2.491840 +v 5.906583 0.010001 -2.491840 +v 5.906583 0.010001 -2.584130 +v 5.814293 0.010001 -2.584130 +v 2.491840 0.010001 -2.861001 +v 2.584130 0.010001 -2.861001 +v 2.584130 0.010001 -2.953291 +v 2.491840 0.010001 -2.953291 +v 2.491840 0.010001 -2.491840 +v 2.584130 0.010001 -2.491840 +v 2.584130 0.010001 -2.584130 +v 2.491840 0.010001 -2.584130 +v 2.861001 0.010001 -2.491840 +v 2.953291 0.010001 -2.491840 +v 2.953291 0.010001 -2.584130 +v 2.861001 0.010001 -2.584130 +v 2.491840 0.010002 -5.814293 +v 2.584130 0.010002 -5.814293 +v 2.584130 0.010002 -5.906583 +v 2.491840 0.010002 -5.906583 +v 2.491840 0.010002 -5.445131 +v 2.584130 0.010002 -5.445131 +v 2.584130 0.010002 -5.537421 +v 2.491840 0.010002 -5.537421 +v 2.861001 0.010002 -5.445131 +v 2.953291 0.010002 -5.445131 +v 2.953291 0.010002 -5.537421 +v 2.861001 0.010002 -5.537421 +v -0.461452 0.010001 -2.861001 +v -0.369161 0.010001 -2.861001 +v -0.369161 0.010001 -2.953291 +v -0.461452 0.010001 -2.953291 +v -0.461452 0.010001 -2.491840 +v -0.369161 0.010001 -2.491840 +v -0.369161 0.010001 -2.584130 +v -0.461452 0.010001 -2.584130 +v -0.092290 0.010001 -2.491840 +v 0.000000 0.010001 -2.491840 +v 0.000000 0.010001 -2.584130 +v -0.092290 0.010001 -2.584130 +v -3.414743 0.010001 -2.861001 +v -3.322453 0.010001 -2.861001 +v -3.322453 0.010001 -2.953291 +v -3.414743 0.010001 -2.953291 +v -3.414743 0.010001 -2.491840 +v -3.322453 0.010001 -2.491840 +v -3.322453 0.010001 -2.584130 +v -3.414743 0.010001 -2.584130 +v -3.045582 0.010001 -2.491840 +v -2.953291 0.010001 -2.491840 +v -2.953291 0.010001 -2.584130 +v -3.045582 0.010001 -2.584130 +v -3.414743 0.010002 -5.814293 +v -3.322453 0.010002 -5.814293 +v -3.322453 0.010002 -5.906583 +v -3.414743 0.010002 -5.906583 +v -3.414743 0.010002 -5.445131 +v -3.322453 0.010002 -5.445131 +v -3.322453 0.010002 -5.537421 +v -3.414743 0.010002 -5.537421 +v -3.045582 0.010002 -5.445131 +v -2.953291 0.010002 -5.445131 +v -2.953291 0.010002 -5.537421 +v -3.045582 0.010002 -5.537421 +v -0.461452 0.009999 3.045582 +v -0.369161 0.009999 3.045582 +v -0.369161 0.009999 2.953291 +v -0.461452 0.009999 2.953291 +v -0.461452 0.009999 3.414743 +v -0.369161 0.009999 3.414743 +v -0.369161 0.009999 3.322453 +v -0.461452 0.009999 3.322453 +v -0.092290 0.009999 3.414743 +v 0.000000 0.009999 3.414743 +v 0.000000 0.009999 3.322453 +v -0.092290 0.009999 3.322453 +v -3.414743 0.009999 3.045582 +v -3.322453 0.009999 3.045582 +v -3.322453 0.009999 2.953291 +v -3.414743 0.009999 2.953291 +v -3.414743 0.009999 3.414743 +v -3.322453 0.009999 3.414743 +v -3.322453 0.009999 3.322453 +v -3.414743 0.009999 3.322453 +v -3.045582 0.009999 3.414743 +v -2.953291 0.009999 3.414743 +v -2.953291 0.009999 3.322453 +v -3.045582 0.009999 3.322453 +v -3.414743 0.010000 0.092290 +v -3.322453 0.010000 0.092290 +v -3.322453 0.010000 -0.000000 +v -3.414743 0.010000 -0.000000 +v -3.414743 0.010000 0.461452 +v -3.322453 0.010000 0.461452 +v -3.322453 0.010000 0.369161 +v -3.414743 0.010000 0.369161 +v -3.045582 0.010000 0.461452 +v -2.953291 0.010000 0.461452 +v -2.953291 0.010000 0.369161 +v -3.045582 0.010000 0.369161 +v 5.445131 0.009999 3.045582 +v 5.537421 0.009999 3.045582 +v 5.537421 0.009999 2.953291 +v 5.445131 0.009999 2.953291 +v 5.445131 0.009999 3.414743 +v 5.537421 0.009999 3.414743 +v 5.537421 0.009999 3.322453 +v 5.445131 0.009999 3.322453 +v 5.814293 0.009999 3.414743 +v 5.906583 0.009999 3.414743 +v 5.906583 0.009999 3.322453 +v 5.814293 0.009999 3.322453 +v 2.491840 0.009999 3.045582 +v 2.584130 0.009999 3.045582 +v 2.584130 0.009999 2.953291 +v 2.491840 0.009999 2.953291 +v 2.491840 0.009999 3.414743 +v 2.584130 0.009999 3.414743 +v 2.584130 0.009999 3.322453 +v 2.491840 0.009999 3.322453 +v 2.861001 0.009999 3.414743 +v 2.953291 0.009999 3.414743 +v 2.953291 0.009999 3.322453 +v 2.861001 0.009999 3.322453 +v 2.491840 0.010000 0.092290 +v 2.584130 0.010000 0.092290 +v 2.584130 0.010000 -0.000000 +v 2.491840 0.010000 -0.000000 +v 2.491840 0.010000 0.461452 +v 2.584130 0.010000 0.461452 +v 2.584130 0.010000 0.369161 +v 2.491840 0.010000 0.369161 +v 2.861001 0.010000 0.461452 +v 2.953291 0.010000 0.461452 +v 2.953291 0.010000 0.369161 +v 2.861001 0.010000 0.369161 +v 5.445131 0.010000 0.092290 +v 5.537421 0.010000 0.092290 +v 5.537421 0.010000 -0.000000 +v 5.445131 0.010000 -0.000000 +v 5.445131 0.010000 0.461452 +v 5.537421 0.010000 0.461452 +v 5.537421 0.010000 0.369161 +v 5.445131 0.010000 0.369161 +v 5.814293 0.010000 0.461452 +v 5.906583 0.010000 0.461452 +v 5.906583 0.010000 0.369161 +v 5.814293 0.010000 0.369161 +v -0.461452 0.010000 0.092290 +v -0.369161 0.010000 0.092290 +v -0.369161 0.010000 -0.000000 +v -0.461452 0.010000 -0.000000 +v -0.461452 0.010000 0.461452 +v -0.369161 0.010000 0.461452 +v -0.369161 0.010000 0.369161 +v -0.461452 0.010000 0.369161 +v -0.092290 0.010000 0.461452 +v 0.000000 0.010000 0.461452 +v 0.000000 0.010000 0.369161 +v -0.092290 0.010000 0.369161 +v -0.461452 0.010002 -5.814293 +v -0.369161 0.010002 -5.814293 +v -0.369161 0.010002 -5.906583 +v -0.461452 0.010002 -5.906583 +v -0.461452 0.010002 -5.445131 +v -0.369161 0.010002 -5.445131 +v -0.369161 0.010002 -5.537421 +v -0.461452 0.010002 -5.537421 +v -0.092290 0.010002 -5.445131 +v 0.000000 0.010002 -5.445131 +v 0.000000 0.010002 -5.537421 +v -0.092290 0.010002 -5.537421 +v 5.445131 0.010002 -5.814293 +v 5.537421 0.010002 -5.814293 +v 5.537421 0.010002 -5.906583 +v 5.445131 0.010002 -5.906583 +v 5.445131 0.010002 -5.445131 +v 5.537421 0.010002 -5.445131 +v 5.537421 0.010002 -5.537421 +v 5.445131 0.010002 -5.537421 +v 5.814293 0.010002 -5.445131 +v 5.906583 0.010002 -5.445131 +v 5.906583 0.010002 -5.537421 +v 5.814293 0.010002 -5.537421 +v 5.629711 0.010002 -5.445131 +v 5.722002 0.010002 -5.445131 +v 5.722002 0.010002 -5.537421 +v 5.629711 0.010002 -5.537421 +v 5.629711 0.010002 -5.260550 +v 5.722002 0.010002 -5.260550 +v 5.722002 0.010002 -5.352840 +v 5.629711 0.010002 -5.352840 +v 5.814293 0.010002 -5.260550 +v 5.906583 0.010002 -5.260550 +v 5.906583 0.010002 -5.352840 +v 5.814293 0.010002 -5.352840 +v 5.260550 0.010002 -5.445131 +v 5.352840 0.010002 -5.445131 +v 5.352840 0.010002 -5.537421 +v 5.260550 0.010002 -5.537421 +v 5.260550 0.010002 -5.260550 +v 5.352840 0.010002 -5.260550 +v 5.352840 0.010002 -5.352840 +v 5.260550 0.010002 -5.352840 +v 5.445131 0.010002 -5.260550 +v 5.537421 0.010002 -5.260550 +v 5.537421 0.010002 -5.352840 +v 5.445131 0.010002 -5.352840 +v 5.260550 0.010002 -5.814293 +v 5.352840 0.010002 -5.814293 +v 5.352840 0.010002 -5.906583 +v 5.260550 0.010002 -5.906583 +v 5.260550 0.010002 -5.629711 +v 5.352840 0.010002 -5.629711 +v 5.352840 0.010002 -5.722002 +v 5.260550 0.010002 -5.722002 +v 5.445131 0.010002 -5.629711 +v 5.537421 0.010002 -5.629711 +v 5.537421 0.010002 -5.722002 +v 5.445131 0.010002 -5.722002 +v -0.276871 0.010002 -5.445131 +v -0.184581 0.010002 -5.445131 +v -0.184581 0.010002 -5.537421 +v -0.276871 0.010002 -5.537421 +v -0.276871 0.010002 -5.260550 +v -0.184581 0.010002 -5.260550 +v -0.184581 0.010002 -5.352840 +v -0.276871 0.010002 -5.352840 +v -0.092290 0.010002 -5.260550 +v 0.000000 0.010002 -5.260550 +v 0.000000 0.010002 -5.352840 +v -0.092290 0.010002 -5.352840 +v -0.646033 0.010002 -5.445131 +v -0.553742 0.010002 -5.445131 +v -0.553742 0.010002 -5.537421 +v -0.646033 0.010002 -5.537421 +v -0.646033 0.010002 -5.260550 +v -0.553742 0.010002 -5.260550 +v -0.553742 0.010002 -5.352840 +v -0.646033 0.010002 -5.352840 +v -0.461452 0.010002 -5.260550 +v -0.369161 0.010002 -5.260550 +v -0.369161 0.010002 -5.352840 +v -0.461452 0.010002 -5.352840 +v -0.646033 0.010002 -5.814293 +v -0.553742 0.010002 -5.814293 +v -0.553742 0.010002 -5.906583 +v -0.646033 0.010002 -5.906583 +v -0.646033 0.010002 -5.629711 +v -0.553742 0.010002 -5.629711 +v -0.553742 0.010002 -5.722002 +v -0.646033 0.010002 -5.722002 +v -0.461452 0.010002 -5.629711 +v -0.369161 0.010002 -5.629711 +v -0.369161 0.010002 -5.722002 +v -0.461452 0.010002 -5.722002 +v -0.276871 0.010000 0.461452 +v -0.184581 0.010000 0.461452 +v -0.184581 0.010000 0.369161 +v -0.276871 0.010000 0.369161 +v -0.276871 0.010000 0.646033 +v -0.184581 0.010000 0.646033 +v -0.184581 0.010000 0.553742 +v -0.276871 0.010000 0.553742 +v -0.092290 0.010000 0.646033 +v 0.000000 0.010000 0.646033 +v 0.000000 0.010000 0.553742 +v -0.092290 0.010000 0.553742 +v -0.646033 0.010000 0.461452 +v -0.553742 0.010000 0.461452 +v -0.553742 0.010000 0.369161 +v -0.646033 0.010000 0.369161 +v -0.646033 0.010000 0.646033 +v -0.553742 0.010000 0.646033 +v -0.553742 0.010000 0.553742 +v -0.646033 0.010000 0.553742 +v -0.461452 0.010000 0.646033 +v -0.369161 0.010000 0.646033 +v -0.369161 0.010000 0.553742 +v -0.461452 0.010000 0.553742 +v -0.646033 0.010000 0.092290 +v -0.553742 0.010000 0.092290 +v -0.553742 0.010000 -0.000000 +v -0.646033 0.010000 -0.000000 +v -0.646033 0.010000 0.276871 +v -0.553742 0.010000 0.276871 +v -0.553742 0.010000 0.184581 +v -0.646033 0.010000 0.184581 +v -0.461452 0.010000 0.276871 +v -0.369161 0.010000 0.276871 +v -0.369161 0.010000 0.184581 +v -0.461452 0.010000 0.184581 +v 5.629711 0.010000 0.461452 +v 5.722002 0.010000 0.461452 +v 5.722002 0.010000 0.369161 +v 5.629711 0.010000 0.369161 +v 5.629711 0.010000 0.646033 +v 5.722002 0.010000 0.646033 +v 5.722002 0.010000 0.553742 +v 5.629711 0.010000 0.553742 +v 5.814293 0.010000 0.646033 +v 5.906583 0.010000 0.646033 +v 5.906583 0.010000 0.553742 +v 5.814293 0.010000 0.553742 +v 5.260550 0.010000 0.461452 +v 5.352840 0.010000 0.461452 +v 5.352840 0.010000 0.369161 +v 5.260550 0.010000 0.369161 +v 5.260550 0.010000 0.646033 +v 5.352840 0.010000 0.646033 +v 5.352840 0.010000 0.553742 +v 5.260550 0.010000 0.553742 +v 5.445131 0.010000 0.646033 +v 5.537421 0.010000 0.646033 +v 5.537421 0.010000 0.553742 +v 5.445131 0.010000 0.553742 +v 5.260550 0.010000 0.092290 +v 5.352840 0.010000 0.092290 +v 5.352840 0.010000 -0.000000 +v 5.260550 0.010000 -0.000000 +v 5.260550 0.010000 0.276871 +v 5.352840 0.010000 0.276871 +v 5.352840 0.010000 0.184581 +v 5.260550 0.010000 0.184581 +v 5.445131 0.010000 0.276871 +v 5.537421 0.010000 0.276871 +v 5.537421 0.010000 0.184581 +v 5.445131 0.010000 0.184581 +v 2.676420 0.010000 0.461452 +v 2.768711 0.010000 0.461452 +v 2.768711 0.010000 0.369161 +v 2.676420 0.010000 0.369161 +v 2.676420 0.010000 0.646033 +v 2.768711 0.010000 0.646033 +v 2.768711 0.010000 0.553742 +v 2.676420 0.010000 0.553742 +v 2.861001 0.010000 0.646033 +v 2.953291 0.010000 0.646033 +v 2.953291 0.010000 0.553742 +v 2.861001 0.010000 0.553742 +v 2.307259 0.010000 0.461452 +v 2.399549 0.010000 0.461452 +v 2.399549 0.010000 0.369161 +v 2.307259 0.010000 0.369161 +v 2.307259 0.010000 0.646033 +v 2.399549 0.010000 0.646033 +v 2.399549 0.010000 0.553742 +v 2.307259 0.010000 0.553742 +v 2.491840 0.010000 0.646033 +v 2.584130 0.010000 0.646033 +v 2.584130 0.010000 0.553742 +v 2.491840 0.010000 0.553742 +v 2.307259 0.010000 0.092290 +v 2.399549 0.010000 0.092290 +v 2.399549 0.010000 -0.000000 +v 2.307259 0.010000 -0.000000 +v 2.307259 0.010000 0.276871 +v 2.399549 0.010000 0.276871 +v 2.399549 0.010000 0.184581 +v 2.307259 0.010000 0.184581 +v 2.491840 0.010000 0.276871 +v 2.584130 0.010000 0.276871 +v 2.584130 0.010000 0.184581 +v 2.491840 0.010000 0.184581 +v 2.676420 0.009999 3.414743 +v 2.768711 0.009999 3.414743 +v 2.768711 0.009999 3.322453 +v 2.676420 0.009999 3.322453 +v 2.676420 0.009999 3.599324 +v 2.768711 0.009999 3.599324 +v 2.768711 0.009999 3.507033 +v 2.676420 0.009999 3.507033 +v 2.861001 0.009999 3.599324 +v 2.953291 0.009999 3.599324 +v 2.953291 0.009999 3.507033 +v 2.861001 0.009999 3.507033 +v 2.307259 0.009999 3.414743 +v 2.399549 0.009999 3.414743 +v 2.399549 0.009999 3.322453 +v 2.307259 0.009999 3.322453 +v 2.307259 0.009999 3.599324 +v 2.399549 0.009999 3.599324 +v 2.399549 0.009999 3.507033 +v 2.307259 0.009999 3.507033 +v 2.491840 0.009999 3.599324 +v 2.584130 0.009999 3.599324 +v 2.584130 0.009999 3.507033 +v 2.491840 0.009999 3.507033 +v 2.307259 0.009999 3.045582 +v 2.399549 0.009999 3.045582 +v 2.399549 0.009999 2.953291 +v 2.307259 0.009999 2.953291 +v 2.307259 0.009999 3.230163 +v 2.399549 0.009999 3.230163 +v 2.399549 0.009999 3.137872 +v 2.307259 0.009999 3.137872 +v 2.491840 0.009999 3.230163 +v 2.584130 0.009999 3.230163 +v 2.584130 0.009999 3.137872 +v 2.491840 0.009999 3.137872 +v 5.629711 0.009999 3.414743 +v 5.722002 0.009999 3.414743 +v 5.722002 0.009999 3.322453 +v 5.629711 0.009999 3.322453 +v 5.629711 0.009999 3.599324 +v 5.722002 0.009999 3.599324 +v 5.722002 0.009999 3.507033 +v 5.629711 0.009999 3.507033 +v 5.814293 0.009999 3.599324 +v 5.906583 0.009999 3.599324 +v 5.906583 0.009999 3.507033 +v 5.814293 0.009999 3.507033 +v 5.260550 0.009999 3.414743 +v 5.352840 0.009999 3.414743 +v 5.352840 0.009999 3.322453 +v 5.260550 0.009999 3.322453 +v 5.260550 0.009999 3.599324 +v 5.352840 0.009999 3.599324 +v 5.352840 0.009999 3.507033 +v 5.260550 0.009999 3.507033 +v 5.445131 0.009999 3.599324 +v 5.537421 0.009999 3.599324 +v 5.537421 0.009999 3.507033 +v 5.445131 0.009999 3.507033 +v 5.260550 0.009999 3.045582 +v 5.352840 0.009999 3.045582 +v 5.352840 0.009999 2.953291 +v 5.260550 0.009999 2.953291 +v 5.260550 0.009999 3.230163 +v 5.352840 0.009999 3.230163 +v 5.352840 0.009999 3.137872 +v 5.260550 0.009999 3.137872 +v 5.445131 0.009999 3.230163 +v 5.537421 0.009999 3.230163 +v 5.537421 0.009999 3.137872 +v 5.445131 0.009999 3.137872 +v -3.230163 0.010000 0.461452 +v -3.137872 0.010000 0.461452 +v -3.137872 0.010000 0.369161 +v -3.230163 0.010000 0.369161 +v -3.230163 0.010000 0.646033 +v -3.137872 0.010000 0.646033 +v -3.137872 0.010000 0.553742 +v -3.230163 0.010000 0.553742 +v -3.045582 0.010000 0.646033 +v -2.953291 0.010000 0.646033 +v -2.953291 0.010000 0.553742 +v -3.045582 0.010000 0.553742 +v -3.599324 0.010000 0.461452 +v -3.507033 0.010000 0.461452 +v -3.507033 0.010000 0.369161 +v -3.599324 0.010000 0.369161 +v -3.599324 0.010000 0.646033 +v -3.507033 0.010000 0.646033 +v -3.507033 0.010000 0.553742 +v -3.599324 0.010000 0.553742 +v -3.414743 0.010000 0.646033 +v -3.322453 0.010000 0.646033 +v -3.322453 0.010000 0.553742 +v -3.414743 0.010000 0.553742 +v -3.599324 0.010000 0.092290 +v -3.507033 0.010000 0.092290 +v -3.507033 0.010000 -0.000000 +v -3.599324 0.010000 -0.000000 +v -3.599324 0.010000 0.276871 +v -3.507033 0.010000 0.276871 +v -3.507033 0.010000 0.184581 +v -3.599324 0.010000 0.184581 +v -3.414743 0.010000 0.276871 +v -3.322453 0.010000 0.276871 +v -3.322453 0.010000 0.184581 +v -3.414743 0.010000 0.184581 +v -3.230163 0.009999 3.414743 +v -3.137872 0.009999 3.414743 +v -3.137872 0.009999 3.322453 +v -3.230163 0.009999 3.322453 +v -3.230163 0.009999 3.599324 +v -3.137872 0.009999 3.599324 +v -3.137872 0.009999 3.507033 +v -3.230163 0.009999 3.507033 +v -3.045582 0.009999 3.599324 +v -2.953291 0.009999 3.599324 +v -2.953291 0.009999 3.507033 +v -3.045582 0.009999 3.507033 +v -3.599324 0.009999 3.414743 +v -3.507033 0.009999 3.414743 +v -3.507033 0.009999 3.322453 +v -3.599324 0.009999 3.322453 +v -3.599324 0.009999 3.599324 +v -3.507033 0.009999 3.599324 +v -3.507033 0.009999 3.507033 +v -3.599324 0.009999 3.507033 +v -3.414743 0.009999 3.599324 +v -3.322453 0.009999 3.599324 +v -3.322453 0.009999 3.507033 +v -3.414743 0.009999 3.507033 +v -3.599324 0.009999 3.045582 +v -3.507033 0.009999 3.045582 +v -3.507033 0.009999 2.953291 +v -3.599324 0.009999 2.953291 +v -3.599324 0.009999 3.230163 +v -3.507033 0.009999 3.230163 +v -3.507033 0.009999 3.137872 +v -3.599324 0.009999 3.137872 +v -3.414743 0.009999 3.230163 +v -3.322453 0.009999 3.230163 +v -3.322453 0.009999 3.137872 +v -3.414743 0.009999 3.137872 +v -0.276871 0.009999 3.414743 +v -0.184581 0.009999 3.414743 +v -0.184581 0.009999 3.322453 +v -0.276871 0.009999 3.322453 +v -0.276871 0.009999 3.599324 +v -0.184581 0.009999 3.599324 +v -0.184581 0.009999 3.507033 +v -0.276871 0.009999 3.507033 +v -0.092290 0.009999 3.599324 +v 0.000000 0.009999 3.599324 +v 0.000000 0.009999 3.507033 +v -0.092290 0.009999 3.507033 +v -0.646033 0.009999 3.414743 +v -0.553742 0.009999 3.414743 +v -0.553742 0.009999 3.322453 +v -0.646033 0.009999 3.322453 +v -0.646033 0.009999 3.599324 +v -0.553742 0.009999 3.599324 +v -0.553742 0.009999 3.507033 +v -0.646033 0.009999 3.507033 +v -0.461452 0.009999 3.599324 +v -0.369161 0.009999 3.599324 +v -0.369161 0.009999 3.507033 +v -0.461452 0.009999 3.507033 +v -0.646033 0.009999 3.045582 +v -0.553742 0.009999 3.045582 +v -0.553742 0.009999 2.953291 +v -0.646033 0.009999 2.953291 +v -0.646033 0.009999 3.230163 +v -0.553742 0.009999 3.230163 +v -0.553742 0.009999 3.137872 +v -0.646033 0.009999 3.137872 +v -0.461452 0.009999 3.230163 +v -0.369161 0.009999 3.230163 +v -0.369161 0.009999 3.137872 +v -0.461452 0.009999 3.137872 +v -3.230163 0.010002 -5.445131 +v -3.137872 0.010002 -5.445131 +v -3.137872 0.010002 -5.537421 +v -3.230163 0.010002 -5.537421 +v -3.230163 0.010002 -5.260550 +v -3.137872 0.010002 -5.260550 +v -3.137872 0.010002 -5.352840 +v -3.230163 0.010002 -5.352840 +v -3.045582 0.010002 -5.260550 +v -2.953291 0.010002 -5.260550 +v -2.953291 0.010002 -5.352840 +v -3.045582 0.010002 -5.352840 +v -3.599324 0.010002 -5.445131 +v -3.507033 0.010002 -5.445131 +v -3.507033 0.010002 -5.537421 +v -3.599324 0.010002 -5.537421 +v -3.599324 0.010002 -5.260550 +v -3.507033 0.010002 -5.260550 +v -3.507033 0.010002 -5.352840 +v -3.599324 0.010002 -5.352840 +v -3.414743 0.010002 -5.260550 +v -3.322453 0.010002 -5.260550 +v -3.322453 0.010002 -5.352840 +v -3.414743 0.010002 -5.352840 +v -3.599324 0.010002 -5.814293 +v -3.507033 0.010002 -5.814293 +v -3.507033 0.010002 -5.906583 +v -3.599324 0.010002 -5.906583 +v -3.599324 0.010002 -5.629711 +v -3.507033 0.010002 -5.629711 +v -3.507033 0.010002 -5.722002 +v -3.599324 0.010002 -5.722002 +v -3.414743 0.010002 -5.629711 +v -3.322453 0.010002 -5.629711 +v -3.322453 0.010002 -5.722002 +v -3.414743 0.010002 -5.722002 +v -3.230163 0.010001 -2.491840 +v -3.137872 0.010001 -2.491840 +v -3.137872 0.010001 -2.584130 +v -3.230163 0.010001 -2.584130 +v -3.230163 0.010001 -2.307259 +v -3.137872 0.010001 -2.307259 +v -3.137872 0.010001 -2.399549 +v -3.230163 0.010001 -2.399549 +v -3.045582 0.010001 -2.307259 +v -2.953291 0.010001 -2.307259 +v -2.953291 0.010001 -2.399549 +v -3.045582 0.010001 -2.399549 +v -3.599324 0.010001 -2.491840 +v -3.507033 0.010001 -2.491840 +v -3.507033 0.010001 -2.584130 +v -3.599324 0.010001 -2.584130 +v -3.599324 0.010001 -2.307259 +v -3.507033 0.010001 -2.307259 +v -3.507033 0.010001 -2.399549 +v -3.599324 0.010001 -2.399549 +v -3.414743 0.010001 -2.307259 +v -3.322453 0.010001 -2.307259 +v -3.322453 0.010001 -2.399549 +v -3.414743 0.010001 -2.399549 +v -3.599324 0.010001 -2.861001 +v -3.507033 0.010001 -2.861001 +v -3.507033 0.010001 -2.953291 +v -3.599324 0.010001 -2.953291 +v -3.599324 0.010001 -2.676420 +v -3.507033 0.010001 -2.676420 +v -3.507033 0.010001 -2.768711 +v -3.599324 0.010001 -2.768711 +v -3.414743 0.010001 -2.676420 +v -3.322453 0.010001 -2.676420 +v -3.322453 0.010001 -2.768711 +v -3.414743 0.010001 -2.768711 +v -0.276871 0.010001 -2.491840 +v -0.184581 0.010001 -2.491840 +v -0.184581 0.010001 -2.584130 +v -0.276871 0.010001 -2.584130 +v -0.276871 0.010001 -2.307259 +v -0.184581 0.010001 -2.307259 +v -0.184581 0.010001 -2.399549 +v -0.276871 0.010001 -2.399549 +v -0.092290 0.010001 -2.307259 +v 0.000000 0.010001 -2.307259 +v 0.000000 0.010001 -2.399549 +v -0.092290 0.010001 -2.399549 +v -0.646033 0.010001 -2.491840 +v -0.553742 0.010001 -2.491840 +v -0.553742 0.010001 -2.584130 +v -0.646033 0.010001 -2.584130 +v -0.646033 0.010001 -2.307259 +v -0.553742 0.010001 -2.307259 +v -0.553742 0.010001 -2.399549 +v -0.646033 0.010001 -2.399549 +v -0.461452 0.010001 -2.307259 +v -0.369161 0.010001 -2.307259 +v -0.369161 0.010001 -2.399549 +v -0.461452 0.010001 -2.399549 +v -0.646033 0.010001 -2.861001 +v -0.553742 0.010001 -2.861001 +v -0.553742 0.010001 -2.953291 +v -0.646033 0.010001 -2.953291 +v -0.646033 0.010001 -2.676420 +v -0.553742 0.010001 -2.676420 +v -0.553742 0.010001 -2.768711 +v -0.646033 0.010001 -2.768711 +v -0.461452 0.010001 -2.676420 +v -0.369161 0.010001 -2.676420 +v -0.369161 0.010001 -2.768711 +v -0.461452 0.010001 -2.768711 +v 2.676420 0.010002 -5.445131 +v 2.768711 0.010002 -5.445131 +v 2.768711 0.010002 -5.537421 +v 2.676420 0.010002 -5.537421 +v 2.676420 0.010002 -5.260550 +v 2.768711 0.010002 -5.260550 +v 2.768711 0.010002 -5.352840 +v 2.676420 0.010002 -5.352840 +v 2.861001 0.010002 -5.260550 +v 2.953291 0.010002 -5.260550 +v 2.953291 0.010002 -5.352840 +v 2.861001 0.010002 -5.352840 +v 2.307259 0.010002 -5.445131 +v 2.399549 0.010002 -5.445131 +v 2.399549 0.010002 -5.537421 +v 2.307259 0.010002 -5.537421 +v 2.307259 0.010002 -5.260550 +v 2.399549 0.010002 -5.260550 +v 2.399549 0.010002 -5.352840 +v 2.307259 0.010002 -5.352840 +v 2.491840 0.010002 -5.260550 +v 2.584130 0.010002 -5.260550 +v 2.584130 0.010002 -5.352840 +v 2.491840 0.010002 -5.352840 +v 2.307259 0.010002 -5.814293 +v 2.399549 0.010002 -5.814293 +v 2.399549 0.010002 -5.906583 +v 2.307259 0.010002 -5.906583 +v 2.307259 0.010002 -5.629711 +v 2.399549 0.010002 -5.629711 +v 2.399549 0.010002 -5.722002 +v 2.307259 0.010002 -5.722002 +v 2.491840 0.010002 -5.629711 +v 2.584130 0.010002 -5.629711 +v 2.584130 0.010002 -5.722002 +v 2.491840 0.010002 -5.722002 +v 2.676420 0.010001 -2.491840 +v 2.768711 0.010001 -2.491840 +v 2.768711 0.010001 -2.584130 +v 2.676420 0.010001 -2.584130 +v 2.676420 0.010001 -2.307259 +v 2.768711 0.010001 -2.307259 +v 2.768711 0.010001 -2.399549 +v 2.676420 0.010001 -2.399549 +v 2.861001 0.010001 -2.307259 +v 2.953291 0.010001 -2.307259 +v 2.953291 0.010001 -2.399549 +v 2.861001 0.010001 -2.399549 +v 2.307259 0.010001 -2.491840 +v 2.399549 0.010001 -2.491840 +v 2.399549 0.010001 -2.584130 +v 2.307259 0.010001 -2.584130 +v 2.307259 0.010001 -2.307259 +v 2.399549 0.010001 -2.307259 +v 2.399549 0.010001 -2.399549 +v 2.307259 0.010001 -2.399549 +v 2.491840 0.010001 -2.307259 +v 2.584130 0.010001 -2.307259 +v 2.584130 0.010001 -2.399549 +v 2.491840 0.010001 -2.399549 +v 2.307259 0.010001 -2.861001 +v 2.399549 0.010001 -2.861001 +v 2.399549 0.010001 -2.953291 +v 2.307259 0.010001 -2.953291 +v 2.307259 0.010001 -2.676420 +v 2.399549 0.010001 -2.676420 +v 2.399549 0.010001 -2.768711 +v 2.307259 0.010001 -2.768711 +v 2.491840 0.010001 -2.676420 +v 2.584130 0.010001 -2.676420 +v 2.584130 0.010001 -2.768711 +v 2.491840 0.010001 -2.768711 +v 5.629711 0.010001 -2.491840 +v 5.722002 0.010001 -2.491840 +v 5.722002 0.010001 -2.584130 +v 5.629711 0.010001 -2.584130 +v 5.629711 0.010001 -2.307259 +v 5.722002 0.010001 -2.307259 +v 5.722002 0.010001 -2.399549 +v 5.629711 0.010001 -2.399549 +v 5.814293 0.010001 -2.307259 +v 5.906583 0.010001 -2.307259 +v 5.906583 0.010001 -2.399549 +v 5.814293 0.010001 -2.399549 +v 5.260550 0.010001 -2.491840 +v 5.352840 0.010001 -2.491840 +v 5.352840 0.010001 -2.584130 +v 5.260550 0.010001 -2.584130 +v 5.260550 0.010001 -2.307259 +v 5.352840 0.010001 -2.307259 +v 5.352840 0.010001 -2.399549 +v 5.260550 0.010001 -2.399549 +v 5.445131 0.010001 -2.307259 +v 5.537421 0.010001 -2.307259 +v 5.537421 0.010001 -2.399549 +v 5.445131 0.010001 -2.399549 +v 5.260550 0.010001 -2.861001 +v 5.352840 0.010001 -2.861001 +v 5.352840 0.010001 -2.953291 +v 5.260550 0.010001 -2.953291 +v 5.260550 0.010001 -2.676420 +v 5.352840 0.010001 -2.676420 +v 5.352840 0.010001 -2.768711 +v 5.260550 0.010001 -2.768711 +v 5.445131 0.010001 -2.676420 +v 5.537421 0.010001 -2.676420 +v 5.537421 0.010001 -2.768711 +v 5.445131 0.010001 -2.768711 +v 4.153066 0.010001 -2.491840 +v 4.245357 0.010001 -2.491840 +v 4.245357 0.010001 -2.584130 +v 4.153066 0.010001 -2.584130 +v 4.153066 0.010001 -2.307259 +v 4.245357 0.010001 -2.307259 +v 4.245357 0.010001 -2.399549 +v 4.153066 0.010001 -2.399549 +v 4.337647 0.010001 -2.307259 +v 4.429937 0.010001 -2.307259 +v 4.429937 0.010001 -2.399549 +v 4.337647 0.010001 -2.399549 +v 3.783905 0.010001 -2.491840 +v 3.876195 0.010001 -2.491840 +v 3.876195 0.010001 -2.584130 +v 3.783905 0.010001 -2.584130 +v 3.783905 0.010001 -2.307259 +v 3.876195 0.010001 -2.307259 +v 3.876195 0.010001 -2.399549 +v 3.783905 0.010001 -2.399549 +v 3.968485 0.010001 -2.307259 +v 4.060776 0.010001 -2.307259 +v 4.060776 0.010001 -2.399549 +v 3.968485 0.010001 -2.399549 +v 3.783905 0.010001 -2.861001 +v 3.876195 0.010001 -2.861001 +v 3.876195 0.010001 -2.953291 +v 3.783905 0.010001 -2.953291 +v 3.783905 0.010001 -2.676420 +v 3.876195 0.010001 -2.676420 +v 3.876195 0.010001 -2.768711 +v 3.783905 0.010001 -2.768711 +v 3.968485 0.010001 -2.676420 +v 4.060776 0.010001 -2.676420 +v 4.060776 0.010001 -2.768711 +v 3.968485 0.010001 -2.768711 +v 4.153066 0.010000 -1.015194 +v 4.245357 0.010000 -1.015194 +v 4.245357 0.010000 -1.107484 +v 4.153066 0.010000 -1.107484 +v 4.153066 0.010000 -0.830613 +v 4.245357 0.010000 -0.830613 +v 4.245357 0.010000 -0.922904 +v 4.153066 0.010000 -0.922904 +v 4.337647 0.010000 -0.830613 +v 4.429937 0.010000 -0.830613 +v 4.429937 0.010000 -0.922904 +v 4.337647 0.010000 -0.922904 +v 3.783905 0.010000 -1.015194 +v 3.876195 0.010000 -1.015194 +v 3.876195 0.010000 -1.107484 +v 3.783905 0.010000 -1.107484 +v 3.783905 0.010000 -0.830613 +v 3.876195 0.010000 -0.830613 +v 3.876195 0.010000 -0.922904 +v 3.783905 0.010000 -0.922904 +v 3.968485 0.010000 -0.830613 +v 4.060776 0.010000 -0.830613 +v 4.060776 0.010000 -0.922904 +v 3.968485 0.010000 -0.922904 +v 3.783905 0.010001 -1.384355 +v 3.876195 0.010001 -1.384355 +v 3.876195 0.010001 -1.476646 +v 3.783905 0.010001 -1.476646 +v 3.783905 0.010000 -1.199775 +v 3.876195 0.010000 -1.199775 +v 3.876195 0.010001 -1.292065 +v 3.783905 0.010001 -1.292065 +v 3.968485 0.010000 -1.199775 +v 4.060776 0.010000 -1.199775 +v 4.060776 0.010001 -1.292065 +v 3.968485 0.010001 -1.292065 +v 5.629711 0.010000 -1.015194 +v 5.722002 0.010000 -1.015194 +v 5.722002 0.010000 -1.107484 +v 5.629711 0.010000 -1.107484 +v 5.629711 0.010000 -0.830613 +v 5.722002 0.010000 -0.830613 +v 5.722002 0.010000 -0.922904 +v 5.629711 0.010000 -0.922904 +v 5.814293 0.010000 -0.830613 +v 5.906583 0.010000 -0.830613 +v 5.906583 0.010000 -0.922904 +v 5.814293 0.010000 -0.922904 +v 5.260550 0.010000 -1.015194 +v 5.352840 0.010000 -1.015194 +v 5.352840 0.010000 -1.107484 +v 5.260550 0.010000 -1.107484 +v 5.260550 0.010000 -0.830613 +v 5.352840 0.010000 -0.830613 +v 5.352840 0.010000 -0.922904 +v 5.260550 0.010000 -0.922904 +v 5.445131 0.010000 -0.830613 +v 5.537421 0.010000 -0.830613 +v 5.537421 0.010000 -0.922904 +v 5.445131 0.010000 -0.922904 +v 5.260550 0.010001 -1.384355 +v 5.352840 0.010001 -1.384355 +v 5.352840 0.010001 -1.476646 +v 5.260550 0.010001 -1.476646 +v 5.260550 0.010000 -1.199775 +v 5.352840 0.010000 -1.199775 +v 5.352840 0.010001 -1.292065 +v 5.260550 0.010001 -1.292065 +v 5.445131 0.010000 -1.199775 +v 5.537421 0.010000 -1.199775 +v 5.537421 0.010001 -1.292065 +v 5.445131 0.010001 -1.292065 +v 1.199775 0.010001 -2.491840 +v 1.292065 0.010001 -2.491840 +v 1.292065 0.010001 -2.584130 +v 1.199775 0.010001 -2.584130 +v 1.199775 0.010001 -2.307259 +v 1.292065 0.010001 -2.307259 +v 1.292065 0.010001 -2.399549 +v 1.199775 0.010001 -2.399549 +v 1.384355 0.010001 -2.307259 +v 1.476646 0.010001 -2.307259 +v 1.476646 0.010001 -2.399549 +v 1.384355 0.010001 -2.399549 +v 0.830613 0.010001 -2.491840 +v 0.922904 0.010001 -2.491840 +v 0.922904 0.010001 -2.584130 +v 0.830613 0.010001 -2.584130 +v 0.830613 0.010001 -2.307259 +v 0.922904 0.010001 -2.307259 +v 0.922904 0.010001 -2.399549 +v 0.830613 0.010001 -2.399549 +v 1.015194 0.010001 -2.307259 +v 1.107484 0.010001 -2.307259 +v 1.107484 0.010001 -2.399549 +v 1.015194 0.010001 -2.399549 +v 0.830613 0.010001 -2.861001 +v 0.922904 0.010001 -2.861001 +v 0.922904 0.010001 -2.953291 +v 0.830613 0.010001 -2.953291 +v 0.830613 0.010001 -2.676420 +v 0.922904 0.010001 -2.676420 +v 0.922904 0.010001 -2.768711 +v 0.830613 0.010001 -2.768711 +v 1.015194 0.010001 -2.676420 +v 1.107484 0.010001 -2.676420 +v 1.107484 0.010001 -2.768711 +v 1.015194 0.010001 -2.768711 +v 1.199775 0.010000 -1.015194 +v 1.292065 0.010000 -1.015194 +v 1.292065 0.010000 -1.107484 +v 1.199775 0.010000 -1.107484 +v 1.199775 0.010000 -0.830613 +v 1.292065 0.010000 -0.830613 +v 1.292065 0.010000 -0.922904 +v 1.199775 0.010000 -0.922904 +v 1.384355 0.010000 -0.830613 +v 1.476646 0.010000 -0.830613 +v 1.476646 0.010000 -0.922904 +v 1.384355 0.010000 -0.922904 +v 0.830613 0.010000 -1.015194 +v 0.922904 0.010000 -1.015194 +v 0.922904 0.010000 -1.107484 +v 0.830613 0.010000 -1.107484 +v 0.830613 0.010000 -0.830613 +v 0.922904 0.010000 -0.830613 +v 0.922904 0.010000 -0.922904 +v 0.830613 0.010000 -0.922904 +v 1.015194 0.010000 -0.830613 +v 1.107484 0.010000 -0.830613 +v 1.107484 0.010000 -0.922904 +v 1.015194 0.010000 -0.922904 +v 0.830613 0.010001 -1.384355 +v 0.922904 0.010001 -1.384355 +v 0.922904 0.010001 -1.476646 +v 0.830613 0.010001 -1.476646 +v 0.830613 0.010000 -1.199775 +v 0.922904 0.010000 -1.199775 +v 0.922904 0.010001 -1.292065 +v 0.830613 0.010001 -1.292065 +v 1.015194 0.010000 -1.199775 +v 1.107484 0.010000 -1.199775 +v 1.107484 0.010001 -1.292065 +v 1.015194 0.010001 -1.292065 +v 2.676420 0.010000 -1.015194 +v 2.768711 0.010000 -1.015194 +v 2.768711 0.010000 -1.107484 +v 2.676420 0.010000 -1.107484 +v 2.676420 0.010000 -0.830613 +v 2.768711 0.010000 -0.830613 +v 2.768711 0.010000 -0.922904 +v 2.676420 0.010000 -0.922904 +v 2.861001 0.010000 -0.830613 +v 2.953291 0.010000 -0.830613 +v 2.953291 0.010000 -0.922904 +v 2.861001 0.010000 -0.922904 +v 2.307259 0.010000 -1.015194 +v 2.399549 0.010000 -1.015194 +v 2.399549 0.010000 -1.107484 +v 2.307259 0.010000 -1.107484 +v 2.307259 0.010000 -0.830613 +v 2.399549 0.010000 -0.830613 +v 2.399549 0.010000 -0.922904 +v 2.307259 0.010000 -0.922904 +v 2.491840 0.010000 -0.830613 +v 2.584130 0.010000 -0.830613 +v 2.584130 0.010000 -0.922904 +v 2.491840 0.010000 -0.922904 +v 2.307259 0.010001 -1.384355 +v 2.399549 0.010001 -1.384355 +v 2.399549 0.010001 -1.476646 +v 2.307259 0.010001 -1.476646 +v 2.307259 0.010000 -1.199775 +v 2.399549 0.010000 -1.199775 +v 2.399549 0.010001 -1.292065 +v 2.307259 0.010001 -1.292065 +v 2.491840 0.010000 -1.199775 +v 2.584130 0.010000 -1.199775 +v 2.584130 0.010001 -1.292065 +v 2.491840 0.010001 -1.292065 +v 1.199775 0.010002 -5.445131 +v 1.292065 0.010002 -5.445131 +v 1.292065 0.010002 -5.537421 +v 1.199775 0.010002 -5.537421 +v 1.199775 0.010002 -5.260550 +v 1.292065 0.010002 -5.260550 +v 1.292065 0.010002 -5.352840 +v 1.199775 0.010002 -5.352840 +v 1.384355 0.010002 -5.260550 +v 1.476646 0.010002 -5.260550 +v 1.476646 0.010002 -5.352840 +v 1.384355 0.010002 -5.352840 +v 0.830613 0.010002 -5.445131 +v 0.922904 0.010002 -5.445131 +v 0.922904 0.010002 -5.537421 +v 0.830613 0.010002 -5.537421 +v 0.830613 0.010002 -5.260550 +v 0.922904 0.010002 -5.260550 +v 0.922904 0.010002 -5.352840 +v 0.830613 0.010002 -5.352840 +v 1.015194 0.010002 -5.260550 +v 1.107484 0.010002 -5.260550 +v 1.107484 0.010002 -5.352840 +v 1.015194 0.010002 -5.352840 +v 0.830613 0.010002 -5.814293 +v 0.922904 0.010002 -5.814293 +v 0.922904 0.010002 -5.906583 +v 0.830613 0.010002 -5.906583 +v 0.830613 0.010002 -5.629711 +v 0.922904 0.010002 -5.629711 +v 0.922904 0.010002 -5.722002 +v 0.830613 0.010002 -5.722002 +v 1.015194 0.010002 -5.629711 +v 1.107484 0.010002 -5.629711 +v 1.107484 0.010002 -5.722002 +v 1.015194 0.010002 -5.722002 +v 1.199775 0.010002 -3.968485 +v 1.292065 0.010002 -3.968485 +v 1.292065 0.010002 -4.060776 +v 1.199775 0.010002 -4.060776 +v 1.199775 0.010002 -3.783905 +v 1.292065 0.010002 -3.783905 +v 1.292065 0.010002 -3.876195 +v 1.199775 0.010002 -3.876195 +v 1.384355 0.010002 -3.783905 +v 1.476646 0.010002 -3.783905 +v 1.476646 0.010002 -3.876195 +v 1.384355 0.010002 -3.876195 +v 0.830613 0.010002 -3.968485 +v 0.922904 0.010002 -3.968485 +v 0.922904 0.010002 -4.060776 +v 0.830613 0.010002 -4.060776 +v 0.830613 0.010002 -3.783905 +v 0.922904 0.010002 -3.783905 +v 0.922904 0.010002 -3.876195 +v 0.830613 0.010002 -3.876195 +v 1.015194 0.010002 -3.783905 +v 1.107484 0.010002 -3.783905 +v 1.107484 0.010002 -3.876195 +v 1.015194 0.010002 -3.876195 +v 0.830613 0.010002 -4.337647 +v 0.922904 0.010002 -4.337647 +v 0.922904 0.010002 -4.429937 +v 0.830613 0.010002 -4.429937 +v 0.830613 0.010002 -4.153066 +v 0.922904 0.010002 -4.153066 +v 0.922904 0.010002 -4.245357 +v 0.830613 0.010002 -4.245357 +v 1.015194 0.010002 -4.153066 +v 1.107484 0.010002 -4.153066 +v 1.107484 0.010002 -4.245357 +v 1.015194 0.010002 -4.245357 +v 2.676420 0.010002 -3.968485 +v 2.768711 0.010002 -3.968485 +v 2.768711 0.010002 -4.060776 +v 2.676420 0.010002 -4.060776 +v 2.676420 0.010002 -3.783905 +v 2.768711 0.010002 -3.783905 +v 2.768711 0.010002 -3.876195 +v 2.676420 0.010002 -3.876195 +v 2.861001 0.010002 -3.783905 +v 2.953291 0.010002 -3.783905 +v 2.953291 0.010002 -3.876195 +v 2.861001 0.010002 -3.876195 +v 2.307259 0.010002 -3.968485 +v 2.399549 0.010002 -3.968485 +v 2.399549 0.010002 -4.060776 +v 2.307259 0.010002 -4.060776 +v 2.307259 0.010002 -3.783905 +v 2.399549 0.010002 -3.783905 +v 2.399549 0.010002 -3.876195 +v 2.307259 0.010002 -3.876195 +v 2.491840 0.010002 -3.783905 +v 2.584130 0.010002 -3.783905 +v 2.584130 0.010002 -3.876195 +v 2.491840 0.010002 -3.876195 +v 2.307259 0.010002 -4.337647 +v 2.399549 0.010002 -4.337647 +v 2.399549 0.010002 -4.429937 +v 2.307259 0.010002 -4.429937 +v 2.307259 0.010002 -4.153066 +v 2.399549 0.010002 -4.153066 +v 2.399549 0.010002 -4.245357 +v 2.307259 0.010002 -4.245357 +v 2.491840 0.010002 -4.153066 +v 2.584130 0.010002 -4.153066 +v 2.584130 0.010002 -4.245357 +v 2.491840 0.010002 -4.245357 +v -1.753517 0.010001 -2.491840 +v -1.661226 0.010001 -2.491840 +v -1.661226 0.010001 -2.584130 +v -1.753517 0.010001 -2.584130 +v -1.753517 0.010001 -2.307259 +v -1.661226 0.010001 -2.307259 +v -1.661226 0.010001 -2.399549 +v -1.753517 0.010001 -2.399549 +v -1.568936 0.010001 -2.307259 +v -1.476646 0.010001 -2.307259 +v -1.476646 0.010001 -2.399549 +v -1.568936 0.010001 -2.399549 +v -2.122678 0.010001 -2.491840 +v -2.030388 0.010001 -2.491840 +v -2.030388 0.010001 -2.584130 +v -2.122678 0.010001 -2.584130 +v -2.122678 0.010001 -2.307259 +v -2.030388 0.010001 -2.307259 +v -2.030388 0.010001 -2.399549 +v -2.122678 0.010001 -2.399549 +v -1.938097 0.010001 -2.307259 +v -1.845807 0.010001 -2.307259 +v -1.845807 0.010001 -2.399549 +v -1.938097 0.010001 -2.399549 +v -2.122678 0.010001 -2.861001 +v -2.030388 0.010001 -2.861001 +v -2.030388 0.010001 -2.953291 +v -2.122678 0.010001 -2.953291 +v -2.122678 0.010001 -2.676420 +v -2.030388 0.010001 -2.676420 +v -2.030388 0.010001 -2.768711 +v -2.122678 0.010001 -2.768711 +v -1.938097 0.010001 -2.676420 +v -1.845807 0.010001 -2.676420 +v -1.845807 0.010001 -2.768711 +v -1.938097 0.010001 -2.768711 +v -1.753517 0.010000 -1.015194 +v -1.661226 0.010000 -1.015194 +v -1.661226 0.010000 -1.107484 +v -1.753517 0.010000 -1.107484 +v -1.753517 0.010000 -0.830613 +v -1.661226 0.010000 -0.830613 +v -1.661226 0.010000 -0.922904 +v -1.753517 0.010000 -0.922904 +v -1.568936 0.010000 -0.830613 +v -1.476646 0.010000 -0.830613 +v -1.476646 0.010000 -0.922904 +v -1.568936 0.010000 -0.922904 +v -2.122678 0.010000 -1.015194 +v -2.030388 0.010000 -1.015194 +v -2.030388 0.010000 -1.107484 +v -2.122678 0.010000 -1.107484 +v -2.122678 0.010000 -0.830613 +v -2.030388 0.010000 -0.830613 +v -2.030388 0.010000 -0.922904 +v -2.122678 0.010000 -0.922904 +v -1.938097 0.010000 -0.830613 +v -1.845807 0.010000 -0.830613 +v -1.845807 0.010000 -0.922904 +v -1.938097 0.010000 -0.922904 +v -2.122678 0.010001 -1.384355 +v -2.030388 0.010001 -1.384355 +v -2.030388 0.010001 -1.476646 +v -2.122678 0.010001 -1.476646 +v -2.122678 0.010000 -1.199775 +v -2.030388 0.010000 -1.199775 +v -2.030388 0.010001 -1.292065 +v -2.122678 0.010001 -1.292065 +v -1.938097 0.010000 -1.199775 +v -1.845807 0.010000 -1.199775 +v -1.845807 0.010001 -1.292065 +v -1.938097 0.010001 -1.292065 +v -0.276871 0.010000 -1.015194 +v -0.184581 0.010000 -1.015194 +v -0.184581 0.010000 -1.107484 +v -0.276871 0.010000 -1.107484 +v -0.276871 0.010000 -0.830613 +v -0.184581 0.010000 -0.830613 +v -0.184581 0.010000 -0.922904 +v -0.276871 0.010000 -0.922904 +v -0.092290 0.010000 -0.830613 +v 0.000000 0.010000 -0.830613 +v 0.000000 0.010000 -0.922904 +v -0.092290 0.010000 -0.922904 +v -0.646033 0.010000 -1.015194 +v -0.553742 0.010000 -1.015194 +v -0.553742 0.010000 -1.107484 +v -0.646033 0.010000 -1.107484 +v -0.646033 0.010000 -0.830613 +v -0.553742 0.010000 -0.830613 +v -0.553742 0.010000 -0.922904 +v -0.646033 0.010000 -0.922904 +v -0.461452 0.010000 -0.830613 +v -0.369161 0.010000 -0.830613 +v -0.369161 0.010000 -0.922904 +v -0.461452 0.010000 -0.922904 +v -0.646033 0.010001 -1.384355 +v -0.553742 0.010001 -1.384355 +v -0.553742 0.010001 -1.476646 +v -0.646033 0.010001 -1.476646 +v -0.646033 0.010000 -1.199775 +v -0.553742 0.010000 -1.199775 +v -0.553742 0.010001 -1.292065 +v -0.646033 0.010001 -1.292065 +v -0.461452 0.010000 -1.199775 +v -0.369161 0.010000 -1.199775 +v -0.369161 0.010001 -1.292065 +v -0.461452 0.010001 -1.292065 +v -4.706808 0.010001 -2.491840 +v -4.614518 0.010001 -2.491840 +v -4.614518 0.010001 -2.584130 +v -4.706808 0.010001 -2.584130 +v -4.706808 0.010001 -2.307259 +v -4.614518 0.010001 -2.307259 +v -4.614518 0.010001 -2.399549 +v -4.706808 0.010001 -2.399549 +v -4.522227 0.010001 -2.307259 +v -4.429937 0.010001 -2.307259 +v -4.429937 0.010001 -2.399549 +v -4.522227 0.010001 -2.399549 +v -5.075970 0.010001 -2.491840 +v -4.983679 0.010001 -2.491840 +v -4.983679 0.010001 -2.584130 +v -5.075970 0.010001 -2.584130 +v -5.075970 0.010001 -2.307259 +v -4.983679 0.010001 -2.307259 +v -4.983679 0.010001 -2.399549 +v -5.075970 0.010001 -2.399549 +v -4.891389 0.010001 -2.307259 +v -4.799098 0.010001 -2.307259 +v -4.799098 0.010001 -2.399549 +v -4.891389 0.010001 -2.399549 +v -5.075970 0.010001 -2.861001 +v -4.983679 0.010001 -2.861001 +v -4.983679 0.010001 -2.953291 +v -5.075970 0.010001 -2.953291 +v -5.075970 0.010001 -2.676420 +v -4.983679 0.010001 -2.676420 +v -4.983679 0.010001 -2.768711 +v -5.075970 0.010001 -2.768711 +v -4.891389 0.010001 -2.676420 +v -4.799098 0.010001 -2.676420 +v -4.799098 0.010001 -2.768711 +v -4.891389 0.010001 -2.768711 +v -4.706808 0.010000 -1.015194 +v -4.614518 0.010000 -1.015194 +v -4.614518 0.010000 -1.107484 +v -4.706808 0.010000 -1.107484 +v -4.706808 0.010000 -0.830613 +v -4.614518 0.010000 -0.830613 +v -4.614518 0.010000 -0.922904 +v -4.706808 0.010000 -0.922904 +v -4.522227 0.010000 -0.830613 +v -4.429937 0.010000 -0.830613 +v -4.429937 0.010000 -0.922904 +v -4.522227 0.010000 -0.922904 +v -5.075970 0.010000 -1.015194 +v -4.983679 0.010000 -1.015194 +v -4.983679 0.010000 -1.107484 +v -5.075970 0.010000 -1.107484 +v -5.075970 0.010000 -0.830613 +v -4.983679 0.010000 -0.830613 +v -4.983679 0.010000 -0.922904 +v -5.075970 0.010000 -0.922904 +v -4.891389 0.010000 -0.830613 +v -4.799098 0.010000 -0.830613 +v -4.799098 0.010000 -0.922904 +v -4.891389 0.010000 -0.922904 +v -5.075970 0.010001 -1.384355 +v -4.983679 0.010001 -1.384355 +v -4.983679 0.010001 -1.476646 +v -5.075970 0.010001 -1.476646 +v -5.075970 0.010000 -1.199775 +v -4.983679 0.010000 -1.199775 +v -4.983679 0.010001 -1.292065 +v -5.075970 0.010001 -1.292065 +v -4.891389 0.010000 -1.199775 +v -4.799098 0.010000 -1.199775 +v -4.799098 0.010001 -1.292065 +v -4.891389 0.010001 -1.292065 +v -3.230163 0.010000 -1.015194 +v -3.137872 0.010000 -1.015194 +v -3.137872 0.010000 -1.107484 +v -3.230163 0.010000 -1.107484 +v -3.230163 0.010000 -0.830613 +v -3.137872 0.010000 -0.830613 +v -3.137872 0.010000 -0.922904 +v -3.230163 0.010000 -0.922904 +v -3.045582 0.010000 -0.830613 +v -2.953291 0.010000 -0.830613 +v -2.953291 0.010000 -0.922904 +v -3.045582 0.010000 -0.922904 +v -3.599324 0.010000 -1.015194 +v -3.507033 0.010000 -1.015194 +v -3.507033 0.010000 -1.107484 +v -3.599324 0.010000 -1.107484 +v -3.599324 0.010000 -0.830613 +v -3.507033 0.010000 -0.830613 +v -3.507033 0.010000 -0.922904 +v -3.599324 0.010000 -0.922904 +v -3.414743 0.010000 -0.830613 +v -3.322453 0.010000 -0.830613 +v -3.322453 0.010000 -0.922904 +v -3.414743 0.010000 -0.922904 +v -3.599324 0.010001 -1.384355 +v -3.507033 0.010001 -1.384355 +v -3.507033 0.010001 -1.476646 +v -3.599324 0.010001 -1.476646 +v -3.599324 0.010000 -1.199775 +v -3.507033 0.010000 -1.199775 +v -3.507033 0.010001 -1.292065 +v -3.599324 0.010001 -1.292065 +v -3.414743 0.010000 -1.199775 +v -3.322453 0.010000 -1.199775 +v -3.322453 0.010001 -1.292065 +v -3.414743 0.010001 -1.292065 +v -4.706808 0.010002 -5.445131 +v -4.614518 0.010002 -5.445131 +v -4.614518 0.010002 -5.537421 +v -4.706808 0.010002 -5.537421 +v -4.706808 0.010002 -5.260550 +v -4.614518 0.010002 -5.260550 +v -4.614518 0.010002 -5.352840 +v -4.706808 0.010002 -5.352840 +v -4.522227 0.010002 -5.260550 +v -4.429937 0.010002 -5.260550 +v -4.429937 0.010002 -5.352840 +v -4.522227 0.010002 -5.352840 +v -5.075970 0.010002 -5.445131 +v -4.983679 0.010002 -5.445131 +v -4.983679 0.010002 -5.537421 +v -5.075970 0.010002 -5.537421 +v -5.075970 0.010002 -5.260550 +v -4.983679 0.010002 -5.260550 +v -4.983679 0.010002 -5.352840 +v -5.075970 0.010002 -5.352840 +v -4.891389 0.010002 -5.260550 +v -4.799098 0.010002 -5.260550 +v -4.799098 0.010002 -5.352840 +v -4.891389 0.010002 -5.352840 +v -5.075970 0.010002 -5.814293 +v -4.983679 0.010002 -5.814293 +v -4.983679 0.010002 -5.906583 +v -5.075970 0.010002 -5.906583 +v -5.075970 0.010002 -5.629711 +v -4.983679 0.010002 -5.629711 +v -4.983679 0.010002 -5.722002 +v -5.075970 0.010002 -5.722002 +v -4.891389 0.010002 -5.629711 +v -4.799098 0.010002 -5.629711 +v -4.799098 0.010002 -5.722002 +v -4.891389 0.010002 -5.722002 +v -4.706808 0.010002 -3.968485 +v -4.614518 0.010002 -3.968485 +v -4.614518 0.010002 -4.060776 +v -4.706808 0.010002 -4.060776 +v -4.706808 0.010002 -3.783905 +v -4.614518 0.010002 -3.783905 +v -4.614518 0.010002 -3.876195 +v -4.706808 0.010002 -3.876195 +v -4.522227 0.010002 -3.783905 +v -4.429937 0.010002 -3.783905 +v -4.429937 0.010002 -3.876195 +v -4.522227 0.010002 -3.876195 +v -5.075970 0.010002 -3.968485 +v -4.983679 0.010002 -3.968485 +v -4.983679 0.010002 -4.060776 +v -5.075970 0.010002 -4.060776 +v -5.075970 0.010002 -3.783905 +v -4.983679 0.010002 -3.783905 +v -4.983679 0.010002 -3.876195 +v -5.075970 0.010002 -3.876195 +v -4.891389 0.010002 -3.783905 +v -4.799098 0.010002 -3.783905 +v -4.799098 0.010002 -3.876195 +v -4.891389 0.010002 -3.876195 +v -5.075970 0.010002 -4.337647 +v -4.983679 0.010002 -4.337647 +v -4.983679 0.010002 -4.429937 +v -5.075970 0.010002 -4.429937 +v -5.075970 0.010002 -4.153066 +v -4.983679 0.010002 -4.153066 +v -4.983679 0.010002 -4.245357 +v -5.075970 0.010002 -4.245357 +v -4.891389 0.010002 -4.153066 +v -4.799098 0.010002 -4.153066 +v -4.799098 0.010002 -4.245357 +v -4.891389 0.010002 -4.245357 +v -3.230163 0.010002 -3.968485 +v -3.137872 0.010002 -3.968485 +v -3.137872 0.010002 -4.060776 +v -3.230163 0.010002 -4.060776 +v -3.230163 0.010002 -3.783905 +v -3.137872 0.010002 -3.783905 +v -3.137872 0.010002 -3.876195 +v -3.230163 0.010002 -3.876195 +v -3.045582 0.010002 -3.783905 +v -2.953291 0.010002 -3.783905 +v -2.953291 0.010002 -3.876195 +v -3.045582 0.010002 -3.876195 +v -3.599324 0.010002 -3.968485 +v -3.507033 0.010002 -3.968485 +v -3.507033 0.010002 -4.060776 +v -3.599324 0.010002 -4.060776 +v -3.599324 0.010002 -3.783905 +v -3.507033 0.010002 -3.783905 +v -3.507033 0.010002 -3.876195 +v -3.599324 0.010002 -3.876195 +v -3.414743 0.010002 -3.783905 +v -3.322453 0.010002 -3.783905 +v -3.322453 0.010002 -3.876195 +v -3.414743 0.010002 -3.876195 +v -3.599324 0.010002 -4.337647 +v -3.507033 0.010002 -4.337647 +v -3.507033 0.010002 -4.429937 +v -3.599324 0.010002 -4.429937 +v -3.599324 0.010002 -4.153066 +v -3.507033 0.010002 -4.153066 +v -3.507033 0.010002 -4.245357 +v -3.599324 0.010002 -4.245357 +v -3.414743 0.010002 -4.153066 +v -3.322453 0.010002 -4.153066 +v -3.322453 0.010002 -4.245357 +v -3.414743 0.010002 -4.245357 +v -1.753517 0.009999 3.414743 +v -1.661226 0.009999 3.414743 +v -1.661226 0.009999 3.322453 +v -1.753517 0.009999 3.322453 +v -1.753517 0.009999 3.599324 +v -1.661226 0.009999 3.599324 +v -1.661226 0.009999 3.507033 +v -1.753517 0.009999 3.507033 +v -1.568936 0.009999 3.599324 +v -1.476646 0.009999 3.599324 +v -1.476646 0.009999 3.507033 +v -1.568936 0.009999 3.507033 +v -2.122678 0.009999 3.414743 +v -2.030388 0.009999 3.414743 +v -2.030388 0.009999 3.322453 +v -2.122678 0.009999 3.322453 +v -2.122678 0.009999 3.599324 +v -2.030388 0.009999 3.599324 +v -2.030388 0.009999 3.507033 +v -2.122678 0.009999 3.507033 +v -1.938097 0.009999 3.599324 +v -1.845807 0.009999 3.599324 +v -1.845807 0.009999 3.507033 +v -1.938097 0.009999 3.507033 +v -2.122678 0.009999 3.045582 +v -2.030388 0.009999 3.045582 +v -2.030388 0.009999 2.953291 +v -2.122678 0.009999 2.953291 +v -2.122678 0.009999 3.230163 +v -2.030388 0.009999 3.230163 +v -2.030388 0.009999 3.137872 +v -2.122678 0.009999 3.137872 +v -1.938097 0.009999 3.230163 +v -1.845807 0.009999 3.230163 +v -1.845807 0.009999 3.137872 +v -1.938097 0.009999 3.137872 +v -1.753517 0.009998 4.891389 +v -1.661226 0.009998 4.891389 +v -1.661226 0.009998 4.799098 +v -1.753517 0.009998 4.799098 +v -1.753517 0.009998 5.075970 +v -1.661226 0.009998 5.075970 +v -1.661226 0.009998 4.983679 +v -1.753517 0.009998 4.983679 +v -1.568936 0.009998 5.075970 +v -1.476646 0.009998 5.075970 +v -1.476646 0.009998 4.983679 +v -1.568936 0.009998 4.983679 +v -2.122678 0.009998 4.891389 +v -2.030388 0.009998 4.891389 +v -2.030388 0.009998 4.799098 +v -2.122678 0.009998 4.799098 +v -2.122678 0.009998 5.075970 +v -2.030388 0.009998 5.075970 +v -2.030388 0.009998 4.983679 +v -2.122678 0.009998 4.983679 +v -1.938097 0.009998 5.075970 +v -1.845807 0.009998 5.075970 +v -1.845807 0.009998 4.983679 +v -1.938097 0.009998 4.983679 +v -2.122678 0.009998 4.522227 +v -2.030388 0.009998 4.522227 +v -2.030388 0.009998 4.429937 +v -2.122678 0.009998 4.429937 +v -2.122678 0.009998 4.706808 +v -2.030388 0.009998 4.706808 +v -2.030388 0.009998 4.614518 +v -2.122678 0.009998 4.614518 +v -1.938097 0.009998 4.706808 +v -1.845807 0.009998 4.706808 +v -1.845807 0.009998 4.614518 +v -1.938097 0.009998 4.614518 +v -0.276871 0.009998 4.891389 +v -0.184581 0.009998 4.891389 +v -0.184581 0.009998 4.799098 +v -0.276871 0.009998 4.799098 +v -0.276871 0.009998 5.075970 +v -0.184581 0.009998 5.075970 +v -0.184581 0.009998 4.983679 +v -0.276871 0.009998 4.983679 +v -0.092290 0.009998 5.075970 +v 0.000000 0.009998 5.075970 +v 0.000000 0.009998 4.983679 +v -0.092290 0.009998 4.983679 +v -0.646033 0.009998 4.891389 +v -0.553742 0.009998 4.891389 +v -0.553742 0.009998 4.799098 +v -0.646033 0.009998 4.799098 +v -0.646033 0.009998 5.075970 +v -0.553742 0.009998 5.075970 +v -0.553742 0.009998 4.983679 +v -0.646033 0.009998 4.983679 +v -0.461452 0.009998 5.075970 +v -0.369161 0.009998 5.075970 +v -0.369161 0.009998 4.983679 +v -0.461452 0.009998 4.983679 +v -0.646033 0.009998 4.522227 +v -0.553742 0.009998 4.522227 +v -0.553742 0.009998 4.429937 +v -0.646033 0.009998 4.429937 +v -0.646033 0.009998 4.706808 +v -0.553742 0.009998 4.706808 +v -0.553742 0.009998 4.614518 +v -0.646033 0.009998 4.614518 +v -0.461452 0.009998 4.706808 +v -0.369161 0.009998 4.706808 +v -0.369161 0.009998 4.614518 +v -0.461452 0.009998 4.614518 +v -4.706808 0.009999 3.414743 +v -4.614518 0.009999 3.414743 +v -4.614518 0.009999 3.322453 +v -4.706808 0.009999 3.322453 +v -4.706808 0.009999 3.599324 +v -4.614518 0.009999 3.599324 +v -4.614518 0.009999 3.507033 +v -4.706808 0.009999 3.507033 +v -4.522227 0.009999 3.599324 +v -4.429937 0.009999 3.599324 +v -4.429937 0.009999 3.507033 +v -4.522227 0.009999 3.507033 +v -5.075970 0.009999 3.414743 +v -4.983679 0.009999 3.414743 +v -4.983679 0.009999 3.322453 +v -5.075970 0.009999 3.322453 +v -5.075970 0.009999 3.599324 +v -4.983679 0.009999 3.599324 +v -4.983679 0.009999 3.507033 +v -5.075970 0.009999 3.507033 +v -4.891389 0.009999 3.599324 +v -4.799098 0.009999 3.599324 +v -4.799098 0.009999 3.507033 +v -4.891389 0.009999 3.507033 +v -5.075970 0.009999 3.045582 +v -4.983679 0.009999 3.045582 +v -4.983679 0.009999 2.953291 +v -5.075970 0.009999 2.953291 +v -5.075970 0.009999 3.230163 +v -4.983679 0.009999 3.230163 +v -4.983679 0.009999 3.137872 +v -5.075970 0.009999 3.137872 +v -4.891389 0.009999 3.230163 +v -4.799098 0.009999 3.230163 +v -4.799098 0.009999 3.137872 +v -4.891389 0.009999 3.137872 +v -4.706808 0.009998 4.891389 +v -4.614518 0.009998 4.891389 +v -4.614518 0.009998 4.799098 +v -4.706808 0.009998 4.799098 +v -4.706808 0.009998 5.075970 +v -4.614518 0.009998 5.075970 +v -4.614518 0.009998 4.983679 +v -4.706808 0.009998 4.983679 +v -4.522227 0.009998 5.075970 +v -4.429937 0.009998 5.075970 +v -4.429937 0.009998 4.983679 +v -4.522227 0.009998 4.983679 +v -5.075970 0.009998 4.891389 +v -4.983679 0.009998 4.891389 +v -4.983679 0.009998 4.799098 +v -5.075970 0.009998 4.799098 +v -5.075970 0.009998 5.075970 +v -4.983679 0.009998 5.075970 +v -4.983679 0.009998 4.983679 +v -5.075970 0.009998 4.983679 +v -4.891389 0.009998 5.075970 +v -4.799098 0.009998 5.075970 +v -4.799098 0.009998 4.983679 +v -4.891389 0.009998 4.983679 +v -5.075970 0.009998 4.522227 +v -4.983679 0.009998 4.522227 +v -4.983679 0.009998 4.429937 +v -5.075970 0.009998 4.429937 +v -5.075970 0.009998 4.706808 +v -4.983679 0.009998 4.706808 +v -4.983679 0.009998 4.614518 +v -5.075970 0.009998 4.614518 +v -4.891389 0.009998 4.706808 +v -4.799098 0.009998 4.706808 +v -4.799098 0.009998 4.614518 +v -4.891389 0.009998 4.614518 +v -3.230163 0.009998 4.891389 +v -3.137872 0.009998 4.891389 +v -3.137872 0.009998 4.799098 +v -3.230163 0.009998 4.799098 +v -3.230163 0.009998 5.075970 +v -3.137872 0.009998 5.075970 +v -3.137872 0.009998 4.983679 +v -3.230163 0.009998 4.983679 +v -3.045582 0.009998 5.075970 +v -2.953291 0.009998 5.075970 +v -2.953291 0.009998 4.983679 +v -3.045582 0.009998 4.983679 +v -3.599324 0.009998 4.891389 +v -3.507033 0.009998 4.891389 +v -3.507033 0.009998 4.799098 +v -3.599324 0.009998 4.799098 +v -3.599324 0.009998 5.075970 +v -3.507033 0.009998 5.075970 +v -3.507033 0.009998 4.983679 +v -3.599324 0.009998 4.983679 +v -3.414743 0.009998 5.075970 +v -3.322453 0.009998 5.075970 +v -3.322453 0.009998 4.983679 +v -3.414743 0.009998 4.983679 +v -3.599324 0.009998 4.522227 +v -3.507033 0.009998 4.522227 +v -3.507033 0.009998 4.429937 +v -3.599324 0.009998 4.429937 +v -3.599324 0.009998 4.706808 +v -3.507033 0.009998 4.706808 +v -3.507033 0.009998 4.614518 +v -3.599324 0.009998 4.614518 +v -3.414743 0.009998 4.706808 +v -3.322453 0.009998 4.706808 +v -3.322453 0.009998 4.614518 +v -3.414743 0.009998 4.614518 +v -4.706808 0.010000 0.461452 +v -4.614518 0.010000 0.461452 +v -4.614518 0.010000 0.369161 +v -4.706808 0.010000 0.369161 +v -4.706808 0.010000 0.646033 +v -4.614518 0.010000 0.646033 +v -4.614518 0.010000 0.553742 +v -4.706808 0.010000 0.553742 +v -4.522227 0.010000 0.646033 +v -4.429937 0.010000 0.646033 +v -4.429937 0.010000 0.553742 +v -4.522227 0.010000 0.553742 +v -5.075970 0.010000 0.461452 +v -4.983679 0.010000 0.461452 +v -4.983679 0.010000 0.369161 +v -5.075970 0.010000 0.369161 +v -5.075970 0.010000 0.646033 +v -4.983679 0.010000 0.646033 +v -4.983679 0.010000 0.553742 +v -5.075970 0.010000 0.553742 +v -4.891389 0.010000 0.646033 +v -4.799098 0.010000 0.646033 +v -4.799098 0.010000 0.553742 +v -4.891389 0.010000 0.553742 +v -5.075970 0.010000 0.092290 +v -4.983679 0.010000 0.092290 +v -4.983679 0.010000 -0.000000 +v -5.075970 0.010000 -0.000000 +v -5.075970 0.010000 0.276871 +v -4.983679 0.010000 0.276871 +v -4.983679 0.010000 0.184581 +v -5.075970 0.010000 0.184581 +v -4.891389 0.010000 0.276871 +v -4.799098 0.010000 0.276871 +v -4.799098 0.010000 0.184581 +v -4.891389 0.010000 0.184581 +v -4.706808 0.009999 1.938097 +v -4.614518 0.009999 1.938097 +v -4.614518 0.009999 1.845807 +v -4.706808 0.009999 1.845807 +v -4.706808 0.009999 2.122678 +v -4.614518 0.009999 2.122678 +v -4.614518 0.009999 2.030388 +v -4.706808 0.009999 2.030388 +v -4.522227 0.009999 2.122678 +v -4.429937 0.009999 2.122678 +v -4.429937 0.009999 2.030388 +v -4.522227 0.009999 2.030388 +v -5.075970 0.009999 1.938097 +v -4.983679 0.009999 1.938097 +v -4.983679 0.009999 1.845807 +v -5.075970 0.009999 1.845807 +v -5.075970 0.009999 2.122678 +v -4.983679 0.009999 2.122678 +v -4.983679 0.009999 2.030388 +v -5.075970 0.009999 2.030388 +v -4.891389 0.009999 2.122678 +v -4.799098 0.009999 2.122678 +v -4.799098 0.009999 2.030388 +v -4.891389 0.009999 2.030388 +v -5.075970 0.009999 1.568936 +v -4.983679 0.009999 1.568936 +v -4.983679 0.009999 1.476646 +v -5.075970 0.009999 1.476646 +v -5.075970 0.009999 1.753517 +v -4.983679 0.009999 1.753517 +v -4.983679 0.009999 1.661226 +v -5.075970 0.009999 1.661226 +v -4.891389 0.009999 1.753517 +v -4.799098 0.009999 1.753517 +v -4.799098 0.009999 1.661226 +v -4.891389 0.009999 1.661226 +v -3.230163 0.009999 1.938097 +v -3.137872 0.009999 1.938097 +v -3.137872 0.009999 1.845807 +v -3.230163 0.009999 1.845807 +v -3.230163 0.009999 2.122678 +v -3.137872 0.009999 2.122678 +v -3.137872 0.009999 2.030388 +v -3.230163 0.009999 2.030388 +v -3.045582 0.009999 2.122678 +v -2.953291 0.009999 2.122678 +v -2.953291 0.009999 2.030388 +v -3.045582 0.009999 2.030388 +v -3.599324 0.009999 1.938097 +v -3.507033 0.009999 1.938097 +v -3.507033 0.009999 1.845807 +v -3.599324 0.009999 1.845807 +v -3.599324 0.009999 2.122678 +v -3.507033 0.009999 2.122678 +v -3.507033 0.009999 2.030388 +v -3.599324 0.009999 2.030388 +v -3.414743 0.009999 2.122678 +v -3.322453 0.009999 2.122678 +v -3.322453 0.009999 2.030388 +v -3.414743 0.009999 2.030388 +v -3.599324 0.009999 1.568936 +v -3.507033 0.009999 1.568936 +v -3.507033 0.009999 1.476646 +v -3.599324 0.009999 1.476646 +v -3.599324 0.009999 1.753517 +v -3.507033 0.009999 1.753517 +v -3.507033 0.009999 1.661226 +v -3.599324 0.009999 1.661226 +v -3.414743 0.009999 1.753517 +v -3.322453 0.009999 1.753517 +v -3.322453 0.009999 1.661226 +v -3.414743 0.009999 1.661226 +v 4.153066 0.009999 3.414743 +v 4.245357 0.009999 3.414743 +v 4.245357 0.009999 3.322453 +v 4.153066 0.009999 3.322453 +v 4.153066 0.009999 3.599324 +v 4.245357 0.009999 3.599324 +v 4.245357 0.009999 3.507033 +v 4.153066 0.009999 3.507033 +v 4.337647 0.009999 3.599324 +v 4.429937 0.009999 3.599324 +v 4.429937 0.009999 3.507033 +v 4.337647 0.009999 3.507033 +v 3.783905 0.009999 3.414743 +v 3.876195 0.009999 3.414743 +v 3.876195 0.009999 3.322453 +v 3.783905 0.009999 3.322453 +v 3.783905 0.009999 3.599324 +v 3.876195 0.009999 3.599324 +v 3.876195 0.009999 3.507033 +v 3.783905 0.009999 3.507033 +v 3.968485 0.009999 3.599324 +v 4.060776 0.009999 3.599324 +v 4.060776 0.009999 3.507033 +v 3.968485 0.009999 3.507033 +v 3.783905 0.009999 3.045582 +v 3.876195 0.009999 3.045582 +v 3.876195 0.009999 2.953291 +v 3.783905 0.009999 2.953291 +v 3.783905 0.009999 3.230163 +v 3.876195 0.009999 3.230163 +v 3.876195 0.009999 3.137872 +v 3.783905 0.009999 3.137872 +v 3.968485 0.009999 3.230163 +v 4.060776 0.009999 3.230163 +v 4.060776 0.009999 3.137872 +v 3.968485 0.009999 3.137872 +v 4.153066 0.009998 4.891389 +v 4.245357 0.009998 4.891389 +v 4.245357 0.009998 4.799098 +v 4.153066 0.009998 4.799098 +v 4.153066 0.009998 5.075970 +v 4.245357 0.009998 5.075970 +v 4.245357 0.009998 4.983679 +v 4.153066 0.009998 4.983679 +v 4.337647 0.009998 5.075970 +v 4.429937 0.009998 5.075970 +v 4.429937 0.009998 4.983679 +v 4.337647 0.009998 4.983679 +v 3.783905 0.009998 4.891389 +v 3.876195 0.009998 4.891389 +v 3.876195 0.009998 4.799098 +v 3.783905 0.009998 4.799098 +v 3.783905 0.009998 5.075970 +v 3.876195 0.009998 5.075970 +v 3.876195 0.009998 4.983679 +v 3.783905 0.009998 4.983679 +v 3.968485 0.009998 5.075970 +v 4.060776 0.009998 5.075970 +v 4.060776 0.009998 4.983679 +v 3.968485 0.009998 4.983679 +v 3.783905 0.009998 4.522227 +v 3.876195 0.009998 4.522227 +v 3.876195 0.009998 4.429937 +v 3.783905 0.009998 4.429937 +v 3.783905 0.009998 4.706808 +v 3.876195 0.009998 4.706808 +v 3.876195 0.009998 4.614518 +v 3.783905 0.009998 4.614518 +v 3.968485 0.009998 4.706808 +v 4.060776 0.009998 4.706808 +v 4.060776 0.009998 4.614518 +v 3.968485 0.009998 4.614518 +v 5.629711 0.009998 4.891389 +v 5.722002 0.009998 4.891389 +v 5.722002 0.009998 4.799098 +v 5.629711 0.009998 4.799098 +v 5.629711 0.009998 5.075970 +v 5.722002 0.009998 5.075970 +v 5.722002 0.009998 4.983679 +v 5.629711 0.009998 4.983679 +v 5.814293 0.009998 5.075970 +v 5.906583 0.009998 5.075970 +v 5.906583 0.009998 4.983679 +v 5.814293 0.009998 4.983679 +v 5.260550 0.009998 4.891389 +v 5.352840 0.009998 4.891389 +v 5.352840 0.009998 4.799098 +v 5.260550 0.009998 4.799098 +v 5.260550 0.009998 5.075970 +v 5.352840 0.009998 5.075970 +v 5.352840 0.009998 4.983679 +v 5.260550 0.009998 4.983679 +v 5.445131 0.009998 5.075970 +v 5.537421 0.009998 5.075970 +v 5.537421 0.009998 4.983679 +v 5.445131 0.009998 4.983679 +v 5.260550 0.009998 4.522227 +v 5.352840 0.009998 4.522227 +v 5.352840 0.009998 4.429937 +v 5.260550 0.009998 4.429937 +v 5.260550 0.009998 4.706808 +v 5.352840 0.009998 4.706808 +v 5.352840 0.009998 4.614518 +v 5.260550 0.009998 4.614518 +v 5.445131 0.009998 4.706808 +v 5.537421 0.009998 4.706808 +v 5.537421 0.009998 4.614518 +v 5.445131 0.009998 4.614518 +v 1.199775 0.009999 3.414743 +v 1.292065 0.009999 3.414743 +v 1.292065 0.009999 3.322453 +v 1.199775 0.009999 3.322453 +v 1.199775 0.009999 3.599324 +v 1.292065 0.009999 3.599324 +v 1.292065 0.009999 3.507033 +v 1.199775 0.009999 3.507033 +v 1.384355 0.009999 3.599324 +v 1.476646 0.009999 3.599324 +v 1.476646 0.009999 3.507033 +v 1.384355 0.009999 3.507033 +v 0.830613 0.009999 3.414743 +v 0.922904 0.009999 3.414743 +v 0.922904 0.009999 3.322453 +v 0.830613 0.009999 3.322453 +v 0.830613 0.009999 3.599324 +v 0.922904 0.009999 3.599324 +v 0.922904 0.009999 3.507033 +v 0.830613 0.009999 3.507033 +v 1.015194 0.009999 3.599324 +v 1.107484 0.009999 3.599324 +v 1.107484 0.009999 3.507033 +v 1.015194 0.009999 3.507033 +v 0.830613 0.009999 3.045582 +v 0.922904 0.009999 3.045582 +v 0.922904 0.009999 2.953291 +v 0.830613 0.009999 2.953291 +v 0.830613 0.009999 3.230163 +v 0.922904 0.009999 3.230163 +v 0.922904 0.009999 3.137872 +v 0.830613 0.009999 3.137872 +v 1.015194 0.009999 3.230163 +v 1.107484 0.009999 3.230163 +v 1.107484 0.009999 3.137872 +v 1.015194 0.009999 3.137872 +v 1.199775 0.009998 4.891389 +v 1.292065 0.009998 4.891389 +v 1.292065 0.009998 4.799098 +v 1.199775 0.009998 4.799098 +v 1.199775 0.009998 5.075970 +v 1.292065 0.009998 5.075970 +v 1.292065 0.009998 4.983679 +v 1.199775 0.009998 4.983679 +v 1.384355 0.009998 5.075970 +v 1.476646 0.009998 5.075970 +v 1.476646 0.009998 4.983679 +v 1.384355 0.009998 4.983679 +v 0.830613 0.009998 4.891389 +v 0.922904 0.009998 4.891389 +v 0.922904 0.009998 4.799098 +v 0.830613 0.009998 4.799098 +v 0.830613 0.009998 5.075970 +v 0.922904 0.009998 5.075970 +v 0.922904 0.009998 4.983679 +v 0.830613 0.009998 4.983679 +v 1.015194 0.009998 5.075970 +v 1.107484 0.009998 5.075970 +v 1.107484 0.009998 4.983679 +v 1.015194 0.009998 4.983679 +v 0.830613 0.009998 4.522227 +v 0.922904 0.009998 4.522227 +v 0.922904 0.009998 4.429937 +v 0.830613 0.009998 4.429937 +v 0.830613 0.009998 4.706808 +v 0.922904 0.009998 4.706808 +v 0.922904 0.009998 4.614518 +v 0.830613 0.009998 4.614518 +v 1.015194 0.009998 4.706808 +v 1.107484 0.009998 4.706808 +v 1.107484 0.009998 4.614518 +v 1.015194 0.009998 4.614518 +v 2.676420 0.009998 4.891389 +v 2.768711 0.009998 4.891389 +v 2.768711 0.009998 4.799098 +v 2.676420 0.009998 4.799098 +v 2.676420 0.009998 5.075970 +v 2.768711 0.009998 5.075970 +v 2.768711 0.009998 4.983679 +v 2.676420 0.009998 4.983679 +v 2.861001 0.009998 5.075970 +v 2.953291 0.009998 5.075970 +v 2.953291 0.009998 4.983679 +v 2.861001 0.009998 4.983679 +v 2.307259 0.009998 4.891389 +v 2.399549 0.009998 4.891389 +v 2.399549 0.009998 4.799098 +v 2.307259 0.009998 4.799098 +v 2.307259 0.009998 5.075970 +v 2.399549 0.009998 5.075970 +v 2.399549 0.009998 4.983679 +v 2.307259 0.009998 4.983679 +v 2.491840 0.009998 5.075970 +v 2.584130 0.009998 5.075970 +v 2.584130 0.009998 4.983679 +v 2.491840 0.009998 4.983679 +v 2.307259 0.009998 4.522227 +v 2.399549 0.009998 4.522227 +v 2.399549 0.009998 4.429937 +v 2.307259 0.009998 4.429937 +v 2.307259 0.009998 4.706808 +v 2.399549 0.009998 4.706808 +v 2.399549 0.009998 4.614518 +v 2.307259 0.009998 4.614518 +v 2.491840 0.009998 4.706808 +v 2.584130 0.009998 4.706808 +v 2.584130 0.009998 4.614518 +v 2.491840 0.009998 4.614518 +v 1.199775 0.010000 0.461452 +v 1.292065 0.010000 0.461452 +v 1.292065 0.010000 0.369161 +v 1.199775 0.010000 0.369161 +v 1.199775 0.010000 0.646033 +v 1.292065 0.010000 0.646033 +v 1.292065 0.010000 0.553742 +v 1.199775 0.010000 0.553742 +v 1.384355 0.010000 0.646033 +v 1.476646 0.010000 0.646033 +v 1.476646 0.010000 0.553742 +v 1.384355 0.010000 0.553742 +v 0.830613 0.010000 0.461452 +v 0.922904 0.010000 0.461452 +v 0.922904 0.010000 0.369161 +v 0.830613 0.010000 0.369161 +v 0.830613 0.010000 0.646033 +v 0.922904 0.010000 0.646033 +v 0.922904 0.010000 0.553742 +v 0.830613 0.010000 0.553742 +v 1.015194 0.010000 0.646033 +v 1.107484 0.010000 0.646033 +v 1.107484 0.010000 0.553742 +v 1.015194 0.010000 0.553742 +v 0.830613 0.010000 0.092290 +v 0.922904 0.010000 0.092290 +v 0.922904 0.010000 -0.000000 +v 0.830613 0.010000 -0.000000 +v 0.830613 0.010000 0.276871 +v 0.922904 0.010000 0.276871 +v 0.922904 0.010000 0.184581 +v 0.830613 0.010000 0.184581 +v 1.015194 0.010000 0.276871 +v 1.107484 0.010000 0.276871 +v 1.107484 0.010000 0.184581 +v 1.015194 0.010000 0.184581 +v 1.199775 0.009999 1.938097 +v 1.292065 0.009999 1.938097 +v 1.292065 0.009999 1.845807 +v 1.199775 0.009999 1.845807 +v 1.199775 0.009999 2.122678 +v 1.292065 0.009999 2.122678 +v 1.292065 0.009999 2.030388 +v 1.199775 0.009999 2.030388 +v 1.384355 0.009999 2.122678 +v 1.476646 0.009999 2.122678 +v 1.476646 0.009999 2.030388 +v 1.384355 0.009999 2.030388 +v 0.830613 0.009999 1.938097 +v 0.922904 0.009999 1.938097 +v 0.922904 0.009999 1.845807 +v 0.830613 0.009999 1.845807 +v 0.830613 0.009999 2.122678 +v 0.922904 0.009999 2.122678 +v 0.922904 0.009999 2.030388 +v 0.830613 0.009999 2.030388 +v 1.015194 0.009999 2.122678 +v 1.107484 0.009999 2.122678 +v 1.107484 0.009999 2.030388 +v 1.015194 0.009999 2.030388 +v 0.830613 0.009999 1.568936 +v 0.922904 0.009999 1.568936 +v 0.922904 0.009999 1.476646 +v 0.830613 0.009999 1.476646 +v 0.830613 0.009999 1.753517 +v 0.922904 0.009999 1.753517 +v 0.922904 0.009999 1.661226 +v 0.830613 0.009999 1.661226 +v 1.015194 0.009999 1.753517 +v 1.107484 0.009999 1.753517 +v 1.107484 0.009999 1.661226 +v 1.015194 0.009999 1.661226 +v 2.676420 0.009999 1.938097 +v 2.768711 0.009999 1.938097 +v 2.768711 0.009999 1.845807 +v 2.676420 0.009999 1.845807 +v 2.676420 0.009999 2.122678 +v 2.768711 0.009999 2.122678 +v 2.768711 0.009999 2.030388 +v 2.676420 0.009999 2.030388 +v 2.861001 0.009999 2.122678 +v 2.953291 0.009999 2.122678 +v 2.953291 0.009999 2.030388 +v 2.861001 0.009999 2.030388 +v 2.307259 0.009999 1.938097 +v 2.399549 0.009999 1.938097 +v 2.399549 0.009999 1.845807 +v 2.307259 0.009999 1.845807 +v 2.307259 0.009999 2.122678 +v 2.399549 0.009999 2.122678 +v 2.399549 0.009999 2.030388 +v 2.307259 0.009999 2.030388 +v 2.491840 0.009999 2.122678 +v 2.584130 0.009999 2.122678 +v 2.584130 0.009999 2.030388 +v 2.491840 0.009999 2.030388 +v 2.307259 0.009999 1.568936 +v 2.399549 0.009999 1.568936 +v 2.399549 0.009999 1.476646 +v 2.307259 0.009999 1.476646 +v 2.307259 0.009999 1.753517 +v 2.399549 0.009999 1.753517 +v 2.399549 0.009999 1.661226 +v 2.307259 0.009999 1.661226 +v 2.491840 0.009999 1.753517 +v 2.584130 0.009999 1.753517 +v 2.584130 0.009999 1.661226 +v 2.491840 0.009999 1.661226 +v 4.153066 0.010000 0.461452 +v 4.245357 0.010000 0.461452 +v 4.245357 0.010000 0.369161 +v 4.153066 0.010000 0.369161 +v 4.153066 0.010000 0.646033 +v 4.245357 0.010000 0.646033 +v 4.245357 0.010000 0.553742 +v 4.153066 0.010000 0.553742 +v 4.337647 0.010000 0.646033 +v 4.429937 0.010000 0.646033 +v 4.429937 0.010000 0.553742 +v 4.337647 0.010000 0.553742 +v 3.783905 0.010000 0.461452 +v 3.876195 0.010000 0.461452 +v 3.876195 0.010000 0.369161 +v 3.783905 0.010000 0.369161 +v 3.783905 0.010000 0.646033 +v 3.876195 0.010000 0.646033 +v 3.876195 0.010000 0.553742 +v 3.783905 0.010000 0.553742 +v 3.968485 0.010000 0.646033 +v 4.060776 0.010000 0.646033 +v 4.060776 0.010000 0.553742 +v 3.968485 0.010000 0.553742 +v 3.783905 0.010000 0.092290 +v 3.876195 0.010000 0.092290 +v 3.876195 0.010000 -0.000000 +v 3.783905 0.010000 -0.000000 +v 3.783905 0.010000 0.276871 +v 3.876195 0.010000 0.276871 +v 3.876195 0.010000 0.184581 +v 3.783905 0.010000 0.184581 +v 3.968485 0.010000 0.276871 +v 4.060776 0.010000 0.276871 +v 4.060776 0.010000 0.184581 +v 3.968485 0.010000 0.184581 +v 4.153066 0.009999 1.938097 +v 4.245357 0.009999 1.938097 +v 4.245357 0.009999 1.845807 +v 4.153066 0.009999 1.845807 +v 4.153066 0.009999 2.122678 +v 4.245357 0.009999 2.122678 +v 4.245357 0.009999 2.030388 +v 4.153066 0.009999 2.030388 +v 4.337647 0.009999 2.122678 +v 4.429937 0.009999 2.122678 +v 4.429937 0.009999 2.030388 +v 4.337647 0.009999 2.030388 +v 3.783905 0.009999 1.938097 +v 3.876195 0.009999 1.938097 +v 3.876195 0.009999 1.845807 +v 3.783905 0.009999 1.845807 +v 3.783905 0.009999 2.122678 +v 3.876195 0.009999 2.122678 +v 3.876195 0.009999 2.030388 +v 3.783905 0.009999 2.030388 +v 3.968485 0.009999 2.122678 +v 4.060776 0.009999 2.122678 +v 4.060776 0.009999 2.030388 +v 3.968485 0.009999 2.030388 +v 3.783905 0.009999 1.568936 +v 3.876195 0.009999 1.568936 +v 3.876195 0.009999 1.476646 +v 3.783905 0.009999 1.476646 +v 3.783905 0.009999 1.753517 +v 3.876195 0.009999 1.753517 +v 3.876195 0.009999 1.661226 +v 3.783905 0.009999 1.661226 +v 3.968485 0.009999 1.753517 +v 4.060776 0.009999 1.753517 +v 4.060776 0.009999 1.661226 +v 3.968485 0.009999 1.661226 +v 5.629711 0.009999 1.938097 +v 5.722002 0.009999 1.938097 +v 5.722002 0.009999 1.845807 +v 5.629711 0.009999 1.845807 +v 5.629711 0.009999 2.122678 +v 5.722002 0.009999 2.122678 +v 5.722002 0.009999 2.030388 +v 5.629711 0.009999 2.030388 +v 5.814293 0.009999 2.122678 +v 5.906583 0.009999 2.122678 +v 5.906583 0.009999 2.030388 +v 5.814293 0.009999 2.030388 +v 5.260550 0.009999 1.938097 +v 5.352840 0.009999 1.938097 +v 5.352840 0.009999 1.845807 +v 5.260550 0.009999 1.845807 +v 5.260550 0.009999 2.122678 +v 5.352840 0.009999 2.122678 +v 5.352840 0.009999 2.030388 +v 5.260550 0.009999 2.030388 +v 5.445131 0.009999 2.122678 +v 5.537421 0.009999 2.122678 +v 5.537421 0.009999 2.030388 +v 5.445131 0.009999 2.030388 +v 5.260550 0.009999 1.568936 +v 5.352840 0.009999 1.568936 +v 5.352840 0.009999 1.476646 +v 5.260550 0.009999 1.476646 +v 5.260550 0.009999 1.753517 +v 5.352840 0.009999 1.753517 +v 5.352840 0.009999 1.661226 +v 5.260550 0.009999 1.661226 +v 5.445131 0.009999 1.753517 +v 5.537421 0.009999 1.753517 +v 5.537421 0.009999 1.661226 +v 5.445131 0.009999 1.661226 +v -1.753517 0.010000 0.461452 +v -1.661226 0.010000 0.461452 +v -1.661226 0.010000 0.369161 +v -1.753517 0.010000 0.369161 +v -1.753517 0.010000 0.646033 +v -1.661226 0.010000 0.646033 +v -1.661226 0.010000 0.553742 +v -1.753517 0.010000 0.553742 +v -1.568936 0.010000 0.646033 +v -1.476646 0.010000 0.646033 +v -1.476646 0.010000 0.553742 +v -1.568936 0.010000 0.553742 +v -2.122678 0.010000 0.461452 +v -2.030388 0.010000 0.461452 +v -2.030388 0.010000 0.369161 +v -2.122678 0.010000 0.369161 +v -2.122678 0.010000 0.646033 +v -2.030388 0.010000 0.646033 +v -2.030388 0.010000 0.553742 +v -2.122678 0.010000 0.553742 +v -1.938097 0.010000 0.646033 +v -1.845807 0.010000 0.646033 +v -1.845807 0.010000 0.553742 +v -1.938097 0.010000 0.553742 +v -2.122678 0.010000 0.092290 +v -2.030388 0.010000 0.092290 +v -2.030388 0.010000 -0.000000 +v -2.122678 0.010000 -0.000000 +v -2.122678 0.010000 0.276871 +v -2.030388 0.010000 0.276871 +v -2.030388 0.010000 0.184581 +v -2.122678 0.010000 0.184581 +v -1.938097 0.010000 0.276871 +v -1.845807 0.010000 0.276871 +v -1.845807 0.010000 0.184581 +v -1.938097 0.010000 0.184581 +v -1.753517 0.009999 1.938097 +v -1.661226 0.009999 1.938097 +v -1.661226 0.009999 1.845807 +v -1.753517 0.009999 1.845807 +v -1.753517 0.009999 2.122678 +v -1.661226 0.009999 2.122678 +v -1.661226 0.009999 2.030388 +v -1.753517 0.009999 2.030388 +v -1.568936 0.009999 2.122678 +v -1.476646 0.009999 2.122678 +v -1.476646 0.009999 2.030388 +v -1.568936 0.009999 2.030388 +v -2.122678 0.009999 1.938097 +v -2.030388 0.009999 1.938097 +v -2.030388 0.009999 1.845807 +v -2.122678 0.009999 1.845807 +v -2.122678 0.009999 2.122678 +v -2.030388 0.009999 2.122678 +v -2.030388 0.009999 2.030388 +v -2.122678 0.009999 2.030388 +v -1.938097 0.009999 2.122678 +v -1.845807 0.009999 2.122678 +v -1.845807 0.009999 2.030388 +v -1.938097 0.009999 2.030388 +v -2.122678 0.009999 1.568936 +v -2.030388 0.009999 1.568936 +v -2.030388 0.009999 1.476646 +v -2.122678 0.009999 1.476646 +v -2.122678 0.009999 1.753517 +v -2.030388 0.009999 1.753517 +v -2.030388 0.009999 1.661226 +v -2.122678 0.009999 1.661226 +v -1.938097 0.009999 1.753517 +v -1.845807 0.009999 1.753517 +v -1.845807 0.009999 1.661226 +v -1.938097 0.009999 1.661226 +v -0.276871 0.009999 1.938097 +v -0.184581 0.009999 1.938097 +v -0.184581 0.009999 1.845807 +v -0.276871 0.009999 1.845807 +v -0.276871 0.009999 2.122678 +v -0.184581 0.009999 2.122678 +v -0.184581 0.009999 2.030388 +v -0.276871 0.009999 2.030388 +v -0.092290 0.009999 2.122678 +v 0.000000 0.009999 2.122678 +v 0.000000 0.009999 2.030388 +v -0.092290 0.009999 2.030388 +v -0.646033 0.009999 1.938097 +v -0.553742 0.009999 1.938097 +v -0.553742 0.009999 1.845807 +v -0.646033 0.009999 1.845807 +v -0.646033 0.009999 2.122678 +v -0.553742 0.009999 2.122678 +v -0.553742 0.009999 2.030388 +v -0.646033 0.009999 2.030388 +v -0.461452 0.009999 2.122678 +v -0.369161 0.009999 2.122678 +v -0.369161 0.009999 2.030388 +v -0.461452 0.009999 2.030388 +v -0.646033 0.009999 1.568936 +v -0.553742 0.009999 1.568936 +v -0.553742 0.009999 1.476646 +v -0.646033 0.009999 1.476646 +v -0.646033 0.009999 1.753517 +v -0.553742 0.009999 1.753517 +v -0.553742 0.009999 1.661226 +v -0.646033 0.009999 1.661226 +v -0.461452 0.009999 1.753517 +v -0.369161 0.009999 1.753517 +v -0.369161 0.009999 1.661226 +v -0.461452 0.009999 1.661226 +v -1.753517 0.010002 -5.445131 +v -1.661226 0.010002 -5.445131 +v -1.661226 0.010002 -5.537421 +v -1.753517 0.010002 -5.537421 +v -1.753517 0.010002 -5.260550 +v -1.661226 0.010002 -5.260550 +v -1.661226 0.010002 -5.352840 +v -1.753517 0.010002 -5.352840 +v -1.568936 0.010002 -5.260550 +v -1.476646 0.010002 -5.260550 +v -1.476646 0.010002 -5.352840 +v -1.568936 0.010002 -5.352840 +v -2.122678 0.010002 -5.445131 +v -2.030388 0.010002 -5.445131 +v -2.030388 0.010002 -5.537421 +v -2.122678 0.010002 -5.537421 +v -2.122678 0.010002 -5.260550 +v -2.030388 0.010002 -5.260550 +v -2.030388 0.010002 -5.352840 +v -2.122678 0.010002 -5.352840 +v -1.938097 0.010002 -5.260550 +v -1.845807 0.010002 -5.260550 +v -1.845807 0.010002 -5.352840 +v -1.938097 0.010002 -5.352840 +v -2.122678 0.010002 -5.814293 +v -2.030388 0.010002 -5.814293 +v -2.030388 0.010002 -5.906583 +v -2.122678 0.010002 -5.906583 +v -2.122678 0.010002 -5.629711 +v -2.030388 0.010002 -5.629711 +v -2.030388 0.010002 -5.722002 +v -2.122678 0.010002 -5.722002 +v -1.938097 0.010002 -5.629711 +v -1.845807 0.010002 -5.629711 +v -1.845807 0.010002 -5.722002 +v -1.938097 0.010002 -5.722002 +v -1.753517 0.010002 -3.968485 +v -1.661226 0.010002 -3.968485 +v -1.661226 0.010002 -4.060776 +v -1.753517 0.010002 -4.060776 +v -1.753517 0.010002 -3.783905 +v -1.661226 0.010002 -3.783905 +v -1.661226 0.010002 -3.876195 +v -1.753517 0.010002 -3.876195 +v -1.568936 0.010002 -3.783905 +v -1.476646 0.010002 -3.783905 +v -1.476646 0.010002 -3.876195 +v -1.568936 0.010002 -3.876195 +v -2.122678 0.010002 -3.968485 +v -2.030388 0.010002 -3.968485 +v -2.030388 0.010002 -4.060776 +v -2.122678 0.010002 -4.060776 +v -2.122678 0.010002 -3.783905 +v -2.030388 0.010002 -3.783905 +v -2.030388 0.010002 -3.876195 +v -2.122678 0.010002 -3.876195 +v -1.938097 0.010002 -3.783905 +v -1.845807 0.010002 -3.783905 +v -1.845807 0.010002 -3.876195 +v -1.938097 0.010002 -3.876195 +v -2.122678 0.010002 -4.337647 +v -2.030388 0.010002 -4.337647 +v -2.030388 0.010002 -4.429937 +v -2.122678 0.010002 -4.429937 +v -2.122678 0.010002 -4.153066 +v -2.030388 0.010002 -4.153066 +v -2.030388 0.010002 -4.245357 +v -2.122678 0.010002 -4.245357 +v -1.938097 0.010002 -4.153066 +v -1.845807 0.010002 -4.153066 +v -1.845807 0.010002 -4.245357 +v -1.938097 0.010002 -4.245357 +v -0.276871 0.010002 -3.968485 +v -0.184581 0.010002 -3.968485 +v -0.184581 0.010002 -4.060776 +v -0.276871 0.010002 -4.060776 +v -0.276871 0.010002 -3.783905 +v -0.184581 0.010002 -3.783905 +v -0.184581 0.010002 -3.876195 +v -0.276871 0.010002 -3.876195 +v -0.092290 0.010002 -3.783905 +v 0.000000 0.010002 -3.783905 +v 0.000000 0.010002 -3.876195 +v -0.092290 0.010002 -3.876195 +v -0.646033 0.010002 -3.968485 +v -0.553742 0.010002 -3.968485 +v -0.553742 0.010002 -4.060776 +v -0.646033 0.010002 -4.060776 +v -0.646033 0.010002 -3.783905 +v -0.553742 0.010002 -3.783905 +v -0.553742 0.010002 -3.876195 +v -0.646033 0.010002 -3.876195 +v -0.461452 0.010002 -3.783905 +v -0.369161 0.010002 -3.783905 +v -0.369161 0.010002 -3.876195 +v -0.461452 0.010002 -3.876195 +v -0.646033 0.010002 -4.337647 +v -0.553742 0.010002 -4.337647 +v -0.553742 0.010002 -4.429937 +v -0.646033 0.010002 -4.429937 +v -0.646033 0.010002 -4.153066 +v -0.553742 0.010002 -4.153066 +v -0.553742 0.010002 -4.245357 +v -0.646033 0.010002 -4.245357 +v -0.461452 0.010002 -4.153066 +v -0.369161 0.010002 -4.153066 +v -0.369161 0.010002 -4.245357 +v -0.461452 0.010002 -4.245357 +v 4.153066 0.010002 -5.445131 +v 4.245357 0.010002 -5.445131 +v 4.245357 0.010002 -5.537421 +v 4.153066 0.010002 -5.537421 +v 4.153066 0.010002 -5.260550 +v 4.245357 0.010002 -5.260550 +v 4.245357 0.010002 -5.352840 +v 4.153066 0.010002 -5.352840 +v 4.337647 0.010002 -5.260550 +v 4.429937 0.010002 -5.260550 +v 4.429937 0.010002 -5.352840 +v 4.337647 0.010002 -5.352840 +v 3.783905 0.010002 -5.445131 +v 3.876195 0.010002 -5.445131 +v 3.876195 0.010002 -5.537421 +v 3.783905 0.010002 -5.537421 +v 3.783905 0.010002 -5.260550 +v 3.876195 0.010002 -5.260550 +v 3.876195 0.010002 -5.352840 +v 3.783905 0.010002 -5.352840 +v 3.968485 0.010002 -5.260550 +v 4.060776 0.010002 -5.260550 +v 4.060776 0.010002 -5.352840 +v 3.968485 0.010002 -5.352840 +v 3.783905 0.010002 -5.814293 +v 3.876195 0.010002 -5.814293 +v 3.876195 0.010002 -5.906583 +v 3.783905 0.010002 -5.906583 +v 3.783905 0.010002 -5.629711 +v 3.876195 0.010002 -5.629711 +v 3.876195 0.010002 -5.722002 +v 3.783905 0.010002 -5.722002 +v 3.968485 0.010002 -5.629711 +v 4.060776 0.010002 -5.629711 +v 4.060776 0.010002 -5.722002 +v 3.968485 0.010002 -5.722002 +v 4.153066 0.010002 -3.968485 +v 4.245357 0.010002 -3.968485 +v 4.245357 0.010002 -4.060776 +v 4.153066 0.010002 -4.060776 +v 4.153066 0.010002 -3.783905 +v 4.245357 0.010002 -3.783905 +v 4.245357 0.010002 -3.876195 +v 4.153066 0.010002 -3.876195 +v 4.337647 0.010002 -3.783905 +v 4.429937 0.010002 -3.783905 +v 4.429937 0.010002 -3.876195 +v 4.337647 0.010002 -3.876195 +v 3.783905 0.010002 -3.968485 +v 3.876195 0.010002 -3.968485 +v 3.876195 0.010002 -4.060776 +v 3.783905 0.010002 -4.060776 +v 3.783905 0.010002 -3.783905 +v 3.876195 0.010002 -3.783905 +v 3.876195 0.010002 -3.876195 +v 3.783905 0.010002 -3.876195 +v 3.968485 0.010002 -3.783905 +v 4.060776 0.010002 -3.783905 +v 4.060776 0.010002 -3.876195 +v 3.968485 0.010002 -3.876195 +v 3.783905 0.010002 -4.337647 +v 3.876195 0.010002 -4.337647 +v 3.876195 0.010002 -4.429937 +v 3.783905 0.010002 -4.429937 +v 3.783905 0.010002 -4.153066 +v 3.876195 0.010002 -4.153066 +v 3.876195 0.010002 -4.245357 +v 3.783905 0.010002 -4.245357 +v 3.968485 0.010002 -4.153066 +v 4.060776 0.010002 -4.153066 +v 4.060776 0.010002 -4.245357 +v 3.968485 0.010002 -4.245357 +v 5.629711 0.010002 -3.968485 +v 5.722002 0.010002 -3.968485 +v 5.722002 0.010002 -4.060776 +v 5.629711 0.010002 -4.060776 +v 5.629711 0.010002 -3.783905 +v 5.722002 0.010002 -3.783905 +v 5.722002 0.010002 -3.876195 +v 5.629711 0.010002 -3.876195 +v 5.814293 0.010002 -3.783905 +v 5.906583 0.010002 -3.783905 +v 5.906583 0.010002 -3.876195 +v 5.814293 0.010002 -3.876195 +v 5.260550 0.010002 -3.968485 +v 5.352840 0.010002 -3.968485 +v 5.352840 0.010002 -4.060776 +v 5.260550 0.010002 -4.060776 +v 5.260550 0.010002 -3.783905 +v 5.352840 0.010002 -3.783905 +v 5.352840 0.010002 -3.876195 +v 5.260550 0.010002 -3.876195 +v 5.445131 0.010002 -3.783905 +v 5.537421 0.010002 -3.783905 +v 5.537421 0.010002 -3.876195 +v 5.445131 0.010002 -3.876195 +v 5.260550 0.010002 -4.337647 +v 5.352840 0.010002 -4.337647 +v 5.352840 0.010002 -4.429937 +v 5.260550 0.010002 -4.429937 +v 5.260550 0.010002 -4.153066 +v 5.352840 0.010002 -4.153066 +v 5.352840 0.010002 -4.245357 +v 5.260550 0.010002 -4.245357 +v 5.445131 0.010002 -4.153066 +v 5.537421 0.010002 -4.153066 +v 5.537421 0.010002 -4.245357 +v 5.445131 0.010002 -4.245357 +v 4.891389 0.010002 -3.968485 +v 4.983679 0.010002 -3.968485 +v 4.983679 0.010002 -4.060776 +v 4.891389 0.010002 -4.060776 +v 4.891389 0.010002 -3.783905 +v 4.983679 0.010002 -3.783905 +v 4.983679 0.010002 -3.876195 +v 4.891389 0.010002 -3.876195 +v 5.075970 0.010002 -3.783905 +v 5.168260 0.010002 -3.783905 +v 5.168260 0.010002 -3.876195 +v 5.075970 0.010002 -3.876195 +v 4.522227 0.010002 -3.968485 +v 4.614518 0.010002 -3.968485 +v 4.614518 0.010002 -4.060776 +v 4.522227 0.010002 -4.060776 +v 4.522227 0.010002 -3.783905 +v 4.614518 0.010002 -3.783905 +v 4.614518 0.010002 -3.876195 +v 4.522227 0.010002 -3.876195 +v 4.706808 0.010002 -3.783905 +v 4.799098 0.010002 -3.783905 +v 4.799098 0.010002 -3.876195 +v 4.706808 0.010002 -3.876195 +v 4.522227 0.010002 -4.337647 +v 4.614518 0.010002 -4.337647 +v 4.614518 0.010002 -4.429937 +v 4.522227 0.010002 -4.429937 +v 4.522227 0.010002 -4.153066 +v 4.614518 0.010002 -4.153066 +v 4.614518 0.010002 -4.245357 +v 4.522227 0.010002 -4.245357 +v 4.706808 0.010002 -4.153066 +v 4.799098 0.010002 -4.153066 +v 4.799098 0.010002 -4.245357 +v 4.706808 0.010002 -4.245357 +v 4.891389 0.010001 -3.230163 +v 4.983679 0.010001 -3.230163 +v 4.983679 0.010001 -3.322453 +v 4.891389 0.010001 -3.322453 +v 4.891389 0.010001 -3.045582 +v 4.983679 0.010001 -3.045582 +v 4.983679 0.010001 -3.137872 +v 4.891389 0.010001 -3.137872 +v 5.075970 0.010001 -3.045582 +v 5.168260 0.010001 -3.045582 +v 5.168260 0.010001 -3.137872 +v 5.075970 0.010001 -3.137872 +v 4.522227 0.010001 -3.230163 +v 4.614518 0.010001 -3.230163 +v 4.614518 0.010001 -3.322453 +v 4.522227 0.010001 -3.322453 +v 4.522227 0.010001 -3.045582 +v 4.614518 0.010001 -3.045582 +v 4.614518 0.010001 -3.137872 +v 4.522227 0.010001 -3.137872 +v 4.706808 0.010001 -3.045582 +v 4.799098 0.010001 -3.045582 +v 4.799098 0.010001 -3.137872 +v 4.706808 0.010001 -3.137872 +v 4.522227 0.010001 -3.599324 +v 4.614518 0.010001 -3.599324 +v 4.614518 0.010002 -3.691614 +v 4.522227 0.010002 -3.691614 +v 4.522227 0.010001 -3.414743 +v 4.614518 0.010001 -3.414743 +v 4.614518 0.010001 -3.507033 +v 4.522227 0.010001 -3.507033 +v 4.706808 0.010001 -3.414743 +v 4.799098 0.010001 -3.414743 +v 4.799098 0.010001 -3.507033 +v 4.706808 0.010001 -3.507033 +v 5.629711 0.010001 -3.230163 +v 5.722002 0.010001 -3.230163 +v 5.722002 0.010001 -3.322453 +v 5.629711 0.010001 -3.322453 +v 5.629711 0.010001 -3.045582 +v 5.722002 0.010001 -3.045582 +v 5.722002 0.010001 -3.137872 +v 5.629711 0.010001 -3.137872 +v 5.814293 0.010001 -3.045582 +v 5.906583 0.010001 -3.045582 +v 5.906583 0.010001 -3.137872 +v 5.814293 0.010001 -3.137872 +v 5.260550 0.010001 -3.230163 +v 5.352840 0.010001 -3.230163 +v 5.352840 0.010001 -3.322453 +v 5.260550 0.010001 -3.322453 +v 5.260550 0.010001 -3.045582 +v 5.352840 0.010001 -3.045582 +v 5.352840 0.010001 -3.137872 +v 5.260550 0.010001 -3.137872 +v 5.445131 0.010001 -3.045582 +v 5.537421 0.010001 -3.045582 +v 5.537421 0.010001 -3.137872 +v 5.445131 0.010001 -3.137872 +v 5.260550 0.010001 -3.599324 +v 5.352840 0.010001 -3.599324 +v 5.352840 0.010002 -3.691614 +v 5.260550 0.010002 -3.691614 +v 5.260550 0.010001 -3.414743 +v 5.352840 0.010001 -3.414743 +v 5.352840 0.010001 -3.507033 +v 5.260550 0.010001 -3.507033 +v 5.445131 0.010001 -3.414743 +v 5.537421 0.010001 -3.414743 +v 5.537421 0.010001 -3.507033 +v 5.445131 0.010001 -3.507033 +v 3.414743 0.010002 -3.968485 +v 3.507033 0.010002 -3.968485 +v 3.507033 0.010002 -4.060776 +v 3.414743 0.010002 -4.060776 +v 3.414743 0.010002 -3.783905 +v 3.507033 0.010002 -3.783905 +v 3.507033 0.010002 -3.876195 +v 3.414743 0.010002 -3.876195 +v 3.599324 0.010002 -3.783905 +v 3.691614 0.010002 -3.783905 +v 3.691614 0.010002 -3.876195 +v 3.599324 0.010002 -3.876195 +v 3.045582 0.010002 -3.968485 +v 3.137872 0.010002 -3.968485 +v 3.137872 0.010002 -4.060776 +v 3.045582 0.010002 -4.060776 +v 3.045582 0.010002 -3.783905 +v 3.137872 0.010002 -3.783905 +v 3.137872 0.010002 -3.876195 +v 3.045582 0.010002 -3.876195 +v 3.230163 0.010002 -3.783905 +v 3.322453 0.010002 -3.783905 +v 3.322453 0.010002 -3.876195 +v 3.230163 0.010002 -3.876195 +v 3.045582 0.010002 -4.337647 +v 3.137872 0.010002 -4.337647 +v 3.137872 0.010002 -4.429937 +v 3.045582 0.010002 -4.429937 +v 3.045582 0.010002 -4.153066 +v 3.137872 0.010002 -4.153066 +v 3.137872 0.010002 -4.245357 +v 3.045582 0.010002 -4.245357 +v 3.230163 0.010002 -4.153066 +v 3.322453 0.010002 -4.153066 +v 3.322453 0.010002 -4.245357 +v 3.230163 0.010002 -4.245357 +v 3.414743 0.010001 -3.230163 +v 3.507033 0.010001 -3.230163 +v 3.507033 0.010001 -3.322453 +v 3.414743 0.010001 -3.322453 +v 3.414743 0.010001 -3.045582 +v 3.507033 0.010001 -3.045582 +v 3.507033 0.010001 -3.137872 +v 3.414743 0.010001 -3.137872 +v 3.599324 0.010001 -3.045582 +v 3.691614 0.010001 -3.045582 +v 3.691614 0.010001 -3.137872 +v 3.599324 0.010001 -3.137872 +v 3.045582 0.010001 -3.230163 +v 3.137872 0.010001 -3.230163 +v 3.137872 0.010001 -3.322453 +v 3.045582 0.010001 -3.322453 +v 3.045582 0.010001 -3.045582 +v 3.137872 0.010001 -3.045582 +v 3.137872 0.010001 -3.137872 +v 3.045582 0.010001 -3.137872 +v 3.230163 0.010001 -3.045582 +v 3.322453 0.010001 -3.045582 +v 3.322453 0.010001 -3.137872 +v 3.230163 0.010001 -3.137872 +v 3.045582 0.010001 -3.599324 +v 3.137872 0.010001 -3.599324 +v 3.137872 0.010002 -3.691614 +v 3.045582 0.010002 -3.691614 +v 3.045582 0.010001 -3.414743 +v 3.137872 0.010001 -3.414743 +v 3.137872 0.010001 -3.507033 +v 3.045582 0.010001 -3.507033 +v 3.230163 0.010001 -3.414743 +v 3.322453 0.010001 -3.414743 +v 3.322453 0.010001 -3.507033 +v 3.230163 0.010001 -3.507033 +v 4.153066 0.010001 -3.230163 +v 4.245357 0.010001 -3.230163 +v 4.245357 0.010001 -3.322453 +v 4.153066 0.010001 -3.322453 +v 4.153066 0.010001 -3.045582 +v 4.245357 0.010001 -3.045582 +v 4.245357 0.010001 -3.137872 +v 4.153066 0.010001 -3.137872 +v 4.337647 0.010001 -3.045582 +v 4.429937 0.010001 -3.045582 +v 4.429937 0.010001 -3.137872 +v 4.337647 0.010001 -3.137872 +v 3.783905 0.010001 -3.230163 +v 3.876195 0.010001 -3.230163 +v 3.876195 0.010001 -3.322453 +v 3.783905 0.010001 -3.322453 +v 3.783905 0.010001 -3.045582 +v 3.876195 0.010001 -3.045582 +v 3.876195 0.010001 -3.137872 +v 3.783905 0.010001 -3.137872 +v 3.968485 0.010001 -3.045582 +v 4.060776 0.010001 -3.045582 +v 4.060776 0.010001 -3.137872 +v 3.968485 0.010001 -3.137872 +v 3.783905 0.010001 -3.599324 +v 3.876195 0.010001 -3.599324 +v 3.876195 0.010002 -3.691614 +v 3.783905 0.010002 -3.691614 +v 3.783905 0.010001 -3.414743 +v 3.876195 0.010001 -3.414743 +v 3.876195 0.010001 -3.507033 +v 3.783905 0.010001 -3.507033 +v 3.968485 0.010001 -3.414743 +v 4.060776 0.010001 -3.414743 +v 4.060776 0.010001 -3.507033 +v 3.968485 0.010001 -3.507033 +v 3.414743 0.010002 -5.445131 +v 3.507033 0.010002 -5.445131 +v 3.507033 0.010002 -5.537421 +v 3.414743 0.010002 -5.537421 +v 3.414743 0.010002 -5.260550 +v 3.507033 0.010002 -5.260550 +v 3.507033 0.010002 -5.352840 +v 3.414743 0.010002 -5.352840 +v 3.599324 0.010002 -5.260550 +v 3.691614 0.010002 -5.260550 +v 3.691614 0.010002 -5.352840 +v 3.599324 0.010002 -5.352840 +v 3.045582 0.010002 -5.445131 +v 3.137872 0.010002 -5.445131 +v 3.137872 0.010002 -5.537421 +v 3.045582 0.010002 -5.537421 +v 3.045582 0.010002 -5.260550 +v 3.137872 0.010002 -5.260550 +v 3.137872 0.010002 -5.352840 +v 3.045582 0.010002 -5.352840 +v 3.230163 0.010002 -5.260550 +v 3.322453 0.010002 -5.260550 +v 3.322453 0.010002 -5.352840 +v 3.230163 0.010002 -5.352840 +v 3.045582 0.010002 -5.814293 +v 3.137872 0.010002 -5.814293 +v 3.137872 0.010002 -5.906583 +v 3.045582 0.010002 -5.906583 +v 3.045582 0.010002 -5.629711 +v 3.137872 0.010002 -5.629711 +v 3.137872 0.010002 -5.722002 +v 3.045582 0.010002 -5.722002 +v 3.230163 0.010002 -5.629711 +v 3.322453 0.010002 -5.629711 +v 3.322453 0.010002 -5.722002 +v 3.230163 0.010002 -5.722002 +v 3.414743 0.010002 -4.706808 +v 3.507033 0.010002 -4.706808 +v 3.507033 0.010002 -4.799098 +v 3.414743 0.010002 -4.799098 +v 3.414743 0.010002 -4.522227 +v 3.507033 0.010002 -4.522227 +v 3.507033 0.010002 -4.614518 +v 3.414743 0.010002 -4.614518 +v 3.599324 0.010002 -4.522227 +v 3.691614 0.010002 -4.522227 +v 3.691614 0.010002 -4.614518 +v 3.599324 0.010002 -4.614518 +v 3.045582 0.010002 -4.706808 +v 3.137872 0.010002 -4.706808 +v 3.137872 0.010002 -4.799098 +v 3.045582 0.010002 -4.799098 +v 3.045582 0.010002 -4.522227 +v 3.137872 0.010002 -4.522227 +v 3.137872 0.010002 -4.614518 +v 3.045582 0.010002 -4.614518 +v 3.230163 0.010002 -4.522227 +v 3.322453 0.010002 -4.522227 +v 3.322453 0.010002 -4.614518 +v 3.230163 0.010002 -4.614518 +v 3.045582 0.010002 -5.075970 +v 3.137872 0.010002 -5.075970 +v 3.137872 0.010002 -5.168260 +v 3.045582 0.010002 -5.168260 +v 3.045582 0.010002 -4.891389 +v 3.137872 0.010002 -4.891389 +v 3.137872 0.010002 -4.983679 +v 3.045582 0.010002 -4.983679 +v 3.230163 0.010002 -4.891389 +v 3.322453 0.010002 -4.891389 +v 3.322453 0.010002 -4.983679 +v 3.230163 0.010002 -4.983679 +v 4.153066 0.010002 -4.706808 +v 4.245357 0.010002 -4.706808 +v 4.245357 0.010002 -4.799098 +v 4.153066 0.010002 -4.799098 +v 4.153066 0.010002 -4.522227 +v 4.245357 0.010002 -4.522227 +v 4.245357 0.010002 -4.614518 +v 4.153066 0.010002 -4.614518 +v 4.337647 0.010002 -4.522227 +v 4.429937 0.010002 -4.522227 +v 4.429937 0.010002 -4.614518 +v 4.337647 0.010002 -4.614518 +v 3.783905 0.010002 -4.706808 +v 3.876195 0.010002 -4.706808 +v 3.876195 0.010002 -4.799098 +v 3.783905 0.010002 -4.799098 +v 3.783905 0.010002 -4.522227 +v 3.876195 0.010002 -4.522227 +v 3.876195 0.010002 -4.614518 +v 3.783905 0.010002 -4.614518 +v 3.968485 0.010002 -4.522227 +v 4.060776 0.010002 -4.522227 +v 4.060776 0.010002 -4.614518 +v 3.968485 0.010002 -4.614518 +v 3.783905 0.010002 -5.075970 +v 3.876195 0.010002 -5.075970 +v 3.876195 0.010002 -5.168260 +v 3.783905 0.010002 -5.168260 +v 3.783905 0.010002 -4.891389 +v 3.876195 0.010002 -4.891389 +v 3.876195 0.010002 -4.983679 +v 3.783905 0.010002 -4.983679 +v 3.968485 0.010002 -4.891389 +v 4.060776 0.010002 -4.891389 +v 4.060776 0.010002 -4.983679 +v 3.968485 0.010002 -4.983679 +v -1.015194 0.010002 -3.968485 +v -0.922904 0.010002 -3.968485 +v -0.922904 0.010002 -4.060776 +v -1.015194 0.010002 -4.060776 +v -1.015194 0.010002 -3.783905 +v -0.922904 0.010002 -3.783905 +v -0.922904 0.010002 -3.876195 +v -1.015194 0.010002 -3.876195 +v -0.830613 0.010002 -3.783905 +v -0.738323 0.010002 -3.783905 +v -0.738323 0.010002 -3.876195 +v -0.830613 0.010002 -3.876195 +v -1.384355 0.010002 -3.968485 +v -1.292065 0.010002 -3.968485 +v -1.292065 0.010002 -4.060776 +v -1.384355 0.010002 -4.060776 +v -1.384355 0.010002 -3.783905 +v -1.292065 0.010002 -3.783905 +v -1.292065 0.010002 -3.876195 +v -1.384355 0.010002 -3.876195 +v -1.199775 0.010002 -3.783905 +v -1.107484 0.010002 -3.783905 +v -1.107484 0.010002 -3.876195 +v -1.199775 0.010002 -3.876195 +v -1.384355 0.010002 -4.337647 +v -1.292065 0.010002 -4.337647 +v -1.292065 0.010002 -4.429937 +v -1.384355 0.010002 -4.429937 +v -1.384355 0.010002 -4.153066 +v -1.292065 0.010002 -4.153066 +v -1.292065 0.010002 -4.245357 +v -1.384355 0.010002 -4.245357 +v -1.199775 0.010002 -4.153066 +v -1.107484 0.010002 -4.153066 +v -1.107484 0.010002 -4.245357 +v -1.199775 0.010002 -4.245357 +v -1.015194 0.010001 -3.230163 +v -0.922904 0.010001 -3.230163 +v -0.922904 0.010001 -3.322453 +v -1.015194 0.010001 -3.322453 +v -1.015194 0.010001 -3.045582 +v -0.922904 0.010001 -3.045582 +v -0.922904 0.010001 -3.137872 +v -1.015194 0.010001 -3.137872 +v -0.830613 0.010001 -3.045582 +v -0.738323 0.010001 -3.045582 +v -0.738323 0.010001 -3.137872 +v -0.830613 0.010001 -3.137872 +v -1.384355 0.010001 -3.230163 +v -1.292065 0.010001 -3.230163 +v -1.292065 0.010001 -3.322453 +v -1.384355 0.010001 -3.322453 +v -1.384355 0.010001 -3.045582 +v -1.292065 0.010001 -3.045582 +v -1.292065 0.010001 -3.137872 +v -1.384355 0.010001 -3.137872 +v -1.199775 0.010001 -3.045582 +v -1.107484 0.010001 -3.045582 +v -1.107484 0.010001 -3.137872 +v -1.199775 0.010001 -3.137872 +v -1.384355 0.010001 -3.599324 +v -1.292065 0.010001 -3.599324 +v -1.292065 0.010002 -3.691614 +v -1.384355 0.010002 -3.691614 +v -1.384355 0.010001 -3.414743 +v -1.292065 0.010001 -3.414743 +v -1.292065 0.010001 -3.507033 +v -1.384355 0.010001 -3.507033 +v -1.199775 0.010001 -3.414743 +v -1.107484 0.010001 -3.414743 +v -1.107484 0.010001 -3.507033 +v -1.199775 0.010001 -3.507033 +v -0.276871 0.010001 -3.230163 +v -0.184581 0.010001 -3.230163 +v -0.184581 0.010001 -3.322453 +v -0.276871 0.010001 -3.322453 +v -0.276871 0.010001 -3.045582 +v -0.184581 0.010001 -3.045582 +v -0.184581 0.010001 -3.137872 +v -0.276871 0.010001 -3.137872 +v -0.092290 0.010001 -3.045582 +v 0.000000 0.010001 -3.045582 +v 0.000000 0.010001 -3.137872 +v -0.092290 0.010001 -3.137872 +v -0.646033 0.010001 -3.230163 +v -0.553742 0.010001 -3.230163 +v -0.553742 0.010001 -3.322453 +v -0.646033 0.010001 -3.322453 +v -0.646033 0.010001 -3.045582 +v -0.553742 0.010001 -3.045582 +v -0.553742 0.010001 -3.137872 +v -0.646033 0.010001 -3.137872 +v -0.461452 0.010001 -3.045582 +v -0.369161 0.010001 -3.045582 +v -0.369161 0.010001 -3.137872 +v -0.461452 0.010001 -3.137872 +v -0.646033 0.010001 -3.599324 +v -0.553742 0.010001 -3.599324 +v -0.553742 0.010002 -3.691614 +v -0.646033 0.010002 -3.691614 +v -0.646033 0.010001 -3.414743 +v -0.553742 0.010001 -3.414743 +v -0.553742 0.010001 -3.507033 +v -0.646033 0.010001 -3.507033 +v -0.461452 0.010001 -3.414743 +v -0.369161 0.010001 -3.414743 +v -0.369161 0.010001 -3.507033 +v -0.461452 0.010001 -3.507033 +v -2.491840 0.010002 -3.968485 +v -2.399549 0.010002 -3.968485 +v -2.399549 0.010002 -4.060776 +v -2.491840 0.010002 -4.060776 +v -2.491840 0.010002 -3.783905 +v -2.399549 0.010002 -3.783905 +v -2.399549 0.010002 -3.876195 +v -2.491840 0.010002 -3.876195 +v -2.307259 0.010002 -3.783905 +v -2.214968 0.010002 -3.783905 +v -2.214968 0.010002 -3.876195 +v -2.307259 0.010002 -3.876195 +v -2.861001 0.010002 -3.968485 +v -2.768711 0.010002 -3.968485 +v -2.768711 0.010002 -4.060776 +v -2.861001 0.010002 -4.060776 +v -2.861001 0.010002 -3.783905 +v -2.768711 0.010002 -3.783905 +v -2.768711 0.010002 -3.876195 +v -2.861001 0.010002 -3.876195 +v -2.676420 0.010002 -3.783905 +v -2.584130 0.010002 -3.783905 +v -2.584130 0.010002 -3.876195 +v -2.676420 0.010002 -3.876195 +v -2.861001 0.010002 -4.337647 +v -2.768711 0.010002 -4.337647 +v -2.768711 0.010002 -4.429937 +v -2.861001 0.010002 -4.429937 +v -2.861001 0.010002 -4.153066 +v -2.768711 0.010002 -4.153066 +v -2.768711 0.010002 -4.245357 +v -2.861001 0.010002 -4.245357 +v -2.676420 0.010002 -4.153066 +v -2.584130 0.010002 -4.153066 +v -2.584130 0.010002 -4.245357 +v -2.676420 0.010002 -4.245357 +v -2.491840 0.010001 -3.230163 +v -2.399549 0.010001 -3.230163 +v -2.399549 0.010001 -3.322453 +v -2.491840 0.010001 -3.322453 +v -2.491840 0.010001 -3.045582 +v -2.399549 0.010001 -3.045582 +v -2.399549 0.010001 -3.137872 +v -2.491840 0.010001 -3.137872 +v -2.307259 0.010001 -3.045582 +v -2.214968 0.010001 -3.045582 +v -2.214968 0.010001 -3.137872 +v -2.307259 0.010001 -3.137872 +v -2.861001 0.010001 -3.230163 +v -2.768711 0.010001 -3.230163 +v -2.768711 0.010001 -3.322453 +v -2.861001 0.010001 -3.322453 +v -2.861001 0.010001 -3.045582 +v -2.768711 0.010001 -3.045582 +v -2.768711 0.010001 -3.137872 +v -2.861001 0.010001 -3.137872 +v -2.676420 0.010001 -3.045582 +v -2.584130 0.010001 -3.045582 +v -2.584130 0.010001 -3.137872 +v -2.676420 0.010001 -3.137872 +v -2.861001 0.010001 -3.599324 +v -2.768711 0.010001 -3.599324 +v -2.768711 0.010002 -3.691614 +v -2.861001 0.010002 -3.691614 +v -2.861001 0.010001 -3.414743 +v -2.768711 0.010001 -3.414743 +v -2.768711 0.010001 -3.507033 +v -2.861001 0.010001 -3.507033 +v -2.676420 0.010001 -3.414743 +v -2.584130 0.010001 -3.414743 +v -2.584130 0.010001 -3.507033 +v -2.676420 0.010001 -3.507033 +v -1.753517 0.010001 -3.230163 +v -1.661226 0.010001 -3.230163 +v -1.661226 0.010001 -3.322453 +v -1.753517 0.010001 -3.322453 +v -1.753517 0.010001 -3.045582 +v -1.661226 0.010001 -3.045582 +v -1.661226 0.010001 -3.137872 +v -1.753517 0.010001 -3.137872 +v -1.568936 0.010001 -3.045582 +v -1.476646 0.010001 -3.045582 +v -1.476646 0.010001 -3.137872 +v -1.568936 0.010001 -3.137872 +v -2.122678 0.010001 -3.230163 +v -2.030388 0.010001 -3.230163 +v -2.030388 0.010001 -3.322453 +v -2.122678 0.010001 -3.322453 +v -2.122678 0.010001 -3.045582 +v -2.030388 0.010001 -3.045582 +v -2.030388 0.010001 -3.137872 +v -2.122678 0.010001 -3.137872 +v -1.938097 0.010001 -3.045582 +v -1.845807 0.010001 -3.045582 +v -1.845807 0.010001 -3.137872 +v -1.938097 0.010001 -3.137872 +v -2.122678 0.010001 -3.599324 +v -2.030388 0.010001 -3.599324 +v -2.030388 0.010002 -3.691614 +v -2.122678 0.010002 -3.691614 +v -2.122678 0.010001 -3.414743 +v -2.030388 0.010001 -3.414743 +v -2.030388 0.010001 -3.507033 +v -2.122678 0.010001 -3.507033 +v -1.938097 0.010001 -3.414743 +v -1.845807 0.010001 -3.414743 +v -1.845807 0.010001 -3.507033 +v -1.938097 0.010001 -3.507033 +v -2.491840 0.010002 -5.445131 +v -2.399549 0.010002 -5.445131 +v -2.399549 0.010002 -5.537421 +v -2.491840 0.010002 -5.537421 +v -2.491840 0.010002 -5.260550 +v -2.399549 0.010002 -5.260550 +v -2.399549 0.010002 -5.352840 +v -2.491840 0.010002 -5.352840 +v -2.307259 0.010002 -5.260550 +v -2.214968 0.010002 -5.260550 +v -2.214968 0.010002 -5.352840 +v -2.307259 0.010002 -5.352840 +v -2.861001 0.010002 -5.445131 +v -2.768711 0.010002 -5.445131 +v -2.768711 0.010002 -5.537421 +v -2.861001 0.010002 -5.537421 +v -2.861001 0.010002 -5.260550 +v -2.768711 0.010002 -5.260550 +v -2.768711 0.010002 -5.352840 +v -2.861001 0.010002 -5.352840 +v -2.676420 0.010002 -5.260550 +v -2.584130 0.010002 -5.260550 +v -2.584130 0.010002 -5.352840 +v -2.676420 0.010002 -5.352840 +v -2.861001 0.010002 -5.814293 +v -2.768711 0.010002 -5.814293 +v -2.768711 0.010002 -5.906583 +v -2.861001 0.010002 -5.906583 +v -2.861001 0.010002 -5.629711 +v -2.768711 0.010002 -5.629711 +v -2.768711 0.010002 -5.722002 +v -2.861001 0.010002 -5.722002 +v -2.676420 0.010002 -5.629711 +v -2.584130 0.010002 -5.629711 +v -2.584130 0.010002 -5.722002 +v -2.676420 0.010002 -5.722002 +v -2.491840 0.010002 -4.706808 +v -2.399549 0.010002 -4.706808 +v -2.399549 0.010002 -4.799098 +v -2.491840 0.010002 -4.799098 +v -2.491840 0.010002 -4.522227 +v -2.399549 0.010002 -4.522227 +v -2.399549 0.010002 -4.614518 +v -2.491840 0.010002 -4.614518 +v -2.307259 0.010002 -4.522227 +v -2.214968 0.010002 -4.522227 +v -2.214968 0.010002 -4.614518 +v -2.307259 0.010002 -4.614518 +v -2.861001 0.010002 -4.706808 +v -2.768711 0.010002 -4.706808 +v -2.768711 0.010002 -4.799098 +v -2.861001 0.010002 -4.799098 +v -2.861001 0.010002 -4.522227 +v -2.768711 0.010002 -4.522227 +v -2.768711 0.010002 -4.614518 +v -2.861001 0.010002 -4.614518 +v -2.676420 0.010002 -4.522227 +v -2.584130 0.010002 -4.522227 +v -2.584130 0.010002 -4.614518 +v -2.676420 0.010002 -4.614518 +v -2.861001 0.010002 -5.075970 +v -2.768711 0.010002 -5.075970 +v -2.768711 0.010002 -5.168260 +v -2.861001 0.010002 -5.168260 +v -2.861001 0.010002 -4.891389 +v -2.768711 0.010002 -4.891389 +v -2.768711 0.010002 -4.983679 +v -2.861001 0.010002 -4.983679 +v -2.676420 0.010002 -4.891389 +v -2.584130 0.010002 -4.891389 +v -2.584130 0.010002 -4.983679 +v -2.676420 0.010002 -4.983679 +v -1.753517 0.010002 -4.706808 +v -1.661226 0.010002 -4.706808 +v -1.661226 0.010002 -4.799098 +v -1.753517 0.010002 -4.799098 +v -1.753517 0.010002 -4.522227 +v -1.661226 0.010002 -4.522227 +v -1.661226 0.010002 -4.614518 +v -1.753517 0.010002 -4.614518 +v -1.568936 0.010002 -4.522227 +v -1.476646 0.010002 -4.522227 +v -1.476646 0.010002 -4.614518 +v -1.568936 0.010002 -4.614518 +v -2.122678 0.010002 -4.706808 +v -2.030388 0.010002 -4.706808 +v -2.030388 0.010002 -4.799098 +v -2.122678 0.010002 -4.799098 +v -2.122678 0.010002 -4.522227 +v -2.030388 0.010002 -4.522227 +v -2.030388 0.010002 -4.614518 +v -2.122678 0.010002 -4.614518 +v -1.938097 0.010002 -4.522227 +v -1.845807 0.010002 -4.522227 +v -1.845807 0.010002 -4.614518 +v -1.938097 0.010002 -4.614518 +v -2.122678 0.010002 -5.075970 +v -2.030388 0.010002 -5.075970 +v -2.030388 0.010002 -5.168260 +v -2.122678 0.010002 -5.168260 +v -2.122678 0.010002 -4.891389 +v -2.030388 0.010002 -4.891389 +v -2.030388 0.010002 -4.983679 +v -2.122678 0.010002 -4.983679 +v -1.938097 0.010002 -4.891389 +v -1.845807 0.010002 -4.891389 +v -1.845807 0.010002 -4.983679 +v -1.938097 0.010002 -4.983679 +v -1.015194 0.009999 1.938097 +v -0.922904 0.009999 1.938097 +v -0.922904 0.009999 1.845807 +v -1.015194 0.009999 1.845807 +v -1.015194 0.009999 2.122678 +v -0.922904 0.009999 2.122678 +v -0.922904 0.009999 2.030388 +v -1.015194 0.009999 2.030388 +v -0.830613 0.009999 2.122678 +v -0.738323 0.009999 2.122678 +v -0.738323 0.009999 2.030388 +v -0.830613 0.009999 2.030388 +v -1.384355 0.009999 1.938097 +v -1.292065 0.009999 1.938097 +v -1.292065 0.009999 1.845807 +v -1.384355 0.009999 1.845807 +v -1.384355 0.009999 2.122678 +v -1.292065 0.009999 2.122678 +v -1.292065 0.009999 2.030388 +v -1.384355 0.009999 2.030388 +v -1.199775 0.009999 2.122678 +v -1.107484 0.009999 2.122678 +v -1.107484 0.009999 2.030388 +v -1.199775 0.009999 2.030388 +v -1.384355 0.009999 1.568936 +v -1.292065 0.009999 1.568936 +v -1.292065 0.009999 1.476646 +v -1.384355 0.009999 1.476646 +v -1.384355 0.009999 1.753517 +v -1.292065 0.009999 1.753517 +v -1.292065 0.009999 1.661226 +v -1.384355 0.009999 1.661226 +v -1.199775 0.009999 1.753517 +v -1.107484 0.009999 1.753517 +v -1.107484 0.009999 1.661226 +v -1.199775 0.009999 1.661226 +v -1.015194 0.009999 2.676420 +v -0.922904 0.009999 2.676420 +v -0.922904 0.009999 2.584130 +v -1.015194 0.009999 2.584130 +v -1.015194 0.009999 2.861001 +v -0.922904 0.009999 2.861001 +v -0.922904 0.009999 2.768711 +v -1.015194 0.009999 2.768711 +v -0.830613 0.009999 2.861001 +v -0.738323 0.009999 2.861001 +v -0.738323 0.009999 2.768711 +v -0.830613 0.009999 2.768711 +v -1.384355 0.009999 2.676420 +v -1.292065 0.009999 2.676420 +v -1.292065 0.009999 2.584130 +v -1.384355 0.009999 2.584130 +v -1.384355 0.009999 2.861001 +v -1.292065 0.009999 2.861001 +v -1.292065 0.009999 2.768711 +v -1.384355 0.009999 2.768711 +v -1.199775 0.009999 2.861001 +v -1.107484 0.009999 2.861001 +v -1.107484 0.009999 2.768711 +v -1.199775 0.009999 2.768711 +v -1.384355 0.009999 2.307259 +v -1.292065 0.009999 2.307259 +v -1.292065 0.009999 2.214968 +v -1.384355 0.009999 2.214968 +v -1.384355 0.009999 2.491840 +v -1.292065 0.009999 2.491840 +v -1.292065 0.009999 2.399549 +v -1.384355 0.009999 2.399549 +v -1.199775 0.009999 2.491840 +v -1.107484 0.009999 2.491840 +v -1.107484 0.009999 2.399549 +v -1.199775 0.009999 2.399549 +v -0.276871 0.009999 2.676420 +v -0.184581 0.009999 2.676420 +v -0.184581 0.009999 2.584130 +v -0.276871 0.009999 2.584130 +v -0.276871 0.009999 2.861001 +v -0.184581 0.009999 2.861001 +v -0.184581 0.009999 2.768711 +v -0.276871 0.009999 2.768711 +v -0.092290 0.009999 2.861001 +v 0.000000 0.009999 2.861001 +v 0.000000 0.009999 2.768711 +v -0.092290 0.009999 2.768711 +v -0.646033 0.009999 2.676420 +v -0.553742 0.009999 2.676420 +v -0.553742 0.009999 2.584130 +v -0.646033 0.009999 2.584130 +v -0.646033 0.009999 2.861001 +v -0.553742 0.009999 2.861001 +v -0.553742 0.009999 2.768711 +v -0.646033 0.009999 2.768711 +v -0.461452 0.009999 2.861001 +v -0.369161 0.009999 2.861001 +v -0.369161 0.009999 2.768711 +v -0.461452 0.009999 2.768711 +v -0.646033 0.009999 2.307259 +v -0.553742 0.009999 2.307259 +v -0.553742 0.009999 2.214968 +v -0.646033 0.009999 2.214968 +v -0.646033 0.009999 2.491840 +v -0.553742 0.009999 2.491840 +v -0.553742 0.009999 2.399549 +v -0.646033 0.009999 2.399549 +v -0.461452 0.009999 2.491840 +v -0.369161 0.009999 2.491840 +v -0.369161 0.009999 2.399549 +v -0.461452 0.009999 2.399549 +v -2.491840 0.009999 1.938097 +v -2.399549 0.009999 1.938097 +v -2.399549 0.009999 1.845807 +v -2.491840 0.009999 1.845807 +v -2.491840 0.009999 2.122678 +v -2.399549 0.009999 2.122678 +v -2.399549 0.009999 2.030388 +v -2.491840 0.009999 2.030388 +v -2.307259 0.009999 2.122678 +v -2.214968 0.009999 2.122678 +v -2.214968 0.009999 2.030388 +v -2.307259 0.009999 2.030388 +v -2.861001 0.009999 1.938097 +v -2.768711 0.009999 1.938097 +v -2.768711 0.009999 1.845807 +v -2.861001 0.009999 1.845807 +v -2.861001 0.009999 2.122678 +v -2.768711 0.009999 2.122678 +v -2.768711 0.009999 2.030388 +v -2.861001 0.009999 2.030388 +v -2.676420 0.009999 2.122678 +v -2.584130 0.009999 2.122678 +v -2.584130 0.009999 2.030388 +v -2.676420 0.009999 2.030388 +v -2.861001 0.009999 1.568936 +v -2.768711 0.009999 1.568936 +v -2.768711 0.009999 1.476646 +v -2.861001 0.009999 1.476646 +v -2.861001 0.009999 1.753517 +v -2.768711 0.009999 1.753517 +v -2.768711 0.009999 1.661226 +v -2.861001 0.009999 1.661226 +v -2.676420 0.009999 1.753517 +v -2.584130 0.009999 1.753517 +v -2.584130 0.009999 1.661226 +v -2.676420 0.009999 1.661226 +v -2.491840 0.009999 2.676420 +v -2.399549 0.009999 2.676420 +v -2.399549 0.009999 2.584130 +v -2.491840 0.009999 2.584130 +v -2.491840 0.009999 2.861001 +v -2.399549 0.009999 2.861001 +v -2.399549 0.009999 2.768711 +v -2.491840 0.009999 2.768711 +v -2.307259 0.009999 2.861001 +v -2.214968 0.009999 2.861001 +v -2.214968 0.009999 2.768711 +v -2.307259 0.009999 2.768711 +v -2.861001 0.009999 2.676420 +v -2.768711 0.009999 2.676420 +v -2.768711 0.009999 2.584130 +v -2.861001 0.009999 2.584130 +v -2.861001 0.009999 2.861001 +v -2.768711 0.009999 2.861001 +v -2.768711 0.009999 2.768711 +v -2.861001 0.009999 2.768711 +v -2.676420 0.009999 2.861001 +v -2.584130 0.009999 2.861001 +v -2.584130 0.009999 2.768711 +v -2.676420 0.009999 2.768711 +v -2.861001 0.009999 2.307259 +v -2.768711 0.009999 2.307259 +v -2.768711 0.009999 2.214968 +v -2.861001 0.009999 2.214968 +v -2.861001 0.009999 2.491840 +v -2.768711 0.009999 2.491840 +v -2.768711 0.009999 2.399549 +v -2.861001 0.009999 2.399549 +v -2.676420 0.009999 2.491840 +v -2.584130 0.009999 2.491840 +v -2.584130 0.009999 2.399549 +v -2.676420 0.009999 2.399549 +v -1.753517 0.009999 2.676420 +v -1.661226 0.009999 2.676420 +v -1.661226 0.009999 2.584130 +v -1.753517 0.009999 2.584130 +v -1.753517 0.009999 2.861001 +v -1.661226 0.009999 2.861001 +v -1.661226 0.009999 2.768711 +v -1.753517 0.009999 2.768711 +v -1.568936 0.009999 2.861001 +v -1.476646 0.009999 2.861001 +v -1.476646 0.009999 2.768711 +v -1.568936 0.009999 2.768711 +v -2.122678 0.009999 2.676420 +v -2.030388 0.009999 2.676420 +v -2.030388 0.009999 2.584130 +v -2.122678 0.009999 2.584130 +v -2.122678 0.009999 2.861001 +v -2.030388 0.009999 2.861001 +v -2.030388 0.009999 2.768711 +v -2.122678 0.009999 2.768711 +v -1.938097 0.009999 2.861001 +v -1.845807 0.009999 2.861001 +v -1.845807 0.009999 2.768711 +v -1.938097 0.009999 2.768711 +v -2.122678 0.009999 2.307259 +v -2.030388 0.009999 2.307259 +v -2.030388 0.009999 2.214968 +v -2.122678 0.009999 2.214968 +v -2.122678 0.009999 2.491840 +v -2.030388 0.009999 2.491840 +v -2.030388 0.009999 2.399549 +v -2.122678 0.009999 2.399549 +v -1.938097 0.009999 2.491840 +v -1.845807 0.009999 2.491840 +v -1.845807 0.009999 2.399549 +v -1.938097 0.009999 2.399549 +v -2.491840 0.010000 0.461452 +v -2.399549 0.010000 0.461452 +v -2.399549 0.010000 0.369161 +v -2.491840 0.010000 0.369161 +v -2.491840 0.010000 0.646033 +v -2.399549 0.010000 0.646033 +v -2.399549 0.010000 0.553742 +v -2.491840 0.010000 0.553742 +v -2.307259 0.010000 0.646033 +v -2.214968 0.010000 0.646033 +v -2.214968 0.010000 0.553742 +v -2.307259 0.010000 0.553742 +v -2.861001 0.010000 0.461452 +v -2.768711 0.010000 0.461452 +v -2.768711 0.010000 0.369161 +v -2.861001 0.010000 0.369161 +v -2.861001 0.010000 0.646033 +v -2.768711 0.010000 0.646033 +v -2.768711 0.010000 0.553742 +v -2.861001 0.010000 0.553742 +v -2.676420 0.010000 0.646033 +v -2.584130 0.010000 0.646033 +v -2.584130 0.010000 0.553742 +v -2.676420 0.010000 0.553742 +v -2.861001 0.010000 0.092290 +v -2.768711 0.010000 0.092290 +v -2.768711 0.010000 -0.000000 +v -2.861001 0.010000 -0.000000 +v -2.861001 0.010000 0.276871 +v -2.768711 0.010000 0.276871 +v -2.768711 0.010000 0.184581 +v -2.861001 0.010000 0.184581 +v -2.676420 0.010000 0.276871 +v -2.584130 0.010000 0.276871 +v -2.584130 0.010000 0.184581 +v -2.676420 0.010000 0.184581 +v -2.491840 0.010000 1.199775 +v -2.399549 0.010000 1.199775 +v -2.399549 0.010000 1.107484 +v -2.491840 0.010000 1.107484 +v -2.491840 0.009999 1.384355 +v -2.399549 0.009999 1.384355 +v -2.399549 0.009999 1.292065 +v -2.491840 0.009999 1.292065 +v -2.307259 0.009999 1.384355 +v -2.214968 0.009999 1.384355 +v -2.214968 0.009999 1.292065 +v -2.307259 0.009999 1.292065 +v -2.861001 0.010000 1.199775 +v -2.768711 0.010000 1.199775 +v -2.768711 0.010000 1.107484 +v -2.861001 0.010000 1.107484 +v -2.861001 0.009999 1.384355 +v -2.768711 0.009999 1.384355 +v -2.768711 0.009999 1.292065 +v -2.861001 0.009999 1.292065 +v -2.676420 0.009999 1.384355 +v -2.584130 0.009999 1.384355 +v -2.584130 0.009999 1.292065 +v -2.676420 0.009999 1.292065 +v -2.861001 0.010000 0.830613 +v -2.768711 0.010000 0.830613 +v -2.768711 0.010000 0.738323 +v -2.861001 0.010000 0.738323 +v -2.861001 0.010000 1.015194 +v -2.768711 0.010000 1.015194 +v -2.768711 0.010000 0.922904 +v -2.861001 0.010000 0.922904 +v -2.676420 0.010000 1.015194 +v -2.584130 0.010000 1.015194 +v -2.584130 0.010000 0.922904 +v -2.676420 0.010000 0.922904 +v -1.753517 0.010000 1.199775 +v -1.661226 0.010000 1.199775 +v -1.661226 0.010000 1.107484 +v -1.753517 0.010000 1.107484 +v -1.753517 0.009999 1.384355 +v -1.661226 0.009999 1.384355 +v -1.661226 0.009999 1.292065 +v -1.753517 0.009999 1.292065 +v -1.568936 0.009999 1.384355 +v -1.476646 0.009999 1.384355 +v -1.476646 0.009999 1.292065 +v -1.568936 0.009999 1.292065 +v -2.122678 0.010000 1.199775 +v -2.030388 0.010000 1.199775 +v -2.030388 0.010000 1.107484 +v -2.122678 0.010000 1.107484 +v -2.122678 0.009999 1.384355 +v -2.030388 0.009999 1.384355 +v -2.030388 0.009999 1.292065 +v -2.122678 0.009999 1.292065 +v -1.938097 0.009999 1.384355 +v -1.845807 0.009999 1.384355 +v -1.845807 0.009999 1.292065 +v -1.938097 0.009999 1.292065 +v -2.122678 0.010000 0.830613 +v -2.030388 0.010000 0.830613 +v -2.030388 0.010000 0.738323 +v -2.122678 0.010000 0.738323 +v -2.122678 0.010000 1.015194 +v -2.030388 0.010000 1.015194 +v -2.030388 0.010000 0.922904 +v -2.122678 0.010000 0.922904 +v -1.938097 0.010000 1.015194 +v -1.845807 0.010000 1.015194 +v -1.845807 0.010000 0.922904 +v -1.938097 0.010000 0.922904 +v 4.891389 0.009999 1.938097 +v 4.983679 0.009999 1.938097 +v 4.983679 0.009999 1.845807 +v 4.891389 0.009999 1.845807 +v 4.891389 0.009999 2.122678 +v 4.983679 0.009999 2.122678 +v 4.983679 0.009999 2.030388 +v 4.891389 0.009999 2.030388 +v 5.075970 0.009999 2.122678 +v 5.168260 0.009999 2.122678 +v 5.168260 0.009999 2.030388 +v 5.075970 0.009999 2.030388 +v 4.522227 0.009999 1.938097 +v 4.614518 0.009999 1.938097 +v 4.614518 0.009999 1.845807 +v 4.522227 0.009999 1.845807 +v 4.522227 0.009999 2.122678 +v 4.614518 0.009999 2.122678 +v 4.614518 0.009999 2.030388 +v 4.522227 0.009999 2.030388 +v 4.706808 0.009999 2.122678 +v 4.799098 0.009999 2.122678 +v 4.799098 0.009999 2.030388 +v 4.706808 0.009999 2.030388 +v 4.522227 0.009999 1.568936 +v 4.614518 0.009999 1.568936 +v 4.614518 0.009999 1.476646 +v 4.522227 0.009999 1.476646 +v 4.522227 0.009999 1.753517 +v 4.614518 0.009999 1.753517 +v 4.614518 0.009999 1.661226 +v 4.522227 0.009999 1.661226 +v 4.706808 0.009999 1.753517 +v 4.799098 0.009999 1.753517 +v 4.799098 0.009999 1.661226 +v 4.706808 0.009999 1.661226 +v 4.891389 0.009999 2.676420 +v 4.983679 0.009999 2.676420 +v 4.983679 0.009999 2.584130 +v 4.891389 0.009999 2.584130 +v 4.891389 0.009999 2.861001 +v 4.983679 0.009999 2.861001 +v 4.983679 0.009999 2.768711 +v 4.891389 0.009999 2.768711 +v 5.075970 0.009999 2.861001 +v 5.168260 0.009999 2.861001 +v 5.168260 0.009999 2.768711 +v 5.075970 0.009999 2.768711 +v 4.522227 0.009999 2.676420 +v 4.614518 0.009999 2.676420 +v 4.614518 0.009999 2.584130 +v 4.522227 0.009999 2.584130 +v 4.522227 0.009999 2.861001 +v 4.614518 0.009999 2.861001 +v 4.614518 0.009999 2.768711 +v 4.522227 0.009999 2.768711 +v 4.706808 0.009999 2.861001 +v 4.799098 0.009999 2.861001 +v 4.799098 0.009999 2.768711 +v 4.706808 0.009999 2.768711 +v 4.522227 0.009999 2.307259 +v 4.614518 0.009999 2.307259 +v 4.614518 0.009999 2.214968 +v 4.522227 0.009999 2.214968 +v 4.522227 0.009999 2.491840 +v 4.614518 0.009999 2.491840 +v 4.614518 0.009999 2.399549 +v 4.522227 0.009999 2.399549 +v 4.706808 0.009999 2.491840 +v 4.799098 0.009999 2.491840 +v 4.799098 0.009999 2.399549 +v 4.706808 0.009999 2.399549 +v 5.629711 0.009999 2.676420 +v 5.722002 0.009999 2.676420 +v 5.722002 0.009999 2.584130 +v 5.629711 0.009999 2.584130 +v 5.629711 0.009999 2.861001 +v 5.722002 0.009999 2.861001 +v 5.722002 0.009999 2.768711 +v 5.629711 0.009999 2.768711 +v 5.814293 0.009999 2.861001 +v 5.906583 0.009999 2.861001 +v 5.906583 0.009999 2.768711 +v 5.814293 0.009999 2.768711 +v 5.260550 0.009999 2.676420 +v 5.352840 0.009999 2.676420 +v 5.352840 0.009999 2.584130 +v 5.260550 0.009999 2.584130 +v 5.260550 0.009999 2.861001 +v 5.352840 0.009999 2.861001 +v 5.352840 0.009999 2.768711 +v 5.260550 0.009999 2.768711 +v 5.445131 0.009999 2.861001 +v 5.537421 0.009999 2.861001 +v 5.537421 0.009999 2.768711 +v 5.445131 0.009999 2.768711 +v 5.260550 0.009999 2.307259 +v 5.352840 0.009999 2.307259 +v 5.352840 0.009999 2.214968 +v 5.260550 0.009999 2.214968 +v 5.260550 0.009999 2.491840 +v 5.352840 0.009999 2.491840 +v 5.352840 0.009999 2.399549 +v 5.260550 0.009999 2.399549 +v 5.445131 0.009999 2.491840 +v 5.537421 0.009999 2.491840 +v 5.537421 0.009999 2.399549 +v 5.445131 0.009999 2.399549 +v 3.414743 0.009999 1.938097 +v 3.507033 0.009999 1.938097 +v 3.507033 0.009999 1.845807 +v 3.414743 0.009999 1.845807 +v 3.414743 0.009999 2.122678 +v 3.507033 0.009999 2.122678 +v 3.507033 0.009999 2.030388 +v 3.414743 0.009999 2.030388 +v 3.599324 0.009999 2.122678 +v 3.691614 0.009999 2.122678 +v 3.691614 0.009999 2.030388 +v 3.599324 0.009999 2.030388 +v 3.045582 0.009999 1.938097 +v 3.137872 0.009999 1.938097 +v 3.137872 0.009999 1.845807 +v 3.045582 0.009999 1.845807 +v 3.045582 0.009999 2.122678 +v 3.137872 0.009999 2.122678 +v 3.137872 0.009999 2.030388 +v 3.045582 0.009999 2.030388 +v 3.230163 0.009999 2.122678 +v 3.322453 0.009999 2.122678 +v 3.322453 0.009999 2.030388 +v 3.230163 0.009999 2.030388 +v 3.045582 0.009999 1.568936 +v 3.137872 0.009999 1.568936 +v 3.137872 0.009999 1.476646 +v 3.045582 0.009999 1.476646 +v 3.045582 0.009999 1.753517 +v 3.137872 0.009999 1.753517 +v 3.137872 0.009999 1.661226 +v 3.045582 0.009999 1.661226 +v 3.230163 0.009999 1.753517 +v 3.322453 0.009999 1.753517 +v 3.322453 0.009999 1.661226 +v 3.230163 0.009999 1.661226 +v 3.414743 0.009999 2.676420 +v 3.507033 0.009999 2.676420 +v 3.507033 0.009999 2.584130 +v 3.414743 0.009999 2.584130 +v 3.414743 0.009999 2.861001 +v 3.507033 0.009999 2.861001 +v 3.507033 0.009999 2.768711 +v 3.414743 0.009999 2.768711 +v 3.599324 0.009999 2.861001 +v 3.691614 0.009999 2.861001 +v 3.691614 0.009999 2.768711 +v 3.599324 0.009999 2.768711 +v 3.045582 0.009999 2.676420 +v 3.137872 0.009999 2.676420 +v 3.137872 0.009999 2.584130 +v 3.045582 0.009999 2.584130 +v 3.045582 0.009999 2.861001 +v 3.137872 0.009999 2.861001 +v 3.137872 0.009999 2.768711 +v 3.045582 0.009999 2.768711 +v 3.230163 0.009999 2.861001 +v 3.322453 0.009999 2.861001 +v 3.322453 0.009999 2.768711 +v 3.230163 0.009999 2.768711 +v 3.045582 0.009999 2.307259 +v 3.137872 0.009999 2.307259 +v 3.137872 0.009999 2.214968 +v 3.045582 0.009999 2.214968 +v 3.045582 0.009999 2.491840 +v 3.137872 0.009999 2.491840 +v 3.137872 0.009999 2.399549 +v 3.045582 0.009999 2.399549 +v 3.230163 0.009999 2.491840 +v 3.322453 0.009999 2.491840 +v 3.322453 0.009999 2.399549 +v 3.230163 0.009999 2.399549 +v 4.153066 0.009999 2.676420 +v 4.245357 0.009999 2.676420 +v 4.245357 0.009999 2.584130 +v 4.153066 0.009999 2.584130 +v 4.153066 0.009999 2.861001 +v 4.245357 0.009999 2.861001 +v 4.245357 0.009999 2.768711 +v 4.153066 0.009999 2.768711 +v 4.337647 0.009999 2.861001 +v 4.429937 0.009999 2.861001 +v 4.429937 0.009999 2.768711 +v 4.337647 0.009999 2.768711 +v 3.783905 0.009999 2.676420 +v 3.876195 0.009999 2.676420 +v 3.876195 0.009999 2.584130 +v 3.783905 0.009999 2.584130 +v 3.783905 0.009999 2.861001 +v 3.876195 0.009999 2.861001 +v 3.876195 0.009999 2.768711 +v 3.783905 0.009999 2.768711 +v 3.968485 0.009999 2.861001 +v 4.060776 0.009999 2.861001 +v 4.060776 0.009999 2.768711 +v 3.968485 0.009999 2.768711 +v 3.783905 0.009999 2.307259 +v 3.876195 0.009999 2.307259 +v 3.876195 0.009999 2.214968 +v 3.783905 0.009999 2.214968 +v 3.783905 0.009999 2.491840 +v 3.876195 0.009999 2.491840 +v 3.876195 0.009999 2.399549 +v 3.783905 0.009999 2.399549 +v 3.968485 0.009999 2.491840 +v 4.060776 0.009999 2.491840 +v 4.060776 0.009999 2.399549 +v 3.968485 0.009999 2.399549 +v 3.414743 0.010000 0.461452 +v 3.507033 0.010000 0.461452 +v 3.507033 0.010000 0.369161 +v 3.414743 0.010000 0.369161 +v 3.414743 0.010000 0.646033 +v 3.507033 0.010000 0.646033 +v 3.507033 0.010000 0.553742 +v 3.414743 0.010000 0.553742 +v 3.599324 0.010000 0.646033 +v 3.691614 0.010000 0.646033 +v 3.691614 0.010000 0.553742 +v 3.599324 0.010000 0.553742 +v 3.045582 0.010000 0.461452 +v 3.137872 0.010000 0.461452 +v 3.137872 0.010000 0.369161 +v 3.045582 0.010000 0.369161 +v 3.045582 0.010000 0.646033 +v 3.137872 0.010000 0.646033 +v 3.137872 0.010000 0.553742 +v 3.045582 0.010000 0.553742 +v 3.230163 0.010000 0.646033 +v 3.322453 0.010000 0.646033 +v 3.322453 0.010000 0.553742 +v 3.230163 0.010000 0.553742 +v 3.045582 0.010000 0.092290 +v 3.137872 0.010000 0.092290 +v 3.137872 0.010000 -0.000000 +v 3.045582 0.010000 -0.000000 +v 3.045582 0.010000 0.276871 +v 3.137872 0.010000 0.276871 +v 3.137872 0.010000 0.184581 +v 3.045582 0.010000 0.184581 +v 3.230163 0.010000 0.276871 +v 3.322453 0.010000 0.276871 +v 3.322453 0.010000 0.184581 +v 3.230163 0.010000 0.184581 +v 3.414743 0.010000 1.199775 +v 3.507033 0.010000 1.199775 +v 3.507033 0.010000 1.107484 +v 3.414743 0.010000 1.107484 +v 3.414743 0.009999 1.384355 +v 3.507033 0.009999 1.384355 +v 3.507033 0.009999 1.292065 +v 3.414743 0.009999 1.292065 +v 3.599324 0.009999 1.384355 +v 3.691614 0.009999 1.384355 +v 3.691614 0.009999 1.292065 +v 3.599324 0.009999 1.292065 +v 3.045582 0.010000 1.199775 +v 3.137872 0.010000 1.199775 +v 3.137872 0.010000 1.107484 +v 3.045582 0.010000 1.107484 +v 3.045582 0.009999 1.384355 +v 3.137872 0.009999 1.384355 +v 3.137872 0.009999 1.292065 +v 3.045582 0.009999 1.292065 +v 3.230163 0.009999 1.384355 +v 3.322453 0.009999 1.384355 +v 3.322453 0.009999 1.292065 +v 3.230163 0.009999 1.292065 +v 3.045582 0.010000 0.830613 +v 3.137872 0.010000 0.830613 +v 3.137872 0.010000 0.738323 +v 3.045582 0.010000 0.738323 +v 3.045582 0.010000 1.015194 +v 3.137872 0.010000 1.015194 +v 3.137872 0.010000 0.922904 +v 3.045582 0.010000 0.922904 +v 3.230163 0.010000 1.015194 +v 3.322453 0.010000 1.015194 +v 3.322453 0.010000 0.922904 +v 3.230163 0.010000 0.922904 +v 4.153066 0.010000 1.199775 +v 4.245357 0.010000 1.199775 +v 4.245357 0.010000 1.107484 +v 4.153066 0.010000 1.107484 +v 4.153066 0.009999 1.384355 +v 4.245357 0.009999 1.384355 +v 4.245357 0.009999 1.292065 +v 4.153066 0.009999 1.292065 +v 4.337647 0.009999 1.384355 +v 4.429937 0.009999 1.384355 +v 4.429937 0.009999 1.292065 +v 4.337647 0.009999 1.292065 +v 3.783905 0.010000 1.199775 +v 3.876195 0.010000 1.199775 +v 3.876195 0.010000 1.107484 +v 3.783905 0.010000 1.107484 +v 3.783905 0.009999 1.384355 +v 3.876195 0.009999 1.384355 +v 3.876195 0.009999 1.292065 +v 3.783905 0.009999 1.292065 +v 3.968485 0.009999 1.384355 +v 4.060776 0.009999 1.384355 +v 4.060776 0.009999 1.292065 +v 3.968485 0.009999 1.292065 +v 3.783905 0.010000 0.830613 +v 3.876195 0.010000 0.830613 +v 3.876195 0.010000 0.738323 +v 3.783905 0.010000 0.738323 +v 3.783905 0.010000 1.015194 +v 3.876195 0.010000 1.015194 +v 3.876195 0.010000 0.922904 +v 3.783905 0.010000 0.922904 +v 3.968485 0.010000 1.015194 +v 4.060776 0.010000 1.015194 +v 4.060776 0.010000 0.922904 +v 3.968485 0.010000 0.922904 +v 1.938097 0.009999 1.938097 +v 2.030388 0.009999 1.938097 +v 2.030388 0.009999 1.845807 +v 1.938097 0.009999 1.845807 +v 1.938097 0.009999 2.122678 +v 2.030388 0.009999 2.122678 +v 2.030388 0.009999 2.030388 +v 1.938097 0.009999 2.030388 +v 2.122678 0.009999 2.122678 +v 2.214968 0.009999 2.122678 +v 2.214968 0.009999 2.030388 +v 2.122678 0.009999 2.030388 +v 1.568936 0.009999 1.938097 +v 1.661226 0.009999 1.938097 +v 1.661226 0.009999 1.845807 +v 1.568936 0.009999 1.845807 +v 1.568936 0.009999 2.122678 +v 1.661226 0.009999 2.122678 +v 1.661226 0.009999 2.030388 +v 1.568936 0.009999 2.030388 +v 1.753517 0.009999 2.122678 +v 1.845807 0.009999 2.122678 +v 1.845807 0.009999 2.030388 +v 1.753517 0.009999 2.030388 +v 1.568936 0.009999 1.568936 +v 1.661226 0.009999 1.568936 +v 1.661226 0.009999 1.476646 +v 1.568936 0.009999 1.476646 +v 1.568936 0.009999 1.753517 +v 1.661226 0.009999 1.753517 +v 1.661226 0.009999 1.661226 +v 1.568936 0.009999 1.661226 +v 1.753517 0.009999 1.753517 +v 1.845807 0.009999 1.753517 +v 1.845807 0.009999 1.661226 +v 1.753517 0.009999 1.661226 +v 1.938097 0.009999 2.676420 +v 2.030388 0.009999 2.676420 +v 2.030388 0.009999 2.584130 +v 1.938097 0.009999 2.584130 +v 1.938097 0.009999 2.861001 +v 2.030388 0.009999 2.861001 +v 2.030388 0.009999 2.768711 +v 1.938097 0.009999 2.768711 +v 2.122678 0.009999 2.861001 +v 2.214968 0.009999 2.861001 +v 2.214968 0.009999 2.768711 +v 2.122678 0.009999 2.768711 +v 1.568936 0.009999 2.676420 +v 1.661226 0.009999 2.676420 +v 1.661226 0.009999 2.584130 +v 1.568936 0.009999 2.584130 +v 1.568936 0.009999 2.861001 +v 1.661226 0.009999 2.861001 +v 1.661226 0.009999 2.768711 +v 1.568936 0.009999 2.768711 +v 1.753517 0.009999 2.861001 +v 1.845807 0.009999 2.861001 +v 1.845807 0.009999 2.768711 +v 1.753517 0.009999 2.768711 +v 1.568936 0.009999 2.307259 +v 1.661226 0.009999 2.307259 +v 1.661226 0.009999 2.214968 +v 1.568936 0.009999 2.214968 +v 1.568936 0.009999 2.491840 +v 1.661226 0.009999 2.491840 +v 1.661226 0.009999 2.399549 +v 1.568936 0.009999 2.399549 +v 1.753517 0.009999 2.491840 +v 1.845807 0.009999 2.491840 +v 1.845807 0.009999 2.399549 +v 1.753517 0.009999 2.399549 +v 2.676420 0.009999 2.676420 +v 2.768711 0.009999 2.676420 +v 2.768711 0.009999 2.584130 +v 2.676420 0.009999 2.584130 +v 2.676420 0.009999 2.861001 +v 2.768711 0.009999 2.861001 +v 2.768711 0.009999 2.768711 +v 2.676420 0.009999 2.768711 +v 2.861001 0.009999 2.861001 +v 2.953291 0.009999 2.861001 +v 2.953291 0.009999 2.768711 +v 2.861001 0.009999 2.768711 +v 2.307259 0.009999 2.676420 +v 2.399549 0.009999 2.676420 +v 2.399549 0.009999 2.584130 +v 2.307259 0.009999 2.584130 +v 2.307259 0.009999 2.861001 +v 2.399549 0.009999 2.861001 +v 2.399549 0.009999 2.768711 +v 2.307259 0.009999 2.768711 +v 2.491840 0.009999 2.861001 +v 2.584130 0.009999 2.861001 +v 2.584130 0.009999 2.768711 +v 2.491840 0.009999 2.768711 +v 2.307259 0.009999 2.307259 +v 2.399549 0.009999 2.307259 +v 2.399549 0.009999 2.214968 +v 2.307259 0.009999 2.214968 +v 2.307259 0.009999 2.491840 +v 2.399549 0.009999 2.491840 +v 2.399549 0.009999 2.399549 +v 2.307259 0.009999 2.399549 +v 2.491840 0.009999 2.491840 +v 2.584130 0.009999 2.491840 +v 2.584130 0.009999 2.399549 +v 2.491840 0.009999 2.399549 +v 0.461452 0.009999 1.938097 +v 0.553742 0.009999 1.938097 +v 0.553742 0.009999 1.845807 +v 0.461452 0.009999 1.845807 +v 0.461452 0.009999 2.122678 +v 0.553742 0.009999 2.122678 +v 0.553742 0.009999 2.030388 +v 0.461452 0.009999 2.030388 +v 0.646033 0.009999 2.122678 +v 0.738323 0.009999 2.122678 +v 0.738323 0.009999 2.030388 +v 0.646033 0.009999 2.030388 +v 0.092290 0.009999 1.938097 +v 0.184581 0.009999 1.938097 +v 0.184581 0.009999 1.845807 +v 0.092290 0.009999 1.845807 +v 0.092290 0.009999 2.122678 +v 0.184581 0.009999 2.122678 +v 0.184581 0.009999 2.030388 +v 0.092290 0.009999 2.030388 +v 0.276871 0.009999 2.122678 +v 0.369161 0.009999 2.122678 +v 0.369161 0.009999 2.030388 +v 0.276871 0.009999 2.030388 +v 0.092290 0.009999 1.568936 +v 0.184581 0.009999 1.568936 +v 0.184581 0.009999 1.476646 +v 0.092290 0.009999 1.476646 +v 0.092290 0.009999 1.753517 +v 0.184581 0.009999 1.753517 +v 0.184581 0.009999 1.661226 +v 0.092290 0.009999 1.661226 +v 0.276871 0.009999 1.753517 +v 0.369161 0.009999 1.753517 +v 0.369161 0.009999 1.661226 +v 0.276871 0.009999 1.661226 +v 0.461452 0.009999 2.676420 +v 0.553742 0.009999 2.676420 +v 0.553742 0.009999 2.584130 +v 0.461452 0.009999 2.584130 +v 0.461452 0.009999 2.861001 +v 0.553742 0.009999 2.861001 +v 0.553742 0.009999 2.768711 +v 0.461452 0.009999 2.768711 +v 0.646033 0.009999 2.861001 +v 0.738323 0.009999 2.861001 +v 0.738323 0.009999 2.768711 +v 0.646033 0.009999 2.768711 +v 0.092290 0.009999 2.676420 +v 0.184581 0.009999 2.676420 +v 0.184581 0.009999 2.584130 +v 0.092290 0.009999 2.584130 +v 0.092290 0.009999 2.861001 +v 0.184581 0.009999 2.861001 +v 0.184581 0.009999 2.768711 +v 0.092290 0.009999 2.768711 +v 0.276871 0.009999 2.861001 +v 0.369161 0.009999 2.861001 +v 0.369161 0.009999 2.768711 +v 0.276871 0.009999 2.768711 +v 0.092290 0.009999 2.307259 +v 0.184581 0.009999 2.307259 +v 0.184581 0.009999 2.214968 +v 0.092290 0.009999 2.214968 +v 0.092290 0.009999 2.491840 +v 0.184581 0.009999 2.491840 +v 0.184581 0.009999 2.399549 +v 0.092290 0.009999 2.399549 +v 0.276871 0.009999 2.491840 +v 0.369161 0.009999 2.491840 +v 0.369161 0.009999 2.399549 +v 0.276871 0.009999 2.399549 +v 1.199775 0.009999 2.676420 +v 1.292065 0.009999 2.676420 +v 1.292065 0.009999 2.584130 +v 1.199775 0.009999 2.584130 +v 1.199775 0.009999 2.861001 +v 1.292065 0.009999 2.861001 +v 1.292065 0.009999 2.768711 +v 1.199775 0.009999 2.768711 +v 1.384355 0.009999 2.861001 +v 1.476646 0.009999 2.861001 +v 1.476646 0.009999 2.768711 +v 1.384355 0.009999 2.768711 +v 0.830613 0.009999 2.676420 +v 0.922904 0.009999 2.676420 +v 0.922904 0.009999 2.584130 +v 0.830613 0.009999 2.584130 +v 0.830613 0.009999 2.861001 +v 0.922904 0.009999 2.861001 +v 0.922904 0.009999 2.768711 +v 0.830613 0.009999 2.768711 +v 1.015194 0.009999 2.861001 +v 1.107484 0.009999 2.861001 +v 1.107484 0.009999 2.768711 +v 1.015194 0.009999 2.768711 +v 0.830613 0.009999 2.307259 +v 0.922904 0.009999 2.307259 +v 0.922904 0.009999 2.214968 +v 0.830613 0.009999 2.214968 +v 0.830613 0.009999 2.491840 +v 0.922904 0.009999 2.491840 +v 0.922904 0.009999 2.399549 +v 0.830613 0.009999 2.399549 +v 1.015194 0.009999 2.491840 +v 1.107484 0.009999 2.491840 +v 1.107484 0.009999 2.399549 +v 1.015194 0.009999 2.399549 +v 0.461452 0.010000 0.461452 +v 0.553742 0.010000 0.461452 +v 0.553742 0.010000 0.369161 +v 0.461452 0.010000 0.369161 +v 0.461452 0.010000 0.646033 +v 0.553742 0.010000 0.646033 +v 0.553742 0.010000 0.553742 +v 0.461452 0.010000 0.553742 +v 0.646033 0.010000 0.646033 +v 0.738323 0.010000 0.646033 +v 0.738323 0.010000 0.553742 +v 0.646033 0.010000 0.553742 +v 0.092290 0.010000 0.461452 +v 0.184581 0.010000 0.461452 +v 0.184581 0.010000 0.369161 +v 0.092290 0.010000 0.369161 +v 0.092290 0.010000 0.646033 +v 0.184581 0.010000 0.646033 +v 0.184581 0.010000 0.553742 +v 0.092290 0.010000 0.553742 +v 0.276871 0.010000 0.646033 +v 0.369161 0.010000 0.646033 +v 0.369161 0.010000 0.553742 +v 0.276871 0.010000 0.553742 +v 0.092290 0.010000 0.092290 +v 0.184581 0.010000 0.092290 +v 0.184581 0.010000 -0.000000 +v 0.092290 0.010000 -0.000000 +v 0.092290 0.010000 0.276871 +v 0.184581 0.010000 0.276871 +v 0.184581 0.010000 0.184581 +v 0.092290 0.010000 0.184581 +v 0.276871 0.010000 0.276871 +v 0.369161 0.010000 0.276871 +v 0.369161 0.010000 0.184581 +v 0.276871 0.010000 0.184581 +v 0.461452 0.010000 1.199775 +v 0.553742 0.010000 1.199775 +v 0.553742 0.010000 1.107484 +v 0.461452 0.010000 1.107484 +v 0.461452 0.009999 1.384355 +v 0.553742 0.009999 1.384355 +v 0.553742 0.009999 1.292065 +v 0.461452 0.009999 1.292065 +v 0.646033 0.009999 1.384355 +v 0.738323 0.009999 1.384355 +v 0.738323 0.009999 1.292065 +v 0.646033 0.009999 1.292065 +v 0.092290 0.010000 1.199775 +v 0.184581 0.010000 1.199775 +v 0.184581 0.010000 1.107484 +v 0.092290 0.010000 1.107484 +v 0.092290 0.009999 1.384355 +v 0.184581 0.009999 1.384355 +v 0.184581 0.009999 1.292065 +v 0.092290 0.009999 1.292065 +v 0.276871 0.009999 1.384355 +v 0.369161 0.009999 1.384355 +v 0.369161 0.009999 1.292065 +v 0.276871 0.009999 1.292065 +v 0.092290 0.010000 0.830613 +v 0.184581 0.010000 0.830613 +v 0.184581 0.010000 0.738323 +v 0.092290 0.010000 0.738323 +v 0.092290 0.010000 1.015194 +v 0.184581 0.010000 1.015194 +v 0.184581 0.010000 0.922904 +v 0.092290 0.010000 0.922904 +v 0.276871 0.010000 1.015194 +v 0.369161 0.010000 1.015194 +v 0.369161 0.010000 0.922904 +v 0.276871 0.010000 0.922904 +v 1.199775 0.010000 1.199775 +v 1.292065 0.010000 1.199775 +v 1.292065 0.010000 1.107484 +v 1.199775 0.010000 1.107484 +v 1.199775 0.009999 1.384355 +v 1.292065 0.009999 1.384355 +v 1.292065 0.009999 1.292065 +v 1.199775 0.009999 1.292065 +v 1.384355 0.009999 1.384355 +v 1.476646 0.009999 1.384355 +v 1.476646 0.009999 1.292065 +v 1.384355 0.009999 1.292065 +v 0.830613 0.010000 1.199775 +v 0.922904 0.010000 1.199775 +v 0.922904 0.010000 1.107484 +v 0.830613 0.010000 1.107484 +v 0.830613 0.009999 1.384355 +v 0.922904 0.009999 1.384355 +v 0.922904 0.009999 1.292065 +v 0.830613 0.009999 1.292065 +v 1.015194 0.009999 1.384355 +v 1.107484 0.009999 1.384355 +v 1.107484 0.009999 1.292065 +v 1.015194 0.009999 1.292065 +v 0.830613 0.010000 0.830613 +v 0.922904 0.010000 0.830613 +v 0.922904 0.010000 0.738323 +v 0.830613 0.010000 0.738323 +v 0.830613 0.010000 1.015194 +v 0.922904 0.010000 1.015194 +v 0.922904 0.010000 0.922904 +v 0.830613 0.010000 0.922904 +v 1.015194 0.010000 1.015194 +v 1.107484 0.010000 1.015194 +v 1.107484 0.010000 0.922904 +v 1.015194 0.010000 0.922904 +v 1.938097 0.009998 4.891389 +v 2.030388 0.009998 4.891389 +v 2.030388 0.009998 4.799098 +v 1.938097 0.009998 4.799098 +v 1.938097 0.009998 5.075970 +v 2.030388 0.009998 5.075970 +v 2.030388 0.009998 4.983679 +v 1.938097 0.009998 4.983679 +v 2.122678 0.009998 5.075970 +v 2.214968 0.009998 5.075970 +v 2.214968 0.009998 4.983679 +v 2.122678 0.009998 4.983679 +v 1.568936 0.009998 4.891389 +v 1.661226 0.009998 4.891389 +v 1.661226 0.009998 4.799098 +v 1.568936 0.009998 4.799098 +v 1.568936 0.009998 5.075970 +v 1.661226 0.009998 5.075970 +v 1.661226 0.009998 4.983679 +v 1.568936 0.009998 4.983679 +v 1.753517 0.009998 5.075970 +v 1.845807 0.009998 5.075970 +v 1.845807 0.009998 4.983679 +v 1.753517 0.009998 4.983679 +v 1.568936 0.009998 4.522227 +v 1.661226 0.009998 4.522227 +v 1.661226 0.009998 4.429937 +v 1.568936 0.009998 4.429937 +v 1.568936 0.009998 4.706808 +v 1.661226 0.009998 4.706808 +v 1.661226 0.009998 4.614518 +v 1.568936 0.009998 4.614518 +v 1.753517 0.009998 4.706808 +v 1.845807 0.009998 4.706808 +v 1.845807 0.009998 4.614518 +v 1.753517 0.009998 4.614518 +v 1.938097 0.009998 5.629711 +v 2.030388 0.009998 5.629711 +v 2.030388 0.009998 5.537421 +v 1.938097 0.009998 5.537421 +v 1.938097 0.009998 5.814293 +v 2.030388 0.009998 5.814293 +v 2.030388 0.009998 5.722002 +v 1.938097 0.009998 5.722002 +v 2.122678 0.009998 5.814293 +v 2.214968 0.009998 5.814293 +v 2.214968 0.009998 5.722002 +v 2.122678 0.009998 5.722002 +v 1.568936 0.009998 5.629711 +v 1.661226 0.009998 5.629711 +v 1.661226 0.009998 5.537421 +v 1.568936 0.009998 5.537421 +v 1.568936 0.009998 5.814293 +v 1.661226 0.009998 5.814293 +v 1.661226 0.009998 5.722002 +v 1.568936 0.009998 5.722002 +v 1.753517 0.009998 5.814293 +v 1.845807 0.009998 5.814293 +v 1.845807 0.009998 5.722002 +v 1.753517 0.009998 5.722002 +v 1.568936 0.009998 5.260550 +v 1.661226 0.009998 5.260550 +v 1.661226 0.009998 5.168260 +v 1.568936 0.009998 5.168260 +v 1.568936 0.009998 5.445131 +v 1.661226 0.009998 5.445131 +v 1.661226 0.009998 5.352840 +v 1.568936 0.009998 5.352840 +v 1.753517 0.009998 5.445131 +v 1.845807 0.009998 5.445131 +v 1.845807 0.009998 5.352840 +v 1.753517 0.009998 5.352840 +v 2.676420 0.009998 5.629711 +v 2.768711 0.009998 5.629711 +v 2.768711 0.009998 5.537421 +v 2.676420 0.009998 5.537421 +v 2.676420 0.009998 5.814293 +v 2.768711 0.009998 5.814293 +v 2.768711 0.009998 5.722002 +v 2.676420 0.009998 5.722002 +v 2.861001 0.009998 5.814293 +v 2.953291 0.009998 5.814293 +v 2.953291 0.009998 5.722002 +v 2.861001 0.009998 5.722002 +v 2.307259 0.009998 5.629711 +v 2.399549 0.009998 5.629711 +v 2.399549 0.009998 5.537421 +v 2.307259 0.009998 5.537421 +v 2.307259 0.009998 5.814293 +v 2.399549 0.009998 5.814293 +v 2.399549 0.009998 5.722002 +v 2.307259 0.009998 5.722002 +v 2.491840 0.009998 5.814293 +v 2.584130 0.009998 5.814293 +v 2.584130 0.009998 5.722002 +v 2.491840 0.009998 5.722002 +v 2.307259 0.009998 5.260550 +v 2.399549 0.009998 5.260550 +v 2.399549 0.009998 5.168260 +v 2.307259 0.009998 5.168260 +v 2.307259 0.009998 5.445131 +v 2.399549 0.009998 5.445131 +v 2.399549 0.009998 5.352840 +v 2.307259 0.009998 5.352840 +v 2.491840 0.009998 5.445131 +v 2.584130 0.009998 5.445131 +v 2.584130 0.009998 5.352840 +v 2.491840 0.009998 5.352840 +v 0.461452 0.009998 4.891389 +v 0.553742 0.009998 4.891389 +v 0.553742 0.009998 4.799098 +v 0.461452 0.009998 4.799098 +v 0.461452 0.009998 5.075970 +v 0.553742 0.009998 5.075970 +v 0.553742 0.009998 4.983679 +v 0.461452 0.009998 4.983679 +v 0.646033 0.009998 5.075970 +v 0.738323 0.009998 5.075970 +v 0.738323 0.009998 4.983679 +v 0.646033 0.009998 4.983679 +v 0.092290 0.009998 4.891389 +v 0.184581 0.009998 4.891389 +v 0.184581 0.009998 4.799098 +v 0.092290 0.009998 4.799098 +v 0.092290 0.009998 5.075970 +v 0.184581 0.009998 5.075970 +v 0.184581 0.009998 4.983679 +v 0.092290 0.009998 4.983679 +v 0.276871 0.009998 5.075970 +v 0.369161 0.009998 5.075970 +v 0.369161 0.009998 4.983679 +v 0.276871 0.009998 4.983679 +v 0.092290 0.009998 4.522227 +v 0.184581 0.009998 4.522227 +v 0.184581 0.009998 4.429937 +v 0.092290 0.009998 4.429937 +v 0.092290 0.009998 4.706808 +v 0.184581 0.009998 4.706808 +v 0.184581 0.009998 4.614518 +v 0.092290 0.009998 4.614518 +v 0.276871 0.009998 4.706808 +v 0.369161 0.009998 4.706808 +v 0.369161 0.009998 4.614518 +v 0.276871 0.009998 4.614518 +v 0.461452 0.009998 5.629711 +v 0.553742 0.009998 5.629711 +v 0.553742 0.009998 5.537421 +v 0.461452 0.009998 5.537421 +v 0.461452 0.009998 5.814293 +v 0.553742 0.009998 5.814293 +v 0.553742 0.009998 5.722002 +v 0.461452 0.009998 5.722002 +v 0.646033 0.009998 5.814293 +v 0.738323 0.009998 5.814293 +v 0.738323 0.009998 5.722002 +v 0.646033 0.009998 5.722002 +v 0.092290 0.009998 5.629711 +v 0.184581 0.009998 5.629711 +v 0.184581 0.009998 5.537421 +v 0.092290 0.009998 5.537421 +v 0.092290 0.009998 5.814293 +v 0.184581 0.009998 5.814293 +v 0.184581 0.009998 5.722002 +v 0.092290 0.009998 5.722002 +v 0.276871 0.009998 5.814293 +v 0.369161 0.009998 5.814293 +v 0.369161 0.009998 5.722002 +v 0.276871 0.009998 5.722002 +v 0.092290 0.009998 5.260550 +v 0.184581 0.009998 5.260550 +v 0.184581 0.009998 5.168260 +v 0.092290 0.009998 5.168260 +v 0.092290 0.009998 5.445131 +v 0.184581 0.009998 5.445131 +v 0.184581 0.009998 5.352840 +v 0.092290 0.009998 5.352840 +v 0.276871 0.009998 5.445131 +v 0.369161 0.009998 5.445131 +v 0.369161 0.009998 5.352840 +v 0.276871 0.009998 5.352840 +v 1.199775 0.009998 5.629711 +v 1.292065 0.009998 5.629711 +v 1.292065 0.009998 5.537421 +v 1.199775 0.009998 5.537421 +v 1.199775 0.009998 5.814293 +v 1.292065 0.009998 5.814293 +v 1.292065 0.009998 5.722002 +v 1.199775 0.009998 5.722002 +v 1.384355 0.009998 5.814293 +v 1.476646 0.009998 5.814293 +v 1.476646 0.009998 5.722002 +v 1.384355 0.009998 5.722002 +v 0.830613 0.009998 5.629711 +v 0.922904 0.009998 5.629711 +v 0.922904 0.009998 5.537421 +v 0.830613 0.009998 5.537421 +v 0.830613 0.009998 5.814293 +v 0.922904 0.009998 5.814293 +v 0.922904 0.009998 5.722002 +v 0.830613 0.009998 5.722002 +v 1.015194 0.009998 5.814293 +v 1.107484 0.009998 5.814293 +v 1.107484 0.009998 5.722002 +v 1.015194 0.009998 5.722002 +v 0.830613 0.009998 5.260550 +v 0.922904 0.009998 5.260550 +v 0.922904 0.009998 5.168260 +v 0.830613 0.009998 5.168260 +v 0.830613 0.009998 5.445131 +v 0.922904 0.009998 5.445131 +v 0.922904 0.009998 5.352840 +v 0.830613 0.009998 5.352840 +v 1.015194 0.009998 5.445131 +v 1.107484 0.009998 5.445131 +v 1.107484 0.009998 5.352840 +v 1.015194 0.009998 5.352840 +v 0.461452 0.009999 3.414743 +v 0.553742 0.009999 3.414743 +v 0.553742 0.009999 3.322453 +v 0.461452 0.009999 3.322453 +v 0.461452 0.009999 3.599324 +v 0.553742 0.009999 3.599324 +v 0.553742 0.009999 3.507033 +v 0.461452 0.009999 3.507033 +v 0.646033 0.009999 3.599324 +v 0.738323 0.009999 3.599324 +v 0.738323 0.009999 3.507033 +v 0.646033 0.009999 3.507033 +v 0.092290 0.009999 3.414743 +v 0.184581 0.009999 3.414743 +v 0.184581 0.009999 3.322453 +v 0.092290 0.009999 3.322453 +v 0.092290 0.009999 3.599324 +v 0.184581 0.009999 3.599324 +v 0.184581 0.009999 3.507033 +v 0.092290 0.009999 3.507033 +v 0.276871 0.009999 3.599324 +v 0.369161 0.009999 3.599324 +v 0.369161 0.009999 3.507033 +v 0.276871 0.009999 3.507033 +v 0.092290 0.009999 3.045582 +v 0.184581 0.009999 3.045582 +v 0.184581 0.009999 2.953291 +v 0.092290 0.009999 2.953291 +v 0.092290 0.009999 3.230163 +v 0.184581 0.009999 3.230163 +v 0.184581 0.009999 3.137872 +v 0.092290 0.009999 3.137872 +v 0.276871 0.009999 3.230163 +v 0.369161 0.009999 3.230163 +v 0.369161 0.009999 3.137872 +v 0.276871 0.009999 3.137872 +v 0.461452 0.009998 4.153066 +v 0.553742 0.009998 4.153066 +v 0.553742 0.009998 4.060776 +v 0.461452 0.009998 4.060776 +v 0.461452 0.009998 4.337647 +v 0.553742 0.009998 4.337647 +v 0.553742 0.009998 4.245357 +v 0.461452 0.009998 4.245357 +v 0.646033 0.009998 4.337647 +v 0.738323 0.009998 4.337647 +v 0.738323 0.009998 4.245357 +v 0.646033 0.009998 4.245357 +v 0.092290 0.009998 4.153066 +v 0.184581 0.009998 4.153066 +v 0.184581 0.009998 4.060776 +v 0.092290 0.009998 4.060776 +v 0.092290 0.009998 4.337647 +v 0.184581 0.009998 4.337647 +v 0.184581 0.009998 4.245357 +v 0.092290 0.009998 4.245357 +v 0.276871 0.009998 4.337647 +v 0.369161 0.009998 4.337647 +v 0.369161 0.009998 4.245357 +v 0.276871 0.009998 4.245357 +v 0.092290 0.009998 3.783905 +v 0.184581 0.009998 3.783905 +v 0.184581 0.009998 3.691614 +v 0.092290 0.009998 3.691614 +v 0.092290 0.009998 3.968485 +v 0.184581 0.009998 3.968485 +v 0.184581 0.009998 3.876195 +v 0.092290 0.009998 3.876195 +v 0.276871 0.009998 3.968485 +v 0.369161 0.009998 3.968485 +v 0.369161 0.009998 3.876195 +v 0.276871 0.009998 3.876195 +v 1.199775 0.009998 4.153066 +v 1.292065 0.009998 4.153066 +v 1.292065 0.009998 4.060776 +v 1.199775 0.009998 4.060776 +v 1.199775 0.009998 4.337647 +v 1.292065 0.009998 4.337647 +v 1.292065 0.009998 4.245357 +v 1.199775 0.009998 4.245357 +v 1.384355 0.009998 4.337647 +v 1.476646 0.009998 4.337647 +v 1.476646 0.009998 4.245357 +v 1.384355 0.009998 4.245357 +v 0.830613 0.009998 4.153066 +v 0.922904 0.009998 4.153066 +v 0.922904 0.009998 4.060776 +v 0.830613 0.009998 4.060776 +v 0.830613 0.009998 4.337647 +v 0.922904 0.009998 4.337647 +v 0.922904 0.009998 4.245357 +v 0.830613 0.009998 4.245357 +v 1.015194 0.009998 4.337647 +v 1.107484 0.009998 4.337647 +v 1.107484 0.009998 4.245357 +v 1.015194 0.009998 4.245357 +v 0.830613 0.009998 3.783905 +v 0.922904 0.009998 3.783905 +v 0.922904 0.009998 3.691614 +v 0.830613 0.009998 3.691614 +v 0.830613 0.009998 3.968485 +v 0.922904 0.009998 3.968485 +v 0.922904 0.009998 3.876195 +v 0.830613 0.009998 3.876195 +v 1.015194 0.009998 3.968485 +v 1.107484 0.009998 3.968485 +v 1.107484 0.009998 3.876195 +v 1.015194 0.009998 3.876195 +v 4.891389 0.009998 4.891389 +v 4.983679 0.009998 4.891389 +v 4.983679 0.009998 4.799098 +v 4.891389 0.009998 4.799098 +v 4.891389 0.009998 5.075970 +v 4.983679 0.009998 5.075970 +v 4.983679 0.009998 4.983679 +v 4.891389 0.009998 4.983679 +v 5.075970 0.009998 5.075970 +v 5.168260 0.009998 5.075970 +v 5.168260 0.009998 4.983679 +v 5.075970 0.009998 4.983679 +v 4.522227 0.009998 4.891389 +v 4.614518 0.009998 4.891389 +v 4.614518 0.009998 4.799098 +v 4.522227 0.009998 4.799098 +v 4.522227 0.009998 5.075970 +v 4.614518 0.009998 5.075970 +v 4.614518 0.009998 4.983679 +v 4.522227 0.009998 4.983679 +v 4.706808 0.009998 5.075970 +v 4.799098 0.009998 5.075970 +v 4.799098 0.009998 4.983679 +v 4.706808 0.009998 4.983679 +v 4.522227 0.009998 4.522227 +v 4.614518 0.009998 4.522227 +v 4.614518 0.009998 4.429937 +v 4.522227 0.009998 4.429937 +v 4.522227 0.009998 4.706808 +v 4.614518 0.009998 4.706808 +v 4.614518 0.009998 4.614518 +v 4.522227 0.009998 4.614518 +v 4.706808 0.009998 4.706808 +v 4.799098 0.009998 4.706808 +v 4.799098 0.009998 4.614518 +v 4.706808 0.009998 4.614518 +v 4.891389 0.009998 5.629711 +v 4.983679 0.009998 5.629711 +v 4.983679 0.009998 5.537421 +v 4.891389 0.009998 5.537421 +v 4.891389 0.009998 5.814293 +v 4.983679 0.009998 5.814293 +v 4.983679 0.009998 5.722002 +v 4.891389 0.009998 5.722002 +v 5.075970 0.009998 5.814293 +v 5.168260 0.009998 5.814293 +v 5.168260 0.009998 5.722002 +v 5.075970 0.009998 5.722002 +v 4.522227 0.009998 5.629711 +v 4.614518 0.009998 5.629711 +v 4.614518 0.009998 5.537421 +v 4.522227 0.009998 5.537421 +v 4.522227 0.009998 5.814293 +v 4.614518 0.009998 5.814293 +v 4.614518 0.009998 5.722002 +v 4.522227 0.009998 5.722002 +v 4.706808 0.009998 5.814293 +v 4.799098 0.009998 5.814293 +v 4.799098 0.009998 5.722002 +v 4.706808 0.009998 5.722002 +v 4.522227 0.009998 5.260550 +v 4.614518 0.009998 5.260550 +v 4.614518 0.009998 5.168260 +v 4.522227 0.009998 5.168260 +v 4.522227 0.009998 5.445131 +v 4.614518 0.009998 5.445131 +v 4.614518 0.009998 5.352840 +v 4.522227 0.009998 5.352840 +v 4.706808 0.009998 5.445131 +v 4.799098 0.009998 5.445131 +v 4.799098 0.009998 5.352840 +v 4.706808 0.009998 5.352840 +v 5.629711 0.009998 5.629711 +v 5.722002 0.009998 5.629711 +v 5.722002 0.009998 5.537421 +v 5.629711 0.009998 5.537421 +v 5.629711 0.009998 5.814293 +v 5.722002 0.009998 5.814293 +v 5.722002 0.009998 5.722002 +v 5.629711 0.009998 5.722002 +v 5.814293 0.009998 5.814293 +v 5.906583 0.009998 5.814293 +v 5.906583 0.009998 5.722002 +v 5.814293 0.009998 5.722002 +v 5.260550 0.009998 5.629711 +v 5.352840 0.009998 5.629711 +v 5.352840 0.009998 5.537421 +v 5.260550 0.009998 5.537421 +v 5.260550 0.009998 5.814293 +v 5.352840 0.009998 5.814293 +v 5.352840 0.009998 5.722002 +v 5.260550 0.009998 5.722002 +v 5.445131 0.009998 5.814293 +v 5.537421 0.009998 5.814293 +v 5.537421 0.009998 5.722002 +v 5.445131 0.009998 5.722002 +v 5.260550 0.009998 5.260550 +v 5.352840 0.009998 5.260550 +v 5.352840 0.009998 5.168260 +v 5.260550 0.009998 5.168260 +v 5.260550 0.009998 5.445131 +v 5.352840 0.009998 5.445131 +v 5.352840 0.009998 5.352840 +v 5.260550 0.009998 5.352840 +v 5.445131 0.009998 5.445131 +v 5.537421 0.009998 5.445131 +v 5.537421 0.009998 5.352840 +v 5.445131 0.009998 5.352840 +v 3.414743 0.009998 4.891389 +v 3.507033 0.009998 4.891389 +v 3.507033 0.009998 4.799098 +v 3.414743 0.009998 4.799098 +v 3.414743 0.009998 5.075970 +v 3.507033 0.009998 5.075970 +v 3.507033 0.009998 4.983679 +v 3.414743 0.009998 4.983679 +v 3.599324 0.009998 5.075970 +v 3.691614 0.009998 5.075970 +v 3.691614 0.009998 4.983679 +v 3.599324 0.009998 4.983679 +v 3.045582 0.009998 4.891389 +v 3.137872 0.009998 4.891389 +v 3.137872 0.009998 4.799098 +v 3.045582 0.009998 4.799098 +v 3.045582 0.009998 5.075970 +v 3.137872 0.009998 5.075970 +v 3.137872 0.009998 4.983679 +v 3.045582 0.009998 4.983679 +v 3.230163 0.009998 5.075970 +v 3.322453 0.009998 5.075970 +v 3.322453 0.009998 4.983679 +v 3.230163 0.009998 4.983679 +v 3.045582 0.009998 4.522227 +v 3.137872 0.009998 4.522227 +v 3.137872 0.009998 4.429937 +v 3.045582 0.009998 4.429937 +v 3.045582 0.009998 4.706808 +v 3.137872 0.009998 4.706808 +v 3.137872 0.009998 4.614518 +v 3.045582 0.009998 4.614518 +v 3.230163 0.009998 4.706808 +v 3.322453 0.009998 4.706808 +v 3.322453 0.009998 4.614518 +v 3.230163 0.009998 4.614518 +v 3.414743 0.009998 5.629711 +v 3.507033 0.009998 5.629711 +v 3.507033 0.009998 5.537421 +v 3.414743 0.009998 5.537421 +v 3.414743 0.009998 5.814293 +v 3.507033 0.009998 5.814293 +v 3.507033 0.009998 5.722002 +v 3.414743 0.009998 5.722002 +v 3.599324 0.009998 5.814293 +v 3.691614 0.009998 5.814293 +v 3.691614 0.009998 5.722002 +v 3.599324 0.009998 5.722002 +v 3.045582 0.009998 5.629711 +v 3.137872 0.009998 5.629711 +v 3.137872 0.009998 5.537421 +v 3.045582 0.009998 5.537421 +v 3.045582 0.009998 5.814293 +v 3.137872 0.009998 5.814293 +v 3.137872 0.009998 5.722002 +v 3.045582 0.009998 5.722002 +v 3.230163 0.009998 5.814293 +v 3.322453 0.009998 5.814293 +v 3.322453 0.009998 5.722002 +v 3.230163 0.009998 5.722002 +v 3.045582 0.009998 5.260550 +v 3.137872 0.009998 5.260550 +v 3.137872 0.009998 5.168260 +v 3.045582 0.009998 5.168260 +v 3.045582 0.009998 5.445131 +v 3.137872 0.009998 5.445131 +v 3.137872 0.009998 5.352840 +v 3.045582 0.009998 5.352840 +v 3.230163 0.009998 5.445131 +v 3.322453 0.009998 5.445131 +v 3.322453 0.009998 5.352840 +v 3.230163 0.009998 5.352840 +v 4.153066 0.009998 5.629711 +v 4.245357 0.009998 5.629711 +v 4.245357 0.009998 5.537421 +v 4.153066 0.009998 5.537421 +v 4.153066 0.009998 5.814293 +v 4.245357 0.009998 5.814293 +v 4.245357 0.009998 5.722002 +v 4.153066 0.009998 5.722002 +v 4.337647 0.009998 5.814293 +v 4.429937 0.009998 5.814293 +v 4.429937 0.009998 5.722002 +v 4.337647 0.009998 5.722002 +v 3.783905 0.009998 5.629711 +v 3.876195 0.009998 5.629711 +v 3.876195 0.009998 5.537421 +v 3.783905 0.009998 5.537421 +v 3.783905 0.009998 5.814293 +v 3.876195 0.009998 5.814293 +v 3.876195 0.009998 5.722002 +v 3.783905 0.009998 5.722002 +v 3.968485 0.009998 5.814293 +v 4.060776 0.009998 5.814293 +v 4.060776 0.009998 5.722002 +v 3.968485 0.009998 5.722002 +v 3.783905 0.009998 5.260550 +v 3.876195 0.009998 5.260550 +v 3.876195 0.009998 5.168260 +v 3.783905 0.009998 5.168260 +v 3.783905 0.009998 5.445131 +v 3.876195 0.009998 5.445131 +v 3.876195 0.009998 5.352840 +v 3.783905 0.009998 5.352840 +v 3.968485 0.009998 5.445131 +v 4.060776 0.009998 5.445131 +v 4.060776 0.009998 5.352840 +v 3.968485 0.009998 5.352840 +v 3.414743 0.009999 3.414743 +v 3.507033 0.009999 3.414743 +v 3.507033 0.009999 3.322453 +v 3.414743 0.009999 3.322453 +v 3.414743 0.009999 3.599324 +v 3.507033 0.009999 3.599324 +v 3.507033 0.009999 3.507033 +v 3.414743 0.009999 3.507033 +v 3.599324 0.009999 3.599324 +v 3.691614 0.009999 3.599324 +v 3.691614 0.009999 3.507033 +v 3.599324 0.009999 3.507033 +v 3.045582 0.009999 3.414743 +v 3.137872 0.009999 3.414743 +v 3.137872 0.009999 3.322453 +v 3.045582 0.009999 3.322453 +v 3.045582 0.009999 3.599324 +v 3.137872 0.009999 3.599324 +v 3.137872 0.009999 3.507033 +v 3.045582 0.009999 3.507033 +v 3.230163 0.009999 3.599324 +v 3.322453 0.009999 3.599324 +v 3.322453 0.009999 3.507033 +v 3.230163 0.009999 3.507033 +v 3.045582 0.009999 3.045582 +v 3.137872 0.009999 3.045582 +v 3.137872 0.009999 2.953291 +v 3.045582 0.009999 2.953291 +v 3.045582 0.009999 3.230163 +v 3.137872 0.009999 3.230163 +v 3.137872 0.009999 3.137872 +v 3.045582 0.009999 3.137872 +v 3.230163 0.009999 3.230163 +v 3.322453 0.009999 3.230163 +v 3.322453 0.009999 3.137872 +v 3.230163 0.009999 3.137872 +v 3.414743 0.009998 4.153066 +v 3.507033 0.009998 4.153066 +v 3.507033 0.009998 4.060776 +v 3.414743 0.009998 4.060776 +v 3.414743 0.009998 4.337647 +v 3.507033 0.009998 4.337647 +v 3.507033 0.009998 4.245357 +v 3.414743 0.009998 4.245357 +v 3.599324 0.009998 4.337647 +v 3.691614 0.009998 4.337647 +v 3.691614 0.009998 4.245357 +v 3.599324 0.009998 4.245357 +v 3.045582 0.009998 4.153066 +v 3.137872 0.009998 4.153066 +v 3.137872 0.009998 4.060776 +v 3.045582 0.009998 4.060776 +v 3.045582 0.009998 4.337647 +v 3.137872 0.009998 4.337647 +v 3.137872 0.009998 4.245357 +v 3.045582 0.009998 4.245357 +v 3.230163 0.009998 4.337647 +v 3.322453 0.009998 4.337647 +v 3.322453 0.009998 4.245357 +v 3.230163 0.009998 4.245357 +v 3.045582 0.009998 3.783905 +v 3.137872 0.009998 3.783905 +v 3.137872 0.009998 3.691614 +v 3.045582 0.009998 3.691614 +v 3.045582 0.009998 3.968485 +v 3.137872 0.009998 3.968485 +v 3.137872 0.009998 3.876195 +v 3.045582 0.009998 3.876195 +v 3.230163 0.009998 3.968485 +v 3.322453 0.009998 3.968485 +v 3.322453 0.009998 3.876195 +v 3.230163 0.009998 3.876195 +v 4.153066 0.009998 4.153066 +v 4.245357 0.009998 4.153066 +v 4.245357 0.009998 4.060776 +v 4.153066 0.009998 4.060776 +v 4.153066 0.009998 4.337647 +v 4.245357 0.009998 4.337647 +v 4.245357 0.009998 4.245357 +v 4.153066 0.009998 4.245357 +v 4.337647 0.009998 4.337647 +v 4.429937 0.009998 4.337647 +v 4.429937 0.009998 4.245357 +v 4.337647 0.009998 4.245357 +v 3.783905 0.009998 4.153066 +v 3.876195 0.009998 4.153066 +v 3.876195 0.009998 4.060776 +v 3.783905 0.009998 4.060776 +v 3.783905 0.009998 4.337647 +v 3.876195 0.009998 4.337647 +v 3.876195 0.009998 4.245357 +v 3.783905 0.009998 4.245357 +v 3.968485 0.009998 4.337647 +v 4.060776 0.009998 4.337647 +v 4.060776 0.009998 4.245357 +v 3.968485 0.009998 4.245357 +v 3.783905 0.009998 3.783905 +v 3.876195 0.009998 3.783905 +v 3.876195 0.009998 3.691614 +v 3.783905 0.009998 3.691614 +v 3.783905 0.009998 3.968485 +v 3.876195 0.009998 3.968485 +v 3.876195 0.009998 3.876195 +v 3.783905 0.009998 3.876195 +v 3.968485 0.009998 3.968485 +v 4.060776 0.009998 3.968485 +v 4.060776 0.009998 3.876195 +v 3.968485 0.009998 3.876195 +v -3.968485 0.009999 1.938097 +v -3.876195 0.009999 1.938097 +v -3.876195 0.009999 1.845807 +v -3.968485 0.009999 1.845807 +v -3.968485 0.009999 2.122678 +v -3.876195 0.009999 2.122678 +v -3.876195 0.009999 2.030388 +v -3.968485 0.009999 2.030388 +v -3.783905 0.009999 2.122678 +v -3.691614 0.009999 2.122678 +v -3.691614 0.009999 2.030388 +v -3.783905 0.009999 2.030388 +v -4.337647 0.009999 1.938097 +v -4.245357 0.009999 1.938097 +v -4.245357 0.009999 1.845807 +v -4.337647 0.009999 1.845807 +v -4.337647 0.009999 2.122678 +v -4.245357 0.009999 2.122678 +v -4.245357 0.009999 2.030388 +v -4.337647 0.009999 2.030388 +v -4.153066 0.009999 2.122678 +v -4.060776 0.009999 2.122678 +v -4.060776 0.009999 2.030388 +v -4.153066 0.009999 2.030388 +v -4.337647 0.009999 1.568936 +v -4.245357 0.009999 1.568936 +v -4.245357 0.009999 1.476646 +v -4.337647 0.009999 1.476646 +v -4.337647 0.009999 1.753517 +v -4.245357 0.009999 1.753517 +v -4.245357 0.009999 1.661226 +v -4.337647 0.009999 1.661226 +v -4.153066 0.009999 1.753517 +v -4.060776 0.009999 1.753517 +v -4.060776 0.009999 1.661226 +v -4.153066 0.009999 1.661226 +v -3.968485 0.009999 2.676420 +v -3.876195 0.009999 2.676420 +v -3.876195 0.009999 2.584130 +v -3.968485 0.009999 2.584130 +v -3.968485 0.009999 2.861001 +v -3.876195 0.009999 2.861001 +v -3.876195 0.009999 2.768711 +v -3.968485 0.009999 2.768711 +v -3.783905 0.009999 2.861001 +v -3.691614 0.009999 2.861001 +v -3.691614 0.009999 2.768711 +v -3.783905 0.009999 2.768711 +v -4.337647 0.009999 2.676420 +v -4.245357 0.009999 2.676420 +v -4.245357 0.009999 2.584130 +v -4.337647 0.009999 2.584130 +v -4.337647 0.009999 2.861001 +v -4.245357 0.009999 2.861001 +v -4.245357 0.009999 2.768711 +v -4.337647 0.009999 2.768711 +v -4.153066 0.009999 2.861001 +v -4.060776 0.009999 2.861001 +v -4.060776 0.009999 2.768711 +v -4.153066 0.009999 2.768711 +v -4.337647 0.009999 2.307259 +v -4.245357 0.009999 2.307259 +v -4.245357 0.009999 2.214968 +v -4.337647 0.009999 2.214968 +v -4.337647 0.009999 2.491840 +v -4.245357 0.009999 2.491840 +v -4.245357 0.009999 2.399549 +v -4.337647 0.009999 2.399549 +v -4.153066 0.009999 2.491840 +v -4.060776 0.009999 2.491840 +v -4.060776 0.009999 2.399549 +v -4.153066 0.009999 2.399549 +v -3.230163 0.009999 2.676420 +v -3.137872 0.009999 2.676420 +v -3.137872 0.009999 2.584130 +v -3.230163 0.009999 2.584130 +v -3.230163 0.009999 2.861001 +v -3.137872 0.009999 2.861001 +v -3.137872 0.009999 2.768711 +v -3.230163 0.009999 2.768711 +v -3.045582 0.009999 2.861001 +v -2.953291 0.009999 2.861001 +v -2.953291 0.009999 2.768711 +v -3.045582 0.009999 2.768711 +v -3.599324 0.009999 2.676420 +v -3.507033 0.009999 2.676420 +v -3.507033 0.009999 2.584130 +v -3.599324 0.009999 2.584130 +v -3.599324 0.009999 2.861001 +v -3.507033 0.009999 2.861001 +v -3.507033 0.009999 2.768711 +v -3.599324 0.009999 2.768711 +v -3.414743 0.009999 2.861001 +v -3.322453 0.009999 2.861001 +v -3.322453 0.009999 2.768711 +v -3.414743 0.009999 2.768711 +v -3.599324 0.009999 2.307259 +v -3.507033 0.009999 2.307259 +v -3.507033 0.009999 2.214968 +v -3.599324 0.009999 2.214968 +v -3.599324 0.009999 2.491840 +v -3.507033 0.009999 2.491840 +v -3.507033 0.009999 2.399549 +v -3.599324 0.009999 2.399549 +v -3.414743 0.009999 2.491840 +v -3.322453 0.009999 2.491840 +v -3.322453 0.009999 2.399549 +v -3.414743 0.009999 2.399549 +v -5.445131 0.009999 1.938097 +v -5.352840 0.009999 1.938097 +v -5.352840 0.009999 1.845807 +v -5.445131 0.009999 1.845807 +v -5.445131 0.009999 2.122678 +v -5.352840 0.009999 2.122678 +v -5.352840 0.009999 2.030388 +v -5.445131 0.009999 2.030388 +v -5.260550 0.009999 2.122678 +v -5.168260 0.009999 2.122678 +v -5.168260 0.009999 2.030388 +v -5.260550 0.009999 2.030388 +v -5.814293 0.009999 1.938097 +v -5.722002 0.009999 1.938097 +v -5.722002 0.009999 1.845807 +v -5.814293 0.009999 1.845807 +v -5.814293 0.009999 2.122678 +v -5.722002 0.009999 2.122678 +v -5.722002 0.009999 2.030388 +v -5.814293 0.009999 2.030388 +v -5.629711 0.009999 2.122678 +v -5.537421 0.009999 2.122678 +v -5.537421 0.009999 2.030388 +v -5.629711 0.009999 2.030388 +v -5.814293 0.009999 1.568936 +v -5.722002 0.009999 1.568936 +v -5.722002 0.009999 1.476646 +v -5.814293 0.009999 1.476646 +v -5.814293 0.009999 1.753517 +v -5.722002 0.009999 1.753517 +v -5.722002 0.009999 1.661226 +v -5.814293 0.009999 1.661226 +v -5.629711 0.009999 1.753517 +v -5.537421 0.009999 1.753517 +v -5.537421 0.009999 1.661226 +v -5.629711 0.009999 1.661226 +v -5.445131 0.009999 2.676420 +v -5.352840 0.009999 2.676420 +v -5.352840 0.009999 2.584130 +v -5.445131 0.009999 2.584130 +v -5.445131 0.009999 2.861001 +v -5.352840 0.009999 2.861001 +v -5.352840 0.009999 2.768711 +v -5.445131 0.009999 2.768711 +v -5.260550 0.009999 2.861001 +v -5.168260 0.009999 2.861001 +v -5.168260 0.009999 2.768711 +v -5.260550 0.009999 2.768711 +v -5.814293 0.009999 2.676420 +v -5.722002 0.009999 2.676420 +v -5.722002 0.009999 2.584130 +v -5.814293 0.009999 2.584130 +v -5.814293 0.009999 2.861001 +v -5.722002 0.009999 2.861001 +v -5.722002 0.009999 2.768711 +v -5.814293 0.009999 2.768711 +v -5.629711 0.009999 2.861001 +v -5.537421 0.009999 2.861001 +v -5.537421 0.009999 2.768711 +v -5.629711 0.009999 2.768711 +v -5.814293 0.009999 2.307259 +v -5.722002 0.009999 2.307259 +v -5.722002 0.009999 2.214968 +v -5.814293 0.009999 2.214968 +v -5.814293 0.009999 2.491840 +v -5.722002 0.009999 2.491840 +v -5.722002 0.009999 2.399549 +v -5.814293 0.009999 2.399549 +v -5.629711 0.009999 2.491840 +v -5.537421 0.009999 2.491840 +v -5.537421 0.009999 2.399549 +v -5.629711 0.009999 2.399549 +v -4.706808 0.009999 2.676420 +v -4.614518 0.009999 2.676420 +v -4.614518 0.009999 2.584130 +v -4.706808 0.009999 2.584130 +v -4.706808 0.009999 2.861001 +v -4.614518 0.009999 2.861001 +v -4.614518 0.009999 2.768711 +v -4.706808 0.009999 2.768711 +v -4.522227 0.009999 2.861001 +v -4.429937 0.009999 2.861001 +v -4.429937 0.009999 2.768711 +v -4.522227 0.009999 2.768711 +v -5.075970 0.009999 2.676420 +v -4.983679 0.009999 2.676420 +v -4.983679 0.009999 2.584130 +v -5.075970 0.009999 2.584130 +v -5.075970 0.009999 2.861001 +v -4.983679 0.009999 2.861001 +v -4.983679 0.009999 2.768711 +v -5.075970 0.009999 2.768711 +v -4.891389 0.009999 2.861001 +v -4.799098 0.009999 2.861001 +v -4.799098 0.009999 2.768711 +v -4.891389 0.009999 2.768711 +v -5.075970 0.009999 2.307259 +v -4.983679 0.009999 2.307259 +v -4.983679 0.009999 2.214968 +v -5.075970 0.009999 2.214968 +v -5.075970 0.009999 2.491840 +v -4.983679 0.009999 2.491840 +v -4.983679 0.009999 2.399549 +v -5.075970 0.009999 2.399549 +v -4.891389 0.009999 2.491840 +v -4.799098 0.009999 2.491840 +v -4.799098 0.009999 2.399549 +v -4.891389 0.009999 2.399549 +v -5.445131 0.010000 0.461452 +v -5.352840 0.010000 0.461452 +v -5.352840 0.010000 0.369161 +v -5.445131 0.010000 0.369161 +v -5.445131 0.010000 0.646033 +v -5.352840 0.010000 0.646033 +v -5.352840 0.010000 0.553742 +v -5.445131 0.010000 0.553742 +v -5.260550 0.010000 0.646033 +v -5.168260 0.010000 0.646033 +v -5.168260 0.010000 0.553742 +v -5.260550 0.010000 0.553742 +v -5.814293 0.010000 0.461452 +v -5.722002 0.010000 0.461452 +v -5.722002 0.010000 0.369161 +v -5.814293 0.010000 0.369161 +v -5.814293 0.010000 0.646033 +v -5.722002 0.010000 0.646033 +v -5.722002 0.010000 0.553742 +v -5.814293 0.010000 0.553742 +v -5.629711 0.010000 0.646033 +v -5.537421 0.010000 0.646033 +v -5.537421 0.010000 0.553742 +v -5.629711 0.010000 0.553742 +v -5.814293 0.010000 0.092290 +v -5.722002 0.010000 0.092290 +v -5.722002 0.010000 -0.000000 +v -5.814293 0.010000 -0.000000 +v -5.814293 0.010000 0.276871 +v -5.722002 0.010000 0.276871 +v -5.722002 0.010000 0.184581 +v -5.814293 0.010000 0.184581 +v -5.629711 0.010000 0.276871 +v -5.537421 0.010000 0.276871 +v -5.537421 0.010000 0.184581 +v -5.629711 0.010000 0.184581 +v -5.445131 0.010000 1.199775 +v -5.352840 0.010000 1.199775 +v -5.352840 0.010000 1.107484 +v -5.445131 0.010000 1.107484 +v -5.445131 0.009999 1.384355 +v -5.352840 0.009999 1.384355 +v -5.352840 0.009999 1.292065 +v -5.445131 0.009999 1.292065 +v -5.260550 0.009999 1.384355 +v -5.168260 0.009999 1.384355 +v -5.168260 0.009999 1.292065 +v -5.260550 0.009999 1.292065 +v -5.814293 0.010000 1.199775 +v -5.722002 0.010000 1.199775 +v -5.722002 0.010000 1.107484 +v -5.814293 0.010000 1.107484 +v -5.814293 0.009999 1.384355 +v -5.722002 0.009999 1.384355 +v -5.722002 0.009999 1.292065 +v -5.814293 0.009999 1.292065 +v -5.629711 0.009999 1.384355 +v -5.537421 0.009999 1.384355 +v -5.537421 0.009999 1.292065 +v -5.629711 0.009999 1.292065 +v -5.814293 0.010000 0.830613 +v -5.722002 0.010000 0.830613 +v -5.722002 0.010000 0.738323 +v -5.814293 0.010000 0.738323 +v -5.814293 0.010000 1.015194 +v -5.722002 0.010000 1.015194 +v -5.722002 0.010000 0.922904 +v -5.814293 0.010000 0.922904 +v -5.629711 0.010000 1.015194 +v -5.537421 0.010000 1.015194 +v -5.537421 0.010000 0.922904 +v -5.629711 0.010000 0.922904 +v -4.706808 0.010000 1.199775 +v -4.614518 0.010000 1.199775 +v -4.614518 0.010000 1.107484 +v -4.706808 0.010000 1.107484 +v -4.706808 0.009999 1.384355 +v -4.614518 0.009999 1.384355 +v -4.614518 0.009999 1.292065 +v -4.706808 0.009999 1.292065 +v -4.522227 0.009999 1.384355 +v -4.429937 0.009999 1.384355 +v -4.429937 0.009999 1.292065 +v -4.522227 0.009999 1.292065 +v -5.075970 0.010000 1.199775 +v -4.983679 0.010000 1.199775 +v -4.983679 0.010000 1.107484 +v -5.075970 0.010000 1.107484 +v -5.075970 0.009999 1.384355 +v -4.983679 0.009999 1.384355 +v -4.983679 0.009999 1.292065 +v -5.075970 0.009999 1.292065 +v -4.891389 0.009999 1.384355 +v -4.799098 0.009999 1.384355 +v -4.799098 0.009999 1.292065 +v -4.891389 0.009999 1.292065 +v -5.075970 0.010000 0.830613 +v -4.983679 0.010000 0.830613 +v -4.983679 0.010000 0.738323 +v -5.075970 0.010000 0.738323 +v -5.075970 0.010000 1.015194 +v -4.983679 0.010000 1.015194 +v -4.983679 0.010000 0.922904 +v -5.075970 0.010000 0.922904 +v -4.891389 0.010000 1.015194 +v -4.799098 0.010000 1.015194 +v -4.799098 0.010000 0.922904 +v -4.891389 0.010000 0.922904 +v -3.968485 0.009998 4.891389 +v -3.876195 0.009998 4.891389 +v -3.876195 0.009998 4.799098 +v -3.968485 0.009998 4.799098 +v -3.968485 0.009998 5.075970 +v -3.876195 0.009998 5.075970 +v -3.876195 0.009998 4.983679 +v -3.968485 0.009998 4.983679 +v -3.783905 0.009998 5.075970 +v -3.691614 0.009998 5.075970 +v -3.691614 0.009998 4.983679 +v -3.783905 0.009998 4.983679 +v -4.337647 0.009998 4.891389 +v -4.245357 0.009998 4.891389 +v -4.245357 0.009998 4.799098 +v -4.337647 0.009998 4.799098 +v -4.337647 0.009998 5.075970 +v -4.245357 0.009998 5.075970 +v -4.245357 0.009998 4.983679 +v -4.337647 0.009998 4.983679 +v -4.153066 0.009998 5.075970 +v -4.060776 0.009998 5.075970 +v -4.060776 0.009998 4.983679 +v -4.153066 0.009998 4.983679 +v -4.337647 0.009998 4.522227 +v -4.245357 0.009998 4.522227 +v -4.245357 0.009998 4.429937 +v -4.337647 0.009998 4.429937 +v -4.337647 0.009998 4.706808 +v -4.245357 0.009998 4.706808 +v -4.245357 0.009998 4.614518 +v -4.337647 0.009998 4.614518 +v -4.153066 0.009998 4.706808 +v -4.060776 0.009998 4.706808 +v -4.060776 0.009998 4.614518 +v -4.153066 0.009998 4.614518 +v -3.968485 0.009998 5.629711 +v -3.876195 0.009998 5.629711 +v -3.876195 0.009998 5.537421 +v -3.968485 0.009998 5.537421 +v -3.968485 0.009998 5.814293 +v -3.876195 0.009998 5.814293 +v -3.876195 0.009998 5.722002 +v -3.968485 0.009998 5.722002 +v -3.783905 0.009998 5.814293 +v -3.691614 0.009998 5.814293 +v -3.691614 0.009998 5.722002 +v -3.783905 0.009998 5.722002 +v -4.337647 0.009998 5.629711 +v -4.245357 0.009998 5.629711 +v -4.245357 0.009998 5.537421 +v -4.337647 0.009998 5.537421 +v -4.337647 0.009998 5.814293 +v -4.245357 0.009998 5.814293 +v -4.245357 0.009998 5.722002 +v -4.337647 0.009998 5.722002 +v -4.153066 0.009998 5.814293 +v -4.060776 0.009998 5.814293 +v -4.060776 0.009998 5.722002 +v -4.153066 0.009998 5.722002 +v -4.337647 0.009998 5.260550 +v -4.245357 0.009998 5.260550 +v -4.245357 0.009998 5.168260 +v -4.337647 0.009998 5.168260 +v -4.337647 0.009998 5.445131 +v -4.245357 0.009998 5.445131 +v -4.245357 0.009998 5.352840 +v -4.337647 0.009998 5.352840 +v -4.153066 0.009998 5.445131 +v -4.060776 0.009998 5.445131 +v -4.060776 0.009998 5.352840 +v -4.153066 0.009998 5.352840 +v -3.230163 0.009998 5.629711 +v -3.137872 0.009998 5.629711 +v -3.137872 0.009998 5.537421 +v -3.230163 0.009998 5.537421 +v -3.230163 0.009998 5.814293 +v -3.137872 0.009998 5.814293 +v -3.137872 0.009998 5.722002 +v -3.230163 0.009998 5.722002 +v -3.045582 0.009998 5.814293 +v -2.953291 0.009998 5.814293 +v -2.953291 0.009998 5.722002 +v -3.045582 0.009998 5.722002 +v -3.599324 0.009998 5.629711 +v -3.507033 0.009998 5.629711 +v -3.507033 0.009998 5.537421 +v -3.599324 0.009998 5.537421 +v -3.599324 0.009998 5.814293 +v -3.507033 0.009998 5.814293 +v -3.507033 0.009998 5.722002 +v -3.599324 0.009998 5.722002 +v -3.414743 0.009998 5.814293 +v -3.322453 0.009998 5.814293 +v -3.322453 0.009998 5.722002 +v -3.414743 0.009998 5.722002 +v -3.599324 0.009998 5.260550 +v -3.507033 0.009998 5.260550 +v -3.507033 0.009998 5.168260 +v -3.599324 0.009998 5.168260 +v -3.599324 0.009998 5.445131 +v -3.507033 0.009998 5.445131 +v -3.507033 0.009998 5.352840 +v -3.599324 0.009998 5.352840 +v -3.414743 0.009998 5.445131 +v -3.322453 0.009998 5.445131 +v -3.322453 0.009998 5.352840 +v -3.414743 0.009998 5.352840 +v -5.445131 0.009998 4.891389 +v -5.352840 0.009998 4.891389 +v -5.352840 0.009998 4.799098 +v -5.445131 0.009998 4.799098 +v -5.445131 0.009998 5.075970 +v -5.352840 0.009998 5.075970 +v -5.352840 0.009998 4.983679 +v -5.445131 0.009998 4.983679 +v -5.260550 0.009998 5.075970 +v -5.168260 0.009998 5.075970 +v -5.168260 0.009998 4.983679 +v -5.260550 0.009998 4.983679 +v -5.814293 0.009998 4.891389 +v -5.722002 0.009998 4.891389 +v -5.722002 0.009998 4.799098 +v -5.814293 0.009998 4.799098 +v -5.814293 0.009998 5.075970 +v -5.722002 0.009998 5.075970 +v -5.722002 0.009998 4.983679 +v -5.814293 0.009998 4.983679 +v -5.629711 0.009998 5.075970 +v -5.537421 0.009998 5.075970 +v -5.537421 0.009998 4.983679 +v -5.629711 0.009998 4.983679 +v -5.814293 0.009998 4.522227 +v -5.722002 0.009998 4.522227 +v -5.722002 0.009998 4.429937 +v -5.814293 0.009998 4.429937 +v -5.814293 0.009998 4.706808 +v -5.722002 0.009998 4.706808 +v -5.722002 0.009998 4.614518 +v -5.814293 0.009998 4.614518 +v -5.629711 0.009998 4.706808 +v -5.537421 0.009998 4.706808 +v -5.537421 0.009998 4.614518 +v -5.629711 0.009998 4.614518 +v -5.445131 0.009998 5.629711 +v -5.352840 0.009998 5.629711 +v -5.352840 0.009998 5.537421 +v -5.445131 0.009998 5.537421 +v -5.445131 0.009998 5.814293 +v -5.352840 0.009998 5.814293 +v -5.352840 0.009998 5.722002 +v -5.445131 0.009998 5.722002 +v -5.260550 0.009998 5.814293 +v -5.168260 0.009998 5.814293 +v -5.168260 0.009998 5.722002 +v -5.260550 0.009998 5.722002 +v -5.814293 0.009998 5.629711 +v -5.722002 0.009998 5.629711 +v -5.722002 0.009998 5.537421 +v -5.814293 0.009998 5.537421 +v -5.814293 0.009998 5.814293 +v -5.722002 0.009998 5.814293 +v -5.722002 0.009998 5.722002 +v -5.814293 0.009998 5.722002 +v -5.629711 0.009998 5.814293 +v -5.537421 0.009998 5.814293 +v -5.537421 0.009998 5.722002 +v -5.629711 0.009998 5.722002 +v -5.814293 0.009998 5.260550 +v -5.722002 0.009998 5.260550 +v -5.722002 0.009998 5.168260 +v -5.814293 0.009998 5.168260 +v -5.814293 0.009998 5.445131 +v -5.722002 0.009998 5.445131 +v -5.722002 0.009998 5.352840 +v -5.814293 0.009998 5.352840 +v -5.629711 0.009998 5.445131 +v -5.537421 0.009998 5.445131 +v -5.537421 0.009998 5.352840 +v -5.629711 0.009998 5.352840 +v -4.706808 0.009998 5.629711 +v -4.614518 0.009998 5.629711 +v -4.614518 0.009998 5.537421 +v -4.706808 0.009998 5.537421 +v -4.706808 0.009998 5.814293 +v -4.614518 0.009998 5.814293 +v -4.614518 0.009998 5.722002 +v -4.706808 0.009998 5.722002 +v -4.522227 0.009998 5.814293 +v -4.429937 0.009998 5.814293 +v -4.429937 0.009998 5.722002 +v -4.522227 0.009998 5.722002 +v -5.075970 0.009998 5.629711 +v -4.983679 0.009998 5.629711 +v -4.983679 0.009998 5.537421 +v -5.075970 0.009998 5.537421 +v -5.075970 0.009998 5.814293 +v -4.983679 0.009998 5.814293 +v -4.983679 0.009998 5.722002 +v -5.075970 0.009998 5.722002 +v -4.891389 0.009998 5.814293 +v -4.799098 0.009998 5.814293 +v -4.799098 0.009998 5.722002 +v -4.891389 0.009998 5.722002 +v -5.075970 0.009998 5.260550 +v -4.983679 0.009998 5.260550 +v -4.983679 0.009998 5.168260 +v -5.075970 0.009998 5.168260 +v -5.075970 0.009998 5.445131 +v -4.983679 0.009998 5.445131 +v -4.983679 0.009998 5.352840 +v -5.075970 0.009998 5.352840 +v -4.891389 0.009998 5.445131 +v -4.799098 0.009998 5.445131 +v -4.799098 0.009998 5.352840 +v -4.891389 0.009998 5.352840 +v -5.445131 0.009999 3.414743 +v -5.352840 0.009999 3.414743 +v -5.352840 0.009999 3.322453 +v -5.445131 0.009999 3.322453 +v -5.445131 0.009999 3.599324 +v -5.352840 0.009999 3.599324 +v -5.352840 0.009999 3.507033 +v -5.445131 0.009999 3.507033 +v -5.260550 0.009999 3.599324 +v -5.168260 0.009999 3.599324 +v -5.168260 0.009999 3.507033 +v -5.260550 0.009999 3.507033 +v -5.814293 0.009999 3.414743 +v -5.722002 0.009999 3.414743 +v -5.722002 0.009999 3.322453 +v -5.814293 0.009999 3.322453 +v -5.814293 0.009999 3.599324 +v -5.722002 0.009999 3.599324 +v -5.722002 0.009999 3.507033 +v -5.814293 0.009999 3.507033 +v -5.629711 0.009999 3.599324 +v -5.537421 0.009999 3.599324 +v -5.537421 0.009999 3.507033 +v -5.629711 0.009999 3.507033 +v -5.814293 0.009999 3.045582 +v -5.722002 0.009999 3.045582 +v -5.722002 0.009999 2.953291 +v -5.814293 0.009999 2.953291 +v -5.814293 0.009999 3.230163 +v -5.722002 0.009999 3.230163 +v -5.722002 0.009999 3.137872 +v -5.814293 0.009999 3.137872 +v -5.629711 0.009999 3.230163 +v -5.537421 0.009999 3.230163 +v -5.537421 0.009999 3.137872 +v -5.629711 0.009999 3.137872 +v -5.445131 0.009998 4.153066 +v -5.352840 0.009998 4.153066 +v -5.352840 0.009998 4.060776 +v -5.445131 0.009998 4.060776 +v -5.445131 0.009998 4.337647 +v -5.352840 0.009998 4.337647 +v -5.352840 0.009998 4.245357 +v -5.445131 0.009998 4.245357 +v -5.260550 0.009998 4.337647 +v -5.168260 0.009998 4.337647 +v -5.168260 0.009998 4.245357 +v -5.260550 0.009998 4.245357 +v -5.814293 0.009998 4.153066 +v -5.722002 0.009998 4.153066 +v -5.722002 0.009998 4.060776 +v -5.814293 0.009998 4.060776 +v -5.814293 0.009998 4.337647 +v -5.722002 0.009998 4.337647 +v -5.722002 0.009998 4.245357 +v -5.814293 0.009998 4.245357 +v -5.629711 0.009998 4.337647 +v -5.537421 0.009998 4.337647 +v -5.537421 0.009998 4.245357 +v -5.629711 0.009998 4.245357 +v -5.814293 0.009998 3.783905 +v -5.722002 0.009998 3.783905 +v -5.722002 0.009998 3.691614 +v -5.814293 0.009998 3.691614 +v -5.814293 0.009998 3.968485 +v -5.722002 0.009998 3.968485 +v -5.722002 0.009998 3.876195 +v -5.814293 0.009998 3.876195 +v -5.629711 0.009998 3.968485 +v -5.537421 0.009998 3.968485 +v -5.537421 0.009998 3.876195 +v -5.629711 0.009998 3.876195 +v -4.706808 0.009998 4.153066 +v -4.614518 0.009998 4.153066 +v -4.614518 0.009998 4.060776 +v -4.706808 0.009998 4.060776 +v -4.706808 0.009998 4.337647 +v -4.614518 0.009998 4.337647 +v -4.614518 0.009998 4.245357 +v -4.706808 0.009998 4.245357 +v -4.522227 0.009998 4.337647 +v -4.429937 0.009998 4.337647 +v -4.429937 0.009998 4.245357 +v -4.522227 0.009998 4.245357 +v -5.075970 0.009998 4.153066 +v -4.983679 0.009998 4.153066 +v -4.983679 0.009998 4.060776 +v -5.075970 0.009998 4.060776 +v -5.075970 0.009998 4.337647 +v -4.983679 0.009998 4.337647 +v -4.983679 0.009998 4.245357 +v -5.075970 0.009998 4.245357 +v -4.891389 0.009998 4.337647 +v -4.799098 0.009998 4.337647 +v -4.799098 0.009998 4.245357 +v -4.891389 0.009998 4.245357 +v -5.075970 0.009998 3.783905 +v -4.983679 0.009998 3.783905 +v -4.983679 0.009998 3.691614 +v -5.075970 0.009998 3.691614 +v -5.075970 0.009998 3.968485 +v -4.983679 0.009998 3.968485 +v -4.983679 0.009998 3.876195 +v -5.075970 0.009998 3.876195 +v -4.891389 0.009998 3.968485 +v -4.799098 0.009998 3.968485 +v -4.799098 0.009998 3.876195 +v -4.891389 0.009998 3.876195 +v -1.015194 0.009998 4.891389 +v -0.922904 0.009998 4.891389 +v -0.922904 0.009998 4.799098 +v -1.015194 0.009998 4.799098 +v -1.015194 0.009998 5.075970 +v -0.922904 0.009998 5.075970 +v -0.922904 0.009998 4.983679 +v -1.015194 0.009998 4.983679 +v -0.830613 0.009998 5.075970 +v -0.738323 0.009998 5.075970 +v -0.738323 0.009998 4.983679 +v -0.830613 0.009998 4.983679 +v -1.384355 0.009998 4.891389 +v -1.292065 0.009998 4.891389 +v -1.292065 0.009998 4.799098 +v -1.384355 0.009998 4.799098 +v -1.384355 0.009998 5.075970 +v -1.292065 0.009998 5.075970 +v -1.292065 0.009998 4.983679 +v -1.384355 0.009998 4.983679 +v -1.199775 0.009998 5.075970 +v -1.107484 0.009998 5.075970 +v -1.107484 0.009998 4.983679 +v -1.199775 0.009998 4.983679 +v -1.384355 0.009998 4.522227 +v -1.292065 0.009998 4.522227 +v -1.292065 0.009998 4.429937 +v -1.384355 0.009998 4.429937 +v -1.384355 0.009998 4.706808 +v -1.292065 0.009998 4.706808 +v -1.292065 0.009998 4.614518 +v -1.384355 0.009998 4.614518 +v -1.199775 0.009998 4.706808 +v -1.107484 0.009998 4.706808 +v -1.107484 0.009998 4.614518 +v -1.199775 0.009998 4.614518 +v -1.015194 0.009998 5.629711 +v -0.922904 0.009998 5.629711 +v -0.922904 0.009998 5.537421 +v -1.015194 0.009998 5.537421 +v -1.015194 0.009998 5.814293 +v -0.922904 0.009998 5.814293 +v -0.922904 0.009998 5.722002 +v -1.015194 0.009998 5.722002 +v -0.830613 0.009998 5.814293 +v -0.738323 0.009998 5.814293 +v -0.738323 0.009998 5.722002 +v -0.830613 0.009998 5.722002 +v -1.384355 0.009998 5.629711 +v -1.292065 0.009998 5.629711 +v -1.292065 0.009998 5.537421 +v -1.384355 0.009998 5.537421 +v -1.384355 0.009998 5.814293 +v -1.292065 0.009998 5.814293 +v -1.292065 0.009998 5.722002 +v -1.384355 0.009998 5.722002 +v -1.199775 0.009998 5.814293 +v -1.107484 0.009998 5.814293 +v -1.107484 0.009998 5.722002 +v -1.199775 0.009998 5.722002 +v -1.384355 0.009998 5.260550 +v -1.292065 0.009998 5.260550 +v -1.292065 0.009998 5.168260 +v -1.384355 0.009998 5.168260 +v -1.384355 0.009998 5.445131 +v -1.292065 0.009998 5.445131 +v -1.292065 0.009998 5.352840 +v -1.384355 0.009998 5.352840 +v -1.199775 0.009998 5.445131 +v -1.107484 0.009998 5.445131 +v -1.107484 0.009998 5.352840 +v -1.199775 0.009998 5.352840 +v -0.276871 0.009998 5.629711 +v -0.184581 0.009998 5.629711 +v -0.184581 0.009998 5.537421 +v -0.276871 0.009998 5.537421 +v -0.276871 0.009998 5.814293 +v -0.184581 0.009998 5.814293 +v -0.184581 0.009998 5.722002 +v -0.276871 0.009998 5.722002 +v -0.092290 0.009998 5.814293 +v 0.000000 0.009998 5.814293 +v 0.000000 0.009998 5.722002 +v -0.092290 0.009998 5.722002 +v -0.646033 0.009998 5.629711 +v -0.553742 0.009998 5.629711 +v -0.553742 0.009998 5.537421 +v -0.646033 0.009998 5.537421 +v -0.646033 0.009998 5.814293 +v -0.553742 0.009998 5.814293 +v -0.553742 0.009998 5.722002 +v -0.646033 0.009998 5.722002 +v -0.461452 0.009998 5.814293 +v -0.369161 0.009998 5.814293 +v -0.369161 0.009998 5.722002 +v -0.461452 0.009998 5.722002 +v -0.646033 0.009998 5.260550 +v -0.553742 0.009998 5.260550 +v -0.553742 0.009998 5.168260 +v -0.646033 0.009998 5.168260 +v -0.646033 0.009998 5.445131 +v -0.553742 0.009998 5.445131 +v -0.553742 0.009998 5.352840 +v -0.646033 0.009998 5.352840 +v -0.461452 0.009998 5.445131 +v -0.369161 0.009998 5.445131 +v -0.369161 0.009998 5.352840 +v -0.461452 0.009998 5.352840 +v -2.491840 0.009998 4.891389 +v -2.399549 0.009998 4.891389 +v -2.399549 0.009998 4.799098 +v -2.491840 0.009998 4.799098 +v -2.491840 0.009998 5.075970 +v -2.399549 0.009998 5.075970 +v -2.399549 0.009998 4.983679 +v -2.491840 0.009998 4.983679 +v -2.307259 0.009998 5.075970 +v -2.214968 0.009998 5.075970 +v -2.214968 0.009998 4.983679 +v -2.307259 0.009998 4.983679 +v -2.861001 0.009998 4.891389 +v -2.768711 0.009998 4.891389 +v -2.768711 0.009998 4.799098 +v -2.861001 0.009998 4.799098 +v -2.861001 0.009998 5.075970 +v -2.768711 0.009998 5.075970 +v -2.768711 0.009998 4.983679 +v -2.861001 0.009998 4.983679 +v -2.676420 0.009998 5.075970 +v -2.584130 0.009998 5.075970 +v -2.584130 0.009998 4.983679 +v -2.676420 0.009998 4.983679 +v -2.861001 0.009998 4.522227 +v -2.768711 0.009998 4.522227 +v -2.768711 0.009998 4.429937 +v -2.861001 0.009998 4.429937 +v -2.861001 0.009998 4.706808 +v -2.768711 0.009998 4.706808 +v -2.768711 0.009998 4.614518 +v -2.861001 0.009998 4.614518 +v -2.676420 0.009998 4.706808 +v -2.584130 0.009998 4.706808 +v -2.584130 0.009998 4.614518 +v -2.676420 0.009998 4.614518 +v -2.491840 0.009998 5.629711 +v -2.399549 0.009998 5.629711 +v -2.399549 0.009998 5.537421 +v -2.491840 0.009998 5.537421 +v -2.491840 0.009998 5.814293 +v -2.399549 0.009998 5.814293 +v -2.399549 0.009998 5.722002 +v -2.491840 0.009998 5.722002 +v -2.307259 0.009998 5.814293 +v -2.214968 0.009998 5.814293 +v -2.214968 0.009998 5.722002 +v -2.307259 0.009998 5.722002 +v -2.861001 0.009998 5.629711 +v -2.768711 0.009998 5.629711 +v -2.768711 0.009998 5.537421 +v -2.861001 0.009998 5.537421 +v -2.861001 0.009998 5.814293 +v -2.768711 0.009998 5.814293 +v -2.768711 0.009998 5.722002 +v -2.861001 0.009998 5.722002 +v -2.676420 0.009998 5.814293 +v -2.584130 0.009998 5.814293 +v -2.584130 0.009998 5.722002 +v -2.676420 0.009998 5.722002 +v -2.861001 0.009998 5.260550 +v -2.768711 0.009998 5.260550 +v -2.768711 0.009998 5.168260 +v -2.861001 0.009998 5.168260 +v -2.861001 0.009998 5.445131 +v -2.768711 0.009998 5.445131 +v -2.768711 0.009998 5.352840 +v -2.861001 0.009998 5.352840 +v -2.676420 0.009998 5.445131 +v -2.584130 0.009998 5.445131 +v -2.584130 0.009998 5.352840 +v -2.676420 0.009998 5.352840 +v -1.753517 0.009998 5.629711 +v -1.661226 0.009998 5.629711 +v -1.661226 0.009998 5.537421 +v -1.753517 0.009998 5.537421 +v -1.753517 0.009998 5.814293 +v -1.661226 0.009998 5.814293 +v -1.661226 0.009998 5.722002 +v -1.753517 0.009998 5.722002 +v -1.568936 0.009998 5.814293 +v -1.476646 0.009998 5.814293 +v -1.476646 0.009998 5.722002 +v -1.568936 0.009998 5.722002 +v -2.122678 0.009998 5.629711 +v -2.030388 0.009998 5.629711 +v -2.030388 0.009998 5.537421 +v -2.122678 0.009998 5.537421 +v -2.122678 0.009998 5.814293 +v -2.030388 0.009998 5.814293 +v -2.030388 0.009998 5.722002 +v -2.122678 0.009998 5.722002 +v -1.938097 0.009998 5.814293 +v -1.845807 0.009998 5.814293 +v -1.845807 0.009998 5.722002 +v -1.938097 0.009998 5.722002 +v -2.122678 0.009998 5.260550 +v -2.030388 0.009998 5.260550 +v -2.030388 0.009998 5.168260 +v -2.122678 0.009998 5.168260 +v -2.122678 0.009998 5.445131 +v -2.030388 0.009998 5.445131 +v -2.030388 0.009998 5.352840 +v -2.122678 0.009998 5.352840 +v -1.938097 0.009998 5.445131 +v -1.845807 0.009998 5.445131 +v -1.845807 0.009998 5.352840 +v -1.938097 0.009998 5.352840 +v -2.491840 0.009999 3.414743 +v -2.399549 0.009999 3.414743 +v -2.399549 0.009999 3.322453 +v -2.491840 0.009999 3.322453 +v -2.491840 0.009999 3.599324 +v -2.399549 0.009999 3.599324 +v -2.399549 0.009999 3.507033 +v -2.491840 0.009999 3.507033 +v -2.307259 0.009999 3.599324 +v -2.214968 0.009999 3.599324 +v -2.214968 0.009999 3.507033 +v -2.307259 0.009999 3.507033 +v -2.861001 0.009999 3.414743 +v -2.768711 0.009999 3.414743 +v -2.768711 0.009999 3.322453 +v -2.861001 0.009999 3.322453 +v -2.861001 0.009999 3.599324 +v -2.768711 0.009999 3.599324 +v -2.768711 0.009999 3.507033 +v -2.861001 0.009999 3.507033 +v -2.676420 0.009999 3.599324 +v -2.584130 0.009999 3.599324 +v -2.584130 0.009999 3.507033 +v -2.676420 0.009999 3.507033 +v -2.861001 0.009999 3.045582 +v -2.768711 0.009999 3.045582 +v -2.768711 0.009999 2.953291 +v -2.861001 0.009999 2.953291 +v -2.861001 0.009999 3.230163 +v -2.768711 0.009999 3.230163 +v -2.768711 0.009999 3.137872 +v -2.861001 0.009999 3.137872 +v -2.676420 0.009999 3.230163 +v -2.584130 0.009999 3.230163 +v -2.584130 0.009999 3.137872 +v -2.676420 0.009999 3.137872 +v -2.491840 0.009998 4.153066 +v -2.399549 0.009998 4.153066 +v -2.399549 0.009998 4.060776 +v -2.491840 0.009998 4.060776 +v -2.491840 0.009998 4.337647 +v -2.399549 0.009998 4.337647 +v -2.399549 0.009998 4.245357 +v -2.491840 0.009998 4.245357 +v -2.307259 0.009998 4.337647 +v -2.214968 0.009998 4.337647 +v -2.214968 0.009998 4.245357 +v -2.307259 0.009998 4.245357 +v -2.861001 0.009998 4.153066 +v -2.768711 0.009998 4.153066 +v -2.768711 0.009998 4.060776 +v -2.861001 0.009998 4.060776 +v -2.861001 0.009998 4.337647 +v -2.768711 0.009998 4.337647 +v -2.768711 0.009998 4.245357 +v -2.861001 0.009998 4.245357 +v -2.676420 0.009998 4.337647 +v -2.584130 0.009998 4.337647 +v -2.584130 0.009998 4.245357 +v -2.676420 0.009998 4.245357 +v -2.861001 0.009998 3.783905 +v -2.768711 0.009998 3.783905 +v -2.768711 0.009998 3.691614 +v -2.861001 0.009998 3.691614 +v -2.861001 0.009998 3.968485 +v -2.768711 0.009998 3.968485 +v -2.768711 0.009998 3.876195 +v -2.861001 0.009998 3.876195 +v -2.676420 0.009998 3.968485 +v -2.584130 0.009998 3.968485 +v -2.584130 0.009998 3.876195 +v -2.676420 0.009998 3.876195 +v -1.753517 0.009998 4.153066 +v -1.661226 0.009998 4.153066 +v -1.661226 0.009998 4.060776 +v -1.753517 0.009998 4.060776 +v -1.753517 0.009998 4.337647 +v -1.661226 0.009998 4.337647 +v -1.661226 0.009998 4.245357 +v -1.753517 0.009998 4.245357 +v -1.568936 0.009998 4.337647 +v -1.476646 0.009998 4.337647 +v -1.476646 0.009998 4.245357 +v -1.568936 0.009998 4.245357 +v -2.122678 0.009998 4.153066 +v -2.030388 0.009998 4.153066 +v -2.030388 0.009998 4.060776 +v -2.122678 0.009998 4.060776 +v -2.122678 0.009998 4.337647 +v -2.030388 0.009998 4.337647 +v -2.030388 0.009998 4.245357 +v -2.122678 0.009998 4.245357 +v -1.938097 0.009998 4.337647 +v -1.845807 0.009998 4.337647 +v -1.845807 0.009998 4.245357 +v -1.938097 0.009998 4.245357 +v -2.122678 0.009998 3.783905 +v -2.030388 0.009998 3.783905 +v -2.030388 0.009998 3.691614 +v -2.122678 0.009998 3.691614 +v -2.122678 0.009998 3.968485 +v -2.030388 0.009998 3.968485 +v -2.030388 0.009998 3.876195 +v -2.122678 0.009998 3.876195 +v -1.938097 0.009998 3.968485 +v -1.845807 0.009998 3.968485 +v -1.845807 0.009998 3.876195 +v -1.938097 0.009998 3.876195 +v -3.968485 0.010002 -3.968485 +v -3.876195 0.010002 -3.968485 +v -3.876195 0.010002 -4.060776 +v -3.968485 0.010002 -4.060776 +v -3.968485 0.010002 -3.783905 +v -3.876195 0.010002 -3.783905 +v -3.876195 0.010002 -3.876195 +v -3.968485 0.010002 -3.876195 +v -3.783905 0.010002 -3.783905 +v -3.691614 0.010002 -3.783905 +v -3.691614 0.010002 -3.876195 +v -3.783905 0.010002 -3.876195 +v -4.337647 0.010002 -3.968485 +v -4.245357 0.010002 -3.968485 +v -4.245357 0.010002 -4.060776 +v -4.337647 0.010002 -4.060776 +v -4.337647 0.010002 -3.783905 +v -4.245357 0.010002 -3.783905 +v -4.245357 0.010002 -3.876195 +v -4.337647 0.010002 -3.876195 +v -4.153066 0.010002 -3.783905 +v -4.060776 0.010002 -3.783905 +v -4.060776 0.010002 -3.876195 +v -4.153066 0.010002 -3.876195 +v -4.337647 0.010002 -4.337647 +v -4.245357 0.010002 -4.337647 +v -4.245357 0.010002 -4.429937 +v -4.337647 0.010002 -4.429937 +v -4.337647 0.010002 -4.153066 +v -4.245357 0.010002 -4.153066 +v -4.245357 0.010002 -4.245357 +v -4.337647 0.010002 -4.245357 +v -4.153066 0.010002 -4.153066 +v -4.060776 0.010002 -4.153066 +v -4.060776 0.010002 -4.245357 +v -4.153066 0.010002 -4.245357 +v -3.968485 0.010001 -3.230163 +v -3.876195 0.010001 -3.230163 +v -3.876195 0.010001 -3.322453 +v -3.968485 0.010001 -3.322453 +v -3.968485 0.010001 -3.045582 +v -3.876195 0.010001 -3.045582 +v -3.876195 0.010001 -3.137872 +v -3.968485 0.010001 -3.137872 +v -3.783905 0.010001 -3.045582 +v -3.691614 0.010001 -3.045582 +v -3.691614 0.010001 -3.137872 +v -3.783905 0.010001 -3.137872 +v -4.337647 0.010001 -3.230163 +v -4.245357 0.010001 -3.230163 +v -4.245357 0.010001 -3.322453 +v -4.337647 0.010001 -3.322453 +v -4.337647 0.010001 -3.045582 +v -4.245357 0.010001 -3.045582 +v -4.245357 0.010001 -3.137872 +v -4.337647 0.010001 -3.137872 +v -4.153066 0.010001 -3.045582 +v -4.060776 0.010001 -3.045582 +v -4.060776 0.010001 -3.137872 +v -4.153066 0.010001 -3.137872 +v -4.337647 0.010001 -3.599324 +v -4.245357 0.010001 -3.599324 +v -4.245357 0.010002 -3.691614 +v -4.337647 0.010002 -3.691614 +v -4.337647 0.010001 -3.414743 +v -4.245357 0.010001 -3.414743 +v -4.245357 0.010001 -3.507033 +v -4.337647 0.010001 -3.507033 +v -4.153066 0.010001 -3.414743 +v -4.060776 0.010001 -3.414743 +v -4.060776 0.010001 -3.507033 +v -4.153066 0.010001 -3.507033 +v -3.230163 0.010001 -3.230163 +v -3.137872 0.010001 -3.230163 +v -3.137872 0.010001 -3.322453 +v -3.230163 0.010001 -3.322453 +v -3.230163 0.010001 -3.045582 +v -3.137872 0.010001 -3.045582 +v -3.137872 0.010001 -3.137872 +v -3.230163 0.010001 -3.137872 +v -3.045582 0.010001 -3.045582 +v -2.953291 0.010001 -3.045582 +v -2.953291 0.010001 -3.137872 +v -3.045582 0.010001 -3.137872 +v -3.599324 0.010001 -3.230163 +v -3.507033 0.010001 -3.230163 +v -3.507033 0.010001 -3.322453 +v -3.599324 0.010001 -3.322453 +v -3.599324 0.010001 -3.045582 +v -3.507033 0.010001 -3.045582 +v -3.507033 0.010001 -3.137872 +v -3.599324 0.010001 -3.137872 +v -3.414743 0.010001 -3.045582 +v -3.322453 0.010001 -3.045582 +v -3.322453 0.010001 -3.137872 +v -3.414743 0.010001 -3.137872 +v -3.599324 0.010001 -3.599324 +v -3.507033 0.010001 -3.599324 +v -3.507033 0.010002 -3.691614 +v -3.599324 0.010002 -3.691614 +v -3.599324 0.010001 -3.414743 +v -3.507033 0.010001 -3.414743 +v -3.507033 0.010001 -3.507033 +v -3.599324 0.010001 -3.507033 +v -3.414743 0.010001 -3.414743 +v -3.322453 0.010001 -3.414743 +v -3.322453 0.010001 -3.507033 +v -3.414743 0.010001 -3.507033 +v -5.445131 0.010002 -3.968485 +v -5.352840 0.010002 -3.968485 +v -5.352840 0.010002 -4.060776 +v -5.445131 0.010002 -4.060776 +v -5.445131 0.010002 -3.783905 +v -5.352840 0.010002 -3.783905 +v -5.352840 0.010002 -3.876195 +v -5.445131 0.010002 -3.876195 +v -5.260550 0.010002 -3.783905 +v -5.168260 0.010002 -3.783905 +v -5.168260 0.010002 -3.876195 +v -5.260550 0.010002 -3.876195 +v -5.814293 0.010002 -3.968485 +v -5.722002 0.010002 -3.968485 +v -5.722002 0.010002 -4.060776 +v -5.814293 0.010002 -4.060776 +v -5.814293 0.010002 -3.783905 +v -5.722002 0.010002 -3.783905 +v -5.722002 0.010002 -3.876195 +v -5.814293 0.010002 -3.876195 +v -5.629711 0.010002 -3.783905 +v -5.537421 0.010002 -3.783905 +v -5.537421 0.010002 -3.876195 +v -5.629711 0.010002 -3.876195 +v -5.814293 0.010002 -4.337647 +v -5.722002 0.010002 -4.337647 +v -5.722002 0.010002 -4.429937 +v -5.814293 0.010002 -4.429937 +v -5.814293 0.010002 -4.153066 +v -5.722002 0.010002 -4.153066 +v -5.722002 0.010002 -4.245357 +v -5.814293 0.010002 -4.245357 +v -5.629711 0.010002 -4.153066 +v -5.537421 0.010002 -4.153066 +v -5.537421 0.010002 -4.245357 +v -5.629711 0.010002 -4.245357 +v -5.445131 0.010001 -3.230163 +v -5.352840 0.010001 -3.230163 +v -5.352840 0.010001 -3.322453 +v -5.445131 0.010001 -3.322453 +v -5.445131 0.010001 -3.045582 +v -5.352840 0.010001 -3.045582 +v -5.352840 0.010001 -3.137872 +v -5.445131 0.010001 -3.137872 +v -5.260550 0.010001 -3.045582 +v -5.168260 0.010001 -3.045582 +v -5.168260 0.010001 -3.137872 +v -5.260550 0.010001 -3.137872 +v -5.814293 0.010001 -3.230163 +v -5.722002 0.010001 -3.230163 +v -5.722002 0.010001 -3.322453 +v -5.814293 0.010001 -3.322453 +v -5.814293 0.010001 -3.045582 +v -5.722002 0.010001 -3.045582 +v -5.722002 0.010001 -3.137872 +v -5.814293 0.010001 -3.137872 +v -5.629711 0.010001 -3.045582 +v -5.537421 0.010001 -3.045582 +v -5.537421 0.010001 -3.137872 +v -5.629711 0.010001 -3.137872 +v -5.814293 0.010001 -3.599324 +v -5.722002 0.010001 -3.599324 +v -5.722002 0.010002 -3.691614 +v -5.814293 0.010002 -3.691614 +v -5.814293 0.010001 -3.414743 +v -5.722002 0.010001 -3.414743 +v -5.722002 0.010001 -3.507033 +v -5.814293 0.010001 -3.507033 +v -5.629711 0.010001 -3.414743 +v -5.537421 0.010001 -3.414743 +v -5.537421 0.010001 -3.507033 +v -5.629711 0.010001 -3.507033 +v -4.706808 0.010001 -3.230163 +v -4.614518 0.010001 -3.230163 +v -4.614518 0.010001 -3.322453 +v -4.706808 0.010001 -3.322453 +v -4.706808 0.010001 -3.045582 +v -4.614518 0.010001 -3.045582 +v -4.614518 0.010001 -3.137872 +v -4.706808 0.010001 -3.137872 +v -4.522227 0.010001 -3.045582 +v -4.429937 0.010001 -3.045582 +v -4.429937 0.010001 -3.137872 +v -4.522227 0.010001 -3.137872 +v -5.075970 0.010001 -3.230163 +v -4.983679 0.010001 -3.230163 +v -4.983679 0.010001 -3.322453 +v -5.075970 0.010001 -3.322453 +v -5.075970 0.010001 -3.045582 +v -4.983679 0.010001 -3.045582 +v -4.983679 0.010001 -3.137872 +v -5.075970 0.010001 -3.137872 +v -4.891389 0.010001 -3.045582 +v -4.799098 0.010001 -3.045582 +v -4.799098 0.010001 -3.137872 +v -4.891389 0.010001 -3.137872 +v -5.075970 0.010001 -3.599324 +v -4.983679 0.010001 -3.599324 +v -4.983679 0.010002 -3.691614 +v -5.075970 0.010002 -3.691614 +v -5.075970 0.010001 -3.414743 +v -4.983679 0.010001 -3.414743 +v -4.983679 0.010001 -3.507033 +v -5.075970 0.010001 -3.507033 +v -4.891389 0.010001 -3.414743 +v -4.799098 0.010001 -3.414743 +v -4.799098 0.010001 -3.507033 +v -4.891389 0.010001 -3.507033 +v -5.445131 0.010002 -5.445131 +v -5.352840 0.010002 -5.445131 +v -5.352840 0.010002 -5.537421 +v -5.445131 0.010002 -5.537421 +v -5.445131 0.010002 -5.260550 +v -5.352840 0.010002 -5.260550 +v -5.352840 0.010002 -5.352840 +v -5.445131 0.010002 -5.352840 +v -5.260550 0.010002 -5.260550 +v -5.168260 0.010002 -5.260550 +v -5.168260 0.010002 -5.352840 +v -5.260550 0.010002 -5.352840 +v -5.814293 0.010002 -5.445131 +v -5.722002 0.010002 -5.445131 +v -5.722002 0.010002 -5.537421 +v -5.814293 0.010002 -5.537421 +v -5.814293 0.010002 -5.260550 +v -5.722002 0.010002 -5.260550 +v -5.722002 0.010002 -5.352840 +v -5.814293 0.010002 -5.352840 +v -5.629711 0.010002 -5.260550 +v -5.537421 0.010002 -5.260550 +v -5.537421 0.010002 -5.352840 +v -5.629711 0.010002 -5.352840 +v -5.814293 0.010002 -5.814293 +v -5.722002 0.010002 -5.814293 +v -5.722002 0.010002 -5.906583 +v -5.814293 0.010002 -5.906583 +v -5.814293 0.010002 -5.629711 +v -5.722002 0.010002 -5.629711 +v -5.722002 0.010002 -5.722002 +v -5.814293 0.010002 -5.722002 +v -5.629711 0.010002 -5.629711 +v -5.537421 0.010002 -5.629711 +v -5.537421 0.010002 -5.722002 +v -5.629711 0.010002 -5.722002 +v -5.445131 0.010002 -4.706808 +v -5.352840 0.010002 -4.706808 +v -5.352840 0.010002 -4.799098 +v -5.445131 0.010002 -4.799098 +v -5.445131 0.010002 -4.522227 +v -5.352840 0.010002 -4.522227 +v -5.352840 0.010002 -4.614518 +v -5.445131 0.010002 -4.614518 +v -5.260550 0.010002 -4.522227 +v -5.168260 0.010002 -4.522227 +v -5.168260 0.010002 -4.614518 +v -5.260550 0.010002 -4.614518 +v -5.814293 0.010002 -4.706808 +v -5.722002 0.010002 -4.706808 +v -5.722002 0.010002 -4.799098 +v -5.814293 0.010002 -4.799098 +v -5.814293 0.010002 -4.522227 +v -5.722002 0.010002 -4.522227 +v -5.722002 0.010002 -4.614518 +v -5.814293 0.010002 -4.614518 +v -5.629711 0.010002 -4.522227 +v -5.537421 0.010002 -4.522227 +v -5.537421 0.010002 -4.614518 +v -5.629711 0.010002 -4.614518 +v -5.814293 0.010002 -5.075970 +v -5.722002 0.010002 -5.075970 +v -5.722002 0.010002 -5.168260 +v -5.814293 0.010002 -5.168260 +v -5.814293 0.010002 -4.891389 +v -5.722002 0.010002 -4.891389 +v -5.722002 0.010002 -4.983679 +v -5.814293 0.010002 -4.983679 +v -5.629711 0.010002 -4.891389 +v -5.537421 0.010002 -4.891389 +v -5.537421 0.010002 -4.983679 +v -5.629711 0.010002 -4.983679 +v -4.706808 0.010002 -4.706808 +v -4.614518 0.010002 -4.706808 +v -4.614518 0.010002 -4.799098 +v -4.706808 0.010002 -4.799098 +v -4.706808 0.010002 -4.522227 +v -4.614518 0.010002 -4.522227 +v -4.614518 0.010002 -4.614518 +v -4.706808 0.010002 -4.614518 +v -4.522227 0.010002 -4.522227 +v -4.429937 0.010002 -4.522227 +v -4.429937 0.010002 -4.614518 +v -4.522227 0.010002 -4.614518 +v -5.075970 0.010002 -4.706808 +v -4.983679 0.010002 -4.706808 +v -4.983679 0.010002 -4.799098 +v -5.075970 0.010002 -4.799098 +v -5.075970 0.010002 -4.522227 +v -4.983679 0.010002 -4.522227 +v -4.983679 0.010002 -4.614518 +v -5.075970 0.010002 -4.614518 +v -4.891389 0.010002 -4.522227 +v -4.799098 0.010002 -4.522227 +v -4.799098 0.010002 -4.614518 +v -4.891389 0.010002 -4.614518 +v -5.075970 0.010002 -5.075970 +v -4.983679 0.010002 -5.075970 +v -4.983679 0.010002 -5.168260 +v -5.075970 0.010002 -5.168260 +v -5.075970 0.010002 -4.891389 +v -4.983679 0.010002 -4.891389 +v -4.983679 0.010002 -4.983679 +v -5.075970 0.010002 -4.983679 +v -4.891389 0.010002 -4.891389 +v -4.799098 0.010002 -4.891389 +v -4.799098 0.010002 -4.983679 +v -4.891389 0.010002 -4.983679 +v -3.968485 0.010000 -1.015194 +v -3.876195 0.010000 -1.015194 +v -3.876195 0.010000 -1.107484 +v -3.968485 0.010000 -1.107484 +v -3.968485 0.010000 -0.830613 +v -3.876195 0.010000 -0.830613 +v -3.876195 0.010000 -0.922904 +v -3.968485 0.010000 -0.922904 +v -3.783905 0.010000 -0.830613 +v -3.691614 0.010000 -0.830613 +v -3.691614 0.010000 -0.922904 +v -3.783905 0.010000 -0.922904 +v -4.337647 0.010000 -1.015194 +v -4.245357 0.010000 -1.015194 +v -4.245357 0.010000 -1.107484 +v -4.337647 0.010000 -1.107484 +v -4.337647 0.010000 -0.830613 +v -4.245357 0.010000 -0.830613 +v -4.245357 0.010000 -0.922904 +v -4.337647 0.010000 -0.922904 +v -4.153066 0.010000 -0.830613 +v -4.060776 0.010000 -0.830613 +v -4.060776 0.010000 -0.922904 +v -4.153066 0.010000 -0.922904 +v -4.337647 0.010001 -1.384355 +v -4.245357 0.010001 -1.384355 +v -4.245357 0.010001 -1.476646 +v -4.337647 0.010001 -1.476646 +v -4.337647 0.010000 -1.199775 +v -4.245357 0.010000 -1.199775 +v -4.245357 0.010001 -1.292065 +v -4.337647 0.010001 -1.292065 +v -4.153066 0.010000 -1.199775 +v -4.060776 0.010000 -1.199775 +v -4.060776 0.010001 -1.292065 +v -4.153066 0.010001 -1.292065 +v -3.968485 0.010000 -0.276871 +v -3.876195 0.010000 -0.276871 +v -3.876195 0.010000 -0.369161 +v -3.968485 0.010000 -0.369161 +v -3.968485 0.010000 -0.092290 +v -3.876195 0.010000 -0.092290 +v -3.876195 0.010000 -0.184581 +v -3.968485 0.010000 -0.184581 +v -3.783905 0.010000 -0.092290 +v -3.691614 0.010000 -0.092290 +v -3.691614 0.010000 -0.184581 +v -3.783905 0.010000 -0.184581 +v -4.337647 0.010000 -0.276871 +v -4.245357 0.010000 -0.276871 +v -4.245357 0.010000 -0.369161 +v -4.337647 0.010000 -0.369161 +v -4.337647 0.010000 -0.092290 +v -4.245357 0.010000 -0.092290 +v -4.245357 0.010000 -0.184581 +v -4.337647 0.010000 -0.184581 +v -4.153066 0.010000 -0.092290 +v -4.060776 0.010000 -0.092290 +v -4.060776 0.010000 -0.184581 +v -4.153066 0.010000 -0.184581 +v -4.337647 0.010000 -0.646033 +v -4.245357 0.010000 -0.646033 +v -4.245357 0.010000 -0.738323 +v -4.337647 0.010000 -0.738323 +v -4.337647 0.010000 -0.461452 +v -4.245357 0.010000 -0.461452 +v -4.245357 0.010000 -0.553742 +v -4.337647 0.010000 -0.553742 +v -4.153066 0.010000 -0.461452 +v -4.060776 0.010000 -0.461452 +v -4.060776 0.010000 -0.553742 +v -4.153066 0.010000 -0.553742 +v -3.230163 0.010000 -0.276871 +v -3.137872 0.010000 -0.276871 +v -3.137872 0.010000 -0.369161 +v -3.230163 0.010000 -0.369161 +v -3.230163 0.010000 -0.092290 +v -3.137872 0.010000 -0.092290 +v -3.137872 0.010000 -0.184581 +v -3.230163 0.010000 -0.184581 +v -3.045582 0.010000 -0.092290 +v -2.953291 0.010000 -0.092290 +v -2.953291 0.010000 -0.184581 +v -3.045582 0.010000 -0.184581 +v -3.599324 0.010000 -0.276871 +v -3.507033 0.010000 -0.276871 +v -3.507033 0.010000 -0.369161 +v -3.599324 0.010000 -0.369161 +v -3.599324 0.010000 -0.092290 +v -3.507033 0.010000 -0.092290 +v -3.507033 0.010000 -0.184581 +v -3.599324 0.010000 -0.184581 +v -3.414743 0.010000 -0.092290 +v -3.322453 0.010000 -0.092290 +v -3.322453 0.010000 -0.184581 +v -3.414743 0.010000 -0.184581 +v -3.599324 0.010000 -0.646033 +v -3.507033 0.010000 -0.646033 +v -3.507033 0.010000 -0.738323 +v -3.599324 0.010000 -0.738323 +v -3.599324 0.010000 -0.461452 +v -3.507033 0.010000 -0.461452 +v -3.507033 0.010000 -0.553742 +v -3.599324 0.010000 -0.553742 +v -3.414743 0.010000 -0.461452 +v -3.322453 0.010000 -0.461452 +v -3.322453 0.010000 -0.553742 +v -3.414743 0.010000 -0.553742 +v -5.445131 0.010000 -1.015194 +v -5.352840 0.010000 -1.015194 +v -5.352840 0.010000 -1.107484 +v -5.445131 0.010000 -1.107484 +v -5.445131 0.010000 -0.830613 +v -5.352840 0.010000 -0.830613 +v -5.352840 0.010000 -0.922904 +v -5.445131 0.010000 -0.922904 +v -5.260550 0.010000 -0.830613 +v -5.168260 0.010000 -0.830613 +v -5.168260 0.010000 -0.922904 +v -5.260550 0.010000 -0.922904 +v -5.814293 0.010000 -1.015194 +v -5.722002 0.010000 -1.015194 +v -5.722002 0.010000 -1.107484 +v -5.814293 0.010000 -1.107484 +v -5.814293 0.010000 -0.830613 +v -5.722002 0.010000 -0.830613 +v -5.722002 0.010000 -0.922904 +v -5.814293 0.010000 -0.922904 +v -5.629711 0.010000 -0.830613 +v -5.537421 0.010000 -0.830613 +v -5.537421 0.010000 -0.922904 +v -5.629711 0.010000 -0.922904 +v -5.814293 0.010001 -1.384355 +v -5.722002 0.010001 -1.384355 +v -5.722002 0.010001 -1.476646 +v -5.814293 0.010001 -1.476646 +v -5.814293 0.010000 -1.199775 +v -5.722002 0.010000 -1.199775 +v -5.722002 0.010001 -1.292065 +v -5.814293 0.010001 -1.292065 +v -5.629711 0.010000 -1.199775 +v -5.537421 0.010000 -1.199775 +v -5.537421 0.010001 -1.292065 +v -5.629711 0.010001 -1.292065 +v -5.445131 0.010000 -0.276871 +v -5.352840 0.010000 -0.276871 +v -5.352840 0.010000 -0.369161 +v -5.445131 0.010000 -0.369161 +v -5.445131 0.010000 -0.092290 +v -5.352840 0.010000 -0.092290 +v -5.352840 0.010000 -0.184581 +v -5.445131 0.010000 -0.184581 +v -5.260550 0.010000 -0.092290 +v -5.168260 0.010000 -0.092290 +v -5.168260 0.010000 -0.184581 +v -5.260550 0.010000 -0.184581 +v -5.814293 0.010000 -0.276871 +v -5.722002 0.010000 -0.276871 +v -5.722002 0.010000 -0.369161 +v -5.814293 0.010000 -0.369161 +v -5.814293 0.010000 -0.092290 +v -5.722002 0.010000 -0.092290 +v -5.722002 0.010000 -0.184581 +v -5.814293 0.010000 -0.184581 +v -5.629711 0.010000 -0.092290 +v -5.537421 0.010000 -0.092290 +v -5.537421 0.010000 -0.184581 +v -5.629711 0.010000 -0.184581 +v -5.814293 0.010000 -0.646033 +v -5.722002 0.010000 -0.646033 +v -5.722002 0.010000 -0.738323 +v -5.814293 0.010000 -0.738323 +v -5.814293 0.010000 -0.461452 +v -5.722002 0.010000 -0.461452 +v -5.722002 0.010000 -0.553742 +v -5.814293 0.010000 -0.553742 +v -5.629711 0.010000 -0.461452 +v -5.537421 0.010000 -0.461452 +v -5.537421 0.010000 -0.553742 +v -5.629711 0.010000 -0.553742 +v -4.706808 0.010000 -0.276871 +v -4.614518 0.010000 -0.276871 +v -4.614518 0.010000 -0.369161 +v -4.706808 0.010000 -0.369161 +v -4.706808 0.010000 -0.092290 +v -4.614518 0.010000 -0.092290 +v -4.614518 0.010000 -0.184581 +v -4.706808 0.010000 -0.184581 +v -4.522227 0.010000 -0.092290 +v -4.429937 0.010000 -0.092290 +v -4.429937 0.010000 -0.184581 +v -4.522227 0.010000 -0.184581 +v -5.075970 0.010000 -0.276871 +v -4.983679 0.010000 -0.276871 +v -4.983679 0.010000 -0.369161 +v -5.075970 0.010000 -0.369161 +v -5.075970 0.010000 -0.092290 +v -4.983679 0.010000 -0.092290 +v -4.983679 0.010000 -0.184581 +v -5.075970 0.010000 -0.184581 +v -4.891389 0.010000 -0.092290 +v -4.799098 0.010000 -0.092290 +v -4.799098 0.010000 -0.184581 +v -4.891389 0.010000 -0.184581 +v -5.075970 0.010000 -0.646033 +v -4.983679 0.010000 -0.646033 +v -4.983679 0.010000 -0.738323 +v -5.075970 0.010000 -0.738323 +v -5.075970 0.010000 -0.461452 +v -4.983679 0.010000 -0.461452 +v -4.983679 0.010000 -0.553742 +v -5.075970 0.010000 -0.553742 +v -4.891389 0.010000 -0.461452 +v -4.799098 0.010000 -0.461452 +v -4.799098 0.010000 -0.553742 +v -4.891389 0.010000 -0.553742 +v -5.445131 0.010001 -2.491840 +v -5.352840 0.010001 -2.491840 +v -5.352840 0.010001 -2.584130 +v -5.445131 0.010001 -2.584130 +v -5.445131 0.010001 -2.307259 +v -5.352840 0.010001 -2.307259 +v -5.352840 0.010001 -2.399549 +v -5.445131 0.010001 -2.399549 +v -5.260550 0.010001 -2.307259 +v -5.168260 0.010001 -2.307259 +v -5.168260 0.010001 -2.399549 +v -5.260550 0.010001 -2.399549 +v -5.814293 0.010001 -2.491840 +v -5.722002 0.010001 -2.491840 +v -5.722002 0.010001 -2.584130 +v -5.814293 0.010001 -2.584130 +v -5.814293 0.010001 -2.307259 +v -5.722002 0.010001 -2.307259 +v -5.722002 0.010001 -2.399549 +v -5.814293 0.010001 -2.399549 +v -5.629711 0.010001 -2.307259 +v -5.537421 0.010001 -2.307259 +v -5.537421 0.010001 -2.399549 +v -5.629711 0.010001 -2.399549 +v -5.814293 0.010001 -2.861001 +v -5.722002 0.010001 -2.861001 +v -5.722002 0.010001 -2.953291 +v -5.814293 0.010001 -2.953291 +v -5.814293 0.010001 -2.676420 +v -5.722002 0.010001 -2.676420 +v -5.722002 0.010001 -2.768711 +v -5.814293 0.010001 -2.768711 +v -5.629711 0.010001 -2.676420 +v -5.537421 0.010001 -2.676420 +v -5.537421 0.010001 -2.768711 +v -5.629711 0.010001 -2.768711 +v -5.445131 0.010001 -1.753517 +v -5.352840 0.010001 -1.753517 +v -5.352840 0.010001 -1.845807 +v -5.445131 0.010001 -1.845807 +v -5.445131 0.010001 -1.568936 +v -5.352840 0.010001 -1.568936 +v -5.352840 0.010001 -1.661226 +v -5.445131 0.010001 -1.661226 +v -5.260550 0.010001 -1.568936 +v -5.168260 0.010001 -1.568936 +v -5.168260 0.010001 -1.661226 +v -5.260550 0.010001 -1.661226 +v -5.814293 0.010001 -1.753517 +v -5.722002 0.010001 -1.753517 +v -5.722002 0.010001 -1.845807 +v -5.814293 0.010001 -1.845807 +v -5.814293 0.010001 -1.568936 +v -5.722002 0.010001 -1.568936 +v -5.722002 0.010001 -1.661226 +v -5.814293 0.010001 -1.661226 +v -5.629711 0.010001 -1.568936 +v -5.537421 0.010001 -1.568936 +v -5.537421 0.010001 -1.661226 +v -5.629711 0.010001 -1.661226 +v -5.814293 0.010001 -2.122678 +v -5.722002 0.010001 -2.122678 +v -5.722002 0.010001 -2.214968 +v -5.814293 0.010001 -2.214968 +v -5.814293 0.010001 -1.938097 +v -5.722002 0.010001 -1.938097 +v -5.722002 0.010001 -2.030388 +v -5.814293 0.010001 -2.030388 +v -5.629711 0.010001 -1.938097 +v -5.537421 0.010001 -1.938097 +v -5.537421 0.010001 -2.030388 +v -5.629711 0.010001 -2.030388 +v -4.706808 0.010001 -1.753517 +v -4.614518 0.010001 -1.753517 +v -4.614518 0.010001 -1.845807 +v -4.706808 0.010001 -1.845807 +v -4.706808 0.010001 -1.568936 +v -4.614518 0.010001 -1.568936 +v -4.614518 0.010001 -1.661226 +v -4.706808 0.010001 -1.661226 +v -4.522227 0.010001 -1.568936 +v -4.429937 0.010001 -1.568936 +v -4.429937 0.010001 -1.661226 +v -4.522227 0.010001 -1.661226 +v -5.075970 0.010001 -1.753517 +v -4.983679 0.010001 -1.753517 +v -4.983679 0.010001 -1.845807 +v -5.075970 0.010001 -1.845807 +v -5.075970 0.010001 -1.568936 +v -4.983679 0.010001 -1.568936 +v -4.983679 0.010001 -1.661226 +v -5.075970 0.010001 -1.661226 +v -4.891389 0.010001 -1.568936 +v -4.799098 0.010001 -1.568936 +v -4.799098 0.010001 -1.661226 +v -4.891389 0.010001 -1.661226 +v -5.075970 0.010001 -2.122678 +v -4.983679 0.010001 -2.122678 +v -4.983679 0.010001 -2.214968 +v -5.075970 0.010001 -2.214968 +v -5.075970 0.010001 -1.938097 +v -4.983679 0.010001 -1.938097 +v -4.983679 0.010001 -2.030388 +v -5.075970 0.010001 -2.030388 +v -4.891389 0.010001 -1.938097 +v -4.799098 0.010001 -1.938097 +v -4.799098 0.010001 -2.030388 +v -4.891389 0.010001 -2.030388 +v -1.015194 0.010000 -1.015194 +v -0.922904 0.010000 -1.015194 +v -0.922904 0.010000 -1.107484 +v -1.015194 0.010000 -1.107484 +v -1.015194 0.010000 -0.830613 +v -0.922904 0.010000 -0.830613 +v -0.922904 0.010000 -0.922904 +v -1.015194 0.010000 -0.922904 +v -0.830613 0.010000 -0.830613 +v -0.738323 0.010000 -0.830613 +v -0.738323 0.010000 -0.922904 +v -0.830613 0.010000 -0.922904 +v -1.384355 0.010000 -1.015194 +v -1.292065 0.010000 -1.015194 +v -1.292065 0.010000 -1.107484 +v -1.384355 0.010000 -1.107484 +v -1.384355 0.010000 -0.830613 +v -1.292065 0.010000 -0.830613 +v -1.292065 0.010000 -0.922904 +v -1.384355 0.010000 -0.922904 +v -1.199775 0.010000 -0.830613 +v -1.107484 0.010000 -0.830613 +v -1.107484 0.010000 -0.922904 +v -1.199775 0.010000 -0.922904 +v -1.384355 0.010001 -1.384355 +v -1.292065 0.010001 -1.384355 +v -1.292065 0.010001 -1.476646 +v -1.384355 0.010001 -1.476646 +v -1.384355 0.010000 -1.199775 +v -1.292065 0.010000 -1.199775 +v -1.292065 0.010001 -1.292065 +v -1.384355 0.010001 -1.292065 +v -1.199775 0.010000 -1.199775 +v -1.107484 0.010000 -1.199775 +v -1.107484 0.010001 -1.292065 +v -1.199775 0.010001 -1.292065 +v -1.015194 0.010000 -0.276871 +v -0.922904 0.010000 -0.276871 +v -0.922904 0.010000 -0.369161 +v -1.015194 0.010000 -0.369161 +v -1.015194 0.010000 -0.092290 +v -0.922904 0.010000 -0.092290 +v -0.922904 0.010000 -0.184581 +v -1.015194 0.010000 -0.184581 +v -0.830613 0.010000 -0.092290 +v -0.738323 0.010000 -0.092290 +v -0.738323 0.010000 -0.184581 +v -0.830613 0.010000 -0.184581 +v -1.384355 0.010000 -0.276871 +v -1.292065 0.010000 -0.276871 +v -1.292065 0.010000 -0.369161 +v -1.384355 0.010000 -0.369161 +v -1.384355 0.010000 -0.092290 +v -1.292065 0.010000 -0.092290 +v -1.292065 0.010000 -0.184581 +v -1.384355 0.010000 -0.184581 +v -1.199775 0.010000 -0.092290 +v -1.107484 0.010000 -0.092290 +v -1.107484 0.010000 -0.184581 +v -1.199775 0.010000 -0.184581 +v -1.384355 0.010000 -0.646033 +v -1.292065 0.010000 -0.646033 +v -1.292065 0.010000 -0.738323 +v -1.384355 0.010000 -0.738323 +v -1.384355 0.010000 -0.461452 +v -1.292065 0.010000 -0.461452 +v -1.292065 0.010000 -0.553742 +v -1.384355 0.010000 -0.553742 +v -1.199775 0.010000 -0.461452 +v -1.107484 0.010000 -0.461452 +v -1.107484 0.010000 -0.553742 +v -1.199775 0.010000 -0.553742 +v -0.276871 0.010000 -0.276871 +v -0.184581 0.010000 -0.276871 +v -0.184581 0.010000 -0.369161 +v -0.276871 0.010000 -0.369161 +v -0.276871 0.010000 -0.092290 +v -0.184581 0.010000 -0.092290 +v -0.184581 0.010000 -0.184581 +v -0.276871 0.010000 -0.184581 +v -0.092290 0.010000 -0.092290 +v 0.000000 0.010000 -0.092290 +v 0.000000 0.010000 -0.184581 +v -0.092290 0.010000 -0.184581 +v -0.646033 0.010000 -0.276871 +v -0.553742 0.010000 -0.276871 +v -0.553742 0.010000 -0.369161 +v -0.646033 0.010000 -0.369161 +v -0.646033 0.010000 -0.092290 +v -0.553742 0.010000 -0.092290 +v -0.553742 0.010000 -0.184581 +v -0.646033 0.010000 -0.184581 +v -0.461452 0.010000 -0.092290 +v -0.369161 0.010000 -0.092290 +v -0.369161 0.010000 -0.184581 +v -0.461452 0.010000 -0.184581 +v -0.646033 0.010000 -0.646033 +v -0.553742 0.010000 -0.646033 +v -0.553742 0.010000 -0.738323 +v -0.646033 0.010000 -0.738323 +v -0.646033 0.010000 -0.461452 +v -0.553742 0.010000 -0.461452 +v -0.553742 0.010000 -0.553742 +v -0.646033 0.010000 -0.553742 +v -0.461452 0.010000 -0.461452 +v -0.369161 0.010000 -0.461452 +v -0.369161 0.010000 -0.553742 +v -0.461452 0.010000 -0.553742 +v -2.491840 0.010000 -1.015194 +v -2.399549 0.010000 -1.015194 +v -2.399549 0.010000 -1.107484 +v -2.491840 0.010000 -1.107484 +v -2.491840 0.010000 -0.830613 +v -2.399549 0.010000 -0.830613 +v -2.399549 0.010000 -0.922904 +v -2.491840 0.010000 -0.922904 +v -2.307259 0.010000 -0.830613 +v -2.214968 0.010000 -0.830613 +v -2.214968 0.010000 -0.922904 +v -2.307259 0.010000 -0.922904 +v -2.861001 0.010000 -1.015194 +v -2.768711 0.010000 -1.015194 +v -2.768711 0.010000 -1.107484 +v -2.861001 0.010000 -1.107484 +v -2.861001 0.010000 -0.830613 +v -2.768711 0.010000 -0.830613 +v -2.768711 0.010000 -0.922904 +v -2.861001 0.010000 -0.922904 +v -2.676420 0.010000 -0.830613 +v -2.584130 0.010000 -0.830613 +v -2.584130 0.010000 -0.922904 +v -2.676420 0.010000 -0.922904 +v -2.861001 0.010001 -1.384355 +v -2.768711 0.010001 -1.384355 +v -2.768711 0.010001 -1.476646 +v -2.861001 0.010001 -1.476646 +v -2.861001 0.010000 -1.199775 +v -2.768711 0.010000 -1.199775 +v -2.768711 0.010001 -1.292065 +v -2.861001 0.010001 -1.292065 +v -2.676420 0.010000 -1.199775 +v -2.584130 0.010000 -1.199775 +v -2.584130 0.010001 -1.292065 +v -2.676420 0.010001 -1.292065 +v -2.491840 0.010000 -0.276871 +v -2.399549 0.010000 -0.276871 +v -2.399549 0.010000 -0.369161 +v -2.491840 0.010000 -0.369161 +v -2.491840 0.010000 -0.092290 +v -2.399549 0.010000 -0.092290 +v -2.399549 0.010000 -0.184581 +v -2.491840 0.010000 -0.184581 +v -2.307259 0.010000 -0.092290 +v -2.214968 0.010000 -0.092290 +v -2.214968 0.010000 -0.184581 +v -2.307259 0.010000 -0.184581 +v -2.861001 0.010000 -0.276871 +v -2.768711 0.010000 -0.276871 +v -2.768711 0.010000 -0.369161 +v -2.861001 0.010000 -0.369161 +v -2.861001 0.010000 -0.092290 +v -2.768711 0.010000 -0.092290 +v -2.768711 0.010000 -0.184581 +v -2.861001 0.010000 -0.184581 +v -2.676420 0.010000 -0.092290 +v -2.584130 0.010000 -0.092290 +v -2.584130 0.010000 -0.184581 +v -2.676420 0.010000 -0.184581 +v -2.861001 0.010000 -0.646033 +v -2.768711 0.010000 -0.646033 +v -2.768711 0.010000 -0.738323 +v -2.861001 0.010000 -0.738323 +v -2.861001 0.010000 -0.461452 +v -2.768711 0.010000 -0.461452 +v -2.768711 0.010000 -0.553742 +v -2.861001 0.010000 -0.553742 +v -2.676420 0.010000 -0.461452 +v -2.584130 0.010000 -0.461452 +v -2.584130 0.010000 -0.553742 +v -2.676420 0.010000 -0.553742 +v -1.753517 0.010000 -0.276871 +v -1.661226 0.010000 -0.276871 +v -1.661226 0.010000 -0.369161 +v -1.753517 0.010000 -0.369161 +v -1.753517 0.010000 -0.092290 +v -1.661226 0.010000 -0.092290 +v -1.661226 0.010000 -0.184581 +v -1.753517 0.010000 -0.184581 +v -1.568936 0.010000 -0.092290 +v -1.476646 0.010000 -0.092290 +v -1.476646 0.010000 -0.184581 +v -1.568936 0.010000 -0.184581 +v -2.122678 0.010000 -0.276871 +v -2.030388 0.010000 -0.276871 +v -2.030388 0.010000 -0.369161 +v -2.122678 0.010000 -0.369161 +v -2.122678 0.010000 -0.092290 +v -2.030388 0.010000 -0.092290 +v -2.030388 0.010000 -0.184581 +v -2.122678 0.010000 -0.184581 +v -1.938097 0.010000 -0.092290 +v -1.845807 0.010000 -0.092290 +v -1.845807 0.010000 -0.184581 +v -1.938097 0.010000 -0.184581 +v -2.122678 0.010000 -0.646033 +v -2.030388 0.010000 -0.646033 +v -2.030388 0.010000 -0.738323 +v -2.122678 0.010000 -0.738323 +v -2.122678 0.010000 -0.461452 +v -2.030388 0.010000 -0.461452 +v -2.030388 0.010000 -0.553742 +v -2.122678 0.010000 -0.553742 +v -1.938097 0.010000 -0.461452 +v -1.845807 0.010000 -0.461452 +v -1.845807 0.010000 -0.553742 +v -1.938097 0.010000 -0.553742 +v -2.491840 0.010001 -2.491840 +v -2.399549 0.010001 -2.491840 +v -2.399549 0.010001 -2.584130 +v -2.491840 0.010001 -2.584130 +v -2.491840 0.010001 -2.307259 +v -2.399549 0.010001 -2.307259 +v -2.399549 0.010001 -2.399549 +v -2.491840 0.010001 -2.399549 +v -2.307259 0.010001 -2.307259 +v -2.214968 0.010001 -2.307259 +v -2.214968 0.010001 -2.399549 +v -2.307259 0.010001 -2.399549 +v -2.861001 0.010001 -2.491840 +v -2.768711 0.010001 -2.491840 +v -2.768711 0.010001 -2.584130 +v -2.861001 0.010001 -2.584130 +v -2.861001 0.010001 -2.307259 +v -2.768711 0.010001 -2.307259 +v -2.768711 0.010001 -2.399549 +v -2.861001 0.010001 -2.399549 +v -2.676420 0.010001 -2.307259 +v -2.584130 0.010001 -2.307259 +v -2.584130 0.010001 -2.399549 +v -2.676420 0.010001 -2.399549 +v -2.861001 0.010001 -2.861001 +v -2.768711 0.010001 -2.861001 +v -2.768711 0.010001 -2.953291 +v -2.861001 0.010001 -2.953291 +v -2.861001 0.010001 -2.676420 +v -2.768711 0.010001 -2.676420 +v -2.768711 0.010001 -2.768711 +v -2.861001 0.010001 -2.768711 +v -2.676420 0.010001 -2.676420 +v -2.584130 0.010001 -2.676420 +v -2.584130 0.010001 -2.768711 +v -2.676420 0.010001 -2.768711 +v -2.491840 0.010001 -1.753517 +v -2.399549 0.010001 -1.753517 +v -2.399549 0.010001 -1.845807 +v -2.491840 0.010001 -1.845807 +v -2.491840 0.010001 -1.568936 +v -2.399549 0.010001 -1.568936 +v -2.399549 0.010001 -1.661226 +v -2.491840 0.010001 -1.661226 +v -2.307259 0.010001 -1.568936 +v -2.214968 0.010001 -1.568936 +v -2.214968 0.010001 -1.661226 +v -2.307259 0.010001 -1.661226 +v -2.861001 0.010001 -1.753517 +v -2.768711 0.010001 -1.753517 +v -2.768711 0.010001 -1.845807 +v -2.861001 0.010001 -1.845807 +v -2.861001 0.010001 -1.568936 +v -2.768711 0.010001 -1.568936 +v -2.768711 0.010001 -1.661226 +v -2.861001 0.010001 -1.661226 +v -2.676420 0.010001 -1.568936 +v -2.584130 0.010001 -1.568936 +v -2.584130 0.010001 -1.661226 +v -2.676420 0.010001 -1.661226 +v -2.861001 0.010001 -2.122678 +v -2.768711 0.010001 -2.122678 +v -2.768711 0.010001 -2.214968 +v -2.861001 0.010001 -2.214968 +v -2.861001 0.010001 -1.938097 +v -2.768711 0.010001 -1.938097 +v -2.768711 0.010001 -2.030388 +v -2.861001 0.010001 -2.030388 +v -2.676420 0.010001 -1.938097 +v -2.584130 0.010001 -1.938097 +v -2.584130 0.010001 -2.030388 +v -2.676420 0.010001 -2.030388 +v -1.753517 0.010001 -1.753517 +v -1.661226 0.010001 -1.753517 +v -1.661226 0.010001 -1.845807 +v -1.753517 0.010001 -1.845807 +v -1.753517 0.010001 -1.568936 +v -1.661226 0.010001 -1.568936 +v -1.661226 0.010001 -1.661226 +v -1.753517 0.010001 -1.661226 +v -1.568936 0.010001 -1.568936 +v -1.476646 0.010001 -1.568936 +v -1.476646 0.010001 -1.661226 +v -1.568936 0.010001 -1.661226 +v -2.122678 0.010001 -1.753517 +v -2.030388 0.010001 -1.753517 +v -2.030388 0.010001 -1.845807 +v -2.122678 0.010001 -1.845807 +v -2.122678 0.010001 -1.568936 +v -2.030388 0.010001 -1.568936 +v -2.030388 0.010001 -1.661226 +v -2.122678 0.010001 -1.661226 +v -1.938097 0.010001 -1.568936 +v -1.845807 0.010001 -1.568936 +v -1.845807 0.010001 -1.661226 +v -1.938097 0.010001 -1.661226 +v -2.122678 0.010001 -2.122678 +v -2.030388 0.010001 -2.122678 +v -2.030388 0.010001 -2.214968 +v -2.122678 0.010001 -2.214968 +v -2.122678 0.010001 -1.938097 +v -2.030388 0.010001 -1.938097 +v -2.030388 0.010001 -2.030388 +v -2.122678 0.010001 -2.030388 +v -1.938097 0.010001 -1.938097 +v -1.845807 0.010001 -1.938097 +v -1.845807 0.010001 -2.030388 +v -1.938097 0.010001 -2.030388 +v 1.938097 0.010002 -3.968485 +v 2.030388 0.010002 -3.968485 +v 2.030388 0.010002 -4.060776 +v 1.938097 0.010002 -4.060776 +v 1.938097 0.010002 -3.783905 +v 2.030388 0.010002 -3.783905 +v 2.030388 0.010002 -3.876195 +v 1.938097 0.010002 -3.876195 +v 2.122678 0.010002 -3.783905 +v 2.214968 0.010002 -3.783905 +v 2.214968 0.010002 -3.876195 +v 2.122678 0.010002 -3.876195 +v 1.568936 0.010002 -3.968485 +v 1.661226 0.010002 -3.968485 +v 1.661226 0.010002 -4.060776 +v 1.568936 0.010002 -4.060776 +v 1.568936 0.010002 -3.783905 +v 1.661226 0.010002 -3.783905 +v 1.661226 0.010002 -3.876195 +v 1.568936 0.010002 -3.876195 +v 1.753517 0.010002 -3.783905 +v 1.845807 0.010002 -3.783905 +v 1.845807 0.010002 -3.876195 +v 1.753517 0.010002 -3.876195 +v 1.568936 0.010002 -4.337647 +v 1.661226 0.010002 -4.337647 +v 1.661226 0.010002 -4.429937 +v 1.568936 0.010002 -4.429937 +v 1.568936 0.010002 -4.153066 +v 1.661226 0.010002 -4.153066 +v 1.661226 0.010002 -4.245357 +v 1.568936 0.010002 -4.245357 +v 1.753517 0.010002 -4.153066 +v 1.845807 0.010002 -4.153066 +v 1.845807 0.010002 -4.245357 +v 1.753517 0.010002 -4.245357 +v 1.938097 0.010001 -3.230163 +v 2.030388 0.010001 -3.230163 +v 2.030388 0.010001 -3.322453 +v 1.938097 0.010001 -3.322453 +v 1.938097 0.010001 -3.045582 +v 2.030388 0.010001 -3.045582 +v 2.030388 0.010001 -3.137872 +v 1.938097 0.010001 -3.137872 +v 2.122678 0.010001 -3.045582 +v 2.214968 0.010001 -3.045582 +v 2.214968 0.010001 -3.137872 +v 2.122678 0.010001 -3.137872 +v 1.568936 0.010001 -3.230163 +v 1.661226 0.010001 -3.230163 +v 1.661226 0.010001 -3.322453 +v 1.568936 0.010001 -3.322453 +v 1.568936 0.010001 -3.045582 +v 1.661226 0.010001 -3.045582 +v 1.661226 0.010001 -3.137872 +v 1.568936 0.010001 -3.137872 +v 1.753517 0.010001 -3.045582 +v 1.845807 0.010001 -3.045582 +v 1.845807 0.010001 -3.137872 +v 1.753517 0.010001 -3.137872 +v 1.568936 0.010001 -3.599324 +v 1.661226 0.010001 -3.599324 +v 1.661226 0.010002 -3.691614 +v 1.568936 0.010002 -3.691614 +v 1.568936 0.010001 -3.414743 +v 1.661226 0.010001 -3.414743 +v 1.661226 0.010001 -3.507033 +v 1.568936 0.010001 -3.507033 +v 1.753517 0.010001 -3.414743 +v 1.845807 0.010001 -3.414743 +v 1.845807 0.010001 -3.507033 +v 1.753517 0.010001 -3.507033 +v 2.676420 0.010001 -3.230163 +v 2.768711 0.010001 -3.230163 +v 2.768711 0.010001 -3.322453 +v 2.676420 0.010001 -3.322453 +v 2.676420 0.010001 -3.045582 +v 2.768711 0.010001 -3.045582 +v 2.768711 0.010001 -3.137872 +v 2.676420 0.010001 -3.137872 +v 2.861001 0.010001 -3.045582 +v 2.953291 0.010001 -3.045582 +v 2.953291 0.010001 -3.137872 +v 2.861001 0.010001 -3.137872 +v 2.307259 0.010001 -3.230163 +v 2.399549 0.010001 -3.230163 +v 2.399549 0.010001 -3.322453 +v 2.307259 0.010001 -3.322453 +v 2.307259 0.010001 -3.045582 +v 2.399549 0.010001 -3.045582 +v 2.399549 0.010001 -3.137872 +v 2.307259 0.010001 -3.137872 +v 2.491840 0.010001 -3.045582 +v 2.584130 0.010001 -3.045582 +v 2.584130 0.010001 -3.137872 +v 2.491840 0.010001 -3.137872 +v 2.307259 0.010001 -3.599324 +v 2.399549 0.010001 -3.599324 +v 2.399549 0.010002 -3.691614 +v 2.307259 0.010002 -3.691614 +v 2.307259 0.010001 -3.414743 +v 2.399549 0.010001 -3.414743 +v 2.399549 0.010001 -3.507033 +v 2.307259 0.010001 -3.507033 +v 2.491840 0.010001 -3.414743 +v 2.584130 0.010001 -3.414743 +v 2.584130 0.010001 -3.507033 +v 2.491840 0.010001 -3.507033 +v 0.461452 0.010002 -3.968485 +v 0.553742 0.010002 -3.968485 +v 0.553742 0.010002 -4.060776 +v 0.461452 0.010002 -4.060776 +v 0.461452 0.010002 -3.783905 +v 0.553742 0.010002 -3.783905 +v 0.553742 0.010002 -3.876195 +v 0.461452 0.010002 -3.876195 +v 0.646033 0.010002 -3.783905 +v 0.738323 0.010002 -3.783905 +v 0.738323 0.010002 -3.876195 +v 0.646033 0.010002 -3.876195 +v 0.092290 0.010002 -3.968485 +v 0.184581 0.010002 -3.968485 +v 0.184581 0.010002 -4.060776 +v 0.092290 0.010002 -4.060776 +v 0.092290 0.010002 -3.783905 +v 0.184581 0.010002 -3.783905 +v 0.184581 0.010002 -3.876195 +v 0.092290 0.010002 -3.876195 +v 0.276871 0.010002 -3.783905 +v 0.369161 0.010002 -3.783905 +v 0.369161 0.010002 -3.876195 +v 0.276871 0.010002 -3.876195 +v 0.092290 0.010002 -4.337647 +v 0.184581 0.010002 -4.337647 +v 0.184581 0.010002 -4.429937 +v 0.092290 0.010002 -4.429937 +v 0.092290 0.010002 -4.153066 +v 0.184581 0.010002 -4.153066 +v 0.184581 0.010002 -4.245357 +v 0.092290 0.010002 -4.245357 +v 0.276871 0.010002 -4.153066 +v 0.369161 0.010002 -4.153066 +v 0.369161 0.010002 -4.245357 +v 0.276871 0.010002 -4.245357 +v 0.461452 0.010001 -3.230163 +v 0.553742 0.010001 -3.230163 +v 0.553742 0.010001 -3.322453 +v 0.461452 0.010001 -3.322453 +v 0.461452 0.010001 -3.045582 +v 0.553742 0.010001 -3.045582 +v 0.553742 0.010001 -3.137872 +v 0.461452 0.010001 -3.137872 +v 0.646033 0.010001 -3.045582 +v 0.738323 0.010001 -3.045582 +v 0.738323 0.010001 -3.137872 +v 0.646033 0.010001 -3.137872 +v 0.092290 0.010001 -3.230163 +v 0.184581 0.010001 -3.230163 +v 0.184581 0.010001 -3.322453 +v 0.092290 0.010001 -3.322453 +v 0.092290 0.010001 -3.045582 +v 0.184581 0.010001 -3.045582 +v 0.184581 0.010001 -3.137872 +v 0.092290 0.010001 -3.137872 +v 0.276871 0.010001 -3.045582 +v 0.369161 0.010001 -3.045582 +v 0.369161 0.010001 -3.137872 +v 0.276871 0.010001 -3.137872 +v 0.092290 0.010001 -3.599324 +v 0.184581 0.010001 -3.599324 +v 0.184581 0.010002 -3.691614 +v 0.092290 0.010002 -3.691614 +v 0.092290 0.010001 -3.414743 +v 0.184581 0.010001 -3.414743 +v 0.184581 0.010001 -3.507033 +v 0.092290 0.010001 -3.507033 +v 0.276871 0.010001 -3.414743 +v 0.369161 0.010001 -3.414743 +v 0.369161 0.010001 -3.507033 +v 0.276871 0.010001 -3.507033 +v 1.199775 0.010001 -3.230163 +v 1.292065 0.010001 -3.230163 +v 1.292065 0.010001 -3.322453 +v 1.199775 0.010001 -3.322453 +v 1.199775 0.010001 -3.045582 +v 1.292065 0.010001 -3.045582 +v 1.292065 0.010001 -3.137872 +v 1.199775 0.010001 -3.137872 +v 1.384355 0.010001 -3.045582 +v 1.476646 0.010001 -3.045582 +v 1.476646 0.010001 -3.137872 +v 1.384355 0.010001 -3.137872 +v 0.830613 0.010001 -3.230163 +v 0.922904 0.010001 -3.230163 +v 0.922904 0.010001 -3.322453 +v 0.830613 0.010001 -3.322453 +v 0.830613 0.010001 -3.045582 +v 0.922904 0.010001 -3.045582 +v 0.922904 0.010001 -3.137872 +v 0.830613 0.010001 -3.137872 +v 1.015194 0.010001 -3.045582 +v 1.107484 0.010001 -3.045582 +v 1.107484 0.010001 -3.137872 +v 1.015194 0.010001 -3.137872 +v 0.830613 0.010001 -3.599324 +v 0.922904 0.010001 -3.599324 +v 0.922904 0.010002 -3.691614 +v 0.830613 0.010002 -3.691614 +v 0.830613 0.010001 -3.414743 +v 0.922904 0.010001 -3.414743 +v 0.922904 0.010001 -3.507033 +v 0.830613 0.010001 -3.507033 +v 1.015194 0.010001 -3.414743 +v 1.107484 0.010001 -3.414743 +v 1.107484 0.010001 -3.507033 +v 1.015194 0.010001 -3.507033 +v 0.461452 0.010002 -5.445131 +v 0.553742 0.010002 -5.445131 +v 0.553742 0.010002 -5.537421 +v 0.461452 0.010002 -5.537421 +v 0.461452 0.010002 -5.260550 +v 0.553742 0.010002 -5.260550 +v 0.553742 0.010002 -5.352840 +v 0.461452 0.010002 -5.352840 +v 0.646033 0.010002 -5.260550 +v 0.738323 0.010002 -5.260550 +v 0.738323 0.010002 -5.352840 +v 0.646033 0.010002 -5.352840 +v 0.092290 0.010002 -5.445131 +v 0.184581 0.010002 -5.445131 +v 0.184581 0.010002 -5.537421 +v 0.092290 0.010002 -5.537421 +v 0.092290 0.010002 -5.260550 +v 0.184581 0.010002 -5.260550 +v 0.184581 0.010002 -5.352840 +v 0.092290 0.010002 -5.352840 +v 0.276871 0.010002 -5.260550 +v 0.369161 0.010002 -5.260550 +v 0.369161 0.010002 -5.352840 +v 0.276871 0.010002 -5.352840 +v 0.092290 0.010002 -5.814293 +v 0.184581 0.010002 -5.814293 +v 0.184581 0.010002 -5.906583 +v 0.092290 0.010002 -5.906583 +v 0.092290 0.010002 -5.629711 +v 0.184581 0.010002 -5.629711 +v 0.184581 0.010002 -5.722002 +v 0.092290 0.010002 -5.722002 +v 0.276871 0.010002 -5.629711 +v 0.369161 0.010002 -5.629711 +v 0.369161 0.010002 -5.722002 +v 0.276871 0.010002 -5.722002 +v 0.461452 0.010002 -4.706808 +v 0.553742 0.010002 -4.706808 +v 0.553742 0.010002 -4.799098 +v 0.461452 0.010002 -4.799098 +v 0.461452 0.010002 -4.522227 +v 0.553742 0.010002 -4.522227 +v 0.553742 0.010002 -4.614518 +v 0.461452 0.010002 -4.614518 +v 0.646033 0.010002 -4.522227 +v 0.738323 0.010002 -4.522227 +v 0.738323 0.010002 -4.614518 +v 0.646033 0.010002 -4.614518 +v 0.092290 0.010002 -4.706808 +v 0.184581 0.010002 -4.706808 +v 0.184581 0.010002 -4.799098 +v 0.092290 0.010002 -4.799098 +v 0.092290 0.010002 -4.522227 +v 0.184581 0.010002 -4.522227 +v 0.184581 0.010002 -4.614518 +v 0.092290 0.010002 -4.614518 +v 0.276871 0.010002 -4.522227 +v 0.369161 0.010002 -4.522227 +v 0.369161 0.010002 -4.614518 +v 0.276871 0.010002 -4.614518 +v 0.092290 0.010002 -5.075970 +v 0.184581 0.010002 -5.075970 +v 0.184581 0.010002 -5.168260 +v 0.092290 0.010002 -5.168260 +v 0.092290 0.010002 -4.891389 +v 0.184581 0.010002 -4.891389 +v 0.184581 0.010002 -4.983679 +v 0.092290 0.010002 -4.983679 +v 0.276871 0.010002 -4.891389 +v 0.369161 0.010002 -4.891389 +v 0.369161 0.010002 -4.983679 +v 0.276871 0.010002 -4.983679 +v 1.199775 0.010002 -4.706808 +v 1.292065 0.010002 -4.706808 +v 1.292065 0.010002 -4.799098 +v 1.199775 0.010002 -4.799098 +v 1.199775 0.010002 -4.522227 +v 1.292065 0.010002 -4.522227 +v 1.292065 0.010002 -4.614518 +v 1.199775 0.010002 -4.614518 +v 1.384355 0.010002 -4.522227 +v 1.476646 0.010002 -4.522227 +v 1.476646 0.010002 -4.614518 +v 1.384355 0.010002 -4.614518 +v 0.830613 0.010002 -4.706808 +v 0.922904 0.010002 -4.706808 +v 0.922904 0.010002 -4.799098 +v 0.830613 0.010002 -4.799098 +v 0.830613 0.010002 -4.522227 +v 0.922904 0.010002 -4.522227 +v 0.922904 0.010002 -4.614518 +v 0.830613 0.010002 -4.614518 +v 1.015194 0.010002 -4.522227 +v 1.107484 0.010002 -4.522227 +v 1.107484 0.010002 -4.614518 +v 1.015194 0.010002 -4.614518 +v 0.830613 0.010002 -5.075970 +v 0.922904 0.010002 -5.075970 +v 0.922904 0.010002 -5.168260 +v 0.830613 0.010002 -5.168260 +v 0.830613 0.010002 -4.891389 +v 0.922904 0.010002 -4.891389 +v 0.922904 0.010002 -4.983679 +v 0.830613 0.010002 -4.983679 +v 1.015194 0.010002 -4.891389 +v 1.107484 0.010002 -4.891389 +v 1.107484 0.010002 -4.983679 +v 1.015194 0.010002 -4.983679 +v 1.938097 0.010000 -1.015194 +v 2.030388 0.010000 -1.015194 +v 2.030388 0.010000 -1.107484 +v 1.938097 0.010000 -1.107484 +v 1.938097 0.010000 -0.830613 +v 2.030388 0.010000 -0.830613 +v 2.030388 0.010000 -0.922904 +v 1.938097 0.010000 -0.922904 +v 2.122678 0.010000 -0.830613 +v 2.214968 0.010000 -0.830613 +v 2.214968 0.010000 -0.922904 +v 2.122678 0.010000 -0.922904 +v 1.568936 0.010000 -1.015194 +v 1.661226 0.010000 -1.015194 +v 1.661226 0.010000 -1.107484 +v 1.568936 0.010000 -1.107484 +v 1.568936 0.010000 -0.830613 +v 1.661226 0.010000 -0.830613 +v 1.661226 0.010000 -0.922904 +v 1.568936 0.010000 -0.922904 +v 1.753517 0.010000 -0.830613 +v 1.845807 0.010000 -0.830613 +v 1.845807 0.010000 -0.922904 +v 1.753517 0.010000 -0.922904 +v 1.568936 0.010001 -1.384355 +v 1.661226 0.010001 -1.384355 +v 1.661226 0.010001 -1.476646 +v 1.568936 0.010001 -1.476646 +v 1.568936 0.010000 -1.199775 +v 1.661226 0.010000 -1.199775 +v 1.661226 0.010001 -1.292065 +v 1.568936 0.010001 -1.292065 +v 1.753517 0.010000 -1.199775 +v 1.845807 0.010000 -1.199775 +v 1.845807 0.010001 -1.292065 +v 1.753517 0.010001 -1.292065 +v 1.938097 0.010000 -0.276871 +v 2.030388 0.010000 -0.276871 +v 2.030388 0.010000 -0.369161 +v 1.938097 0.010000 -0.369161 +v 1.938097 0.010000 -0.092290 +v 2.030388 0.010000 -0.092290 +v 2.030388 0.010000 -0.184581 +v 1.938097 0.010000 -0.184581 +v 2.122678 0.010000 -0.092290 +v 2.214968 0.010000 -0.092290 +v 2.214968 0.010000 -0.184581 +v 2.122678 0.010000 -0.184581 +v 1.568936 0.010000 -0.276871 +v 1.661226 0.010000 -0.276871 +v 1.661226 0.010000 -0.369161 +v 1.568936 0.010000 -0.369161 +v 1.568936 0.010000 -0.092290 +v 1.661226 0.010000 -0.092290 +v 1.661226 0.010000 -0.184581 +v 1.568936 0.010000 -0.184581 +v 1.753517 0.010000 -0.092290 +v 1.845807 0.010000 -0.092290 +v 1.845807 0.010000 -0.184581 +v 1.753517 0.010000 -0.184581 +v 1.568936 0.010000 -0.646033 +v 1.661226 0.010000 -0.646033 +v 1.661226 0.010000 -0.738323 +v 1.568936 0.010000 -0.738323 +v 1.568936 0.010000 -0.461452 +v 1.661226 0.010000 -0.461452 +v 1.661226 0.010000 -0.553742 +v 1.568936 0.010000 -0.553742 +v 1.753517 0.010000 -0.461452 +v 1.845807 0.010000 -0.461452 +v 1.845807 0.010000 -0.553742 +v 1.753517 0.010000 -0.553742 +v 2.676420 0.010000 -0.276871 +v 2.768711 0.010000 -0.276871 +v 2.768711 0.010000 -0.369161 +v 2.676420 0.010000 -0.369161 +v 2.676420 0.010000 -0.092290 +v 2.768711 0.010000 -0.092290 +v 2.768711 0.010000 -0.184581 +v 2.676420 0.010000 -0.184581 +v 2.861001 0.010000 -0.092290 +v 2.953291 0.010000 -0.092290 +v 2.953291 0.010000 -0.184581 +v 2.861001 0.010000 -0.184581 +v 2.307259 0.010000 -0.276871 +v 2.399549 0.010000 -0.276871 +v 2.399549 0.010000 -0.369161 +v 2.307259 0.010000 -0.369161 +v 2.307259 0.010000 -0.092290 +v 2.399549 0.010000 -0.092290 +v 2.399549 0.010000 -0.184581 +v 2.307259 0.010000 -0.184581 +v 2.491840 0.010000 -0.092290 +v 2.584130 0.010000 -0.092290 +v 2.584130 0.010000 -0.184581 +v 2.491840 0.010000 -0.184581 +v 2.307259 0.010000 -0.646033 +v 2.399549 0.010000 -0.646033 +v 2.399549 0.010000 -0.738323 +v 2.307259 0.010000 -0.738323 +v 2.307259 0.010000 -0.461452 +v 2.399549 0.010000 -0.461452 +v 2.399549 0.010000 -0.553742 +v 2.307259 0.010000 -0.553742 +v 2.491840 0.010000 -0.461452 +v 2.584130 0.010000 -0.461452 +v 2.584130 0.010000 -0.553742 +v 2.491840 0.010000 -0.553742 +v 0.461452 0.010000 -1.015194 +v 0.553742 0.010000 -1.015194 +v 0.553742 0.010000 -1.107484 +v 0.461452 0.010000 -1.107484 +v 0.461452 0.010000 -0.830613 +v 0.553742 0.010000 -0.830613 +v 0.553742 0.010000 -0.922904 +v 0.461452 0.010000 -0.922904 +v 0.646033 0.010000 -0.830613 +v 0.738323 0.010000 -0.830613 +v 0.738323 0.010000 -0.922904 +v 0.646033 0.010000 -0.922904 +v 0.092290 0.010000 -1.015194 +v 0.184581 0.010000 -1.015194 +v 0.184581 0.010000 -1.107484 +v 0.092290 0.010000 -1.107484 +v 0.092290 0.010000 -0.830613 +v 0.184581 0.010000 -0.830613 +v 0.184581 0.010000 -0.922904 +v 0.092290 0.010000 -0.922904 +v 0.276871 0.010000 -0.830613 +v 0.369161 0.010000 -0.830613 +v 0.369161 0.010000 -0.922904 +v 0.276871 0.010000 -0.922904 +v 0.092290 0.010001 -1.384355 +v 0.184581 0.010001 -1.384355 +v 0.184581 0.010001 -1.476646 +v 0.092290 0.010001 -1.476646 +v 0.092290 0.010000 -1.199775 +v 0.184581 0.010000 -1.199775 +v 0.184581 0.010001 -1.292065 +v 0.092290 0.010001 -1.292065 +v 0.276871 0.010000 -1.199775 +v 0.369161 0.010000 -1.199775 +v 0.369161 0.010001 -1.292065 +v 0.276871 0.010001 -1.292065 +v 0.461452 0.010000 -0.276871 +v 0.553742 0.010000 -0.276871 +v 0.553742 0.010000 -0.369161 +v 0.461452 0.010000 -0.369161 +v 0.461452 0.010000 -0.092290 +v 0.553742 0.010000 -0.092290 +v 0.553742 0.010000 -0.184581 +v 0.461452 0.010000 -0.184581 +v 0.646033 0.010000 -0.092290 +v 0.738323 0.010000 -0.092290 +v 0.738323 0.010000 -0.184581 +v 0.646033 0.010000 -0.184581 +v 0.092290 0.010000 -0.276871 +v 0.184581 0.010000 -0.276871 +v 0.184581 0.010000 -0.369161 +v 0.092290 0.010000 -0.369161 +v 0.092290 0.010000 -0.092290 +v 0.184581 0.010000 -0.092290 +v 0.184581 0.010000 -0.184581 +v 0.092290 0.010000 -0.184581 +v 0.276871 0.010000 -0.092290 +v 0.369161 0.010000 -0.092290 +v 0.369161 0.010000 -0.184581 +v 0.276871 0.010000 -0.184581 +v 0.092290 0.010000 -0.646033 +v 0.184581 0.010000 -0.646033 +v 0.184581 0.010000 -0.738323 +v 0.092290 0.010000 -0.738323 +v 0.092290 0.010000 -0.461452 +v 0.184581 0.010000 -0.461452 +v 0.184581 0.010000 -0.553742 +v 0.092290 0.010000 -0.553742 +v 0.276871 0.010000 -0.461452 +v 0.369161 0.010000 -0.461452 +v 0.369161 0.010000 -0.553742 +v 0.276871 0.010000 -0.553742 +v 1.199775 0.010000 -0.276871 +v 1.292065 0.010000 -0.276871 +v 1.292065 0.010000 -0.369161 +v 1.199775 0.010000 -0.369161 +v 1.199775 0.010000 -0.092290 +v 1.292065 0.010000 -0.092290 +v 1.292065 0.010000 -0.184581 +v 1.199775 0.010000 -0.184581 +v 1.384355 0.010000 -0.092290 +v 1.476646 0.010000 -0.092290 +v 1.476646 0.010000 -0.184581 +v 1.384355 0.010000 -0.184581 +v 0.830613 0.010000 -0.276871 +v 0.922904 0.010000 -0.276871 +v 0.922904 0.010000 -0.369161 +v 0.830613 0.010000 -0.369161 +v 0.830613 0.010000 -0.092290 +v 0.922904 0.010000 -0.092290 +v 0.922904 0.010000 -0.184581 +v 0.830613 0.010000 -0.184581 +v 1.015194 0.010000 -0.092290 +v 1.107484 0.010000 -0.092290 +v 1.107484 0.010000 -0.184581 +v 1.015194 0.010000 -0.184581 +v 0.830613 0.010000 -0.646033 +v 0.922904 0.010000 -0.646033 +v 0.922904 0.010000 -0.738323 +v 0.830613 0.010000 -0.738323 +v 0.830613 0.010000 -0.461452 +v 0.922904 0.010000 -0.461452 +v 0.922904 0.010000 -0.553742 +v 0.830613 0.010000 -0.553742 +v 1.015194 0.010000 -0.461452 +v 1.107484 0.010000 -0.461452 +v 1.107484 0.010000 -0.553742 +v 1.015194 0.010000 -0.553742 +v 0.461452 0.010001 -2.491840 +v 0.553742 0.010001 -2.491840 +v 0.553742 0.010001 -2.584130 +v 0.461452 0.010001 -2.584130 +v 0.461452 0.010001 -2.307259 +v 0.553742 0.010001 -2.307259 +v 0.553742 0.010001 -2.399549 +v 0.461452 0.010001 -2.399549 +v 0.646033 0.010001 -2.307259 +v 0.738323 0.010001 -2.307259 +v 0.738323 0.010001 -2.399549 +v 0.646033 0.010001 -2.399549 +v 0.092290 0.010001 -2.491840 +v 0.184581 0.010001 -2.491840 +v 0.184581 0.010001 -2.584130 +v 0.092290 0.010001 -2.584130 +v 0.092290 0.010001 -2.307259 +v 0.184581 0.010001 -2.307259 +v 0.184581 0.010001 -2.399549 +v 0.092290 0.010001 -2.399549 +v 0.276871 0.010001 -2.307259 +v 0.369161 0.010001 -2.307259 +v 0.369161 0.010001 -2.399549 +v 0.276871 0.010001 -2.399549 +v 0.092290 0.010001 -2.861001 +v 0.184581 0.010001 -2.861001 +v 0.184581 0.010001 -2.953291 +v 0.092290 0.010001 -2.953291 +v 0.092290 0.010001 -2.676420 +v 0.184581 0.010001 -2.676420 +v 0.184581 0.010001 -2.768711 +v 0.092290 0.010001 -2.768711 +v 0.276871 0.010001 -2.676420 +v 0.369161 0.010001 -2.676420 +v 0.369161 0.010001 -2.768711 +v 0.276871 0.010001 -2.768711 +v 0.461452 0.010001 -1.753517 +v 0.553742 0.010001 -1.753517 +v 0.553742 0.010001 -1.845807 +v 0.461452 0.010001 -1.845807 +v 0.461452 0.010001 -1.568936 +v 0.553742 0.010001 -1.568936 +v 0.553742 0.010001 -1.661226 +v 0.461452 0.010001 -1.661226 +v 0.646033 0.010001 -1.568936 +v 0.738323 0.010001 -1.568936 +v 0.738323 0.010001 -1.661226 +v 0.646033 0.010001 -1.661226 +v 0.092290 0.010001 -1.753517 +v 0.184581 0.010001 -1.753517 +v 0.184581 0.010001 -1.845807 +v 0.092290 0.010001 -1.845807 +v 0.092290 0.010001 -1.568936 +v 0.184581 0.010001 -1.568936 +v 0.184581 0.010001 -1.661226 +v 0.092290 0.010001 -1.661226 +v 0.276871 0.010001 -1.568936 +v 0.369161 0.010001 -1.568936 +v 0.369161 0.010001 -1.661226 +v 0.276871 0.010001 -1.661226 +v 0.092290 0.010001 -2.122678 +v 0.184581 0.010001 -2.122678 +v 0.184581 0.010001 -2.214968 +v 0.092290 0.010001 -2.214968 +v 0.092290 0.010001 -1.938097 +v 0.184581 0.010001 -1.938097 +v 0.184581 0.010001 -2.030388 +v 0.092290 0.010001 -2.030388 +v 0.276871 0.010001 -1.938097 +v 0.369161 0.010001 -1.938097 +v 0.369161 0.010001 -2.030388 +v 0.276871 0.010001 -2.030388 +v 1.199775 0.010001 -1.753517 +v 1.292065 0.010001 -1.753517 +v 1.292065 0.010001 -1.845807 +v 1.199775 0.010001 -1.845807 +v 1.199775 0.010001 -1.568936 +v 1.292065 0.010001 -1.568936 +v 1.292065 0.010001 -1.661226 +v 1.199775 0.010001 -1.661226 +v 1.384355 0.010001 -1.568936 +v 1.476646 0.010001 -1.568936 +v 1.476646 0.010001 -1.661226 +v 1.384355 0.010001 -1.661226 +v 0.830613 0.010001 -1.753517 +v 0.922904 0.010001 -1.753517 +v 0.922904 0.010001 -1.845807 +v 0.830613 0.010001 -1.845807 +v 0.830613 0.010001 -1.568936 +v 0.922904 0.010001 -1.568936 +v 0.922904 0.010001 -1.661226 +v 0.830613 0.010001 -1.661226 +v 1.015194 0.010001 -1.568936 +v 1.107484 0.010001 -1.568936 +v 1.107484 0.010001 -1.661226 +v 1.015194 0.010001 -1.661226 +v 0.830613 0.010001 -2.122678 +v 0.922904 0.010001 -2.122678 +v 0.922904 0.010001 -2.214968 +v 0.830613 0.010001 -2.214968 +v 0.830613 0.010001 -1.938097 +v 0.922904 0.010001 -1.938097 +v 0.922904 0.010001 -2.030388 +v 0.830613 0.010001 -2.030388 +v 1.015194 0.010001 -1.938097 +v 1.107484 0.010001 -1.938097 +v 1.107484 0.010001 -2.030388 +v 1.015194 0.010001 -2.030388 +v 4.891389 0.010000 -1.015194 +v 4.983679 0.010000 -1.015194 +v 4.983679 0.010000 -1.107484 +v 4.891389 0.010000 -1.107484 +v 4.891389 0.010000 -0.830613 +v 4.983679 0.010000 -0.830613 +v 4.983679 0.010000 -0.922904 +v 4.891389 0.010000 -0.922904 +v 5.075970 0.010000 -0.830613 +v 5.168260 0.010000 -0.830613 +v 5.168260 0.010000 -0.922904 +v 5.075970 0.010000 -0.922904 +v 4.522227 0.010000 -1.015194 +v 4.614518 0.010000 -1.015194 +v 4.614518 0.010000 -1.107484 +v 4.522227 0.010000 -1.107484 +v 4.522227 0.010000 -0.830613 +v 4.614518 0.010000 -0.830613 +v 4.614518 0.010000 -0.922904 +v 4.522227 0.010000 -0.922904 +v 4.706808 0.010000 -0.830613 +v 4.799098 0.010000 -0.830613 +v 4.799098 0.010000 -0.922904 +v 4.706808 0.010000 -0.922904 +v 4.522227 0.010001 -1.384355 +v 4.614518 0.010001 -1.384355 +v 4.614518 0.010001 -1.476646 +v 4.522227 0.010001 -1.476646 +v 4.522227 0.010000 -1.199775 +v 4.614518 0.010000 -1.199775 +v 4.614518 0.010001 -1.292065 +v 4.522227 0.010001 -1.292065 +v 4.706808 0.010000 -1.199775 +v 4.799098 0.010000 -1.199775 +v 4.799098 0.010001 -1.292065 +v 4.706808 0.010001 -1.292065 +v 4.891389 0.010000 -0.276871 +v 4.983679 0.010000 -0.276871 +v 4.983679 0.010000 -0.369161 +v 4.891389 0.010000 -0.369161 +v 4.891389 0.010000 -0.092290 +v 4.983679 0.010000 -0.092290 +v 4.983679 0.010000 -0.184581 +v 4.891389 0.010000 -0.184581 +v 5.075970 0.010000 -0.092290 +v 5.168260 0.010000 -0.092290 +v 5.168260 0.010000 -0.184581 +v 5.075970 0.010000 -0.184581 +v 4.522227 0.010000 -0.276871 +v 4.614518 0.010000 -0.276871 +v 4.614518 0.010000 -0.369161 +v 4.522227 0.010000 -0.369161 +v 4.522227 0.010000 -0.092290 +v 4.614518 0.010000 -0.092290 +v 4.614518 0.010000 -0.184581 +v 4.522227 0.010000 -0.184581 +v 4.706808 0.010000 -0.092290 +v 4.799098 0.010000 -0.092290 +v 4.799098 0.010000 -0.184581 +v 4.706808 0.010000 -0.184581 +v 4.522227 0.010000 -0.646033 +v 4.614518 0.010000 -0.646033 +v 4.614518 0.010000 -0.738323 +v 4.522227 0.010000 -0.738323 +v 4.522227 0.010000 -0.461452 +v 4.614518 0.010000 -0.461452 +v 4.614518 0.010000 -0.553742 +v 4.522227 0.010000 -0.553742 +v 4.706808 0.010000 -0.461452 +v 4.799098 0.010000 -0.461452 +v 4.799098 0.010000 -0.553742 +v 4.706808 0.010000 -0.553742 +v 5.629711 0.010000 -0.276871 +v 5.722002 0.010000 -0.276871 +v 5.722002 0.010000 -0.369161 +v 5.629711 0.010000 -0.369161 +v 5.629711 0.010000 -0.092290 +v 5.722002 0.010000 -0.092290 +v 5.722002 0.010000 -0.184581 +v 5.629711 0.010000 -0.184581 +v 5.814293 0.010000 -0.092290 +v 5.906583 0.010000 -0.092290 +v 5.906583 0.010000 -0.184581 +v 5.814293 0.010000 -0.184581 +v 5.260550 0.010000 -0.276871 +v 5.352840 0.010000 -0.276871 +v 5.352840 0.010000 -0.369161 +v 5.260550 0.010000 -0.369161 +v 5.260550 0.010000 -0.092290 +v 5.352840 0.010000 -0.092290 +v 5.352840 0.010000 -0.184581 +v 5.260550 0.010000 -0.184581 +v 5.445131 0.010000 -0.092290 +v 5.537421 0.010000 -0.092290 +v 5.537421 0.010000 -0.184581 +v 5.445131 0.010000 -0.184581 +v 5.260550 0.010000 -0.646033 +v 5.352840 0.010000 -0.646033 +v 5.352840 0.010000 -0.738323 +v 5.260550 0.010000 -0.738323 +v 5.260550 0.010000 -0.461452 +v 5.352840 0.010000 -0.461452 +v 5.352840 0.010000 -0.553742 +v 5.260550 0.010000 -0.553742 +v 5.445131 0.010000 -0.461452 +v 5.537421 0.010000 -0.461452 +v 5.537421 0.010000 -0.553742 +v 5.445131 0.010000 -0.553742 +v 3.414743 0.010000 -1.015194 +v 3.507033 0.010000 -1.015194 +v 3.507033 0.010000 -1.107484 +v 3.414743 0.010000 -1.107484 +v 3.414743 0.010000 -0.830613 +v 3.507033 0.010000 -0.830613 +v 3.507033 0.010000 -0.922904 +v 3.414743 0.010000 -0.922904 +v 3.599324 0.010000 -0.830613 +v 3.691614 0.010000 -0.830613 +v 3.691614 0.010000 -0.922904 +v 3.599324 0.010000 -0.922904 +v 3.045582 0.010000 -1.015194 +v 3.137872 0.010000 -1.015194 +v 3.137872 0.010000 -1.107484 +v 3.045582 0.010000 -1.107484 +v 3.045582 0.010000 -0.830613 +v 3.137872 0.010000 -0.830613 +v 3.137872 0.010000 -0.922904 +v 3.045582 0.010000 -0.922904 +v 3.230163 0.010000 -0.830613 +v 3.322453 0.010000 -0.830613 +v 3.322453 0.010000 -0.922904 +v 3.230163 0.010000 -0.922904 +v 3.045582 0.010001 -1.384355 +v 3.137872 0.010001 -1.384355 +v 3.137872 0.010001 -1.476646 +v 3.045582 0.010001 -1.476646 +v 3.045582 0.010000 -1.199775 +v 3.137872 0.010000 -1.199775 +v 3.137872 0.010001 -1.292065 +v 3.045582 0.010001 -1.292065 +v 3.230163 0.010000 -1.199775 +v 3.322453 0.010000 -1.199775 +v 3.322453 0.010001 -1.292065 +v 3.230163 0.010001 -1.292065 +v 3.414743 0.010000 -0.276871 +v 3.507033 0.010000 -0.276871 +v 3.507033 0.010000 -0.369161 +v 3.414743 0.010000 -0.369161 +v 3.414743 0.010000 -0.092290 +v 3.507033 0.010000 -0.092290 +v 3.507033 0.010000 -0.184581 +v 3.414743 0.010000 -0.184581 +v 3.599324 0.010000 -0.092290 +v 3.691614 0.010000 -0.092290 +v 3.691614 0.010000 -0.184581 +v 3.599324 0.010000 -0.184581 +v 3.045582 0.010000 -0.276871 +v 3.137872 0.010000 -0.276871 +v 3.137872 0.010000 -0.369161 +v 3.045582 0.010000 -0.369161 +v 3.045582 0.010000 -0.092290 +v 3.137872 0.010000 -0.092290 +v 3.137872 0.010000 -0.184581 +v 3.045582 0.010000 -0.184581 +v 3.230163 0.010000 -0.092290 +v 3.322453 0.010000 -0.092290 +v 3.322453 0.010000 -0.184581 +v 3.230163 0.010000 -0.184581 +v 3.045582 0.010000 -0.646033 +v 3.137872 0.010000 -0.646033 +v 3.137872 0.010000 -0.738323 +v 3.045582 0.010000 -0.738323 +v 3.045582 0.010000 -0.461452 +v 3.137872 0.010000 -0.461452 +v 3.137872 0.010000 -0.553742 +v 3.045582 0.010000 -0.553742 +v 3.230163 0.010000 -0.461452 +v 3.322453 0.010000 -0.461452 +v 3.322453 0.010000 -0.553742 +v 3.230163 0.010000 -0.553742 +v 4.153066 0.010000 -0.276871 +v 4.245357 0.010000 -0.276871 +v 4.245357 0.010000 -0.369161 +v 4.153066 0.010000 -0.369161 +v 4.153066 0.010000 -0.092290 +v 4.245357 0.010000 -0.092290 +v 4.245357 0.010000 -0.184581 +v 4.153066 0.010000 -0.184581 +v 4.337647 0.010000 -0.092290 +v 4.429937 0.010000 -0.092290 +v 4.429937 0.010000 -0.184581 +v 4.337647 0.010000 -0.184581 +v 3.783905 0.010000 -0.276871 +v 3.876195 0.010000 -0.276871 +v 3.876195 0.010000 -0.369161 +v 3.783905 0.010000 -0.369161 +v 3.783905 0.010000 -0.092290 +v 3.876195 0.010000 -0.092290 +v 3.876195 0.010000 -0.184581 +v 3.783905 0.010000 -0.184581 +v 3.968485 0.010000 -0.092290 +v 4.060776 0.010000 -0.092290 +v 4.060776 0.010000 -0.184581 +v 3.968485 0.010000 -0.184581 +v 3.783905 0.010000 -0.646033 +v 3.876195 0.010000 -0.646033 +v 3.876195 0.010000 -0.738323 +v 3.783905 0.010000 -0.738323 +v 3.783905 0.010000 -0.461452 +v 3.876195 0.010000 -0.461452 +v 3.876195 0.010000 -0.553742 +v 3.783905 0.010000 -0.553742 +v 3.968485 0.010000 -0.461452 +v 4.060776 0.010000 -0.461452 +v 4.060776 0.010000 -0.553742 +v 3.968485 0.010000 -0.553742 +v 3.414743 0.010001 -2.491840 +v 3.507033 0.010001 -2.491840 +v 3.507033 0.010001 -2.584130 +v 3.414743 0.010001 -2.584130 +v 3.414743 0.010001 -2.307259 +v 3.507033 0.010001 -2.307259 +v 3.507033 0.010001 -2.399549 +v 3.414743 0.010001 -2.399549 +v 3.599324 0.010001 -2.307259 +v 3.691614 0.010001 -2.307259 +v 3.691614 0.010001 -2.399549 +v 3.599324 0.010001 -2.399549 +v 3.045582 0.010001 -2.491840 +v 3.137872 0.010001 -2.491840 +v 3.137872 0.010001 -2.584130 +v 3.045582 0.010001 -2.584130 +v 3.045582 0.010001 -2.307259 +v 3.137872 0.010001 -2.307259 +v 3.137872 0.010001 -2.399549 +v 3.045582 0.010001 -2.399549 +v 3.230163 0.010001 -2.307259 +v 3.322453 0.010001 -2.307259 +v 3.322453 0.010001 -2.399549 +v 3.230163 0.010001 -2.399549 +v 3.045582 0.010001 -2.861001 +v 3.137872 0.010001 -2.861001 +v 3.137872 0.010001 -2.953291 +v 3.045582 0.010001 -2.953291 +v 3.045582 0.010001 -2.676420 +v 3.137872 0.010001 -2.676420 +v 3.137872 0.010001 -2.768711 +v 3.045582 0.010001 -2.768711 +v 3.230163 0.010001 -2.676420 +v 3.322453 0.010001 -2.676420 +v 3.322453 0.010001 -2.768711 +v 3.230163 0.010001 -2.768711 +v 3.414743 0.010001 -1.753517 +v 3.507033 0.010001 -1.753517 +v 3.507033 0.010001 -1.845807 +v 3.414743 0.010001 -1.845807 +v 3.414743 0.010001 -1.568936 +v 3.507033 0.010001 -1.568936 +v 3.507033 0.010001 -1.661226 +v 3.414743 0.010001 -1.661226 +v 3.599324 0.010001 -1.568936 +v 3.691614 0.010001 -1.568936 +v 3.691614 0.010001 -1.661226 +v 3.599324 0.010001 -1.661226 +v 3.045582 0.010001 -1.753517 +v 3.137872 0.010001 -1.753517 +v 3.137872 0.010001 -1.845807 +v 3.045582 0.010001 -1.845807 +v 3.045582 0.010001 -1.568936 +v 3.137872 0.010001 -1.568936 +v 3.137872 0.010001 -1.661226 +v 3.045582 0.010001 -1.661226 +v 3.230163 0.010001 -1.568936 +v 3.322453 0.010001 -1.568936 +v 3.322453 0.010001 -1.661226 +v 3.230163 0.010001 -1.661226 +v 3.045582 0.010001 -2.122678 +v 3.137872 0.010001 -2.122678 +v 3.137872 0.010001 -2.214968 +v 3.045582 0.010001 -2.214968 +v 3.045582 0.010001 -1.938097 +v 3.137872 0.010001 -1.938097 +v 3.137872 0.010001 -2.030388 +v 3.045582 0.010001 -2.030388 +v 3.230163 0.010001 -1.938097 +v 3.322453 0.010001 -1.938097 +v 3.322453 0.010001 -2.030388 +v 3.230163 0.010001 -2.030388 +v 4.153066 0.010001 -1.753517 +v 4.245357 0.010001 -1.753517 +v 4.245357 0.010001 -1.845807 +v 4.153066 0.010001 -1.845807 +v 4.153066 0.010001 -1.568936 +v 4.245357 0.010001 -1.568936 +v 4.245357 0.010001 -1.661226 +v 4.153066 0.010001 -1.661226 +v 4.337647 0.010001 -1.568936 +v 4.429937 0.010001 -1.568936 +v 4.429937 0.010001 -1.661226 +v 4.337647 0.010001 -1.661226 +v 3.783905 0.010001 -1.753517 +v 3.876195 0.010001 -1.753517 +v 3.876195 0.010001 -1.845807 +v 3.783905 0.010001 -1.845807 +v 3.783905 0.010001 -1.568936 +v 3.876195 0.010001 -1.568936 +v 3.876195 0.010001 -1.661226 +v 3.783905 0.010001 -1.661226 +v 3.968485 0.010001 -1.568936 +v 4.060776 0.010001 -1.568936 +v 4.060776 0.010001 -1.661226 +v 3.968485 0.010001 -1.661226 +v 3.783905 0.010001 -2.122678 +v 3.876195 0.010001 -2.122678 +v 3.876195 0.010001 -2.214968 +v 3.783905 0.010001 -2.214968 +v 3.783905 0.010001 -1.938097 +v 3.876195 0.010001 -1.938097 +v 3.876195 0.010001 -2.030388 +v 3.783905 0.010001 -2.030388 +v 3.968485 0.010001 -1.938097 +v 4.060776 0.010001 -1.938097 +v 4.060776 0.010001 -2.030388 +v 3.968485 0.010001 -2.030388 +v 4.891389 0.010001 -2.491840 +v 4.983679 0.010001 -2.491840 +v 4.983679 0.010001 -2.584130 +v 4.891389 0.010001 -2.584130 +v 4.891389 0.010001 -2.307259 +v 4.983679 0.010001 -2.307259 +v 4.983679 0.010001 -2.399549 +v 4.891389 0.010001 -2.399549 +v 5.075970 0.010001 -2.307259 +v 5.168260 0.010001 -2.307259 +v 5.168260 0.010001 -2.399549 +v 5.075970 0.010001 -2.399549 +v 4.522227 0.010001 -2.491840 +v 4.614518 0.010001 -2.491840 +v 4.614518 0.010001 -2.584130 +v 4.522227 0.010001 -2.584130 +v 4.522227 0.010001 -2.307259 +v 4.614518 0.010001 -2.307259 +v 4.614518 0.010001 -2.399549 +v 4.522227 0.010001 -2.399549 +v 4.706808 0.010001 -2.307259 +v 4.799098 0.010001 -2.307259 +v 4.799098 0.010001 -2.399549 +v 4.706808 0.010001 -2.399549 +v 4.522227 0.010001 -2.861001 +v 4.614518 0.010001 -2.861001 +v 4.614518 0.010001 -2.953291 +v 4.522227 0.010001 -2.953291 +v 4.522227 0.010001 -2.676420 +v 4.614518 0.010001 -2.676420 +v 4.614518 0.010001 -2.768711 +v 4.522227 0.010001 -2.768711 +v 4.706808 0.010001 -2.676420 +v 4.799098 0.010001 -2.676420 +v 4.799098 0.010001 -2.768711 +v 4.706808 0.010001 -2.768711 +v 4.891389 0.010001 -1.753517 +v 4.983679 0.010001 -1.753517 +v 4.983679 0.010001 -1.845807 +v 4.891389 0.010001 -1.845807 +v 4.891389 0.010001 -1.568936 +v 4.983679 0.010001 -1.568936 +v 4.983679 0.010001 -1.661226 +v 4.891389 0.010001 -1.661226 +v 5.075970 0.010001 -1.568936 +v 5.168260 0.010001 -1.568936 +v 5.168260 0.010001 -1.661226 +v 5.075970 0.010001 -1.661226 +v 4.522227 0.010001 -1.753517 +v 4.614518 0.010001 -1.753517 +v 4.614518 0.010001 -1.845807 +v 4.522227 0.010001 -1.845807 +v 4.522227 0.010001 -1.568936 +v 4.614518 0.010001 -1.568936 +v 4.614518 0.010001 -1.661226 +v 4.522227 0.010001 -1.661226 +v 4.706808 0.010001 -1.568936 +v 4.799098 0.010001 -1.568936 +v 4.799098 0.010001 -1.661226 +v 4.706808 0.010001 -1.661226 +v 4.522227 0.010001 -2.122678 +v 4.614518 0.010001 -2.122678 +v 4.614518 0.010001 -2.214968 +v 4.522227 0.010001 -2.214968 +v 4.522227 0.010001 -1.938097 +v 4.614518 0.010001 -1.938097 +v 4.614518 0.010001 -2.030388 +v 4.522227 0.010001 -2.030388 +v 4.706808 0.010001 -1.938097 +v 4.799098 0.010001 -1.938097 +v 4.799098 0.010001 -2.030388 +v 4.706808 0.010001 -2.030388 +v 5.629711 0.010001 -1.753517 +v 5.722002 0.010001 -1.753517 +v 5.722002 0.010001 -1.845807 +v 5.629711 0.010001 -1.845807 +v 5.629711 0.010001 -1.568936 +v 5.722002 0.010001 -1.568936 +v 5.722002 0.010001 -1.661226 +v 5.629711 0.010001 -1.661226 +v 5.814293 0.010001 -1.568936 +v 5.906583 0.010001 -1.568936 +v 5.906583 0.010001 -1.661226 +v 5.814293 0.010001 -1.661226 +v 5.260550 0.010001 -1.753517 +v 5.352840 0.010001 -1.753517 +v 5.352840 0.010001 -1.845807 +v 5.260550 0.010001 -1.845807 +v 5.260550 0.010001 -1.568936 +v 5.352840 0.010001 -1.568936 +v 5.352840 0.010001 -1.661226 +v 5.260550 0.010001 -1.661226 +v 5.445131 0.010001 -1.568936 +v 5.537421 0.010001 -1.568936 +v 5.537421 0.010001 -1.661226 +v 5.445131 0.010001 -1.661226 +v 5.260550 0.010001 -2.122678 +v 5.352840 0.010001 -2.122678 +v 5.352840 0.010001 -2.214968 +v 5.260550 0.010001 -2.214968 +v 5.260550 0.010001 -1.938097 +v 5.352840 0.010001 -1.938097 +v 5.352840 0.010001 -2.030388 +v 5.260550 0.010001 -2.030388 +v 5.445131 0.010001 -1.938097 +v 5.537421 0.010001 -1.938097 +v 5.537421 0.010001 -2.030388 +v 5.445131 0.010001 -2.030388 +v 1.938097 0.010001 -2.491840 +v 2.030388 0.010001 -2.491840 +v 2.030388 0.010001 -2.584130 +v 1.938097 0.010001 -2.584130 +v 1.938097 0.010001 -2.307259 +v 2.030388 0.010001 -2.307259 +v 2.030388 0.010001 -2.399549 +v 1.938097 0.010001 -2.399549 +v 2.122678 0.010001 -2.307259 +v 2.214968 0.010001 -2.307259 +v 2.214968 0.010001 -2.399549 +v 2.122678 0.010001 -2.399549 +v 1.568936 0.010001 -2.491840 +v 1.661226 0.010001 -2.491840 +v 1.661226 0.010001 -2.584130 +v 1.568936 0.010001 -2.584130 +v 1.568936 0.010001 -2.307259 +v 1.661226 0.010001 -2.307259 +v 1.661226 0.010001 -2.399549 +v 1.568936 0.010001 -2.399549 +v 1.753517 0.010001 -2.307259 +v 1.845807 0.010001 -2.307259 +v 1.845807 0.010001 -2.399549 +v 1.753517 0.010001 -2.399549 +v 1.568936 0.010001 -2.861001 +v 1.661226 0.010001 -2.861001 +v 1.661226 0.010001 -2.953291 +v 1.568936 0.010001 -2.953291 +v 1.568936 0.010001 -2.676420 +v 1.661226 0.010001 -2.676420 +v 1.661226 0.010001 -2.768711 +v 1.568936 0.010001 -2.768711 +v 1.753517 0.010001 -2.676420 +v 1.845807 0.010001 -2.676420 +v 1.845807 0.010001 -2.768711 +v 1.753517 0.010001 -2.768711 +v 1.938097 0.010001 -1.753517 +v 2.030388 0.010001 -1.753517 +v 2.030388 0.010001 -1.845807 +v 1.938097 0.010001 -1.845807 +v 1.938097 0.010001 -1.568936 +v 2.030388 0.010001 -1.568936 +v 2.030388 0.010001 -1.661226 +v 1.938097 0.010001 -1.661226 +v 2.122678 0.010001 -1.568936 +v 2.214968 0.010001 -1.568936 +v 2.214968 0.010001 -1.661226 +v 2.122678 0.010001 -1.661226 +v 1.568936 0.010001 -1.753517 +v 1.661226 0.010001 -1.753517 +v 1.661226 0.010001 -1.845807 +v 1.568936 0.010001 -1.845807 +v 1.568936 0.010001 -1.568936 +v 1.661226 0.010001 -1.568936 +v 1.661226 0.010001 -1.661226 +v 1.568936 0.010001 -1.661226 +v 1.753517 0.010001 -1.568936 +v 1.845807 0.010001 -1.568936 +v 1.845807 0.010001 -1.661226 +v 1.753517 0.010001 -1.661226 +v 1.568936 0.010001 -2.122678 +v 1.661226 0.010001 -2.122678 +v 1.661226 0.010001 -2.214968 +v 1.568936 0.010001 -2.214968 +v 1.568936 0.010001 -1.938097 +v 1.661226 0.010001 -1.938097 +v 1.661226 0.010001 -2.030388 +v 1.568936 0.010001 -2.030388 +v 1.753517 0.010001 -1.938097 +v 1.845807 0.010001 -1.938097 +v 1.845807 0.010001 -2.030388 +v 1.753517 0.010001 -2.030388 +v 2.676420 0.010001 -1.753517 +v 2.768711 0.010001 -1.753517 +v 2.768711 0.010001 -1.845807 +v 2.676420 0.010001 -1.845807 +v 2.676420 0.010001 -1.568936 +v 2.768711 0.010001 -1.568936 +v 2.768711 0.010001 -1.661226 +v 2.676420 0.010001 -1.661226 +v 2.861001 0.010001 -1.568936 +v 2.953291 0.010001 -1.568936 +v 2.953291 0.010001 -1.661226 +v 2.861001 0.010001 -1.661226 +v 2.307259 0.010001 -1.753517 +v 2.399549 0.010001 -1.753517 +v 2.399549 0.010001 -1.845807 +v 2.307259 0.010001 -1.845807 +v 2.307259 0.010001 -1.568936 +v 2.399549 0.010001 -1.568936 +v 2.399549 0.010001 -1.661226 +v 2.307259 0.010001 -1.661226 +v 2.491840 0.010001 -1.568936 +v 2.584130 0.010001 -1.568936 +v 2.584130 0.010001 -1.661226 +v 2.491840 0.010001 -1.661226 +v 2.307259 0.010001 -2.122678 +v 2.399549 0.010001 -2.122678 +v 2.399549 0.010001 -2.214968 +v 2.307259 0.010001 -2.214968 +v 2.307259 0.010001 -1.938097 +v 2.399549 0.010001 -1.938097 +v 2.399549 0.010001 -2.030388 +v 2.307259 0.010001 -2.030388 +v 2.491840 0.010001 -1.938097 +v 2.584130 0.010001 -1.938097 +v 2.584130 0.010001 -2.030388 +v 2.491840 0.010001 -2.030388 +v 1.938097 0.010002 -5.445131 +v 2.030388 0.010002 -5.445131 +v 2.030388 0.010002 -5.537421 +v 1.938097 0.010002 -5.537421 +v 1.938097 0.010002 -5.260550 +v 2.030388 0.010002 -5.260550 +v 2.030388 0.010002 -5.352840 +v 1.938097 0.010002 -5.352840 +v 2.122678 0.010002 -5.260550 +v 2.214968 0.010002 -5.260550 +v 2.214968 0.010002 -5.352840 +v 2.122678 0.010002 -5.352840 +v 1.568936 0.010002 -5.445131 +v 1.661226 0.010002 -5.445131 +v 1.661226 0.010002 -5.537421 +v 1.568936 0.010002 -5.537421 +v 1.568936 0.010002 -5.260550 +v 1.661226 0.010002 -5.260550 +v 1.661226 0.010002 -5.352840 +v 1.568936 0.010002 -5.352840 +v 1.753517 0.010002 -5.260550 +v 1.845807 0.010002 -5.260550 +v 1.845807 0.010002 -5.352840 +v 1.753517 0.010002 -5.352840 +v 1.568936 0.010002 -5.814293 +v 1.661226 0.010002 -5.814293 +v 1.661226 0.010002 -5.906583 +v 1.568936 0.010002 -5.906583 +v 1.568936 0.010002 -5.629711 +v 1.661226 0.010002 -5.629711 +v 1.661226 0.010002 -5.722002 +v 1.568936 0.010002 -5.722002 +v 1.753517 0.010002 -5.629711 +v 1.845807 0.010002 -5.629711 +v 1.845807 0.010002 -5.722002 +v 1.753517 0.010002 -5.722002 +v 1.938097 0.010002 -4.706808 +v 2.030388 0.010002 -4.706808 +v 2.030388 0.010002 -4.799098 +v 1.938097 0.010002 -4.799098 +v 1.938097 0.010002 -4.522227 +v 2.030388 0.010002 -4.522227 +v 2.030388 0.010002 -4.614518 +v 1.938097 0.010002 -4.614518 +v 2.122678 0.010002 -4.522227 +v 2.214968 0.010002 -4.522227 +v 2.214968 0.010002 -4.614518 +v 2.122678 0.010002 -4.614518 +v 1.568936 0.010002 -4.706808 +v 1.661226 0.010002 -4.706808 +v 1.661226 0.010002 -4.799098 +v 1.568936 0.010002 -4.799098 +v 1.568936 0.010002 -4.522227 +v 1.661226 0.010002 -4.522227 +v 1.661226 0.010002 -4.614518 +v 1.568936 0.010002 -4.614518 +v 1.753517 0.010002 -4.522227 +v 1.845807 0.010002 -4.522227 +v 1.845807 0.010002 -4.614518 +v 1.753517 0.010002 -4.614518 +v 1.568936 0.010002 -5.075970 +v 1.661226 0.010002 -5.075970 +v 1.661226 0.010002 -5.168260 +v 1.568936 0.010002 -5.168260 +v 1.568936 0.010002 -4.891389 +v 1.661226 0.010002 -4.891389 +v 1.661226 0.010002 -4.983679 +v 1.568936 0.010002 -4.983679 +v 1.753517 0.010002 -4.891389 +v 1.845807 0.010002 -4.891389 +v 1.845807 0.010002 -4.983679 +v 1.753517 0.010002 -4.983679 +v 2.676420 0.010002 -4.706808 +v 2.768711 0.010002 -4.706808 +v 2.768711 0.010002 -4.799098 +v 2.676420 0.010002 -4.799098 +v 2.676420 0.010002 -4.522227 +v 2.768711 0.010002 -4.522227 +v 2.768711 0.010002 -4.614518 +v 2.676420 0.010002 -4.614518 +v 2.861001 0.010002 -4.522227 +v 2.953291 0.010002 -4.522227 +v 2.953291 0.010002 -4.614518 +v 2.861001 0.010002 -4.614518 +v 2.307259 0.010002 -4.706808 +v 2.399549 0.010002 -4.706808 +v 2.399549 0.010002 -4.799098 +v 2.307259 0.010002 -4.799098 +v 2.307259 0.010002 -4.522227 +v 2.399549 0.010002 -4.522227 +v 2.399549 0.010002 -4.614518 +v 2.307259 0.010002 -4.614518 +v 2.491840 0.010002 -4.522227 +v 2.584130 0.010002 -4.522227 +v 2.584130 0.010002 -4.614518 +v 2.491840 0.010002 -4.614518 +v 2.307259 0.010002 -5.075970 +v 2.399549 0.010002 -5.075970 +v 2.399549 0.010002 -5.168260 +v 2.307259 0.010002 -5.168260 +v 2.307259 0.010002 -4.891389 +v 2.399549 0.010002 -4.891389 +v 2.399549 0.010002 -4.983679 +v 2.307259 0.010002 -4.983679 +v 2.491840 0.010002 -4.891389 +v 2.584130 0.010002 -4.891389 +v 2.584130 0.010002 -4.983679 +v 2.491840 0.010002 -4.983679 +v -1.015194 0.010001 -2.491840 +v -0.922904 0.010001 -2.491840 +v -0.922904 0.010001 -2.584130 +v -1.015194 0.010001 -2.584130 +v -1.015194 0.010001 -2.307259 +v -0.922904 0.010001 -2.307259 +v -0.922904 0.010001 -2.399549 +v -1.015194 0.010001 -2.399549 +v -0.830613 0.010001 -2.307259 +v -0.738323 0.010001 -2.307259 +v -0.738323 0.010001 -2.399549 +v -0.830613 0.010001 -2.399549 +v -1.384355 0.010001 -2.491840 +v -1.292065 0.010001 -2.491840 +v -1.292065 0.010001 -2.584130 +v -1.384355 0.010001 -2.584130 +v -1.384355 0.010001 -2.307259 +v -1.292065 0.010001 -2.307259 +v -1.292065 0.010001 -2.399549 +v -1.384355 0.010001 -2.399549 +v -1.199775 0.010001 -2.307259 +v -1.107484 0.010001 -2.307259 +v -1.107484 0.010001 -2.399549 +v -1.199775 0.010001 -2.399549 +v -1.384355 0.010001 -2.861001 +v -1.292065 0.010001 -2.861001 +v -1.292065 0.010001 -2.953291 +v -1.384355 0.010001 -2.953291 +v -1.384355 0.010001 -2.676420 +v -1.292065 0.010001 -2.676420 +v -1.292065 0.010001 -2.768711 +v -1.384355 0.010001 -2.768711 +v -1.199775 0.010001 -2.676420 +v -1.107484 0.010001 -2.676420 +v -1.107484 0.010001 -2.768711 +v -1.199775 0.010001 -2.768711 +v -1.015194 0.010001 -1.753517 +v -0.922904 0.010001 -1.753517 +v -0.922904 0.010001 -1.845807 +v -1.015194 0.010001 -1.845807 +v -1.015194 0.010001 -1.568936 +v -0.922904 0.010001 -1.568936 +v -0.922904 0.010001 -1.661226 +v -1.015194 0.010001 -1.661226 +v -0.830613 0.010001 -1.568936 +v -0.738323 0.010001 -1.568936 +v -0.738323 0.010001 -1.661226 +v -0.830613 0.010001 -1.661226 +v -1.384355 0.010001 -1.753517 +v -1.292065 0.010001 -1.753517 +v -1.292065 0.010001 -1.845807 +v -1.384355 0.010001 -1.845807 +v -1.384355 0.010001 -1.568936 +v -1.292065 0.010001 -1.568936 +v -1.292065 0.010001 -1.661226 +v -1.384355 0.010001 -1.661226 +v -1.199775 0.010001 -1.568936 +v -1.107484 0.010001 -1.568936 +v -1.107484 0.010001 -1.661226 +v -1.199775 0.010001 -1.661226 +v -1.384355 0.010001 -2.122678 +v -1.292065 0.010001 -2.122678 +v -1.292065 0.010001 -2.214968 +v -1.384355 0.010001 -2.214968 +v -1.384355 0.010001 -1.938097 +v -1.292065 0.010001 -1.938097 +v -1.292065 0.010001 -2.030388 +v -1.384355 0.010001 -2.030388 +v -1.199775 0.010001 -1.938097 +v -1.107484 0.010001 -1.938097 +v -1.107484 0.010001 -2.030388 +v -1.199775 0.010001 -2.030388 +v -0.276871 0.010001 -1.753517 +v -0.184581 0.010001 -1.753517 +v -0.184581 0.010001 -1.845807 +v -0.276871 0.010001 -1.845807 +v -0.276871 0.010001 -1.568936 +v -0.184581 0.010001 -1.568936 +v -0.184581 0.010001 -1.661226 +v -0.276871 0.010001 -1.661226 +v -0.092290 0.010001 -1.568936 +v 0.000000 0.010001 -1.568936 +v 0.000000 0.010001 -1.661226 +v -0.092290 0.010001 -1.661226 +v -0.646033 0.010001 -1.753517 +v -0.553742 0.010001 -1.753517 +v -0.553742 0.010001 -1.845807 +v -0.646033 0.010001 -1.845807 +v -0.646033 0.010001 -1.568936 +v -0.553742 0.010001 -1.568936 +v -0.553742 0.010001 -1.661226 +v -0.646033 0.010001 -1.661226 +v -0.461452 0.010001 -1.568936 +v -0.369161 0.010001 -1.568936 +v -0.369161 0.010001 -1.661226 +v -0.461452 0.010001 -1.661226 +v -0.646033 0.010001 -2.122678 +v -0.553742 0.010001 -2.122678 +v -0.553742 0.010001 -2.214968 +v -0.646033 0.010001 -2.214968 +v -0.646033 0.010001 -1.938097 +v -0.553742 0.010001 -1.938097 +v -0.553742 0.010001 -2.030388 +v -0.646033 0.010001 -2.030388 +v -0.461452 0.010001 -1.938097 +v -0.369161 0.010001 -1.938097 +v -0.369161 0.010001 -2.030388 +v -0.461452 0.010001 -2.030388 +v -3.968485 0.010001 -2.491840 +v -3.876195 0.010001 -2.491840 +v -3.876195 0.010001 -2.584130 +v -3.968485 0.010001 -2.584130 +v -3.968485 0.010001 -2.307259 +v -3.876195 0.010001 -2.307259 +v -3.876195 0.010001 -2.399549 +v -3.968485 0.010001 -2.399549 +v -3.783905 0.010001 -2.307259 +v -3.691614 0.010001 -2.307259 +v -3.691614 0.010001 -2.399549 +v -3.783905 0.010001 -2.399549 +v -4.337647 0.010001 -2.491840 +v -4.245357 0.010001 -2.491840 +v -4.245357 0.010001 -2.584130 +v -4.337647 0.010001 -2.584130 +v -4.337647 0.010001 -2.307259 +v -4.245357 0.010001 -2.307259 +v -4.245357 0.010001 -2.399549 +v -4.337647 0.010001 -2.399549 +v -4.153066 0.010001 -2.307259 +v -4.060776 0.010001 -2.307259 +v -4.060776 0.010001 -2.399549 +v -4.153066 0.010001 -2.399549 +v -4.337647 0.010001 -2.861001 +v -4.245357 0.010001 -2.861001 +v -4.245357 0.010001 -2.953291 +v -4.337647 0.010001 -2.953291 +v -4.337647 0.010001 -2.676420 +v -4.245357 0.010001 -2.676420 +v -4.245357 0.010001 -2.768711 +v -4.337647 0.010001 -2.768711 +v -4.153066 0.010001 -2.676420 +v -4.060776 0.010001 -2.676420 +v -4.060776 0.010001 -2.768711 +v -4.153066 0.010001 -2.768711 +v -3.968485 0.010001 -1.753517 +v -3.876195 0.010001 -1.753517 +v -3.876195 0.010001 -1.845807 +v -3.968485 0.010001 -1.845807 +v -3.968485 0.010001 -1.568936 +v -3.876195 0.010001 -1.568936 +v -3.876195 0.010001 -1.661226 +v -3.968485 0.010001 -1.661226 +v -3.783905 0.010001 -1.568936 +v -3.691614 0.010001 -1.568936 +v -3.691614 0.010001 -1.661226 +v -3.783905 0.010001 -1.661226 +v -4.337647 0.010001 -1.753517 +v -4.245357 0.010001 -1.753517 +v -4.245357 0.010001 -1.845807 +v -4.337647 0.010001 -1.845807 +v -4.337647 0.010001 -1.568936 +v -4.245357 0.010001 -1.568936 +v -4.245357 0.010001 -1.661226 +v -4.337647 0.010001 -1.661226 +v -4.153066 0.010001 -1.568936 +v -4.060776 0.010001 -1.568936 +v -4.060776 0.010001 -1.661226 +v -4.153066 0.010001 -1.661226 +v -4.337647 0.010001 -2.122678 +v -4.245357 0.010001 -2.122678 +v -4.245357 0.010001 -2.214968 +v -4.337647 0.010001 -2.214968 +v -4.337647 0.010001 -1.938097 +v -4.245357 0.010001 -1.938097 +v -4.245357 0.010001 -2.030388 +v -4.337647 0.010001 -2.030388 +v -4.153066 0.010001 -1.938097 +v -4.060776 0.010001 -1.938097 +v -4.060776 0.010001 -2.030388 +v -4.153066 0.010001 -2.030388 +v -3.230163 0.010001 -1.753517 +v -3.137872 0.010001 -1.753517 +v -3.137872 0.010001 -1.845807 +v -3.230163 0.010001 -1.845807 +v -3.230163 0.010001 -1.568936 +v -3.137872 0.010001 -1.568936 +v -3.137872 0.010001 -1.661226 +v -3.230163 0.010001 -1.661226 +v -3.045582 0.010001 -1.568936 +v -2.953291 0.010001 -1.568936 +v -2.953291 0.010001 -1.661226 +v -3.045582 0.010001 -1.661226 +v -3.599324 0.010001 -1.753517 +v -3.507033 0.010001 -1.753517 +v -3.507033 0.010001 -1.845807 +v -3.599324 0.010001 -1.845807 +v -3.599324 0.010001 -1.568936 +v -3.507033 0.010001 -1.568936 +v -3.507033 0.010001 -1.661226 +v -3.599324 0.010001 -1.661226 +v -3.414743 0.010001 -1.568936 +v -3.322453 0.010001 -1.568936 +v -3.322453 0.010001 -1.661226 +v -3.414743 0.010001 -1.661226 +v -3.599324 0.010001 -2.122678 +v -3.507033 0.010001 -2.122678 +v -3.507033 0.010001 -2.214968 +v -3.599324 0.010001 -2.214968 +v -3.599324 0.010001 -1.938097 +v -3.507033 0.010001 -1.938097 +v -3.507033 0.010001 -2.030388 +v -3.599324 0.010001 -2.030388 +v -3.414743 0.010001 -1.938097 +v -3.322453 0.010001 -1.938097 +v -3.322453 0.010001 -2.030388 +v -3.414743 0.010001 -2.030388 +v -3.968485 0.010002 -5.445131 +v -3.876195 0.010002 -5.445131 +v -3.876195 0.010002 -5.537421 +v -3.968485 0.010002 -5.537421 +v -3.968485 0.010002 -5.260550 +v -3.876195 0.010002 -5.260550 +v -3.876195 0.010002 -5.352840 +v -3.968485 0.010002 -5.352840 +v -3.783905 0.010002 -5.260550 +v -3.691614 0.010002 -5.260550 +v -3.691614 0.010002 -5.352840 +v -3.783905 0.010002 -5.352840 +v -4.337647 0.010002 -5.445131 +v -4.245357 0.010002 -5.445131 +v -4.245357 0.010002 -5.537421 +v -4.337647 0.010002 -5.537421 +v -4.337647 0.010002 -5.260550 +v -4.245357 0.010002 -5.260550 +v -4.245357 0.010002 -5.352840 +v -4.337647 0.010002 -5.352840 +v -4.153066 0.010002 -5.260550 +v -4.060776 0.010002 -5.260550 +v -4.060776 0.010002 -5.352840 +v -4.153066 0.010002 -5.352840 +v -4.337647 0.010002 -5.814293 +v -4.245357 0.010002 -5.814293 +v -4.245357 0.010002 -5.906583 +v -4.337647 0.010002 -5.906583 +v -4.337647 0.010002 -5.629711 +v -4.245357 0.010002 -5.629711 +v -4.245357 0.010002 -5.722002 +v -4.337647 0.010002 -5.722002 +v -4.153066 0.010002 -5.629711 +v -4.060776 0.010002 -5.629711 +v -4.060776 0.010002 -5.722002 +v -4.153066 0.010002 -5.722002 +v -3.968485 0.010002 -4.706808 +v -3.876195 0.010002 -4.706808 +v -3.876195 0.010002 -4.799098 +v -3.968485 0.010002 -4.799098 +v -3.968485 0.010002 -4.522227 +v -3.876195 0.010002 -4.522227 +v -3.876195 0.010002 -4.614518 +v -3.968485 0.010002 -4.614518 +v -3.783905 0.010002 -4.522227 +v -3.691614 0.010002 -4.522227 +v -3.691614 0.010002 -4.614518 +v -3.783905 0.010002 -4.614518 +v -4.337647 0.010002 -4.706808 +v -4.245357 0.010002 -4.706808 +v -4.245357 0.010002 -4.799098 +v -4.337647 0.010002 -4.799098 +v -4.337647 0.010002 -4.522227 +v -4.245357 0.010002 -4.522227 +v -4.245357 0.010002 -4.614518 +v -4.337647 0.010002 -4.614518 +v -4.153066 0.010002 -4.522227 +v -4.060776 0.010002 -4.522227 +v -4.060776 0.010002 -4.614518 +v -4.153066 0.010002 -4.614518 +v -4.337647 0.010002 -5.075970 +v -4.245357 0.010002 -5.075970 +v -4.245357 0.010002 -5.168260 +v -4.337647 0.010002 -5.168260 +v -4.337647 0.010002 -4.891389 +v -4.245357 0.010002 -4.891389 +v -4.245357 0.010002 -4.983679 +v -4.337647 0.010002 -4.983679 +v -4.153066 0.010002 -4.891389 +v -4.060776 0.010002 -4.891389 +v -4.060776 0.010002 -4.983679 +v -4.153066 0.010002 -4.983679 +v -3.230163 0.010002 -4.706808 +v -3.137872 0.010002 -4.706808 +v -3.137872 0.010002 -4.799098 +v -3.230163 0.010002 -4.799098 +v -3.230163 0.010002 -4.522227 +v -3.137872 0.010002 -4.522227 +v -3.137872 0.010002 -4.614518 +v -3.230163 0.010002 -4.614518 +v -3.045582 0.010002 -4.522227 +v -2.953291 0.010002 -4.522227 +v -2.953291 0.010002 -4.614518 +v -3.045582 0.010002 -4.614518 +v -3.599324 0.010002 -4.706808 +v -3.507033 0.010002 -4.706808 +v -3.507033 0.010002 -4.799098 +v -3.599324 0.010002 -4.799098 +v -3.599324 0.010002 -4.522227 +v -3.507033 0.010002 -4.522227 +v -3.507033 0.010002 -4.614518 +v -3.599324 0.010002 -4.614518 +v -3.414743 0.010002 -4.522227 +v -3.322453 0.010002 -4.522227 +v -3.322453 0.010002 -4.614518 +v -3.414743 0.010002 -4.614518 +v -3.599324 0.010002 -5.075970 +v -3.507033 0.010002 -5.075970 +v -3.507033 0.010002 -5.168260 +v -3.599324 0.010002 -5.168260 +v -3.599324 0.010002 -4.891389 +v -3.507033 0.010002 -4.891389 +v -3.507033 0.010002 -4.983679 +v -3.599324 0.010002 -4.983679 +v -3.414743 0.010002 -4.891389 +v -3.322453 0.010002 -4.891389 +v -3.322453 0.010002 -4.983679 +v -3.414743 0.010002 -4.983679 +v -1.015194 0.009999 3.414743 +v -0.922904 0.009999 3.414743 +v -0.922904 0.009999 3.322453 +v -1.015194 0.009999 3.322453 +v -1.015194 0.009999 3.599324 +v -0.922904 0.009999 3.599324 +v -0.922904 0.009999 3.507033 +v -1.015194 0.009999 3.507033 +v -0.830613 0.009999 3.599324 +v -0.738323 0.009999 3.599324 +v -0.738323 0.009999 3.507033 +v -0.830613 0.009999 3.507033 +v -1.384355 0.009999 3.414743 +v -1.292065 0.009999 3.414743 +v -1.292065 0.009999 3.322453 +v -1.384355 0.009999 3.322453 +v -1.384355 0.009999 3.599324 +v -1.292065 0.009999 3.599324 +v -1.292065 0.009999 3.507033 +v -1.384355 0.009999 3.507033 +v -1.199775 0.009999 3.599324 +v -1.107484 0.009999 3.599324 +v -1.107484 0.009999 3.507033 +v -1.199775 0.009999 3.507033 +v -1.384355 0.009999 3.045582 +v -1.292065 0.009999 3.045582 +v -1.292065 0.009999 2.953291 +v -1.384355 0.009999 2.953291 +v -1.384355 0.009999 3.230163 +v -1.292065 0.009999 3.230163 +v -1.292065 0.009999 3.137872 +v -1.384355 0.009999 3.137872 +v -1.199775 0.009999 3.230163 +v -1.107484 0.009999 3.230163 +v -1.107484 0.009999 3.137872 +v -1.199775 0.009999 3.137872 +v -1.015194 0.009998 4.153066 +v -0.922904 0.009998 4.153066 +v -0.922904 0.009998 4.060776 +v -1.015194 0.009998 4.060776 +v -1.015194 0.009998 4.337647 +v -0.922904 0.009998 4.337647 +v -0.922904 0.009998 4.245357 +v -1.015194 0.009998 4.245357 +v -0.830613 0.009998 4.337647 +v -0.738323 0.009998 4.337647 +v -0.738323 0.009998 4.245357 +v -0.830613 0.009998 4.245357 +v -1.384355 0.009998 4.153066 +v -1.292065 0.009998 4.153066 +v -1.292065 0.009998 4.060776 +v -1.384355 0.009998 4.060776 +v -1.384355 0.009998 4.337647 +v -1.292065 0.009998 4.337647 +v -1.292065 0.009998 4.245357 +v -1.384355 0.009998 4.245357 +v -1.199775 0.009998 4.337647 +v -1.107484 0.009998 4.337647 +v -1.107484 0.009998 4.245357 +v -1.199775 0.009998 4.245357 +v -1.384355 0.009998 3.783905 +v -1.292065 0.009998 3.783905 +v -1.292065 0.009998 3.691614 +v -1.384355 0.009998 3.691614 +v -1.384355 0.009998 3.968485 +v -1.292065 0.009998 3.968485 +v -1.292065 0.009998 3.876195 +v -1.384355 0.009998 3.876195 +v -1.199775 0.009998 3.968485 +v -1.107484 0.009998 3.968485 +v -1.107484 0.009998 3.876195 +v -1.199775 0.009998 3.876195 +v -0.276871 0.009998 4.153066 +v -0.184581 0.009998 4.153066 +v -0.184581 0.009998 4.060776 +v -0.276871 0.009998 4.060776 +v -0.276871 0.009998 4.337647 +v -0.184581 0.009998 4.337647 +v -0.184581 0.009998 4.245357 +v -0.276871 0.009998 4.245357 +v -0.092290 0.009998 4.337647 +v 0.000000 0.009998 4.337647 +v 0.000000 0.009998 4.245357 +v -0.092290 0.009998 4.245357 +v -0.646033 0.009998 4.153066 +v -0.553742 0.009998 4.153066 +v -0.553742 0.009998 4.060776 +v -0.646033 0.009998 4.060776 +v -0.646033 0.009998 4.337647 +v -0.553742 0.009998 4.337647 +v -0.553742 0.009998 4.245357 +v -0.646033 0.009998 4.245357 +v -0.461452 0.009998 4.337647 +v -0.369161 0.009998 4.337647 +v -0.369161 0.009998 4.245357 +v -0.461452 0.009998 4.245357 +v -0.646033 0.009998 3.783905 +v -0.553742 0.009998 3.783905 +v -0.553742 0.009998 3.691614 +v -0.646033 0.009998 3.691614 +v -0.646033 0.009998 3.968485 +v -0.553742 0.009998 3.968485 +v -0.553742 0.009998 3.876195 +v -0.646033 0.009998 3.876195 +v -0.461452 0.009998 3.968485 +v -0.369161 0.009998 3.968485 +v -0.369161 0.009998 3.876195 +v -0.461452 0.009998 3.876195 +v -3.968485 0.009999 3.414743 +v -3.876195 0.009999 3.414743 +v -3.876195 0.009999 3.322453 +v -3.968485 0.009999 3.322453 +v -3.968485 0.009999 3.599324 +v -3.876195 0.009999 3.599324 +v -3.876195 0.009999 3.507033 +v -3.968485 0.009999 3.507033 +v -3.783905 0.009999 3.599324 +v -3.691614 0.009999 3.599324 +v -3.691614 0.009999 3.507033 +v -3.783905 0.009999 3.507033 +v -4.337647 0.009999 3.414743 +v -4.245357 0.009999 3.414743 +v -4.245357 0.009999 3.322453 +v -4.337647 0.009999 3.322453 +v -4.337647 0.009999 3.599324 +v -4.245357 0.009999 3.599324 +v -4.245357 0.009999 3.507033 +v -4.337647 0.009999 3.507033 +v -4.153066 0.009999 3.599324 +v -4.060776 0.009999 3.599324 +v -4.060776 0.009999 3.507033 +v -4.153066 0.009999 3.507033 +v -4.337647 0.009999 3.045582 +v -4.245357 0.009999 3.045582 +v -4.245357 0.009999 2.953291 +v -4.337647 0.009999 2.953291 +v -4.337647 0.009999 3.230163 +v -4.245357 0.009999 3.230163 +v -4.245357 0.009999 3.137872 +v -4.337647 0.009999 3.137872 +v -4.153066 0.009999 3.230163 +v -4.060776 0.009999 3.230163 +v -4.060776 0.009999 3.137872 +v -4.153066 0.009999 3.137872 +v -3.968485 0.009998 4.153066 +v -3.876195 0.009998 4.153066 +v -3.876195 0.009998 4.060776 +v -3.968485 0.009998 4.060776 +v -3.968485 0.009998 4.337647 +v -3.876195 0.009998 4.337647 +v -3.876195 0.009998 4.245357 +v -3.968485 0.009998 4.245357 +v -3.783905 0.009998 4.337647 +v -3.691614 0.009998 4.337647 +v -3.691614 0.009998 4.245357 +v -3.783905 0.009998 4.245357 +v -4.337647 0.009998 4.153066 +v -4.245357 0.009998 4.153066 +v -4.245357 0.009998 4.060776 +v -4.337647 0.009998 4.060776 +v -4.337647 0.009998 4.337647 +v -4.245357 0.009998 4.337647 +v -4.245357 0.009998 4.245357 +v -4.337647 0.009998 4.245357 +v -4.153066 0.009998 4.337647 +v -4.060776 0.009998 4.337647 +v -4.060776 0.009998 4.245357 +v -4.153066 0.009998 4.245357 +v -4.337647 0.009998 3.783905 +v -4.245357 0.009998 3.783905 +v -4.245357 0.009998 3.691614 +v -4.337647 0.009998 3.691614 +v -4.337647 0.009998 3.968485 +v -4.245357 0.009998 3.968485 +v -4.245357 0.009998 3.876195 +v -4.337647 0.009998 3.876195 +v -4.153066 0.009998 3.968485 +v -4.060776 0.009998 3.968485 +v -4.060776 0.009998 3.876195 +v -4.153066 0.009998 3.876195 +v -3.230163 0.009998 4.153066 +v -3.137872 0.009998 4.153066 +v -3.137872 0.009998 4.060776 +v -3.230163 0.009998 4.060776 +v -3.230163 0.009998 4.337647 +v -3.137872 0.009998 4.337647 +v -3.137872 0.009998 4.245357 +v -3.230163 0.009998 4.245357 +v -3.045582 0.009998 4.337647 +v -2.953291 0.009998 4.337647 +v -2.953291 0.009998 4.245357 +v -3.045582 0.009998 4.245357 +v -3.599324 0.009998 4.153066 +v -3.507033 0.009998 4.153066 +v -3.507033 0.009998 4.060776 +v -3.599324 0.009998 4.060776 +v -3.599324 0.009998 4.337647 +v -3.507033 0.009998 4.337647 +v -3.507033 0.009998 4.245357 +v -3.599324 0.009998 4.245357 +v -3.414743 0.009998 4.337647 +v -3.322453 0.009998 4.337647 +v -3.322453 0.009998 4.245357 +v -3.414743 0.009998 4.245357 +v -3.599324 0.009998 3.783905 +v -3.507033 0.009998 3.783905 +v -3.507033 0.009998 3.691614 +v -3.599324 0.009998 3.691614 +v -3.599324 0.009998 3.968485 +v -3.507033 0.009998 3.968485 +v -3.507033 0.009998 3.876195 +v -3.599324 0.009998 3.876195 +v -3.414743 0.009998 3.968485 +v -3.322453 0.009998 3.968485 +v -3.322453 0.009998 3.876195 +v -3.414743 0.009998 3.876195 +v -3.968485 0.010000 0.461452 +v -3.876195 0.010000 0.461452 +v -3.876195 0.010000 0.369161 +v -3.968485 0.010000 0.369161 +v -3.968485 0.010000 0.646033 +v -3.876195 0.010000 0.646033 +v -3.876195 0.010000 0.553742 +v -3.968485 0.010000 0.553742 +v -3.783905 0.010000 0.646033 +v -3.691614 0.010000 0.646033 +v -3.691614 0.010000 0.553742 +v -3.783905 0.010000 0.553742 +v -4.337647 0.010000 0.461452 +v -4.245357 0.010000 0.461452 +v -4.245357 0.010000 0.369161 +v -4.337647 0.010000 0.369161 +v -4.337647 0.010000 0.646033 +v -4.245357 0.010000 0.646033 +v -4.245357 0.010000 0.553742 +v -4.337647 0.010000 0.553742 +v -4.153066 0.010000 0.646033 +v -4.060776 0.010000 0.646033 +v -4.060776 0.010000 0.553742 +v -4.153066 0.010000 0.553742 +v -4.337647 0.010000 0.092290 +v -4.245357 0.010000 0.092290 +v -4.245357 0.010000 -0.000000 +v -4.337647 0.010000 -0.000000 +v -4.337647 0.010000 0.276871 +v -4.245357 0.010000 0.276871 +v -4.245357 0.010000 0.184581 +v -4.337647 0.010000 0.184581 +v -4.153066 0.010000 0.276871 +v -4.060776 0.010000 0.276871 +v -4.060776 0.010000 0.184581 +v -4.153066 0.010000 0.184581 +v -3.968485 0.010000 1.199775 +v -3.876195 0.010000 1.199775 +v -3.876195 0.010000 1.107484 +v -3.968485 0.010000 1.107484 +v -3.968485 0.009999 1.384355 +v -3.876195 0.009999 1.384355 +v -3.876195 0.009999 1.292065 +v -3.968485 0.009999 1.292065 +v -3.783905 0.009999 1.384355 +v -3.691614 0.009999 1.384355 +v -3.691614 0.009999 1.292065 +v -3.783905 0.009999 1.292065 +v -4.337647 0.010000 1.199775 +v -4.245357 0.010000 1.199775 +v -4.245357 0.010000 1.107484 +v -4.337647 0.010000 1.107484 +v -4.337647 0.009999 1.384355 +v -4.245357 0.009999 1.384355 +v -4.245357 0.009999 1.292065 +v -4.337647 0.009999 1.292065 +v -4.153066 0.009999 1.384355 +v -4.060776 0.009999 1.384355 +v -4.060776 0.009999 1.292065 +v -4.153066 0.009999 1.292065 +v -4.337647 0.010000 0.830613 +v -4.245357 0.010000 0.830613 +v -4.245357 0.010000 0.738323 +v -4.337647 0.010000 0.738323 +v -4.337647 0.010000 1.015194 +v -4.245357 0.010000 1.015194 +v -4.245357 0.010000 0.922904 +v -4.337647 0.010000 0.922904 +v -4.153066 0.010000 1.015194 +v -4.060776 0.010000 1.015194 +v -4.060776 0.010000 0.922904 +v -4.153066 0.010000 0.922904 +v -3.230163 0.010000 1.199775 +v -3.137872 0.010000 1.199775 +v -3.137872 0.010000 1.107484 +v -3.230163 0.010000 1.107484 +v -3.230163 0.009999 1.384355 +v -3.137872 0.009999 1.384355 +v -3.137872 0.009999 1.292065 +v -3.230163 0.009999 1.292065 +v -3.045582 0.009999 1.384355 +v -2.953291 0.009999 1.384355 +v -2.953291 0.009999 1.292065 +v -3.045582 0.009999 1.292065 +v -3.599324 0.010000 1.199775 +v -3.507033 0.010000 1.199775 +v -3.507033 0.010000 1.107484 +v -3.599324 0.010000 1.107484 +v -3.599324 0.009999 1.384355 +v -3.507033 0.009999 1.384355 +v -3.507033 0.009999 1.292065 +v -3.599324 0.009999 1.292065 +v -3.414743 0.009999 1.384355 +v -3.322453 0.009999 1.384355 +v -3.322453 0.009999 1.292065 +v -3.414743 0.009999 1.292065 +v -3.599324 0.010000 0.830613 +v -3.507033 0.010000 0.830613 +v -3.507033 0.010000 0.738323 +v -3.599324 0.010000 0.738323 +v -3.599324 0.010000 1.015194 +v -3.507033 0.010000 1.015194 +v -3.507033 0.010000 0.922904 +v -3.599324 0.010000 0.922904 +v -3.414743 0.010000 1.015194 +v -3.322453 0.010000 1.015194 +v -3.322453 0.010000 0.922904 +v -3.414743 0.010000 0.922904 +v 4.891389 0.009999 3.414743 +v 4.983679 0.009999 3.414743 +v 4.983679 0.009999 3.322453 +v 4.891389 0.009999 3.322453 +v 4.891389 0.009999 3.599324 +v 4.983679 0.009999 3.599324 +v 4.983679 0.009999 3.507033 +v 4.891389 0.009999 3.507033 +v 5.075970 0.009999 3.599324 +v 5.168260 0.009999 3.599324 +v 5.168260 0.009999 3.507033 +v 5.075970 0.009999 3.507033 +v 4.522227 0.009999 3.414743 +v 4.614518 0.009999 3.414743 +v 4.614518 0.009999 3.322453 +v 4.522227 0.009999 3.322453 +v 4.522227 0.009999 3.599324 +v 4.614518 0.009999 3.599324 +v 4.614518 0.009999 3.507033 +v 4.522227 0.009999 3.507033 +v 4.706808 0.009999 3.599324 +v 4.799098 0.009999 3.599324 +v 4.799098 0.009999 3.507033 +v 4.706808 0.009999 3.507033 +v 4.522227 0.009999 3.045582 +v 4.614518 0.009999 3.045582 +v 4.614518 0.009999 2.953291 +v 4.522227 0.009999 2.953291 +v 4.522227 0.009999 3.230163 +v 4.614518 0.009999 3.230163 +v 4.614518 0.009999 3.137872 +v 4.522227 0.009999 3.137872 +v 4.706808 0.009999 3.230163 +v 4.799098 0.009999 3.230163 +v 4.799098 0.009999 3.137872 +v 4.706808 0.009999 3.137872 +v 4.891389 0.009998 4.153066 +v 4.983679 0.009998 4.153066 +v 4.983679 0.009998 4.060776 +v 4.891389 0.009998 4.060776 +v 4.891389 0.009998 4.337647 +v 4.983679 0.009998 4.337647 +v 4.983679 0.009998 4.245357 +v 4.891389 0.009998 4.245357 +v 5.075970 0.009998 4.337647 +v 5.168260 0.009998 4.337647 +v 5.168260 0.009998 4.245357 +v 5.075970 0.009998 4.245357 +v 4.522227 0.009998 4.153066 +v 4.614518 0.009998 4.153066 +v 4.614518 0.009998 4.060776 +v 4.522227 0.009998 4.060776 +v 4.522227 0.009998 4.337647 +v 4.614518 0.009998 4.337647 +v 4.614518 0.009998 4.245357 +v 4.522227 0.009998 4.245357 +v 4.706808 0.009998 4.337647 +v 4.799098 0.009998 4.337647 +v 4.799098 0.009998 4.245357 +v 4.706808 0.009998 4.245357 +v 4.522227 0.009998 3.783905 +v 4.614518 0.009998 3.783905 +v 4.614518 0.009998 3.691614 +v 4.522227 0.009998 3.691614 +v 4.522227 0.009998 3.968485 +v 4.614518 0.009998 3.968485 +v 4.614518 0.009998 3.876195 +v 4.522227 0.009998 3.876195 +v 4.706808 0.009998 3.968485 +v 4.799098 0.009998 3.968485 +v 4.799098 0.009998 3.876195 +v 4.706808 0.009998 3.876195 +v 5.629711 0.009998 4.153066 +v 5.722002 0.009998 4.153066 +v 5.722002 0.009998 4.060776 +v 5.629711 0.009998 4.060776 +v 5.629711 0.009998 4.337647 +v 5.722002 0.009998 4.337647 +v 5.722002 0.009998 4.245357 +v 5.629711 0.009998 4.245357 +v 5.814293 0.009998 4.337647 +v 5.906583 0.009998 4.337647 +v 5.906583 0.009998 4.245357 +v 5.814293 0.009998 4.245357 +v 5.260550 0.009998 4.153066 +v 5.352840 0.009998 4.153066 +v 5.352840 0.009998 4.060776 +v 5.260550 0.009998 4.060776 +v 5.260550 0.009998 4.337647 +v 5.352840 0.009998 4.337647 +v 5.352840 0.009998 4.245357 +v 5.260550 0.009998 4.245357 +v 5.445131 0.009998 4.337647 +v 5.537421 0.009998 4.337647 +v 5.537421 0.009998 4.245357 +v 5.445131 0.009998 4.245357 +v 5.260550 0.009998 3.783905 +v 5.352840 0.009998 3.783905 +v 5.352840 0.009998 3.691614 +v 5.260550 0.009998 3.691614 +v 5.260550 0.009998 3.968485 +v 5.352840 0.009998 3.968485 +v 5.352840 0.009998 3.876195 +v 5.260550 0.009998 3.876195 +v 5.445131 0.009998 3.968485 +v 5.537421 0.009998 3.968485 +v 5.537421 0.009998 3.876195 +v 5.445131 0.009998 3.876195 +v 1.938097 0.009999 3.414743 +v 2.030388 0.009999 3.414743 +v 2.030388 0.009999 3.322453 +v 1.938097 0.009999 3.322453 +v 1.938097 0.009999 3.599324 +v 2.030388 0.009999 3.599324 +v 2.030388 0.009999 3.507033 +v 1.938097 0.009999 3.507033 +v 2.122678 0.009999 3.599324 +v 2.214968 0.009999 3.599324 +v 2.214968 0.009999 3.507033 +v 2.122678 0.009999 3.507033 +v 1.568936 0.009999 3.414743 +v 1.661226 0.009999 3.414743 +v 1.661226 0.009999 3.322453 +v 1.568936 0.009999 3.322453 +v 1.568936 0.009999 3.599324 +v 1.661226 0.009999 3.599324 +v 1.661226 0.009999 3.507033 +v 1.568936 0.009999 3.507033 +v 1.753517 0.009999 3.599324 +v 1.845807 0.009999 3.599324 +v 1.845807 0.009999 3.507033 +v 1.753517 0.009999 3.507033 +v 1.568936 0.009999 3.045582 +v 1.661226 0.009999 3.045582 +v 1.661226 0.009999 2.953291 +v 1.568936 0.009999 2.953291 +v 1.568936 0.009999 3.230163 +v 1.661226 0.009999 3.230163 +v 1.661226 0.009999 3.137872 +v 1.568936 0.009999 3.137872 +v 1.753517 0.009999 3.230163 +v 1.845807 0.009999 3.230163 +v 1.845807 0.009999 3.137872 +v 1.753517 0.009999 3.137872 +v 1.938097 0.009998 4.153066 +v 2.030388 0.009998 4.153066 +v 2.030388 0.009998 4.060776 +v 1.938097 0.009998 4.060776 +v 1.938097 0.009998 4.337647 +v 2.030388 0.009998 4.337647 +v 2.030388 0.009998 4.245357 +v 1.938097 0.009998 4.245357 +v 2.122678 0.009998 4.337647 +v 2.214968 0.009998 4.337647 +v 2.214968 0.009998 4.245357 +v 2.122678 0.009998 4.245357 +v 1.568936 0.009998 4.153066 +v 1.661226 0.009998 4.153066 +v 1.661226 0.009998 4.060776 +v 1.568936 0.009998 4.060776 +v 1.568936 0.009998 4.337647 +v 1.661226 0.009998 4.337647 +v 1.661226 0.009998 4.245357 +v 1.568936 0.009998 4.245357 +v 1.753517 0.009998 4.337647 +v 1.845807 0.009998 4.337647 +v 1.845807 0.009998 4.245357 +v 1.753517 0.009998 4.245357 +v 1.568936 0.009998 3.783905 +v 1.661226 0.009998 3.783905 +v 1.661226 0.009998 3.691614 +v 1.568936 0.009998 3.691614 +v 1.568936 0.009998 3.968485 +v 1.661226 0.009998 3.968485 +v 1.661226 0.009998 3.876195 +v 1.568936 0.009998 3.876195 +v 1.753517 0.009998 3.968485 +v 1.845807 0.009998 3.968485 +v 1.845807 0.009998 3.876195 +v 1.753517 0.009998 3.876195 +v 2.676420 0.009998 4.153066 +v 2.768711 0.009998 4.153066 +v 2.768711 0.009998 4.060776 +v 2.676420 0.009998 4.060776 +v 2.676420 0.009998 4.337647 +v 2.768711 0.009998 4.337647 +v 2.768711 0.009998 4.245357 +v 2.676420 0.009998 4.245357 +v 2.861001 0.009998 4.337647 +v 2.953291 0.009998 4.337647 +v 2.953291 0.009998 4.245357 +v 2.861001 0.009998 4.245357 +v 2.307259 0.009998 4.153066 +v 2.399549 0.009998 4.153066 +v 2.399549 0.009998 4.060776 +v 2.307259 0.009998 4.060776 +v 2.307259 0.009998 4.337647 +v 2.399549 0.009998 4.337647 +v 2.399549 0.009998 4.245357 +v 2.307259 0.009998 4.245357 +v 2.491840 0.009998 4.337647 +v 2.584130 0.009998 4.337647 +v 2.584130 0.009998 4.245357 +v 2.491840 0.009998 4.245357 +v 2.307259 0.009998 3.783905 +v 2.399549 0.009998 3.783905 +v 2.399549 0.009998 3.691614 +v 2.307259 0.009998 3.691614 +v 2.307259 0.009998 3.968485 +v 2.399549 0.009998 3.968485 +v 2.399549 0.009998 3.876195 +v 2.307259 0.009998 3.876195 +v 2.491840 0.009998 3.968485 +v 2.584130 0.009998 3.968485 +v 2.584130 0.009998 3.876195 +v 2.491840 0.009998 3.876195 +v 1.938097 0.010000 0.461452 +v 2.030388 0.010000 0.461452 +v 2.030388 0.010000 0.369161 +v 1.938097 0.010000 0.369161 +v 1.938097 0.010000 0.646033 +v 2.030388 0.010000 0.646033 +v 2.030388 0.010000 0.553742 +v 1.938097 0.010000 0.553742 +v 2.122678 0.010000 0.646033 +v 2.214968 0.010000 0.646033 +v 2.214968 0.010000 0.553742 +v 2.122678 0.010000 0.553742 +v 1.568936 0.010000 0.461452 +v 1.661226 0.010000 0.461452 +v 1.661226 0.010000 0.369161 +v 1.568936 0.010000 0.369161 +v 1.568936 0.010000 0.646033 +v 1.661226 0.010000 0.646033 +v 1.661226 0.010000 0.553742 +v 1.568936 0.010000 0.553742 +v 1.753517 0.010000 0.646033 +v 1.845807 0.010000 0.646033 +v 1.845807 0.010000 0.553742 +v 1.753517 0.010000 0.553742 +v 1.568936 0.010000 0.092290 +v 1.661226 0.010000 0.092290 +v 1.661226 0.010000 -0.000000 +v 1.568936 0.010000 -0.000000 +v 1.568936 0.010000 0.276871 +v 1.661226 0.010000 0.276871 +v 1.661226 0.010000 0.184581 +v 1.568936 0.010000 0.184581 +v 1.753517 0.010000 0.276871 +v 1.845807 0.010000 0.276871 +v 1.845807 0.010000 0.184581 +v 1.753517 0.010000 0.184581 +v 1.938097 0.010000 1.199775 +v 2.030388 0.010000 1.199775 +v 2.030388 0.010000 1.107484 +v 1.938097 0.010000 1.107484 +v 1.938097 0.009999 1.384355 +v 2.030388 0.009999 1.384355 +v 2.030388 0.009999 1.292065 +v 1.938097 0.009999 1.292065 +v 2.122678 0.009999 1.384355 +v 2.214968 0.009999 1.384355 +v 2.214968 0.009999 1.292065 +v 2.122678 0.009999 1.292065 +v 1.568936 0.010000 1.199775 +v 1.661226 0.010000 1.199775 +v 1.661226 0.010000 1.107484 +v 1.568936 0.010000 1.107484 +v 1.568936 0.009999 1.384355 +v 1.661226 0.009999 1.384355 +v 1.661226 0.009999 1.292065 +v 1.568936 0.009999 1.292065 +v 1.753517 0.009999 1.384355 +v 1.845807 0.009999 1.384355 +v 1.845807 0.009999 1.292065 +v 1.753517 0.009999 1.292065 +v 1.568936 0.010000 0.830613 +v 1.661226 0.010000 0.830613 +v 1.661226 0.010000 0.738323 +v 1.568936 0.010000 0.738323 +v 1.568936 0.010000 1.015194 +v 1.661226 0.010000 1.015194 +v 1.661226 0.010000 0.922904 +v 1.568936 0.010000 0.922904 +v 1.753517 0.010000 1.015194 +v 1.845807 0.010000 1.015194 +v 1.845807 0.010000 0.922904 +v 1.753517 0.010000 0.922904 +v 2.676420 0.010000 1.199775 +v 2.768711 0.010000 1.199775 +v 2.768711 0.010000 1.107484 +v 2.676420 0.010000 1.107484 +v 2.676420 0.009999 1.384355 +v 2.768711 0.009999 1.384355 +v 2.768711 0.009999 1.292065 +v 2.676420 0.009999 1.292065 +v 2.861001 0.009999 1.384355 +v 2.953291 0.009999 1.384355 +v 2.953291 0.009999 1.292065 +v 2.861001 0.009999 1.292065 +v 2.307259 0.010000 1.199775 +v 2.399549 0.010000 1.199775 +v 2.399549 0.010000 1.107484 +v 2.307259 0.010000 1.107484 +v 2.307259 0.009999 1.384355 +v 2.399549 0.009999 1.384355 +v 2.399549 0.009999 1.292065 +v 2.307259 0.009999 1.292065 +v 2.491840 0.009999 1.384355 +v 2.584130 0.009999 1.384355 +v 2.584130 0.009999 1.292065 +v 2.491840 0.009999 1.292065 +v 2.307259 0.010000 0.830613 +v 2.399549 0.010000 0.830613 +v 2.399549 0.010000 0.738323 +v 2.307259 0.010000 0.738323 +v 2.307259 0.010000 1.015194 +v 2.399549 0.010000 1.015194 +v 2.399549 0.010000 0.922904 +v 2.307259 0.010000 0.922904 +v 2.491840 0.010000 1.015194 +v 2.584130 0.010000 1.015194 +v 2.584130 0.010000 0.922904 +v 2.491840 0.010000 0.922904 +v 4.891389 0.010000 0.461452 +v 4.983679 0.010000 0.461452 +v 4.983679 0.010000 0.369161 +v 4.891389 0.010000 0.369161 +v 4.891389 0.010000 0.646033 +v 4.983679 0.010000 0.646033 +v 4.983679 0.010000 0.553742 +v 4.891389 0.010000 0.553742 +v 5.075970 0.010000 0.646033 +v 5.168260 0.010000 0.646033 +v 5.168260 0.010000 0.553742 +v 5.075970 0.010000 0.553742 +v 4.522227 0.010000 0.461452 +v 4.614518 0.010000 0.461452 +v 4.614518 0.010000 0.369161 +v 4.522227 0.010000 0.369161 +v 4.522227 0.010000 0.646033 +v 4.614518 0.010000 0.646033 +v 4.614518 0.010000 0.553742 +v 4.522227 0.010000 0.553742 +v 4.706808 0.010000 0.646033 +v 4.799098 0.010000 0.646033 +v 4.799098 0.010000 0.553742 +v 4.706808 0.010000 0.553742 +v 4.522227 0.010000 0.092290 +v 4.614518 0.010000 0.092290 +v 4.614518 0.010000 -0.000000 +v 4.522227 0.010000 -0.000000 +v 4.522227 0.010000 0.276871 +v 4.614518 0.010000 0.276871 +v 4.614518 0.010000 0.184581 +v 4.522227 0.010000 0.184581 +v 4.706808 0.010000 0.276871 +v 4.799098 0.010000 0.276871 +v 4.799098 0.010000 0.184581 +v 4.706808 0.010000 0.184581 +v 4.891389 0.010000 1.199775 +v 4.983679 0.010000 1.199775 +v 4.983679 0.010000 1.107484 +v 4.891389 0.010000 1.107484 +v 4.891389 0.009999 1.384355 +v 4.983679 0.009999 1.384355 +v 4.983679 0.009999 1.292065 +v 4.891389 0.009999 1.292065 +v 5.075970 0.009999 1.384355 +v 5.168260 0.009999 1.384355 +v 5.168260 0.009999 1.292065 +v 5.075970 0.009999 1.292065 +v 4.522227 0.010000 1.199775 +v 4.614518 0.010000 1.199775 +v 4.614518 0.010000 1.107484 +v 4.522227 0.010000 1.107484 +v 4.522227 0.009999 1.384355 +v 4.614518 0.009999 1.384355 +v 4.614518 0.009999 1.292065 +v 4.522227 0.009999 1.292065 +v 4.706808 0.009999 1.384355 +v 4.799098 0.009999 1.384355 +v 4.799098 0.009999 1.292065 +v 4.706808 0.009999 1.292065 +v 4.522227 0.010000 0.830613 +v 4.614518 0.010000 0.830613 +v 4.614518 0.010000 0.738323 +v 4.522227 0.010000 0.738323 +v 4.522227 0.010000 1.015194 +v 4.614518 0.010000 1.015194 +v 4.614518 0.010000 0.922904 +v 4.522227 0.010000 0.922904 +v 4.706808 0.010000 1.015194 +v 4.799098 0.010000 1.015194 +v 4.799098 0.010000 0.922904 +v 4.706808 0.010000 0.922904 +v 5.629711 0.010000 1.199775 +v 5.722002 0.010000 1.199775 +v 5.722002 0.010000 1.107484 +v 5.629711 0.010000 1.107484 +v 5.629711 0.009999 1.384355 +v 5.722002 0.009999 1.384355 +v 5.722002 0.009999 1.292065 +v 5.629711 0.009999 1.292065 +v 5.814293 0.009999 1.384355 +v 5.906583 0.009999 1.384355 +v 5.906583 0.009999 1.292065 +v 5.814293 0.009999 1.292065 +v 5.260550 0.010000 1.199775 +v 5.352840 0.010000 1.199775 +v 5.352840 0.010000 1.107484 +v 5.260550 0.010000 1.107484 +v 5.260550 0.009999 1.384355 +v 5.352840 0.009999 1.384355 +v 5.352840 0.009999 1.292065 +v 5.260550 0.009999 1.292065 +v 5.445131 0.009999 1.384355 +v 5.537421 0.009999 1.384355 +v 5.537421 0.009999 1.292065 +v 5.445131 0.009999 1.292065 +v 5.260550 0.010000 0.830613 +v 5.352840 0.010000 0.830613 +v 5.352840 0.010000 0.738323 +v 5.260550 0.010000 0.738323 +v 5.260550 0.010000 1.015194 +v 5.352840 0.010000 1.015194 +v 5.352840 0.010000 0.922904 +v 5.260550 0.010000 0.922904 +v 5.445131 0.010000 1.015194 +v 5.537421 0.010000 1.015194 +v 5.537421 0.010000 0.922904 +v 5.445131 0.010000 0.922904 +v -1.015194 0.010000 0.461452 +v -0.922904 0.010000 0.461452 +v -0.922904 0.010000 0.369161 +v -1.015194 0.010000 0.369161 +v -1.015194 0.010000 0.646033 +v -0.922904 0.010000 0.646033 +v -0.922904 0.010000 0.553742 +v -1.015194 0.010000 0.553742 +v -0.830613 0.010000 0.646033 +v -0.738323 0.010000 0.646033 +v -0.738323 0.010000 0.553742 +v -0.830613 0.010000 0.553742 +v -1.384355 0.010000 0.461452 +v -1.292065 0.010000 0.461452 +v -1.292065 0.010000 0.369161 +v -1.384355 0.010000 0.369161 +v -1.384355 0.010000 0.646033 +v -1.292065 0.010000 0.646033 +v -1.292065 0.010000 0.553742 +v -1.384355 0.010000 0.553742 +v -1.199775 0.010000 0.646033 +v -1.107484 0.010000 0.646033 +v -1.107484 0.010000 0.553742 +v -1.199775 0.010000 0.553742 +v -1.384355 0.010000 0.092290 +v -1.292065 0.010000 0.092290 +v -1.292065 0.010000 -0.000000 +v -1.384355 0.010000 -0.000000 +v -1.384355 0.010000 0.276871 +v -1.292065 0.010000 0.276871 +v -1.292065 0.010000 0.184581 +v -1.384355 0.010000 0.184581 +v -1.199775 0.010000 0.276871 +v -1.107484 0.010000 0.276871 +v -1.107484 0.010000 0.184581 +v -1.199775 0.010000 0.184581 +v -1.015194 0.010000 1.199775 +v -0.922904 0.010000 1.199775 +v -0.922904 0.010000 1.107484 +v -1.015194 0.010000 1.107484 +v -1.015194 0.009999 1.384355 +v -0.922904 0.009999 1.384355 +v -0.922904 0.009999 1.292065 +v -1.015194 0.009999 1.292065 +v -0.830613 0.009999 1.384355 +v -0.738323 0.009999 1.384355 +v -0.738323 0.009999 1.292065 +v -0.830613 0.009999 1.292065 +v -1.384355 0.010000 1.199775 +v -1.292065 0.010000 1.199775 +v -1.292065 0.010000 1.107484 +v -1.384355 0.010000 1.107484 +v -1.384355 0.009999 1.384355 +v -1.292065 0.009999 1.384355 +v -1.292065 0.009999 1.292065 +v -1.384355 0.009999 1.292065 +v -1.199775 0.009999 1.384355 +v -1.107484 0.009999 1.384355 +v -1.107484 0.009999 1.292065 +v -1.199775 0.009999 1.292065 +v -1.384355 0.010000 0.830613 +v -1.292065 0.010000 0.830613 +v -1.292065 0.010000 0.738323 +v -1.384355 0.010000 0.738323 +v -1.384355 0.010000 1.015194 +v -1.292065 0.010000 1.015194 +v -1.292065 0.010000 0.922904 +v -1.384355 0.010000 0.922904 +v -1.199775 0.010000 1.015194 +v -1.107484 0.010000 1.015194 +v -1.107484 0.010000 0.922904 +v -1.199775 0.010000 0.922904 +v -0.276871 0.010000 1.199775 +v -0.184581 0.010000 1.199775 +v -0.184581 0.010000 1.107484 +v -0.276871 0.010000 1.107484 +v -0.276871 0.009999 1.384355 +v -0.184581 0.009999 1.384355 +v -0.184581 0.009999 1.292065 +v -0.276871 0.009999 1.292065 +v -0.092290 0.009999 1.384355 +v 0.000000 0.009999 1.384355 +v 0.000000 0.009999 1.292065 +v -0.092290 0.009999 1.292065 +v -0.646033 0.010000 1.199775 +v -0.553742 0.010000 1.199775 +v -0.553742 0.010000 1.107484 +v -0.646033 0.010000 1.107484 +v -0.646033 0.009999 1.384355 +v -0.553742 0.009999 1.384355 +v -0.553742 0.009999 1.292065 +v -0.646033 0.009999 1.292065 +v -0.461452 0.009999 1.384355 +v -0.369161 0.009999 1.384355 +v -0.369161 0.009999 1.292065 +v -0.461452 0.009999 1.292065 +v -0.646033 0.010000 0.830613 +v -0.553742 0.010000 0.830613 +v -0.553742 0.010000 0.738323 +v -0.646033 0.010000 0.738323 +v -0.646033 0.010000 1.015194 +v -0.553742 0.010000 1.015194 +v -0.553742 0.010000 0.922904 +v -0.646033 0.010000 0.922904 +v -0.461452 0.010000 1.015194 +v -0.369161 0.010000 1.015194 +v -0.369161 0.010000 0.922904 +v -0.461452 0.010000 0.922904 +v -1.015194 0.010002 -5.445131 +v -0.922904 0.010002 -5.445131 +v -0.922904 0.010002 -5.537421 +v -1.015194 0.010002 -5.537421 +v -1.015194 0.010002 -5.260550 +v -0.922904 0.010002 -5.260550 +v -0.922904 0.010002 -5.352840 +v -1.015194 0.010002 -5.352840 +v -0.830613 0.010002 -5.260550 +v -0.738323 0.010002 -5.260550 +v -0.738323 0.010002 -5.352840 +v -0.830613 0.010002 -5.352840 +v -1.384355 0.010002 -5.445131 +v -1.292065 0.010002 -5.445131 +v -1.292065 0.010002 -5.537421 +v -1.384355 0.010002 -5.537421 +v -1.384355 0.010002 -5.260550 +v -1.292065 0.010002 -5.260550 +v -1.292065 0.010002 -5.352840 +v -1.384355 0.010002 -5.352840 +v -1.199775 0.010002 -5.260550 +v -1.107484 0.010002 -5.260550 +v -1.107484 0.010002 -5.352840 +v -1.199775 0.010002 -5.352840 +v -1.384355 0.010002 -5.814293 +v -1.292065 0.010002 -5.814293 +v -1.292065 0.010002 -5.906583 +v -1.384355 0.010002 -5.906583 +v -1.384355 0.010002 -5.629711 +v -1.292065 0.010002 -5.629711 +v -1.292065 0.010002 -5.722002 +v -1.384355 0.010002 -5.722002 +v -1.199775 0.010002 -5.629711 +v -1.107484 0.010002 -5.629711 +v -1.107484 0.010002 -5.722002 +v -1.199775 0.010002 -5.722002 +v -1.015194 0.010002 -4.706808 +v -0.922904 0.010002 -4.706808 +v -0.922904 0.010002 -4.799098 +v -1.015194 0.010002 -4.799098 +v -1.015194 0.010002 -4.522227 +v -0.922904 0.010002 -4.522227 +v -0.922904 0.010002 -4.614518 +v -1.015194 0.010002 -4.614518 +v -0.830613 0.010002 -4.522227 +v -0.738323 0.010002 -4.522227 +v -0.738323 0.010002 -4.614518 +v -0.830613 0.010002 -4.614518 +v -1.384355 0.010002 -4.706808 +v -1.292065 0.010002 -4.706808 +v -1.292065 0.010002 -4.799098 +v -1.384355 0.010002 -4.799098 +v -1.384355 0.010002 -4.522227 +v -1.292065 0.010002 -4.522227 +v -1.292065 0.010002 -4.614518 +v -1.384355 0.010002 -4.614518 +v -1.199775 0.010002 -4.522227 +v -1.107484 0.010002 -4.522227 +v -1.107484 0.010002 -4.614518 +v -1.199775 0.010002 -4.614518 +v -1.384355 0.010002 -5.075970 +v -1.292065 0.010002 -5.075970 +v -1.292065 0.010002 -5.168260 +v -1.384355 0.010002 -5.168260 +v -1.384355 0.010002 -4.891389 +v -1.292065 0.010002 -4.891389 +v -1.292065 0.010002 -4.983679 +v -1.384355 0.010002 -4.983679 +v -1.199775 0.010002 -4.891389 +v -1.107484 0.010002 -4.891389 +v -1.107484 0.010002 -4.983679 +v -1.199775 0.010002 -4.983679 +v -0.276871 0.010002 -4.706808 +v -0.184581 0.010002 -4.706808 +v -0.184581 0.010002 -4.799098 +v -0.276871 0.010002 -4.799098 +v -0.276871 0.010002 -4.522227 +v -0.184581 0.010002 -4.522227 +v -0.184581 0.010002 -4.614518 +v -0.276871 0.010002 -4.614518 +v -0.092290 0.010002 -4.522227 +v 0.000000 0.010002 -4.522227 +v 0.000000 0.010002 -4.614518 +v -0.092290 0.010002 -4.614518 +v -0.646033 0.010002 -4.706808 +v -0.553742 0.010002 -4.706808 +v -0.553742 0.010002 -4.799098 +v -0.646033 0.010002 -4.799098 +v -0.646033 0.010002 -4.522227 +v -0.553742 0.010002 -4.522227 +v -0.553742 0.010002 -4.614518 +v -0.646033 0.010002 -4.614518 +v -0.461452 0.010002 -4.522227 +v -0.369161 0.010002 -4.522227 +v -0.369161 0.010002 -4.614518 +v -0.461452 0.010002 -4.614518 +v -0.646033 0.010002 -5.075970 +v -0.553742 0.010002 -5.075970 +v -0.553742 0.010002 -5.168260 +v -0.646033 0.010002 -5.168260 +v -0.646033 0.010002 -4.891389 +v -0.553742 0.010002 -4.891389 +v -0.553742 0.010002 -4.983679 +v -0.646033 0.010002 -4.983679 +v -0.461452 0.010002 -4.891389 +v -0.369161 0.010002 -4.891389 +v -0.369161 0.010002 -4.983679 +v -0.461452 0.010002 -4.983679 +v 4.891389 0.010002 -5.445131 +v 4.983679 0.010002 -5.445131 +v 4.983679 0.010002 -5.537421 +v 4.891389 0.010002 -5.537421 +v 4.891389 0.010002 -5.260550 +v 4.983679 0.010002 -5.260550 +v 4.983679 0.010002 -5.352840 +v 4.891389 0.010002 -5.352840 +v 5.075970 0.010002 -5.260550 +v 5.168260 0.010002 -5.260550 +v 5.168260 0.010002 -5.352840 +v 5.075970 0.010002 -5.352840 +v 4.522227 0.010002 -5.445131 +v 4.614518 0.010002 -5.445131 +v 4.614518 0.010002 -5.537421 +v 4.522227 0.010002 -5.537421 +v 4.522227 0.010002 -5.260550 +v 4.614518 0.010002 -5.260550 +v 4.614518 0.010002 -5.352840 +v 4.522227 0.010002 -5.352840 +v 4.706808 0.010002 -5.260550 +v 4.799098 0.010002 -5.260550 +v 4.799098 0.010002 -5.352840 +v 4.706808 0.010002 -5.352840 +v 4.522227 0.010002 -5.814293 +v 4.614518 0.010002 -5.814293 +v 4.614518 0.010002 -5.906583 +v 4.522227 0.010002 -5.906583 +v 4.522227 0.010002 -5.629711 +v 4.614518 0.010002 -5.629711 +v 4.614518 0.010002 -5.722002 +v 4.522227 0.010002 -5.722002 +v 4.706808 0.010002 -5.629711 +v 4.799098 0.010002 -5.629711 +v 4.799098 0.010002 -5.722002 +v 4.706808 0.010002 -5.722002 +v 4.891389 0.010002 -4.706808 +v 4.983679 0.010002 -4.706808 +v 4.983679 0.010002 -4.799098 +v 4.891389 0.010002 -4.799098 +v 4.891389 0.010002 -4.522227 +v 4.983679 0.010002 -4.522227 +v 4.983679 0.010002 -4.614518 +v 4.891389 0.010002 -4.614518 +v 5.075970 0.010002 -4.522227 +v 5.168260 0.010002 -4.522227 +v 5.168260 0.010002 -4.614518 +v 5.075970 0.010002 -4.614518 +v 4.522227 0.010002 -4.706808 +v 4.614518 0.010002 -4.706808 +v 4.614518 0.010002 -4.799098 +v 4.522227 0.010002 -4.799098 +v 4.522227 0.010002 -4.522227 +v 4.614518 0.010002 -4.522227 +v 4.614518 0.010002 -4.614518 +v 4.522227 0.010002 -4.614518 +v 4.706808 0.010002 -4.522227 +v 4.799098 0.010002 -4.522227 +v 4.799098 0.010002 -4.614518 +v 4.706808 0.010002 -4.614518 +v 4.522227 0.010002 -5.075970 +v 4.614518 0.010002 -5.075970 +v 4.614518 0.010002 -5.168260 +v 4.522227 0.010002 -5.168260 +v 4.522227 0.010002 -4.891389 +v 4.614518 0.010002 -4.891389 +v 4.614518 0.010002 -4.983679 +v 4.522227 0.010002 -4.983679 +v 4.706808 0.010002 -4.891389 +v 4.799098 0.010002 -4.891389 +v 4.799098 0.010002 -4.983679 +v 4.706808 0.010002 -4.983679 +v 5.629711 0.010002 -4.706808 +v 5.722002 0.010002 -4.706808 +v 5.722002 0.010002 -4.799098 +v 5.629711 0.010002 -4.799098 +v 5.629711 0.010002 -4.522227 +v 5.722002 0.010002 -4.522227 +v 5.722002 0.010002 -4.614518 +v 5.629711 0.010002 -4.614518 +v 5.814293 0.010002 -4.522227 +v 5.906583 0.010002 -4.522227 +v 5.906583 0.010002 -4.614518 +v 5.814293 0.010002 -4.614518 +v 5.260550 0.010002 -4.706808 +v 5.352840 0.010002 -4.706808 +v 5.352840 0.010002 -4.799098 +v 5.260550 0.010002 -4.799098 +v 5.260550 0.010002 -4.522227 +v 5.352840 0.010002 -4.522227 +v 5.352840 0.010002 -4.614518 +v 5.260550 0.010002 -4.614518 +v 5.445131 0.010002 -4.522227 +v 5.537421 0.010002 -4.522227 +v 5.537421 0.010002 -4.614518 +v 5.445131 0.010002 -4.614518 +v 5.260550 0.010002 -5.075970 +v 5.352840 0.010002 -5.075970 +v 5.352840 0.010002 -5.168260 +v 5.260550 0.010002 -5.168260 +v 5.260550 0.010002 -4.891389 +v 5.352840 0.010002 -4.891389 +v 5.352840 0.010002 -4.983679 +v 5.260550 0.010002 -4.983679 +v 5.445131 0.010002 -4.891389 +v 5.537421 0.010002 -4.891389 +v 5.537421 0.010002 -4.983679 +v 5.445131 0.010002 -4.983679 +v 5.629711 0.010002 -5.075970 +v 5.722002 0.010002 -5.075970 +v 5.722002 0.010002 -5.168260 +v 5.629711 0.010002 -5.168260 +v 5.629711 0.010002 -4.891389 +v 5.722002 0.010002 -4.891389 +v 5.722002 0.010002 -4.983679 +v 5.629711 0.010002 -4.983679 +v 5.814293 0.010002 -4.891389 +v 5.906583 0.010002 -4.891389 +v 5.906583 0.010002 -4.983679 +v 5.814293 0.010002 -4.983679 +v 4.891389 0.010002 -5.075970 +v 4.983679 0.010002 -5.075970 +v 4.983679 0.010002 -5.168260 +v 4.891389 0.010002 -5.168260 +v 4.891389 0.010002 -4.891389 +v 4.983679 0.010002 -4.891389 +v 4.983679 0.010002 -4.983679 +v 4.891389 0.010002 -4.983679 +v 5.075970 0.010002 -4.891389 +v 5.168260 0.010002 -4.891389 +v 5.168260 0.010002 -4.983679 +v 5.075970 0.010002 -4.983679 +v 4.891389 0.010002 -5.814293 +v 4.983679 0.010002 -5.814293 +v 4.983679 0.010002 -5.906583 +v 4.891389 0.010002 -5.906583 +v 4.891389 0.010002 -5.629711 +v 4.983679 0.010002 -5.629711 +v 4.983679 0.010002 -5.722002 +v 4.891389 0.010002 -5.722002 +v 5.075970 0.010002 -5.629711 +v 5.168260 0.010002 -5.629711 +v 5.168260 0.010002 -5.722002 +v 5.075970 0.010002 -5.722002 +v -0.276871 0.010002 -5.075970 +v -0.184581 0.010002 -5.075970 +v -0.184581 0.010002 -5.168260 +v -0.276871 0.010002 -5.168260 +v -0.276871 0.010002 -4.891389 +v -0.184581 0.010002 -4.891389 +v -0.184581 0.010002 -4.983679 +v -0.276871 0.010002 -4.983679 +v -0.092290 0.010002 -4.891389 +v 0.000000 0.010002 -4.891389 +v 0.000000 0.010002 -4.983679 +v -0.092290 0.010002 -4.983679 +v -1.015194 0.010002 -5.075970 +v -0.922904 0.010002 -5.075970 +v -0.922904 0.010002 -5.168260 +v -1.015194 0.010002 -5.168260 +v -1.015194 0.010002 -4.891389 +v -0.922904 0.010002 -4.891389 +v -0.922904 0.010002 -4.983679 +v -1.015194 0.010002 -4.983679 +v -0.830613 0.010002 -4.891389 +v -0.738323 0.010002 -4.891389 +v -0.738323 0.010002 -4.983679 +v -0.830613 0.010002 -4.983679 +v -1.015194 0.010002 -5.814293 +v -0.922904 0.010002 -5.814293 +v -0.922904 0.010002 -5.906583 +v -1.015194 0.010002 -5.906583 +v -1.015194 0.010002 -5.629711 +v -0.922904 0.010002 -5.629711 +v -0.922904 0.010002 -5.722002 +v -1.015194 0.010002 -5.722002 +v -0.830613 0.010002 -5.629711 +v -0.738323 0.010002 -5.629711 +v -0.738323 0.010002 -5.722002 +v -0.830613 0.010002 -5.722002 +v -0.276871 0.010000 0.830613 +v -0.184581 0.010000 0.830613 +v -0.184581 0.010000 0.738323 +v -0.276871 0.010000 0.738323 +v -0.276871 0.010000 1.015194 +v -0.184581 0.010000 1.015194 +v -0.184581 0.010000 0.922904 +v -0.276871 0.010000 0.922904 +v -0.092290 0.010000 1.015194 +v 0.000000 0.010000 1.015194 +v 0.000000 0.010000 0.922904 +v -0.092290 0.010000 0.922904 +v -1.015194 0.010000 0.830613 +v -0.922904 0.010000 0.830613 +v -0.922904 0.010000 0.738323 +v -1.015194 0.010000 0.738323 +v -1.015194 0.010000 1.015194 +v -0.922904 0.010000 1.015194 +v -0.922904 0.010000 0.922904 +v -1.015194 0.010000 0.922904 +v -0.830613 0.010000 1.015194 +v -0.738323 0.010000 1.015194 +v -0.738323 0.010000 0.922904 +v -0.830613 0.010000 0.922904 +v -1.015194 0.010000 0.092290 +v -0.922904 0.010000 0.092290 +v -0.922904 0.010000 -0.000000 +v -1.015194 0.010000 -0.000000 +v -1.015194 0.010000 0.276871 +v -0.922904 0.010000 0.276871 +v -0.922904 0.010000 0.184581 +v -1.015194 0.010000 0.184581 +v -0.830613 0.010000 0.276871 +v -0.738323 0.010000 0.276871 +v -0.738323 0.010000 0.184581 +v -0.830613 0.010000 0.184581 +v 5.629711 0.010000 0.830613 +v 5.722002 0.010000 0.830613 +v 5.722002 0.010000 0.738323 +v 5.629711 0.010000 0.738323 +v 5.629711 0.010000 1.015194 +v 5.722002 0.010000 1.015194 +v 5.722002 0.010000 0.922904 +v 5.629711 0.010000 0.922904 +v 5.814293 0.010000 1.015194 +v 5.906583 0.010000 1.015194 +v 5.906583 0.010000 0.922904 +v 5.814293 0.010000 0.922904 +v 4.891389 0.010000 0.830613 +v 4.983679 0.010000 0.830613 +v 4.983679 0.010000 0.738323 +v 4.891389 0.010000 0.738323 +v 4.891389 0.010000 1.015194 +v 4.983679 0.010000 1.015194 +v 4.983679 0.010000 0.922904 +v 4.891389 0.010000 0.922904 +v 5.075970 0.010000 1.015194 +v 5.168260 0.010000 1.015194 +v 5.168260 0.010000 0.922904 +v 5.075970 0.010000 0.922904 +v 4.891389 0.010000 0.092290 +v 4.983679 0.010000 0.092290 +v 4.983679 0.010000 -0.000000 +v 4.891389 0.010000 -0.000000 +v 4.891389 0.010000 0.276871 +v 4.983679 0.010000 0.276871 +v 4.983679 0.010000 0.184581 +v 4.891389 0.010000 0.184581 +v 5.075970 0.010000 0.276871 +v 5.168260 0.010000 0.276871 +v 5.168260 0.010000 0.184581 +v 5.075970 0.010000 0.184581 +v 2.676420 0.010000 0.830613 +v 2.768711 0.010000 0.830613 +v 2.768711 0.010000 0.738323 +v 2.676420 0.010000 0.738323 +v 2.676420 0.010000 1.015194 +v 2.768711 0.010000 1.015194 +v 2.768711 0.010000 0.922904 +v 2.676420 0.010000 0.922904 +v 2.861001 0.010000 1.015194 +v 2.953291 0.010000 1.015194 +v 2.953291 0.010000 0.922904 +v 2.861001 0.010000 0.922904 +v 1.938097 0.010000 0.830613 +v 2.030388 0.010000 0.830613 +v 2.030388 0.010000 0.738323 +v 1.938097 0.010000 0.738323 +v 1.938097 0.010000 1.015194 +v 2.030388 0.010000 1.015194 +v 2.030388 0.010000 0.922904 +v 1.938097 0.010000 0.922904 +v 2.122678 0.010000 1.015194 +v 2.214968 0.010000 1.015194 +v 2.214968 0.010000 0.922904 +v 2.122678 0.010000 0.922904 +v 1.938097 0.010000 0.092290 +v 2.030388 0.010000 0.092290 +v 2.030388 0.010000 -0.000000 +v 1.938097 0.010000 -0.000000 +v 1.938097 0.010000 0.276871 +v 2.030388 0.010000 0.276871 +v 2.030388 0.010000 0.184581 +v 1.938097 0.010000 0.184581 +v 2.122678 0.010000 0.276871 +v 2.214968 0.010000 0.276871 +v 2.214968 0.010000 0.184581 +v 2.122678 0.010000 0.184581 +v 2.676420 0.009998 3.783905 +v 2.768711 0.009998 3.783905 +v 2.768711 0.009998 3.691614 +v 2.676420 0.009998 3.691614 +v 2.676420 0.009998 3.968485 +v 2.768711 0.009998 3.968485 +v 2.768711 0.009998 3.876195 +v 2.676420 0.009998 3.876195 +v 2.861001 0.009998 3.968485 +v 2.953291 0.009998 3.968485 +v 2.953291 0.009998 3.876195 +v 2.861001 0.009998 3.876195 +v 1.938097 0.009998 3.783905 +v 2.030388 0.009998 3.783905 +v 2.030388 0.009998 3.691614 +v 1.938097 0.009998 3.691614 +v 1.938097 0.009998 3.968485 +v 2.030388 0.009998 3.968485 +v 2.030388 0.009998 3.876195 +v 1.938097 0.009998 3.876195 +v 2.122678 0.009998 3.968485 +v 2.214968 0.009998 3.968485 +v 2.214968 0.009998 3.876195 +v 2.122678 0.009998 3.876195 +v 1.938097 0.009999 3.045582 +v 2.030388 0.009999 3.045582 +v 2.030388 0.009999 2.953291 +v 1.938097 0.009999 2.953291 +v 1.938097 0.009999 3.230163 +v 2.030388 0.009999 3.230163 +v 2.030388 0.009999 3.137872 +v 1.938097 0.009999 3.137872 +v 2.122678 0.009999 3.230163 +v 2.214968 0.009999 3.230163 +v 2.214968 0.009999 3.137872 +v 2.122678 0.009999 3.137872 +v 5.629711 0.009998 3.783905 +v 5.722002 0.009998 3.783905 +v 5.722002 0.009998 3.691614 +v 5.629711 0.009998 3.691614 +v 5.629711 0.009998 3.968485 +v 5.722002 0.009998 3.968485 +v 5.722002 0.009998 3.876195 +v 5.629711 0.009998 3.876195 +v 5.814293 0.009998 3.968485 +v 5.906583 0.009998 3.968485 +v 5.906583 0.009998 3.876195 +v 5.814293 0.009998 3.876195 +v 4.891389 0.009998 3.783905 +v 4.983679 0.009998 3.783905 +v 4.983679 0.009998 3.691614 +v 4.891389 0.009998 3.691614 +v 4.891389 0.009998 3.968485 +v 4.983679 0.009998 3.968485 +v 4.983679 0.009998 3.876195 +v 4.891389 0.009998 3.876195 +v 5.075970 0.009998 3.968485 +v 5.168260 0.009998 3.968485 +v 5.168260 0.009998 3.876195 +v 5.075970 0.009998 3.876195 +v 4.891389 0.009999 3.045582 +v 4.983679 0.009999 3.045582 +v 4.983679 0.009999 2.953291 +v 4.891389 0.009999 2.953291 +v 4.891389 0.009999 3.230163 +v 4.983679 0.009999 3.230163 +v 4.983679 0.009999 3.137872 +v 4.891389 0.009999 3.137872 +v 5.075970 0.009999 3.230163 +v 5.168260 0.009999 3.230163 +v 5.168260 0.009999 3.137872 +v 5.075970 0.009999 3.137872 +v -3.230163 0.010000 0.830613 +v -3.137872 0.010000 0.830613 +v -3.137872 0.010000 0.738323 +v -3.230163 0.010000 0.738323 +v -3.230163 0.010000 1.015194 +v -3.137872 0.010000 1.015194 +v -3.137872 0.010000 0.922904 +v -3.230163 0.010000 0.922904 +v -3.045582 0.010000 1.015194 +v -2.953291 0.010000 1.015194 +v -2.953291 0.010000 0.922904 +v -3.045582 0.010000 0.922904 +v -3.968485 0.010000 0.830613 +v -3.876195 0.010000 0.830613 +v -3.876195 0.010000 0.738323 +v -3.968485 0.010000 0.738323 +v -3.968485 0.010000 1.015194 +v -3.876195 0.010000 1.015194 +v -3.876195 0.010000 0.922904 +v -3.968485 0.010000 0.922904 +v -3.783905 0.010000 1.015194 +v -3.691614 0.010000 1.015194 +v -3.691614 0.010000 0.922904 +v -3.783905 0.010000 0.922904 +v -3.968485 0.010000 0.092290 +v -3.876195 0.010000 0.092290 +v -3.876195 0.010000 -0.000000 +v -3.968485 0.010000 -0.000000 +v -3.968485 0.010000 0.276871 +v -3.876195 0.010000 0.276871 +v -3.876195 0.010000 0.184581 +v -3.968485 0.010000 0.184581 +v -3.783905 0.010000 0.276871 +v -3.691614 0.010000 0.276871 +v -3.691614 0.010000 0.184581 +v -3.783905 0.010000 0.184581 +v -3.230163 0.009998 3.783905 +v -3.137872 0.009998 3.783905 +v -3.137872 0.009998 3.691614 +v -3.230163 0.009998 3.691614 +v -3.230163 0.009998 3.968485 +v -3.137872 0.009998 3.968485 +v -3.137872 0.009998 3.876195 +v -3.230163 0.009998 3.876195 +v -3.045582 0.009998 3.968485 +v -2.953291 0.009998 3.968485 +v -2.953291 0.009998 3.876195 +v -3.045582 0.009998 3.876195 +v -3.968485 0.009998 3.783905 +v -3.876195 0.009998 3.783905 +v -3.876195 0.009998 3.691614 +v -3.968485 0.009998 3.691614 +v -3.968485 0.009998 3.968485 +v -3.876195 0.009998 3.968485 +v -3.876195 0.009998 3.876195 +v -3.968485 0.009998 3.876195 +v -3.783905 0.009998 3.968485 +v -3.691614 0.009998 3.968485 +v -3.691614 0.009998 3.876195 +v -3.783905 0.009998 3.876195 +v -3.968485 0.009999 3.045582 +v -3.876195 0.009999 3.045582 +v -3.876195 0.009999 2.953291 +v -3.968485 0.009999 2.953291 +v -3.968485 0.009999 3.230163 +v -3.876195 0.009999 3.230163 +v -3.876195 0.009999 3.137872 +v -3.968485 0.009999 3.137872 +v -3.783905 0.009999 3.230163 +v -3.691614 0.009999 3.230163 +v -3.691614 0.009999 3.137872 +v -3.783905 0.009999 3.137872 +v -0.276871 0.009998 3.783905 +v -0.184581 0.009998 3.783905 +v -0.184581 0.009998 3.691614 +v -0.276871 0.009998 3.691614 +v -0.276871 0.009998 3.968485 +v -0.184581 0.009998 3.968485 +v -0.184581 0.009998 3.876195 +v -0.276871 0.009998 3.876195 +v -0.092290 0.009998 3.968485 +v 0.000000 0.009998 3.968485 +v 0.000000 0.009998 3.876195 +v -0.092290 0.009998 3.876195 +v -1.015194 0.009998 3.783905 +v -0.922904 0.009998 3.783905 +v -0.922904 0.009998 3.691614 +v -1.015194 0.009998 3.691614 +v -1.015194 0.009998 3.968485 +v -0.922904 0.009998 3.968485 +v -0.922904 0.009998 3.876195 +v -1.015194 0.009998 3.876195 +v -0.830613 0.009998 3.968485 +v -0.738323 0.009998 3.968485 +v -0.738323 0.009998 3.876195 +v -0.830613 0.009998 3.876195 +v -1.015194 0.009999 3.045582 +v -0.922904 0.009999 3.045582 +v -0.922904 0.009999 2.953291 +v -1.015194 0.009999 2.953291 +v -1.015194 0.009999 3.230163 +v -0.922904 0.009999 3.230163 +v -0.922904 0.009999 3.137872 +v -1.015194 0.009999 3.137872 +v -0.830613 0.009999 3.230163 +v -0.738323 0.009999 3.230163 +v -0.738323 0.009999 3.137872 +v -0.830613 0.009999 3.137872 +v -3.230163 0.010002 -5.075970 +v -3.137872 0.010002 -5.075970 +v -3.137872 0.010002 -5.168260 +v -3.230163 0.010002 -5.168260 +v -3.230163 0.010002 -4.891389 +v -3.137872 0.010002 -4.891389 +v -3.137872 0.010002 -4.983679 +v -3.230163 0.010002 -4.983679 +v -3.045582 0.010002 -4.891389 +v -2.953291 0.010002 -4.891389 +v -2.953291 0.010002 -4.983679 +v -3.045582 0.010002 -4.983679 +v -3.968485 0.010002 -5.075970 +v -3.876195 0.010002 -5.075970 +v -3.876195 0.010002 -5.168260 +v -3.968485 0.010002 -5.168260 +v -3.968485 0.010002 -4.891389 +v -3.876195 0.010002 -4.891389 +v -3.876195 0.010002 -4.983679 +v -3.968485 0.010002 -4.983679 +v -3.783905 0.010002 -4.891389 +v -3.691614 0.010002 -4.891389 +v -3.691614 0.010002 -4.983679 +v -3.783905 0.010002 -4.983679 +v -3.968485 0.010002 -5.814293 +v -3.876195 0.010002 -5.814293 +v -3.876195 0.010002 -5.906583 +v -3.968485 0.010002 -5.906583 +v -3.968485 0.010002 -5.629711 +v -3.876195 0.010002 -5.629711 +v -3.876195 0.010002 -5.722002 +v -3.968485 0.010002 -5.722002 +v -3.783905 0.010002 -5.629711 +v -3.691614 0.010002 -5.629711 +v -3.691614 0.010002 -5.722002 +v -3.783905 0.010002 -5.722002 +v -3.230163 0.010001 -2.122678 +v -3.137872 0.010001 -2.122678 +v -3.137872 0.010001 -2.214968 +v -3.230163 0.010001 -2.214968 +v -3.230163 0.010001 -1.938097 +v -3.137872 0.010001 -1.938097 +v -3.137872 0.010001 -2.030388 +v -3.230163 0.010001 -2.030388 +v -3.045582 0.010001 -1.938097 +v -2.953291 0.010001 -1.938097 +v -2.953291 0.010001 -2.030388 +v -3.045582 0.010001 -2.030388 +v -3.968485 0.010001 -2.122678 +v -3.876195 0.010001 -2.122678 +v -3.876195 0.010001 -2.214968 +v -3.968485 0.010001 -2.214968 +v -3.968485 0.010001 -1.938097 +v -3.876195 0.010001 -1.938097 +v -3.876195 0.010001 -2.030388 +v -3.968485 0.010001 -2.030388 +v -3.783905 0.010001 -1.938097 +v -3.691614 0.010001 -1.938097 +v -3.691614 0.010001 -2.030388 +v -3.783905 0.010001 -2.030388 +v -3.968485 0.010001 -2.861001 +v -3.876195 0.010001 -2.861001 +v -3.876195 0.010001 -2.953291 +v -3.968485 0.010001 -2.953291 +v -3.968485 0.010001 -2.676420 +v -3.876195 0.010001 -2.676420 +v -3.876195 0.010001 -2.768711 +v -3.968485 0.010001 -2.768711 +v -3.783905 0.010001 -2.676420 +v -3.691614 0.010001 -2.676420 +v -3.691614 0.010001 -2.768711 +v -3.783905 0.010001 -2.768711 +v -0.276871 0.010001 -2.122678 +v -0.184581 0.010001 -2.122678 +v -0.184581 0.010001 -2.214968 +v -0.276871 0.010001 -2.214968 +v -0.276871 0.010001 -1.938097 +v -0.184581 0.010001 -1.938097 +v -0.184581 0.010001 -2.030388 +v -0.276871 0.010001 -2.030388 +v -0.092290 0.010001 -1.938097 +v 0.000000 0.010001 -1.938097 +v 0.000000 0.010001 -2.030388 +v -0.092290 0.010001 -2.030388 +v -1.015194 0.010001 -2.122678 +v -0.922904 0.010001 -2.122678 +v -0.922904 0.010001 -2.214968 +v -1.015194 0.010001 -2.214968 +v -1.015194 0.010001 -1.938097 +v -0.922904 0.010001 -1.938097 +v -0.922904 0.010001 -2.030388 +v -1.015194 0.010001 -2.030388 +v -0.830613 0.010001 -1.938097 +v -0.738323 0.010001 -1.938097 +v -0.738323 0.010001 -2.030388 +v -0.830613 0.010001 -2.030388 +v -1.015194 0.010001 -2.861001 +v -0.922904 0.010001 -2.861001 +v -0.922904 0.010001 -2.953291 +v -1.015194 0.010001 -2.953291 +v -1.015194 0.010001 -2.676420 +v -0.922904 0.010001 -2.676420 +v -0.922904 0.010001 -2.768711 +v -1.015194 0.010001 -2.768711 +v -0.830613 0.010001 -2.676420 +v -0.738323 0.010001 -2.676420 +v -0.738323 0.010001 -2.768711 +v -0.830613 0.010001 -2.768711 +v 2.676420 0.010002 -5.075970 +v 2.768711 0.010002 -5.075970 +v 2.768711 0.010002 -5.168260 +v 2.676420 0.010002 -5.168260 +v 2.676420 0.010002 -4.891389 +v 2.768711 0.010002 -4.891389 +v 2.768711 0.010002 -4.983679 +v 2.676420 0.010002 -4.983679 +v 2.861001 0.010002 -4.891389 +v 2.953291 0.010002 -4.891389 +v 2.953291 0.010002 -4.983679 +v 2.861001 0.010002 -4.983679 +v 1.938097 0.010002 -5.075970 +v 2.030388 0.010002 -5.075970 +v 2.030388 0.010002 -5.168260 +v 1.938097 0.010002 -5.168260 +v 1.938097 0.010002 -4.891389 +v 2.030388 0.010002 -4.891389 +v 2.030388 0.010002 -4.983679 +v 1.938097 0.010002 -4.983679 +v 2.122678 0.010002 -4.891389 +v 2.214968 0.010002 -4.891389 +v 2.214968 0.010002 -4.983679 +v 2.122678 0.010002 -4.983679 +v 1.938097 0.010002 -5.814293 +v 2.030388 0.010002 -5.814293 +v 2.030388 0.010002 -5.906583 +v 1.938097 0.010002 -5.906583 +v 1.938097 0.010002 -5.629711 +v 2.030388 0.010002 -5.629711 +v 2.030388 0.010002 -5.722002 +v 1.938097 0.010002 -5.722002 +v 2.122678 0.010002 -5.629711 +v 2.214968 0.010002 -5.629711 +v 2.214968 0.010002 -5.722002 +v 2.122678 0.010002 -5.722002 +v 2.676420 0.010001 -2.122678 +v 2.768711 0.010001 -2.122678 +v 2.768711 0.010001 -2.214968 +v 2.676420 0.010001 -2.214968 +v 2.676420 0.010001 -1.938097 +v 2.768711 0.010001 -1.938097 +v 2.768711 0.010001 -2.030388 +v 2.676420 0.010001 -2.030388 +v 2.861001 0.010001 -1.938097 +v 2.953291 0.010001 -1.938097 +v 2.953291 0.010001 -2.030388 +v 2.861001 0.010001 -2.030388 +v 1.938097 0.010001 -2.122678 +v 2.030388 0.010001 -2.122678 +v 2.030388 0.010001 -2.214968 +v 1.938097 0.010001 -2.214968 +v 1.938097 0.010001 -1.938097 +v 2.030388 0.010001 -1.938097 +v 2.030388 0.010001 -2.030388 +v 1.938097 0.010001 -2.030388 +v 2.122678 0.010001 -1.938097 +v 2.214968 0.010001 -1.938097 +v 2.214968 0.010001 -2.030388 +v 2.122678 0.010001 -2.030388 +v 1.938097 0.010001 -2.861001 +v 2.030388 0.010001 -2.861001 +v 2.030388 0.010001 -2.953291 +v 1.938097 0.010001 -2.953291 +v 1.938097 0.010001 -2.676420 +v 2.030388 0.010001 -2.676420 +v 2.030388 0.010001 -2.768711 +v 1.938097 0.010001 -2.768711 +v 2.122678 0.010001 -2.676420 +v 2.214968 0.010001 -2.676420 +v 2.214968 0.010001 -2.768711 +v 2.122678 0.010001 -2.768711 +v 5.629711 0.010001 -2.122678 +v 5.722002 0.010001 -2.122678 +v 5.722002 0.010001 -2.214968 +v 5.629711 0.010001 -2.214968 +v 5.629711 0.010001 -1.938097 +v 5.722002 0.010001 -1.938097 +v 5.722002 0.010001 -2.030388 +v 5.629711 0.010001 -2.030388 +v 5.814293 0.010001 -1.938097 +v 5.906583 0.010001 -1.938097 +v 5.906583 0.010001 -2.030388 +v 5.814293 0.010001 -2.030388 +v 4.891389 0.010001 -2.122678 +v 4.983679 0.010001 -2.122678 +v 4.983679 0.010001 -2.214968 +v 4.891389 0.010001 -2.214968 +v 4.891389 0.010001 -1.938097 +v 4.983679 0.010001 -1.938097 +v 4.983679 0.010001 -2.030388 +v 4.891389 0.010001 -2.030388 +v 5.075970 0.010001 -1.938097 +v 5.168260 0.010001 -1.938097 +v 5.168260 0.010001 -2.030388 +v 5.075970 0.010001 -2.030388 +v 4.891389 0.010001 -2.861001 +v 4.983679 0.010001 -2.861001 +v 4.983679 0.010001 -2.953291 +v 4.891389 0.010001 -2.953291 +v 4.891389 0.010001 -2.676420 +v 4.983679 0.010001 -2.676420 +v 4.983679 0.010001 -2.768711 +v 4.891389 0.010001 -2.768711 +v 5.075970 0.010001 -2.676420 +v 5.168260 0.010001 -2.676420 +v 5.168260 0.010001 -2.768711 +v 5.075970 0.010001 -2.768711 +v 4.153066 0.010001 -2.122678 +v 4.245357 0.010001 -2.122678 +v 4.245357 0.010001 -2.214968 +v 4.153066 0.010001 -2.214968 +v 4.153066 0.010001 -1.938097 +v 4.245357 0.010001 -1.938097 +v 4.245357 0.010001 -2.030388 +v 4.153066 0.010001 -2.030388 +v 4.337647 0.010001 -1.938097 +v 4.429937 0.010001 -1.938097 +v 4.429937 0.010001 -2.030388 +v 4.337647 0.010001 -2.030388 +v 3.414743 0.010001 -2.122678 +v 3.507033 0.010001 -2.122678 +v 3.507033 0.010001 -2.214968 +v 3.414743 0.010001 -2.214968 +v 3.414743 0.010001 -1.938097 +v 3.507033 0.010001 -1.938097 +v 3.507033 0.010001 -2.030388 +v 3.414743 0.010001 -2.030388 +v 3.599324 0.010001 -1.938097 +v 3.691614 0.010001 -1.938097 +v 3.691614 0.010001 -2.030388 +v 3.599324 0.010001 -2.030388 +v 3.414743 0.010001 -2.861001 +v 3.507033 0.010001 -2.861001 +v 3.507033 0.010001 -2.953291 +v 3.414743 0.010001 -2.953291 +v 3.414743 0.010001 -2.676420 +v 3.507033 0.010001 -2.676420 +v 3.507033 0.010001 -2.768711 +v 3.414743 0.010001 -2.768711 +v 3.599324 0.010001 -2.676420 +v 3.691614 0.010001 -2.676420 +v 3.691614 0.010001 -2.768711 +v 3.599324 0.010001 -2.768711 +v 4.153066 0.010000 -0.646033 +v 4.245357 0.010000 -0.646033 +v 4.245357 0.010000 -0.738323 +v 4.153066 0.010000 -0.738323 +v 4.153066 0.010000 -0.461452 +v 4.245357 0.010000 -0.461452 +v 4.245357 0.010000 -0.553742 +v 4.153066 0.010000 -0.553742 +v 4.337647 0.010000 -0.461452 +v 4.429937 0.010000 -0.461452 +v 4.429937 0.010000 -0.553742 +v 4.337647 0.010000 -0.553742 +v 3.414743 0.010000 -0.646033 +v 3.507033 0.010000 -0.646033 +v 3.507033 0.010000 -0.738323 +v 3.414743 0.010000 -0.738323 +v 3.414743 0.010000 -0.461452 +v 3.507033 0.010000 -0.461452 +v 3.507033 0.010000 -0.553742 +v 3.414743 0.010000 -0.553742 +v 3.599324 0.010000 -0.461452 +v 3.691614 0.010000 -0.461452 +v 3.691614 0.010000 -0.553742 +v 3.599324 0.010000 -0.553742 +v 3.414743 0.010001 -1.384355 +v 3.507033 0.010001 -1.384355 +v 3.507033 0.010001 -1.476646 +v 3.414743 0.010001 -1.476646 +v 3.414743 0.010000 -1.199775 +v 3.507033 0.010000 -1.199775 +v 3.507033 0.010001 -1.292065 +v 3.414743 0.010001 -1.292065 +v 3.599324 0.010000 -1.199775 +v 3.691614 0.010000 -1.199775 +v 3.691614 0.010001 -1.292065 +v 3.599324 0.010001 -1.292065 +v 5.629711 0.010000 -0.646033 +v 5.722002 0.010000 -0.646033 +v 5.722002 0.010000 -0.738323 +v 5.629711 0.010000 -0.738323 +v 5.629711 0.010000 -0.461452 +v 5.722002 0.010000 -0.461452 +v 5.722002 0.010000 -0.553742 +v 5.629711 0.010000 -0.553742 +v 5.814293 0.010000 -0.461452 +v 5.906583 0.010000 -0.461452 +v 5.906583 0.010000 -0.553742 +v 5.814293 0.010000 -0.553742 +v 4.891389 0.010000 -0.646033 +v 4.983679 0.010000 -0.646033 +v 4.983679 0.010000 -0.738323 +v 4.891389 0.010000 -0.738323 +v 4.891389 0.010000 -0.461452 +v 4.983679 0.010000 -0.461452 +v 4.983679 0.010000 -0.553742 +v 4.891389 0.010000 -0.553742 +v 5.075970 0.010000 -0.461452 +v 5.168260 0.010000 -0.461452 +v 5.168260 0.010000 -0.553742 +v 5.075970 0.010000 -0.553742 +v 4.891389 0.010001 -1.384355 +v 4.983679 0.010001 -1.384355 +v 4.983679 0.010001 -1.476646 +v 4.891389 0.010001 -1.476646 +v 4.891389 0.010000 -1.199775 +v 4.983679 0.010000 -1.199775 +v 4.983679 0.010001 -1.292065 +v 4.891389 0.010001 -1.292065 +v 5.075970 0.010000 -1.199775 +v 5.168260 0.010000 -1.199775 +v 5.168260 0.010001 -1.292065 +v 5.075970 0.010001 -1.292065 +v 1.199775 0.010001 -2.122678 +v 1.292065 0.010001 -2.122678 +v 1.292065 0.010001 -2.214968 +v 1.199775 0.010001 -2.214968 +v 1.199775 0.010001 -1.938097 +v 1.292065 0.010001 -1.938097 +v 1.292065 0.010001 -2.030388 +v 1.199775 0.010001 -2.030388 +v 1.384355 0.010001 -1.938097 +v 1.476646 0.010001 -1.938097 +v 1.476646 0.010001 -2.030388 +v 1.384355 0.010001 -2.030388 +v 0.461452 0.010001 -2.122678 +v 0.553742 0.010001 -2.122678 +v 0.553742 0.010001 -2.214968 +v 0.461452 0.010001 -2.214968 +v 0.461452 0.010001 -1.938097 +v 0.553742 0.010001 -1.938097 +v 0.553742 0.010001 -2.030388 +v 0.461452 0.010001 -2.030388 +v 0.646033 0.010001 -1.938097 +v 0.738323 0.010001 -1.938097 +v 0.738323 0.010001 -2.030388 +v 0.646033 0.010001 -2.030388 +v 0.461452 0.010001 -2.861001 +v 0.553742 0.010001 -2.861001 +v 0.553742 0.010001 -2.953291 +v 0.461452 0.010001 -2.953291 +v 0.461452 0.010001 -2.676420 +v 0.553742 0.010001 -2.676420 +v 0.553742 0.010001 -2.768711 +v 0.461452 0.010001 -2.768711 +v 0.646033 0.010001 -2.676420 +v 0.738323 0.010001 -2.676420 +v 0.738323 0.010001 -2.768711 +v 0.646033 0.010001 -2.768711 +v 1.199775 0.010000 -0.646033 +v 1.292065 0.010000 -0.646033 +v 1.292065 0.010000 -0.738323 +v 1.199775 0.010000 -0.738323 +v 1.199775 0.010000 -0.461452 +v 1.292065 0.010000 -0.461452 +v 1.292065 0.010000 -0.553742 +v 1.199775 0.010000 -0.553742 +v 1.384355 0.010000 -0.461452 +v 1.476646 0.010000 -0.461452 +v 1.476646 0.010000 -0.553742 +v 1.384355 0.010000 -0.553742 +v 0.461452 0.010000 -0.646033 +v 0.553742 0.010000 -0.646033 +v 0.553742 0.010000 -0.738323 +v 0.461452 0.010000 -0.738323 +v 0.461452 0.010000 -0.461452 +v 0.553742 0.010000 -0.461452 +v 0.553742 0.010000 -0.553742 +v 0.461452 0.010000 -0.553742 +v 0.646033 0.010000 -0.461452 +v 0.738323 0.010000 -0.461452 +v 0.738323 0.010000 -0.553742 +v 0.646033 0.010000 -0.553742 +v 0.461452 0.010001 -1.384355 +v 0.553742 0.010001 -1.384355 +v 0.553742 0.010001 -1.476646 +v 0.461452 0.010001 -1.476646 +v 0.461452 0.010000 -1.199775 +v 0.553742 0.010000 -1.199775 +v 0.553742 0.010001 -1.292065 +v 0.461452 0.010001 -1.292065 +v 0.646033 0.010000 -1.199775 +v 0.738323 0.010000 -1.199775 +v 0.738323 0.010001 -1.292065 +v 0.646033 0.010001 -1.292065 +v 2.676420 0.010000 -0.646033 +v 2.768711 0.010000 -0.646033 +v 2.768711 0.010000 -0.738323 +v 2.676420 0.010000 -0.738323 +v 2.676420 0.010000 -0.461452 +v 2.768711 0.010000 -0.461452 +v 2.768711 0.010000 -0.553742 +v 2.676420 0.010000 -0.553742 +v 2.861001 0.010000 -0.461452 +v 2.953291 0.010000 -0.461452 +v 2.953291 0.010000 -0.553742 +v 2.861001 0.010000 -0.553742 +v 1.938097 0.010000 -0.646033 +v 2.030388 0.010000 -0.646033 +v 2.030388 0.010000 -0.738323 +v 1.938097 0.010000 -0.738323 +v 1.938097 0.010000 -0.461452 +v 2.030388 0.010000 -0.461452 +v 2.030388 0.010000 -0.553742 +v 1.938097 0.010000 -0.553742 +v 2.122678 0.010000 -0.461452 +v 2.214968 0.010000 -0.461452 +v 2.214968 0.010000 -0.553742 +v 2.122678 0.010000 -0.553742 +v 1.938097 0.010001 -1.384355 +v 2.030388 0.010001 -1.384355 +v 2.030388 0.010001 -1.476646 +v 1.938097 0.010001 -1.476646 +v 1.938097 0.010000 -1.199775 +v 2.030388 0.010000 -1.199775 +v 2.030388 0.010001 -1.292065 +v 1.938097 0.010001 -1.292065 +v 2.122678 0.010000 -1.199775 +v 2.214968 0.010000 -1.199775 +v 2.214968 0.010001 -1.292065 +v 2.122678 0.010001 -1.292065 +v 1.199775 0.010002 -5.075970 +v 1.292065 0.010002 -5.075970 +v 1.292065 0.010002 -5.168260 +v 1.199775 0.010002 -5.168260 +v 1.199775 0.010002 -4.891389 +v 1.292065 0.010002 -4.891389 +v 1.292065 0.010002 -4.983679 +v 1.199775 0.010002 -4.983679 +v 1.384355 0.010002 -4.891389 +v 1.476646 0.010002 -4.891389 +v 1.476646 0.010002 -4.983679 +v 1.384355 0.010002 -4.983679 +v 0.461452 0.010002 -5.075970 +v 0.553742 0.010002 -5.075970 +v 0.553742 0.010002 -5.168260 +v 0.461452 0.010002 -5.168260 +v 0.461452 0.010002 -4.891389 +v 0.553742 0.010002 -4.891389 +v 0.553742 0.010002 -4.983679 +v 0.461452 0.010002 -4.983679 +v 0.646033 0.010002 -4.891389 +v 0.738323 0.010002 -4.891389 +v 0.738323 0.010002 -4.983679 +v 0.646033 0.010002 -4.983679 +v 0.461452 0.010002 -5.814293 +v 0.553742 0.010002 -5.814293 +v 0.553742 0.010002 -5.906583 +v 0.461452 0.010002 -5.906583 +v 0.461452 0.010002 -5.629711 +v 0.553742 0.010002 -5.629711 +v 0.553742 0.010002 -5.722002 +v 0.461452 0.010002 -5.722002 +v 0.646033 0.010002 -5.629711 +v 0.738323 0.010002 -5.629711 +v 0.738323 0.010002 -5.722002 +v 0.646033 0.010002 -5.722002 +v 1.199775 0.010001 -3.599324 +v 1.292065 0.010001 -3.599324 +v 1.292065 0.010002 -3.691614 +v 1.199775 0.010002 -3.691614 +v 1.199775 0.010001 -3.414743 +v 1.292065 0.010001 -3.414743 +v 1.292065 0.010001 -3.507033 +v 1.199775 0.010001 -3.507033 +v 1.384355 0.010001 -3.414743 +v 1.476646 0.010001 -3.414743 +v 1.476646 0.010001 -3.507033 +v 1.384355 0.010001 -3.507033 +v 0.461452 0.010001 -3.599324 +v 0.553742 0.010001 -3.599324 +v 0.553742 0.010002 -3.691614 +v 0.461452 0.010002 -3.691614 +v 0.461452 0.010001 -3.414743 +v 0.553742 0.010001 -3.414743 +v 0.553742 0.010001 -3.507033 +v 0.461452 0.010001 -3.507033 +v 0.646033 0.010001 -3.414743 +v 0.738323 0.010001 -3.414743 +v 0.738323 0.010001 -3.507033 +v 0.646033 0.010001 -3.507033 +v 0.461452 0.010002 -4.337647 +v 0.553742 0.010002 -4.337647 +v 0.553742 0.010002 -4.429937 +v 0.461452 0.010002 -4.429937 +v 0.461452 0.010002 -4.153066 +v 0.553742 0.010002 -4.153066 +v 0.553742 0.010002 -4.245357 +v 0.461452 0.010002 -4.245357 +v 0.646033 0.010002 -4.153066 +v 0.738323 0.010002 -4.153066 +v 0.738323 0.010002 -4.245357 +v 0.646033 0.010002 -4.245357 +v 2.676420 0.010001 -3.599324 +v 2.768711 0.010001 -3.599324 +v 2.768711 0.010002 -3.691614 +v 2.676420 0.010002 -3.691614 +v 2.676420 0.010001 -3.414743 +v 2.768711 0.010001 -3.414743 +v 2.768711 0.010001 -3.507033 +v 2.676420 0.010001 -3.507033 +v 2.861001 0.010001 -3.414743 +v 2.953291 0.010001 -3.414743 +v 2.953291 0.010001 -3.507033 +v 2.861001 0.010001 -3.507033 +v 1.938097 0.010001 -3.599324 +v 2.030388 0.010001 -3.599324 +v 2.030388 0.010002 -3.691614 +v 1.938097 0.010002 -3.691614 +v 1.938097 0.010001 -3.414743 +v 2.030388 0.010001 -3.414743 +v 2.030388 0.010001 -3.507033 +v 1.938097 0.010001 -3.507033 +v 2.122678 0.010001 -3.414743 +v 2.214968 0.010001 -3.414743 +v 2.214968 0.010001 -3.507033 +v 2.122678 0.010001 -3.507033 +v 1.938097 0.010002 -4.337647 +v 2.030388 0.010002 -4.337647 +v 2.030388 0.010002 -4.429937 +v 1.938097 0.010002 -4.429937 +v 1.938097 0.010002 -4.153066 +v 2.030388 0.010002 -4.153066 +v 2.030388 0.010002 -4.245357 +v 1.938097 0.010002 -4.245357 +v 2.122678 0.010002 -4.153066 +v 2.214968 0.010002 -4.153066 +v 2.214968 0.010002 -4.245357 +v 2.122678 0.010002 -4.245357 +v -1.753517 0.010001 -2.122678 +v -1.661226 0.010001 -2.122678 +v -1.661226 0.010001 -2.214968 +v -1.753517 0.010001 -2.214968 +v -1.753517 0.010001 -1.938097 +v -1.661226 0.010001 -1.938097 +v -1.661226 0.010001 -2.030388 +v -1.753517 0.010001 -2.030388 +v -1.568936 0.010001 -1.938097 +v -1.476646 0.010001 -1.938097 +v -1.476646 0.010001 -2.030388 +v -1.568936 0.010001 -2.030388 +v -2.491840 0.010001 -2.122678 +v -2.399549 0.010001 -2.122678 +v -2.399549 0.010001 -2.214968 +v -2.491840 0.010001 -2.214968 +v -2.491840 0.010001 -1.938097 +v -2.399549 0.010001 -1.938097 +v -2.399549 0.010001 -2.030388 +v -2.491840 0.010001 -2.030388 +v -2.307259 0.010001 -1.938097 +v -2.214968 0.010001 -1.938097 +v -2.214968 0.010001 -2.030388 +v -2.307259 0.010001 -2.030388 +v -2.491840 0.010001 -2.861001 +v -2.399549 0.010001 -2.861001 +v -2.399549 0.010001 -2.953291 +v -2.491840 0.010001 -2.953291 +v -2.491840 0.010001 -2.676420 +v -2.399549 0.010001 -2.676420 +v -2.399549 0.010001 -2.768711 +v -2.491840 0.010001 -2.768711 +v -2.307259 0.010001 -2.676420 +v -2.214968 0.010001 -2.676420 +v -2.214968 0.010001 -2.768711 +v -2.307259 0.010001 -2.768711 +v -1.753517 0.010000 -0.646033 +v -1.661226 0.010000 -0.646033 +v -1.661226 0.010000 -0.738323 +v -1.753517 0.010000 -0.738323 +v -1.753517 0.010000 -0.461452 +v -1.661226 0.010000 -0.461452 +v -1.661226 0.010000 -0.553742 +v -1.753517 0.010000 -0.553742 +v -1.568936 0.010000 -0.461452 +v -1.476646 0.010000 -0.461452 +v -1.476646 0.010000 -0.553742 +v -1.568936 0.010000 -0.553742 +v -2.491840 0.010000 -0.646033 +v -2.399549 0.010000 -0.646033 +v -2.399549 0.010000 -0.738323 +v -2.491840 0.010000 -0.738323 +v -2.491840 0.010000 -0.461452 +v -2.399549 0.010000 -0.461452 +v -2.399549 0.010000 -0.553742 +v -2.491840 0.010000 -0.553742 +v -2.307259 0.010000 -0.461452 +v -2.214968 0.010000 -0.461452 +v -2.214968 0.010000 -0.553742 +v -2.307259 0.010000 -0.553742 +v -2.491840 0.010001 -1.384355 +v -2.399549 0.010001 -1.384355 +v -2.399549 0.010001 -1.476646 +v -2.491840 0.010001 -1.476646 +v -2.491840 0.010000 -1.199775 +v -2.399549 0.010000 -1.199775 +v -2.399549 0.010001 -1.292065 +v -2.491840 0.010001 -1.292065 +v -2.307259 0.010000 -1.199775 +v -2.214968 0.010000 -1.199775 +v -2.214968 0.010001 -1.292065 +v -2.307259 0.010001 -1.292065 +v -0.276871 0.010000 -0.646033 +v -0.184581 0.010000 -0.646033 +v -0.184581 0.010000 -0.738323 +v -0.276871 0.010000 -0.738323 +v -0.276871 0.010000 -0.461452 +v -0.184581 0.010000 -0.461452 +v -0.184581 0.010000 -0.553742 +v -0.276871 0.010000 -0.553742 +v -0.092290 0.010000 -0.461452 +v 0.000000 0.010000 -0.461452 +v 0.000000 0.010000 -0.553742 +v -0.092290 0.010000 -0.553742 +v -1.015194 0.010000 -0.646033 +v -0.922904 0.010000 -0.646033 +v -0.922904 0.010000 -0.738323 +v -1.015194 0.010000 -0.738323 +v -1.015194 0.010000 -0.461452 +v -0.922904 0.010000 -0.461452 +v -0.922904 0.010000 -0.553742 +v -1.015194 0.010000 -0.553742 +v -0.830613 0.010000 -0.461452 +v -0.738323 0.010000 -0.461452 +v -0.738323 0.010000 -0.553742 +v -0.830613 0.010000 -0.553742 +v -1.015194 0.010001 -1.384355 +v -0.922904 0.010001 -1.384355 +v -0.922904 0.010001 -1.476646 +v -1.015194 0.010001 -1.476646 +v -1.015194 0.010000 -1.199775 +v -0.922904 0.010000 -1.199775 +v -0.922904 0.010001 -1.292065 +v -1.015194 0.010001 -1.292065 +v -0.830613 0.010000 -1.199775 +v -0.738323 0.010000 -1.199775 +v -0.738323 0.010001 -1.292065 +v -0.830613 0.010001 -1.292065 +v -4.706808 0.010001 -2.122678 +v -4.614518 0.010001 -2.122678 +v -4.614518 0.010001 -2.214968 +v -4.706808 0.010001 -2.214968 +v -4.706808 0.010001 -1.938097 +v -4.614518 0.010001 -1.938097 +v -4.614518 0.010001 -2.030388 +v -4.706808 0.010001 -2.030388 +v -4.522227 0.010001 -1.938097 +v -4.429937 0.010001 -1.938097 +v -4.429937 0.010001 -2.030388 +v -4.522227 0.010001 -2.030388 +v -5.445131 0.010001 -2.122678 +v -5.352840 0.010001 -2.122678 +v -5.352840 0.010001 -2.214968 +v -5.445131 0.010001 -2.214968 +v -5.445131 0.010001 -1.938097 +v -5.352840 0.010001 -1.938097 +v -5.352840 0.010001 -2.030388 +v -5.445131 0.010001 -2.030388 +v -5.260550 0.010001 -1.938097 +v -5.168260 0.010001 -1.938097 +v -5.168260 0.010001 -2.030388 +v -5.260550 0.010001 -2.030388 +v -5.445131 0.010001 -2.861001 +v -5.352840 0.010001 -2.861001 +v -5.352840 0.010001 -2.953291 +v -5.445131 0.010001 -2.953291 +v -5.445131 0.010001 -2.676420 +v -5.352840 0.010001 -2.676420 +v -5.352840 0.010001 -2.768711 +v -5.445131 0.010001 -2.768711 +v -5.260550 0.010001 -2.676420 +v -5.168260 0.010001 -2.676420 +v -5.168260 0.010001 -2.768711 +v -5.260550 0.010001 -2.768711 +v -4.706808 0.010000 -0.646033 +v -4.614518 0.010000 -0.646033 +v -4.614518 0.010000 -0.738323 +v -4.706808 0.010000 -0.738323 +v -4.706808 0.010000 -0.461452 +v -4.614518 0.010000 -0.461452 +v -4.614518 0.010000 -0.553742 +v -4.706808 0.010000 -0.553742 +v -4.522227 0.010000 -0.461452 +v -4.429937 0.010000 -0.461452 +v -4.429937 0.010000 -0.553742 +v -4.522227 0.010000 -0.553742 +v -5.445131 0.010000 -0.646033 +v -5.352840 0.010000 -0.646033 +v -5.352840 0.010000 -0.738323 +v -5.445131 0.010000 -0.738323 +v -5.445131 0.010000 -0.461452 +v -5.352840 0.010000 -0.461452 +v -5.352840 0.010000 -0.553742 +v -5.445131 0.010000 -0.553742 +v -5.260550 0.010000 -0.461452 +v -5.168260 0.010000 -0.461452 +v -5.168260 0.010000 -0.553742 +v -5.260550 0.010000 -0.553742 +v -5.445131 0.010001 -1.384355 +v -5.352840 0.010001 -1.384355 +v -5.352840 0.010001 -1.476646 +v -5.445131 0.010001 -1.476646 +v -5.445131 0.010000 -1.199775 +v -5.352840 0.010000 -1.199775 +v -5.352840 0.010001 -1.292065 +v -5.445131 0.010001 -1.292065 +v -5.260550 0.010000 -1.199775 +v -5.168260 0.010000 -1.199775 +v -5.168260 0.010001 -1.292065 +v -5.260550 0.010001 -1.292065 +v -3.230163 0.010000 -0.646033 +v -3.137872 0.010000 -0.646033 +v -3.137872 0.010000 -0.738323 +v -3.230163 0.010000 -0.738323 +v -3.230163 0.010000 -0.461452 +v -3.137872 0.010000 -0.461452 +v -3.137872 0.010000 -0.553742 +v -3.230163 0.010000 -0.553742 +v -3.045582 0.010000 -0.461452 +v -2.953291 0.010000 -0.461452 +v -2.953291 0.010000 -0.553742 +v -3.045582 0.010000 -0.553742 +v -3.968485 0.010000 -0.646033 +v -3.876195 0.010000 -0.646033 +v -3.876195 0.010000 -0.738323 +v -3.968485 0.010000 -0.738323 +v -3.968485 0.010000 -0.461452 +v -3.876195 0.010000 -0.461452 +v -3.876195 0.010000 -0.553742 +v -3.968485 0.010000 -0.553742 +v -3.783905 0.010000 -0.461452 +v -3.691614 0.010000 -0.461452 +v -3.691614 0.010000 -0.553742 +v -3.783905 0.010000 -0.553742 +v -3.968485 0.010001 -1.384355 +v -3.876195 0.010001 -1.384355 +v -3.876195 0.010001 -1.476646 +v -3.968485 0.010001 -1.476646 +v -3.968485 0.010000 -1.199775 +v -3.876195 0.010000 -1.199775 +v -3.876195 0.010001 -1.292065 +v -3.968485 0.010001 -1.292065 +v -3.783905 0.010000 -1.199775 +v -3.691614 0.010000 -1.199775 +v -3.691614 0.010001 -1.292065 +v -3.783905 0.010001 -1.292065 +v -4.706808 0.010002 -5.075970 +v -4.614518 0.010002 -5.075970 +v -4.614518 0.010002 -5.168260 +v -4.706808 0.010002 -5.168260 +v -4.706808 0.010002 -4.891389 +v -4.614518 0.010002 -4.891389 +v -4.614518 0.010002 -4.983679 +v -4.706808 0.010002 -4.983679 +v -4.522227 0.010002 -4.891389 +v -4.429937 0.010002 -4.891389 +v -4.429937 0.010002 -4.983679 +v -4.522227 0.010002 -4.983679 +v -5.445131 0.010002 -5.075970 +v -5.352840 0.010002 -5.075970 +v -5.352840 0.010002 -5.168260 +v -5.445131 0.010002 -5.168260 +v -5.445131 0.010002 -4.891389 +v -5.352840 0.010002 -4.891389 +v -5.352840 0.010002 -4.983679 +v -5.445131 0.010002 -4.983679 +v -5.260550 0.010002 -4.891389 +v -5.168260 0.010002 -4.891389 +v -5.168260 0.010002 -4.983679 +v -5.260550 0.010002 -4.983679 +v -5.445131 0.010002 -5.814293 +v -5.352840 0.010002 -5.814293 +v -5.352840 0.010002 -5.906583 +v -5.445131 0.010002 -5.906583 +v -5.445131 0.010002 -5.629711 +v -5.352840 0.010002 -5.629711 +v -5.352840 0.010002 -5.722002 +v -5.445131 0.010002 -5.722002 +v -5.260550 0.010002 -5.629711 +v -5.168260 0.010002 -5.629711 +v -5.168260 0.010002 -5.722002 +v -5.260550 0.010002 -5.722002 +v -4.706808 0.010001 -3.599324 +v -4.614518 0.010001 -3.599324 +v -4.614518 0.010002 -3.691614 +v -4.706808 0.010002 -3.691614 +v -4.706808 0.010001 -3.414743 +v -4.614518 0.010001 -3.414743 +v -4.614518 0.010001 -3.507033 +v -4.706808 0.010001 -3.507033 +v -4.522227 0.010001 -3.414743 +v -4.429937 0.010001 -3.414743 +v -4.429937 0.010001 -3.507033 +v -4.522227 0.010001 -3.507033 +v -5.445131 0.010001 -3.599324 +v -5.352840 0.010001 -3.599324 +v -5.352840 0.010002 -3.691614 +v -5.445131 0.010002 -3.691614 +v -5.445131 0.010001 -3.414743 +v -5.352840 0.010001 -3.414743 +v -5.352840 0.010001 -3.507033 +v -5.445131 0.010001 -3.507033 +v -5.260550 0.010001 -3.414743 +v -5.168260 0.010001 -3.414743 +v -5.168260 0.010001 -3.507033 +v -5.260550 0.010001 -3.507033 +v -5.445131 0.010002 -4.337647 +v -5.352840 0.010002 -4.337647 +v -5.352840 0.010002 -4.429937 +v -5.445131 0.010002 -4.429937 +v -5.445131 0.010002 -4.153066 +v -5.352840 0.010002 -4.153066 +v -5.352840 0.010002 -4.245357 +v -5.445131 0.010002 -4.245357 +v -5.260550 0.010002 -4.153066 +v -5.168260 0.010002 -4.153066 +v -5.168260 0.010002 -4.245357 +v -5.260550 0.010002 -4.245357 +v -3.230163 0.010001 -3.599324 +v -3.137872 0.010001 -3.599324 +v -3.137872 0.010002 -3.691614 +v -3.230163 0.010002 -3.691614 +v -3.230163 0.010001 -3.414743 +v -3.137872 0.010001 -3.414743 +v -3.137872 0.010001 -3.507033 +v -3.230163 0.010001 -3.507033 +v -3.045582 0.010001 -3.414743 +v -2.953291 0.010001 -3.414743 +v -2.953291 0.010001 -3.507033 +v -3.045582 0.010001 -3.507033 +v -3.968485 0.010001 -3.599324 +v -3.876195 0.010001 -3.599324 +v -3.876195 0.010002 -3.691614 +v -3.968485 0.010002 -3.691614 +v -3.968485 0.010001 -3.414743 +v -3.876195 0.010001 -3.414743 +v -3.876195 0.010001 -3.507033 +v -3.968485 0.010001 -3.507033 +v -3.783905 0.010001 -3.414743 +v -3.691614 0.010001 -3.414743 +v -3.691614 0.010001 -3.507033 +v -3.783905 0.010001 -3.507033 +v -3.968485 0.010002 -4.337647 +v -3.876195 0.010002 -4.337647 +v -3.876195 0.010002 -4.429937 +v -3.968485 0.010002 -4.429937 +v -3.968485 0.010002 -4.153066 +v -3.876195 0.010002 -4.153066 +v -3.876195 0.010002 -4.245357 +v -3.968485 0.010002 -4.245357 +v -3.783905 0.010002 -4.153066 +v -3.691614 0.010002 -4.153066 +v -3.691614 0.010002 -4.245357 +v -3.783905 0.010002 -4.245357 +v -1.753517 0.009998 3.783905 +v -1.661226 0.009998 3.783905 +v -1.661226 0.009998 3.691614 +v -1.753517 0.009998 3.691614 +v -1.753517 0.009998 3.968485 +v -1.661226 0.009998 3.968485 +v -1.661226 0.009998 3.876195 +v -1.753517 0.009998 3.876195 +v -1.568936 0.009998 3.968485 +v -1.476646 0.009998 3.968485 +v -1.476646 0.009998 3.876195 +v -1.568936 0.009998 3.876195 +v -2.491840 0.009998 3.783905 +v -2.399549 0.009998 3.783905 +v -2.399549 0.009998 3.691614 +v -2.491840 0.009998 3.691614 +v -2.491840 0.009998 3.968485 +v -2.399549 0.009998 3.968485 +v -2.399549 0.009998 3.876195 +v -2.491840 0.009998 3.876195 +v -2.307259 0.009998 3.968485 +v -2.214968 0.009998 3.968485 +v -2.214968 0.009998 3.876195 +v -2.307259 0.009998 3.876195 +v -2.491840 0.009999 3.045582 +v -2.399549 0.009999 3.045582 +v -2.399549 0.009999 2.953291 +v -2.491840 0.009999 2.953291 +v -2.491840 0.009999 3.230163 +v -2.399549 0.009999 3.230163 +v -2.399549 0.009999 3.137872 +v -2.491840 0.009999 3.137872 +v -2.307259 0.009999 3.230163 +v -2.214968 0.009999 3.230163 +v -2.214968 0.009999 3.137872 +v -2.307259 0.009999 3.137872 +v -1.753517 0.009998 5.260550 +v -1.661226 0.009998 5.260550 +v -1.661226 0.009998 5.168260 +v -1.753517 0.009998 5.168260 +v -1.753517 0.009998 5.445131 +v -1.661226 0.009998 5.445131 +v -1.661226 0.009998 5.352840 +v -1.753517 0.009998 5.352840 +v -1.568936 0.009998 5.445131 +v -1.476646 0.009998 5.445131 +v -1.476646 0.009998 5.352840 +v -1.568936 0.009998 5.352840 +v -2.491840 0.009998 5.260550 +v -2.399549 0.009998 5.260550 +v -2.399549 0.009998 5.168260 +v -2.491840 0.009998 5.168260 +v -2.491840 0.009998 5.445131 +v -2.399549 0.009998 5.445131 +v -2.399549 0.009998 5.352840 +v -2.491840 0.009998 5.352840 +v -2.307259 0.009998 5.445131 +v -2.214968 0.009998 5.445131 +v -2.214968 0.009998 5.352840 +v -2.307259 0.009998 5.352840 +v -2.491840 0.009998 4.522227 +v -2.399549 0.009998 4.522227 +v -2.399549 0.009998 4.429937 +v -2.491840 0.009998 4.429937 +v -2.491840 0.009998 4.706808 +v -2.399549 0.009998 4.706808 +v -2.399549 0.009998 4.614518 +v -2.491840 0.009998 4.614518 +v -2.307259 0.009998 4.706808 +v -2.214968 0.009998 4.706808 +v -2.214968 0.009998 4.614518 +v -2.307259 0.009998 4.614518 +v -0.276871 0.009998 5.260550 +v -0.184581 0.009998 5.260550 +v -0.184581 0.009998 5.168260 +v -0.276871 0.009998 5.168260 +v -0.276871 0.009998 5.445131 +v -0.184581 0.009998 5.445131 +v -0.184581 0.009998 5.352840 +v -0.276871 0.009998 5.352840 +v -0.092290 0.009998 5.445131 +v 0.000000 0.009998 5.445131 +v 0.000000 0.009998 5.352840 +v -0.092290 0.009998 5.352840 +v -1.015194 0.009998 5.260550 +v -0.922904 0.009998 5.260550 +v -0.922904 0.009998 5.168260 +v -1.015194 0.009998 5.168260 +v -1.015194 0.009998 5.445131 +v -0.922904 0.009998 5.445131 +v -0.922904 0.009998 5.352840 +v -1.015194 0.009998 5.352840 +v -0.830613 0.009998 5.445131 +v -0.738323 0.009998 5.445131 +v -0.738323 0.009998 5.352840 +v -0.830613 0.009998 5.352840 +v -1.015194 0.009998 4.522227 +v -0.922904 0.009998 4.522227 +v -0.922904 0.009998 4.429937 +v -1.015194 0.009998 4.429937 +v -1.015194 0.009998 4.706808 +v -0.922904 0.009998 4.706808 +v -0.922904 0.009998 4.614518 +v -1.015194 0.009998 4.614518 +v -0.830613 0.009998 4.706808 +v -0.738323 0.009998 4.706808 +v -0.738323 0.009998 4.614518 +v -0.830613 0.009998 4.614518 +v -4.706808 0.009998 3.783905 +v -4.614518 0.009998 3.783905 +v -4.614518 0.009998 3.691614 +v -4.706808 0.009998 3.691614 +v -4.706808 0.009998 3.968485 +v -4.614518 0.009998 3.968485 +v -4.614518 0.009998 3.876195 +v -4.706808 0.009998 3.876195 +v -4.522227 0.009998 3.968485 +v -4.429937 0.009998 3.968485 +v -4.429937 0.009998 3.876195 +v -4.522227 0.009998 3.876195 +v -5.445131 0.009998 3.783905 +v -5.352840 0.009998 3.783905 +v -5.352840 0.009998 3.691614 +v -5.445131 0.009998 3.691614 +v -5.445131 0.009998 3.968485 +v -5.352840 0.009998 3.968485 +v -5.352840 0.009998 3.876195 +v -5.445131 0.009998 3.876195 +v -5.260550 0.009998 3.968485 +v -5.168260 0.009998 3.968485 +v -5.168260 0.009998 3.876195 +v -5.260550 0.009998 3.876195 +v -5.445131 0.009999 3.045582 +v -5.352840 0.009999 3.045582 +v -5.352840 0.009999 2.953291 +v -5.445131 0.009999 2.953291 +v -5.445131 0.009999 3.230163 +v -5.352840 0.009999 3.230163 +v -5.352840 0.009999 3.137872 +v -5.445131 0.009999 3.137872 +v -5.260550 0.009999 3.230163 +v -5.168260 0.009999 3.230163 +v -5.168260 0.009999 3.137872 +v -5.260550 0.009999 3.137872 +v -4.706808 0.009998 5.260550 +v -4.614518 0.009998 5.260550 +v -4.614518 0.009998 5.168260 +v -4.706808 0.009998 5.168260 +v -4.706808 0.009998 5.445131 +v -4.614518 0.009998 5.445131 +v -4.614518 0.009998 5.352840 +v -4.706808 0.009998 5.352840 +v -4.522227 0.009998 5.445131 +v -4.429937 0.009998 5.445131 +v -4.429937 0.009998 5.352840 +v -4.522227 0.009998 5.352840 +v -5.445131 0.009998 5.260550 +v -5.352840 0.009998 5.260550 +v -5.352840 0.009998 5.168260 +v -5.445131 0.009998 5.168260 +v -5.445131 0.009998 5.445131 +v -5.352840 0.009998 5.445131 +v -5.352840 0.009998 5.352840 +v -5.445131 0.009998 5.352840 +v -5.260550 0.009998 5.445131 +v -5.168260 0.009998 5.445131 +v -5.168260 0.009998 5.352840 +v -5.260550 0.009998 5.352840 +v -5.445131 0.009998 4.522227 +v -5.352840 0.009998 4.522227 +v -5.352840 0.009998 4.429937 +v -5.445131 0.009998 4.429937 +v -5.445131 0.009998 4.706808 +v -5.352840 0.009998 4.706808 +v -5.352840 0.009998 4.614518 +v -5.445131 0.009998 4.614518 +v -5.260550 0.009998 4.706808 +v -5.168260 0.009998 4.706808 +v -5.168260 0.009998 4.614518 +v -5.260550 0.009998 4.614518 +v -3.230163 0.009998 5.260550 +v -3.137872 0.009998 5.260550 +v -3.137872 0.009998 5.168260 +v -3.230163 0.009998 5.168260 +v -3.230163 0.009998 5.445131 +v -3.137872 0.009998 5.445131 +v -3.137872 0.009998 5.352840 +v -3.230163 0.009998 5.352840 +v -3.045582 0.009998 5.445131 +v -2.953291 0.009998 5.445131 +v -2.953291 0.009998 5.352840 +v -3.045582 0.009998 5.352840 +v -3.968485 0.009998 5.260550 +v -3.876195 0.009998 5.260550 +v -3.876195 0.009998 5.168260 +v -3.968485 0.009998 5.168260 +v -3.968485 0.009998 5.445131 +v -3.876195 0.009998 5.445131 +v -3.876195 0.009998 5.352840 +v -3.968485 0.009998 5.352840 +v -3.783905 0.009998 5.445131 +v -3.691614 0.009998 5.445131 +v -3.691614 0.009998 5.352840 +v -3.783905 0.009998 5.352840 +v -3.968485 0.009998 4.522227 +v -3.876195 0.009998 4.522227 +v -3.876195 0.009998 4.429937 +v -3.968485 0.009998 4.429937 +v -3.968485 0.009998 4.706808 +v -3.876195 0.009998 4.706808 +v -3.876195 0.009998 4.614518 +v -3.968485 0.009998 4.614518 +v -3.783905 0.009998 4.706808 +v -3.691614 0.009998 4.706808 +v -3.691614 0.009998 4.614518 +v -3.783905 0.009998 4.614518 +v -4.706808 0.010000 0.830613 +v -4.614518 0.010000 0.830613 +v -4.614518 0.010000 0.738323 +v -4.706808 0.010000 0.738323 +v -4.706808 0.010000 1.015194 +v -4.614518 0.010000 1.015194 +v -4.614518 0.010000 0.922904 +v -4.706808 0.010000 0.922904 +v -4.522227 0.010000 1.015194 +v -4.429937 0.010000 1.015194 +v -4.429937 0.010000 0.922904 +v -4.522227 0.010000 0.922904 +v -5.445131 0.010000 0.830613 +v -5.352840 0.010000 0.830613 +v -5.352840 0.010000 0.738323 +v -5.445131 0.010000 0.738323 +v -5.445131 0.010000 1.015194 +v -5.352840 0.010000 1.015194 +v -5.352840 0.010000 0.922904 +v -5.445131 0.010000 0.922904 +v -5.260550 0.010000 1.015194 +v -5.168260 0.010000 1.015194 +v -5.168260 0.010000 0.922904 +v -5.260550 0.010000 0.922904 +v -5.445131 0.010000 0.092290 +v -5.352840 0.010000 0.092290 +v -5.352840 0.010000 -0.000000 +v -5.445131 0.010000 -0.000000 +v -5.445131 0.010000 0.276871 +v -5.352840 0.010000 0.276871 +v -5.352840 0.010000 0.184581 +v -5.445131 0.010000 0.184581 +v -5.260550 0.010000 0.276871 +v -5.168260 0.010000 0.276871 +v -5.168260 0.010000 0.184581 +v -5.260550 0.010000 0.184581 +v -4.706808 0.009999 2.307259 +v -4.614518 0.009999 2.307259 +v -4.614518 0.009999 2.214968 +v -4.706808 0.009999 2.214968 +v -4.706808 0.009999 2.491840 +v -4.614518 0.009999 2.491840 +v -4.614518 0.009999 2.399549 +v -4.706808 0.009999 2.399549 +v -4.522227 0.009999 2.491840 +v -4.429937 0.009999 2.491840 +v -4.429937 0.009999 2.399549 +v -4.522227 0.009999 2.399549 +v -5.445131 0.009999 2.307259 +v -5.352840 0.009999 2.307259 +v -5.352840 0.009999 2.214968 +v -5.445131 0.009999 2.214968 +v -5.445131 0.009999 2.491840 +v -5.352840 0.009999 2.491840 +v -5.352840 0.009999 2.399549 +v -5.445131 0.009999 2.399549 +v -5.260550 0.009999 2.491840 +v -5.168260 0.009999 2.491840 +v -5.168260 0.009999 2.399549 +v -5.260550 0.009999 2.399549 +v -5.445131 0.009999 1.568936 +v -5.352840 0.009999 1.568936 +v -5.352840 0.009999 1.476646 +v -5.445131 0.009999 1.476646 +v -5.445131 0.009999 1.753517 +v -5.352840 0.009999 1.753517 +v -5.352840 0.009999 1.661226 +v -5.445131 0.009999 1.661226 +v -5.260550 0.009999 1.753517 +v -5.168260 0.009999 1.753517 +v -5.168260 0.009999 1.661226 +v -5.260550 0.009999 1.661226 +v -3.230163 0.009999 2.307259 +v -3.137872 0.009999 2.307259 +v -3.137872 0.009999 2.214968 +v -3.230163 0.009999 2.214968 +v -3.230163 0.009999 2.491840 +v -3.137872 0.009999 2.491840 +v -3.137872 0.009999 2.399549 +v -3.230163 0.009999 2.399549 +v -3.045582 0.009999 2.491840 +v -2.953291 0.009999 2.491840 +v -2.953291 0.009999 2.399549 +v -3.045582 0.009999 2.399549 +v -3.968485 0.009999 2.307259 +v -3.876195 0.009999 2.307259 +v -3.876195 0.009999 2.214968 +v -3.968485 0.009999 2.214968 +v -3.968485 0.009999 2.491840 +v -3.876195 0.009999 2.491840 +v -3.876195 0.009999 2.399549 +v -3.968485 0.009999 2.399549 +v -3.783905 0.009999 2.491840 +v -3.691614 0.009999 2.491840 +v -3.691614 0.009999 2.399549 +v -3.783905 0.009999 2.399549 +v -3.968485 0.009999 1.568936 +v -3.876195 0.009999 1.568936 +v -3.876195 0.009999 1.476646 +v -3.968485 0.009999 1.476646 +v -3.968485 0.009999 1.753517 +v -3.876195 0.009999 1.753517 +v -3.876195 0.009999 1.661226 +v -3.968485 0.009999 1.661226 +v -3.783905 0.009999 1.753517 +v -3.691614 0.009999 1.753517 +v -3.691614 0.009999 1.661226 +v -3.783905 0.009999 1.661226 +v 4.153066 0.009998 3.783905 +v 4.245357 0.009998 3.783905 +v 4.245357 0.009998 3.691614 +v 4.153066 0.009998 3.691614 +v 4.153066 0.009998 3.968485 +v 4.245357 0.009998 3.968485 +v 4.245357 0.009998 3.876195 +v 4.153066 0.009998 3.876195 +v 4.337647 0.009998 3.968485 +v 4.429937 0.009998 3.968485 +v 4.429937 0.009998 3.876195 +v 4.337647 0.009998 3.876195 +v 3.414743 0.009998 3.783905 +v 3.507033 0.009998 3.783905 +v 3.507033 0.009998 3.691614 +v 3.414743 0.009998 3.691614 +v 3.414743 0.009998 3.968485 +v 3.507033 0.009998 3.968485 +v 3.507033 0.009998 3.876195 +v 3.414743 0.009998 3.876195 +v 3.599324 0.009998 3.968485 +v 3.691614 0.009998 3.968485 +v 3.691614 0.009998 3.876195 +v 3.599324 0.009998 3.876195 +v 3.414743 0.009999 3.045582 +v 3.507033 0.009999 3.045582 +v 3.507033 0.009999 2.953291 +v 3.414743 0.009999 2.953291 +v 3.414743 0.009999 3.230163 +v 3.507033 0.009999 3.230163 +v 3.507033 0.009999 3.137872 +v 3.414743 0.009999 3.137872 +v 3.599324 0.009999 3.230163 +v 3.691614 0.009999 3.230163 +v 3.691614 0.009999 3.137872 +v 3.599324 0.009999 3.137872 +v 4.153066 0.009998 5.260550 +v 4.245357 0.009998 5.260550 +v 4.245357 0.009998 5.168260 +v 4.153066 0.009998 5.168260 +v 4.153066 0.009998 5.445131 +v 4.245357 0.009998 5.445131 +v 4.245357 0.009998 5.352840 +v 4.153066 0.009998 5.352840 +v 4.337647 0.009998 5.445131 +v 4.429937 0.009998 5.445131 +v 4.429937 0.009998 5.352840 +v 4.337647 0.009998 5.352840 +v 3.414743 0.009998 5.260550 +v 3.507033 0.009998 5.260550 +v 3.507033 0.009998 5.168260 +v 3.414743 0.009998 5.168260 +v 3.414743 0.009998 5.445131 +v 3.507033 0.009998 5.445131 +v 3.507033 0.009998 5.352840 +v 3.414743 0.009998 5.352840 +v 3.599324 0.009998 5.445131 +v 3.691614 0.009998 5.445131 +v 3.691614 0.009998 5.352840 +v 3.599324 0.009998 5.352840 +v 3.414743 0.009998 4.522227 +v 3.507033 0.009998 4.522227 +v 3.507033 0.009998 4.429937 +v 3.414743 0.009998 4.429937 +v 3.414743 0.009998 4.706808 +v 3.507033 0.009998 4.706808 +v 3.507033 0.009998 4.614518 +v 3.414743 0.009998 4.614518 +v 3.599324 0.009998 4.706808 +v 3.691614 0.009998 4.706808 +v 3.691614 0.009998 4.614518 +v 3.599324 0.009998 4.614518 +v 5.629711 0.009998 5.260550 +v 5.722002 0.009998 5.260550 +v 5.722002 0.009998 5.168260 +v 5.629711 0.009998 5.168260 +v 5.629711 0.009998 5.445131 +v 5.722002 0.009998 5.445131 +v 5.722002 0.009998 5.352840 +v 5.629711 0.009998 5.352840 +v 5.814293 0.009998 5.445131 +v 5.906583 0.009998 5.445131 +v 5.906583 0.009998 5.352840 +v 5.814293 0.009998 5.352840 +v 4.891389 0.009998 5.260550 +v 4.983679 0.009998 5.260550 +v 4.983679 0.009998 5.168260 +v 4.891389 0.009998 5.168260 +v 4.891389 0.009998 5.445131 +v 4.983679 0.009998 5.445131 +v 4.983679 0.009998 5.352840 +v 4.891389 0.009998 5.352840 +v 5.075970 0.009998 5.445131 +v 5.168260 0.009998 5.445131 +v 5.168260 0.009998 5.352840 +v 5.075970 0.009998 5.352840 +v 4.891389 0.009998 4.522227 +v 4.983679 0.009998 4.522227 +v 4.983679 0.009998 4.429937 +v 4.891389 0.009998 4.429937 +v 4.891389 0.009998 4.706808 +v 4.983679 0.009998 4.706808 +v 4.983679 0.009998 4.614518 +v 4.891389 0.009998 4.614518 +v 5.075970 0.009998 4.706808 +v 5.168260 0.009998 4.706808 +v 5.168260 0.009998 4.614518 +v 5.075970 0.009998 4.614518 +v 1.199775 0.009998 3.783905 +v 1.292065 0.009998 3.783905 +v 1.292065 0.009998 3.691614 +v 1.199775 0.009998 3.691614 +v 1.199775 0.009998 3.968485 +v 1.292065 0.009998 3.968485 +v 1.292065 0.009998 3.876195 +v 1.199775 0.009998 3.876195 +v 1.384355 0.009998 3.968485 +v 1.476646 0.009998 3.968485 +v 1.476646 0.009998 3.876195 +v 1.384355 0.009998 3.876195 +v 0.461452 0.009998 3.783905 +v 0.553742 0.009998 3.783905 +v 0.553742 0.009998 3.691614 +v 0.461452 0.009998 3.691614 +v 0.461452 0.009998 3.968485 +v 0.553742 0.009998 3.968485 +v 0.553742 0.009998 3.876195 +v 0.461452 0.009998 3.876195 +v 0.646033 0.009998 3.968485 +v 0.738323 0.009998 3.968485 +v 0.738323 0.009998 3.876195 +v 0.646033 0.009998 3.876195 +v 0.461452 0.009999 3.045582 +v 0.553742 0.009999 3.045582 +v 0.553742 0.009999 2.953291 +v 0.461452 0.009999 2.953291 +v 0.461452 0.009999 3.230163 +v 0.553742 0.009999 3.230163 +v 0.553742 0.009999 3.137872 +v 0.461452 0.009999 3.137872 +v 0.646033 0.009999 3.230163 +v 0.738323 0.009999 3.230163 +v 0.738323 0.009999 3.137872 +v 0.646033 0.009999 3.137872 +v 1.199775 0.009998 5.260550 +v 1.292065 0.009998 5.260550 +v 1.292065 0.009998 5.168260 +v 1.199775 0.009998 5.168260 +v 1.199775 0.009998 5.445131 +v 1.292065 0.009998 5.445131 +v 1.292065 0.009998 5.352840 +v 1.199775 0.009998 5.352840 +v 1.384355 0.009998 5.445131 +v 1.476646 0.009998 5.445131 +v 1.476646 0.009998 5.352840 +v 1.384355 0.009998 5.352840 +v 0.461452 0.009998 5.260550 +v 0.553742 0.009998 5.260550 +v 0.553742 0.009998 5.168260 +v 0.461452 0.009998 5.168260 +v 0.461452 0.009998 5.445131 +v 0.553742 0.009998 5.445131 +v 0.553742 0.009998 5.352840 +v 0.461452 0.009998 5.352840 +v 0.646033 0.009998 5.445131 +v 0.738323 0.009998 5.445131 +v 0.738323 0.009998 5.352840 +v 0.646033 0.009998 5.352840 +v 0.461452 0.009998 4.522227 +v 0.553742 0.009998 4.522227 +v 0.553742 0.009998 4.429937 +v 0.461452 0.009998 4.429937 +v 0.461452 0.009998 4.706808 +v 0.553742 0.009998 4.706808 +v 0.553742 0.009998 4.614518 +v 0.461452 0.009998 4.614518 +v 0.646033 0.009998 4.706808 +v 0.738323 0.009998 4.706808 +v 0.738323 0.009998 4.614518 +v 0.646033 0.009998 4.614518 +v 2.676420 0.009998 5.260550 +v 2.768711 0.009998 5.260550 +v 2.768711 0.009998 5.168260 +v 2.676420 0.009998 5.168260 +v 2.676420 0.009998 5.445131 +v 2.768711 0.009998 5.445131 +v 2.768711 0.009998 5.352840 +v 2.676420 0.009998 5.352840 +v 2.861001 0.009998 5.445131 +v 2.953291 0.009998 5.445131 +v 2.953291 0.009998 5.352840 +v 2.861001 0.009998 5.352840 +v 1.938097 0.009998 5.260550 +v 2.030388 0.009998 5.260550 +v 2.030388 0.009998 5.168260 +v 1.938097 0.009998 5.168260 +v 1.938097 0.009998 5.445131 +v 2.030388 0.009998 5.445131 +v 2.030388 0.009998 5.352840 +v 1.938097 0.009998 5.352840 +v 2.122678 0.009998 5.445131 +v 2.214968 0.009998 5.445131 +v 2.214968 0.009998 5.352840 +v 2.122678 0.009998 5.352840 +v 1.938097 0.009998 4.522227 +v 2.030388 0.009998 4.522227 +v 2.030388 0.009998 4.429937 +v 1.938097 0.009998 4.429937 +v 1.938097 0.009998 4.706808 +v 2.030388 0.009998 4.706808 +v 2.030388 0.009998 4.614518 +v 1.938097 0.009998 4.614518 +v 2.122678 0.009998 4.706808 +v 2.214968 0.009998 4.706808 +v 2.214968 0.009998 4.614518 +v 2.122678 0.009998 4.614518 +v 1.199775 0.010000 0.830613 +v 1.292065 0.010000 0.830613 +v 1.292065 0.010000 0.738323 +v 1.199775 0.010000 0.738323 +v 1.199775 0.010000 1.015194 +v 1.292065 0.010000 1.015194 +v 1.292065 0.010000 0.922904 +v 1.199775 0.010000 0.922904 +v 1.384355 0.010000 1.015194 +v 1.476646 0.010000 1.015194 +v 1.476646 0.010000 0.922904 +v 1.384355 0.010000 0.922904 +v 0.461452 0.010000 0.830613 +v 0.553742 0.010000 0.830613 +v 0.553742 0.010000 0.738323 +v 0.461452 0.010000 0.738323 +v 0.461452 0.010000 1.015194 +v 0.553742 0.010000 1.015194 +v 0.553742 0.010000 0.922904 +v 0.461452 0.010000 0.922904 +v 0.646033 0.010000 1.015194 +v 0.738323 0.010000 1.015194 +v 0.738323 0.010000 0.922904 +v 0.646033 0.010000 0.922904 +v 0.461452 0.010000 0.092290 +v 0.553742 0.010000 0.092290 +v 0.553742 0.010000 -0.000000 +v 0.461452 0.010000 -0.000000 +v 0.461452 0.010000 0.276871 +v 0.553742 0.010000 0.276871 +v 0.553742 0.010000 0.184581 +v 0.461452 0.010000 0.184581 +v 0.646033 0.010000 0.276871 +v 0.738323 0.010000 0.276871 +v 0.738323 0.010000 0.184581 +v 0.646033 0.010000 0.184581 +v 1.199775 0.009999 2.307259 +v 1.292065 0.009999 2.307259 +v 1.292065 0.009999 2.214968 +v 1.199775 0.009999 2.214968 +v 1.199775 0.009999 2.491840 +v 1.292065 0.009999 2.491840 +v 1.292065 0.009999 2.399549 +v 1.199775 0.009999 2.399549 +v 1.384355 0.009999 2.491840 +v 1.476646 0.009999 2.491840 +v 1.476646 0.009999 2.399549 +v 1.384355 0.009999 2.399549 +v 0.461452 0.009999 2.307259 +v 0.553742 0.009999 2.307259 +v 0.553742 0.009999 2.214968 +v 0.461452 0.009999 2.214968 +v 0.461452 0.009999 2.491840 +v 0.553742 0.009999 2.491840 +v 0.553742 0.009999 2.399549 +v 0.461452 0.009999 2.399549 +v 0.646033 0.009999 2.491840 +v 0.738323 0.009999 2.491840 +v 0.738323 0.009999 2.399549 +v 0.646033 0.009999 2.399549 +v 0.461452 0.009999 1.568936 +v 0.553742 0.009999 1.568936 +v 0.553742 0.009999 1.476646 +v 0.461452 0.009999 1.476646 +v 0.461452 0.009999 1.753517 +v 0.553742 0.009999 1.753517 +v 0.553742 0.009999 1.661226 +v 0.461452 0.009999 1.661226 +v 0.646033 0.009999 1.753517 +v 0.738323 0.009999 1.753517 +v 0.738323 0.009999 1.661226 +v 0.646033 0.009999 1.661226 +v 2.676420 0.009999 2.307259 +v 2.768711 0.009999 2.307259 +v 2.768711 0.009999 2.214968 +v 2.676420 0.009999 2.214968 +v 2.676420 0.009999 2.491840 +v 2.768711 0.009999 2.491840 +v 2.768711 0.009999 2.399549 +v 2.676420 0.009999 2.399549 +v 2.861001 0.009999 2.491840 +v 2.953291 0.009999 2.491840 +v 2.953291 0.009999 2.399549 +v 2.861001 0.009999 2.399549 +v 1.938097 0.009999 2.307259 +v 2.030388 0.009999 2.307259 +v 2.030388 0.009999 2.214968 +v 1.938097 0.009999 2.214968 +v 1.938097 0.009999 2.491840 +v 2.030388 0.009999 2.491840 +v 2.030388 0.009999 2.399549 +v 1.938097 0.009999 2.399549 +v 2.122678 0.009999 2.491840 +v 2.214968 0.009999 2.491840 +v 2.214968 0.009999 2.399549 +v 2.122678 0.009999 2.399549 +v 1.938097 0.009999 1.568936 +v 2.030388 0.009999 1.568936 +v 2.030388 0.009999 1.476646 +v 1.938097 0.009999 1.476646 +v 1.938097 0.009999 1.753517 +v 2.030388 0.009999 1.753517 +v 2.030388 0.009999 1.661226 +v 1.938097 0.009999 1.661226 +v 2.122678 0.009999 1.753517 +v 2.214968 0.009999 1.753517 +v 2.214968 0.009999 1.661226 +v 2.122678 0.009999 1.661226 +v 4.153066 0.010000 0.830613 +v 4.245357 0.010000 0.830613 +v 4.245357 0.010000 0.738323 +v 4.153066 0.010000 0.738323 +v 4.153066 0.010000 1.015194 +v 4.245357 0.010000 1.015194 +v 4.245357 0.010000 0.922904 +v 4.153066 0.010000 0.922904 +v 4.337647 0.010000 1.015194 +v 4.429937 0.010000 1.015194 +v 4.429937 0.010000 0.922904 +v 4.337647 0.010000 0.922904 +v 3.414743 0.010000 0.830613 +v 3.507033 0.010000 0.830613 +v 3.507033 0.010000 0.738323 +v 3.414743 0.010000 0.738323 +v 3.414743 0.010000 1.015194 +v 3.507033 0.010000 1.015194 +v 3.507033 0.010000 0.922904 +v 3.414743 0.010000 0.922904 +v 3.599324 0.010000 1.015194 +v 3.691614 0.010000 1.015194 +v 3.691614 0.010000 0.922904 +v 3.599324 0.010000 0.922904 +v 3.414743 0.010000 0.092290 +v 3.507033 0.010000 0.092290 +v 3.507033 0.010000 -0.000000 +v 3.414743 0.010000 -0.000000 +v 3.414743 0.010000 0.276871 +v 3.507033 0.010000 0.276871 +v 3.507033 0.010000 0.184581 +v 3.414743 0.010000 0.184581 +v 3.599324 0.010000 0.276871 +v 3.691614 0.010000 0.276871 +v 3.691614 0.010000 0.184581 +v 3.599324 0.010000 0.184581 +v 4.153066 0.009999 2.307259 +v 4.245357 0.009999 2.307259 +v 4.245357 0.009999 2.214968 +v 4.153066 0.009999 2.214968 +v 4.153066 0.009999 2.491840 +v 4.245357 0.009999 2.491840 +v 4.245357 0.009999 2.399549 +v 4.153066 0.009999 2.399549 +v 4.337647 0.009999 2.491840 +v 4.429937 0.009999 2.491840 +v 4.429937 0.009999 2.399549 +v 4.337647 0.009999 2.399549 +v 3.414743 0.009999 2.307259 +v 3.507033 0.009999 2.307259 +v 3.507033 0.009999 2.214968 +v 3.414743 0.009999 2.214968 +v 3.414743 0.009999 2.491840 +v 3.507033 0.009999 2.491840 +v 3.507033 0.009999 2.399549 +v 3.414743 0.009999 2.399549 +v 3.599324 0.009999 2.491840 +v 3.691614 0.009999 2.491840 +v 3.691614 0.009999 2.399549 +v 3.599324 0.009999 2.399549 +v 3.414743 0.009999 1.568936 +v 3.507033 0.009999 1.568936 +v 3.507033 0.009999 1.476646 +v 3.414743 0.009999 1.476646 +v 3.414743 0.009999 1.753517 +v 3.507033 0.009999 1.753517 +v 3.507033 0.009999 1.661226 +v 3.414743 0.009999 1.661226 +v 3.599324 0.009999 1.753517 +v 3.691614 0.009999 1.753517 +v 3.691614 0.009999 1.661226 +v 3.599324 0.009999 1.661226 +v 5.629711 0.009999 2.307259 +v 5.722002 0.009999 2.307259 +v 5.722002 0.009999 2.214968 +v 5.629711 0.009999 2.214968 +v 5.629711 0.009999 2.491840 +v 5.722002 0.009999 2.491840 +v 5.722002 0.009999 2.399549 +v 5.629711 0.009999 2.399549 +v 5.814293 0.009999 2.491840 +v 5.906583 0.009999 2.491840 +v 5.906583 0.009999 2.399549 +v 5.814293 0.009999 2.399549 +v 4.891389 0.009999 2.307259 +v 4.983679 0.009999 2.307259 +v 4.983679 0.009999 2.214968 +v 4.891389 0.009999 2.214968 +v 4.891389 0.009999 2.491840 +v 4.983679 0.009999 2.491840 +v 4.983679 0.009999 2.399549 +v 4.891389 0.009999 2.399549 +v 5.075970 0.009999 2.491840 +v 5.168260 0.009999 2.491840 +v 5.168260 0.009999 2.399549 +v 5.075970 0.009999 2.399549 +v 4.891389 0.009999 1.568936 +v 4.983679 0.009999 1.568936 +v 4.983679 0.009999 1.476646 +v 4.891389 0.009999 1.476646 +v 4.891389 0.009999 1.753517 +v 4.983679 0.009999 1.753517 +v 4.983679 0.009999 1.661226 +v 4.891389 0.009999 1.661226 +v 5.075970 0.009999 1.753517 +v 5.168260 0.009999 1.753517 +v 5.168260 0.009999 1.661226 +v 5.075970 0.009999 1.661226 +v -1.753517 0.010000 0.830613 +v -1.661226 0.010000 0.830613 +v -1.661226 0.010000 0.738323 +v -1.753517 0.010000 0.738323 +v -1.753517 0.010000 1.015194 +v -1.661226 0.010000 1.015194 +v -1.661226 0.010000 0.922904 +v -1.753517 0.010000 0.922904 +v -1.568936 0.010000 1.015194 +v -1.476646 0.010000 1.015194 +v -1.476646 0.010000 0.922904 +v -1.568936 0.010000 0.922904 +v -2.491840 0.010000 0.830613 +v -2.399549 0.010000 0.830613 +v -2.399549 0.010000 0.738323 +v -2.491840 0.010000 0.738323 +v -2.491840 0.010000 1.015194 +v -2.399549 0.010000 1.015194 +v -2.399549 0.010000 0.922904 +v -2.491840 0.010000 0.922904 +v -2.307259 0.010000 1.015194 +v -2.214968 0.010000 1.015194 +v -2.214968 0.010000 0.922904 +v -2.307259 0.010000 0.922904 +v -2.491840 0.010000 0.092290 +v -2.399549 0.010000 0.092290 +v -2.399549 0.010000 -0.000000 +v -2.491840 0.010000 -0.000000 +v -2.491840 0.010000 0.276871 +v -2.399549 0.010000 0.276871 +v -2.399549 0.010000 0.184581 +v -2.491840 0.010000 0.184581 +v -2.307259 0.010000 0.276871 +v -2.214968 0.010000 0.276871 +v -2.214968 0.010000 0.184581 +v -2.307259 0.010000 0.184581 +v -1.753517 0.009999 2.307259 +v -1.661226 0.009999 2.307259 +v -1.661226 0.009999 2.214968 +v -1.753517 0.009999 2.214968 +v -1.753517 0.009999 2.491840 +v -1.661226 0.009999 2.491840 +v -1.661226 0.009999 2.399549 +v -1.753517 0.009999 2.399549 +v -1.568936 0.009999 2.491840 +v -1.476646 0.009999 2.491840 +v -1.476646 0.009999 2.399549 +v -1.568936 0.009999 2.399549 +v -2.491840 0.009999 2.307259 +v -2.399549 0.009999 2.307259 +v -2.399549 0.009999 2.214968 +v -2.491840 0.009999 2.214968 +v -2.491840 0.009999 2.491840 +v -2.399549 0.009999 2.491840 +v -2.399549 0.009999 2.399549 +v -2.491840 0.009999 2.399549 +v -2.307259 0.009999 2.491840 +v -2.214968 0.009999 2.491840 +v -2.214968 0.009999 2.399549 +v -2.307259 0.009999 2.399549 +v -2.491840 0.009999 1.568936 +v -2.399549 0.009999 1.568936 +v -2.399549 0.009999 1.476646 +v -2.491840 0.009999 1.476646 +v -2.491840 0.009999 1.753517 +v -2.399549 0.009999 1.753517 +v -2.399549 0.009999 1.661226 +v -2.491840 0.009999 1.661226 +v -2.307259 0.009999 1.753517 +v -2.214968 0.009999 1.753517 +v -2.214968 0.009999 1.661226 +v -2.307259 0.009999 1.661226 +v -0.276871 0.009999 2.307259 +v -0.184581 0.009999 2.307259 +v -0.184581 0.009999 2.214968 +v -0.276871 0.009999 2.214968 +v -0.276871 0.009999 2.491840 +v -0.184581 0.009999 2.491840 +v -0.184581 0.009999 2.399549 +v -0.276871 0.009999 2.399549 +v -0.092290 0.009999 2.491840 +v 0.000000 0.009999 2.491840 +v 0.000000 0.009999 2.399549 +v -0.092290 0.009999 2.399549 +v -1.015194 0.009999 2.307259 +v -0.922904 0.009999 2.307259 +v -0.922904 0.009999 2.214968 +v -1.015194 0.009999 2.214968 +v -1.015194 0.009999 2.491840 +v -0.922904 0.009999 2.491840 +v -0.922904 0.009999 2.399549 +v -1.015194 0.009999 2.399549 +v -0.830613 0.009999 2.491840 +v -0.738323 0.009999 2.491840 +v -0.738323 0.009999 2.399549 +v -0.830613 0.009999 2.399549 +v -1.015194 0.009999 1.568936 +v -0.922904 0.009999 1.568936 +v -0.922904 0.009999 1.476646 +v -1.015194 0.009999 1.476646 +v -1.015194 0.009999 1.753517 +v -0.922904 0.009999 1.753517 +v -0.922904 0.009999 1.661226 +v -1.015194 0.009999 1.661226 +v -0.830613 0.009999 1.753517 +v -0.738323 0.009999 1.753517 +v -0.738323 0.009999 1.661226 +v -0.830613 0.009999 1.661226 +v -1.753517 0.010002 -5.075970 +v -1.661226 0.010002 -5.075970 +v -1.661226 0.010002 -5.168260 +v -1.753517 0.010002 -5.168260 +v -1.753517 0.010002 -4.891389 +v -1.661226 0.010002 -4.891389 +v -1.661226 0.010002 -4.983679 +v -1.753517 0.010002 -4.983679 +v -1.568936 0.010002 -4.891389 +v -1.476646 0.010002 -4.891389 +v -1.476646 0.010002 -4.983679 +v -1.568936 0.010002 -4.983679 +v -2.491840 0.010002 -5.075970 +v -2.399549 0.010002 -5.075970 +v -2.399549 0.010002 -5.168260 +v -2.491840 0.010002 -5.168260 +v -2.491840 0.010002 -4.891389 +v -2.399549 0.010002 -4.891389 +v -2.399549 0.010002 -4.983679 +v -2.491840 0.010002 -4.983679 +v -2.307259 0.010002 -4.891389 +v -2.214968 0.010002 -4.891389 +v -2.214968 0.010002 -4.983679 +v -2.307259 0.010002 -4.983679 +v -2.491840 0.010002 -5.814293 +v -2.399549 0.010002 -5.814293 +v -2.399549 0.010002 -5.906583 +v -2.491840 0.010002 -5.906583 +v -2.491840 0.010002 -5.629711 +v -2.399549 0.010002 -5.629711 +v -2.399549 0.010002 -5.722002 +v -2.491840 0.010002 -5.722002 +v -2.307259 0.010002 -5.629711 +v -2.214968 0.010002 -5.629711 +v -2.214968 0.010002 -5.722002 +v -2.307259 0.010002 -5.722002 +v -1.753517 0.010001 -3.599324 +v -1.661226 0.010001 -3.599324 +v -1.661226 0.010002 -3.691614 +v -1.753517 0.010002 -3.691614 +v -1.753517 0.010001 -3.414743 +v -1.661226 0.010001 -3.414743 +v -1.661226 0.010001 -3.507033 +v -1.753517 0.010001 -3.507033 +v -1.568936 0.010001 -3.414743 +v -1.476646 0.010001 -3.414743 +v -1.476646 0.010001 -3.507033 +v -1.568936 0.010001 -3.507033 +v -2.491840 0.010001 -3.599324 +v -2.399549 0.010001 -3.599324 +v -2.399549 0.010002 -3.691614 +v -2.491840 0.010002 -3.691614 +v -2.491840 0.010001 -3.414743 +v -2.399549 0.010001 -3.414743 +v -2.399549 0.010001 -3.507033 +v -2.491840 0.010001 -3.507033 +v -2.307259 0.010001 -3.414743 +v -2.214968 0.010001 -3.414743 +v -2.214968 0.010001 -3.507033 +v -2.307259 0.010001 -3.507033 +v -2.491840 0.010002 -4.337647 +v -2.399549 0.010002 -4.337647 +v -2.399549 0.010002 -4.429937 +v -2.491840 0.010002 -4.429937 +v -2.491840 0.010002 -4.153066 +v -2.399549 0.010002 -4.153066 +v -2.399549 0.010002 -4.245357 +v -2.491840 0.010002 -4.245357 +v -2.307259 0.010002 -4.153066 +v -2.214968 0.010002 -4.153066 +v -2.214968 0.010002 -4.245357 +v -2.307259 0.010002 -4.245357 +v -0.276871 0.010001 -3.599324 +v -0.184581 0.010001 -3.599324 +v -0.184581 0.010002 -3.691614 +v -0.276871 0.010002 -3.691614 +v -0.276871 0.010001 -3.414743 +v -0.184581 0.010001 -3.414743 +v -0.184581 0.010001 -3.507033 +v -0.276871 0.010001 -3.507033 +v -0.092290 0.010001 -3.414743 +v 0.000000 0.010001 -3.414743 +v 0.000000 0.010001 -3.507033 +v -0.092290 0.010001 -3.507033 +v -1.015194 0.010001 -3.599324 +v -0.922904 0.010001 -3.599324 +v -0.922904 0.010002 -3.691614 +v -1.015194 0.010002 -3.691614 +v -1.015194 0.010001 -3.414743 +v -0.922904 0.010001 -3.414743 +v -0.922904 0.010001 -3.507033 +v -1.015194 0.010001 -3.507033 +v -0.830613 0.010001 -3.414743 +v -0.738323 0.010001 -3.414743 +v -0.738323 0.010001 -3.507033 +v -0.830613 0.010001 -3.507033 +v -1.015194 0.010002 -4.337647 +v -0.922904 0.010002 -4.337647 +v -0.922904 0.010002 -4.429937 +v -1.015194 0.010002 -4.429937 +v -1.015194 0.010002 -4.153066 +v -0.922904 0.010002 -4.153066 +v -0.922904 0.010002 -4.245357 +v -1.015194 0.010002 -4.245357 +v -0.830613 0.010002 -4.153066 +v -0.738323 0.010002 -4.153066 +v -0.738323 0.010002 -4.245357 +v -0.830613 0.010002 -4.245357 +v 4.153066 0.010002 -5.075970 +v 4.245357 0.010002 -5.075970 +v 4.245357 0.010002 -5.168260 +v 4.153066 0.010002 -5.168260 +v 4.153066 0.010002 -4.891389 +v 4.245357 0.010002 -4.891389 +v 4.245357 0.010002 -4.983679 +v 4.153066 0.010002 -4.983679 +v 4.337647 0.010002 -4.891389 +v 4.429937 0.010002 -4.891389 +v 4.429937 0.010002 -4.983679 +v 4.337647 0.010002 -4.983679 +v 3.414743 0.010002 -5.075970 +v 3.507033 0.010002 -5.075970 +v 3.507033 0.010002 -5.168260 +v 3.414743 0.010002 -5.168260 +v 3.414743 0.010002 -4.891389 +v 3.507033 0.010002 -4.891389 +v 3.507033 0.010002 -4.983679 +v 3.414743 0.010002 -4.983679 +v 3.599324 0.010002 -4.891389 +v 3.691614 0.010002 -4.891389 +v 3.691614 0.010002 -4.983679 +v 3.599324 0.010002 -4.983679 +v 3.414743 0.010002 -5.814293 +v 3.507033 0.010002 -5.814293 +v 3.507033 0.010002 -5.906583 +v 3.414743 0.010002 -5.906583 +v 3.414743 0.010002 -5.629711 +v 3.507033 0.010002 -5.629711 +v 3.507033 0.010002 -5.722002 +v 3.414743 0.010002 -5.722002 +v 3.599324 0.010002 -5.629711 +v 3.691614 0.010002 -5.629711 +v 3.691614 0.010002 -5.722002 +v 3.599324 0.010002 -5.722002 +v 4.153066 0.010001 -3.599324 +v 4.245357 0.010001 -3.599324 +v 4.245357 0.010002 -3.691614 +v 4.153066 0.010002 -3.691614 +v 4.153066 0.010001 -3.414743 +v 4.245357 0.010001 -3.414743 +v 4.245357 0.010001 -3.507033 +v 4.153066 0.010001 -3.507033 +v 4.337647 0.010001 -3.414743 +v 4.429937 0.010001 -3.414743 +v 4.429937 0.010001 -3.507033 +v 4.337647 0.010001 -3.507033 +v 3.414743 0.010001 -3.599324 +v 3.507033 0.010001 -3.599324 +v 3.507033 0.010002 -3.691614 +v 3.414743 0.010002 -3.691614 +v 3.414743 0.010001 -3.414743 +v 3.507033 0.010001 -3.414743 +v 3.507033 0.010001 -3.507033 +v 3.414743 0.010001 -3.507033 +v 3.599324 0.010001 -3.414743 +v 3.691614 0.010001 -3.414743 +v 3.691614 0.010001 -3.507033 +v 3.599324 0.010001 -3.507033 +v 3.414743 0.010002 -4.337647 +v 3.507033 0.010002 -4.337647 +v 3.507033 0.010002 -4.429937 +v 3.414743 0.010002 -4.429937 +v 3.414743 0.010002 -4.153066 +v 3.507033 0.010002 -4.153066 +v 3.507033 0.010002 -4.245357 +v 3.414743 0.010002 -4.245357 +v 3.599324 0.010002 -4.153066 +v 3.691614 0.010002 -4.153066 +v 3.691614 0.010002 -4.245357 +v 3.599324 0.010002 -4.245357 +v 5.629711 0.010001 -3.599324 +v 5.722002 0.010001 -3.599324 +v 5.722002 0.010002 -3.691614 +v 5.629711 0.010002 -3.691614 +v 5.629711 0.010001 -3.414743 +v 5.722002 0.010001 -3.414743 +v 5.722002 0.010001 -3.507033 +v 5.629711 0.010001 -3.507033 +v 5.814293 0.010001 -3.414743 +v 5.906583 0.010001 -3.414743 +v 5.906583 0.010001 -3.507033 +v 5.814293 0.010001 -3.507033 +v 4.891389 0.010001 -3.599324 +v 4.983679 0.010001 -3.599324 +v 4.983679 0.010002 -3.691614 +v 4.891389 0.010002 -3.691614 +v 4.891389 0.010001 -3.414743 +v 4.983679 0.010001 -3.414743 +v 4.983679 0.010001 -3.507033 +v 4.891389 0.010001 -3.507033 +v 5.075970 0.010001 -3.414743 +v 5.168260 0.010001 -3.414743 +v 5.168260 0.010001 -3.507033 +v 5.075970 0.010001 -3.507033 +v 4.891389 0.010002 -4.337647 +v 4.983679 0.010002 -4.337647 +v 4.983679 0.010002 -4.429937 +v 4.891389 0.010002 -4.429937 +v 4.891389 0.010002 -4.153066 +v 4.983679 0.010002 -4.153066 +v 4.983679 0.010002 -4.245357 +v 4.891389 0.010002 -4.245357 +v 5.075970 0.010002 -4.153066 +v 5.168260 0.010002 -4.153066 +v 5.168260 0.010002 -4.245357 +v 5.075970 0.010002 -4.245357 +v 5.629711 0.010002 -4.337647 +v 5.722002 0.010002 -4.337647 +v 5.722002 0.010002 -4.429937 +v 5.629711 0.010002 -4.429937 +v 5.629711 0.010002 -4.153066 +v 5.722002 0.010002 -4.153066 +v 5.722002 0.010002 -4.245357 +v 5.629711 0.010002 -4.245357 +v 5.814293 0.010002 -4.153066 +v 5.906583 0.010002 -4.153066 +v 5.906583 0.010002 -4.245357 +v 5.814293 0.010002 -4.245357 +v 4.153066 0.010002 -4.337647 +v 4.245357 0.010002 -4.337647 +v 4.245357 0.010002 -4.429937 +v 4.153066 0.010002 -4.429937 +v 4.153066 0.010002 -4.153066 +v 4.245357 0.010002 -4.153066 +v 4.245357 0.010002 -4.245357 +v 4.153066 0.010002 -4.245357 +v 4.337647 0.010002 -4.153066 +v 4.429937 0.010002 -4.153066 +v 4.429937 0.010002 -4.245357 +v 4.337647 0.010002 -4.245357 +v 4.153066 0.010002 -5.814293 +v 4.245357 0.010002 -5.814293 +v 4.245357 0.010002 -5.906583 +v 4.153066 0.010002 -5.906583 +v 4.153066 0.010002 -5.629711 +v 4.245357 0.010002 -5.629711 +v 4.245357 0.010002 -5.722002 +v 4.153066 0.010002 -5.722002 +v 4.337647 0.010002 -5.629711 +v 4.429937 0.010002 -5.629711 +v 4.429937 0.010002 -5.722002 +v 4.337647 0.010002 -5.722002 +v -0.276871 0.010002 -4.337647 +v -0.184581 0.010002 -4.337647 +v -0.184581 0.010002 -4.429937 +v -0.276871 0.010002 -4.429937 +v -0.276871 0.010002 -4.153066 +v -0.184581 0.010002 -4.153066 +v -0.184581 0.010002 -4.245357 +v -0.276871 0.010002 -4.245357 +v -0.092290 0.010002 -4.153066 +v 0.000000 0.010002 -4.153066 +v 0.000000 0.010002 -4.245357 +v -0.092290 0.010002 -4.245357 +v -1.753517 0.010002 -4.337647 +v -1.661226 0.010002 -4.337647 +v -1.661226 0.010002 -4.429937 +v -1.753517 0.010002 -4.429937 +v -1.753517 0.010002 -4.153066 +v -1.661226 0.010002 -4.153066 +v -1.661226 0.010002 -4.245357 +v -1.753517 0.010002 -4.245357 +v -1.568936 0.010002 -4.153066 +v -1.476646 0.010002 -4.153066 +v -1.476646 0.010002 -4.245357 +v -1.568936 0.010002 -4.245357 +v -1.753517 0.010002 -5.814293 +v -1.661226 0.010002 -5.814293 +v -1.661226 0.010002 -5.906583 +v -1.753517 0.010002 -5.906583 +v -1.753517 0.010002 -5.629711 +v -1.661226 0.010002 -5.629711 +v -1.661226 0.010002 -5.722002 +v -1.753517 0.010002 -5.722002 +v -1.568936 0.010002 -5.629711 +v -1.476646 0.010002 -5.629711 +v -1.476646 0.010002 -5.722002 +v -1.568936 0.010002 -5.722002 +v -0.276871 0.009999 1.568936 +v -0.184581 0.009999 1.568936 +v -0.184581 0.009999 1.476646 +v -0.276871 0.009999 1.476646 +v -0.276871 0.009999 1.753517 +v -0.184581 0.009999 1.753517 +v -0.184581 0.009999 1.661226 +v -0.276871 0.009999 1.661226 +v -0.092290 0.009999 1.753517 +v 0.000000 0.009999 1.753517 +v 0.000000 0.009999 1.661226 +v -0.092290 0.009999 1.661226 +v -1.753517 0.009999 1.568936 +v -1.661226 0.009999 1.568936 +v -1.661226 0.009999 1.476646 +v -1.753517 0.009999 1.476646 +v -1.753517 0.009999 1.753517 +v -1.661226 0.009999 1.753517 +v -1.661226 0.009999 1.661226 +v -1.753517 0.009999 1.661226 +v -1.568936 0.009999 1.753517 +v -1.476646 0.009999 1.753517 +v -1.476646 0.009999 1.661226 +v -1.568936 0.009999 1.661226 +v -1.753517 0.010000 0.092290 +v -1.661226 0.010000 0.092290 +v -1.661226 0.010000 -0.000000 +v -1.753517 0.010000 -0.000000 +v -1.753517 0.010000 0.276871 +v -1.661226 0.010000 0.276871 +v -1.661226 0.010000 0.184581 +v -1.753517 0.010000 0.184581 +v -1.568936 0.010000 0.276871 +v -1.476646 0.010000 0.276871 +v -1.476646 0.010000 0.184581 +v -1.568936 0.010000 0.184581 +v 5.629711 0.009999 1.568936 +v 5.722002 0.009999 1.568936 +v 5.722002 0.009999 1.476646 +v 5.629711 0.009999 1.476646 +v 5.629711 0.009999 1.753517 +v 5.722002 0.009999 1.753517 +v 5.722002 0.009999 1.661226 +v 5.629711 0.009999 1.661226 +v 5.814293 0.009999 1.753517 +v 5.906583 0.009999 1.753517 +v 5.906583 0.009999 1.661226 +v 5.814293 0.009999 1.661226 +v 4.153066 0.009999 1.568936 +v 4.245357 0.009999 1.568936 +v 4.245357 0.009999 1.476646 +v 4.153066 0.009999 1.476646 +v 4.153066 0.009999 1.753517 +v 4.245357 0.009999 1.753517 +v 4.245357 0.009999 1.661226 +v 4.153066 0.009999 1.661226 +v 4.337647 0.009999 1.753517 +v 4.429937 0.009999 1.753517 +v 4.429937 0.009999 1.661226 +v 4.337647 0.009999 1.661226 +v 4.153066 0.010000 0.092290 +v 4.245357 0.010000 0.092290 +v 4.245357 0.010000 -0.000000 +v 4.153066 0.010000 -0.000000 +v 4.153066 0.010000 0.276871 +v 4.245357 0.010000 0.276871 +v 4.245357 0.010000 0.184581 +v 4.153066 0.010000 0.184581 +v 4.337647 0.010000 0.276871 +v 4.429937 0.010000 0.276871 +v 4.429937 0.010000 0.184581 +v 4.337647 0.010000 0.184581 +v 2.676420 0.009999 1.568936 +v 2.768711 0.009999 1.568936 +v 2.768711 0.009999 1.476646 +v 2.676420 0.009999 1.476646 +v 2.676420 0.009999 1.753517 +v 2.768711 0.009999 1.753517 +v 2.768711 0.009999 1.661226 +v 2.676420 0.009999 1.661226 +v 2.861001 0.009999 1.753517 +v 2.953291 0.009999 1.753517 +v 2.953291 0.009999 1.661226 +v 2.861001 0.009999 1.661226 +v 1.199775 0.009999 1.568936 +v 1.292065 0.009999 1.568936 +v 1.292065 0.009999 1.476646 +v 1.199775 0.009999 1.476646 +v 1.199775 0.009999 1.753517 +v 1.292065 0.009999 1.753517 +v 1.292065 0.009999 1.661226 +v 1.199775 0.009999 1.661226 +v 1.384355 0.009999 1.753517 +v 1.476646 0.009999 1.753517 +v 1.476646 0.009999 1.661226 +v 1.384355 0.009999 1.661226 +v 1.199775 0.010000 0.092290 +v 1.292065 0.010000 0.092290 +v 1.292065 0.010000 -0.000000 +v 1.199775 0.010000 -0.000000 +v 1.199775 0.010000 0.276871 +v 1.292065 0.010000 0.276871 +v 1.292065 0.010000 0.184581 +v 1.199775 0.010000 0.184581 +v 1.384355 0.010000 0.276871 +v 1.476646 0.010000 0.276871 +v 1.476646 0.010000 0.184581 +v 1.384355 0.010000 0.184581 +v 2.676420 0.009998 4.522227 +v 2.768711 0.009998 4.522227 +v 2.768711 0.009998 4.429937 +v 2.676420 0.009998 4.429937 +v 2.676420 0.009998 4.706808 +v 2.768711 0.009998 4.706808 +v 2.768711 0.009998 4.614518 +v 2.676420 0.009998 4.614518 +v 2.861001 0.009998 4.706808 +v 2.953291 0.009998 4.706808 +v 2.953291 0.009998 4.614518 +v 2.861001 0.009998 4.614518 +v 1.199775 0.009998 4.522227 +v 1.292065 0.009998 4.522227 +v 1.292065 0.009998 4.429937 +v 1.199775 0.009998 4.429937 +v 1.199775 0.009998 4.706808 +v 1.292065 0.009998 4.706808 +v 1.292065 0.009998 4.614518 +v 1.199775 0.009998 4.614518 +v 1.384355 0.009998 4.706808 +v 1.476646 0.009998 4.706808 +v 1.476646 0.009998 4.614518 +v 1.384355 0.009998 4.614518 +v 1.199775 0.009999 3.045582 +v 1.292065 0.009999 3.045582 +v 1.292065 0.009999 2.953291 +v 1.199775 0.009999 2.953291 +v 1.199775 0.009999 3.230163 +v 1.292065 0.009999 3.230163 +v 1.292065 0.009999 3.137872 +v 1.199775 0.009999 3.137872 +v 1.384355 0.009999 3.230163 +v 1.476646 0.009999 3.230163 +v 1.476646 0.009999 3.137872 +v 1.384355 0.009999 3.137872 +v 5.629711 0.009998 4.522227 +v 5.722002 0.009998 4.522227 +v 5.722002 0.009998 4.429937 +v 5.629711 0.009998 4.429937 +v 5.629711 0.009998 4.706808 +v 5.722002 0.009998 4.706808 +v 5.722002 0.009998 4.614518 +v 5.629711 0.009998 4.614518 +v 5.814293 0.009998 4.706808 +v 5.906583 0.009998 4.706808 +v 5.906583 0.009998 4.614518 +v 5.814293 0.009998 4.614518 +v 4.153066 0.009998 4.522227 +v 4.245357 0.009998 4.522227 +v 4.245357 0.009998 4.429937 +v 4.153066 0.009998 4.429937 +v 4.153066 0.009998 4.706808 +v 4.245357 0.009998 4.706808 +v 4.245357 0.009998 4.614518 +v 4.153066 0.009998 4.614518 +v 4.337647 0.009998 4.706808 +v 4.429937 0.009998 4.706808 +v 4.429937 0.009998 4.614518 +v 4.337647 0.009998 4.614518 +v 4.153066 0.009999 3.045582 +v 4.245357 0.009999 3.045582 +v 4.245357 0.009999 2.953291 +v 4.153066 0.009999 2.953291 +v 4.153066 0.009999 3.230163 +v 4.245357 0.009999 3.230163 +v 4.245357 0.009999 3.137872 +v 4.153066 0.009999 3.137872 +v 4.337647 0.009999 3.230163 +v 4.429937 0.009999 3.230163 +v 4.429937 0.009999 3.137872 +v 4.337647 0.009999 3.137872 +v -3.230163 0.009999 1.568936 +v -3.137872 0.009999 1.568936 +v -3.137872 0.009999 1.476646 +v -3.230163 0.009999 1.476646 +v -3.230163 0.009999 1.753517 +v -3.137872 0.009999 1.753517 +v -3.137872 0.009999 1.661226 +v -3.230163 0.009999 1.661226 +v -3.045582 0.009999 1.753517 +v -2.953291 0.009999 1.753517 +v -2.953291 0.009999 1.661226 +v -3.045582 0.009999 1.661226 +v -4.706808 0.009999 1.568936 +v -4.614518 0.009999 1.568936 +v -4.614518 0.009999 1.476646 +v -4.706808 0.009999 1.476646 +v -4.706808 0.009999 1.753517 +v -4.614518 0.009999 1.753517 +v -4.614518 0.009999 1.661226 +v -4.706808 0.009999 1.661226 +v -4.522227 0.009999 1.753517 +v -4.429937 0.009999 1.753517 +v -4.429937 0.009999 1.661226 +v -4.522227 0.009999 1.661226 +v -4.706808 0.010000 0.092290 +v -4.614518 0.010000 0.092290 +v -4.614518 0.010000 -0.000000 +v -4.706808 0.010000 -0.000000 +v -4.706808 0.010000 0.276871 +v -4.614518 0.010000 0.276871 +v -4.614518 0.010000 0.184581 +v -4.706808 0.010000 0.184581 +v -4.522227 0.010000 0.276871 +v -4.429937 0.010000 0.276871 +v -4.429937 0.010000 0.184581 +v -4.522227 0.010000 0.184581 +v -3.230163 0.009998 4.522227 +v -3.137872 0.009998 4.522227 +v -3.137872 0.009998 4.429937 +v -3.230163 0.009998 4.429937 +v -3.230163 0.009998 4.706808 +v -3.137872 0.009998 4.706808 +v -3.137872 0.009998 4.614518 +v -3.230163 0.009998 4.614518 +v -3.045582 0.009998 4.706808 +v -2.953291 0.009998 4.706808 +v -2.953291 0.009998 4.614518 +v -3.045582 0.009998 4.614518 +v -4.706808 0.009998 4.522227 +v -4.614518 0.009998 4.522227 +v -4.614518 0.009998 4.429937 +v -4.706808 0.009998 4.429937 +v -4.706808 0.009998 4.706808 +v -4.614518 0.009998 4.706808 +v -4.614518 0.009998 4.614518 +v -4.706808 0.009998 4.614518 +v -4.522227 0.009998 4.706808 +v -4.429937 0.009998 4.706808 +v -4.429937 0.009998 4.614518 +v -4.522227 0.009998 4.614518 +v -4.706808 0.009999 3.045582 +v -4.614518 0.009999 3.045582 +v -4.614518 0.009999 2.953291 +v -4.706808 0.009999 2.953291 +v -4.706808 0.009999 3.230163 +v -4.614518 0.009999 3.230163 +v -4.614518 0.009999 3.137872 +v -4.706808 0.009999 3.137872 +v -4.522227 0.009999 3.230163 +v -4.429937 0.009999 3.230163 +v -4.429937 0.009999 3.137872 +v -4.522227 0.009999 3.137872 +v -0.276871 0.009998 4.522227 +v -0.184581 0.009998 4.522227 +v -0.184581 0.009998 4.429937 +v -0.276871 0.009998 4.429937 +v -0.276871 0.009998 4.706808 +v -0.184581 0.009998 4.706808 +v -0.184581 0.009998 4.614518 +v -0.276871 0.009998 4.614518 +v -0.092290 0.009998 4.706808 +v 0.000000 0.009998 4.706808 +v 0.000000 0.009998 4.614518 +v -0.092290 0.009998 4.614518 +v -1.753517 0.009998 4.522227 +v -1.661226 0.009998 4.522227 +v -1.661226 0.009998 4.429937 +v -1.753517 0.009998 4.429937 +v -1.753517 0.009998 4.706808 +v -1.661226 0.009998 4.706808 +v -1.661226 0.009998 4.614518 +v -1.753517 0.009998 4.614518 +v -1.568936 0.009998 4.706808 +v -1.476646 0.009998 4.706808 +v -1.476646 0.009998 4.614518 +v -1.568936 0.009998 4.614518 +v -1.753517 0.009999 3.045582 +v -1.661226 0.009999 3.045582 +v -1.661226 0.009999 2.953291 +v -1.753517 0.009999 2.953291 +v -1.753517 0.009999 3.230163 +v -1.661226 0.009999 3.230163 +v -1.661226 0.009999 3.137872 +v -1.753517 0.009999 3.137872 +v -1.568936 0.009999 3.230163 +v -1.476646 0.009999 3.230163 +v -1.476646 0.009999 3.137872 +v -1.568936 0.009999 3.137872 +v -3.230163 0.010002 -4.337647 +v -3.137872 0.010002 -4.337647 +v -3.137872 0.010002 -4.429937 +v -3.230163 0.010002 -4.429937 +v -3.230163 0.010002 -4.153066 +v -3.137872 0.010002 -4.153066 +v -3.137872 0.010002 -4.245357 +v -3.230163 0.010002 -4.245357 +v -3.045582 0.010002 -4.153066 +v -2.953291 0.010002 -4.153066 +v -2.953291 0.010002 -4.245357 +v -3.045582 0.010002 -4.245357 +v -4.706808 0.010002 -4.337647 +v -4.614518 0.010002 -4.337647 +v -4.614518 0.010002 -4.429937 +v -4.706808 0.010002 -4.429937 +v -4.706808 0.010002 -4.153066 +v -4.614518 0.010002 -4.153066 +v -4.614518 0.010002 -4.245357 +v -4.706808 0.010002 -4.245357 +v -4.522227 0.010002 -4.153066 +v -4.429937 0.010002 -4.153066 +v -4.429937 0.010002 -4.245357 +v -4.522227 0.010002 -4.245357 +v -4.706808 0.010002 -5.814293 +v -4.614518 0.010002 -5.814293 +v -4.614518 0.010002 -5.906583 +v -4.706808 0.010002 -5.906583 +v -4.706808 0.010002 -5.629711 +v -4.614518 0.010002 -5.629711 +v -4.614518 0.010002 -5.722002 +v -4.706808 0.010002 -5.722002 +v -4.522227 0.010002 -5.629711 +v -4.429937 0.010002 -5.629711 +v -4.429937 0.010002 -5.722002 +v -4.522227 0.010002 -5.722002 +v -3.230163 0.010001 -1.384355 +v -3.137872 0.010001 -1.384355 +v -3.137872 0.010001 -1.476646 +v -3.230163 0.010001 -1.476646 +v -3.230163 0.010000 -1.199775 +v -3.137872 0.010000 -1.199775 +v -3.137872 0.010001 -1.292065 +v -3.230163 0.010001 -1.292065 +v -3.045582 0.010000 -1.199775 +v -2.953291 0.010000 -1.199775 +v -2.953291 0.010001 -1.292065 +v -3.045582 0.010001 -1.292065 +v -4.706808 0.010001 -1.384355 +v -4.614518 0.010001 -1.384355 +v -4.614518 0.010001 -1.476646 +v -4.706808 0.010001 -1.476646 +v -4.706808 0.010000 -1.199775 +v -4.614518 0.010000 -1.199775 +v -4.614518 0.010001 -1.292065 +v -4.706808 0.010001 -1.292065 +v -4.522227 0.010000 -1.199775 +v -4.429937 0.010000 -1.199775 +v -4.429937 0.010001 -1.292065 +v -4.522227 0.010001 -1.292065 +v -4.706808 0.010001 -2.861001 +v -4.614518 0.010001 -2.861001 +v -4.614518 0.010001 -2.953291 +v -4.706808 0.010001 -2.953291 +v -4.706808 0.010001 -2.676420 +v -4.614518 0.010001 -2.676420 +v -4.614518 0.010001 -2.768711 +v -4.706808 0.010001 -2.768711 +v -4.522227 0.010001 -2.676420 +v -4.429937 0.010001 -2.676420 +v -4.429937 0.010001 -2.768711 +v -4.522227 0.010001 -2.768711 +v -0.276871 0.010001 -1.384355 +v -0.184581 0.010001 -1.384355 +v -0.184581 0.010001 -1.476646 +v -0.276871 0.010001 -1.476646 +v -0.276871 0.010000 -1.199775 +v -0.184581 0.010000 -1.199775 +v -0.184581 0.010001 -1.292065 +v -0.276871 0.010001 -1.292065 +v -0.092290 0.010000 -1.199775 +v 0.000000 0.010000 -1.199775 +v 0.000000 0.010001 -1.292065 +v -0.092290 0.010001 -1.292065 +v -1.753517 0.010001 -1.384355 +v -1.661226 0.010001 -1.384355 +v -1.661226 0.010001 -1.476646 +v -1.753517 0.010001 -1.476646 +v -1.753517 0.010000 -1.199775 +v -1.661226 0.010000 -1.199775 +v -1.661226 0.010001 -1.292065 +v -1.753517 0.010001 -1.292065 +v -1.568936 0.010000 -1.199775 +v -1.476646 0.010000 -1.199775 +v -1.476646 0.010001 -1.292065 +v -1.568936 0.010001 -1.292065 +v -1.753517 0.010001 -2.861001 +v -1.661226 0.010001 -2.861001 +v -1.661226 0.010001 -2.953291 +v -1.753517 0.010001 -2.953291 +v -1.753517 0.010001 -2.676420 +v -1.661226 0.010001 -2.676420 +v -1.661226 0.010001 -2.768711 +v -1.753517 0.010001 -2.768711 +v -1.568936 0.010001 -2.676420 +v -1.476646 0.010001 -2.676420 +v -1.476646 0.010001 -2.768711 +v -1.568936 0.010001 -2.768711 +v 2.676420 0.010002 -4.337647 +v 2.768711 0.010002 -4.337647 +v 2.768711 0.010002 -4.429937 +v 2.676420 0.010002 -4.429937 +v 2.676420 0.010002 -4.153066 +v 2.768711 0.010002 -4.153066 +v 2.768711 0.010002 -4.245357 +v 2.676420 0.010002 -4.245357 +v 2.861001 0.010002 -4.153066 +v 2.953291 0.010002 -4.153066 +v 2.953291 0.010002 -4.245357 +v 2.861001 0.010002 -4.245357 +v 1.199775 0.010002 -4.337647 +v 1.292065 0.010002 -4.337647 +v 1.292065 0.010002 -4.429937 +v 1.199775 0.010002 -4.429937 +v 1.199775 0.010002 -4.153066 +v 1.292065 0.010002 -4.153066 +v 1.292065 0.010002 -4.245357 +v 1.199775 0.010002 -4.245357 +v 1.384355 0.010002 -4.153066 +v 1.476646 0.010002 -4.153066 +v 1.476646 0.010002 -4.245357 +v 1.384355 0.010002 -4.245357 +v 1.199775 0.010002 -5.814293 +v 1.292065 0.010002 -5.814293 +v 1.292065 0.010002 -5.906583 +v 1.199775 0.010002 -5.906583 +v 1.199775 0.010002 -5.629711 +v 1.292065 0.010002 -5.629711 +v 1.292065 0.010002 -5.722002 +v 1.199775 0.010002 -5.722002 +v 1.384355 0.010002 -5.629711 +v 1.476646 0.010002 -5.629711 +v 1.476646 0.010002 -5.722002 +v 1.384355 0.010002 -5.722002 +v 2.676420 0.010001 -1.384355 +v 2.768711 0.010001 -1.384355 +v 2.768711 0.010001 -1.476646 +v 2.676420 0.010001 -1.476646 +v 2.676420 0.010000 -1.199775 +v 2.768711 0.010000 -1.199775 +v 2.768711 0.010001 -1.292065 +v 2.676420 0.010001 -1.292065 +v 2.861001 0.010000 -1.199775 +v 2.953291 0.010000 -1.199775 +v 2.953291 0.010001 -1.292065 +v 2.861001 0.010001 -1.292065 +v 1.199775 0.010001 -1.384355 +v 1.292065 0.010001 -1.384355 +v 1.292065 0.010001 -1.476646 +v 1.199775 0.010001 -1.476646 +v 1.199775 0.010000 -1.199775 +v 1.292065 0.010000 -1.199775 +v 1.292065 0.010001 -1.292065 +v 1.199775 0.010001 -1.292065 +v 1.384355 0.010000 -1.199775 +v 1.476646 0.010000 -1.199775 +v 1.476646 0.010001 -1.292065 +v 1.384355 0.010001 -1.292065 +v 1.199775 0.010001 -2.861001 +v 1.292065 0.010001 -2.861001 +v 1.292065 0.010001 -2.953291 +v 1.199775 0.010001 -2.953291 +v 1.199775 0.010001 -2.676420 +v 1.292065 0.010001 -2.676420 +v 1.292065 0.010001 -2.768711 +v 1.199775 0.010001 -2.768711 +v 1.384355 0.010001 -2.676420 +v 1.476646 0.010001 -2.676420 +v 1.476646 0.010001 -2.768711 +v 1.384355 0.010001 -2.768711 +v 5.629711 0.010001 -1.384355 +v 5.722002 0.010001 -1.384355 +v 5.722002 0.010001 -1.476646 +v 5.629711 0.010001 -1.476646 +v 5.629711 0.010000 -1.199775 +v 5.722002 0.010000 -1.199775 +v 5.722002 0.010001 -1.292065 +v 5.629711 0.010001 -1.292065 +v 5.814293 0.010000 -1.199775 +v 5.906583 0.010000 -1.199775 +v 5.906583 0.010001 -1.292065 +v 5.814293 0.010001 -1.292065 +v 4.153066 0.010001 -1.384355 +v 4.245357 0.010001 -1.384355 +v 4.245357 0.010001 -1.476646 +v 4.153066 0.010001 -1.476646 +v 4.153066 0.010000 -1.199775 +v 4.245357 0.010000 -1.199775 +v 4.245357 0.010001 -1.292065 +v 4.153066 0.010001 -1.292065 +v 4.337647 0.010000 -1.199775 +v 4.429937 0.010000 -1.199775 +v 4.429937 0.010001 -1.292065 +v 4.337647 0.010001 -1.292065 +v 4.153066 0.010001 -2.861001 +v 4.245357 0.010001 -2.861001 +v 4.245357 0.010001 -2.953291 +v 4.153066 0.010001 -2.953291 +v 4.153066 0.010001 -2.676420 +v 4.245357 0.010001 -2.676420 +v 4.245357 0.010001 -2.768711 +v 4.153066 0.010001 -2.768711 +v 4.337647 0.010001 -2.676420 +v 4.429937 0.010001 -2.676420 +v 4.429937 0.010001 -2.768711 +v 4.337647 0.010001 -2.768711 +v 5.629711 0.010001 -2.861001 +v 5.722002 0.010001 -2.861001 +v 5.722002 0.010001 -2.953291 +v 5.629711 0.010001 -2.953291 +v 5.629711 0.010001 -2.676420 +v 5.722002 0.010001 -2.676420 +v 5.722002 0.010001 -2.768711 +v 5.629711 0.010001 -2.768711 +v 5.814293 0.010001 -2.676420 +v 5.906583 0.010001 -2.676420 +v 5.906583 0.010001 -2.768711 +v 5.814293 0.010001 -2.768711 +v 2.676420 0.010001 -2.861001 +v 2.768711 0.010001 -2.861001 +v 2.768711 0.010001 -2.953291 +v 2.676420 0.010001 -2.953291 +v 2.676420 0.010001 -2.676420 +v 2.768711 0.010001 -2.676420 +v 2.768711 0.010001 -2.768711 +v 2.676420 0.010001 -2.768711 +v 2.861001 0.010001 -2.676420 +v 2.953291 0.010001 -2.676420 +v 2.953291 0.010001 -2.768711 +v 2.861001 0.010001 -2.768711 +v 2.676420 0.010002 -5.814293 +v 2.768711 0.010002 -5.814293 +v 2.768711 0.010002 -5.906583 +v 2.676420 0.010002 -5.906583 +v 2.676420 0.010002 -5.629711 +v 2.768711 0.010002 -5.629711 +v 2.768711 0.010002 -5.722002 +v 2.676420 0.010002 -5.722002 +v 2.861001 0.010002 -5.629711 +v 2.953291 0.010002 -5.629711 +v 2.953291 0.010002 -5.722002 +v 2.861001 0.010002 -5.722002 +v -0.276871 0.010001 -2.861001 +v -0.184581 0.010001 -2.861001 +v -0.184581 0.010001 -2.953291 +v -0.276871 0.010001 -2.953291 +v -0.276871 0.010001 -2.676420 +v -0.184581 0.010001 -2.676420 +v -0.184581 0.010001 -2.768711 +v -0.276871 0.010001 -2.768711 +v -0.092290 0.010001 -2.676420 +v 0.000000 0.010001 -2.676420 +v 0.000000 0.010001 -2.768711 +v -0.092290 0.010001 -2.768711 +v -3.230163 0.010001 -2.861001 +v -3.137872 0.010001 -2.861001 +v -3.137872 0.010001 -2.953291 +v -3.230163 0.010001 -2.953291 +v -3.230163 0.010001 -2.676420 +v -3.137872 0.010001 -2.676420 +v -3.137872 0.010001 -2.768711 +v -3.230163 0.010001 -2.768711 +v -3.045582 0.010001 -2.676420 +v -2.953291 0.010001 -2.676420 +v -2.953291 0.010001 -2.768711 +v -3.045582 0.010001 -2.768711 +v -3.230163 0.010002 -5.814293 +v -3.137872 0.010002 -5.814293 +v -3.137872 0.010002 -5.906583 +v -3.230163 0.010002 -5.906583 +v -3.230163 0.010002 -5.629711 +v -3.137872 0.010002 -5.629711 +v -3.137872 0.010002 -5.722002 +v -3.230163 0.010002 -5.722002 +v -3.045582 0.010002 -5.629711 +v -2.953291 0.010002 -5.629711 +v -2.953291 0.010002 -5.722002 +v -3.045582 0.010002 -5.722002 +v -0.276871 0.009999 3.045582 +v -0.184581 0.009999 3.045582 +v -0.184581 0.009999 2.953291 +v -0.276871 0.009999 2.953291 +v -0.276871 0.009999 3.230163 +v -0.184581 0.009999 3.230163 +v -0.184581 0.009999 3.137872 +v -0.276871 0.009999 3.137872 +v -0.092290 0.009999 3.230163 +v 0.000000 0.009999 3.230163 +v 0.000000 0.009999 3.137872 +v -0.092290 0.009999 3.137872 +v -3.230163 0.009999 3.045582 +v -3.137872 0.009999 3.045582 +v -3.137872 0.009999 2.953291 +v -3.230163 0.009999 2.953291 +v -3.230163 0.009999 3.230163 +v -3.137872 0.009999 3.230163 +v -3.137872 0.009999 3.137872 +v -3.230163 0.009999 3.137872 +v -3.045582 0.009999 3.230163 +v -2.953291 0.009999 3.230163 +v -2.953291 0.009999 3.137872 +v -3.045582 0.009999 3.137872 +v -3.230163 0.010000 0.092290 +v -3.137872 0.010000 0.092290 +v -3.137872 0.010000 -0.000000 +v -3.230163 0.010000 -0.000000 +v -3.230163 0.010000 0.276871 +v -3.137872 0.010000 0.276871 +v -3.137872 0.010000 0.184581 +v -3.230163 0.010000 0.184581 +v -3.045582 0.010000 0.276871 +v -2.953291 0.010000 0.276871 +v -2.953291 0.010000 0.184581 +v -3.045582 0.010000 0.184581 +v 5.629711 0.009999 3.045582 +v 5.722002 0.009999 3.045582 +v 5.722002 0.009999 2.953291 +v 5.629711 0.009999 2.953291 +v 5.629711 0.009999 3.230163 +v 5.722002 0.009999 3.230163 +v 5.722002 0.009999 3.137872 +v 5.629711 0.009999 3.137872 +v 5.814293 0.009999 3.230163 +v 5.906583 0.009999 3.230163 +v 5.906583 0.009999 3.137872 +v 5.814293 0.009999 3.137872 +v 2.676420 0.009999 3.045582 +v 2.768711 0.009999 3.045582 +v 2.768711 0.009999 2.953291 +v 2.676420 0.009999 2.953291 +v 2.676420 0.009999 3.230163 +v 2.768711 0.009999 3.230163 +v 2.768711 0.009999 3.137872 +v 2.676420 0.009999 3.137872 +v 2.861001 0.009999 3.230163 +v 2.953291 0.009999 3.230163 +v 2.953291 0.009999 3.137872 +v 2.861001 0.009999 3.137872 +v 2.676420 0.010000 0.092290 +v 2.768711 0.010000 0.092290 +v 2.768711 0.010000 -0.000000 +v 2.676420 0.010000 -0.000000 +v 2.676420 0.010000 0.276871 +v 2.768711 0.010000 0.276871 +v 2.768711 0.010000 0.184581 +v 2.676420 0.010000 0.184581 +v 2.861001 0.010000 0.276871 +v 2.953291 0.010000 0.276871 +v 2.953291 0.010000 0.184581 +v 2.861001 0.010000 0.184581 +v 5.629711 0.010000 0.092290 +v 5.722002 0.010000 0.092290 +v 5.722002 0.010000 -0.000000 +v 5.629711 0.010000 -0.000000 +v 5.629711 0.010000 0.276871 +v 5.722002 0.010000 0.276871 +v 5.722002 0.010000 0.184581 +v 5.629711 0.010000 0.184581 +v 5.814293 0.010000 0.276871 +v 5.906583 0.010000 0.276871 +v 5.906583 0.010000 0.184581 +v 5.814293 0.010000 0.184581 +v -0.276871 0.010000 0.092290 +v -0.184581 0.010000 0.092290 +v -0.184581 0.010000 -0.000000 +v -0.276871 0.010000 -0.000000 +v -0.276871 0.010000 0.276871 +v -0.184581 0.010000 0.276871 +v -0.184581 0.010000 0.184581 +v -0.276871 0.010000 0.184581 +v -0.092290 0.010000 0.276871 +v 0.000000 0.010000 0.276871 +v 0.000000 0.010000 0.184581 +v -0.092290 0.010000 0.184581 +v -0.276871 0.010002 -5.814293 +v -0.184581 0.010002 -5.814293 +v -0.184581 0.010002 -5.906583 +v -0.276871 0.010002 -5.906583 +v -0.276871 0.010002 -5.629711 +v -0.184581 0.010002 -5.629711 +v -0.184581 0.010002 -5.722002 +v -0.276871 0.010002 -5.722002 +v -0.092290 0.010002 -5.629711 +v 0.000000 0.010002 -5.629711 +v 0.000000 0.010002 -5.722002 +v -0.092290 0.010002 -5.722002 +v 5.629711 0.010002 -5.814293 +v 5.722002 0.010002 -5.814293 +v 5.722002 0.010002 -5.906583 +v 5.629711 0.010002 -5.906583 +v 5.629711 0.010002 -5.629711 +v 5.722002 0.010002 -5.629711 +v 5.722002 0.010002 -5.722002 +v 5.629711 0.010002 -5.722002 +v 5.814293 0.010002 -5.629711 +v 5.906583 0.010002 -5.629711 +v 5.906583 0.010002 -5.722002 +v 5.814293 0.010002 -5.722002 +v -5.906583 0.010001 -1.938097 +v -5.906583 0.010001 -2.030388 +v -5.906583 0.010001 -1.845807 +v -5.906583 0.010001 -2.122678 +v -5.906583 0.010001 -2.214968 +v -5.906583 0.010001 -1.568936 +v -5.906583 0.010001 -1.661226 +v -5.906583 0.010001 -1.476646 +v -5.906583 0.010001 -1.753517 +v -5.906583 0.010001 -2.676420 +v -5.906583 0.010001 -2.768711 +v -5.906583 0.010001 -2.584130 +v -5.906583 0.010001 -2.861001 +v -5.906583 0.010001 -2.953291 +v -5.906583 0.010001 -2.307259 +v -5.906583 0.010001 -2.399549 +v -5.906583 0.010001 -2.491840 +v -5.906583 0.010000 -0.461452 +v -5.906583 0.010000 -0.553742 +v -5.906583 0.010000 -0.369161 +v -5.906583 0.010000 -0.646033 +v -5.906583 0.010000 -0.738323 +v -5.906583 0.010000 -0.092290 +v -5.906583 0.010000 -0.184581 +v -5.906583 0.010000 -0.000000 +v -5.906583 0.010000 -0.276871 +v -5.906583 0.010000 -1.199775 +v -5.906583 0.010001 -1.292065 +v -5.906583 0.010000 -1.107484 +v -5.906583 0.010001 -1.384355 +v -5.906583 0.010000 -0.830613 +v -5.906583 0.010000 -0.922904 +v -5.906583 0.010000 -1.015194 +v -5.906583 0.010002 -4.891389 +v -5.906583 0.010002 -4.983679 +v -5.906583 0.010002 -4.799098 +v -5.906583 0.010002 -5.075970 +v -5.906583 0.010002 -5.168260 +v -5.906583 0.010002 -4.522227 +v -5.906583 0.010002 -4.614518 +v -5.906583 0.010002 -4.429937 +v -5.906583 0.010002 -4.706808 +v -5.906583 0.010002 -5.629711 +v -5.906583 0.010002 -5.722002 +v -5.906583 0.010002 -5.537421 +v -5.906583 0.010002 -5.814293 +v -5.906583 0.010002 -5.906583 +v -5.906583 0.010002 -5.260550 +v -5.906583 0.010002 -5.352840 +v -5.906583 0.010002 -5.445131 +v -5.906583 0.010001 -3.414743 +v -5.906583 0.010001 -3.507033 +v -5.906583 0.010001 -3.322453 +v -5.906583 0.010001 -3.599324 +v -5.906583 0.010002 -3.691614 +v -5.906583 0.010001 -3.045582 +v -5.906583 0.010001 -3.137872 +v -5.906583 0.010001 -3.230163 +v -5.906583 0.010002 -4.153066 +v -5.906583 0.010002 -4.245357 +v -5.906583 0.010002 -4.060776 +v -5.906583 0.010002 -4.337647 +v -5.906583 0.010002 -3.783905 +v -5.906583 0.010002 -3.876195 +v -5.906583 0.010002 -3.968485 +v -2.030388 0.009998 5.906583 +v -1.938097 0.009998 5.906583 +v -1.845807 0.009998 5.906583 +v -2.214968 0.009998 5.906583 +v -2.122678 0.009998 5.906583 +v -1.661226 0.009998 5.906583 +v -1.568936 0.009998 5.906583 +v -1.476646 0.009998 5.906583 +v -1.753517 0.009998 5.906583 +v -2.768711 0.009998 5.906583 +v -2.676420 0.009998 5.906583 +v -2.584130 0.009998 5.906583 +v -2.953291 0.009998 5.906583 +v -2.861001 0.009998 5.906583 +v -2.399549 0.009998 5.906583 +v -2.307259 0.009998 5.906583 +v -2.491840 0.009998 5.906583 +v -0.553742 0.009998 5.906583 +v -0.461452 0.009998 5.906583 +v -0.369161 0.009998 5.906583 +v -0.738323 0.009998 5.906583 +v -0.646033 0.009998 5.906583 +v -0.184581 0.009998 5.906583 +v -0.092290 0.009998 5.906583 +v 0.000000 0.009998 5.906583 +v -0.276871 0.009998 5.906583 +v -1.292065 0.009998 5.906583 +v -1.199775 0.009998 5.906583 +v -1.107484 0.009998 5.906583 +v -1.384355 0.009998 5.906583 +v -0.922904 0.009998 5.906583 +v -0.830613 0.009998 5.906583 +v -1.015194 0.009998 5.906583 +v -5.906583 0.009998 3.968485 +v -5.906583 0.009998 3.876195 +v -5.906583 0.009998 4.060776 +v -5.906583 0.009998 3.783905 +v -5.906583 0.009998 3.691614 +v -5.906583 0.009998 4.337647 +v -5.906583 0.009998 4.245357 +v -5.906583 0.009998 4.429937 +v -5.906583 0.009998 4.153066 +v -5.906583 0.009999 3.230163 +v -5.906583 0.009999 3.137872 +v -5.906583 0.009999 3.322453 +v -5.906583 0.009999 3.045582 +v -5.906583 0.009999 2.953291 +v -5.906583 0.009999 3.599324 +v -5.906583 0.009999 3.507033 +v -5.906583 0.009999 3.414743 +v -4.983679 0.009998 5.906583 +v -4.891389 0.009998 5.906583 +v -4.799098 0.009998 5.906583 +v -5.168260 0.009998 5.906583 +v -5.075970 0.009998 5.906583 +v -4.614518 0.009998 5.906583 +v -4.522227 0.009998 5.906583 +v -4.429937 0.009998 5.906583 +v -4.706808 0.009998 5.906583 +v -5.906583 0.009998 5.445131 +v -5.906583 0.009998 5.352840 +v -5.906583 0.009998 5.537421 +v -5.906583 0.009998 5.260550 +v -5.906583 0.009998 5.168260 +v -5.722002 0.009998 5.906583 +v -5.629711 0.009998 5.906583 +v -5.537421 0.009998 5.906583 +v -5.906583 0.009998 5.814293 +v -5.906583 0.009998 5.722002 +v -5.906583 0.009998 5.906583 +v -5.814293 0.009998 5.906583 +v -5.906583 0.009998 5.629711 +v -5.352840 0.009998 5.906583 +v -5.260550 0.009998 5.906583 +v -5.445131 0.009998 5.906583 +v -5.906583 0.009998 4.706808 +v -5.906583 0.009998 4.614518 +v -5.906583 0.009998 4.799098 +v -5.906583 0.009998 4.522227 +v -5.906583 0.009998 5.075970 +v -5.906583 0.009998 4.983679 +v -5.906583 0.009998 4.891389 +v -3.507033 0.009998 5.906583 +v -3.414743 0.009998 5.906583 +v -3.322453 0.009998 5.906583 +v -3.691614 0.009998 5.906583 +v -3.599324 0.009998 5.906583 +v -3.137872 0.009998 5.906583 +v -3.045582 0.009998 5.906583 +v -3.230163 0.009998 5.906583 +v -4.245357 0.009998 5.906583 +v -4.153066 0.009998 5.906583 +v -4.060776 0.009998 5.906583 +v -4.337647 0.009998 5.906583 +v -3.876195 0.009998 5.906583 +v -3.783905 0.009998 5.906583 +v -3.968485 0.009998 5.906583 +v -5.906583 0.010000 1.015194 +v -5.906583 0.010000 0.922904 +v -5.906583 0.010000 1.107484 +v -5.906583 0.010000 0.830613 +v -5.906583 0.010000 0.738323 +v -5.906583 0.009999 1.384355 +v -5.906583 0.009999 1.292065 +v -5.906583 0.009999 1.476646 +v -5.906583 0.010000 1.199775 +v -5.906583 0.010000 0.276871 +v -5.906583 0.010000 0.184581 +v -5.906583 0.010000 0.369161 +v -5.906583 0.010000 0.092290 +v -5.906583 0.010000 0.646033 +v -5.906583 0.010000 0.553742 +v -5.906583 0.010000 0.461452 +v -5.906583 0.009999 2.491840 +v -5.906583 0.009999 2.399549 +v -5.906583 0.009999 2.584130 +v -5.906583 0.009999 2.307259 +v -5.906583 0.009999 2.214968 +v -5.906583 0.009999 2.861001 +v -5.906583 0.009999 2.768711 +v -5.906583 0.009999 2.676420 +v -5.906583 0.009999 1.753517 +v -5.906583 0.009999 1.661226 +v -5.906583 0.009999 1.845807 +v -5.906583 0.009999 1.568936 +v -5.906583 0.009999 2.122678 +v -5.906583 0.009999 2.030388 +v -5.906583 0.009999 1.938097 +v 3.876195 0.009998 5.906583 +v 3.968485 0.009998 5.906583 +v 4.060776 0.009998 5.906583 +v 3.691614 0.009998 5.906583 +v 3.783905 0.009998 5.906583 +v 4.245357 0.009998 5.906583 +v 4.337647 0.009998 5.906583 +v 4.429937 0.009998 5.906583 +v 4.153066 0.009998 5.906583 +v 3.137872 0.009998 5.906583 +v 3.230163 0.009998 5.906583 +v 3.322453 0.009998 5.906583 +v 2.953291 0.009998 5.906583 +v 3.045582 0.009998 5.906583 +v 3.507033 0.009998 5.906583 +v 3.599324 0.009998 5.906583 +v 3.414743 0.009998 5.906583 +v 5.352840 0.009998 5.906583 +v 5.445131 0.009998 5.906583 +v 5.537421 0.009998 5.906583 +v 5.168260 0.009998 5.906583 +v 5.260550 0.009998 5.906583 +v 5.722002 0.009998 5.906583 +v 5.814293 0.009998 5.906583 +v 5.906583 0.009998 5.906583 +v 5.629711 0.009998 5.906583 +v 4.614518 0.009998 5.906583 +v 4.706808 0.009998 5.906583 +v 4.799098 0.009998 5.906583 +v 4.522227 0.009998 5.906583 +v 4.983679 0.009998 5.906583 +v 5.075970 0.009998 5.906583 +v 4.891389 0.009998 5.906583 +v 0.922904 0.009998 5.906583 +v 1.015194 0.009998 5.906583 +v 1.107484 0.009998 5.906583 +v 0.738323 0.009998 5.906583 +v 0.830613 0.009998 5.906583 +v 1.292065 0.009998 5.906583 +v 1.384355 0.009998 5.906583 +v 1.476646 0.009998 5.906583 +v 1.199775 0.009998 5.906583 +v 0.184581 0.009998 5.906583 +v 0.276871 0.009998 5.906583 +v 0.369161 0.009998 5.906583 +v 0.092290 0.009998 5.906583 +v 0.553742 0.009998 5.906583 +v 0.646033 0.009998 5.906583 +v 0.461452 0.009998 5.906583 +v 2.399549 0.009998 5.906583 +v 2.491840 0.009998 5.906583 +v 2.584130 0.009998 5.906583 +v 2.214968 0.009998 5.906583 +v 2.307259 0.009998 5.906583 +v 2.768711 0.009998 5.906583 +v 2.861001 0.009998 5.906583 +v 2.676420 0.009998 5.906583 +v 1.661226 0.009998 5.906583 +v 1.753517 0.009998 5.906583 +v 1.845807 0.009998 5.906583 +v 1.568936 0.009998 5.906583 +v 2.030388 0.009998 5.906583 +v 2.122678 0.009998 5.906583 +v 1.938097 0.009998 5.906583 +v 5.906583 -1.989998 -5.906583 +v -5.906583 -1.989998 -5.906583 +v 5.906583 -1.990002 5.906582 +v -5.906583 -1.990002 5.906582 +v 5.906583 0.010002 -5.906583 +v -5.906583 0.010002 -5.906583 +v 5.906583 0.009998 5.906583 +v -5.906583 0.009998 5.906583 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 793.9620 -385.0559 +vt 819.5174 -385.0559 +vt 819.5174 386.1091 +vt 793.9620 386.1091 +vt -1560.1830 -385.0559 +vt -1535.4172 -385.0559 +vt -1535.4172 386.1091 +vt -1560.1904 386.1091 +vt -23.5456 -385.0559 +vt 2.0099 -385.0559 +vt 2.0099 386.1091 +vt -23.5456 386.1091 +vt -2453.5078 -385.0559 +vt -2479.0557 -385.0559 +vt -2479.0557 386.1091 +vt -2453.5078 386.1091 +vt -2734.5286 -385.0559 +vt -2760.0693 -385.0559 +vt -2760.0693 386.1091 +vt -2734.5286 386.1091 +vt 2326.7847 -385.0559 +vt 2352.3401 -385.0559 +vt 2352.3254 386.1091 +vt 2326.7847 386.1091 +vt 198.7351 -385.0559 +vt 173.9544 -385.0559 +vt 173.9544 386.1091 +vt 198.7351 386.1091 +vt 1356.0040 -385.0559 +vt 1381.5447 -385.0559 +vt 1381.5447 386.1091 +vt 1356.0040 386.1091 +vt -384.1984 -385.0559 +vt -409.7538 -385.0559 +vt -409.7538 386.1091 +vt -384.1984 386.1091 +vt 283.0309 -385.0559 +vt 308.5715 -385.0559 +vt 308.5715 386.1091 +vt 283.0309 386.1091 +vt -2249.1309 -385.0559 +vt -2274.6787 -385.0559 +vt -2274.6787 386.1091 +vt -2249.1309 386.1091 +vt -2989.9941 -385.0559 +vt -3015.5422 -385.0559 +vt -3015.5498 386.1091 +vt -2989.9941 386.1091 +vt 248.2814 -385.0559 +vt 223.5008 -385.0559 +vt 223.5008 386.1091 +vt 248.2665 386.1091 +vt -2922.6560 -385.0559 +vt -2897.8901 -385.0559 +vt -2897.8755 386.1091 +vt -2922.6560 386.1091 +vt -1176.1653 -385.0559 +vt -1201.7058 -385.0559 +vt -1201.7058 386.1091 +vt -1176.1653 386.1091 +vt 461.8598 -385.0559 +vt 487.4004 -385.0559 +vt 487.4004 386.1091 +vt 461.8598 386.1091 +vt 273.0471 -385.0559 +vt 273.0471 386.1091 +vt -2938.9128 -385.0559 +vt -2964.4539 -385.0559 +vt -2964.4539 386.1091 +vt -2938.9128 386.1091 +vt 870.6136 -385.0559 +vt 896.1542 -385.0559 +vt 896.1542 386.1091 +vt 870.6136 386.1091 +vt -1380.5347 -385.0559 +vt -1406.0826 -385.0559 +vt -1406.0826 386.1091 +vt -1380.5347 386.1091 +vt 666.2292 -385.0559 +vt 691.7698 -385.0559 +vt 691.7698 386.1091 +vt 666.2292 386.1091 +vt 2849.3538 -385.0559 +vt 2824.5730 -385.0559 +vt 2824.5730 386.1091 +vt 2849.3538 386.1091 +vt -2253.8098 -385.0559 +vt -2229.0366 -385.0559 +vt -2229.0366 386.1091 +vt -2253.8098 386.1091 +vt -569.3005 -385.0559 +vt -544.5349 -385.0559 +vt -544.5349 386.1091 +vt -569.3005 386.1091 +vt -1907.0000 -385.0559 +vt -1882.2269 -385.0559 +vt -1882.2269 386.1091 +vt -1907.0000 386.1091 +vt -435.2944 -385.0559 +vt -460.8499 -385.0559 +vt -460.8499 386.1091 +vt -435.2944 386.1091 +vt 3093.1963 -385.0559 +vt 3118.7366 -385.0559 +vt 3118.7366 386.1091 +vt 3093.1963 386.1091 +vt -1510.6442 -385.0559 +vt -1510.6442 386.1091 +vt 1509.2773 -385.0559 +vt 1534.8328 -385.0559 +vt 1534.8328 386.1091 +vt 1509.2773 386.1091 +vt 3195.3882 -385.0559 +vt 3220.9290 -385.0559 +vt 3220.9290 386.1091 +vt 3195.3882 386.1091 +vt 2279.5930 -385.0559 +vt 2254.8123 -385.0559 +vt 2254.8123 386.1091 +vt 2279.5930 386.1091 +vt 1662.5656 -385.0559 +vt 1688.1061 -385.0559 +vt 1688.1061 386.1091 +vt 1662.5656 386.1091 +vt -1227.2465 -385.0559 +vt -1252.8019 -385.0559 +vt -1252.8019 386.1091 +vt -1227.2614 386.1091 +vt 2626.4023 -385.0559 +vt 2601.6218 -385.0559 +vt 2601.6218 386.1091 +vt 2626.4023 386.1091 +vt -895.1442 -385.0559 +vt -920.6848 -385.0559 +vt -920.6848 386.1091 +vt -895.1442 386.1091 +vt 2130.9536 -385.0559 +vt 2106.1880 -385.0559 +vt 2106.1880 386.1091 +vt 2130.9536 386.1091 +vt -3168.8381 -385.0559 +vt -3194.3784 -385.0559 +vt -3194.3784 386.1091 +vt -3168.8306 386.1091 +vt -2823.5632 -385.0559 +vt -2798.7974 -385.0559 +vt -2798.7974 386.1091 +vt -2823.5632 386.1091 +vt 257.4754 -385.0559 +vt 257.4754 386.1091 +vt -2095.8501 -385.0559 +vt -2121.3979 -385.0559 +vt -2121.3979 386.1091 +vt -2095.8501 386.1091 +vt -1840.3844 -385.0559 +vt -1865.9250 -385.0559 +vt -1865.9324 386.1091 +vt -1840.3844 386.1091 +vt 1734.5978 -385.0559 +vt 1709.8320 -385.0559 +vt 1709.8320 386.1091 +vt 1734.5978 386.1091 +vt -2377.6682 -385.0559 +vt -2352.8950 -385.0559 +vt -2352.8950 386.1091 +vt -2377.6682 386.1091 +vt -2328.1221 -385.0559 +vt -2328.1221 386.1091 +vt 2874.1191 -385.0559 +vt 2874.1191 386.1091 +vt -2657.8848 -385.0559 +vt -2683.4326 -385.0559 +vt -2683.4326 386.1091 +vt -2657.8848 386.1091 +vt 2576.8560 -385.0559 +vt 2552.0903 -385.0559 +vt 2552.0903 386.1091 +vt 2576.8560 386.1091 +vt 2837.7307 -385.0559 +vt 2863.2712 -385.0559 +vt 2863.2712 386.1091 +vt 2837.7307 386.1091 +vt -256.4656 -385.0559 +vt -282.0211 -385.0559 +vt -282.0211 386.1091 +vt -256.4656 386.1091 +vt 1660.2858 -385.0559 +vt 1635.5200 -385.0559 +vt 1635.5200 386.1091 +vt 1660.2858 386.1091 +vt -1238.1542 -385.0559 +vt -1213.3734 -385.0559 +vt -1213.3734 386.1091 +vt -1238.1542 386.1091 +vt 1253.8119 -385.0559 +vt 1279.3524 -385.0559 +vt 1279.3524 386.1091 +vt 1253.8119 386.1091 +vt 512.9410 -385.0559 +vt 538.4965 -385.0559 +vt 538.4965 386.1091 +vt 512.9410 386.1091 +vt 947.2502 -385.0559 +vt 972.7908 -385.0559 +vt 972.7908 386.1091 +vt 947.2502 386.1091 +vt -3117.7419 -385.0559 +vt -3143.2825 -385.0559 +vt -3143.2825 386.1091 +vt -3117.7419 386.1091 +vt 1511.6465 -385.0559 +vt 1486.8809 -385.0559 +vt 1486.8809 386.1091 +vt 1511.6465 386.1091 +vt 2965.4636 -385.0559 +vt 2991.0039 -385.0559 +vt 2991.0039 386.1091 +vt 2965.4636 386.1091 +vt 2096.8599 -385.0559 +vt 2122.4155 -385.0559 +vt 2122.4155 386.1091 +vt 2096.8599 386.1091 +vt 564.0370 -385.0559 +vt 564.0370 386.1091 +vt -1993.6652 -385.0559 +vt -2019.2131 -385.0559 +vt -2019.2131 386.1091 +vt -1993.6652 386.1091 +vt -2204.2634 -385.0559 +vt -2204.2634 386.1091 +vt -2811.1655 -385.0559 +vt -2836.7134 -385.0559 +vt -2836.7134 386.1091 +vt -2811.1655 386.1091 +vt 1304.9078 -385.0559 +vt 1304.9078 386.1091 +vt 793.2615 -385.0559 +vt 768.4958 -385.0559 +vt 768.4811 386.1091 +vt 793.2615 386.1091 +vt -767.4115 -385.0559 +vt -792.9521 -385.0559 +vt -792.9521 386.1091 +vt -767.4115 386.1091 +vt 24.5554 -385.0559 +vt -1.0001 -385.0559 +vt -1.0001 386.1091 +vt 24.5554 386.1091 +vt 2275.6885 -385.0559 +vt 2301.2441 -385.0559 +vt 2301.2441 386.1091 +vt 2275.6885 386.1091 +vt -2172.4941 -385.0559 +vt -2198.0422 -385.0559 +vt -2198.0422 386.1091 +vt -2172.4941 386.1091 +vt 2454.5176 -385.0559 +vt 2480.0730 -385.0559 +vt 2480.0730 386.1091 +vt 2454.5176 386.1091 +vt 446.4520 -385.0559 +vt 421.6862 -385.0559 +vt 421.6713 386.1091 +vt 446.4520 386.1091 +vt 1462.1151 -385.0559 +vt 1462.1151 386.1091 +vt -841.7981 -385.0559 +vt -817.0174 -385.0559 +vt -817.0174 386.1091 +vt -841.7981 386.1091 +vt 1713.6617 -385.0559 +vt 1713.6617 386.1091 +vt -792.2518 -385.0559 +vt -792.2518 386.1091 +vt -2376.8711 -385.0559 +vt -2402.4192 -385.0559 +vt -2402.4192 386.1091 +vt -2376.8711 386.1091 +vt -1981.3123 -385.0559 +vt -1956.5391 -385.0559 +vt -1956.5391 386.1091 +vt -1981.3123 386.1091 +vt -1125.0691 -385.0559 +vt -1150.6099 -385.0559 +vt -1150.6099 386.1091 +vt -1125.0691 386.1091 +vt -1968.1172 -385.0559 +vt -1968.1172 386.1091 +vt 1866.9351 -385.0559 +vt 1892.4905 -385.0559 +vt 1892.4905 386.1091 +vt 1866.9351 386.1091 +vt 1330.4484 -385.0559 +vt 1330.4484 386.1091 +vt -179.8289 -385.0559 +vt -205.3695 -385.0559 +vt -205.3695 386.1091 +vt -179.8289 386.1091 +vt -26.5407 -385.0559 +vt -52.0962 -385.0559 +vt -52.0962 386.1091 +vt -26.5407 386.1091 +vt 644.6226 -385.0559 +vt 619.8568 -385.0559 +vt 619.8568 386.1091 +vt 644.6226 386.1091 +vt -767.4711 -385.0559 +vt -767.4711 386.1091 +vt -77.6368 -385.0559 +vt -77.6368 386.1091 +vt -1814.8364 -385.0559 +vt -1814.8364 386.1091 +vt 1412.5688 -385.0559 +vt 1387.7881 -385.0559 +vt 1387.7881 386.1091 +vt 1412.5688 386.1091 +vt 2007.0953 -385.0559 +vt 1982.3296 -385.0559 +vt 1982.3296 386.1091 +vt 2007.0953 386.1091 +vt 2020.2231 -385.0559 +vt 2045.7640 -385.0559 +vt 2045.7640 386.1091 +vt 2020.2231 386.1091 +vt -1278.3499 -385.0559 +vt -1303.8981 -385.0559 +vt -1303.8981 386.1091 +vt -1278.3499 386.1091 +vt -1659.2758 -385.0559 +vt -1634.5026 -385.0559 +vt -1634.5026 386.1091 +vt -1659.2758 386.1091 +vt 180.8388 -385.0559 +vt 206.3794 -385.0559 +vt 206.3794 386.1091 +vt 180.8388 386.1091 +vt 396.9056 -385.0559 +vt 372.1399 -385.0559 +vt 372.1399 386.1091 +vt 396.9056 386.1091 +vt -321.5837 -385.0559 +vt -296.8030 -385.0559 +vt -296.8030 386.1091 +vt -321.5837 386.1091 +vt 1126.0791 -385.0559 +vt 1151.6198 -385.0559 +vt 1151.6198 386.1091 +vt 1126.0791 386.1091 +vt -2300.2271 -385.0559 +vt -2300.2271 386.1091 +vt 1338.2418 -385.0559 +vt 1313.4761 -385.0559 +vt 1313.4761 386.1091 +vt 1338.2418 386.1091 +vt 589.5926 -385.0559 +vt 615.1331 -385.0559 +vt 615.1331 386.1091 +vt 589.5926 386.1091 +vt 2651.1682 -385.0559 +vt 2651.1682 386.1091 +vt -2785.6248 -385.0559 +vt -2785.6248 386.1091 +vt 818.0273 -385.0559 +vt 818.0273 386.1091 +vt 231.9348 -385.0559 +vt 231.9348 386.1091 +vt -1099.5138 -385.0559 +vt -1099.5138 386.1091 +vt 2700.7146 -385.0559 +vt 2675.9487 -385.0559 +vt 2675.9487 386.1091 +vt 2700.7146 386.1091 +vt -717.9396 -385.0559 +vt -693.1589 -385.0559 +vt -693.1589 386.1091 +vt -717.9396 386.1091 +vt -2551.0732 -385.0559 +vt -2526.3000 -385.0559 +vt -2526.3000 386.1091 +vt -2551.0732 386.1091 +vt 1685.0515 -385.0559 +vt 1685.0515 386.1091 +vt -2451.9805 -385.0559 +vt -2427.2146 -385.0559 +vt -2427.2146 386.1091 +vt -2451.9878 386.1091 +vt -668.3933 -385.0559 +vt -668.3933 386.1091 +vt 1407.1000 -385.0559 +vt 1432.6406 -385.0559 +vt 1432.6406 386.1091 +vt 1407.1000 386.1091 +vt -2278.5754 -385.0559 +vt -2278.5833 386.1091 +vt 2230.0464 -385.0559 +vt 2205.2659 -385.0559 +vt 2205.2659 386.1091 +vt 2230.0464 386.1091 +vt -2351.3230 -385.0559 +vt -2351.3230 386.1091 +vt -371.1300 -385.0559 +vt -346.3494 -385.0559 +vt -346.3494 386.1091 +vt -371.1300 386.1091 +vt -358.6578 -385.0559 +vt -358.6578 386.1091 +vt -997.3364 -385.0559 +vt -1022.8770 -385.0559 +vt -1022.8770 386.1091 +vt -997.3364 386.1091 +vt 1239.1639 -385.0559 +vt 1214.3834 -385.0559 +vt 1214.3834 386.1091 +vt 1239.1639 386.1091 +vt -1917.0212 -385.0559 +vt -1942.5692 -385.0559 +vt -1942.5692 386.1091 +vt -1917.0212 386.1091 +vt -2774.0244 -385.0559 +vt -2774.0244 386.1091 +vt -1431.6309 -385.0559 +vt -1431.6309 386.1091 +vt 768.4214 -385.0559 +vt 768.4214 386.1091 +vt 2527.3098 -385.0559 +vt 2527.3098 386.1091 +vt -2632.3367 -385.0559 +vt -2632.3367 386.1091 +vt 2147.9558 -385.0559 +vt 2173.5115 -385.0559 +vt 2173.4966 386.1091 +vt 2147.9558 386.1091 +vt -618.8469 -385.0559 +vt -594.0663 -385.0559 +vt -594.0663 386.1091 +vt -618.8469 386.1091 +vt -1609.7295 -385.0559 +vt -1609.7295 386.1091 +vt -2996.9678 -385.0559 +vt -2972.2024 -385.0559 +vt -2972.2024 386.1091 +vt -2996.9678 386.1091 +vt 3042.1001 -385.0559 +vt 3067.6555 -385.0559 +vt 3067.6555 386.1091 +vt 3042.1001 386.1091 +vt -946.2403 -385.0559 +vt -971.7810 -385.0559 +vt -971.7810 386.1091 +vt -946.2403 386.1091 +vt -2600.6194 -385.0559 +vt -2575.8462 -385.0559 +vt -2575.8462 386.1091 +vt -2600.6194 386.1091 +vt -2749.2510 -385.0559 +vt -2749.2510 386.1091 +vt -1329.4386 -385.0559 +vt -1354.9867 -385.0559 +vt -1354.9867 386.1091 +vt -1329.4386 386.1091 +vt -307.5617 -385.0559 +vt -333.1023 -385.0559 +vt -333.1023 386.1091 +vt -307.5617 386.1091 +vt 1560.3733 -385.0559 +vt 1585.9290 -385.0559 +vt 1585.9290 386.1091 +vt 1560.3733 386.1091 +vt -2055.6318 -385.0559 +vt -2030.8585 -385.0559 +vt -2030.8585 386.1091 +vt -2055.6318 386.1091 +vt 1074.9829 -385.0559 +vt 1100.5236 -385.0559 +vt 1100.5236 386.1091 +vt 1074.9829 386.1091 +vt -1891.4730 -385.0559 +vt -1891.4730 386.1091 +vt -3021.7412 -385.0559 +vt -3021.7412 386.1091 +vt -1857.4537 -385.0559 +vt -1857.4537 386.1091 +vt 2786.6345 -385.0559 +vt 2812.1753 -385.0559 +vt 2812.1753 386.1091 +vt 2786.6345 386.1091 +vt -1508.2673 -385.0559 +vt -1533.8153 -385.0559 +vt -1533.8153 386.1091 +vt -1508.2673 386.1091 +vt 27.5505 -385.0559 +vt 27.5505 386.1091 +vt -272.0373 -385.0559 +vt -272.0373 386.1091 +vt 845.0580 -385.0559 +vt 845.0580 386.1091 +vt 1611.4695 -385.0559 +vt 1637.0101 -385.0559 +vt 1637.0101 386.1091 +vt 1611.4695 386.1091 +vt -2501.5266 -385.0559 +vt -2501.5266 386.1091 +vt -1411.5514 -385.0559 +vt -1386.7783 -385.0559 +vt -1386.7858 386.1091 +vt -1411.5514 386.1091 +vt 2888.8267 -385.0559 +vt 2914.3674 -385.0559 +vt 2914.3674 386.1091 +vt 2888.8267 386.1091 +vt -2080.4050 -385.0559 +vt -2080.4050 386.1091 +vt -197.7252 -385.0559 +vt -172.9446 -385.0559 +vt -172.9446 386.1091 +vt -197.7252 386.1091 +vt 1536.4272 -385.0559 +vt 1536.4272 386.1091 +vt -1636.0076 -385.0559 +vt -1661.5558 -385.0559 +vt -1661.5558 386.1091 +vt -1636.0076 386.1091 +vt 1957.5490 -385.0559 +vt 1957.5490 386.1091 +vt 1065.7592 -385.0559 +vt 1040.9785 -385.0559 +vt 1040.9785 386.1091 +vt 1065.7592 386.1091 +vt 1228.2712 -385.0559 +vt 1228.2712 386.1091 +vt 2452.9976 -385.0559 +vt 2428.2168 -385.0559 +vt 2428.2168 386.1091 +vt 2452.9976 386.1091 +vt 1739.2023 -385.0559 +vt 1739.2023 386.1091 +vt 640.6887 -385.0559 +vt 640.6887 386.1091 +vt -1610.4595 -385.0559 +vt -1610.4595 386.1091 +vt 991.4323 -385.0559 +vt 966.6665 -385.0559 +vt 966.6665 386.1091 +vt 991.4323 386.1091 +vt 941.9008 -385.0559 +vt 917.1200 -385.0559 +vt 917.1200 386.1091 +vt 941.9008 386.1091 +vt 3169.8328 -385.0559 +vt 3169.8328 386.1091 +vt -103.1923 -385.0559 +vt -103.1923 386.1091 +vt -2708.9807 -385.0559 +vt -2708.9807 386.1091 +vt -49.0862 -385.0559 +vt -49.0862 386.1091 +vt 1883.2369 -385.0559 +vt 1858.4712 -385.0559 +vt 1858.4562 386.1091 +vt 1883.2369 386.1091 +vt -2044.7614 -385.0559 +vt -2070.3020 -385.0559 +vt -2070.3020 386.1091 +vt -2044.7614 386.1091 +vt -2650.1584 -385.0559 +vt -2625.3926 -385.0559 +vt -2625.3926 386.1091 +vt -2650.1584 386.1091 +vt -148.1789 -385.0559 +vt -148.1789 386.1091 +vt -3219.9192 -385.0559 +vt -3195.1384 -385.0559 +vt -3195.1384 386.1091 +vt -3219.9192 386.1091 +vt -1188.6077 -385.0559 +vt -1188.6077 386.1091 +vt 1288.7104 -385.0559 +vt 1263.9297 -385.0559 +vt 1263.9297 386.1091 +vt 1288.7104 386.1091 +vt 2761.0791 -385.0559 +vt 2761.0791 386.1091 +vt 1140.0712 -385.0559 +vt 1115.3054 -385.0559 +vt 1115.3054 386.1091 +vt 1140.0712 386.1091 +vt 1994.6678 -385.0559 +vt 1994.6678 386.1091 +vt -2303.3486 -385.0559 +vt -2303.3486 386.1091 +vt -247.2567 -385.0559 +vt -247.2567 386.1091 +vt 347.3593 -385.0559 +vt 347.3593 386.1091 +vt -1312.4661 -385.0559 +vt -1287.6930 -385.0559 +vt -1287.6930 386.1091 +vt -1312.4661 386.1091 +vt -1064.7491 -385.0559 +vt -1039.9688 -385.0559 +vt -1039.9688 386.1091 +vt -1064.7491 386.1091 +vt 3097.0706 -385.0559 +vt 3072.3047 -385.0559 +vt 3072.3047 386.1091 +vt 3097.0706 386.1091 +vt -2581.2478 -385.0559 +vt -2606.7959 -385.0559 +vt -2606.7959 386.1091 +vt -2581.2478 386.1091 +vt -1584.9562 -385.0559 +vt -1584.9562 386.1091 +vt 1363.0223 -385.0559 +vt 1363.0223 386.1091 +vt -1073.9730 -385.0559 +vt -1073.9730 386.1091 +vt 2031.8761 -385.0559 +vt 2031.8611 386.1091 +vt -1262.9199 -385.0559 +vt -1262.9199 386.1091 +vt -2325.7749 -385.0559 +vt -2325.7749 386.1091 +vt -2402.4417 -385.0559 +vt -2402.4417 386.1091 +vt 2224.5925 -385.0559 +vt 2250.1482 -385.0559 +vt 2250.1482 386.1091 +vt 2224.5925 386.1091 +vt 1016.2127 -385.0559 +vt 1016.2127 386.1091 +vt -1362.0126 -385.0559 +vt -1362.0126 386.1091 +vt -1708.8223 -385.0559 +vt -1684.0488 -385.0559 +vt -1684.0488 386.1091 +vt -1708.8223 386.1091 +vt -2504.6040 -385.0559 +vt -2504.6040 386.1091 +vt -1485.8711 -385.0559 +vt -1485.8711 386.1091 +vt 2378.6853 -385.0559 +vt 2353.9048 -385.0559 +vt 2353.9048 386.1091 +vt 2378.6707 386.1091 +vt -818.5075 -385.0559 +vt -844.0482 -385.0559 +vt -844.0482 386.1091 +vt -818.5075 386.1091 +vt -1337.2393 -385.0559 +vt -1337.2393 386.1091 +vt -1163.8271 -385.0559 +vt -1163.8271 386.1091 +vt 2071.3193 -385.0559 +vt 2071.3193 386.1091 +vt 1943.5867 -385.0559 +vt 1969.1272 -385.0559 +vt 1969.1272 386.1091 +vt 1943.5867 386.1091 +vt 2329.1392 -385.0559 +vt 2304.3584 -385.0559 +vt 2304.3584 386.1091 +vt 2329.1392 386.1091 +vt 2997.9775 -385.0559 +vt 2973.2122 -385.0559 +vt 2973.2122 386.1091 +vt 2997.9775 386.1091 +vt 570.3104 -385.0559 +vt 545.5448 -385.0559 +vt 545.5448 386.1091 +vt 570.3104 386.1091 +vt -869.5887 -385.0559 +vt -869.5887 386.1091 +vt 3220.9290 -385.0559 +vt 3196.1631 -385.0559 +vt 3196.1631 386.1091 +vt 3220.9290 386.1091 +vt 1090.5249 -385.0559 +vt 1090.5249 386.1091 +vt -1089.5149 -385.0559 +vt -1089.5149 386.1091 +vt 1808.9247 -385.0559 +vt 1784.1442 -385.0559 +vt 1784.1442 386.1091 +vt 1808.9247 386.1091 +vt 1023.8870 -385.0559 +vt 1049.4424 -385.0559 +vt 1049.4424 386.1091 +vt 1023.8870 386.1091 +vt 2948.4314 -385.0559 +vt 2923.6658 -385.0559 +vt 2923.6658 386.1091 +vt 2948.4314 386.1091 +vt -2223.5906 -385.0559 +vt -2223.5906 386.1091 +vt 2377.8809 -385.0559 +vt 2377.8809 386.1091 +vt -1931.7657 -385.0559 +vt -1931.7657 386.1091 +vt -519.7542 -385.0559 +vt -494.9885 -385.0559 +vt -494.9885 386.1091 +vt -519.7542 386.1091 +vt -1461.0977 -385.0559 +vt -1461.0977 386.1091 +vt 53.1060 -385.0559 +vt 78.6466 -385.0559 +vt 78.6466 386.1091 +vt 53.1060 386.1091 +vt 2505.6138 -385.0559 +vt 2505.6138 386.1091 +vt 1815.8389 -385.0559 +vt 1841.3944 -385.0559 +vt 1841.3944 386.1091 +vt 1815.8389 386.1091 +vt 2403.4214 -385.0559 +vt 2403.4214 386.1091 +vt -470.2079 -385.0559 +vt -470.2079 386.1091 +vt -2873.1094 -385.0559 +vt -2873.1094 386.1091 +vt 471.2177 -385.0559 +vt 471.2177 386.1091 +vt -2129.9438 -385.0559 +vt -2105.1709 -385.0559 +vt -2105.1709 386.1091 +vt -2129.9438 386.1091 +vt 595.0911 -385.0559 +vt 595.0911 386.1091 +vt 3022.7583 -385.0559 +vt 3022.7583 386.1091 +vt 2155.7344 -385.0559 +vt 2155.7344 386.1091 +vt 2939.9080 -385.0559 +vt 2939.9080 386.1091 +vt -742.7054 -385.0559 +vt -742.7054 386.1091 +vt -1832.6807 -385.0559 +vt -1807.9073 -385.0559 +vt -1807.9073 386.1091 +vt -1832.6807 386.1091 +vt -2476.7537 -385.0559 +vt -2476.7537 386.1091 +vt -128.7328 -385.0559 +vt -154.2735 -385.0559 +vt -154.2735 386.1091 +vt -128.7328 386.1091 +vt 1189.6177 -385.0559 +vt 1189.6177 386.1091 +vt -486.3905 -385.0559 +vt -511.9312 -385.0559 +vt -511.9312 386.1091 +vt -486.3905 386.1091 +vt -2427.9597 -385.0559 +vt -2427.9597 386.1091 +vt 998.3464 -385.0559 +vt 998.3464 386.1091 +vt -639.6788 -385.0559 +vt -665.2194 -385.0559 +vt -665.2194 386.1091 +vt -639.6788 386.1091 +vt 1790.2982 -385.0559 +vt 1790.2982 386.1091 +vt -643.6127 -385.0559 +vt -643.6127 386.1091 +vt 2477.7634 -385.0559 +vt 2477.7634 386.1091 +vt 3016.5596 -385.0559 +vt 3016.5596 386.1091 +vt -2530.1519 -385.0559 +vt -2555.7000 -385.0559 +vt -2555.7000 386.1091 +vt -2530.1519 386.1091 +vt -3041.0903 -385.0559 +vt -3041.0903 386.1091 +vt -1789.2885 -385.0559 +vt -1789.2885 386.1091 +vt -614.1232 -385.0559 +vt -614.1232 386.1091 +vt -2146.9460 -385.0559 +vt -2146.9460 386.1091 +vt 2799.8071 -385.0559 +vt 2799.8071 386.1091 +vt 743.7153 -385.0559 +vt 743.7153 386.1091 +vt -3071.2800 -385.0559 +vt -3046.5144 -385.0559 +vt -3046.5144 386.1091 +vt -3071.2800 386.1091 +vt 1458.1812 -385.0559 +vt 1483.7368 -385.0559 +vt 1483.7368 386.1091 +vt 1458.1812 386.1091 +vt -230.9250 -385.0559 +vt -230.9250 386.1091 +vt -98.6325 -385.0559 +vt -73.8519 -385.0559 +vt -73.8519 386.1091 +vt -98.6325 386.1091 +vt 359.6676 -385.0559 +vt 385.2082 -385.0559 +vt 385.2082 386.1091 +vt 359.6676 386.1091 +vt -940.8759 -385.0559 +vt -916.1102 -385.0559 +vt -916.1102 386.1091 +vt -940.8908 386.1091 +vt -891.3444 -385.0559 +vt -891.3444 386.1091 +vt -2179.4902 -385.0559 +vt -2179.4902 386.1091 +vt 3171.3826 -385.0559 +vt 3146.6169 -385.0559 +vt 3146.6169 386.1091 +vt 3171.3826 386.1091 +vt 717.3254 -385.0559 +vt 742.8658 -385.0559 +vt 742.8658 386.1091 +vt 717.3254 386.1091 +vt 410.7637 -385.0559 +vt 410.7637 386.1091 +vt 1759.3784 -385.0559 +vt 1759.3784 386.1091 +vt 2735.5383 -385.0559 +vt 2735.5383 386.1091 +vt 694.1688 -385.0559 +vt 669.4033 -385.0559 +vt 669.4033 386.1091 +vt 694.1688 386.1091 +vt 3047.5242 -385.0559 +vt 3047.5242 386.1091 +vt 1177.1750 -385.0559 +vt 1177.1750 386.1091 +vt 892.3543 -385.0559 +vt 892.3543 386.1091 +vt -2848.3364 -385.0559 +vt -2848.3364 386.1091 +vt 2180.5000 -385.0559 +vt 2180.5000 386.1091 +vt -2674.9316 -385.0559 +vt -2674.9316 386.1091 +vt 1437.3346 -385.0559 +vt 1437.3346 386.1091 +vt -1738.1923 -385.0559 +vt -1763.7402 -385.0559 +vt -1763.7402 386.1091 +vt -1738.1923 386.1091 +vt -2154.7170 -385.0559 +vt -2154.7170 386.1091 +vt -222.4910 -385.0559 +vt -222.4910 386.1091 +vt 520.7641 -385.0559 +vt 495.9983 -385.0559 +vt 495.9983 386.1091 +vt 520.7641 386.1091 +vt -123.3982 -385.0559 +vt -123.3982 386.1091 +vt 1561.1930 -385.0559 +vt 1561.1930 386.1091 +vt -1783.1342 -385.0559 +vt -1758.3611 -385.0559 +vt -1758.3611 386.1091 +vt -1783.1342 386.1091 +vt 2725.4954 -385.0559 +vt 2725.4954 386.1091 +vt -2947.4290 -385.0559 +vt -2947.4290 386.1091 +vt 334.1121 -385.0559 +vt 334.1121 386.1091 +vt -1436.3246 -385.0559 +vt -1436.3246 386.1091 +vt 1932.7832 -385.0559 +vt 1932.7832 386.1091 +vt 322.5935 -385.0559 +vt 297.8129 -385.0559 +vt 297.8129 386.1091 +vt 322.5935 386.1091 +vt 1202.7157 -385.0559 +vt 1202.7157 386.1091 +vt 2199.0520 -385.0559 +vt 2199.0520 386.1091 +vt 2403.4514 -385.0559 +vt 2403.4514 386.1091 +vt -690.7599 -385.0559 +vt -716.3155 -385.0559 +vt -716.3155 386.1091 +vt -690.7599 386.1091 +vt 149.1887 -385.0559 +vt 124.4081 -385.0559 +vt 124.4081 386.1091 +vt 149.1887 386.1091 +vt 1764.7577 -385.0559 +vt 1764.7577 386.1091 +vt 867.5738 -385.0559 +vt 867.5738 386.1091 +vt 104.2021 -385.0559 +vt 129.7427 -385.0559 +vt 129.7427 386.1091 +vt 104.2021 386.1091 +vt 1908.0027 -385.0559 +vt 1908.0027 386.1091 +vt 1164.8369 -385.0559 +vt 1164.8369 386.1091 +vt -741.8560 -385.0559 +vt -741.8560 386.1091 +vt -1457.1788 -385.0559 +vt -1482.7268 -385.0559 +vt -1482.7268 386.1091 +vt -1457.1788 386.1091 +vt -445.4421 -385.0559 +vt -420.6615 -385.0559 +vt -420.6615 386.1091 +vt -445.4421 386.1091 +vt 2750.2607 -385.0559 +vt 2750.2607 386.1091 +vt 2556.7097 -385.0559 +vt 2582.2502 -385.0559 +vt 2582.2502 386.1091 +vt 2556.7097 386.1091 +vt -1048.4175 -385.0559 +vt -1048.4175 386.1091 +vt 1833.6904 -385.0559 +vt 1833.6904 386.1091 +vt 842.8080 -385.0559 +vt 842.8080 386.1091 +vt 2502.5439 -385.0559 +vt 2502.5439 386.1091 +vt 2531.1692 -385.0559 +vt 2531.1541 386.1091 +vt 2633.3464 -385.0559 +vt 2658.9019 -385.0559 +vt 2658.9019 386.1091 +vt 2633.3464 386.1091 +vt 2898.8999 -385.0559 +vt 2898.8999 386.1091 +vt 50.0960 -385.0559 +vt 50.0960 386.1091 +vt 99.6423 -385.0559 +vt 99.6423 386.1091 +vt 3121.8362 -385.0559 +vt 3121.8362 386.1091 +vt -1139.0613 -385.0559 +vt -1139.0613 386.1091 +vt -3066.6458 -385.0559 +vt -3092.1865 -385.0559 +vt -3092.1865 386.1091 +vt -3066.6458 386.1091 +vt 2775.0266 -385.0559 +vt 2775.0266 386.1091 +vt 2081.4075 -385.0559 +vt 2056.6416 -385.0559 +vt 2056.6416 386.1091 +vt 2081.4075 386.1091 +vt 2428.9768 -385.0559 +vt 2428.9768 386.1091 +vt -3219.9192 -385.0559 +vt -3219.9192 386.1091 +vt 2684.4424 -385.0559 +vt 2684.4424 386.1091 +vt -1114.2806 -385.0559 +vt -1114.2957 386.1091 +vt -1733.5879 -385.0559 +vt -1733.5953 386.1091 +vt 2709.9980 -385.0559 +vt 2709.9829 386.1091 +vt -3145.6072 -385.0559 +vt -3120.8340 -385.0559 +vt -3120.8340 386.1091 +vt -3145.6072 386.1091 +vt 1918.0310 -385.0559 +vt 1918.0310 386.1091 +vt -2724.4778 -385.0559 +vt -2699.7048 -385.0559 +vt -2699.7048 386.1091 +vt -2724.4778 386.1091 +vt 718.9495 -385.0559 +vt 718.9495 386.1091 +vt -1712.6443 -385.0559 +vt -1712.6443 386.1091 +vt -563.0272 -385.0559 +vt -588.5827 -385.0559 +vt -588.5827 386.1091 +vt -563.0272 386.1091 +vt -3170.3728 -385.0559 +vt -3170.3728 386.1091 +vt -3096.0608 -385.0559 +vt -3096.0608 386.1091 +vt 155.2833 -385.0559 +vt 155.2833 386.1091 +vt -2006.0853 -385.0559 +vt -2006.0853 386.1091 +vt 3144.2922 -385.0559 +vt 3144.2922 386.1091 +vt 1610.7393 -385.0559 +vt 1585.9735 -385.0559 +vt 1585.9735 386.1091 +vt 1610.7393 386.1091 +vt 2607.8057 -385.0559 +vt 2607.8057 386.1091 +vt -537.4866 -385.0559 +vt -537.4866 386.1091 +vt -2862.2615 -385.0559 +vt -2887.8096 -385.0559 +vt -2887.8096 386.1091 +vt -2862.2615 386.1091 +vt 74.8617 -385.0559 +vt 50.0960 -385.0559 +vt 50.0960 386.1091 +vt 74.8617 386.1091 +vt -1015.2028 -385.0559 +vt -990.4223 -385.0559 +vt -990.4223 386.1091 +vt -1015.2028 386.1091 +vt -965.6566 -385.0559 +vt -965.6566 386.1091 +vt -49.0862 -385.0559 +vt -49.0862 386.1091 +vt -1559.3635 -385.0559 +vt -1559.3635 386.1091 +vt -866.5638 -385.0559 +vt -866.5638 386.1091 +vt -2913.3577 -385.0559 +vt -2913.3577 386.1091 +vt -1687.0963 -385.0559 +vt -1687.0963 386.1091 +vt -395.8958 -385.0559 +vt -395.8958 386.1091 +vt 436.3043 -385.0559 +vt 436.3043 386.1091 +vt -1584.9115 -385.0559 +vt -1584.9115 386.1091 +vt 921.6948 -385.0559 +vt 921.6948 386.1091 +vt 0.9918 0.9921 +vt 0.9996 0.9921 +vt 0.9996 0.9999 +vt 0.9918 0.9999 +vt 0.4920 0.9919 +vt 0.4999 0.9919 +vt 0.4998 0.9997 +vt 0.4920 0.9997 +vt 0.4922 0.4922 +vt 0.5000 0.4922 +vt 0.5000 0.5000 +vt 0.4922 0.5000 +vt 0.9919 0.4923 +vt 0.9997 0.4923 +vt 0.9997 0.5001 +vt 0.9919 0.5001 +vt 0.7421 0.4923 +vt 0.7499 0.4923 +vt 0.7499 0.5001 +vt 0.7421 0.5001 +vt 0.7421 0.2424 +vt 0.7500 0.2424 +vt 0.7499 0.2502 +vt 0.7421 0.2502 +vt 0.9920 0.2425 +vt 0.9998 0.2425 +vt 0.9998 0.2503 +vt 0.9920 0.2503 +vt 0.2423 0.4921 +vt 0.2501 0.4921 +vt 0.2501 0.4999 +vt 0.2423 0.4999 +vt 0.2424 0.2422 +vt 0.2502 0.2422 +vt 0.2502 0.2500 +vt 0.2424 0.2500 +vt 0.4923 0.2423 +vt 0.5001 0.2423 +vt 0.5001 0.2501 +vt 0.4923 0.2501 +vt 0.2422 0.9918 +vt 0.2500 0.9918 +vt 0.2500 0.9997 +vt 0.2422 0.9996 +vt 0.2422 0.7420 +vt 0.2501 0.7420 +vt 0.2501 0.7498 +vt 0.2422 0.7498 +vt 0.4921 0.7420 +vt 0.4999 0.7420 +vt 0.4999 0.7499 +vt 0.4921 0.7499 +vt 0.7419 0.9920 +vt 0.7497 0.9920 +vt 0.7497 0.9998 +vt 0.7419 0.9998 +vt 0.7420 0.7421 +vt 0.7498 0.7421 +vt 0.7498 0.7499 +vt 0.7420 0.7499 +vt 0.9919 0.7422 +vt 0.9997 0.7422 +vt 0.9997 0.7500 +vt 0.9918 0.7500 +vt 0.8669 0.7422 +vt 0.8747 0.7422 +vt 0.8747 0.7500 +vt 0.8669 0.7500 +vt 0.8670 0.6172 +vt 0.8748 0.6172 +vt 0.8748 0.6250 +vt 0.8670 0.6250 +vt 0.9919 0.6173 +vt 0.9997 0.6173 +vt 0.9997 0.6251 +vt 0.9919 0.6251 +vt 0.6171 0.7421 +vt 0.6249 0.7421 +vt 0.6249 0.7499 +vt 0.6170 0.7499 +vt 0.6171 0.6171 +vt 0.6249 0.6172 +vt 0.6249 0.6250 +vt 0.6171 0.6250 +vt 0.7420 0.6172 +vt 0.7498 0.6172 +vt 0.7498 0.6250 +vt 0.7420 0.6250 +vt 0.6170 0.9919 +vt 0.6248 0.9920 +vt 0.6248 0.9998 +vt 0.6170 0.9998 +vt 0.6170 0.8670 +vt 0.6248 0.8670 +vt 0.6248 0.8748 +vt 0.6170 0.8748 +vt 0.7419 0.8671 +vt 0.7498 0.8671 +vt 0.7498 0.8749 +vt 0.7419 0.8749 +vt 0.3672 0.7420 +vt 0.3750 0.7420 +vt 0.3750 0.7498 +vt 0.3672 0.7498 +vt 0.3672 0.6171 +vt 0.3750 0.6171 +vt 0.3750 0.6249 +vt 0.3672 0.6249 +vt 0.4922 0.6171 +vt 0.5000 0.6171 +vt 0.5000 0.6249 +vt 0.4922 0.6249 +vt 0.1173 0.7419 +vt 0.1251 0.7419 +vt 0.1251 0.7497 +vt 0.1173 0.7497 +vt 0.1174 0.6170 +vt 0.1252 0.6170 +vt 0.1252 0.6248 +vt 0.1173 0.6248 +vt 0.2423 0.6170 +vt 0.2501 0.6170 +vt 0.2501 0.6248 +vt 0.2423 0.6248 +vt 0.1172 0.9918 +vt 0.1250 0.9918 +vt 0.1250 0.9996 +vt 0.1172 0.9996 +vt 0.1173 0.8669 +vt 0.1251 0.8669 +vt 0.1251 0.8747 +vt 0.1173 0.8747 +vt 0.2422 0.8669 +vt 0.2500 0.8669 +vt 0.2500 0.8747 +vt 0.2422 0.8747 +vt 0.3673 0.2423 +vt 0.3751 0.2423 +vt 0.3751 0.2501 +vt 0.3673 0.2501 +vt 0.3674 0.1173 +vt 0.3752 0.1173 +vt 0.3752 0.1251 +vt 0.3674 0.1251 +vt 0.4923 0.1174 +vt 0.5001 0.1174 +vt 0.5001 0.1252 +vt 0.4923 0.1252 +vt 0.1175 0.2422 +vt 0.1253 0.2422 +vt 0.1253 0.2500 +vt 0.1175 0.2500 +vt 0.1175 0.1173 +vt 0.1253 0.1173 +vt 0.1253 0.1251 +vt 0.1175 0.1251 +vt 0.2424 0.1173 +vt 0.2503 0.1173 +vt 0.2503 0.1251 +vt 0.2424 0.1251 +vt 0.1174 0.4921 +vt 0.1252 0.4921 +vt 0.1252 0.4999 +vt 0.1174 0.4999 +vt 0.1174 0.3671 +vt 0.1252 0.3671 +vt 0.1252 0.3749 +vt 0.1174 0.3749 +vt 0.2424 0.3672 +vt 0.2502 0.3672 +vt 0.2502 0.3750 +vt 0.2424 0.3750 +vt 0.8671 0.2424 +vt 0.8749 0.2424 +vt 0.8749 0.2502 +vt 0.8671 0.2502 +vt 0.8671 0.1175 +vt 0.8749 0.1175 +vt 0.8749 0.1253 +vt 0.8671 0.1253 +vt 0.9921 0.1175 +vt 0.9999 0.1175 +vt 0.9999 0.1253 +vt 0.9921 0.1253 +vt 0.6172 0.2423 +vt 0.6250 0.2423 +vt 0.6250 0.2502 +vt 0.6172 0.2502 +vt 0.6172 0.1174 +vt 0.6251 0.1174 +vt 0.6251 0.1252 +vt 0.6172 0.1252 +vt 0.7422 0.1174 +vt 0.7500 0.1175 +vt 0.7500 0.1253 +vt 0.7422 0.1253 +vt 0.6171 0.4922 +vt 0.6249 0.4922 +vt 0.6249 0.5000 +vt 0.6171 0.5000 +vt 0.6172 0.3673 +vt 0.6250 0.3673 +vt 0.6250 0.3751 +vt 0.6172 0.3751 +vt 0.7421 0.3673 +vt 0.7499 0.3673 +vt 0.7499 0.3751 +vt 0.7421 0.3751 +vt 0.8670 0.4923 +vt 0.8748 0.4923 +vt 0.8748 0.5001 +vt 0.8670 0.5001 +vt 0.8670 0.3674 +vt 0.8748 0.3674 +vt 0.8748 0.3752 +vt 0.8670 0.3752 +vt 0.9920 0.3674 +vt 0.9998 0.3674 +vt 0.9998 0.3752 +vt 0.9920 0.3752 +vt 0.3673 0.4921 +vt 0.3751 0.4921 +vt 0.3751 0.4999 +vt 0.3673 0.4999 +vt 0.3673 0.3672 +vt 0.3751 0.3672 +vt 0.3751 0.3750 +vt 0.3673 0.3750 +vt 0.4922 0.3672 +vt 0.5000 0.3672 +vt 0.5000 0.3751 +vt 0.4922 0.3750 +vt 0.3671 0.9919 +vt 0.3749 0.9919 +vt 0.3749 0.9997 +vt 0.3671 0.9997 +vt 0.3671 0.8669 +vt 0.3750 0.8669 +vt 0.3750 0.8748 +vt 0.3671 0.8747 +vt 0.4921 0.8670 +vt 0.4999 0.8670 +vt 0.4999 0.8748 +vt 0.4921 0.8748 +vt 0.8668 0.9920 +vt 0.8746 0.9920 +vt 0.8746 0.9998 +vt 0.8668 0.9998 +vt 0.8669 0.8671 +vt 0.8747 0.8671 +vt 0.8747 0.8749 +vt 0.8669 0.8749 +vt 0.9918 0.8671 +vt 0.9996 0.8671 +vt 0.9996 0.8749 +vt 0.9918 0.8749 +vt 0.9293 0.8671 +vt 0.9372 0.8671 +vt 0.9372 0.8749 +vt 0.9293 0.8749 +vt 0.9294 0.8046 +vt 0.9372 0.8046 +vt 0.9372 0.8125 +vt 0.9294 0.8125 +vt 0.9918 0.8047 +vt 0.9996 0.8047 +vt 0.9996 0.8125 +vt 0.9918 0.8125 +vt 0.8044 0.8671 +vt 0.8122 0.8671 +vt 0.8122 0.8749 +vt 0.8044 0.8749 +vt 0.8044 0.8046 +vt 0.8122 0.8046 +vt 0.8122 0.8124 +vt 0.8044 0.8124 +vt 0.8669 0.8046 +vt 0.8747 0.8046 +vt 0.8747 0.8124 +vt 0.8669 0.8124 +vt 0.8044 0.9920 +vt 0.8122 0.9920 +vt 0.8122 0.9998 +vt 0.8044 0.9998 +vt 0.8044 0.9295 +vt 0.8122 0.9295 +vt 0.8122 0.9373 +vt 0.8044 0.9373 +vt 0.8669 0.9296 +vt 0.8747 0.9296 +vt 0.8747 0.9374 +vt 0.8669 0.9374 +vt 0.4296 0.8670 +vt 0.4374 0.8670 +vt 0.4374 0.8748 +vt 0.4296 0.8748 +vt 0.4296 0.8045 +vt 0.4374 0.8045 +vt 0.4374 0.8123 +vt 0.4296 0.8123 +vt 0.4921 0.8045 +vt 0.4999 0.8045 +vt 0.4999 0.8123 +vt 0.4921 0.8123 +vt 0.3047 0.8669 +vt 0.3125 0.8669 +vt 0.3125 0.8747 +vt 0.3047 0.8747 +vt 0.3047 0.8045 +vt 0.3125 0.8045 +vt 0.3125 0.8123 +vt 0.3047 0.8123 +vt 0.3672 0.8045 +vt 0.3750 0.8045 +vt 0.3750 0.8123 +vt 0.3672 0.8123 +vt 0.3046 0.9919 +vt 0.3124 0.9919 +vt 0.3124 0.9997 +vt 0.3046 0.9997 +vt 0.3047 0.9294 +vt 0.3125 0.9294 +vt 0.3125 0.9372 +vt 0.3047 0.9372 +vt 0.3671 0.9294 +vt 0.3749 0.9294 +vt 0.3749 0.9372 +vt 0.3671 0.9372 +vt 0.4298 0.3672 +vt 0.4376 0.3672 +vt 0.4376 0.3750 +vt 0.4298 0.3750 +vt 0.4298 0.3048 +vt 0.4376 0.3048 +vt 0.4376 0.3126 +vt 0.4298 0.3126 +vt 0.4923 0.3048 +vt 0.5001 0.3048 +vt 0.5001 0.3126 +vt 0.4923 0.3126 +vt 0.3048 0.3672 +vt 0.3126 0.3672 +vt 0.3126 0.3750 +vt 0.3048 0.3750 +vt 0.3049 0.3047 +vt 0.3127 0.3047 +vt 0.3127 0.3125 +vt 0.3049 0.3125 +vt 0.3673 0.3047 +vt 0.3751 0.3047 +vt 0.3751 0.3125 +vt 0.3673 0.3125 +vt 0.3048 0.4921 +vt 0.3126 0.4921 +vt 0.3126 0.4999 +vt 0.3048 0.4999 +vt 0.3048 0.4296 +vt 0.3126 0.4297 +vt 0.3126 0.4375 +vt 0.3048 0.4375 +vt 0.3673 0.4297 +vt 0.3751 0.4297 +vt 0.3751 0.4375 +vt 0.3673 0.4375 +vt 0.9295 0.3674 +vt 0.9373 0.3674 +vt 0.9373 0.3752 +vt 0.9295 0.3752 +vt 0.9295 0.3049 +vt 0.9373 0.3049 +vt 0.9373 0.3127 +vt 0.9295 0.3127 +vt 0.9920 0.3049 +vt 0.9998 0.3049 +vt 0.9998 0.3127 +vt 0.9920 0.3127 +vt 0.8046 0.3673 +vt 0.8124 0.3673 +vt 0.8124 0.3752 +vt 0.8046 0.3751 +vt 0.8046 0.3049 +vt 0.8124 0.3049 +vt 0.8124 0.3127 +vt 0.8046 0.3127 +vt 0.8671 0.3049 +vt 0.8749 0.3049 +vt 0.8749 0.3127 +vt 0.8671 0.3127 +vt 0.8045 0.4923 +vt 0.8123 0.4923 +vt 0.8123 0.5001 +vt 0.8045 0.5001 +vt 0.8046 0.4298 +vt 0.8124 0.4298 +vt 0.8124 0.4376 +vt 0.8045 0.4376 +vt 0.8670 0.4298 +vt 0.8748 0.4298 +vt 0.8748 0.4376 +vt 0.8670 0.4376 +vt 0.6796 0.3673 +vt 0.6874 0.3673 +vt 0.6874 0.3751 +vt 0.6796 0.3751 +vt 0.6797 0.3048 +vt 0.6875 0.3048 +vt 0.6875 0.3126 +vt 0.6797 0.3126 +vt 0.7421 0.3049 +vt 0.7499 0.3049 +vt 0.7499 0.3127 +vt 0.7421 0.3127 +vt 0.5547 0.3673 +vt 0.5625 0.3673 +vt 0.5625 0.3751 +vt 0.5547 0.3751 +vt 0.5547 0.3048 +vt 0.5625 0.3048 +vt 0.5625 0.3126 +vt 0.5547 0.3126 +vt 0.6172 0.3048 +vt 0.6250 0.3048 +vt 0.6250 0.3126 +vt 0.6172 0.3126 +vt 0.5547 0.4922 +vt 0.5625 0.4922 +vt 0.5625 0.5000 +vt 0.5547 0.5000 +vt 0.5547 0.4297 +vt 0.5625 0.4297 +vt 0.5625 0.4375 +vt 0.5547 0.4375 +vt 0.6171 0.4297 +vt 0.6250 0.4297 +vt 0.6250 0.4376 +vt 0.6171 0.4376 +vt 0.6797 0.1174 +vt 0.6875 0.1174 +vt 0.6875 0.1252 +vt 0.6797 0.1252 +vt 0.6797 0.0550 +vt 0.6875 0.0550 +vt 0.6875 0.0628 +vt 0.6797 0.0628 +vt 0.7422 0.0550 +vt 0.7500 0.0550 +vt 0.7500 0.0628 +vt 0.7422 0.0628 +vt 0.5548 0.1174 +vt 0.5626 0.1174 +vt 0.5626 0.1252 +vt 0.5548 0.1252 +vt 0.5548 0.0549 +vt 0.5626 0.0549 +vt 0.5626 0.0627 +vt 0.5548 0.0627 +vt 0.6173 0.0549 +vt 0.6251 0.0549 +vt 0.6251 0.0628 +vt 0.6173 0.0628 +vt 0.5547 0.2423 +vt 0.5625 0.2423 +vt 0.5625 0.2501 +vt 0.5547 0.2501 +vt 0.5548 0.1799 +vt 0.5626 0.1799 +vt 0.5626 0.1877 +vt 0.5548 0.1877 +vt 0.6172 0.1799 +vt 0.6250 0.1799 +vt 0.6250 0.1877 +vt 0.6172 0.1877 +vt 0.9296 0.1175 +vt 0.9374 0.1175 +vt 0.9374 0.1253 +vt 0.9296 0.1253 +vt 0.9296 0.0550 +vt 0.9374 0.0550 +vt 0.9374 0.0628 +vt 0.9296 0.0628 +vt 0.9921 0.0551 +vt 0.9999 0.0551 +vt 0.9999 0.0629 +vt 0.9921 0.0629 +vt 0.8046 0.1175 +vt 0.8125 0.1175 +vt 0.8125 0.1253 +vt 0.8046 0.1253 +vt 0.8047 0.0550 +vt 0.8125 0.0550 +vt 0.8125 0.0628 +vt 0.8047 0.0628 +vt 0.8671 0.0550 +vt 0.8749 0.0550 +vt 0.8749 0.0628 +vt 0.8671 0.0628 +vt 0.8046 0.2424 +vt 0.8124 0.2424 +vt 0.8124 0.2502 +vt 0.8046 0.2502 +vt 0.8046 0.1799 +vt 0.8124 0.1799 +vt 0.8124 0.1877 +vt 0.8046 0.1877 +vt 0.8671 0.1800 +vt 0.8749 0.1800 +vt 0.8749 0.1878 +vt 0.8671 0.1878 +vt 0.1799 0.3671 +vt 0.1877 0.3671 +vt 0.1877 0.3750 +vt 0.1799 0.3750 +vt 0.1799 0.3047 +vt 0.1877 0.3047 +vt 0.1877 0.3125 +vt 0.1799 0.3125 +vt 0.2424 0.3047 +vt 0.2502 0.3047 +vt 0.2502 0.3125 +vt 0.2424 0.3125 +vt 0.0550 0.3671 +vt 0.0628 0.3671 +vt 0.0628 0.3749 +vt 0.0550 0.3749 +vt 0.0550 0.3046 +vt 0.0628 0.3046 +vt 0.0628 0.3124 +vt 0.0550 0.3124 +vt 0.1175 0.3047 +vt 0.1253 0.3047 +vt 0.1253 0.3125 +vt 0.1175 0.3125 +vt 0.0549 0.4920 +vt 0.0627 0.4920 +vt 0.0627 0.4998 +vt 0.0549 0.4998 +vt 0.0549 0.4296 +vt 0.0628 0.4296 +vt 0.0628 0.4374 +vt 0.0549 0.4374 +vt 0.1174 0.4296 +vt 0.1252 0.4296 +vt 0.1252 0.4374 +vt 0.1174 0.4374 +vt 0.1800 0.1173 +vt 0.1878 0.1173 +vt 0.1878 0.1251 +vt 0.1800 0.1251 +vt 0.1800 0.0548 +vt 0.1878 0.0548 +vt 0.1878 0.0626 +vt 0.1800 0.0626 +vt 0.2425 0.0548 +vt 0.2503 0.0548 +vt 0.2503 0.0626 +vt 0.2425 0.0626 +vt 0.0550 0.1172 +vt 0.0629 0.1172 +vt 0.0629 0.1250 +vt 0.0550 0.1250 +vt 0.0551 0.0548 +vt 0.0629 0.0548 +vt 0.0629 0.0626 +vt 0.0551 0.0626 +vt 0.1175 0.0548 +vt 0.1253 0.0548 +vt 0.1253 0.0626 +vt 0.1175 0.0626 +vt 0.0550 0.2422 +vt 0.0628 0.2422 +vt 0.0628 0.2500 +vt 0.0550 0.2500 +vt 0.0550 0.1797 +vt 0.0628 0.1797 +vt 0.0628 0.1875 +vt 0.0550 0.1875 +vt 0.1175 0.1797 +vt 0.1253 0.1797 +vt 0.1253 0.1875 +vt 0.1175 0.1875 +vt 0.4298 0.1174 +vt 0.4377 0.1174 +vt 0.4377 0.1252 +vt 0.4298 0.1252 +vt 0.4299 0.0549 +vt 0.4377 0.0549 +vt 0.4377 0.0627 +vt 0.4299 0.0627 +vt 0.4923 0.0549 +vt 0.5001 0.0549 +vt 0.5001 0.0627 +vt 0.4923 0.0627 +vt 0.3049 0.1173 +vt 0.3127 0.1173 +vt 0.3127 0.1251 +vt 0.3049 0.1251 +vt 0.3049 0.0549 +vt 0.3127 0.0549 +vt 0.3127 0.0627 +vt 0.3049 0.0627 +vt 0.3674 0.0549 +vt 0.3752 0.0549 +vt 0.3752 0.0627 +vt 0.3674 0.0627 +vt 0.3049 0.2422 +vt 0.3127 0.2423 +vt 0.3127 0.2501 +vt 0.3049 0.2501 +vt 0.3049 0.1798 +vt 0.3127 0.1798 +vt 0.3127 0.1876 +vt 0.3049 0.1876 +vt 0.3674 0.1798 +vt 0.3752 0.1798 +vt 0.3752 0.1876 +vt 0.3674 0.1876 +vt 0.1797 0.8669 +vt 0.1875 0.8669 +vt 0.1875 0.8747 +vt 0.1797 0.8747 +vt 0.1798 0.8044 +vt 0.1876 0.8044 +vt 0.1876 0.8122 +vt 0.1798 0.8122 +vt 0.2422 0.8044 +vt 0.2500 0.8044 +vt 0.2500 0.8122 +vt 0.2422 0.8122 +vt 0.0548 0.8668 +vt 0.0626 0.8668 +vt 0.0626 0.8747 +vt 0.0548 0.8747 +vt 0.0548 0.8044 +vt 0.0626 0.8044 +vt 0.0626 0.8122 +vt 0.0548 0.8122 +vt 0.1173 0.8044 +vt 0.1251 0.8044 +vt 0.1251 0.8122 +vt 0.1173 0.8122 +vt 0.0548 0.9918 +vt 0.0626 0.9918 +vt 0.0626 0.9996 +vt 0.0548 0.9996 +vt 0.0548 0.9293 +vt 0.0626 0.9293 +vt 0.0626 0.9371 +vt 0.0548 0.9371 +vt 0.1173 0.9293 +vt 0.1251 0.9293 +vt 0.1251 0.9371 +vt 0.1172 0.9371 +vt 0.1798 0.6170 +vt 0.1876 0.6170 +vt 0.1876 0.6248 +vt 0.1798 0.6248 +vt 0.1798 0.5545 +vt 0.1876 0.5545 +vt 0.1876 0.5624 +vt 0.1798 0.5624 +vt 0.2423 0.5546 +vt 0.2501 0.5546 +vt 0.2501 0.5624 +vt 0.2423 0.5624 +vt 0.0549 0.6170 +vt 0.0627 0.6170 +vt 0.0627 0.6248 +vt 0.0549 0.6248 +vt 0.0549 0.5545 +vt 0.0627 0.5545 +vt 0.0627 0.5623 +vt 0.0549 0.5623 +vt 0.1174 0.5545 +vt 0.1252 0.5545 +vt 0.1252 0.5623 +vt 0.1174 0.5623 +vt 0.0548 0.7419 +vt 0.0627 0.7419 +vt 0.0626 0.7497 +vt 0.0548 0.7497 +vt 0.0549 0.6794 +vt 0.0627 0.6794 +vt 0.0627 0.6872 +vt 0.0549 0.6872 +vt 0.1173 0.6795 +vt 0.1251 0.6795 +vt 0.1251 0.6873 +vt 0.1173 0.6873 +vt 0.4297 0.6171 +vt 0.4375 0.6171 +vt 0.4375 0.6249 +vt 0.4297 0.6249 +vt 0.4297 0.5546 +vt 0.4375 0.5546 +vt 0.4375 0.5624 +vt 0.4297 0.5624 +vt 0.4922 0.5546 +vt 0.5000 0.5546 +vt 0.5000 0.5625 +vt 0.4922 0.5625 +vt 0.3048 0.6171 +vt 0.3126 0.6171 +vt 0.3126 0.6249 +vt 0.3048 0.6249 +vt 0.3048 0.5546 +vt 0.3126 0.5546 +vt 0.3126 0.5624 +vt 0.3048 0.5624 +vt 0.3672 0.5546 +vt 0.3751 0.5546 +vt 0.3750 0.5624 +vt 0.3672 0.5624 +vt 0.3047 0.7420 +vt 0.3125 0.7420 +vt 0.3125 0.7498 +vt 0.3047 0.7498 +vt 0.3047 0.6795 +vt 0.3125 0.6795 +vt 0.3125 0.6873 +vt 0.3047 0.6873 +vt 0.3672 0.6795 +vt 0.3750 0.6795 +vt 0.3750 0.6873 +vt 0.3672 0.6873 +vt 0.6795 0.8670 +vt 0.6873 0.8670 +vt 0.6873 0.8748 +vt 0.6795 0.8748 +vt 0.6795 0.8046 +vt 0.6873 0.8046 +vt 0.6873 0.8124 +vt 0.6795 0.8124 +vt 0.7420 0.8046 +vt 0.7498 0.8046 +vt 0.7498 0.8124 +vt 0.7420 0.8124 +vt 0.5545 0.8670 +vt 0.5624 0.8670 +vt 0.5624 0.8748 +vt 0.5545 0.8748 +vt 0.5546 0.8045 +vt 0.5624 0.8045 +vt 0.5624 0.8123 +vt 0.5546 0.8123 +vt 0.6170 0.8045 +vt 0.6248 0.8046 +vt 0.6248 0.8124 +vt 0.6170 0.8124 +vt 0.5545 0.9919 +vt 0.5623 0.9919 +vt 0.5623 0.9997 +vt 0.5545 0.9997 +vt 0.5545 0.9295 +vt 0.5623 0.9295 +vt 0.5623 0.9373 +vt 0.5545 0.9373 +vt 0.6170 0.9295 +vt 0.6248 0.9295 +vt 0.6248 0.9373 +vt 0.6170 0.9373 +vt 0.6796 0.6172 +vt 0.6874 0.6172 +vt 0.6874 0.6250 +vt 0.6796 0.6250 +vt 0.6796 0.5547 +vt 0.6874 0.5547 +vt 0.6874 0.5625 +vt 0.6796 0.5625 +vt 0.7420 0.5547 +vt 0.7499 0.5547 +vt 0.7499 0.5625 +vt 0.7420 0.5625 +vt 0.5546 0.6171 +vt 0.5624 0.6171 +vt 0.5624 0.6249 +vt 0.5546 0.6249 +vt 0.5546 0.5547 +vt 0.5625 0.5547 +vt 0.5624 0.5625 +vt 0.5546 0.5625 +vt 0.6171 0.5547 +vt 0.6249 0.5547 +vt 0.6249 0.5625 +vt 0.6171 0.5625 +vt 0.5546 0.7421 +vt 0.5624 0.7421 +vt 0.5624 0.7499 +vt 0.5546 0.7499 +vt 0.5546 0.6796 +vt 0.5624 0.6796 +vt 0.5624 0.6874 +vt 0.5546 0.6874 +vt 0.6171 0.6796 +vt 0.6249 0.6796 +vt 0.6249 0.6874 +vt 0.6171 0.6874 +vt 0.9294 0.6172 +vt 0.9372 0.6172 +vt 0.9372 0.6251 +vt 0.9294 0.6251 +vt 0.9294 0.5548 +vt 0.9373 0.5548 +vt 0.9373 0.5626 +vt 0.9294 0.5626 +vt 0.9919 0.5548 +vt 0.9997 0.5548 +vt 0.9997 0.5626 +vt 0.9919 0.5626 +vt 0.8045 0.6172 +vt 0.8123 0.6172 +vt 0.8123 0.6250 +vt 0.8045 0.6250 +vt 0.8045 0.5547 +vt 0.8123 0.5547 +vt 0.8123 0.5626 +vt 0.8045 0.5625 +vt 0.8670 0.5548 +vt 0.8748 0.5548 +vt 0.8748 0.5626 +vt 0.8670 0.5626 +vt 0.8045 0.7421 +vt 0.8123 0.7421 +vt 0.8123 0.7500 +vt 0.8044 0.7499 +vt 0.8045 0.6797 +vt 0.8123 0.6797 +vt 0.8123 0.6875 +vt 0.8045 0.6875 +vt 0.8669 0.6797 +vt 0.8747 0.6797 +vt 0.8747 0.6875 +vt 0.8669 0.6875 +vt 0.9294 0.7422 +vt 0.9372 0.7422 +vt 0.9372 0.7500 +vt 0.9294 0.7500 +vt 0.9294 0.6797 +vt 0.9372 0.6797 +vt 0.9372 0.6875 +vt 0.9294 0.6875 +vt 0.9919 0.6797 +vt 0.9997 0.6797 +vt 0.9997 0.6875 +vt 0.9919 0.6875 +vt 0.6795 0.7421 +vt 0.6873 0.7421 +vt 0.6873 0.7499 +vt 0.6795 0.7499 +vt 0.6795 0.6796 +vt 0.6873 0.6796 +vt 0.6873 0.6874 +vt 0.6795 0.6874 +vt 0.7420 0.6797 +vt 0.7498 0.6797 +vt 0.7498 0.6875 +vt 0.7420 0.6875 +vt 0.6794 0.9920 +vt 0.6873 0.9920 +vt 0.6872 0.9998 +vt 0.6794 0.9998 +vt 0.6795 0.9295 +vt 0.6873 0.9295 +vt 0.6873 0.9373 +vt 0.6795 0.9373 +vt 0.7419 0.9295 +vt 0.7497 0.9295 +vt 0.7497 0.9373 +vt 0.7419 0.9373 +vt 0.4297 0.7420 +vt 0.4375 0.7420 +vt 0.4375 0.7498 +vt 0.4296 0.7498 +vt 0.4297 0.6796 +vt 0.4375 0.6796 +vt 0.4375 0.6874 +vt 0.4297 0.6874 +vt 0.4921 0.6796 +vt 0.4999 0.6796 +vt 0.4999 0.6874 +vt 0.4921 0.6874 +vt 0.1798 0.7419 +vt 0.1876 0.7419 +vt 0.1876 0.7498 +vt 0.1798 0.7498 +vt 0.1798 0.6795 +vt 0.1876 0.6795 +vt 0.1876 0.6873 +vt 0.1798 0.6873 +vt 0.2423 0.6795 +vt 0.2501 0.6795 +vt 0.2501 0.6873 +vt 0.2423 0.6873 +vt 0.1797 0.9918 +vt 0.1875 0.9918 +vt 0.1875 0.9996 +vt 0.1797 0.9996 +vt 0.1797 0.9294 +vt 0.1875 0.9294 +vt 0.1875 0.9372 +vt 0.1797 0.9372 +vt 0.2422 0.9294 +vt 0.2500 0.9294 +vt 0.2500 0.9372 +vt 0.2422 0.9372 +vt 0.4298 0.2423 +vt 0.4376 0.2423 +vt 0.4376 0.2501 +vt 0.4298 0.2501 +vt 0.4298 0.1798 +vt 0.4376 0.1798 +vt 0.4376 0.1876 +vt 0.4298 0.1876 +vt 0.4923 0.1798 +vt 0.5001 0.1798 +vt 0.5001 0.1877 +vt 0.4923 0.1876 +vt 0.1799 0.2422 +vt 0.1877 0.2422 +vt 0.1877 0.2500 +vt 0.1799 0.2500 +vt 0.1800 0.1797 +vt 0.1878 0.1797 +vt 0.1878 0.1876 +vt 0.1800 0.1876 +vt 0.2424 0.1798 +vt 0.2502 0.1798 +vt 0.2502 0.1876 +vt 0.2424 0.1876 +vt 0.1799 0.4921 +vt 0.1877 0.4921 +vt 0.1877 0.4999 +vt 0.1799 0.4999 +vt 0.1799 0.4296 +vt 0.1877 0.4296 +vt 0.1877 0.4374 +vt 0.1799 0.4374 +vt 0.2423 0.4296 +vt 0.2502 0.4296 +vt 0.2502 0.4374 +vt 0.2423 0.4374 +vt 0.9295 0.2424 +vt 0.9374 0.2424 +vt 0.9374 0.2503 +vt 0.9295 0.2503 +vt 0.9296 0.1800 +vt 0.9374 0.1800 +vt 0.9374 0.1878 +vt 0.9296 0.1878 +vt 0.9920 0.1800 +vt 0.9998 0.1800 +vt 0.9998 0.1878 +vt 0.9920 0.1878 +vt 0.6797 0.2424 +vt 0.6875 0.2424 +vt 0.6875 0.2502 +vt 0.6797 0.2502 +vt 0.6797 0.1799 +vt 0.6875 0.1799 +vt 0.6875 0.1877 +vt 0.6797 0.1877 +vt 0.7422 0.1799 +vt 0.7500 0.1799 +vt 0.7500 0.1877 +vt 0.7422 0.1877 +vt 0.6796 0.4922 +vt 0.6874 0.4922 +vt 0.6874 0.5000 +vt 0.6796 0.5000 +vt 0.6796 0.4298 +vt 0.6874 0.4298 +vt 0.6874 0.4376 +vt 0.6796 0.4376 +vt 0.7421 0.4298 +vt 0.7499 0.4298 +vt 0.7499 0.4376 +vt 0.7421 0.4376 +vt 0.9295 0.4923 +vt 0.9373 0.4923 +vt 0.9373 0.5001 +vt 0.9295 0.5001 +vt 0.9295 0.4298 +vt 0.9373 0.4298 +vt 0.9373 0.4377 +vt 0.9295 0.4377 +vt 0.9920 0.4299 +vt 0.9998 0.4299 +vt 0.9998 0.4377 +vt 0.9920 0.4377 +vt 0.4297 0.4922 +vt 0.4375 0.4922 +vt 0.4375 0.5000 +vt 0.4297 0.5000 +vt 0.4297 0.4297 +vt 0.4376 0.4297 +vt 0.4376 0.4375 +vt 0.4297 0.4375 +vt 0.4922 0.4297 +vt 0.5000 0.4297 +vt 0.5000 0.4375 +vt 0.4922 0.4375 +vt 0.4296 0.9919 +vt 0.4374 0.9919 +vt 0.4374 0.9997 +vt 0.4296 0.9997 +vt 0.4296 0.9294 +vt 0.4374 0.9294 +vt 0.4374 0.9372 +vt 0.4296 0.9372 +vt 0.4921 0.9294 +vt 0.4999 0.9294 +vt 0.4999 0.9373 +vt 0.4921 0.9373 +vt 0.9293 0.9920 +vt 0.9371 0.9920 +vt 0.9371 0.9999 +vt 0.9293 0.9999 +vt 0.9293 0.9296 +vt 0.9371 0.9296 +vt 0.9371 0.9374 +vt 0.9293 0.9374 +vt 0.9918 0.9296 +vt 0.9996 0.9296 +vt 0.9996 0.9374 +vt 0.9918 0.9374 +vt 0.9606 0.9296 +vt 0.9684 0.9296 +vt 0.9684 0.9374 +vt 0.9606 0.9374 +vt 0.9606 0.8984 +vt 0.9684 0.8984 +vt 0.9684 0.9062 +vt 0.9606 0.9062 +vt 0.9918 0.8984 +vt 0.9996 0.8984 +vt 0.9996 0.9062 +vt 0.9918 0.9062 +vt 0.8981 0.9296 +vt 0.9059 0.9296 +vt 0.9059 0.9374 +vt 0.8981 0.9374 +vt 0.8981 0.8983 +vt 0.9059 0.8983 +vt 0.9059 0.9061 +vt 0.8981 0.9061 +vt 0.9293 0.8983 +vt 0.9371 0.8983 +vt 0.9371 0.9062 +vt 0.9293 0.9062 +vt 0.8981 0.9920 +vt 0.9059 0.9920 +vt 0.9059 0.9998 +vt 0.8981 0.9998 +vt 0.8981 0.9608 +vt 0.9059 0.9608 +vt 0.9059 0.9686 +vt 0.8981 0.9686 +vt 0.9293 0.9608 +vt 0.9371 0.9608 +vt 0.9371 0.9686 +vt 0.9293 0.9686 +vt 0.4608 0.9294 +vt 0.4686 0.9294 +vt 0.4686 0.9372 +vt 0.4608 0.9372 +vt 0.4608 0.8982 +vt 0.4686 0.8982 +vt 0.4686 0.9060 +vt 0.4608 0.9060 +vt 0.4921 0.8982 +vt 0.4999 0.8982 +vt 0.4999 0.9060 +vt 0.4921 0.9060 +vt 0.3984 0.9294 +vt 0.4062 0.9294 +vt 0.4062 0.9372 +vt 0.3984 0.9372 +vt 0.3984 0.8982 +vt 0.4062 0.8982 +vt 0.4062 0.9060 +vt 0.3984 0.9060 +vt 0.4296 0.8982 +vt 0.4374 0.8982 +vt 0.4374 0.9060 +vt 0.4296 0.9060 +vt 0.3983 0.9919 +vt 0.4061 0.9919 +vt 0.4061 0.9997 +vt 0.3983 0.9997 +vt 0.3984 0.9607 +vt 0.4062 0.9607 +vt 0.4062 0.9685 +vt 0.3983 0.9685 +vt 0.4296 0.9607 +vt 0.4374 0.9607 +vt 0.4374 0.9685 +vt 0.4296 0.9685 +vt 0.4610 0.4297 +vt 0.4688 0.4297 +vt 0.4688 0.4375 +vt 0.4610 0.4375 +vt 0.4610 0.3985 +vt 0.4688 0.3985 +vt 0.4688 0.4063 +vt 0.4610 0.4063 +vt 0.4922 0.3985 +vt 0.5000 0.3985 +vt 0.5000 0.4063 +vt 0.4922 0.4063 +vt 0.3985 0.4297 +vt 0.4063 0.4297 +vt 0.4063 0.4375 +vt 0.3985 0.4375 +vt 0.3985 0.3984 +vt 0.4063 0.3984 +vt 0.4063 0.4063 +vt 0.3985 0.4063 +vt 0.4298 0.3985 +vt 0.4376 0.3985 +vt 0.4376 0.4063 +vt 0.4298 0.4063 +vt 0.3985 0.4921 +vt 0.4063 0.4921 +vt 0.4063 0.5000 +vt 0.3985 0.5000 +vt 0.3985 0.4609 +vt 0.4063 0.4609 +vt 0.4063 0.4687 +vt 0.3985 0.4687 +vt 0.4297 0.4609 +vt 0.4375 0.4609 +vt 0.4375 0.4687 +vt 0.4297 0.4687 +vt 0.9607 0.4299 +vt 0.9685 0.4299 +vt 0.9685 0.4377 +vt 0.9607 0.4377 +vt 0.9607 0.3986 +vt 0.9685 0.3986 +vt 0.9685 0.4064 +vt 0.9607 0.4064 +vt 0.9920 0.3986 +vt 0.9998 0.3986 +vt 0.9998 0.4064 +vt 0.9920 0.4064 +vt 0.8983 0.4298 +vt 0.9061 0.4298 +vt 0.9061 0.4376 +vt 0.8982 0.4376 +vt 0.8983 0.3986 +vt 0.9061 0.3986 +vt 0.9061 0.4064 +vt 0.8983 0.4064 +vt 0.9295 0.3986 +vt 0.9373 0.3986 +vt 0.9373 0.4064 +vt 0.9295 0.4064 +vt 0.8982 0.4923 +vt 0.9060 0.4923 +vt 0.9060 0.5001 +vt 0.8982 0.5001 +vt 0.8982 0.4611 +vt 0.9061 0.4611 +vt 0.9060 0.4689 +vt 0.8982 0.4689 +vt 0.9295 0.4611 +vt 0.9373 0.4611 +vt 0.9373 0.4689 +vt 0.9295 0.4689 +vt 0.7109 0.4298 +vt 0.7187 0.4298 +vt 0.7187 0.4376 +vt 0.7108 0.4376 +vt 0.7109 0.3985 +vt 0.7187 0.3985 +vt 0.7187 0.4064 +vt 0.7109 0.4064 +vt 0.7421 0.3986 +vt 0.7499 0.3986 +vt 0.7499 0.4064 +vt 0.7421 0.4064 +vt 0.6484 0.4298 +vt 0.6562 0.4298 +vt 0.6562 0.4376 +vt 0.6484 0.4376 +vt 0.6484 0.3985 +vt 0.6562 0.3985 +vt 0.6562 0.4063 +vt 0.6484 0.4063 +vt 0.6796 0.3985 +vt 0.6874 0.3985 +vt 0.6874 0.4063 +vt 0.6796 0.4063 +vt 0.6484 0.4922 +vt 0.6562 0.4922 +vt 0.6562 0.5000 +vt 0.6484 0.5000 +vt 0.6484 0.4610 +vt 0.6562 0.4610 +vt 0.6562 0.4688 +vt 0.6484 0.4688 +vt 0.6796 0.4610 +vt 0.6874 0.4610 +vt 0.6874 0.4688 +vt 0.6796 0.4688 +vt 0.7109 0.1799 +vt 0.7187 0.1799 +vt 0.7187 0.1877 +vt 0.7109 0.1877 +vt 0.7109 0.1487 +vt 0.7187 0.1487 +vt 0.7187 0.1565 +vt 0.7109 0.1565 +vt 0.7422 0.1487 +vt 0.7500 0.1487 +vt 0.7500 0.1565 +vt 0.7422 0.1565 +vt 0.6485 0.1799 +vt 0.6563 0.1799 +vt 0.6563 0.1877 +vt 0.6485 0.1877 +vt 0.6485 0.1487 +vt 0.6563 0.1487 +vt 0.6563 0.1565 +vt 0.6485 0.1565 +vt 0.6797 0.1487 +vt 0.6875 0.1487 +vt 0.6875 0.1565 +vt 0.6797 0.1565 +vt 0.6484 0.2424 +vt 0.6562 0.2424 +vt 0.6562 0.2502 +vt 0.6484 0.2502 +vt 0.6485 0.2111 +vt 0.6563 0.2111 +vt 0.6563 0.2189 +vt 0.6484 0.2189 +vt 0.6797 0.2111 +vt 0.6875 0.2111 +vt 0.6875 0.2189 +vt 0.6797 0.2189 +vt 0.9608 0.1800 +vt 0.9686 0.1800 +vt 0.9686 0.1878 +vt 0.9608 0.1878 +vt 0.9608 0.1488 +vt 0.9686 0.1488 +vt 0.9686 0.1566 +vt 0.9608 0.1566 +vt 0.9920 0.1488 +vt 0.9999 0.1488 +vt 0.9999 0.1566 +vt 0.9920 0.1566 +vt 0.8983 0.1800 +vt 0.9061 0.1800 +vt 0.9061 0.1878 +vt 0.8983 0.1878 +vt 0.8983 0.1487 +vt 0.9062 0.1487 +vt 0.9061 0.1565 +vt 0.8983 0.1565 +vt 0.9296 0.1487 +vt 0.9374 0.1487 +vt 0.9374 0.1566 +vt 0.9296 0.1565 +vt 0.8983 0.2424 +vt 0.9061 0.2424 +vt 0.9061 0.2502 +vt 0.8983 0.2502 +vt 0.8983 0.2112 +vt 0.9061 0.2112 +vt 0.9061 0.2190 +vt 0.8983 0.2190 +vt 0.9296 0.2112 +vt 0.9374 0.2112 +vt 0.9374 0.2190 +vt 0.9296 0.2190 +vt 0.2111 0.4296 +vt 0.2189 0.4296 +vt 0.2189 0.4374 +vt 0.2111 0.4374 +vt 0.2111 0.3984 +vt 0.2189 0.3984 +vt 0.2189 0.4062 +vt 0.2111 0.4062 +vt 0.2424 0.3984 +vt 0.2502 0.3984 +vt 0.2502 0.4062 +vt 0.2424 0.4062 +vt 0.1486 0.4296 +vt 0.1565 0.4296 +vt 0.1565 0.4374 +vt 0.1486 0.4374 +vt 0.1487 0.3984 +vt 0.1565 0.3984 +vt 0.1565 0.4062 +vt 0.1487 0.4062 +vt 0.1799 0.3984 +vt 0.1877 0.3984 +vt 0.1877 0.4062 +vt 0.1799 0.4062 +vt 0.1486 0.4921 +vt 0.1564 0.4921 +vt 0.1564 0.4999 +vt 0.1486 0.4999 +vt 0.1486 0.4608 +vt 0.1564 0.4608 +vt 0.1564 0.4686 +vt 0.1486 0.4686 +vt 0.1799 0.4608 +vt 0.1877 0.4608 +vt 0.1877 0.4687 +vt 0.1799 0.4687 +vt 0.2112 0.1798 +vt 0.2190 0.1798 +vt 0.2190 0.1876 +vt 0.2112 0.1876 +vt 0.2112 0.1485 +vt 0.2190 0.1485 +vt 0.2190 0.1563 +vt 0.2112 0.1563 +vt 0.2424 0.1485 +vt 0.2502 0.1485 +vt 0.2502 0.1563 +vt 0.2424 0.1563 +vt 0.1487 0.1797 +vt 0.1565 0.1797 +vt 0.1565 0.1875 +vt 0.1487 0.1875 +vt 0.1487 0.1485 +vt 0.1565 0.1485 +vt 0.1565 0.1563 +vt 0.1487 0.1563 +vt 0.1800 0.1485 +vt 0.1878 0.1485 +vt 0.1878 0.1563 +vt 0.1800 0.1563 +vt 0.1487 0.2422 +vt 0.1565 0.2422 +vt 0.1565 0.2500 +vt 0.1487 0.2500 +vt 0.1487 0.2110 +vt 0.1565 0.2110 +vt 0.1565 0.2188 +vt 0.1487 0.2188 +vt 0.1800 0.2110 +vt 0.1878 0.2110 +vt 0.1878 0.2188 +vt 0.1799 0.2188 +vt 0.4611 0.1798 +vt 0.4689 0.1798 +vt 0.4689 0.1876 +vt 0.4611 0.1876 +vt 0.4611 0.1486 +vt 0.4689 0.1486 +vt 0.4689 0.1564 +vt 0.4611 0.1564 +vt 0.4923 0.1486 +vt 0.5001 0.1486 +vt 0.5001 0.1564 +vt 0.4923 0.1564 +vt 0.3986 0.1798 +vt 0.4064 0.1798 +vt 0.4064 0.1876 +vt 0.3986 0.1876 +vt 0.3986 0.1486 +vt 0.4064 0.1486 +vt 0.4064 0.1564 +vt 0.3986 0.1564 +vt 0.4298 0.1486 +vt 0.4376 0.1486 +vt 0.4376 0.1564 +vt 0.4298 0.1564 +vt 0.3986 0.2423 +vt 0.4064 0.2423 +vt 0.4064 0.2501 +vt 0.3986 0.2501 +vt 0.3986 0.2110 +vt 0.4064 0.2110 +vt 0.4064 0.2189 +vt 0.3986 0.2189 +vt 0.4298 0.2111 +vt 0.4376 0.2111 +vt 0.4376 0.2189 +vt 0.4298 0.2189 +vt 0.2110 0.9294 +vt 0.2188 0.9294 +vt 0.2188 0.9372 +vt 0.2110 0.9372 +vt 0.2110 0.8981 +vt 0.2188 0.8981 +vt 0.2188 0.9059 +vt 0.2110 0.9059 +vt 0.2422 0.8981 +vt 0.2500 0.8981 +vt 0.2500 0.9059 +vt 0.2422 0.9059 +vt 0.1485 0.9293 +vt 0.1563 0.9293 +vt 0.1563 0.9372 +vt 0.1485 0.9372 +vt 0.1485 0.8981 +vt 0.1563 0.8981 +vt 0.1563 0.9059 +vt 0.1485 0.9059 +vt 0.1797 0.8981 +vt 0.1875 0.8981 +vt 0.1875 0.9059 +vt 0.1797 0.9059 +vt 0.1485 0.9918 +vt 0.1563 0.9918 +vt 0.1563 0.9996 +vt 0.1485 0.9996 +vt 0.1485 0.9606 +vt 0.1563 0.9606 +vt 0.1563 0.9684 +vt 0.1485 0.9684 +vt 0.1797 0.9606 +vt 0.1875 0.9606 +vt 0.1875 0.9684 +vt 0.1797 0.9684 +vt 0.2110 0.6795 +vt 0.2188 0.6795 +vt 0.2188 0.6873 +vt 0.2110 0.6873 +vt 0.2110 0.6483 +vt 0.2189 0.6483 +vt 0.2188 0.6561 +vt 0.2110 0.6561 +vt 0.2423 0.6483 +vt 0.2501 0.6483 +vt 0.2501 0.6561 +vt 0.2423 0.6561 +vt 0.1486 0.6795 +vt 0.1564 0.6795 +vt 0.1564 0.6873 +vt 0.1486 0.6873 +vt 0.1486 0.6482 +vt 0.1564 0.6482 +vt 0.1564 0.6560 +vt 0.1486 0.6560 +vt 0.1798 0.6482 +vt 0.1876 0.6482 +vt 0.1876 0.6561 +vt 0.1798 0.6561 +vt 0.1485 0.7419 +vt 0.1564 0.7419 +vt 0.1564 0.7497 +vt 0.1485 0.7497 +vt 0.1486 0.7107 +vt 0.1564 0.7107 +vt 0.1564 0.7185 +vt 0.1486 0.7185 +vt 0.1798 0.7107 +vt 0.1876 0.7107 +vt 0.1876 0.7185 +vt 0.1798 0.7185 +vt 0.4609 0.6796 +vt 0.4687 0.6796 +vt 0.4687 0.6874 +vt 0.4609 0.6874 +vt 0.4609 0.6483 +vt 0.4687 0.6483 +vt 0.4687 0.6561 +vt 0.4609 0.6561 +vt 0.4921 0.6483 +vt 0.5000 0.6483 +vt 0.5000 0.6562 +vt 0.4921 0.6562 +vt 0.3984 0.6795 +vt 0.4062 0.6796 +vt 0.4062 0.6874 +vt 0.3984 0.6874 +vt 0.3984 0.6483 +vt 0.4063 0.6483 +vt 0.4063 0.6561 +vt 0.3984 0.6561 +vt 0.4297 0.6483 +vt 0.4375 0.6483 +vt 0.4375 0.6561 +vt 0.4297 0.6561 +vt 0.3984 0.7420 +vt 0.4062 0.7420 +vt 0.4062 0.7498 +vt 0.3984 0.7498 +vt 0.3984 0.7108 +vt 0.4062 0.7108 +vt 0.4062 0.7186 +vt 0.3984 0.7186 +vt 0.4297 0.7108 +vt 0.4375 0.7108 +vt 0.4375 0.7186 +vt 0.4297 0.7186 +vt 0.7107 0.9295 +vt 0.7185 0.9295 +vt 0.7185 0.9373 +vt 0.7107 0.9373 +vt 0.7107 0.8983 +vt 0.7185 0.8983 +vt 0.7185 0.9061 +vt 0.7107 0.9061 +vt 0.7419 0.8983 +vt 0.7497 0.8983 +vt 0.7497 0.9061 +vt 0.7419 0.9061 +vt 0.6482 0.9295 +vt 0.6560 0.9295 +vt 0.6560 0.9373 +vt 0.6482 0.9373 +vt 0.6482 0.8983 +vt 0.6560 0.8983 +vt 0.6560 0.9061 +vt 0.6482 0.9061 +vt 0.6795 0.8983 +vt 0.6873 0.8983 +vt 0.6873 0.9061 +vt 0.6795 0.9061 +vt 0.6482 0.9920 +vt 0.6560 0.9920 +vt 0.6560 0.9998 +vt 0.6482 0.9998 +vt 0.6482 0.9607 +vt 0.6560 0.9607 +vt 0.6560 0.9685 +vt 0.6482 0.9685 +vt 0.6795 0.9607 +vt 0.6873 0.9607 +vt 0.6873 0.9685 +vt 0.6795 0.9685 +vt 0.7108 0.6796 +vt 0.7186 0.6796 +vt 0.7186 0.6875 +vt 0.7108 0.6875 +vt 0.7108 0.6484 +vt 0.7186 0.6484 +vt 0.7186 0.6562 +vt 0.7108 0.6562 +vt 0.7420 0.6484 +vt 0.7498 0.6484 +vt 0.7498 0.6562 +vt 0.7420 0.6562 +vt 0.6483 0.6796 +vt 0.6561 0.6796 +vt 0.6561 0.6874 +vt 0.6483 0.6874 +vt 0.6483 0.6484 +vt 0.6561 0.6484 +vt 0.6561 0.6562 +vt 0.6483 0.6562 +vt 0.6795 0.6484 +vt 0.6874 0.6484 +vt 0.6874 0.6562 +vt 0.6795 0.6562 +vt 0.6483 0.7421 +vt 0.6561 0.7421 +vt 0.6561 0.7499 +vt 0.6483 0.7499 +vt 0.6483 0.7109 +vt 0.6561 0.7109 +vt 0.6561 0.7187 +vt 0.6483 0.7187 +vt 0.6795 0.7109 +vt 0.6873 0.7109 +vt 0.6873 0.7187 +vt 0.6795 0.7187 +vt 0.9606 0.6797 +vt 0.9684 0.6797 +vt 0.9684 0.6875 +vt 0.9606 0.6875 +vt 0.9606 0.6485 +vt 0.9685 0.6485 +vt 0.9685 0.6563 +vt 0.9606 0.6563 +vt 0.9919 0.6485 +vt 0.9997 0.6485 +vt 0.9997 0.6563 +vt 0.9919 0.6563 +vt 0.8982 0.6797 +vt 0.9060 0.6797 +vt 0.9060 0.6875 +vt 0.8982 0.6875 +vt 0.8982 0.6485 +vt 0.9060 0.6485 +vt 0.9060 0.6563 +vt 0.8982 0.6563 +vt 0.9294 0.6485 +vt 0.9372 0.6485 +vt 0.9372 0.6563 +vt 0.9294 0.6563 +vt 0.8982 0.7422 +vt 0.9060 0.7422 +vt 0.9060 0.7500 +vt 0.8981 0.7500 +vt 0.8982 0.7109 +vt 0.9060 0.7109 +vt 0.9060 0.7187 +vt 0.8982 0.7187 +vt 0.9294 0.7109 +vt 0.9372 0.7109 +vt 0.9372 0.7188 +vt 0.9294 0.7188 +vt 0.8357 0.6797 +vt 0.8435 0.6797 +vt 0.8435 0.6875 +vt 0.8357 0.6875 +vt 0.8357 0.6485 +vt 0.8435 0.6485 +vt 0.8435 0.6563 +vt 0.8357 0.6563 +vt 0.8669 0.6485 +vt 0.8748 0.6485 +vt 0.8748 0.6563 +vt 0.8669 0.6563 +vt 0.7732 0.6797 +vt 0.7810 0.6797 +vt 0.7810 0.6875 +vt 0.7732 0.6875 +vt 0.7732 0.6484 +vt 0.7811 0.6484 +vt 0.7811 0.6562 +vt 0.7732 0.6562 +vt 0.8045 0.6484 +vt 0.8123 0.6484 +vt 0.8123 0.6563 +vt 0.8045 0.6562 +vt 0.7732 0.7421 +vt 0.7810 0.7421 +vt 0.7810 0.7499 +vt 0.7732 0.7499 +vt 0.7732 0.7109 +vt 0.7810 0.7109 +vt 0.7810 0.7187 +vt 0.7732 0.7187 +vt 0.8045 0.7109 +vt 0.8123 0.7109 +vt 0.8123 0.7187 +vt 0.8045 0.7187 +vt 0.8357 0.5548 +vt 0.8436 0.5548 +vt 0.8436 0.5626 +vt 0.8357 0.5626 +vt 0.8358 0.5235 +vt 0.8436 0.5235 +vt 0.8436 0.5313 +vt 0.8358 0.5313 +vt 0.8670 0.5235 +vt 0.8748 0.5235 +vt 0.8748 0.5313 +vt 0.8670 0.5313 +vt 0.7733 0.5547 +vt 0.7811 0.5547 +vt 0.7811 0.5625 +vt 0.7733 0.5625 +vt 0.7733 0.5235 +vt 0.7811 0.5235 +vt 0.7811 0.5313 +vt 0.7733 0.5313 +vt 0.8045 0.5235 +vt 0.8123 0.5235 +vt 0.8123 0.5313 +vt 0.8045 0.5313 +vt 0.7733 0.6172 +vt 0.7811 0.6172 +vt 0.7811 0.6250 +vt 0.7733 0.6250 +vt 0.7733 0.5860 +vt 0.7811 0.5860 +vt 0.7811 0.5938 +vt 0.7733 0.5938 +vt 0.8045 0.5860 +vt 0.8123 0.5860 +vt 0.8123 0.5938 +vt 0.8045 0.5938 +vt 0.9607 0.5548 +vt 0.9685 0.5548 +vt 0.9685 0.5626 +vt 0.9607 0.5626 +vt 0.9607 0.5236 +vt 0.9685 0.5236 +vt 0.9685 0.5314 +vt 0.9607 0.5314 +vt 0.9919 0.5236 +vt 0.9997 0.5236 +vt 0.9997 0.5314 +vt 0.9919 0.5314 +vt 0.8982 0.5548 +vt 0.9060 0.5548 +vt 0.9060 0.5626 +vt 0.8982 0.5626 +vt 0.8982 0.5235 +vt 0.9060 0.5235 +vt 0.9060 0.5313 +vt 0.8982 0.5313 +vt 0.9295 0.5235 +vt 0.9373 0.5235 +vt 0.9373 0.5314 +vt 0.9295 0.5314 +vt 0.8982 0.6172 +vt 0.9060 0.6172 +vt 0.9060 0.6250 +vt 0.8982 0.6250 +vt 0.8982 0.5860 +vt 0.9060 0.5860 +vt 0.9060 0.5938 +vt 0.8982 0.5938 +vt 0.9294 0.5860 +vt 0.9372 0.5860 +vt 0.9372 0.5938 +vt 0.9294 0.5938 +vt 0.5858 0.6796 +vt 0.5936 0.6796 +vt 0.5936 0.6874 +vt 0.5858 0.6874 +vt 0.5858 0.6484 +vt 0.5937 0.6484 +vt 0.5937 0.6562 +vt 0.5858 0.6562 +vt 0.6171 0.6484 +vt 0.6249 0.6484 +vt 0.6249 0.6562 +vt 0.6171 0.6562 +vt 0.5234 0.6796 +vt 0.5312 0.6796 +vt 0.5312 0.6874 +vt 0.5234 0.6874 +vt 0.5234 0.6484 +vt 0.5312 0.6484 +vt 0.5312 0.6562 +vt 0.5234 0.6562 +vt 0.5546 0.6484 +vt 0.5624 0.6484 +vt 0.5624 0.6562 +vt 0.5546 0.6562 +vt 0.5234 0.7421 +vt 0.5312 0.7421 +vt 0.5312 0.7499 +vt 0.5233 0.7499 +vt 0.5234 0.7108 +vt 0.5312 0.7108 +vt 0.5312 0.7186 +vt 0.5234 0.7186 +vt 0.5546 0.7108 +vt 0.5624 0.7108 +vt 0.5624 0.7186 +vt 0.5546 0.7186 +vt 0.5859 0.5547 +vt 0.5937 0.5547 +vt 0.5937 0.5625 +vt 0.5859 0.5625 +vt 0.5859 0.5234 +vt 0.5937 0.5234 +vt 0.5937 0.5312 +vt 0.5859 0.5312 +vt 0.6171 0.5234 +vt 0.6249 0.5235 +vt 0.6249 0.5313 +vt 0.6171 0.5313 +vt 0.5234 0.5547 +vt 0.5312 0.5547 +vt 0.5312 0.5625 +vt 0.5234 0.5625 +vt 0.5234 0.5234 +vt 0.5312 0.5234 +vt 0.5312 0.5312 +vt 0.5234 0.5312 +vt 0.5547 0.5234 +vt 0.5625 0.5234 +vt 0.5625 0.5312 +vt 0.5547 0.5312 +vt 0.5234 0.6171 +vt 0.5312 0.6171 +vt 0.5312 0.6249 +vt 0.5234 0.6249 +vt 0.5234 0.5859 +vt 0.5312 0.5859 +vt 0.5312 0.5937 +vt 0.5234 0.5937 +vt 0.5546 0.5859 +vt 0.5624 0.5859 +vt 0.5624 0.5937 +vt 0.5546 0.5937 +vt 0.7108 0.5547 +vt 0.7186 0.5547 +vt 0.7186 0.5625 +vt 0.7108 0.5625 +vt 0.7108 0.5235 +vt 0.7186 0.5235 +vt 0.7186 0.5313 +vt 0.7108 0.5313 +vt 0.7421 0.5235 +vt 0.7499 0.5235 +vt 0.7499 0.5313 +vt 0.7421 0.5313 +vt 0.6483 0.5547 +vt 0.6562 0.5547 +vt 0.6561 0.5625 +vt 0.6483 0.5625 +vt 0.6484 0.5235 +vt 0.6562 0.5235 +vt 0.6562 0.5313 +vt 0.6484 0.5313 +vt 0.6796 0.5235 +vt 0.6874 0.5235 +vt 0.6874 0.5313 +vt 0.6796 0.5313 +vt 0.6483 0.6172 +vt 0.6561 0.6172 +vt 0.6561 0.6250 +vt 0.6483 0.6250 +vt 0.6483 0.5859 +vt 0.6561 0.5859 +vt 0.6561 0.5937 +vt 0.6483 0.5937 +vt 0.6796 0.5859 +vt 0.6874 0.5859 +vt 0.6874 0.5937 +vt 0.6796 0.5937 +vt 0.5858 0.9295 +vt 0.5936 0.9295 +vt 0.5936 0.9373 +vt 0.5858 0.9373 +vt 0.5858 0.8982 +vt 0.5936 0.8982 +vt 0.5936 0.9061 +vt 0.5858 0.9060 +vt 0.6170 0.8982 +vt 0.6248 0.8983 +vt 0.6248 0.9061 +vt 0.6170 0.9061 +vt 0.5233 0.9295 +vt 0.5311 0.9295 +vt 0.5311 0.9373 +vt 0.5233 0.9373 +vt 0.5233 0.8982 +vt 0.5311 0.8982 +vt 0.5311 0.9060 +vt 0.5233 0.9060 +vt 0.5545 0.8982 +vt 0.5623 0.8982 +vt 0.5623 0.9060 +vt 0.5545 0.9060 +vt 0.5233 0.9919 +vt 0.5311 0.9919 +vt 0.5311 0.9997 +vt 0.5233 0.9997 +vt 0.5233 0.9607 +vt 0.5311 0.9607 +vt 0.5311 0.9685 +vt 0.5233 0.9685 +vt 0.5545 0.9607 +vt 0.5623 0.9607 +vt 0.5623 0.9685 +vt 0.5545 0.9685 +vt 0.5858 0.8045 +vt 0.5936 0.8045 +vt 0.5936 0.8124 +vt 0.5858 0.8123 +vt 0.5858 0.7733 +vt 0.5936 0.7733 +vt 0.5936 0.7811 +vt 0.5858 0.7811 +vt 0.6170 0.7733 +vt 0.6249 0.7733 +vt 0.6248 0.7811 +vt 0.6170 0.7811 +vt 0.5233 0.8045 +vt 0.5311 0.8045 +vt 0.5311 0.8123 +vt 0.5233 0.8123 +vt 0.5233 0.7733 +vt 0.5312 0.7733 +vt 0.5311 0.7811 +vt 0.5233 0.7811 +vt 0.5546 0.7733 +vt 0.5624 0.7733 +vt 0.5624 0.7811 +vt 0.5546 0.7811 +vt 0.5233 0.8670 +vt 0.5311 0.8670 +vt 0.5311 0.8748 +vt 0.5233 0.8748 +vt 0.5233 0.8358 +vt 0.5311 0.8358 +vt 0.5311 0.8436 +vt 0.5233 0.8436 +vt 0.5546 0.8358 +vt 0.5624 0.8358 +vt 0.5624 0.8436 +vt 0.5546 0.8436 +vt 0.7107 0.8046 +vt 0.7185 0.8046 +vt 0.7185 0.8124 +vt 0.7107 0.8124 +vt 0.7107 0.7733 +vt 0.7186 0.7733 +vt 0.7185 0.7812 +vt 0.7107 0.7812 +vt 0.7420 0.7734 +vt 0.7498 0.7734 +vt 0.7498 0.7812 +vt 0.7420 0.7812 +vt 0.6483 0.8046 +vt 0.6561 0.8046 +vt 0.6561 0.8124 +vt 0.6483 0.8124 +vt 0.6483 0.7733 +vt 0.6561 0.7733 +vt 0.6561 0.7811 +vt 0.6483 0.7811 +vt 0.6795 0.7733 +vt 0.6873 0.7733 +vt 0.6873 0.7811 +vt 0.6795 0.7811 +vt 0.6482 0.8670 +vt 0.6561 0.8670 +vt 0.6561 0.8748 +vt 0.6482 0.8748 +vt 0.6483 0.8358 +vt 0.6561 0.8358 +vt 0.6561 0.8436 +vt 0.6483 0.8436 +vt 0.6795 0.8358 +vt 0.6873 0.8358 +vt 0.6873 0.8436 +vt 0.6795 0.8436 +vt 0.3360 0.6795 +vt 0.3438 0.6795 +vt 0.3438 0.6873 +vt 0.3360 0.6873 +vt 0.3360 0.6483 +vt 0.3438 0.6483 +vt 0.3438 0.6561 +vt 0.3360 0.6561 +vt 0.3672 0.6483 +vt 0.3750 0.6483 +vt 0.3750 0.6561 +vt 0.3672 0.6561 +vt 0.2735 0.6795 +vt 0.2813 0.6795 +vt 0.2813 0.6873 +vt 0.2735 0.6873 +vt 0.2735 0.6483 +vt 0.2813 0.6483 +vt 0.2813 0.6561 +vt 0.2735 0.6561 +vt 0.3047 0.6483 +vt 0.3126 0.6483 +vt 0.3126 0.6561 +vt 0.3047 0.6561 +vt 0.2735 0.7420 +vt 0.2813 0.7420 +vt 0.2813 0.7498 +vt 0.2735 0.7498 +vt 0.2735 0.7107 +vt 0.2813 0.7107 +vt 0.2813 0.7186 +vt 0.2735 0.7186 +vt 0.3047 0.7108 +vt 0.3125 0.7108 +vt 0.3125 0.7186 +vt 0.3047 0.7186 +vt 0.3360 0.5546 +vt 0.3438 0.5546 +vt 0.3438 0.5624 +vt 0.3360 0.5624 +vt 0.3360 0.5234 +vt 0.3438 0.5234 +vt 0.3438 0.5312 +vt 0.3360 0.5312 +vt 0.3673 0.5234 +vt 0.3751 0.5234 +vt 0.3751 0.5312 +vt 0.3672 0.5312 +vt 0.2735 0.5546 +vt 0.2813 0.5546 +vt 0.2813 0.5624 +vt 0.2735 0.5624 +vt 0.2736 0.5233 +vt 0.2814 0.5233 +vt 0.2814 0.5312 +vt 0.2735 0.5311 +vt 0.3048 0.5233 +vt 0.3126 0.5234 +vt 0.3126 0.5312 +vt 0.3048 0.5312 +vt 0.2735 0.6170 +vt 0.2813 0.6170 +vt 0.2813 0.6249 +vt 0.2735 0.6248 +vt 0.2735 0.5858 +vt 0.2813 0.5858 +vt 0.2813 0.5936 +vt 0.2735 0.5936 +vt 0.3048 0.5858 +vt 0.3126 0.5858 +vt 0.3126 0.5936 +vt 0.3048 0.5936 +vt 0.4609 0.5546 +vt 0.4688 0.5546 +vt 0.4687 0.5624 +vt 0.4609 0.5624 +vt 0.4610 0.5234 +vt 0.4688 0.5234 +vt 0.4688 0.5312 +vt 0.4609 0.5312 +vt 0.4922 0.5234 +vt 0.5000 0.5234 +vt 0.5000 0.5312 +vt 0.4922 0.5312 +vt 0.3985 0.5546 +vt 0.4063 0.5546 +vt 0.4063 0.5624 +vt 0.3985 0.5624 +vt 0.3985 0.5234 +vt 0.4063 0.5234 +vt 0.4063 0.5312 +vt 0.3985 0.5312 +vt 0.4297 0.5234 +vt 0.4375 0.5234 +vt 0.4375 0.5312 +vt 0.4297 0.5312 +vt 0.3985 0.6171 +vt 0.4063 0.6171 +vt 0.4063 0.6249 +vt 0.3985 0.6249 +vt 0.3985 0.5858 +vt 0.4063 0.5858 +vt 0.4063 0.5937 +vt 0.3985 0.5937 +vt 0.4297 0.5859 +vt 0.4375 0.5859 +vt 0.4375 0.5937 +vt 0.4297 0.5937 +vt 0.0861 0.6794 +vt 0.0939 0.6795 +vt 0.0939 0.6873 +vt 0.0861 0.6873 +vt 0.0861 0.6482 +vt 0.0939 0.6482 +vt 0.0939 0.6560 +vt 0.0861 0.6560 +vt 0.1173 0.6482 +vt 0.1252 0.6482 +vt 0.1251 0.6560 +vt 0.1173 0.6560 +vt 0.0236 0.6794 +vt 0.0314 0.6794 +vt 0.0314 0.6872 +vt 0.0236 0.6872 +vt 0.0236 0.6482 +vt 0.0314 0.6482 +vt 0.0314 0.6560 +vt 0.0236 0.6560 +vt 0.0549 0.6482 +vt 0.0627 0.6482 +vt 0.0627 0.6560 +vt 0.0549 0.6560 +vt 0.0236 0.7419 +vt 0.0314 0.7419 +vt 0.0314 0.7497 +vt 0.0236 0.7497 +vt 0.0236 0.7107 +vt 0.0314 0.7107 +vt 0.0314 0.7185 +vt 0.0236 0.7185 +vt 0.0549 0.7107 +vt 0.0627 0.7107 +vt 0.0627 0.7185 +vt 0.0549 0.7185 +vt 0.0861 0.5545 +vt 0.0939 0.5545 +vt 0.0939 0.5623 +vt 0.0861 0.5623 +vt 0.0861 0.5233 +vt 0.0940 0.5233 +vt 0.0940 0.5311 +vt 0.0861 0.5311 +vt 0.1174 0.5233 +vt 0.1252 0.5233 +vt 0.1252 0.5311 +vt 0.1174 0.5311 +vt 0.0237 0.5545 +vt 0.0315 0.5545 +vt 0.0315 0.5623 +vt 0.0237 0.5623 +vt 0.0237 0.5233 +vt 0.0315 0.5233 +vt 0.0315 0.5311 +vt 0.0237 0.5311 +vt 0.0549 0.5233 +vt 0.0627 0.5233 +vt 0.0627 0.5311 +vt 0.0549 0.5311 +vt 0.0237 0.6170 +vt 0.0315 0.6170 +vt 0.0315 0.6248 +vt 0.0236 0.6248 +vt 0.0237 0.5857 +vt 0.0315 0.5857 +vt 0.0315 0.5935 +vt 0.0237 0.5935 +vt 0.0549 0.5857 +vt 0.0627 0.5857 +vt 0.0627 0.5935 +vt 0.0549 0.5935 +vt 0.2111 0.5546 +vt 0.2189 0.5546 +vt 0.2189 0.5624 +vt 0.2111 0.5624 +vt 0.2111 0.5233 +vt 0.2189 0.5233 +vt 0.2189 0.5311 +vt 0.2111 0.5311 +vt 0.2423 0.5233 +vt 0.2501 0.5233 +vt 0.2501 0.5311 +vt 0.2423 0.5311 +vt 0.1486 0.5545 +vt 0.1564 0.5545 +vt 0.1564 0.5623 +vt 0.1486 0.5623 +vt 0.1486 0.5233 +vt 0.1564 0.5233 +vt 0.1564 0.5311 +vt 0.1486 0.5311 +vt 0.1798 0.5233 +vt 0.1877 0.5233 +vt 0.1877 0.5311 +vt 0.1798 0.5311 +vt 0.1486 0.6170 +vt 0.1564 0.6170 +vt 0.1564 0.6248 +vt 0.1486 0.6248 +vt 0.1486 0.5858 +vt 0.1564 0.5858 +vt 0.1564 0.5936 +vt 0.1486 0.5936 +vt 0.1798 0.5858 +vt 0.1876 0.5858 +vt 0.1876 0.5936 +vt 0.1798 0.5936 +vt 0.0860 0.9293 +vt 0.0938 0.9293 +vt 0.0938 0.9371 +vt 0.0860 0.9371 +vt 0.0860 0.8981 +vt 0.0938 0.8981 +vt 0.0938 0.9059 +vt 0.0860 0.9059 +vt 0.1173 0.8981 +vt 0.1251 0.8981 +vt 0.1251 0.9059 +vt 0.1173 0.9059 +vt 0.0235 0.9293 +vt 0.0314 0.9293 +vt 0.0314 0.9371 +vt 0.0235 0.9371 +vt 0.0236 0.8981 +vt 0.0314 0.8981 +vt 0.0314 0.9059 +vt 0.0236 0.9059 +vt 0.0548 0.8981 +vt 0.0626 0.8981 +vt 0.0626 0.9059 +vt 0.0548 0.9059 +vt 0.0235 0.9918 +vt 0.0313 0.9918 +vt 0.0313 0.9996 +vt 0.0235 0.9996 +vt 0.0235 0.9605 +vt 0.0313 0.9605 +vt 0.0313 0.9683 +vt 0.0235 0.9683 +vt 0.0548 0.9605 +vt 0.0626 0.9605 +vt 0.0626 0.9684 +vt 0.0548 0.9684 +vt 0.0861 0.8044 +vt 0.0939 0.8044 +vt 0.0939 0.8122 +vt 0.0861 0.8122 +vt 0.0861 0.7732 +vt 0.0939 0.7732 +vt 0.0939 0.7810 +vt 0.0861 0.7810 +vt 0.1173 0.7732 +vt 0.1251 0.7732 +vt 0.1251 0.7810 +vt 0.1173 0.7810 +vt 0.0236 0.8044 +vt 0.0314 0.8044 +vt 0.0314 0.8122 +vt 0.0236 0.8122 +vt 0.0236 0.7731 +vt 0.0314 0.7731 +vt 0.0314 0.7809 +vt 0.0236 0.7809 +vt 0.0548 0.7731 +vt 0.0626 0.7731 +vt 0.0626 0.7810 +vt 0.0548 0.7809 +vt 0.0236 0.8668 +vt 0.0314 0.8668 +vt 0.0314 0.8746 +vt 0.0236 0.8746 +vt 0.0236 0.8356 +vt 0.0314 0.8356 +vt 0.0314 0.8434 +vt 0.0236 0.8434 +vt 0.0548 0.8356 +vt 0.0626 0.8356 +vt 0.0626 0.8434 +vt 0.0548 0.8434 +vt 0.2110 0.8044 +vt 0.2188 0.8044 +vt 0.2188 0.8122 +vt 0.2110 0.8122 +vt 0.2110 0.7732 +vt 0.2188 0.7732 +vt 0.2188 0.7810 +vt 0.2110 0.7810 +vt 0.2422 0.7732 +vt 0.2500 0.7732 +vt 0.2500 0.7810 +vt 0.2422 0.7810 +vt 0.1485 0.8044 +vt 0.1563 0.8044 +vt 0.1563 0.8122 +vt 0.1485 0.8122 +vt 0.1485 0.7732 +vt 0.1563 0.7732 +vt 0.1563 0.7810 +vt 0.1485 0.7810 +vt 0.1798 0.7732 +vt 0.1876 0.7732 +vt 0.1876 0.7810 +vt 0.1798 0.7810 +vt 0.1485 0.8669 +vt 0.1563 0.8669 +vt 0.1563 0.8747 +vt 0.1485 0.8747 +vt 0.1485 0.8356 +vt 0.1563 0.8356 +vt 0.1563 0.8434 +vt 0.1485 0.8434 +vt 0.1797 0.8356 +vt 0.1876 0.8357 +vt 0.1876 0.8435 +vt 0.1797 0.8435 +vt 0.3361 0.1798 +vt 0.3439 0.1798 +vt 0.3439 0.1876 +vt 0.3361 0.1876 +vt 0.3361 0.1486 +vt 0.3439 0.1486 +vt 0.3439 0.1564 +vt 0.3361 0.1564 +vt 0.3674 0.1486 +vt 0.3752 0.1486 +vt 0.3752 0.1564 +vt 0.3674 0.1564 +vt 0.2737 0.1798 +vt 0.2815 0.1798 +vt 0.2815 0.1876 +vt 0.2737 0.1876 +vt 0.2737 0.1485 +vt 0.2815 0.1485 +vt 0.2815 0.1564 +vt 0.2737 0.1563 +vt 0.3049 0.1485 +vt 0.3127 0.1486 +vt 0.3127 0.1564 +vt 0.3049 0.1564 +vt 0.2736 0.2422 +vt 0.2814 0.2422 +vt 0.2814 0.2501 +vt 0.2736 0.2500 +vt 0.2736 0.2110 +vt 0.2815 0.2110 +vt 0.2815 0.2188 +vt 0.2736 0.2188 +vt 0.3049 0.2110 +vt 0.3127 0.2110 +vt 0.3127 0.2188 +vt 0.3049 0.2188 +vt 0.3362 0.0549 +vt 0.3440 0.0549 +vt 0.3440 0.0627 +vt 0.3362 0.0627 +vt 0.3362 0.0236 +vt 0.3440 0.0236 +vt 0.3440 0.0314 +vt 0.3362 0.0314 +vt 0.3674 0.0236 +vt 0.3752 0.0236 +vt 0.3752 0.0314 +vt 0.3674 0.0314 +vt 0.2737 0.0548 +vt 0.2815 0.0548 +vt 0.2815 0.0627 +vt 0.2737 0.0626 +vt 0.2737 0.0236 +vt 0.2815 0.0236 +vt 0.2815 0.0314 +vt 0.2737 0.0314 +vt 0.3049 0.0236 +vt 0.3127 0.0236 +vt 0.3127 0.0314 +vt 0.3049 0.0314 +vt 0.2737 0.1173 +vt 0.2815 0.1173 +vt 0.2815 0.1251 +vt 0.2737 0.1251 +vt 0.2737 0.0861 +vt 0.2815 0.0861 +vt 0.2815 0.0939 +vt 0.2737 0.0939 +vt 0.3049 0.0861 +vt 0.3127 0.0861 +vt 0.3127 0.0939 +vt 0.3049 0.0939 +vt 0.4611 0.0549 +vt 0.4689 0.0549 +vt 0.4689 0.0627 +vt 0.4611 0.0627 +vt 0.4611 0.0237 +vt 0.4689 0.0237 +vt 0.4689 0.0315 +vt 0.4611 0.0315 +vt 0.4923 0.0237 +vt 0.5001 0.0237 +vt 0.5001 0.0315 +vt 0.4923 0.0315 +vt 0.3986 0.0549 +vt 0.4064 0.0549 +vt 0.4064 0.0627 +vt 0.3986 0.0627 +vt 0.3986 0.0236 +vt 0.4064 0.0236 +vt 0.4064 0.0315 +vt 0.3986 0.0315 +vt 0.4299 0.0237 +vt 0.4377 0.0237 +vt 0.4377 0.0315 +vt 0.4299 0.0315 +vt 0.3986 0.1173 +vt 0.4064 0.1173 +vt 0.4064 0.1252 +vt 0.3986 0.1252 +vt 0.3986 0.0861 +vt 0.4064 0.0861 +vt 0.4064 0.0939 +vt 0.3986 0.0939 +vt 0.4299 0.0861 +vt 0.4377 0.0861 +vt 0.4377 0.0939 +vt 0.4299 0.0939 +vt 0.0863 0.1797 +vt 0.0941 0.1797 +vt 0.0941 0.1875 +vt 0.0863 0.1875 +vt 0.0863 0.1485 +vt 0.0941 0.1485 +vt 0.0941 0.1563 +vt 0.0863 0.1563 +vt 0.1175 0.1485 +vt 0.1253 0.1485 +vt 0.1253 0.1563 +vt 0.1175 0.1563 +vt 0.0238 0.1797 +vt 0.0316 0.1797 +vt 0.0316 0.1875 +vt 0.0238 0.1875 +vt 0.0238 0.1485 +vt 0.0316 0.1485 +vt 0.0316 0.1563 +vt 0.0238 0.1563 +vt 0.0550 0.1485 +vt 0.0628 0.1485 +vt 0.0628 0.1563 +vt 0.0550 0.1563 +vt 0.0238 0.2422 +vt 0.0316 0.2422 +vt 0.0316 0.2500 +vt 0.0238 0.2500 +vt 0.0238 0.2109 +vt 0.0316 0.2109 +vt 0.0316 0.2187 +vt 0.0238 0.2187 +vt 0.0550 0.2109 +vt 0.0628 0.2109 +vt 0.0628 0.2187 +vt 0.0550 0.2187 +vt 0.0863 0.0548 +vt 0.0941 0.0548 +vt 0.0941 0.0626 +vt 0.0863 0.0626 +vt 0.0863 0.0236 +vt 0.0941 0.0236 +vt 0.0941 0.0314 +vt 0.0863 0.0314 +vt 0.1175 0.0236 +vt 0.1254 0.0236 +vt 0.1253 0.0314 +vt 0.1175 0.0314 +vt 0.0238 0.0548 +vt 0.0316 0.0548 +vt 0.0316 0.0626 +vt 0.0238 0.0626 +vt 0.0238 0.0235 +vt 0.0317 0.0235 +vt 0.0317 0.0313 +vt 0.0238 0.0313 +vt 0.0551 0.0235 +vt 0.0629 0.0235 +vt 0.0629 0.0314 +vt 0.0551 0.0313 +vt 0.0238 0.1172 +vt 0.0316 0.1172 +vt 0.0316 0.1250 +vt 0.0238 0.1250 +vt 0.0238 0.0860 +vt 0.0316 0.0860 +vt 0.0316 0.0938 +vt 0.0238 0.0938 +vt 0.0551 0.0860 +vt 0.0629 0.0860 +vt 0.0629 0.0938 +vt 0.0551 0.0938 +vt 0.2112 0.0548 +vt 0.2190 0.0548 +vt 0.2190 0.0626 +vt 0.2112 0.0626 +vt 0.2112 0.0236 +vt 0.2190 0.0236 +vt 0.2190 0.0314 +vt 0.2112 0.0314 +vt 0.2425 0.0236 +vt 0.2503 0.0236 +vt 0.2503 0.0314 +vt 0.2425 0.0314 +vt 0.1488 0.0548 +vt 0.1566 0.0548 +vt 0.1566 0.0626 +vt 0.1488 0.0626 +vt 0.1488 0.0236 +vt 0.1566 0.0236 +vt 0.1566 0.0314 +vt 0.1488 0.0314 +vt 0.1800 0.0236 +vt 0.1878 0.0236 +vt 0.1878 0.0314 +vt 0.1800 0.0314 +vt 0.1487 0.1173 +vt 0.1566 0.1173 +vt 0.1566 0.1251 +vt 0.1487 0.1251 +vt 0.1488 0.0860 +vt 0.1566 0.0860 +vt 0.1566 0.0938 +vt 0.1488 0.0938 +vt 0.1800 0.0860 +vt 0.1878 0.0860 +vt 0.1878 0.0939 +vt 0.1800 0.0939 +vt 0.0862 0.4296 +vt 0.0940 0.4296 +vt 0.0940 0.4374 +vt 0.0862 0.4374 +vt 0.0862 0.3983 +vt 0.0940 0.3983 +vt 0.0940 0.4062 +vt 0.0862 0.4062 +vt 0.1174 0.3984 +vt 0.1252 0.3984 +vt 0.1252 0.4062 +vt 0.1174 0.4062 +vt 0.0237 0.4296 +vt 0.0315 0.4296 +vt 0.0315 0.4374 +vt 0.0237 0.4374 +vt 0.0237 0.3983 +vt 0.0315 0.3983 +vt 0.0315 0.4061 +vt 0.0237 0.4061 +vt 0.0550 0.3983 +vt 0.0628 0.3983 +vt 0.0628 0.4061 +vt 0.0550 0.4061 +vt 0.0237 0.4920 +vt 0.0315 0.4920 +vt 0.0315 0.4998 +vt 0.0237 0.4998 +vt 0.0237 0.4608 +vt 0.0315 0.4608 +vt 0.0315 0.4686 +vt 0.0237 0.4686 +vt 0.0549 0.4608 +vt 0.0627 0.4608 +vt 0.0627 0.4686 +vt 0.0549 0.4686 +vt 0.0862 0.3046 +vt 0.0940 0.3046 +vt 0.0940 0.3125 +vt 0.0862 0.3125 +vt 0.0862 0.2734 +vt 0.0940 0.2734 +vt 0.0940 0.2812 +vt 0.0862 0.2812 +vt 0.1175 0.2734 +vt 0.1253 0.2734 +vt 0.1253 0.2812 +vt 0.1175 0.2812 +vt 0.0238 0.3046 +vt 0.0316 0.3046 +vt 0.0316 0.3124 +vt 0.0238 0.3124 +vt 0.0238 0.2734 +vt 0.0316 0.2734 +vt 0.0316 0.2812 +vt 0.0238 0.2812 +vt 0.0550 0.2734 +vt 0.0628 0.2734 +vt 0.0628 0.2812 +vt 0.0550 0.2812 +vt 0.0237 0.3671 +vt 0.0315 0.3671 +vt 0.0315 0.3749 +vt 0.0237 0.3749 +vt 0.0237 0.3359 +vt 0.0316 0.3359 +vt 0.0316 0.3437 +vt 0.0237 0.3437 +vt 0.0550 0.3359 +vt 0.0628 0.3359 +vt 0.0628 0.3437 +vt 0.0550 0.3437 +vt 0.2112 0.3047 +vt 0.2190 0.3047 +vt 0.2190 0.3125 +vt 0.2112 0.3125 +vt 0.2112 0.2735 +vt 0.2190 0.2735 +vt 0.2190 0.2813 +vt 0.2112 0.2813 +vt 0.2424 0.2735 +vt 0.2502 0.2735 +vt 0.2502 0.2813 +vt 0.2424 0.2813 +vt 0.1487 0.3047 +vt 0.1565 0.3047 +vt 0.1565 0.3125 +vt 0.1487 0.3125 +vt 0.1487 0.2734 +vt 0.1565 0.2734 +vt 0.1565 0.2812 +vt 0.1487 0.2812 +vt 0.1799 0.2734 +vt 0.1877 0.2734 +vt 0.1877 0.2813 +vt 0.1799 0.2813 +vt 0.1487 0.3671 +vt 0.1565 0.3671 +vt 0.1565 0.3749 +vt 0.1487 0.3749 +vt 0.1487 0.3359 +vt 0.1565 0.3359 +vt 0.1565 0.3437 +vt 0.1487 0.3437 +vt 0.1799 0.3359 +vt 0.1877 0.3359 +vt 0.1877 0.3437 +vt 0.1799 0.3437 +vt 0.8359 0.1799 +vt 0.8437 0.1799 +vt 0.8437 0.1878 +vt 0.8359 0.1878 +vt 0.8359 0.1487 +vt 0.8437 0.1487 +vt 0.8437 0.1565 +vt 0.8359 0.1565 +vt 0.8671 0.1487 +vt 0.8749 0.1487 +vt 0.8749 0.1565 +vt 0.8671 0.1565 +vt 0.7734 0.1799 +vt 0.7812 0.1799 +vt 0.7812 0.1877 +vt 0.7734 0.1877 +vt 0.7734 0.1487 +vt 0.7812 0.1487 +vt 0.7812 0.1565 +vt 0.7734 0.1565 +vt 0.8046 0.1487 +vt 0.8124 0.1487 +vt 0.8124 0.1565 +vt 0.8046 0.1565 +vt 0.7734 0.2424 +vt 0.7812 0.2424 +vt 0.7812 0.2502 +vt 0.7734 0.2502 +vt 0.7734 0.2112 +vt 0.7812 0.2112 +vt 0.7812 0.2190 +vt 0.7734 0.2190 +vt 0.8046 0.2112 +vt 0.8124 0.2112 +vt 0.8124 0.2190 +vt 0.8046 0.2190 +vt 0.8359 0.0550 +vt 0.8437 0.0550 +vt 0.8437 0.0628 +vt 0.8359 0.0628 +vt 0.8359 0.0238 +vt 0.8437 0.0238 +vt 0.8437 0.0316 +vt 0.8359 0.0316 +vt 0.8671 0.0238 +vt 0.8750 0.0238 +vt 0.8750 0.0316 +vt 0.8671 0.0316 +vt 0.7734 0.0550 +vt 0.7812 0.0550 +vt 0.7812 0.0628 +vt 0.7734 0.0628 +vt 0.7734 0.0238 +vt 0.7813 0.0238 +vt 0.7812 0.0316 +vt 0.7734 0.0316 +vt 0.8047 0.0238 +vt 0.8125 0.0238 +vt 0.8125 0.0316 +vt 0.8047 0.0316 +vt 0.7734 0.1175 +vt 0.7812 0.1175 +vt 0.7812 0.1253 +vt 0.7734 0.1253 +vt 0.7734 0.0862 +vt 0.7812 0.0862 +vt 0.7812 0.0940 +vt 0.7734 0.0940 +vt 0.8047 0.0862 +vt 0.8125 0.0862 +vt 0.8125 0.0940 +vt 0.8047 0.0940 +vt 0.9608 0.0550 +vt 0.9686 0.0551 +vt 0.9686 0.0629 +vt 0.9608 0.0629 +vt 0.9608 0.0238 +vt 0.9687 0.0238 +vt 0.9687 0.0316 +vt 0.9608 0.0316 +vt 0.9921 0.0238 +vt 0.9999 0.0238 +vt 0.9999 0.0316 +vt 0.9921 0.0316 +vt 0.8984 0.0550 +vt 0.9062 0.0550 +vt 0.9062 0.0628 +vt 0.8984 0.0628 +vt 0.8984 0.0238 +vt 0.9062 0.0238 +vt 0.9062 0.0316 +vt 0.8984 0.0316 +vt 0.9296 0.0238 +vt 0.9374 0.0238 +vt 0.9374 0.0316 +vt 0.9296 0.0316 +vt 0.8984 0.1175 +vt 0.9062 0.1175 +vt 0.9062 0.1253 +vt 0.8983 0.1253 +vt 0.8984 0.0863 +vt 0.9062 0.0863 +vt 0.9062 0.0941 +vt 0.8984 0.0941 +vt 0.9296 0.0863 +vt 0.9374 0.0863 +vt 0.9374 0.0941 +vt 0.9296 0.0941 +vt 0.5860 0.1799 +vt 0.5938 0.1799 +vt 0.5938 0.1877 +vt 0.5860 0.1877 +vt 0.5860 0.1486 +vt 0.5938 0.1486 +vt 0.5938 0.1564 +vt 0.5860 0.1564 +vt 0.6172 0.1486 +vt 0.6250 0.1486 +vt 0.6250 0.1565 +vt 0.6172 0.1565 +vt 0.5235 0.1798 +vt 0.5313 0.1799 +vt 0.5313 0.1877 +vt 0.5235 0.1877 +vt 0.5235 0.1486 +vt 0.5313 0.1486 +vt 0.5313 0.1564 +vt 0.5235 0.1564 +vt 0.5548 0.1486 +vt 0.5626 0.1486 +vt 0.5626 0.1564 +vt 0.5548 0.1564 +vt 0.5235 0.2423 +vt 0.5313 0.2423 +vt 0.5313 0.2501 +vt 0.5235 0.2501 +vt 0.5235 0.2111 +vt 0.5313 0.2111 +vt 0.5313 0.2189 +vt 0.5235 0.2189 +vt 0.5548 0.2111 +vt 0.5626 0.2111 +vt 0.5626 0.2189 +vt 0.5547 0.2189 +vt 0.5860 0.0549 +vt 0.5938 0.0549 +vt 0.5938 0.0627 +vt 0.5860 0.0627 +vt 0.5860 0.0237 +vt 0.5938 0.0237 +vt 0.5938 0.0315 +vt 0.5860 0.0315 +vt 0.6173 0.0237 +vt 0.6251 0.0237 +vt 0.6251 0.0315 +vt 0.6173 0.0315 +vt 0.5236 0.0549 +vt 0.5314 0.0549 +vt 0.5314 0.0627 +vt 0.5236 0.0627 +vt 0.5236 0.0237 +vt 0.5314 0.0237 +vt 0.5314 0.0315 +vt 0.5236 0.0315 +vt 0.5548 0.0237 +vt 0.5626 0.0237 +vt 0.5626 0.0315 +vt 0.5548 0.0315 +vt 0.5235 0.1174 +vt 0.5314 0.1174 +vt 0.5314 0.1252 +vt 0.5235 0.1252 +vt 0.5236 0.0861 +vt 0.5314 0.0862 +vt 0.5314 0.0940 +vt 0.5236 0.0940 +vt 0.5548 0.0862 +vt 0.5626 0.0862 +vt 0.5626 0.0940 +vt 0.5548 0.0940 +vt 0.7110 0.0550 +vt 0.7188 0.0550 +vt 0.7188 0.0628 +vt 0.7110 0.0628 +vt 0.7110 0.0237 +vt 0.7188 0.0237 +vt 0.7188 0.0315 +vt 0.7110 0.0315 +vt 0.7422 0.0237 +vt 0.7500 0.0237 +vt 0.7500 0.0316 +vt 0.7422 0.0316 +vt 0.6485 0.0550 +vt 0.6563 0.0550 +vt 0.6563 0.0628 +vt 0.6485 0.0628 +vt 0.6485 0.0237 +vt 0.6563 0.0237 +vt 0.6563 0.0315 +vt 0.6485 0.0315 +vt 0.6797 0.0237 +vt 0.6876 0.0237 +vt 0.6875 0.0315 +vt 0.6797 0.0315 +vt 0.6485 0.1174 +vt 0.6563 0.1174 +vt 0.6563 0.1252 +vt 0.6485 0.1252 +vt 0.6485 0.0862 +vt 0.6563 0.0862 +vt 0.6563 0.0940 +vt 0.6485 0.0940 +vt 0.6797 0.0862 +vt 0.6875 0.0862 +vt 0.6875 0.0940 +vt 0.6797 0.0940 +vt 0.5859 0.4297 +vt 0.5937 0.4297 +vt 0.5937 0.4375 +vt 0.5859 0.4375 +vt 0.5859 0.3985 +vt 0.5937 0.3985 +vt 0.5937 0.4063 +vt 0.5859 0.4063 +vt 0.6172 0.3985 +vt 0.6250 0.3985 +vt 0.6250 0.4063 +vt 0.6172 0.4063 +vt 0.5234 0.4297 +vt 0.5313 0.4297 +vt 0.5313 0.4375 +vt 0.5234 0.4375 +vt 0.5235 0.3985 +vt 0.5313 0.3985 +vt 0.5313 0.4063 +vt 0.5235 0.4063 +vt 0.5547 0.3985 +vt 0.5625 0.3985 +vt 0.5625 0.4063 +vt 0.5547 0.4063 +vt 0.5234 0.4922 +vt 0.5312 0.4922 +vt 0.5312 0.5000 +vt 0.5234 0.5000 +vt 0.5234 0.4610 +vt 0.5312 0.4610 +vt 0.5312 0.4688 +vt 0.5234 0.4688 +vt 0.5547 0.4610 +vt 0.5625 0.4610 +vt 0.5625 0.4688 +vt 0.5547 0.4688 +vt 0.5860 0.3048 +vt 0.5938 0.3048 +vt 0.5938 0.3126 +vt 0.5860 0.3126 +vt 0.5860 0.2736 +vt 0.5938 0.2736 +vt 0.5938 0.2814 +vt 0.5860 0.2814 +vt 0.6172 0.2736 +vt 0.6250 0.2736 +vt 0.6250 0.2814 +vt 0.6172 0.2814 +vt 0.5235 0.3048 +vt 0.5313 0.3048 +vt 0.5313 0.3126 +vt 0.5235 0.3126 +vt 0.5235 0.2736 +vt 0.5313 0.2736 +vt 0.5313 0.2814 +vt 0.5235 0.2814 +vt 0.5547 0.2736 +vt 0.5625 0.2736 +vt 0.5625 0.2814 +vt 0.5547 0.2814 +vt 0.5235 0.3673 +vt 0.5313 0.3673 +vt 0.5313 0.3751 +vt 0.5235 0.3751 +vt 0.5235 0.3360 +vt 0.5313 0.3360 +vt 0.5313 0.3438 +vt 0.5235 0.3438 +vt 0.5547 0.3360 +vt 0.5625 0.3360 +vt 0.5625 0.3438 +vt 0.5547 0.3438 +vt 0.7109 0.3048 +vt 0.7187 0.3048 +vt 0.7187 0.3127 +vt 0.7109 0.3127 +vt 0.7109 0.2736 +vt 0.7187 0.2736 +vt 0.7187 0.2814 +vt 0.7109 0.2814 +vt 0.7421 0.2736 +vt 0.7499 0.2736 +vt 0.7499 0.2814 +vt 0.7421 0.2814 +vt 0.6484 0.3048 +vt 0.6562 0.3048 +vt 0.6562 0.3126 +vt 0.6484 0.3126 +vt 0.6484 0.2736 +vt 0.6562 0.2736 +vt 0.6562 0.2814 +vt 0.6484 0.2814 +vt 0.6797 0.2736 +vt 0.6875 0.2736 +vt 0.6875 0.2814 +vt 0.6797 0.2814 +vt 0.6484 0.3673 +vt 0.6562 0.3673 +vt 0.6562 0.3751 +vt 0.6484 0.3751 +vt 0.6484 0.3361 +vt 0.6562 0.3361 +vt 0.6562 0.3439 +vt 0.6484 0.3439 +vt 0.6796 0.3361 +vt 0.6875 0.3361 +vt 0.6875 0.3439 +vt 0.6796 0.3439 +vt 0.8358 0.4298 +vt 0.8436 0.4298 +vt 0.8436 0.4376 +vt 0.8358 0.4376 +vt 0.8358 0.3986 +vt 0.8436 0.3986 +vt 0.8436 0.4064 +vt 0.8358 0.4064 +vt 0.8670 0.3986 +vt 0.8748 0.3986 +vt 0.8748 0.4064 +vt 0.8670 0.4064 +vt 0.7733 0.4298 +vt 0.7811 0.4298 +vt 0.7811 0.4376 +vt 0.7733 0.4376 +vt 0.7733 0.3986 +vt 0.7811 0.3986 +vt 0.7811 0.4064 +vt 0.7733 0.4064 +vt 0.8046 0.3986 +vt 0.8124 0.3986 +vt 0.8124 0.4064 +vt 0.8046 0.4064 +vt 0.7733 0.4923 +vt 0.7811 0.4923 +vt 0.7811 0.5001 +vt 0.7733 0.5001 +vt 0.7733 0.4610 +vt 0.7811 0.4610 +vt 0.7811 0.4688 +vt 0.7733 0.4688 +vt 0.8045 0.4610 +vt 0.8123 0.4610 +vt 0.8123 0.4689 +vt 0.8045 0.4688 +vt 0.8358 0.3049 +vt 0.8436 0.3049 +vt 0.8436 0.3127 +vt 0.8358 0.3127 +vt 0.8358 0.2736 +vt 0.8436 0.2737 +vt 0.8436 0.2815 +vt 0.8358 0.2815 +vt 0.8671 0.2737 +vt 0.8749 0.2737 +vt 0.8749 0.2815 +vt 0.8671 0.2815 +vt 0.7734 0.3049 +vt 0.7812 0.3049 +vt 0.7812 0.3127 +vt 0.7734 0.3127 +vt 0.7734 0.2736 +vt 0.7812 0.2736 +vt 0.7812 0.2814 +vt 0.7734 0.2814 +vt 0.8046 0.2736 +vt 0.8124 0.2736 +vt 0.8124 0.2814 +vt 0.8046 0.2814 +vt 0.7733 0.3673 +vt 0.7811 0.3673 +vt 0.7811 0.3751 +vt 0.7733 0.3751 +vt 0.7733 0.3361 +vt 0.7812 0.3361 +vt 0.7812 0.3439 +vt 0.7733 0.3439 +vt 0.8046 0.3361 +vt 0.8124 0.3361 +vt 0.8124 0.3439 +vt 0.8046 0.3439 +vt 0.9608 0.3049 +vt 0.9686 0.3049 +vt 0.9686 0.3127 +vt 0.9608 0.3127 +vt 0.9608 0.2737 +vt 0.9686 0.2737 +vt 0.9686 0.2815 +vt 0.9608 0.2815 +vt 0.9920 0.2737 +vt 0.9998 0.2737 +vt 0.9998 0.2815 +vt 0.9920 0.2815 +vt 0.8983 0.3049 +vt 0.9061 0.3049 +vt 0.9061 0.3127 +vt 0.8983 0.3127 +vt 0.8983 0.2737 +vt 0.9061 0.2737 +vt 0.9061 0.2815 +vt 0.8983 0.2815 +vt 0.9295 0.2737 +vt 0.9373 0.2737 +vt 0.9373 0.2815 +vt 0.9295 0.2815 +vt 0.8983 0.3674 +vt 0.9061 0.3674 +vt 0.9061 0.3752 +vt 0.8983 0.3752 +vt 0.8983 0.3361 +vt 0.9061 0.3361 +vt 0.9061 0.3439 +vt 0.8983 0.3439 +vt 0.9295 0.3361 +vt 0.9373 0.3361 +vt 0.9373 0.3440 +vt 0.9295 0.3440 +vt 0.3360 0.4297 +vt 0.3439 0.4297 +vt 0.3439 0.4375 +vt 0.3360 0.4375 +vt 0.3361 0.3984 +vt 0.3439 0.3984 +vt 0.3439 0.4062 +vt 0.3361 0.4062 +vt 0.3673 0.3984 +vt 0.3751 0.3984 +vt 0.3751 0.4062 +vt 0.3673 0.4062 +vt 0.2736 0.4296 +vt 0.2814 0.4296 +vt 0.2814 0.4375 +vt 0.2736 0.4374 +vt 0.2736 0.3984 +vt 0.2814 0.3984 +vt 0.2814 0.4062 +vt 0.2736 0.4062 +vt 0.3048 0.3984 +vt 0.3126 0.3984 +vt 0.3126 0.4062 +vt 0.3048 0.4062 +vt 0.2736 0.4921 +vt 0.2814 0.4921 +vt 0.2814 0.4999 +vt 0.2736 0.4999 +vt 0.2736 0.4609 +vt 0.2814 0.4609 +vt 0.2814 0.4687 +vt 0.2736 0.4687 +vt 0.3048 0.4609 +vt 0.3126 0.4609 +vt 0.3126 0.4687 +vt 0.3048 0.4687 +vt 0.3361 0.3047 +vt 0.3439 0.3047 +vt 0.3439 0.3125 +vt 0.3361 0.3125 +vt 0.3361 0.2735 +vt 0.3439 0.2735 +vt 0.3439 0.2813 +vt 0.3361 0.2813 +vt 0.3673 0.2735 +vt 0.3751 0.2735 +vt 0.3751 0.2813 +vt 0.3673 0.2813 +vt 0.2736 0.3047 +vt 0.2814 0.3047 +vt 0.2814 0.3125 +vt 0.2736 0.3125 +vt 0.2736 0.2735 +vt 0.2814 0.2735 +vt 0.2814 0.2813 +vt 0.2736 0.2813 +vt 0.3049 0.2735 +vt 0.3127 0.2735 +vt 0.3127 0.2813 +vt 0.3049 0.2813 +vt 0.2736 0.3672 +vt 0.2814 0.3672 +vt 0.2814 0.3750 +vt 0.2736 0.3750 +vt 0.2736 0.3359 +vt 0.2814 0.3359 +vt 0.2814 0.3437 +vt 0.2736 0.3437 +vt 0.3048 0.3359 +vt 0.3127 0.3360 +vt 0.3126 0.3438 +vt 0.3048 0.3438 +vt 0.4610 0.3048 +vt 0.4688 0.3048 +vt 0.4688 0.3126 +vt 0.4610 0.3126 +vt 0.4610 0.2735 +vt 0.4688 0.2735 +vt 0.4688 0.2813 +vt 0.4610 0.2813 +vt 0.4923 0.2735 +vt 0.5001 0.2735 +vt 0.5001 0.2814 +vt 0.4923 0.2813 +vt 0.3986 0.3047 +vt 0.4064 0.3047 +vt 0.4064 0.3126 +vt 0.3986 0.3126 +vt 0.3986 0.2735 +vt 0.4064 0.2735 +vt 0.4064 0.2813 +vt 0.3986 0.2813 +vt 0.4298 0.2735 +vt 0.4376 0.2735 +vt 0.4376 0.2813 +vt 0.4298 0.2813 +vt 0.3985 0.3672 +vt 0.4063 0.3672 +vt 0.4063 0.3750 +vt 0.3985 0.3750 +vt 0.3985 0.3360 +vt 0.4064 0.3360 +vt 0.4063 0.3438 +vt 0.3985 0.3438 +vt 0.4298 0.3360 +vt 0.4376 0.3360 +vt 0.4376 0.3438 +vt 0.4298 0.3438 +vt 0.3359 0.9294 +vt 0.3437 0.9294 +vt 0.3437 0.9372 +vt 0.3359 0.9372 +vt 0.3359 0.8982 +vt 0.3437 0.8982 +vt 0.3437 0.9060 +vt 0.3359 0.9060 +vt 0.3671 0.8982 +vt 0.3749 0.8982 +vt 0.3749 0.9060 +vt 0.3671 0.9060 +vt 0.2734 0.9294 +vt 0.2812 0.9294 +vt 0.2812 0.9372 +vt 0.2734 0.9372 +vt 0.2734 0.8981 +vt 0.2812 0.8981 +vt 0.2812 0.9060 +vt 0.2734 0.9060 +vt 0.3047 0.8982 +vt 0.3125 0.8982 +vt 0.3125 0.9060 +vt 0.3047 0.9060 +vt 0.2734 0.9918 +vt 0.2812 0.9919 +vt 0.2812 0.9997 +vt 0.2734 0.9997 +vt 0.2734 0.9606 +vt 0.2812 0.9606 +vt 0.2812 0.9684 +vt 0.2734 0.9684 +vt 0.3046 0.9606 +vt 0.3125 0.9606 +vt 0.3125 0.9684 +vt 0.3046 0.9684 +vt 0.3359 0.8045 +vt 0.3437 0.8045 +vt 0.3437 0.8123 +vt 0.3359 0.8123 +vt 0.3359 0.7732 +vt 0.3437 0.7732 +vt 0.3437 0.7810 +vt 0.3359 0.7810 +vt 0.3672 0.7732 +vt 0.3750 0.7732 +vt 0.3750 0.7811 +vt 0.3672 0.7810 +vt 0.2735 0.8044 +vt 0.2813 0.8044 +vt 0.2813 0.8123 +vt 0.2735 0.8123 +vt 0.2735 0.7732 +vt 0.2813 0.7732 +vt 0.2813 0.7810 +vt 0.2735 0.7810 +vt 0.3047 0.7732 +vt 0.3125 0.7732 +vt 0.3125 0.7810 +vt 0.3047 0.7810 +vt 0.2734 0.8669 +vt 0.2813 0.8669 +vt 0.2812 0.8747 +vt 0.2734 0.8747 +vt 0.2735 0.8357 +vt 0.2813 0.8357 +vt 0.2813 0.8435 +vt 0.2734 0.8435 +vt 0.3047 0.8357 +vt 0.3125 0.8357 +vt 0.3125 0.8435 +vt 0.3047 0.8435 +vt 0.4609 0.8045 +vt 0.4687 0.8045 +vt 0.4687 0.8123 +vt 0.4609 0.8123 +vt 0.4609 0.7733 +vt 0.4687 0.7733 +vt 0.4687 0.7811 +vt 0.4609 0.7811 +vt 0.4921 0.7733 +vt 0.4999 0.7733 +vt 0.4999 0.7811 +vt 0.4921 0.7811 +vt 0.3984 0.8045 +vt 0.4062 0.8045 +vt 0.4062 0.8123 +vt 0.3984 0.8123 +vt 0.3984 0.7732 +vt 0.4062 0.7733 +vt 0.4062 0.7811 +vt 0.3984 0.7811 +vt 0.4296 0.7733 +vt 0.4374 0.7733 +vt 0.4374 0.7811 +vt 0.4296 0.7811 +vt 0.3984 0.8670 +vt 0.4062 0.8670 +vt 0.4062 0.8748 +vt 0.3984 0.8748 +vt 0.3984 0.8357 +vt 0.4062 0.8357 +vt 0.4062 0.8435 +vt 0.3984 0.8435 +vt 0.4296 0.8357 +vt 0.4374 0.8357 +vt 0.4374 0.8435 +vt 0.4296 0.8435 +vt 0.8356 0.9295 +vt 0.8434 0.9296 +vt 0.8434 0.9374 +vt 0.8356 0.9374 +vt 0.8356 0.8983 +vt 0.8434 0.8983 +vt 0.8434 0.9061 +vt 0.8356 0.9061 +vt 0.8669 0.8983 +vt 0.8747 0.8983 +vt 0.8747 0.9061 +vt 0.8669 0.9061 +vt 0.7732 0.9295 +vt 0.7810 0.9295 +vt 0.7810 0.9373 +vt 0.7732 0.9373 +vt 0.7732 0.8983 +vt 0.7810 0.8983 +vt 0.7810 0.9061 +vt 0.7732 0.9061 +vt 0.8044 0.8983 +vt 0.8122 0.8983 +vt 0.8122 0.9061 +vt 0.8044 0.9061 +vt 0.7731 0.9920 +vt 0.7810 0.9920 +vt 0.7809 0.9998 +vt 0.7731 0.9998 +vt 0.7732 0.9608 +vt 0.7810 0.9608 +vt 0.7810 0.9686 +vt 0.7731 0.9686 +vt 0.8044 0.9608 +vt 0.8122 0.9608 +vt 0.8122 0.9686 +vt 0.8044 0.9686 +vt 0.8357 0.8046 +vt 0.8435 0.8046 +vt 0.8435 0.8124 +vt 0.8357 0.8124 +vt 0.8357 0.7734 +vt 0.8435 0.7734 +vt 0.8435 0.7812 +vt 0.8357 0.7812 +vt 0.8669 0.7734 +vt 0.8747 0.7734 +vt 0.8747 0.7812 +vt 0.8669 0.7812 +vt 0.7732 0.8046 +vt 0.7810 0.8046 +vt 0.7810 0.8124 +vt 0.7732 0.8124 +vt 0.7732 0.7734 +vt 0.7810 0.7734 +vt 0.7810 0.7812 +vt 0.7732 0.7812 +vt 0.8044 0.7734 +vt 0.8123 0.7734 +vt 0.8122 0.7812 +vt 0.8044 0.7812 +vt 0.7732 0.8671 +vt 0.7810 0.8671 +vt 0.7810 0.8749 +vt 0.7732 0.8749 +vt 0.7732 0.8358 +vt 0.7810 0.8358 +vt 0.7810 0.8436 +vt 0.7732 0.8436 +vt 0.8044 0.8358 +vt 0.8122 0.8358 +vt 0.8122 0.8437 +vt 0.8044 0.8436 +vt 0.9606 0.8047 +vt 0.9684 0.8047 +vt 0.9684 0.8125 +vt 0.9606 0.8125 +vt 0.9606 0.7734 +vt 0.9684 0.7734 +vt 0.9684 0.7812 +vt 0.9606 0.7812 +vt 0.9918 0.7734 +vt 0.9996 0.7734 +vt 0.9996 0.7812 +vt 0.9918 0.7812 +vt 0.8981 0.8046 +vt 0.9059 0.8046 +vt 0.9059 0.8124 +vt 0.8981 0.8124 +vt 0.8981 0.7734 +vt 0.9059 0.7734 +vt 0.9059 0.7812 +vt 0.8981 0.7812 +vt 0.9294 0.7734 +vt 0.9372 0.7734 +vt 0.9372 0.7812 +vt 0.9294 0.7812 +vt 0.8981 0.8671 +vt 0.9059 0.8671 +vt 0.9059 0.8749 +vt 0.8981 0.8749 +vt 0.8981 0.8359 +vt 0.9059 0.8359 +vt 0.9059 0.8437 +vt 0.8981 0.8437 +vt 0.9294 0.8359 +vt 0.9372 0.8359 +vt 0.9372 0.8437 +vt 0.9294 0.8437 +vt 0.9606 0.8671 +vt 0.9684 0.8671 +vt 0.9684 0.8749 +vt 0.9606 0.8749 +vt 0.9606 0.8359 +vt 0.9684 0.8359 +vt 0.9684 0.8437 +vt 0.9606 0.8437 +vt 0.9918 0.8359 +vt 0.9996 0.8359 +vt 0.9996 0.8437 +vt 0.9918 0.8437 +vt 0.8356 0.8671 +vt 0.8435 0.8671 +vt 0.8435 0.8749 +vt 0.8356 0.8749 +vt 0.8357 0.8358 +vt 0.8435 0.8359 +vt 0.8435 0.8437 +vt 0.8357 0.8437 +vt 0.8669 0.8359 +vt 0.8747 0.8359 +vt 0.8747 0.8437 +vt 0.8669 0.8437 +vt 0.8356 0.9920 +vt 0.8434 0.9920 +vt 0.8434 0.9998 +vt 0.8356 0.9998 +vt 0.8356 0.9608 +vt 0.8434 0.9608 +vt 0.8434 0.9686 +vt 0.8356 0.9686 +vt 0.8669 0.9608 +vt 0.8747 0.9608 +vt 0.8747 0.9686 +vt 0.8668 0.9686 +vt 0.4608 0.8670 +vt 0.4687 0.8670 +vt 0.4687 0.8748 +vt 0.4608 0.8748 +vt 0.4609 0.8357 +vt 0.4687 0.8357 +vt 0.4687 0.8435 +vt 0.4609 0.8435 +vt 0.4921 0.8357 +vt 0.4999 0.8357 +vt 0.4999 0.8436 +vt 0.4921 0.8436 +vt 0.3359 0.8669 +vt 0.3437 0.8669 +vt 0.3437 0.8747 +vt 0.3359 0.8747 +vt 0.3359 0.8357 +vt 0.3437 0.8357 +vt 0.3437 0.8435 +vt 0.3359 0.8435 +vt 0.3672 0.8357 +vt 0.3750 0.8357 +vt 0.3750 0.8435 +vt 0.3672 0.8435 +vt 0.3359 0.9919 +vt 0.3437 0.9919 +vt 0.3437 0.9997 +vt 0.3359 0.9997 +vt 0.3359 0.9606 +vt 0.3437 0.9606 +vt 0.3437 0.9684 +vt 0.3359 0.9684 +vt 0.3671 0.9606 +vt 0.3749 0.9606 +vt 0.3749 0.9685 +vt 0.3671 0.9685 +vt 0.4610 0.3672 +vt 0.4688 0.3672 +vt 0.4688 0.3750 +vt 0.4610 0.3750 +vt 0.4610 0.3360 +vt 0.4688 0.3360 +vt 0.4688 0.3438 +vt 0.4610 0.3438 +vt 0.4922 0.3360 +vt 0.5001 0.3360 +vt 0.5001 0.3438 +vt 0.4922 0.3438 +vt 0.3361 0.3672 +vt 0.3439 0.3672 +vt 0.3439 0.3750 +vt 0.3361 0.3750 +vt 0.3361 0.3360 +vt 0.3439 0.3360 +vt 0.3439 0.3438 +vt 0.3361 0.3438 +vt 0.3673 0.3360 +vt 0.3751 0.3360 +vt 0.3751 0.3438 +vt 0.3673 0.3438 +vt 0.3360 0.4921 +vt 0.3438 0.4921 +vt 0.3438 0.4999 +vt 0.3360 0.4999 +vt 0.3360 0.4609 +vt 0.3438 0.4609 +vt 0.3438 0.4687 +vt 0.3360 0.4687 +vt 0.3673 0.4609 +vt 0.3751 0.4609 +vt 0.3751 0.4687 +vt 0.3673 0.4687 +vt 0.9607 0.3674 +vt 0.9685 0.3674 +vt 0.9685 0.3752 +vt 0.9607 0.3752 +vt 0.9607 0.3362 +vt 0.9686 0.3362 +vt 0.9686 0.3440 +vt 0.9607 0.3440 +vt 0.9920 0.3362 +vt 0.9998 0.3362 +vt 0.9998 0.3440 +vt 0.9920 0.3440 +vt 0.8358 0.3673 +vt 0.8436 0.3674 +vt 0.8436 0.3752 +vt 0.8358 0.3752 +vt 0.8358 0.3361 +vt 0.8436 0.3361 +vt 0.8436 0.3439 +vt 0.8358 0.3439 +vt 0.8670 0.3361 +vt 0.8749 0.3361 +vt 0.8749 0.3439 +vt 0.8670 0.3439 +vt 0.8358 0.4923 +vt 0.8436 0.4923 +vt 0.8436 0.5001 +vt 0.8358 0.5001 +vt 0.8358 0.4611 +vt 0.8436 0.4611 +vt 0.8436 0.4689 +vt 0.8358 0.4689 +vt 0.8670 0.4611 +vt 0.8748 0.4611 +vt 0.8748 0.4689 +vt 0.8670 0.4689 +vt 0.7109 0.3673 +vt 0.7187 0.3673 +vt 0.7187 0.3751 +vt 0.7109 0.3751 +vt 0.7109 0.3361 +vt 0.7187 0.3361 +vt 0.7187 0.3439 +vt 0.7109 0.3439 +vt 0.7421 0.3361 +vt 0.7499 0.3361 +vt 0.7499 0.3439 +vt 0.7421 0.3439 +vt 0.5859 0.3673 +vt 0.5937 0.3673 +vt 0.5937 0.3751 +vt 0.5859 0.3751 +vt 0.5859 0.3360 +vt 0.5938 0.3360 +vt 0.5938 0.3438 +vt 0.5859 0.3438 +vt 0.6172 0.3360 +vt 0.6250 0.3360 +vt 0.6250 0.3439 +vt 0.6172 0.3439 +vt 0.5859 0.4922 +vt 0.5937 0.4922 +vt 0.5937 0.5000 +vt 0.5859 0.5000 +vt 0.5859 0.4610 +vt 0.5937 0.4610 +vt 0.5937 0.4688 +vt 0.5859 0.4688 +vt 0.6171 0.4610 +vt 0.6249 0.4610 +vt 0.6249 0.4688 +vt 0.6171 0.4688 +vt 0.7109 0.1174 +vt 0.7188 0.1174 +vt 0.7188 0.1253 +vt 0.7109 0.1252 +vt 0.7110 0.0862 +vt 0.7188 0.0862 +vt 0.7188 0.0940 +vt 0.7110 0.0940 +vt 0.7422 0.0862 +vt 0.7500 0.0862 +vt 0.7500 0.0940 +vt 0.7422 0.0940 +vt 0.5860 0.1174 +vt 0.5938 0.1174 +vt 0.5938 0.1252 +vt 0.5860 0.1252 +vt 0.5860 0.0862 +vt 0.5938 0.0862 +vt 0.5938 0.0940 +vt 0.5860 0.0940 +vt 0.6173 0.0862 +vt 0.6251 0.0862 +vt 0.6251 0.0940 +vt 0.6173 0.0940 +vt 0.5860 0.2423 +vt 0.5938 0.2423 +vt 0.5938 0.2501 +vt 0.5860 0.2501 +vt 0.5860 0.2111 +vt 0.5938 0.2111 +vt 0.5938 0.2189 +vt 0.5860 0.2189 +vt 0.6172 0.2111 +vt 0.6250 0.2111 +vt 0.6250 0.2189 +vt 0.6172 0.2189 +vt 0.9608 0.1175 +vt 0.9686 0.1175 +vt 0.9686 0.1253 +vt 0.9608 0.1253 +vt 0.9608 0.0863 +vt 0.9686 0.0863 +vt 0.9686 0.0941 +vt 0.9608 0.0941 +vt 0.9921 0.0863 +vt 0.9999 0.0863 +vt 0.9999 0.0941 +vt 0.9921 0.0941 +vt 0.8359 0.1175 +vt 0.8437 0.1175 +vt 0.8437 0.1253 +vt 0.8359 0.1253 +vt 0.8359 0.0862 +vt 0.8437 0.0862 +vt 0.8437 0.0941 +vt 0.8359 0.0941 +vt 0.8671 0.0863 +vt 0.8749 0.0863 +vt 0.8749 0.0941 +vt 0.8671 0.0941 +vt 0.8358 0.2424 +vt 0.8437 0.2424 +vt 0.8437 0.2502 +vt 0.8358 0.2502 +vt 0.8359 0.2112 +vt 0.8437 0.2112 +vt 0.8437 0.2190 +vt 0.8359 0.2190 +vt 0.8671 0.2112 +vt 0.8749 0.2112 +vt 0.8749 0.2190 +vt 0.8671 0.2190 +vt 0.2111 0.3672 +vt 0.2189 0.3672 +vt 0.2189 0.3750 +vt 0.2111 0.3750 +vt 0.2111 0.3359 +vt 0.2190 0.3359 +vt 0.2189 0.3437 +vt 0.2111 0.3437 +vt 0.2424 0.3359 +vt 0.2502 0.3359 +vt 0.2502 0.3437 +vt 0.2424 0.3437 +vt 0.0862 0.3671 +vt 0.0940 0.3671 +vt 0.0940 0.3749 +vt 0.0862 0.3749 +vt 0.0862 0.3359 +vt 0.0940 0.3359 +vt 0.0940 0.3437 +vt 0.0862 0.3437 +vt 0.1174 0.3359 +vt 0.1253 0.3359 +vt 0.1252 0.3437 +vt 0.1174 0.3437 +vt 0.0862 0.4920 +vt 0.0940 0.4920 +vt 0.0940 0.4999 +vt 0.0862 0.4999 +vt 0.0862 0.4608 +vt 0.0940 0.4608 +vt 0.0940 0.4686 +vt 0.0862 0.4686 +vt 0.1174 0.4608 +vt 0.1252 0.4608 +vt 0.1252 0.4686 +vt 0.1174 0.4686 +vt 0.2112 0.1173 +vt 0.2190 0.1173 +vt 0.2190 0.1251 +vt 0.2112 0.1251 +vt 0.2112 0.0861 +vt 0.2190 0.0861 +vt 0.2190 0.0939 +vt 0.2112 0.0939 +vt 0.2425 0.0861 +vt 0.2503 0.0861 +vt 0.2503 0.0939 +vt 0.2425 0.0939 +vt 0.0863 0.1172 +vt 0.0941 0.1173 +vt 0.0941 0.1251 +vt 0.0863 0.1251 +vt 0.0863 0.0860 +vt 0.0941 0.0860 +vt 0.0941 0.0938 +vt 0.0863 0.0938 +vt 0.1175 0.0860 +vt 0.1253 0.0860 +vt 0.1253 0.0938 +vt 0.1175 0.0938 +vt 0.0862 0.2422 +vt 0.0940 0.2422 +vt 0.0940 0.2500 +vt 0.0862 0.2500 +vt 0.0863 0.2109 +vt 0.0941 0.2109 +vt 0.0941 0.2188 +vt 0.0862 0.2188 +vt 0.1175 0.2110 +vt 0.1253 0.2110 +vt 0.1253 0.2188 +vt 0.1175 0.2188 +vt 0.4611 0.1174 +vt 0.4689 0.1174 +vt 0.4689 0.1252 +vt 0.4611 0.1252 +vt 0.4611 0.0861 +vt 0.4689 0.0861 +vt 0.4689 0.0939 +vt 0.4611 0.0939 +vt 0.4923 0.0861 +vt 0.5001 0.0861 +vt 0.5001 0.0940 +vt 0.4923 0.0939 +vt 0.3361 0.1173 +vt 0.3440 0.1173 +vt 0.3440 0.1251 +vt 0.3361 0.1251 +vt 0.3362 0.0861 +vt 0.3440 0.0861 +vt 0.3440 0.0939 +vt 0.3362 0.0939 +vt 0.3674 0.0861 +vt 0.3752 0.0861 +vt 0.3752 0.0939 +vt 0.3674 0.0939 +vt 0.3361 0.2423 +vt 0.3439 0.2423 +vt 0.3439 0.2501 +vt 0.3361 0.2501 +vt 0.3361 0.2110 +vt 0.3439 0.2110 +vt 0.3439 0.2188 +vt 0.3361 0.2188 +vt 0.3673 0.2110 +vt 0.3752 0.2110 +vt 0.3752 0.2188 +vt 0.3673 0.2188 +vt 0.2110 0.8669 +vt 0.2188 0.8669 +vt 0.2188 0.8747 +vt 0.2110 0.8747 +vt 0.2110 0.8357 +vt 0.2188 0.8357 +vt 0.2188 0.8435 +vt 0.2110 0.8435 +vt 0.2422 0.8357 +vt 0.2500 0.8357 +vt 0.2500 0.8435 +vt 0.2422 0.8435 +vt 0.0860 0.8669 +vt 0.0938 0.8669 +vt 0.0938 0.8747 +vt 0.0860 0.8747 +vt 0.0860 0.8356 +vt 0.0939 0.8356 +vt 0.0939 0.8434 +vt 0.0860 0.8434 +vt 0.1173 0.8356 +vt 0.1251 0.8356 +vt 0.1251 0.8434 +vt 0.1173 0.8434 +vt 0.0860 0.9918 +vt 0.0938 0.9918 +vt 0.0938 0.9996 +vt 0.0860 0.9996 +vt 0.0860 0.9606 +vt 0.0938 0.9606 +vt 0.0938 0.9684 +vt 0.0860 0.9684 +vt 0.1172 0.9606 +vt 0.1251 0.9606 +vt 0.1250 0.9684 +vt 0.1172 0.9684 +vt 0.2111 0.6170 +vt 0.2189 0.6170 +vt 0.2189 0.6248 +vt 0.2111 0.6248 +vt 0.2111 0.5858 +vt 0.2189 0.5858 +vt 0.2189 0.5936 +vt 0.2111 0.5936 +vt 0.2423 0.5858 +vt 0.2501 0.5858 +vt 0.2501 0.5936 +vt 0.2423 0.5936 +vt 0.0861 0.6170 +vt 0.0939 0.6170 +vt 0.0939 0.6248 +vt 0.0861 0.6248 +vt 0.0861 0.5857 +vt 0.0939 0.5857 +vt 0.0939 0.5936 +vt 0.0861 0.5936 +vt 0.1174 0.5858 +vt 0.1252 0.5858 +vt 0.1252 0.5936 +vt 0.1174 0.5936 +vt 0.0861 0.7419 +vt 0.0939 0.7419 +vt 0.0939 0.7497 +vt 0.0861 0.7497 +vt 0.0861 0.7107 +vt 0.0939 0.7107 +vt 0.0939 0.7185 +vt 0.0861 0.7185 +vt 0.1173 0.7107 +vt 0.1251 0.7107 +vt 0.1251 0.7185 +vt 0.1173 0.7185 +vt 0.4609 0.6171 +vt 0.4687 0.6171 +vt 0.4687 0.6249 +vt 0.4609 0.6249 +vt 0.4609 0.5859 +vt 0.4687 0.5859 +vt 0.4687 0.5937 +vt 0.4609 0.5937 +vt 0.4922 0.5859 +vt 0.5000 0.5859 +vt 0.5000 0.5937 +vt 0.4922 0.5937 +vt 0.3360 0.6171 +vt 0.3438 0.6171 +vt 0.3438 0.6249 +vt 0.3360 0.6249 +vt 0.3360 0.5858 +vt 0.3438 0.5858 +vt 0.3438 0.5936 +vt 0.3360 0.5936 +vt 0.3672 0.5858 +vt 0.3750 0.5858 +vt 0.3750 0.5936 +vt 0.3672 0.5936 +vt 0.3359 0.7420 +vt 0.3438 0.7420 +vt 0.3438 0.7498 +vt 0.3359 0.7498 +vt 0.3360 0.7108 +vt 0.3438 0.7108 +vt 0.3438 0.7186 +vt 0.3360 0.7186 +vt 0.3672 0.7108 +vt 0.3750 0.7108 +vt 0.3750 0.7186 +vt 0.3672 0.7186 +vt 0.7107 0.8670 +vt 0.7185 0.8670 +vt 0.7185 0.8749 +vt 0.7107 0.8749 +vt 0.7107 0.8358 +vt 0.7185 0.8358 +vt 0.7185 0.8436 +vt 0.7107 0.8436 +vt 0.7420 0.8358 +vt 0.7498 0.8358 +vt 0.7498 0.8436 +vt 0.7420 0.8436 +vt 0.5858 0.8670 +vt 0.5936 0.8670 +vt 0.5936 0.8748 +vt 0.5858 0.8748 +vt 0.5858 0.8358 +vt 0.5936 0.8358 +vt 0.5936 0.8436 +vt 0.5858 0.8436 +vt 0.6170 0.8358 +vt 0.6248 0.8358 +vt 0.6248 0.8436 +vt 0.6170 0.8436 +vt 0.5857 0.9919 +vt 0.5936 0.9919 +vt 0.5935 0.9998 +vt 0.5857 0.9997 +vt 0.5858 0.9607 +vt 0.5936 0.9607 +vt 0.5936 0.9685 +vt 0.5858 0.9685 +vt 0.6170 0.9607 +vt 0.6248 0.9607 +vt 0.6248 0.9685 +vt 0.6170 0.9685 +vt 0.7108 0.6172 +vt 0.7186 0.6172 +vt 0.7186 0.6250 +vt 0.7108 0.6250 +vt 0.7108 0.5859 +vt 0.7186 0.5859 +vt 0.7186 0.5938 +vt 0.7108 0.5938 +vt 0.7420 0.5860 +vt 0.7498 0.5860 +vt 0.7498 0.5938 +vt 0.7420 0.5938 +vt 0.5859 0.6171 +vt 0.5937 0.6171 +vt 0.5937 0.6249 +vt 0.5859 0.6249 +vt 0.5859 0.5859 +vt 0.5937 0.5859 +vt 0.5937 0.5937 +vt 0.5859 0.5937 +vt 0.6171 0.5859 +vt 0.6249 0.5859 +vt 0.6249 0.5937 +vt 0.6171 0.5937 +vt 0.5858 0.7421 +vt 0.5936 0.7421 +vt 0.5936 0.7499 +vt 0.5858 0.7499 +vt 0.5858 0.7108 +vt 0.5936 0.7108 +vt 0.5936 0.7187 +vt 0.5858 0.7186 +vt 0.6171 0.7108 +vt 0.6249 0.7109 +vt 0.6249 0.7187 +vt 0.6171 0.7187 +vt 0.9607 0.6173 +vt 0.9685 0.6173 +vt 0.9685 0.6251 +vt 0.9607 0.6251 +vt 0.9607 0.5860 +vt 0.9685 0.5860 +vt 0.9685 0.5938 +vt 0.9607 0.5938 +vt 0.9919 0.5860 +vt 0.9997 0.5860 +vt 0.9997 0.5938 +vt 0.9919 0.5938 +vt 0.8357 0.6172 +vt 0.8435 0.6172 +vt 0.8435 0.6250 +vt 0.8357 0.6250 +vt 0.8357 0.5860 +vt 0.8435 0.5860 +vt 0.8435 0.5938 +vt 0.8357 0.5938 +vt 0.8670 0.5860 +vt 0.8748 0.5860 +vt 0.8748 0.5938 +vt 0.8670 0.5938 +vt 0.8357 0.7422 +vt 0.8435 0.7422 +vt 0.8435 0.7500 +vt 0.8357 0.7500 +vt 0.8357 0.7109 +vt 0.8435 0.7109 +vt 0.8435 0.7187 +vt 0.8357 0.7187 +vt 0.8669 0.7109 +vt 0.8747 0.7109 +vt 0.8747 0.7187 +vt 0.8669 0.7187 +vt 0.9606 0.7422 +vt 0.9684 0.7422 +vt 0.9684 0.7500 +vt 0.9606 0.7500 +vt 0.9606 0.7110 +vt 0.9684 0.7110 +vt 0.9684 0.7188 +vt 0.9606 0.7188 +vt 0.9919 0.7110 +vt 0.9997 0.7110 +vt 0.9997 0.7188 +vt 0.9919 0.7188 +vt 0.7108 0.7421 +vt 0.7186 0.7421 +vt 0.7186 0.7499 +vt 0.7107 0.7499 +vt 0.7108 0.7109 +vt 0.7186 0.7109 +vt 0.7186 0.7187 +vt 0.7108 0.7187 +vt 0.7420 0.7109 +vt 0.7498 0.7109 +vt 0.7498 0.7187 +vt 0.7420 0.7187 +vt 0.7107 0.9920 +vt 0.7185 0.9920 +vt 0.7185 0.9998 +vt 0.7107 0.9998 +vt 0.7107 0.9607 +vt 0.7185 0.9607 +vt 0.7185 0.9686 +vt 0.7107 0.9686 +vt 0.7419 0.9608 +vt 0.7497 0.9608 +vt 0.7497 0.9686 +vt 0.7419 0.9686 +vt 0.4609 0.7420 +vt 0.4687 0.7420 +vt 0.4687 0.7498 +vt 0.4609 0.7498 +vt 0.4609 0.7108 +vt 0.4687 0.7108 +vt 0.4687 0.7186 +vt 0.4609 0.7186 +vt 0.4921 0.7108 +vt 0.4999 0.7108 +vt 0.4999 0.7186 +vt 0.4921 0.7186 +vt 0.2110 0.7420 +vt 0.2188 0.7420 +vt 0.2188 0.7498 +vt 0.2110 0.7498 +vt 0.2110 0.7107 +vt 0.2188 0.7107 +vt 0.2188 0.7185 +vt 0.2110 0.7185 +vt 0.2423 0.7107 +vt 0.2501 0.7107 +vt 0.2501 0.7185 +vt 0.2423 0.7185 +vt 0.2109 0.9918 +vt 0.2187 0.9918 +vt 0.2187 0.9996 +vt 0.2109 0.9996 +vt 0.2109 0.9606 +vt 0.2188 0.9606 +vt 0.2188 0.9684 +vt 0.2109 0.9684 +vt 0.2422 0.9606 +vt 0.2500 0.9606 +vt 0.2500 0.9684 +vt 0.2422 0.9684 +vt 0.4610 0.2423 +vt 0.4688 0.2423 +vt 0.4688 0.2501 +vt 0.4610 0.2501 +vt 0.4610 0.2111 +vt 0.4689 0.2111 +vt 0.4689 0.2189 +vt 0.4610 0.2189 +vt 0.4923 0.2111 +vt 0.5001 0.2111 +vt 0.5001 0.2189 +vt 0.4923 0.2189 +vt 0.2112 0.2422 +vt 0.2190 0.2422 +vt 0.2190 0.2500 +vt 0.2112 0.2500 +vt 0.2112 0.2110 +vt 0.2190 0.2110 +vt 0.2190 0.2188 +vt 0.2112 0.2188 +vt 0.2424 0.2110 +vt 0.2502 0.2110 +vt 0.2502 0.2188 +vt 0.2424 0.2188 +vt 0.2111 0.4921 +vt 0.2189 0.4921 +vt 0.2189 0.4999 +vt 0.2111 0.4999 +vt 0.2111 0.4609 +vt 0.2189 0.4609 +vt 0.2189 0.4687 +vt 0.2111 0.4687 +vt 0.2423 0.4609 +vt 0.2501 0.4609 +vt 0.2501 0.4687 +vt 0.2423 0.4687 +vt 0.9608 0.2425 +vt 0.9686 0.2425 +vt 0.9686 0.2503 +vt 0.9608 0.2503 +vt 0.9608 0.2112 +vt 0.9686 0.2112 +vt 0.9686 0.2190 +vt 0.9608 0.2190 +vt 0.9920 0.2112 +vt 0.9998 0.2112 +vt 0.9998 0.2190 +vt 0.9920 0.2190 +vt 0.7109 0.2424 +vt 0.7187 0.2424 +vt 0.7187 0.2502 +vt 0.7109 0.2502 +vt 0.7109 0.2111 +vt 0.7187 0.2111 +vt 0.7187 0.2190 +vt 0.7109 0.2189 +vt 0.7422 0.2112 +vt 0.7500 0.2112 +vt 0.7500 0.2190 +vt 0.7421 0.2190 +vt 0.7108 0.4922 +vt 0.7186 0.4922 +vt 0.7186 0.5001 +vt 0.7108 0.5001 +vt 0.7108 0.4610 +vt 0.7186 0.4610 +vt 0.7186 0.4688 +vt 0.7108 0.4688 +vt 0.7421 0.4610 +vt 0.7499 0.4610 +vt 0.7499 0.4688 +vt 0.7421 0.4688 +vt 0.9607 0.4923 +vt 0.9685 0.4923 +vt 0.9685 0.5001 +vt 0.9607 0.5001 +vt 0.9607 0.4611 +vt 0.9685 0.4611 +vt 0.9685 0.4689 +vt 0.9607 0.4689 +vt 0.9919 0.4611 +vt 0.9998 0.4611 +vt 0.9997 0.4689 +vt 0.9919 0.4689 +vt 0.4610 0.4922 +vt 0.4688 0.4922 +vt 0.4688 0.5000 +vt 0.4610 0.5000 +vt 0.4610 0.4609 +vt 0.4688 0.4609 +vt 0.4688 0.4687 +vt 0.4610 0.4687 +vt 0.4922 0.4609 +vt 0.5000 0.4609 +vt 0.5000 0.4688 +vt 0.4922 0.4688 +vt 0.4608 0.9919 +vt 0.4686 0.9919 +vt 0.4686 0.9997 +vt 0.4608 0.9997 +vt 0.4608 0.9607 +vt 0.4686 0.9607 +vt 0.4686 0.9685 +vt 0.4608 0.9685 +vt 0.4921 0.9607 +vt 0.4999 0.9607 +vt 0.4999 0.9685 +vt 0.4920 0.9685 +vt 0.9605 0.9921 +vt 0.9683 0.9921 +vt 0.9683 0.9999 +vt 0.9605 0.9999 +vt 0.9605 0.9608 +vt 0.9684 0.9608 +vt 0.9684 0.9686 +vt 0.9605 0.9686 +vt 0.9918 0.9608 +vt 0.9996 0.9608 +vt 0.9996 0.9686 +vt 0.9918 0.9686 +vt 0.9762 0.9608 +vt 0.9840 0.9608 +vt 0.9840 0.9686 +vt 0.9762 0.9686 +vt 0.9762 0.9452 +vt 0.9840 0.9452 +vt 0.9840 0.9530 +vt 0.9762 0.9530 +vt 0.9918 0.9452 +vt 0.9996 0.9452 +vt 0.9996 0.9530 +vt 0.9918 0.9530 +vt 0.9449 0.9608 +vt 0.9527 0.9608 +vt 0.9527 0.9686 +vt 0.9449 0.9686 +vt 0.9449 0.9452 +vt 0.9527 0.9452 +vt 0.9527 0.9530 +vt 0.9449 0.9530 +vt 0.9606 0.9452 +vt 0.9684 0.9452 +vt 0.9684 0.9530 +vt 0.9606 0.9530 +vt 0.9449 0.9920 +vt 0.9527 0.9920 +vt 0.9527 0.9999 +vt 0.9449 0.9999 +vt 0.9449 0.9764 +vt 0.9527 0.9764 +vt 0.9527 0.9842 +vt 0.9449 0.9842 +vt 0.9605 0.9764 +vt 0.9684 0.9764 +vt 0.9683 0.9842 +vt 0.9605 0.9842 +vt 0.4764 0.9607 +vt 0.4842 0.9607 +vt 0.4842 0.9685 +vt 0.4764 0.9685 +vt 0.4764 0.9451 +vt 0.4842 0.9451 +vt 0.4842 0.9529 +vt 0.4764 0.9529 +vt 0.4921 0.9451 +vt 0.4999 0.9451 +vt 0.4999 0.9529 +vt 0.4921 0.9529 +vt 0.4452 0.9607 +vt 0.4530 0.9607 +vt 0.4530 0.9685 +vt 0.4452 0.9685 +vt 0.4452 0.9450 +vt 0.4530 0.9451 +vt 0.4530 0.9529 +vt 0.4452 0.9529 +vt 0.4608 0.9451 +vt 0.4686 0.9451 +vt 0.4686 0.9529 +vt 0.4608 0.9529 +vt 0.4452 0.9919 +vt 0.4530 0.9919 +vt 0.4530 0.9997 +vt 0.4452 0.9997 +vt 0.4452 0.9763 +vt 0.4530 0.9763 +vt 0.4530 0.9841 +vt 0.4452 0.9841 +vt 0.4608 0.9763 +vt 0.4686 0.9763 +vt 0.4686 0.9841 +vt 0.4608 0.9841 +vt 0.4766 0.4609 +vt 0.4844 0.4609 +vt 0.4844 0.4687 +vt 0.4766 0.4687 +vt 0.4766 0.4453 +vt 0.4844 0.4453 +vt 0.4844 0.4531 +vt 0.4766 0.4531 +vt 0.4922 0.4453 +vt 0.5000 0.4453 +vt 0.5000 0.4531 +vt 0.4922 0.4531 +vt 0.4454 0.4609 +vt 0.4532 0.4609 +vt 0.4532 0.4687 +vt 0.4454 0.4687 +vt 0.4454 0.4453 +vt 0.4532 0.4453 +vt 0.4532 0.4531 +vt 0.4454 0.4531 +vt 0.4610 0.4453 +vt 0.4688 0.4453 +vt 0.4688 0.4531 +vt 0.4610 0.4531 +vt 0.4453 0.4922 +vt 0.4532 0.4922 +vt 0.4532 0.5000 +vt 0.4453 0.5000 +vt 0.4454 0.4765 +vt 0.4532 0.4765 +vt 0.4532 0.4844 +vt 0.4453 0.4844 +vt 0.4610 0.4765 +vt 0.4688 0.4766 +vt 0.4688 0.4844 +vt 0.4610 0.4844 +vt 0.9763 0.4611 +vt 0.9841 0.4611 +vt 0.9841 0.4689 +vt 0.9763 0.4689 +vt 0.9763 0.4455 +vt 0.9841 0.4455 +vt 0.9841 0.4533 +vt 0.9763 0.4533 +vt 0.9919 0.4455 +vt 0.9998 0.4455 +vt 0.9998 0.4533 +vt 0.9919 0.4533 +vt 0.9451 0.4611 +vt 0.9529 0.4611 +vt 0.9529 0.4689 +vt 0.9451 0.4689 +vt 0.9451 0.4455 +vt 0.9529 0.4455 +vt 0.9529 0.4533 +vt 0.9451 0.4533 +vt 0.9607 0.4455 +vt 0.9685 0.4455 +vt 0.9685 0.4533 +vt 0.9607 0.4533 +vt 0.9451 0.4923 +vt 0.9529 0.4923 +vt 0.9529 0.5001 +vt 0.9451 0.5001 +vt 0.9451 0.4767 +vt 0.9529 0.4767 +vt 0.9529 0.4845 +vt 0.9451 0.4845 +vt 0.9607 0.4767 +vt 0.9685 0.4767 +vt 0.9685 0.4845 +vt 0.9607 0.4845 +vt 0.7265 0.4610 +vt 0.7343 0.4610 +vt 0.7343 0.4688 +vt 0.7265 0.4688 +vt 0.7265 0.4454 +vt 0.7343 0.4454 +vt 0.7343 0.4532 +vt 0.7265 0.4532 +vt 0.7421 0.4454 +vt 0.7499 0.4454 +vt 0.7499 0.4532 +vt 0.7421 0.4532 +vt 0.6952 0.4610 +vt 0.7030 0.4610 +vt 0.7030 0.4688 +vt 0.6952 0.4688 +vt 0.6952 0.4454 +vt 0.7030 0.4454 +vt 0.7030 0.4532 +vt 0.6952 0.4532 +vt 0.7108 0.4454 +vt 0.7187 0.4454 +vt 0.7187 0.4532 +vt 0.7108 0.4532 +vt 0.6952 0.4922 +vt 0.7030 0.4922 +vt 0.7030 0.5000 +vt 0.6952 0.5000 +vt 0.6952 0.4766 +vt 0.7030 0.4766 +vt 0.7030 0.4844 +vt 0.6952 0.4844 +vt 0.7108 0.4766 +vt 0.7186 0.4766 +vt 0.7186 0.4844 +vt 0.7108 0.4844 +vt 0.7265 0.2111 +vt 0.7343 0.2111 +vt 0.7343 0.2190 +vt 0.7265 0.2190 +vt 0.7265 0.1955 +vt 0.7343 0.1955 +vt 0.7343 0.2033 +vt 0.7265 0.2033 +vt 0.7422 0.1955 +vt 0.7500 0.1955 +vt 0.7500 0.2033 +vt 0.7422 0.2033 +vt 0.6953 0.2111 +vt 0.7031 0.2111 +vt 0.7031 0.2189 +vt 0.6953 0.2189 +vt 0.6953 0.1955 +vt 0.7031 0.1955 +vt 0.7031 0.2033 +vt 0.6953 0.2033 +vt 0.7109 0.1955 +vt 0.7187 0.1955 +vt 0.7187 0.2033 +vt 0.7109 0.2033 +vt 0.6953 0.2424 +vt 0.7031 0.2424 +vt 0.7031 0.2502 +vt 0.6953 0.2502 +vt 0.6953 0.2268 +vt 0.7031 0.2268 +vt 0.7031 0.2346 +vt 0.6953 0.2346 +vt 0.7109 0.2268 +vt 0.7187 0.2268 +vt 0.7187 0.2346 +vt 0.7109 0.2346 +vt 0.9764 0.2112 +vt 0.9842 0.2112 +vt 0.9842 0.2190 +vt 0.9764 0.2190 +vt 0.9764 0.1956 +vt 0.9842 0.1956 +vt 0.9842 0.2034 +vt 0.9764 0.2034 +vt 0.9920 0.1956 +vt 0.9998 0.1956 +vt 0.9998 0.2034 +vt 0.9920 0.2034 +vt 0.9452 0.2112 +vt 0.9530 0.2112 +vt 0.9530 0.2190 +vt 0.9452 0.2190 +vt 0.9452 0.1956 +vt 0.9530 0.1956 +vt 0.9530 0.2034 +vt 0.9452 0.2034 +vt 0.9608 0.1956 +vt 0.9686 0.1956 +vt 0.9686 0.2034 +vt 0.9608 0.2034 +vt 0.9452 0.2424 +vt 0.9530 0.2425 +vt 0.9530 0.2503 +vt 0.9452 0.2503 +vt 0.9452 0.2268 +vt 0.9530 0.2268 +vt 0.9530 0.2346 +vt 0.9452 0.2346 +vt 0.9608 0.2268 +vt 0.9686 0.2268 +vt 0.9686 0.2346 +vt 0.9608 0.2346 +vt 0.2267 0.4609 +vt 0.2345 0.4609 +vt 0.2345 0.4687 +vt 0.2267 0.4687 +vt 0.2267 0.4452 +vt 0.2345 0.4452 +vt 0.2345 0.4531 +vt 0.2267 0.4530 +vt 0.2423 0.4452 +vt 0.2502 0.4452 +vt 0.2501 0.4531 +vt 0.2423 0.4531 +vt 0.1955 0.4608 +vt 0.2033 0.4609 +vt 0.2033 0.4687 +vt 0.1955 0.4687 +vt 0.1955 0.4452 +vt 0.2033 0.4452 +vt 0.2033 0.4530 +vt 0.1955 0.4530 +vt 0.2111 0.4452 +vt 0.2189 0.4452 +vt 0.2189 0.4530 +vt 0.2111 0.4530 +vt 0.1955 0.4921 +vt 0.2033 0.4921 +vt 0.2033 0.4999 +vt 0.1955 0.4999 +vt 0.1955 0.4765 +vt 0.2033 0.4765 +vt 0.2033 0.4843 +vt 0.1955 0.4843 +vt 0.2111 0.4765 +vt 0.2189 0.4765 +vt 0.2189 0.4843 +vt 0.2111 0.4843 +vt 0.2268 0.2110 +vt 0.2346 0.2110 +vt 0.2346 0.2188 +vt 0.2268 0.2188 +vt 0.2268 0.1954 +vt 0.2346 0.1954 +vt 0.2346 0.2032 +vt 0.2268 0.2032 +vt 0.2424 0.1954 +vt 0.2502 0.1954 +vt 0.2502 0.2032 +vt 0.2424 0.2032 +vt 0.1956 0.2110 +vt 0.2034 0.2110 +vt 0.2034 0.2188 +vt 0.1956 0.2188 +vt 0.1956 0.1954 +vt 0.2034 0.1954 +vt 0.2034 0.2032 +vt 0.1956 0.2032 +vt 0.2112 0.1954 +vt 0.2190 0.1954 +vt 0.2190 0.2032 +vt 0.2112 0.2032 +vt 0.1956 0.2422 +vt 0.2034 0.2422 +vt 0.2034 0.2500 +vt 0.1956 0.2500 +vt 0.1956 0.2266 +vt 0.2034 0.2266 +vt 0.2034 0.2344 +vt 0.1956 0.2344 +vt 0.2112 0.2266 +vt 0.2190 0.2266 +vt 0.2190 0.2344 +vt 0.2112 0.2344 +vt 0.4767 0.2111 +vt 0.4845 0.2111 +vt 0.4845 0.2189 +vt 0.4767 0.2189 +vt 0.4767 0.1955 +vt 0.4845 0.1955 +vt 0.4845 0.2033 +vt 0.4767 0.2033 +vt 0.4923 0.1955 +vt 0.5001 0.1955 +vt 0.5001 0.2033 +vt 0.4923 0.2033 +vt 0.4454 0.2111 +vt 0.4532 0.2111 +vt 0.4532 0.2189 +vt 0.4454 0.2189 +vt 0.4454 0.1954 +vt 0.4532 0.1954 +vt 0.4532 0.2033 +vt 0.4454 0.2033 +vt 0.4611 0.1954 +vt 0.4689 0.1954 +vt 0.4689 0.2033 +vt 0.4611 0.2033 +vt 0.4454 0.2423 +vt 0.4532 0.2423 +vt 0.4532 0.2501 +vt 0.4454 0.2501 +vt 0.4454 0.2267 +vt 0.4532 0.2267 +vt 0.4532 0.2345 +vt 0.4454 0.2345 +vt 0.4610 0.2267 +vt 0.4689 0.2267 +vt 0.4689 0.2345 +vt 0.4610 0.2345 +vt 0.2266 0.9606 +vt 0.2344 0.9606 +vt 0.2344 0.9684 +vt 0.2266 0.9684 +vt 0.2266 0.9450 +vt 0.2344 0.9450 +vt 0.2344 0.9528 +vt 0.2266 0.9528 +vt 0.2422 0.9450 +vt 0.2500 0.9450 +vt 0.2500 0.9528 +vt 0.2422 0.9528 +vt 0.1953 0.9606 +vt 0.2031 0.9606 +vt 0.2031 0.9684 +vt 0.1953 0.9684 +vt 0.1953 0.9450 +vt 0.2031 0.9450 +vt 0.2031 0.9528 +vt 0.1953 0.9528 +vt 0.2110 0.9450 +vt 0.2188 0.9450 +vt 0.2188 0.9528 +vt 0.2109 0.9528 +vt 0.1953 0.9918 +vt 0.2031 0.9918 +vt 0.2031 0.9996 +vt 0.1953 0.9996 +vt 0.1953 0.9762 +vt 0.2031 0.9762 +vt 0.2031 0.9840 +vt 0.1953 0.9840 +vt 0.2109 0.9762 +vt 0.2187 0.9762 +vt 0.2187 0.9840 +vt 0.2109 0.9840 +vt 0.2266 0.7107 +vt 0.2344 0.7107 +vt 0.2344 0.7185 +vt 0.2266 0.7185 +vt 0.2266 0.6951 +vt 0.2345 0.6951 +vt 0.2345 0.7029 +vt 0.2266 0.7029 +vt 0.2423 0.6951 +vt 0.2501 0.6951 +vt 0.2501 0.7029 +vt 0.2423 0.7029 +vt 0.1954 0.7107 +vt 0.2032 0.7107 +vt 0.2032 0.7185 +vt 0.1954 0.7185 +vt 0.1954 0.6951 +vt 0.2032 0.6951 +vt 0.2032 0.7029 +vt 0.1954 0.7029 +vt 0.2110 0.6951 +vt 0.2188 0.6951 +vt 0.2188 0.7029 +vt 0.2110 0.7029 +vt 0.1954 0.7420 +vt 0.2032 0.7420 +vt 0.2032 0.7498 +vt 0.1954 0.7498 +vt 0.1954 0.7263 +vt 0.2032 0.7263 +vt 0.2032 0.7341 +vt 0.1954 0.7341 +vt 0.2110 0.7263 +vt 0.2188 0.7263 +vt 0.2188 0.7342 +vt 0.2110 0.7341 +vt 0.4765 0.7108 +vt 0.4843 0.7108 +vt 0.4843 0.7186 +vt 0.4765 0.7186 +vt 0.4765 0.6952 +vt 0.4843 0.6952 +vt 0.4843 0.7030 +vt 0.4765 0.7030 +vt 0.4921 0.6952 +vt 0.4999 0.6952 +vt 0.4999 0.7030 +vt 0.4921 0.7030 +vt 0.4453 0.7108 +vt 0.4531 0.7108 +vt 0.4531 0.7186 +vt 0.4453 0.7186 +vt 0.4453 0.6952 +vt 0.4531 0.6952 +vt 0.4531 0.7030 +vt 0.4453 0.7030 +vt 0.4609 0.6952 +vt 0.4687 0.6952 +vt 0.4687 0.7030 +vt 0.4609 0.7030 +vt 0.4453 0.7420 +vt 0.4531 0.7420 +vt 0.4531 0.7498 +vt 0.4453 0.7498 +vt 0.4453 0.7264 +vt 0.4531 0.7264 +vt 0.4531 0.7342 +vt 0.4453 0.7342 +vt 0.4609 0.7264 +vt 0.4687 0.7264 +vt 0.4687 0.7342 +vt 0.4609 0.7342 +vt 0.7263 0.9607 +vt 0.7341 0.9608 +vt 0.7341 0.9686 +vt 0.7263 0.9686 +vt 0.7263 0.9451 +vt 0.7341 0.9451 +vt 0.7341 0.9529 +vt 0.7263 0.9529 +vt 0.7419 0.9451 +vt 0.7497 0.9451 +vt 0.7497 0.9529 +vt 0.7419 0.9529 +vt 0.6951 0.9607 +vt 0.7029 0.9607 +vt 0.7029 0.9686 +vt 0.6951 0.9685 +vt 0.6951 0.9451 +vt 0.7029 0.9451 +vt 0.7029 0.9529 +vt 0.6951 0.9529 +vt 0.7107 0.9451 +vt 0.7185 0.9451 +vt 0.7185 0.9529 +vt 0.7107 0.9529 +vt 0.6951 0.9920 +vt 0.7029 0.9920 +vt 0.7029 0.9998 +vt 0.6951 0.9998 +vt 0.6951 0.9764 +vt 0.7029 0.9764 +vt 0.7029 0.9842 +vt 0.6951 0.9842 +vt 0.7107 0.9764 +vt 0.7185 0.9764 +vt 0.7185 0.9842 +vt 0.7107 0.9842 +vt 0.7264 0.7109 +vt 0.7342 0.7109 +vt 0.7342 0.7187 +vt 0.7264 0.7187 +vt 0.7264 0.6953 +vt 0.7342 0.6953 +vt 0.7342 0.7031 +vt 0.7264 0.7031 +vt 0.7420 0.6953 +vt 0.7498 0.6953 +vt 0.7498 0.7031 +vt 0.7420 0.7031 +vt 0.6951 0.7109 +vt 0.7030 0.7109 +vt 0.7030 0.7187 +vt 0.6951 0.7187 +vt 0.6951 0.6953 +vt 0.7030 0.6953 +vt 0.7030 0.7031 +vt 0.6951 0.7031 +vt 0.7108 0.6953 +vt 0.7186 0.6953 +vt 0.7186 0.7031 +vt 0.7108 0.7031 +vt 0.6951 0.7421 +vt 0.7029 0.7421 +vt 0.7029 0.7499 +vt 0.6951 0.7499 +vt 0.6951 0.7265 +vt 0.7029 0.7265 +vt 0.7029 0.7343 +vt 0.6951 0.7343 +vt 0.7108 0.7265 +vt 0.7186 0.7265 +vt 0.7186 0.7343 +vt 0.7108 0.7343 +vt 0.9762 0.7110 +vt 0.9841 0.7110 +vt 0.9840 0.7188 +vt 0.9762 0.7188 +vt 0.9762 0.6953 +vt 0.9841 0.6953 +vt 0.9841 0.7032 +vt 0.9762 0.7032 +vt 0.9919 0.6954 +vt 0.9997 0.6954 +vt 0.9997 0.7032 +vt 0.9919 0.7032 +vt 0.9450 0.7110 +vt 0.9528 0.7110 +vt 0.9528 0.7188 +vt 0.9450 0.7188 +vt 0.9450 0.6953 +vt 0.9528 0.6953 +vt 0.9528 0.7031 +vt 0.9450 0.7031 +vt 0.9606 0.6953 +vt 0.9684 0.6953 +vt 0.9684 0.7032 +vt 0.9606 0.7031 +vt 0.9450 0.7422 +vt 0.9528 0.7422 +vt 0.9528 0.7500 +vt 0.9450 0.7500 +vt 0.9450 0.7266 +vt 0.9528 0.7266 +vt 0.9528 0.7344 +vt 0.9450 0.7344 +vt 0.9606 0.7266 +vt 0.9684 0.7266 +vt 0.9684 0.7344 +vt 0.9606 0.7344 +vt 0.8513 0.7109 +vt 0.8591 0.7109 +vt 0.8591 0.7187 +vt 0.8513 0.7187 +vt 0.8513 0.6953 +vt 0.8591 0.6953 +vt 0.8591 0.7031 +vt 0.8513 0.7031 +vt 0.8669 0.6953 +vt 0.8747 0.6953 +vt 0.8747 0.7031 +vt 0.8669 0.7031 +vt 0.8201 0.7109 +vt 0.8279 0.7109 +vt 0.8279 0.7187 +vt 0.8201 0.7187 +vt 0.8201 0.6953 +vt 0.8279 0.6953 +vt 0.8279 0.7031 +vt 0.8201 0.7031 +vt 0.8357 0.6953 +vt 0.8435 0.6953 +vt 0.8435 0.7031 +vt 0.8357 0.7031 +vt 0.8201 0.7421 +vt 0.8279 0.7421 +vt 0.8279 0.7500 +vt 0.8201 0.7500 +vt 0.8201 0.7265 +vt 0.8279 0.7265 +vt 0.8279 0.7343 +vt 0.8201 0.7343 +vt 0.8357 0.7265 +vt 0.8435 0.7265 +vt 0.8435 0.7343 +vt 0.8357 0.7343 +vt 0.8514 0.5860 +vt 0.8592 0.5860 +vt 0.8592 0.5938 +vt 0.8513 0.5938 +vt 0.8514 0.5704 +vt 0.8592 0.5704 +vt 0.8592 0.5782 +vt 0.8514 0.5782 +vt 0.8670 0.5704 +vt 0.8748 0.5704 +vt 0.8748 0.5782 +vt 0.8670 0.5782 +vt 0.8201 0.5860 +vt 0.8279 0.5860 +vt 0.8279 0.5938 +vt 0.8201 0.5938 +vt 0.8201 0.5704 +vt 0.8279 0.5704 +vt 0.8279 0.5782 +vt 0.8201 0.5782 +vt 0.8357 0.5704 +vt 0.8435 0.5704 +vt 0.8435 0.5782 +vt 0.8357 0.5782 +vt 0.8201 0.6172 +vt 0.8279 0.6172 +vt 0.8279 0.6250 +vt 0.8201 0.6250 +vt 0.8201 0.6016 +vt 0.8279 0.6016 +vt 0.8279 0.6094 +vt 0.8201 0.6094 +vt 0.8357 0.6016 +vt 0.8435 0.6016 +vt 0.8435 0.6094 +vt 0.8357 0.6094 +vt 0.9763 0.5860 +vt 0.9841 0.5860 +vt 0.9841 0.5938 +vt 0.9763 0.5938 +vt 0.9763 0.5704 +vt 0.9841 0.5704 +vt 0.9841 0.5782 +vt 0.9763 0.5782 +vt 0.9919 0.5704 +vt 0.9997 0.5704 +vt 0.9997 0.5782 +vt 0.9919 0.5782 +vt 0.9451 0.5860 +vt 0.9529 0.5860 +vt 0.9529 0.5938 +vt 0.9450 0.5938 +vt 0.9451 0.5704 +vt 0.9529 0.5704 +vt 0.9529 0.5782 +vt 0.9451 0.5782 +vt 0.9607 0.5704 +vt 0.9685 0.5704 +vt 0.9685 0.5782 +vt 0.9607 0.5782 +vt 0.9450 0.6173 +vt 0.9528 0.6173 +vt 0.9528 0.6251 +vt 0.9450 0.6251 +vt 0.9450 0.6016 +vt 0.9529 0.6016 +vt 0.9529 0.6094 +vt 0.9450 0.6094 +vt 0.9607 0.6016 +vt 0.9685 0.6016 +vt 0.9685 0.6095 +vt 0.9607 0.6094 +vt 0.6014 0.7108 +vt 0.6093 0.7108 +vt 0.6093 0.7187 +vt 0.6014 0.7187 +vt 0.6014 0.6952 +vt 0.6093 0.6952 +vt 0.6093 0.7030 +vt 0.6014 0.7030 +vt 0.6171 0.6952 +vt 0.6249 0.6952 +vt 0.6249 0.7030 +vt 0.6171 0.7030 +vt 0.5702 0.7108 +vt 0.5780 0.7108 +vt 0.5780 0.7186 +vt 0.5702 0.7186 +vt 0.5702 0.6952 +vt 0.5780 0.6952 +vt 0.5780 0.7030 +vt 0.5702 0.7030 +vt 0.5858 0.6952 +vt 0.5936 0.6952 +vt 0.5936 0.7030 +vt 0.5858 0.7030 +vt 0.5702 0.7421 +vt 0.5780 0.7421 +vt 0.5780 0.7499 +vt 0.5702 0.7499 +vt 0.5702 0.7265 +vt 0.5780 0.7265 +vt 0.5780 0.7343 +vt 0.5702 0.7343 +vt 0.5858 0.7265 +vt 0.5936 0.7265 +vt 0.5936 0.7343 +vt 0.5858 0.7343 +vt 0.6015 0.5859 +vt 0.6093 0.5859 +vt 0.6093 0.5937 +vt 0.6015 0.5937 +vt 0.6015 0.5703 +vt 0.6093 0.5703 +vt 0.6093 0.5781 +vt 0.6015 0.5781 +vt 0.6171 0.5703 +vt 0.6249 0.5703 +vt 0.6249 0.5781 +vt 0.6171 0.5781 +vt 0.5703 0.5859 +vt 0.5781 0.5859 +vt 0.5781 0.5937 +vt 0.5702 0.5937 +vt 0.5703 0.5703 +vt 0.5781 0.5703 +vt 0.5781 0.5781 +vt 0.5703 0.5781 +vt 0.5859 0.5703 +vt 0.5937 0.5703 +vt 0.5937 0.5781 +vt 0.5859 0.5781 +vt 0.5702 0.6171 +vt 0.5780 0.6171 +vt 0.5780 0.6249 +vt 0.5702 0.6249 +vt 0.5702 0.6015 +vt 0.5781 0.6015 +vt 0.5781 0.6093 +vt 0.5702 0.6093 +vt 0.5859 0.6015 +vt 0.5937 0.6015 +vt 0.5937 0.6093 +vt 0.5859 0.6093 +vt 0.7264 0.5859 +vt 0.7342 0.5860 +vt 0.7342 0.5938 +vt 0.7264 0.5938 +vt 0.7264 0.5703 +vt 0.7342 0.5703 +vt 0.7342 0.5781 +vt 0.7264 0.5781 +vt 0.7420 0.5703 +vt 0.7498 0.5703 +vt 0.7498 0.5781 +vt 0.7420 0.5781 +vt 0.6952 0.5859 +vt 0.7030 0.5859 +vt 0.7030 0.5938 +vt 0.6952 0.5937 +vt 0.6952 0.5703 +vt 0.7030 0.5703 +vt 0.7030 0.5781 +vt 0.6952 0.5781 +vt 0.7108 0.5703 +vt 0.7186 0.5703 +vt 0.7186 0.5781 +vt 0.7108 0.5781 +vt 0.6952 0.6172 +vt 0.7030 0.6172 +vt 0.7030 0.6250 +vt 0.6952 0.6250 +vt 0.6952 0.6016 +vt 0.7030 0.6016 +vt 0.7030 0.6094 +vt 0.6952 0.6094 +vt 0.7108 0.6016 +vt 0.7186 0.6016 +vt 0.7186 0.6094 +vt 0.7108 0.6094 +vt 0.6014 0.9607 +vt 0.6092 0.9607 +vt 0.6092 0.9685 +vt 0.6014 0.9685 +vt 0.6014 0.9451 +vt 0.6092 0.9451 +vt 0.6092 0.9529 +vt 0.6014 0.9529 +vt 0.6170 0.9451 +vt 0.6248 0.9451 +vt 0.6248 0.9529 +vt 0.6170 0.9529 +vt 0.5701 0.9607 +vt 0.5779 0.9607 +vt 0.5779 0.9685 +vt 0.5701 0.9685 +vt 0.5701 0.9451 +vt 0.5779 0.9451 +vt 0.5779 0.9529 +vt 0.5701 0.9529 +vt 0.5858 0.9451 +vt 0.5936 0.9451 +vt 0.5936 0.9529 +vt 0.5858 0.9529 +vt 0.5701 0.9919 +vt 0.5779 0.9919 +vt 0.5779 0.9997 +vt 0.5701 0.9997 +vt 0.5701 0.9763 +vt 0.5779 0.9763 +vt 0.5779 0.9841 +vt 0.5701 0.9841 +vt 0.5857 0.9763 +vt 0.5936 0.9763 +vt 0.5936 0.9841 +vt 0.5857 0.9841 +vt 0.6014 0.8358 +vt 0.6092 0.8358 +vt 0.6092 0.8436 +vt 0.6014 0.8436 +vt 0.6014 0.8202 +vt 0.6092 0.8202 +vt 0.6092 0.8280 +vt 0.6014 0.8280 +vt 0.6170 0.8202 +vt 0.6248 0.8202 +vt 0.6248 0.8280 +vt 0.6170 0.8280 +vt 0.5702 0.8358 +vt 0.5780 0.8358 +vt 0.5780 0.8436 +vt 0.5702 0.8436 +vt 0.5702 0.8202 +vt 0.5780 0.8202 +vt 0.5780 0.8280 +vt 0.5702 0.8280 +vt 0.5858 0.8202 +vt 0.5936 0.8202 +vt 0.5936 0.8280 +vt 0.5858 0.8280 +vt 0.5702 0.8670 +vt 0.5780 0.8670 +vt 0.5780 0.8748 +vt 0.5702 0.8748 +vt 0.5702 0.8514 +vt 0.5780 0.8514 +vt 0.5780 0.8592 +vt 0.5702 0.8592 +vt 0.5858 0.8514 +vt 0.5936 0.8514 +vt 0.5936 0.8592 +vt 0.5858 0.8592 +vt 0.7263 0.8358 +vt 0.7341 0.8358 +vt 0.7341 0.8436 +vt 0.7263 0.8436 +vt 0.7263 0.8202 +vt 0.7342 0.8202 +vt 0.7342 0.8280 +vt 0.7263 0.8280 +vt 0.7420 0.8202 +vt 0.7498 0.8202 +vt 0.7498 0.8280 +vt 0.7420 0.8280 +vt 0.6951 0.8358 +vt 0.7029 0.8358 +vt 0.7029 0.8436 +vt 0.6951 0.8436 +vt 0.6951 0.8202 +vt 0.7029 0.8202 +vt 0.7029 0.8280 +vt 0.6951 0.8280 +vt 0.7107 0.8202 +vt 0.7185 0.8202 +vt 0.7185 0.8280 +vt 0.7107 0.8280 +vt 0.6951 0.8670 +vt 0.7029 0.8670 +vt 0.7029 0.8749 +vt 0.6951 0.8748 +vt 0.6951 0.8514 +vt 0.7029 0.8514 +vt 0.7029 0.8592 +vt 0.6951 0.8592 +vt 0.7107 0.8514 +vt 0.7185 0.8514 +vt 0.7185 0.8592 +vt 0.7107 0.8592 +vt 0.3516 0.7108 +vt 0.3594 0.7108 +vt 0.3594 0.7186 +vt 0.3516 0.7186 +vt 0.3516 0.6951 +vt 0.3594 0.6952 +vt 0.3594 0.7030 +vt 0.3516 0.7030 +vt 0.3672 0.6952 +vt 0.3750 0.6952 +vt 0.3750 0.7030 +vt 0.3672 0.7030 +vt 0.3203 0.7108 +vt 0.3282 0.7108 +vt 0.3281 0.7186 +vt 0.3203 0.7186 +vt 0.3203 0.6951 +vt 0.3282 0.6951 +vt 0.3282 0.7030 +vt 0.3203 0.7029 +vt 0.3360 0.6951 +vt 0.3438 0.6951 +vt 0.3438 0.7030 +vt 0.3360 0.7030 +vt 0.3203 0.7420 +vt 0.3281 0.7420 +vt 0.3281 0.7498 +vt 0.3203 0.7498 +vt 0.3203 0.7264 +vt 0.3281 0.7264 +vt 0.3281 0.7342 +vt 0.3203 0.7342 +vt 0.3360 0.7264 +vt 0.3438 0.7264 +vt 0.3438 0.7342 +vt 0.3360 0.7342 +vt 0.3516 0.5858 +vt 0.3594 0.5858 +vt 0.3594 0.5936 +vt 0.3516 0.5936 +vt 0.3516 0.5702 +vt 0.3594 0.5702 +vt 0.3594 0.5780 +vt 0.3516 0.5780 +vt 0.3672 0.5702 +vt 0.3750 0.5702 +vt 0.3750 0.5780 +vt 0.3672 0.5780 +vt 0.3204 0.5858 +vt 0.3282 0.5858 +vt 0.3282 0.5936 +vt 0.3204 0.5936 +vt 0.3204 0.5702 +vt 0.3282 0.5702 +vt 0.3282 0.5780 +vt 0.3204 0.5780 +vt 0.3360 0.5702 +vt 0.3438 0.5702 +vt 0.3438 0.5780 +vt 0.3360 0.5780 +vt 0.3204 0.6171 +vt 0.3282 0.6171 +vt 0.3282 0.6249 +vt 0.3204 0.6249 +vt 0.3204 0.6014 +vt 0.3282 0.6014 +vt 0.3282 0.6092 +vt 0.3204 0.6092 +vt 0.3360 0.6014 +vt 0.3438 0.6014 +vt 0.3438 0.6093 +vt 0.3360 0.6093 +vt 0.4765 0.5859 +vt 0.4844 0.5859 +vt 0.4844 0.5937 +vt 0.4765 0.5937 +vt 0.4766 0.5703 +vt 0.4844 0.5703 +vt 0.4844 0.5781 +vt 0.4766 0.5781 +vt 0.4922 0.5703 +vt 0.5000 0.5703 +vt 0.5000 0.5781 +vt 0.4922 0.5781 +vt 0.4453 0.5859 +vt 0.4531 0.5859 +vt 0.4531 0.5937 +vt 0.4453 0.5937 +vt 0.4453 0.5702 +vt 0.4531 0.5702 +vt 0.4531 0.5781 +vt 0.4453 0.5781 +vt 0.4609 0.5702 +vt 0.4687 0.5703 +vt 0.4687 0.5781 +vt 0.4609 0.5781 +vt 0.4453 0.6171 +vt 0.4531 0.6171 +vt 0.4531 0.6249 +vt 0.4453 0.6249 +vt 0.4453 0.6015 +vt 0.4531 0.6015 +vt 0.4531 0.6093 +vt 0.4453 0.6093 +vt 0.4609 0.6015 +vt 0.4687 0.6015 +vt 0.4687 0.6093 +vt 0.4609 0.6093 +vt 0.1017 0.7107 +vt 0.1095 0.7107 +vt 0.1095 0.7185 +vt 0.1017 0.7185 +vt 0.1017 0.6951 +vt 0.1095 0.6951 +vt 0.1095 0.7029 +vt 0.1017 0.7029 +vt 0.1173 0.6951 +vt 0.1251 0.6951 +vt 0.1251 0.7029 +vt 0.1173 0.7029 +vt 0.0705 0.7107 +vt 0.0783 0.7107 +vt 0.0783 0.7185 +vt 0.0705 0.7185 +vt 0.0705 0.6951 +vt 0.0783 0.6951 +vt 0.0783 0.7029 +vt 0.0705 0.7029 +vt 0.0861 0.6951 +vt 0.0939 0.6951 +vt 0.0939 0.7029 +vt 0.0861 0.7029 +vt 0.0705 0.7419 +vt 0.0783 0.7419 +vt 0.0783 0.7497 +vt 0.0705 0.7497 +vt 0.0705 0.7263 +vt 0.0783 0.7263 +vt 0.0783 0.7341 +vt 0.0705 0.7341 +vt 0.0861 0.7263 +vt 0.0939 0.7263 +vt 0.0939 0.7341 +vt 0.0861 0.7341 +vt 0.1017 0.5858 +vt 0.1096 0.5858 +vt 0.1096 0.5936 +vt 0.1017 0.5936 +vt 0.1018 0.5701 +vt 0.1096 0.5701 +vt 0.1096 0.5779 +vt 0.1017 0.5779 +vt 0.1174 0.5701 +vt 0.1252 0.5701 +vt 0.1252 0.5780 +vt 0.1174 0.5779 +vt 0.0705 0.5857 +vt 0.0783 0.5857 +vt 0.0783 0.5936 +vt 0.0705 0.5935 +vt 0.0705 0.5701 +vt 0.0783 0.5701 +vt 0.0783 0.5779 +vt 0.0705 0.5779 +vt 0.0861 0.5701 +vt 0.0939 0.5701 +vt 0.0939 0.5779 +vt 0.0861 0.5779 +vt 0.0705 0.6170 +vt 0.0783 0.6170 +vt 0.0783 0.6248 +vt 0.0705 0.6248 +vt 0.0705 0.6014 +vt 0.0783 0.6014 +vt 0.0783 0.6092 +vt 0.0705 0.6092 +vt 0.0861 0.6014 +vt 0.0939 0.6014 +vt 0.0939 0.6092 +vt 0.0861 0.6092 +vt 0.2267 0.5858 +vt 0.2345 0.5858 +vt 0.2345 0.5936 +vt 0.2267 0.5936 +vt 0.2267 0.5702 +vt 0.2345 0.5702 +vt 0.2345 0.5780 +vt 0.2267 0.5780 +vt 0.2423 0.5702 +vt 0.2501 0.5702 +vt 0.2501 0.5780 +vt 0.2423 0.5780 +vt 0.1954 0.5858 +vt 0.2033 0.5858 +vt 0.2033 0.5936 +vt 0.1954 0.5936 +vt 0.1955 0.5702 +vt 0.2033 0.5702 +vt 0.2033 0.5780 +vt 0.1954 0.5780 +vt 0.2111 0.5702 +vt 0.2189 0.5702 +vt 0.2189 0.5780 +vt 0.2111 0.5780 +vt 0.1954 0.6170 +vt 0.2032 0.6170 +vt 0.2032 0.6248 +vt 0.1954 0.6248 +vt 0.1954 0.6014 +vt 0.2033 0.6014 +vt 0.2032 0.6092 +vt 0.1954 0.6092 +vt 0.2111 0.6014 +vt 0.2189 0.6014 +vt 0.2189 0.6092 +vt 0.2111 0.6092 +vt 0.1016 0.9606 +vt 0.1094 0.9606 +vt 0.1094 0.9684 +vt 0.1016 0.9684 +vt 0.1016 0.9449 +vt 0.1094 0.9449 +vt 0.1094 0.9528 +vt 0.1016 0.9528 +vt 0.1172 0.9449 +vt 0.1251 0.9450 +vt 0.1251 0.9528 +vt 0.1172 0.9528 +vt 0.0704 0.9606 +vt 0.0782 0.9606 +vt 0.0782 0.9684 +vt 0.0704 0.9684 +vt 0.0704 0.9449 +vt 0.0782 0.9449 +vt 0.0782 0.9527 +vt 0.0704 0.9527 +vt 0.0860 0.9449 +vt 0.0938 0.9449 +vt 0.0938 0.9528 +vt 0.0860 0.9527 +vt 0.0704 0.9918 +vt 0.0782 0.9918 +vt 0.0782 0.9996 +vt 0.0704 0.9996 +vt 0.0704 0.9762 +vt 0.0782 0.9762 +vt 0.0782 0.9840 +vt 0.0704 0.9840 +vt 0.0860 0.9762 +vt 0.0938 0.9762 +vt 0.0938 0.9840 +vt 0.0860 0.9840 +vt 0.1017 0.8356 +vt 0.1095 0.8356 +vt 0.1095 0.8434 +vt 0.1017 0.8434 +vt 0.1017 0.8200 +vt 0.1095 0.8200 +vt 0.1095 0.8278 +vt 0.1017 0.8278 +vt 0.1173 0.8200 +vt 0.1251 0.8200 +vt 0.1251 0.8278 +vt 0.1173 0.8278 +vt 0.0704 0.8356 +vt 0.0782 0.8356 +vt 0.0782 0.8434 +vt 0.0704 0.8434 +vt 0.0704 0.8200 +vt 0.0782 0.8200 +vt 0.0782 0.8278 +vt 0.0704 0.8278 +vt 0.0861 0.8200 +vt 0.0939 0.8200 +vt 0.0939 0.8278 +vt 0.0860 0.8278 +vt 0.0704 0.8668 +vt 0.0782 0.8669 +vt 0.0782 0.8747 +vt 0.0704 0.8747 +vt 0.0704 0.8512 +vt 0.0782 0.8512 +vt 0.0782 0.8590 +vt 0.0704 0.8590 +vt 0.0860 0.8512 +vt 0.0939 0.8512 +vt 0.0938 0.8590 +vt 0.0860 0.8590 +vt 0.2266 0.8357 +vt 0.2344 0.8357 +vt 0.2344 0.8435 +vt 0.2266 0.8435 +vt 0.2266 0.8200 +vt 0.2344 0.8200 +vt 0.2344 0.8279 +vt 0.2266 0.8279 +vt 0.2422 0.8201 +vt 0.2500 0.8201 +vt 0.2500 0.8279 +vt 0.2422 0.8279 +vt 0.1954 0.8357 +vt 0.2032 0.8357 +vt 0.2032 0.8435 +vt 0.1954 0.8435 +vt 0.1954 0.8200 +vt 0.2032 0.8200 +vt 0.2032 0.8278 +vt 0.1954 0.8278 +vt 0.2110 0.8200 +vt 0.2188 0.8200 +vt 0.2188 0.8279 +vt 0.2110 0.8279 +vt 0.1954 0.8669 +vt 0.2032 0.8669 +vt 0.2032 0.8747 +vt 0.1954 0.8747 +vt 0.1954 0.8513 +vt 0.2032 0.8513 +vt 0.2032 0.8591 +vt 0.1954 0.8591 +vt 0.2110 0.8513 +vt 0.2188 0.8513 +vt 0.2188 0.8591 +vt 0.2110 0.8591 +vt 0.3517 0.2110 +vt 0.3595 0.2110 +vt 0.3595 0.2188 +vt 0.3517 0.2188 +vt 0.3517 0.1954 +vt 0.3595 0.1954 +vt 0.3595 0.2032 +vt 0.3517 0.2032 +vt 0.3674 0.1954 +vt 0.3752 0.1954 +vt 0.3752 0.2032 +vt 0.3674 0.2032 +vt 0.3205 0.2110 +vt 0.3283 0.2110 +vt 0.3283 0.2188 +vt 0.3205 0.2188 +vt 0.3205 0.1954 +vt 0.3283 0.1954 +vt 0.3283 0.2032 +vt 0.3205 0.2032 +vt 0.3361 0.1954 +vt 0.3439 0.1954 +vt 0.3439 0.2032 +vt 0.3361 0.2032 +vt 0.3205 0.2423 +vt 0.3283 0.2423 +vt 0.3283 0.2501 +vt 0.3205 0.2501 +vt 0.3205 0.2266 +vt 0.3283 0.2266 +vt 0.3283 0.2344 +vt 0.3205 0.2344 +vt 0.3361 0.2266 +vt 0.3439 0.2266 +vt 0.3439 0.2345 +vt 0.3361 0.2345 +vt 0.3518 0.0861 +vt 0.3596 0.0861 +vt 0.3596 0.0939 +vt 0.3518 0.0939 +vt 0.3518 0.0705 +vt 0.3596 0.0705 +vt 0.3596 0.0783 +vt 0.3518 0.0783 +vt 0.3674 0.0705 +vt 0.3752 0.0705 +vt 0.3752 0.0783 +vt 0.3674 0.0783 +vt 0.3205 0.0861 +vt 0.3283 0.0861 +vt 0.3283 0.0939 +vt 0.3205 0.0939 +vt 0.3205 0.0705 +vt 0.3284 0.0705 +vt 0.3283 0.0783 +vt 0.3205 0.0783 +vt 0.3362 0.0705 +vt 0.3440 0.0705 +vt 0.3440 0.0783 +vt 0.3362 0.0783 +vt 0.3205 0.1173 +vt 0.3283 0.1173 +vt 0.3283 0.1251 +vt 0.3205 0.1251 +vt 0.3205 0.1017 +vt 0.3283 0.1017 +vt 0.3283 0.1095 +vt 0.3205 0.1095 +vt 0.3361 0.1017 +vt 0.3440 0.1017 +vt 0.3440 0.1095 +vt 0.3361 0.1095 +vt 0.4767 0.0861 +vt 0.4845 0.0861 +vt 0.4845 0.0939 +vt 0.4767 0.0939 +vt 0.4767 0.0705 +vt 0.4845 0.0705 +vt 0.4845 0.0783 +vt 0.4767 0.0783 +vt 0.4923 0.0705 +vt 0.5001 0.0705 +vt 0.5001 0.0783 +vt 0.4923 0.0783 +vt 0.4455 0.0861 +vt 0.4533 0.0861 +vt 0.4533 0.0939 +vt 0.4455 0.0939 +vt 0.4455 0.0705 +vt 0.4533 0.0705 +vt 0.4533 0.0783 +vt 0.4455 0.0783 +vt 0.4611 0.0705 +vt 0.4689 0.0705 +vt 0.4689 0.0783 +vt 0.4611 0.0783 +vt 0.4455 0.1174 +vt 0.4533 0.1174 +vt 0.4533 0.1252 +vt 0.4455 0.1252 +vt 0.4455 0.1017 +vt 0.4533 0.1017 +vt 0.4533 0.1096 +vt 0.4455 0.1096 +vt 0.4611 0.1017 +vt 0.4689 0.1017 +vt 0.4689 0.1096 +vt 0.4611 0.1096 +vt 0.1019 0.2110 +vt 0.1097 0.2110 +vt 0.1097 0.2188 +vt 0.1019 0.2188 +vt 0.1019 0.1953 +vt 0.1097 0.1953 +vt 0.1097 0.2031 +vt 0.1019 0.2031 +vt 0.1175 0.1953 +vt 0.1253 0.1953 +vt 0.1253 0.2032 +vt 0.1175 0.2031 +vt 0.0706 0.2109 +vt 0.0784 0.2109 +vt 0.0784 0.2188 +vt 0.0706 0.2187 +vt 0.0706 0.1953 +vt 0.0784 0.1953 +vt 0.0784 0.2031 +vt 0.0706 0.2031 +vt 0.0863 0.1953 +vt 0.0941 0.1953 +vt 0.0941 0.2031 +vt 0.0863 0.2031 +vt 0.0706 0.2422 +vt 0.0784 0.2422 +vt 0.0784 0.2500 +vt 0.0706 0.2500 +vt 0.0706 0.2266 +vt 0.0784 0.2266 +vt 0.0784 0.2344 +vt 0.0706 0.2344 +vt 0.0862 0.2266 +vt 0.0941 0.2266 +vt 0.0941 0.2344 +vt 0.0862 0.2344 +vt 0.1019 0.0860 +vt 0.1097 0.0860 +vt 0.1097 0.0938 +vt 0.1019 0.0938 +vt 0.1019 0.0704 +vt 0.1097 0.0704 +vt 0.1097 0.0782 +vt 0.1019 0.0782 +vt 0.1175 0.0704 +vt 0.1253 0.0704 +vt 0.1253 0.0782 +vt 0.1175 0.0782 +vt 0.0707 0.0860 +vt 0.0785 0.0860 +vt 0.0785 0.0938 +vt 0.0707 0.0938 +vt 0.0707 0.0704 +vt 0.0785 0.0704 +vt 0.0785 0.0782 +vt 0.0707 0.0782 +vt 0.0863 0.0704 +vt 0.0941 0.0704 +vt 0.0941 0.0782 +vt 0.0863 0.0782 +vt 0.0707 0.1172 +vt 0.0785 0.1172 +vt 0.0785 0.1251 +vt 0.0707 0.1251 +vt 0.0707 0.1016 +vt 0.0785 0.1016 +vt 0.0785 0.1094 +vt 0.0707 0.1094 +vt 0.0863 0.1016 +vt 0.0941 0.1016 +vt 0.0941 0.1094 +vt 0.0863 0.1094 +vt 0.2268 0.0861 +vt 0.2346 0.0861 +vt 0.2346 0.0939 +vt 0.2268 0.0939 +vt 0.2268 0.0704 +vt 0.2347 0.0704 +vt 0.2346 0.0783 +vt 0.2268 0.0783 +vt 0.2425 0.0704 +vt 0.2503 0.0705 +vt 0.2503 0.0783 +vt 0.2425 0.0783 +vt 0.1956 0.0861 +vt 0.2034 0.0861 +vt 0.2034 0.0939 +vt 0.1956 0.0939 +vt 0.1956 0.0704 +vt 0.2034 0.0704 +vt 0.2034 0.0782 +vt 0.1956 0.0782 +vt 0.2112 0.0704 +vt 0.2190 0.0704 +vt 0.2190 0.0782 +vt 0.2112 0.0782 +vt 0.1956 0.1173 +vt 0.2034 0.1173 +vt 0.2034 0.1251 +vt 0.1956 0.1251 +vt 0.1956 0.1017 +vt 0.2034 0.1017 +vt 0.2034 0.1095 +vt 0.1956 0.1095 +vt 0.2112 0.1017 +vt 0.2190 0.1017 +vt 0.2190 0.1095 +vt 0.2112 0.1095 +vt 0.1018 0.4608 +vt 0.1096 0.4608 +vt 0.1096 0.4686 +vt 0.1018 0.4686 +vt 0.1018 0.4452 +vt 0.1096 0.4452 +vt 0.1096 0.4530 +vt 0.1018 0.4530 +vt 0.1174 0.4452 +vt 0.1252 0.4452 +vt 0.1252 0.4530 +vt 0.1174 0.4530 +vt 0.0706 0.4608 +vt 0.0784 0.4608 +vt 0.0784 0.4686 +vt 0.0706 0.4686 +vt 0.0706 0.4452 +vt 0.0784 0.4452 +vt 0.0784 0.4530 +vt 0.0706 0.4530 +vt 0.0862 0.4452 +vt 0.0940 0.4452 +vt 0.0940 0.4530 +vt 0.0862 0.4530 +vt 0.0705 0.4920 +vt 0.0784 0.4920 +vt 0.0783 0.4999 +vt 0.0705 0.4998 +vt 0.0705 0.4764 +vt 0.0784 0.4764 +vt 0.0784 0.4842 +vt 0.0705 0.4842 +vt 0.0862 0.4764 +vt 0.0940 0.4764 +vt 0.0940 0.4842 +vt 0.0862 0.4842 +vt 0.1018 0.3359 +vt 0.1096 0.3359 +vt 0.1096 0.3437 +vt 0.1018 0.3437 +vt 0.1018 0.3203 +vt 0.1096 0.3203 +vt 0.1096 0.3281 +vt 0.1018 0.3281 +vt 0.1174 0.3203 +vt 0.1253 0.3203 +vt 0.1253 0.3281 +vt 0.1174 0.3281 +vt 0.0706 0.3359 +vt 0.0784 0.3359 +vt 0.0784 0.3437 +vt 0.0706 0.3437 +vt 0.0706 0.3203 +vt 0.0784 0.3203 +vt 0.0784 0.3281 +vt 0.0706 0.3281 +vt 0.0862 0.3203 +vt 0.0940 0.3203 +vt 0.0940 0.3281 +vt 0.0862 0.3281 +vt 0.0706 0.3671 +vt 0.0784 0.3671 +vt 0.0784 0.3749 +vt 0.0706 0.3749 +vt 0.0706 0.3515 +vt 0.0784 0.3515 +vt 0.0784 0.3593 +vt 0.0706 0.3593 +vt 0.0862 0.3515 +vt 0.0940 0.3515 +vt 0.0940 0.3593 +vt 0.0862 0.3593 +vt 0.2268 0.3359 +vt 0.2346 0.3359 +vt 0.2346 0.3437 +vt 0.2268 0.3437 +vt 0.2268 0.3203 +vt 0.2346 0.3203 +vt 0.2346 0.3281 +vt 0.2268 0.3281 +vt 0.2424 0.3203 +vt 0.2502 0.3203 +vt 0.2502 0.3281 +vt 0.2424 0.3281 +vt 0.1955 0.3359 +vt 0.2033 0.3359 +vt 0.2033 0.3437 +vt 0.1955 0.3437 +vt 0.1955 0.3203 +vt 0.2033 0.3203 +vt 0.2033 0.3281 +vt 0.1955 0.3281 +vt 0.2111 0.3203 +vt 0.2190 0.3203 +vt 0.2190 0.3281 +vt 0.2111 0.3281 +vt 0.1955 0.3671 +vt 0.2033 0.3672 +vt 0.2033 0.3750 +vt 0.1955 0.3750 +vt 0.1955 0.3515 +vt 0.2033 0.3515 +vt 0.2033 0.3593 +vt 0.1955 0.3593 +vt 0.2111 0.3515 +vt 0.2189 0.3515 +vt 0.2189 0.3593 +vt 0.2111 0.3593 +vt 0.8515 0.2112 +vt 0.8593 0.2112 +vt 0.8593 0.2190 +vt 0.8515 0.2190 +vt 0.8515 0.1956 +vt 0.8593 0.1956 +vt 0.8593 0.2034 +vt 0.8515 0.2034 +vt 0.8671 0.1956 +vt 0.8749 0.1956 +vt 0.8749 0.2034 +vt 0.8671 0.2034 +vt 0.8202 0.2112 +vt 0.8280 0.2112 +vt 0.8280 0.2190 +vt 0.8202 0.2190 +vt 0.8202 0.1956 +vt 0.8281 0.1956 +vt 0.8280 0.2034 +vt 0.8202 0.2034 +vt 0.8359 0.1956 +vt 0.8437 0.1956 +vt 0.8437 0.2034 +vt 0.8359 0.2034 +vt 0.8202 0.2424 +vt 0.8280 0.2424 +vt 0.8280 0.2502 +vt 0.8202 0.2502 +vt 0.8202 0.2268 +vt 0.8280 0.2268 +vt 0.8280 0.2346 +vt 0.8202 0.2346 +vt 0.8358 0.2268 +vt 0.8437 0.2268 +vt 0.8437 0.2346 +vt 0.8358 0.2346 +vt 0.8515 0.0862 +vt 0.8593 0.0863 +vt 0.8593 0.0941 +vt 0.8515 0.0941 +vt 0.8515 0.0706 +vt 0.8593 0.0706 +vt 0.8593 0.0784 +vt 0.8515 0.0784 +vt 0.8671 0.0706 +vt 0.8749 0.0706 +vt 0.8749 0.0784 +vt 0.8671 0.0784 +vt 0.8203 0.0862 +vt 0.8281 0.0862 +vt 0.8281 0.0940 +vt 0.8203 0.0940 +vt 0.8203 0.0706 +vt 0.8281 0.0706 +vt 0.8281 0.0784 +vt 0.8203 0.0784 +vt 0.8359 0.0706 +vt 0.8437 0.0706 +vt 0.8437 0.0784 +vt 0.8359 0.0784 +vt 0.8203 0.1175 +vt 0.8281 0.1175 +vt 0.8281 0.1253 +vt 0.8203 0.1253 +vt 0.8203 0.1019 +vt 0.8281 0.1019 +vt 0.8281 0.1097 +vt 0.8203 0.1097 +vt 0.8359 0.1019 +vt 0.8437 0.1019 +vt 0.8437 0.1097 +vt 0.8359 0.1097 +vt 0.9764 0.0863 +vt 0.9843 0.0863 +vt 0.9843 0.0941 +vt 0.9764 0.0941 +vt 0.9765 0.0707 +vt 0.9843 0.0707 +vt 0.9843 0.0785 +vt 0.9764 0.0785 +vt 0.9921 0.0707 +vt 0.9999 0.0707 +vt 0.9999 0.0785 +vt 0.9921 0.0785 +vt 0.9452 0.0863 +vt 0.9530 0.0863 +vt 0.9530 0.0941 +vt 0.9452 0.0941 +vt 0.9452 0.0707 +vt 0.9530 0.0707 +vt 0.9530 0.0785 +vt 0.9452 0.0785 +vt 0.9608 0.0707 +vt 0.9686 0.0707 +vt 0.9686 0.0785 +vt 0.9608 0.0785 +vt 0.9452 0.1175 +vt 0.9530 0.1175 +vt 0.9530 0.1253 +vt 0.9452 0.1253 +vt 0.9452 0.1019 +vt 0.9530 0.1019 +vt 0.9530 0.1097 +vt 0.9452 0.1097 +vt 0.9608 0.1019 +vt 0.9686 0.1019 +vt 0.9686 0.1097 +vt 0.9608 0.1097 +vt 0.6016 0.2111 +vt 0.6094 0.2111 +vt 0.6094 0.2189 +vt 0.6016 0.2189 +vt 0.6016 0.1955 +vt 0.6094 0.1955 +vt 0.6094 0.2033 +vt 0.6016 0.2033 +vt 0.6172 0.1955 +vt 0.6250 0.1955 +vt 0.6250 0.2033 +vt 0.6172 0.2033 +vt 0.5704 0.2111 +vt 0.5782 0.2111 +vt 0.5782 0.2189 +vt 0.5704 0.2189 +vt 0.5704 0.1955 +vt 0.5782 0.1955 +vt 0.5782 0.2033 +vt 0.5704 0.2033 +vt 0.5860 0.1955 +vt 0.5938 0.1955 +vt 0.5938 0.2033 +vt 0.5860 0.2033 +vt 0.5704 0.2423 +vt 0.5782 0.2423 +vt 0.5782 0.2501 +vt 0.5704 0.2501 +vt 0.5704 0.2267 +vt 0.5782 0.2267 +vt 0.5782 0.2345 +vt 0.5704 0.2345 +vt 0.5860 0.2267 +vt 0.5938 0.2267 +vt 0.5938 0.2345 +vt 0.5860 0.2345 +vt 0.6016 0.0862 +vt 0.6094 0.0862 +vt 0.6094 0.0940 +vt 0.6016 0.0940 +vt 0.6016 0.0706 +vt 0.6095 0.0706 +vt 0.6094 0.0784 +vt 0.6016 0.0784 +vt 0.6173 0.0706 +vt 0.6251 0.0706 +vt 0.6251 0.0784 +vt 0.6173 0.0784 +vt 0.5704 0.0862 +vt 0.5782 0.0862 +vt 0.5782 0.0940 +vt 0.5704 0.0940 +vt 0.5704 0.0705 +vt 0.5782 0.0705 +vt 0.5782 0.0784 +vt 0.5704 0.0784 +vt 0.5860 0.0706 +vt 0.5938 0.0706 +vt 0.5938 0.0784 +vt 0.5860 0.0784 +vt 0.5704 0.1174 +vt 0.5782 0.1174 +vt 0.5782 0.1252 +vt 0.5704 0.1252 +vt 0.5704 0.1018 +vt 0.5782 0.1018 +vt 0.5782 0.1096 +vt 0.5704 0.1096 +vt 0.5860 0.1018 +vt 0.5938 0.1018 +vt 0.5938 0.1096 +vt 0.5860 0.1096 +vt 0.7266 0.0862 +vt 0.7344 0.0862 +vt 0.7344 0.0940 +vt 0.7266 0.0940 +vt 0.7266 0.0706 +vt 0.7344 0.0706 +vt 0.7344 0.0784 +vt 0.7266 0.0784 +vt 0.7422 0.0706 +vt 0.7500 0.0706 +vt 0.7500 0.0784 +vt 0.7422 0.0784 +vt 0.6953 0.0862 +vt 0.7031 0.0862 +vt 0.7031 0.0940 +vt 0.6953 0.0940 +vt 0.6953 0.0706 +vt 0.7032 0.0706 +vt 0.7032 0.0784 +vt 0.6953 0.0784 +vt 0.7110 0.0706 +vt 0.7188 0.0706 +vt 0.7188 0.0784 +vt 0.7110 0.0784 +vt 0.6953 0.1174 +vt 0.7031 0.1174 +vt 0.7031 0.1252 +vt 0.6953 0.1252 +vt 0.6953 0.1018 +vt 0.7031 0.1018 +vt 0.7031 0.1096 +vt 0.6953 0.1096 +vt 0.7110 0.1018 +vt 0.7188 0.1018 +vt 0.7188 0.1096 +vt 0.7109 0.1096 +vt 0.6015 0.4610 +vt 0.6093 0.4610 +vt 0.6093 0.4688 +vt 0.6015 0.4688 +vt 0.6015 0.4454 +vt 0.6093 0.4454 +vt 0.6093 0.4532 +vt 0.6015 0.4532 +vt 0.6171 0.4454 +vt 0.6250 0.4454 +vt 0.6250 0.4532 +vt 0.6171 0.4532 +vt 0.5703 0.4610 +vt 0.5781 0.4610 +vt 0.5781 0.4688 +vt 0.5703 0.4688 +vt 0.5703 0.4453 +vt 0.5781 0.4454 +vt 0.5781 0.4532 +vt 0.5703 0.4532 +vt 0.5859 0.4454 +vt 0.5937 0.4454 +vt 0.5937 0.4532 +vt 0.5859 0.4532 +vt 0.5703 0.4922 +vt 0.5781 0.4922 +vt 0.5781 0.5000 +vt 0.5703 0.5000 +vt 0.5703 0.4766 +vt 0.5781 0.4766 +vt 0.5781 0.4844 +vt 0.5703 0.4844 +vt 0.5859 0.4766 +vt 0.5937 0.4766 +vt 0.5937 0.4844 +vt 0.5859 0.4844 +vt 0.6016 0.3360 +vt 0.6094 0.3360 +vt 0.6094 0.3439 +vt 0.6016 0.3439 +vt 0.6016 0.3204 +vt 0.6094 0.3204 +vt 0.6094 0.3282 +vt 0.6016 0.3282 +vt 0.6172 0.3204 +vt 0.6250 0.3204 +vt 0.6250 0.3282 +vt 0.6172 0.3282 +vt 0.5703 0.3360 +vt 0.5781 0.3360 +vt 0.5781 0.3438 +vt 0.5703 0.3438 +vt 0.5703 0.3204 +vt 0.5781 0.3204 +vt 0.5781 0.3282 +vt 0.5703 0.3282 +vt 0.5859 0.3204 +vt 0.5938 0.3204 +vt 0.5938 0.3282 +vt 0.5859 0.3282 +vt 0.5703 0.3673 +vt 0.5781 0.3673 +vt 0.5781 0.3751 +vt 0.5703 0.3751 +vt 0.5703 0.3516 +vt 0.5781 0.3517 +vt 0.5781 0.3595 +vt 0.5703 0.3595 +vt 0.5859 0.3517 +vt 0.5937 0.3517 +vt 0.5937 0.3595 +vt 0.5859 0.3595 +vt 0.7265 0.3361 +vt 0.7343 0.3361 +vt 0.7343 0.3439 +vt 0.7265 0.3439 +vt 0.7265 0.3205 +vt 0.7343 0.3205 +vt 0.7343 0.3283 +vt 0.7265 0.3283 +vt 0.7421 0.3205 +vt 0.7499 0.3205 +vt 0.7499 0.3283 +vt 0.7421 0.3283 +vt 0.6953 0.3361 +vt 0.7031 0.3361 +vt 0.7031 0.3439 +vt 0.6953 0.3439 +vt 0.6953 0.3205 +vt 0.7031 0.3205 +vt 0.7031 0.3283 +vt 0.6953 0.3283 +vt 0.7109 0.3205 +vt 0.7187 0.3205 +vt 0.7187 0.3283 +vt 0.7109 0.3283 +vt 0.6953 0.3673 +vt 0.7031 0.3673 +vt 0.7031 0.3751 +vt 0.6953 0.3751 +vt 0.6953 0.3517 +vt 0.7031 0.3517 +vt 0.7031 0.3595 +vt 0.6953 0.3595 +vt 0.7109 0.3517 +vt 0.7187 0.3517 +vt 0.7187 0.3595 +vt 0.7109 0.3595 +vt 0.8514 0.4611 +vt 0.8592 0.4611 +vt 0.8592 0.4689 +vt 0.8514 0.4689 +vt 0.8514 0.4454 +vt 0.8592 0.4454 +vt 0.8592 0.4532 +vt 0.8514 0.4532 +vt 0.8670 0.4454 +vt 0.8748 0.4454 +vt 0.8748 0.4533 +vt 0.8670 0.4533 +vt 0.8202 0.4610 +vt 0.8280 0.4610 +vt 0.8280 0.4689 +vt 0.8202 0.4689 +vt 0.8202 0.4454 +vt 0.8280 0.4454 +vt 0.8280 0.4532 +vt 0.8202 0.4532 +vt 0.8358 0.4454 +vt 0.8436 0.4454 +vt 0.8436 0.4532 +vt 0.8358 0.4532 +vt 0.8201 0.4923 +vt 0.8280 0.4923 +vt 0.8280 0.5001 +vt 0.8201 0.5001 +vt 0.8202 0.4767 +vt 0.8280 0.4767 +vt 0.8280 0.4845 +vt 0.8202 0.4845 +vt 0.8358 0.4767 +vt 0.8436 0.4767 +vt 0.8436 0.4845 +vt 0.8358 0.4845 +vt 0.8514 0.3361 +vt 0.8592 0.3361 +vt 0.8592 0.3439 +vt 0.8514 0.3439 +vt 0.8514 0.3205 +vt 0.8592 0.3205 +vt 0.8592 0.3283 +vt 0.8514 0.3283 +vt 0.8671 0.3205 +vt 0.8749 0.3205 +vt 0.8749 0.3283 +vt 0.8671 0.3283 +vt 0.8202 0.3361 +vt 0.8280 0.3361 +vt 0.8280 0.3439 +vt 0.8202 0.3439 +vt 0.8202 0.3205 +vt 0.8280 0.3205 +vt 0.8280 0.3283 +vt 0.8202 0.3283 +vt 0.8358 0.3205 +vt 0.8436 0.3205 +vt 0.8436 0.3283 +vt 0.8358 0.3283 +vt 0.8202 0.3673 +vt 0.8280 0.3673 +vt 0.8280 0.3752 +vt 0.8202 0.3752 +vt 0.8202 0.3517 +vt 0.8280 0.3517 +vt 0.8280 0.3595 +vt 0.8202 0.3595 +vt 0.8358 0.3517 +vt 0.8436 0.3517 +vt 0.8436 0.3595 +vt 0.8358 0.3595 +vt 0.9764 0.3362 +vt 0.9842 0.3362 +vt 0.9842 0.3440 +vt 0.9764 0.3440 +vt 0.9764 0.3205 +vt 0.9842 0.3205 +vt 0.9842 0.3284 +vt 0.9764 0.3284 +vt 0.9920 0.3205 +vt 0.9998 0.3206 +vt 0.9998 0.3284 +vt 0.9920 0.3284 +vt 0.9451 0.3362 +vt 0.9529 0.3362 +vt 0.9529 0.3440 +vt 0.9451 0.3440 +vt 0.9451 0.3205 +vt 0.9529 0.3205 +vt 0.9529 0.3283 +vt 0.9451 0.3283 +vt 0.9608 0.3205 +vt 0.9686 0.3205 +vt 0.9686 0.3283 +vt 0.9608 0.3283 +vt 0.9451 0.3674 +vt 0.9529 0.3674 +vt 0.9529 0.3752 +vt 0.9451 0.3752 +vt 0.9451 0.3518 +vt 0.9529 0.3518 +vt 0.9529 0.3596 +vt 0.9451 0.3596 +vt 0.9607 0.3518 +vt 0.9686 0.3518 +vt 0.9686 0.3596 +vt 0.9607 0.3596 +vt 0.3517 0.4609 +vt 0.3595 0.4609 +vt 0.3595 0.4687 +vt 0.3517 0.4687 +vt 0.3517 0.4453 +vt 0.3595 0.4453 +vt 0.3595 0.4531 +vt 0.3517 0.4531 +vt 0.3673 0.4453 +vt 0.3751 0.4453 +vt 0.3751 0.4531 +vt 0.3673 0.4531 +vt 0.3204 0.4609 +vt 0.3282 0.4609 +vt 0.3282 0.4687 +vt 0.3204 0.4687 +vt 0.3204 0.4453 +vt 0.3282 0.4453 +vt 0.3282 0.4531 +vt 0.3204 0.4531 +vt 0.3360 0.4453 +vt 0.3439 0.4453 +vt 0.3438 0.4531 +vt 0.3360 0.4531 +vt 0.3204 0.4921 +vt 0.3282 0.4921 +vt 0.3282 0.4999 +vt 0.3204 0.4999 +vt 0.3204 0.4765 +vt 0.3282 0.4765 +vt 0.3282 0.4843 +vt 0.3204 0.4843 +vt 0.3360 0.4765 +vt 0.3438 0.4765 +vt 0.3438 0.4843 +vt 0.3360 0.4843 +vt 0.3517 0.3360 +vt 0.3595 0.3360 +vt 0.3595 0.3438 +vt 0.3517 0.3438 +vt 0.3517 0.3203 +vt 0.3595 0.3203 +vt 0.3595 0.3282 +vt 0.3517 0.3282 +vt 0.3673 0.3204 +vt 0.3751 0.3204 +vt 0.3751 0.3282 +vt 0.3673 0.3282 +vt 0.3205 0.3360 +vt 0.3283 0.3360 +vt 0.3283 0.3438 +vt 0.3205 0.3438 +vt 0.3205 0.3203 +vt 0.3283 0.3203 +vt 0.3283 0.3281 +vt 0.3205 0.3281 +vt 0.3361 0.3203 +vt 0.3439 0.3203 +vt 0.3439 0.3282 +vt 0.3361 0.3282 +vt 0.3205 0.3672 +vt 0.3283 0.3672 +vt 0.3283 0.3750 +vt 0.3204 0.3750 +vt 0.3205 0.3516 +vt 0.3283 0.3516 +vt 0.3283 0.3594 +vt 0.3205 0.3594 +vt 0.3361 0.3516 +vt 0.3439 0.3516 +vt 0.3439 0.3594 +vt 0.3361 0.3594 +vt 0.4766 0.3360 +vt 0.4844 0.3360 +vt 0.4844 0.3438 +vt 0.4766 0.3438 +vt 0.4766 0.3204 +vt 0.4844 0.3204 +vt 0.4844 0.3282 +vt 0.4766 0.3282 +vt 0.4922 0.3204 +vt 0.5001 0.3204 +vt 0.5001 0.3282 +vt 0.4922 0.3282 +vt 0.4454 0.3360 +vt 0.4532 0.3360 +vt 0.4532 0.3438 +vt 0.4454 0.3438 +vt 0.4454 0.3204 +vt 0.4532 0.3204 +vt 0.4532 0.3282 +vt 0.4454 0.3282 +vt 0.4610 0.3204 +vt 0.4688 0.3204 +vt 0.4688 0.3282 +vt 0.4610 0.3282 +vt 0.4454 0.3672 +vt 0.4532 0.3672 +vt 0.4532 0.3750 +vt 0.4454 0.3750 +vt 0.4454 0.3516 +vt 0.4532 0.3516 +vt 0.4532 0.3594 +vt 0.4454 0.3594 +vt 0.4610 0.3516 +vt 0.4688 0.3516 +vt 0.4688 0.3594 +vt 0.4610 0.3594 +vt 0.3515 0.9606 +vt 0.3593 0.9606 +vt 0.3593 0.9684 +vt 0.3515 0.9684 +vt 0.3515 0.9450 +vt 0.3593 0.9450 +vt 0.3593 0.9528 +vt 0.3515 0.9528 +vt 0.3671 0.9450 +vt 0.3749 0.9450 +vt 0.3749 0.9528 +vt 0.3671 0.9528 +vt 0.3203 0.9606 +vt 0.3281 0.9606 +vt 0.3281 0.9684 +vt 0.3203 0.9684 +vt 0.3203 0.9450 +vt 0.3281 0.9450 +vt 0.3281 0.9528 +vt 0.3203 0.9528 +vt 0.3359 0.9450 +vt 0.3437 0.9450 +vt 0.3437 0.9528 +vt 0.3359 0.9528 +vt 0.3203 0.9919 +vt 0.3281 0.9919 +vt 0.3281 0.9997 +vt 0.3203 0.9997 +vt 0.3203 0.9762 +vt 0.3281 0.9762 +vt 0.3281 0.9841 +vt 0.3203 0.9841 +vt 0.3359 0.9763 +vt 0.3437 0.9763 +vt 0.3437 0.9841 +vt 0.3359 0.9841 +vt 0.3515 0.8357 +vt 0.3593 0.8357 +vt 0.3593 0.8435 +vt 0.3515 0.8435 +vt 0.3515 0.8201 +vt 0.3594 0.8201 +vt 0.3593 0.8279 +vt 0.3515 0.8279 +vt 0.3672 0.8201 +vt 0.3750 0.8201 +vt 0.3750 0.8279 +vt 0.3672 0.8279 +vt 0.3203 0.8357 +vt 0.3281 0.8357 +vt 0.3281 0.8435 +vt 0.3203 0.8435 +vt 0.3203 0.8201 +vt 0.3281 0.8201 +vt 0.3281 0.8279 +vt 0.3203 0.8279 +vt 0.3359 0.8201 +vt 0.3437 0.8201 +vt 0.3437 0.8279 +vt 0.3359 0.8279 +vt 0.3203 0.8669 +vt 0.3281 0.8669 +vt 0.3281 0.8747 +vt 0.3203 0.8747 +vt 0.3203 0.8513 +vt 0.3281 0.8513 +vt 0.3281 0.8591 +vt 0.3203 0.8591 +vt 0.3359 0.8513 +vt 0.3437 0.8513 +vt 0.3437 0.8591 +vt 0.3359 0.8591 +vt 0.4765 0.8357 +vt 0.4843 0.8357 +vt 0.4843 0.8436 +vt 0.4765 0.8435 +vt 0.4765 0.8201 +vt 0.4843 0.8201 +vt 0.4843 0.8279 +vt 0.4765 0.8279 +vt 0.4921 0.8201 +vt 0.4999 0.8201 +vt 0.4999 0.8279 +vt 0.4921 0.8279 +vt 0.4452 0.8357 +vt 0.4530 0.8357 +vt 0.4530 0.8435 +vt 0.4452 0.8435 +vt 0.4452 0.8201 +vt 0.4531 0.8201 +vt 0.4530 0.8279 +vt 0.4452 0.8279 +vt 0.4609 0.8201 +vt 0.4687 0.8201 +vt 0.4687 0.8279 +vt 0.4609 0.8279 +vt 0.4452 0.8670 +vt 0.4530 0.8670 +vt 0.4530 0.8748 +vt 0.4452 0.8748 +vt 0.4452 0.8513 +vt 0.4530 0.8513 +vt 0.4530 0.8592 +vt 0.4452 0.8592 +vt 0.4609 0.8514 +vt 0.4687 0.8514 +vt 0.4687 0.8592 +vt 0.4608 0.8592 +vt 0.8512 0.9608 +vt 0.8590 0.9608 +vt 0.8590 0.9686 +vt 0.8512 0.9686 +vt 0.8512 0.9452 +vt 0.8590 0.9452 +vt 0.8590 0.9530 +vt 0.8512 0.9530 +vt 0.8669 0.9452 +vt 0.8747 0.9452 +vt 0.8747 0.9530 +vt 0.8669 0.9530 +vt 0.8200 0.9608 +vt 0.8278 0.9608 +vt 0.8278 0.9686 +vt 0.8200 0.9686 +vt 0.8200 0.9452 +vt 0.8278 0.9452 +vt 0.8278 0.9530 +vt 0.8200 0.9530 +vt 0.8356 0.9452 +vt 0.8434 0.9452 +vt 0.8434 0.9530 +vt 0.8356 0.9530 +vt 0.8200 0.9920 +vt 0.8278 0.9920 +vt 0.8278 0.9998 +vt 0.8200 0.9998 +vt 0.8200 0.9764 +vt 0.8278 0.9764 +vt 0.8278 0.9842 +vt 0.8200 0.9842 +vt 0.8356 0.9764 +vt 0.8434 0.9764 +vt 0.8434 0.9842 +vt 0.8356 0.9842 +vt 0.8513 0.8359 +vt 0.8591 0.8359 +vt 0.8591 0.8437 +vt 0.8513 0.8437 +vt 0.8513 0.8202 +vt 0.8591 0.8202 +vt 0.8591 0.8280 +vt 0.8513 0.8280 +vt 0.8669 0.8202 +vt 0.8747 0.8202 +vt 0.8747 0.8281 +vt 0.8669 0.8281 +vt 0.8200 0.8358 +vt 0.8278 0.8358 +vt 0.8278 0.8437 +vt 0.8200 0.8437 +vt 0.8200 0.8202 +vt 0.8279 0.8202 +vt 0.8278 0.8280 +vt 0.8200 0.8280 +vt 0.8357 0.8202 +vt 0.8435 0.8202 +vt 0.8435 0.8280 +vt 0.8357 0.8280 +vt 0.8200 0.8671 +vt 0.8278 0.8671 +vt 0.8278 0.8749 +vt 0.8200 0.8749 +vt 0.8200 0.8515 +vt 0.8278 0.8515 +vt 0.8278 0.8593 +vt 0.8200 0.8593 +vt 0.8357 0.8515 +vt 0.8435 0.8515 +vt 0.8435 0.8593 +vt 0.8356 0.8593 +vt 0.9762 0.8359 +vt 0.9840 0.8359 +vt 0.9840 0.8437 +vt 0.9762 0.8437 +vt 0.9762 0.8203 +vt 0.9840 0.8203 +vt 0.9840 0.8281 +vt 0.9762 0.8281 +vt 0.9918 0.8203 +vt 0.9996 0.8203 +vt 0.9996 0.8281 +vt 0.9918 0.8281 +vt 0.9450 0.8359 +vt 0.9528 0.8359 +vt 0.9528 0.8437 +vt 0.9450 0.8437 +vt 0.9450 0.8203 +vt 0.9528 0.8203 +vt 0.9528 0.8281 +vt 0.9450 0.8281 +vt 0.9606 0.8203 +vt 0.9684 0.8203 +vt 0.9684 0.8281 +vt 0.9606 0.8281 +vt 0.9450 0.8671 +vt 0.9528 0.8671 +vt 0.9528 0.8749 +vt 0.9450 0.8749 +vt 0.9450 0.8515 +vt 0.9528 0.8515 +vt 0.9528 0.8593 +vt 0.9450 0.8593 +vt 0.9606 0.8515 +vt 0.9684 0.8515 +vt 0.9684 0.8593 +vt 0.9606 0.8593 +vt 0.9137 0.8359 +vt 0.9215 0.8359 +vt 0.9215 0.8437 +vt 0.9137 0.8437 +vt 0.9137 0.8203 +vt 0.9216 0.8203 +vt 0.9215 0.8281 +vt 0.9137 0.8281 +vt 0.9294 0.8203 +vt 0.9372 0.8203 +vt 0.9372 0.8281 +vt 0.9294 0.8281 +vt 0.8825 0.8359 +vt 0.8903 0.8359 +vt 0.8903 0.8437 +vt 0.8825 0.8437 +vt 0.8825 0.8202 +vt 0.8903 0.8203 +vt 0.8903 0.8281 +vt 0.8825 0.8281 +vt 0.8981 0.8203 +vt 0.9059 0.8203 +vt 0.9059 0.8281 +vt 0.8981 0.8281 +vt 0.8825 0.8671 +vt 0.8903 0.8671 +vt 0.8903 0.8749 +vt 0.8825 0.8749 +vt 0.8825 0.8515 +vt 0.8903 0.8515 +vt 0.8903 0.8593 +vt 0.8825 0.8593 +vt 0.8981 0.8515 +vt 0.9059 0.8515 +vt 0.9059 0.8593 +vt 0.8981 0.8593 +vt 0.9138 0.7734 +vt 0.9216 0.7734 +vt 0.9216 0.7812 +vt 0.9138 0.7812 +vt 0.9138 0.7578 +vt 0.9216 0.7578 +vt 0.9216 0.7656 +vt 0.9138 0.7656 +vt 0.9294 0.7578 +vt 0.9372 0.7578 +vt 0.9372 0.7656 +vt 0.9294 0.7656 +vt 0.8825 0.7734 +vt 0.8903 0.7734 +vt 0.8903 0.7812 +vt 0.8825 0.7812 +vt 0.8825 0.7578 +vt 0.8903 0.7578 +vt 0.8903 0.7656 +vt 0.8825 0.7656 +vt 0.8981 0.7578 +vt 0.9060 0.7578 +vt 0.9060 0.7656 +vt 0.8981 0.7656 +vt 0.8825 0.8046 +vt 0.8903 0.8046 +vt 0.8903 0.8124 +vt 0.8825 0.8124 +vt 0.8825 0.7890 +vt 0.8903 0.7890 +vt 0.8903 0.7968 +vt 0.8825 0.7968 +vt 0.8981 0.7890 +vt 0.9059 0.7890 +vt 0.9059 0.7968 +vt 0.8981 0.7968 +vt 0.9762 0.7734 +vt 0.9840 0.7734 +vt 0.9840 0.7812 +vt 0.9762 0.7812 +vt 0.9762 0.7578 +vt 0.9840 0.7578 +vt 0.9840 0.7656 +vt 0.9762 0.7656 +vt 0.9918 0.7578 +vt 0.9997 0.7578 +vt 0.9997 0.7656 +vt 0.9918 0.7656 +vt 0.9450 0.7734 +vt 0.9528 0.7734 +vt 0.9528 0.7812 +vt 0.9450 0.7812 +vt 0.9450 0.7578 +vt 0.9528 0.7578 +vt 0.9528 0.7656 +vt 0.9450 0.7656 +vt 0.9606 0.7578 +vt 0.9684 0.7578 +vt 0.9684 0.7656 +vt 0.9606 0.7656 +vt 0.9450 0.8047 +vt 0.9528 0.8047 +vt 0.9528 0.8125 +vt 0.9450 0.8125 +vt 0.9450 0.7890 +vt 0.9528 0.7890 +vt 0.9528 0.7968 +vt 0.9450 0.7968 +vt 0.9606 0.7890 +vt 0.9684 0.7890 +vt 0.9684 0.7969 +vt 0.9606 0.7968 +vt 0.7888 0.8358 +vt 0.7966 0.8358 +vt 0.7966 0.8436 +vt 0.7888 0.8436 +vt 0.7888 0.8202 +vt 0.7966 0.8202 +vt 0.7966 0.8280 +vt 0.7888 0.8280 +vt 0.8044 0.8202 +vt 0.8122 0.8202 +vt 0.8122 0.8280 +vt 0.8044 0.8280 +vt 0.7576 0.8358 +vt 0.7654 0.8358 +vt 0.7654 0.8436 +vt 0.7576 0.8436 +vt 0.7576 0.8202 +vt 0.7654 0.8202 +vt 0.7654 0.8280 +vt 0.7576 0.8280 +vt 0.7732 0.8202 +vt 0.7810 0.8202 +vt 0.7810 0.8280 +vt 0.7732 0.8280 +vt 0.7576 0.8671 +vt 0.7654 0.8671 +vt 0.7654 0.8749 +vt 0.7576 0.8749 +vt 0.7576 0.8514 +vt 0.7654 0.8514 +vt 0.7654 0.8593 +vt 0.7576 0.8593 +vt 0.7732 0.8514 +vt 0.7810 0.8514 +vt 0.7810 0.8593 +vt 0.7732 0.8593 +vt 0.7888 0.7734 +vt 0.7966 0.7734 +vt 0.7966 0.7812 +vt 0.7888 0.7812 +vt 0.7888 0.7578 +vt 0.7966 0.7578 +vt 0.7966 0.7656 +vt 0.7888 0.7656 +vt 0.8044 0.7578 +vt 0.8123 0.7578 +vt 0.8123 0.7656 +vt 0.8044 0.7656 +vt 0.7576 0.7734 +vt 0.7654 0.7734 +vt 0.7654 0.7812 +vt 0.7576 0.7812 +vt 0.7576 0.7577 +vt 0.7654 0.7577 +vt 0.7654 0.7656 +vt 0.7576 0.7656 +vt 0.7732 0.7577 +vt 0.7810 0.7577 +vt 0.7810 0.7656 +vt 0.7732 0.7656 +vt 0.7576 0.8046 +vt 0.7654 0.8046 +vt 0.7654 0.8124 +vt 0.7576 0.8124 +vt 0.7576 0.7890 +vt 0.7654 0.7890 +vt 0.7654 0.7968 +vt 0.7576 0.7968 +vt 0.7732 0.7890 +vt 0.7810 0.7890 +vt 0.7810 0.7968 +vt 0.7732 0.7968 +vt 0.8513 0.7734 +vt 0.8591 0.7734 +vt 0.8591 0.7812 +vt 0.8513 0.7812 +vt 0.8513 0.7578 +vt 0.8591 0.7578 +vt 0.8591 0.7656 +vt 0.8513 0.7656 +vt 0.8669 0.7578 +vt 0.8747 0.7578 +vt 0.8747 0.7656 +vt 0.8669 0.7656 +vt 0.8201 0.7734 +vt 0.8279 0.7734 +vt 0.8279 0.7812 +vt 0.8201 0.7812 +vt 0.8201 0.7578 +vt 0.8279 0.7578 +vt 0.8279 0.7656 +vt 0.8201 0.7656 +vt 0.8357 0.7578 +vt 0.8435 0.7578 +vt 0.8435 0.7656 +vt 0.8357 0.7656 +vt 0.8200 0.8046 +vt 0.8279 0.8046 +vt 0.8279 0.8124 +vt 0.8200 0.8124 +vt 0.8201 0.7890 +vt 0.8279 0.7890 +vt 0.8279 0.7968 +vt 0.8201 0.7968 +vt 0.8357 0.7890 +vt 0.8435 0.7890 +vt 0.8435 0.7968 +vt 0.8357 0.7968 +vt 0.7888 0.9608 +vt 0.7966 0.9608 +vt 0.7966 0.9686 +vt 0.7888 0.9686 +vt 0.7888 0.9452 +vt 0.7966 0.9452 +vt 0.7966 0.9530 +vt 0.7888 0.9530 +vt 0.8044 0.9452 +vt 0.8122 0.9452 +vt 0.8122 0.9530 +vt 0.8044 0.9530 +vt 0.7575 0.9608 +vt 0.7653 0.9608 +vt 0.7653 0.9686 +vt 0.7575 0.9686 +vt 0.7575 0.9451 +vt 0.7653 0.9451 +vt 0.7653 0.9530 +vt 0.7575 0.9529 +vt 0.7732 0.9451 +vt 0.7810 0.9451 +vt 0.7810 0.9530 +vt 0.7732 0.9530 +vt 0.7575 0.9920 +vt 0.7653 0.9920 +vt 0.7653 0.9998 +vt 0.7575 0.9998 +vt 0.7575 0.9764 +vt 0.7653 0.9764 +vt 0.7653 0.9842 +vt 0.7575 0.9842 +vt 0.7731 0.9764 +vt 0.7810 0.9764 +vt 0.7810 0.9842 +vt 0.7731 0.9842 +vt 0.7888 0.8983 +vt 0.7966 0.8983 +vt 0.7966 0.9061 +vt 0.7888 0.9061 +vt 0.7888 0.8827 +vt 0.7966 0.8827 +vt 0.7966 0.8905 +vt 0.7888 0.8905 +vt 0.8044 0.8827 +vt 0.8122 0.8827 +vt 0.8122 0.8905 +vt 0.8044 0.8905 +vt 0.7576 0.8983 +vt 0.7654 0.8983 +vt 0.7654 0.9061 +vt 0.7576 0.9061 +vt 0.7576 0.8827 +vt 0.7654 0.8827 +vt 0.7654 0.8905 +vt 0.7576 0.8905 +vt 0.7732 0.8827 +vt 0.7810 0.8827 +vt 0.7810 0.8905 +vt 0.7732 0.8905 +vt 0.7575 0.9295 +vt 0.7654 0.9295 +vt 0.7654 0.9373 +vt 0.7575 0.9373 +vt 0.7575 0.9139 +vt 0.7654 0.9139 +vt 0.7654 0.9217 +vt 0.7575 0.9217 +vt 0.7732 0.9139 +vt 0.7810 0.9139 +vt 0.7810 0.9217 +vt 0.7732 0.9217 +vt 0.8513 0.8983 +vt 0.8591 0.8983 +vt 0.8591 0.9061 +vt 0.8513 0.9061 +vt 0.8513 0.8827 +vt 0.8591 0.8827 +vt 0.8591 0.8905 +vt 0.8513 0.8905 +vt 0.8669 0.8827 +vt 0.8747 0.8827 +vt 0.8747 0.8905 +vt 0.8669 0.8905 +vt 0.8200 0.8983 +vt 0.8278 0.8983 +vt 0.8278 0.9061 +vt 0.8200 0.9061 +vt 0.8200 0.8827 +vt 0.8278 0.8827 +vt 0.8278 0.8905 +vt 0.8200 0.8905 +vt 0.8356 0.8827 +vt 0.8434 0.8827 +vt 0.8434 0.8905 +vt 0.8356 0.8905 +vt 0.8200 0.9295 +vt 0.8278 0.9295 +vt 0.8278 0.9374 +vt 0.8200 0.9374 +vt 0.8200 0.9139 +vt 0.8278 0.9139 +vt 0.8278 0.9217 +vt 0.8200 0.9217 +vt 0.8356 0.9139 +vt 0.8434 0.9139 +vt 0.8434 0.9217 +vt 0.8356 0.9217 +vt 0.4140 0.8357 +vt 0.4218 0.8357 +vt 0.4218 0.8435 +vt 0.4140 0.8435 +vt 0.4140 0.8201 +vt 0.4218 0.8201 +vt 0.4218 0.8279 +vt 0.4140 0.8279 +vt 0.4296 0.8201 +vt 0.4374 0.8201 +vt 0.4374 0.8279 +vt 0.4296 0.8279 +vt 0.3828 0.8357 +vt 0.3906 0.8357 +vt 0.3906 0.8435 +vt 0.3828 0.8435 +vt 0.3828 0.8201 +vt 0.3906 0.8201 +vt 0.3906 0.8279 +vt 0.3828 0.8279 +vt 0.3984 0.8201 +vt 0.4062 0.8201 +vt 0.4062 0.8279 +vt 0.3984 0.8279 +vt 0.3828 0.8669 +vt 0.3906 0.8669 +vt 0.3906 0.8748 +vt 0.3828 0.8748 +vt 0.3828 0.8513 +vt 0.3906 0.8513 +vt 0.3906 0.8591 +vt 0.3828 0.8591 +vt 0.3984 0.8513 +vt 0.4062 0.8513 +vt 0.4062 0.8591 +vt 0.3984 0.8591 +vt 0.4140 0.7733 +vt 0.4218 0.7733 +vt 0.4218 0.7811 +vt 0.4140 0.7811 +vt 0.4140 0.7576 +vt 0.4218 0.7576 +vt 0.4218 0.7654 +vt 0.4140 0.7654 +vt 0.4296 0.7576 +vt 0.4375 0.7576 +vt 0.4375 0.7655 +vt 0.4296 0.7655 +vt 0.3828 0.7732 +vt 0.3906 0.7732 +vt 0.3906 0.7811 +vt 0.3828 0.7811 +vt 0.3828 0.7576 +vt 0.3906 0.7576 +vt 0.3906 0.7654 +vt 0.3828 0.7654 +vt 0.3984 0.7576 +vt 0.4062 0.7576 +vt 0.4062 0.7654 +vt 0.3984 0.7654 +vt 0.3828 0.8045 +vt 0.3906 0.8045 +vt 0.3906 0.8123 +vt 0.3828 0.8123 +vt 0.3828 0.7889 +vt 0.3906 0.7889 +vt 0.3906 0.7967 +vt 0.3828 0.7967 +vt 0.3984 0.7889 +vt 0.4062 0.7889 +vt 0.4062 0.7967 +vt 0.3984 0.7967 +vt 0.4765 0.7733 +vt 0.4843 0.7733 +vt 0.4843 0.7811 +vt 0.4765 0.7811 +vt 0.4765 0.7577 +vt 0.4843 0.7577 +vt 0.4843 0.7655 +vt 0.4765 0.7655 +vt 0.4921 0.7577 +vt 0.4999 0.7577 +vt 0.4999 0.7655 +vt 0.4921 0.7655 +vt 0.4453 0.7733 +vt 0.4531 0.7733 +vt 0.4531 0.7811 +vt 0.4453 0.7811 +vt 0.4453 0.7576 +vt 0.4531 0.7576 +vt 0.4531 0.7655 +vt 0.4453 0.7655 +vt 0.4609 0.7577 +vt 0.4687 0.7577 +vt 0.4687 0.7655 +vt 0.4609 0.7655 +vt 0.4452 0.8045 +vt 0.4531 0.8045 +vt 0.4531 0.8123 +vt 0.4452 0.8123 +vt 0.4453 0.7889 +vt 0.4531 0.7889 +vt 0.4531 0.7967 +vt 0.4453 0.7967 +vt 0.4609 0.7889 +vt 0.4687 0.7889 +vt 0.4687 0.7967 +vt 0.4609 0.7967 +vt 0.2891 0.8357 +vt 0.2969 0.8357 +vt 0.2969 0.8435 +vt 0.2891 0.8435 +vt 0.2891 0.8201 +vt 0.2969 0.8201 +vt 0.2969 0.8279 +vt 0.2891 0.8279 +vt 0.3047 0.8201 +vt 0.3125 0.8201 +vt 0.3125 0.8279 +vt 0.3047 0.8279 +vt 0.2578 0.8357 +vt 0.2656 0.8357 +vt 0.2656 0.8435 +vt 0.2578 0.8435 +vt 0.2578 0.8201 +vt 0.2656 0.8201 +vt 0.2656 0.8279 +vt 0.2578 0.8279 +vt 0.2735 0.8201 +vt 0.2813 0.8201 +vt 0.2813 0.8279 +vt 0.2735 0.8279 +vt 0.2578 0.8669 +vt 0.2656 0.8669 +vt 0.2656 0.8747 +vt 0.2578 0.8747 +vt 0.2578 0.8513 +vt 0.2656 0.8513 +vt 0.2656 0.8591 +vt 0.2578 0.8591 +vt 0.2734 0.8513 +vt 0.2813 0.8513 +vt 0.2813 0.8591 +vt 0.2734 0.8591 +vt 0.2891 0.7732 +vt 0.2969 0.7732 +vt 0.2969 0.7810 +vt 0.2891 0.7810 +vt 0.2891 0.7576 +vt 0.2969 0.7576 +vt 0.2969 0.7654 +vt 0.2891 0.7654 +vt 0.3047 0.7576 +vt 0.3125 0.7576 +vt 0.3125 0.7654 +vt 0.3047 0.7654 +vt 0.2579 0.7732 +vt 0.2657 0.7732 +vt 0.2657 0.7810 +vt 0.2579 0.7810 +vt 0.2579 0.7576 +vt 0.2657 0.7576 +vt 0.2657 0.7654 +vt 0.2579 0.7654 +vt 0.2735 0.7576 +vt 0.2813 0.7576 +vt 0.2813 0.7654 +vt 0.2735 0.7654 +vt 0.2578 0.8044 +vt 0.2657 0.8044 +vt 0.2657 0.8123 +vt 0.2578 0.8122 +vt 0.2578 0.7888 +vt 0.2657 0.7888 +vt 0.2657 0.7966 +vt 0.2578 0.7966 +vt 0.2735 0.7888 +vt 0.2813 0.7888 +vt 0.2813 0.7966 +vt 0.2735 0.7966 +vt 0.3516 0.7732 +vt 0.3594 0.7732 +vt 0.3594 0.7810 +vt 0.3516 0.7810 +vt 0.3516 0.7576 +vt 0.3594 0.7576 +vt 0.3594 0.7654 +vt 0.3516 0.7654 +vt 0.3672 0.7576 +vt 0.3750 0.7576 +vt 0.3750 0.7654 +vt 0.3672 0.7654 +vt 0.3203 0.7732 +vt 0.3281 0.7732 +vt 0.3281 0.7810 +vt 0.3203 0.7810 +vt 0.3203 0.7576 +vt 0.3281 0.7576 +vt 0.3281 0.7654 +vt 0.3203 0.7654 +vt 0.3359 0.7576 +vt 0.3438 0.7576 +vt 0.3438 0.7654 +vt 0.3359 0.7654 +vt 0.3203 0.8045 +vt 0.3281 0.8045 +vt 0.3281 0.8123 +vt 0.3203 0.8123 +vt 0.3203 0.7888 +vt 0.3281 0.7888 +vt 0.3281 0.7967 +vt 0.3203 0.7967 +vt 0.3359 0.7888 +vt 0.3437 0.7888 +vt 0.3437 0.7967 +vt 0.3359 0.7967 +vt 0.2890 0.9606 +vt 0.2968 0.9606 +vt 0.2968 0.9684 +vt 0.2890 0.9684 +vt 0.2890 0.9450 +vt 0.2968 0.9450 +vt 0.2968 0.9528 +vt 0.2890 0.9528 +vt 0.3047 0.9450 +vt 0.3125 0.9450 +vt 0.3125 0.9528 +vt 0.3047 0.9528 +vt 0.2578 0.9606 +vt 0.2656 0.9606 +vt 0.2656 0.9684 +vt 0.2578 0.9684 +vt 0.2578 0.9450 +vt 0.2656 0.9450 +vt 0.2656 0.9528 +vt 0.2578 0.9528 +vt 0.2734 0.9450 +vt 0.2812 0.9450 +vt 0.2812 0.9528 +vt 0.2734 0.9528 +vt 0.2578 0.9918 +vt 0.2656 0.9918 +vt 0.2656 0.9997 +vt 0.2578 0.9997 +vt 0.2578 0.9762 +vt 0.2656 0.9762 +vt 0.2656 0.9840 +vt 0.2578 0.9840 +vt 0.2734 0.9762 +vt 0.2812 0.9762 +vt 0.2812 0.9840 +vt 0.2734 0.9840 +vt 0.2891 0.8982 +vt 0.2969 0.8982 +vt 0.2969 0.9060 +vt 0.2890 0.9060 +vt 0.2891 0.8825 +vt 0.2969 0.8825 +vt 0.2969 0.8903 +vt 0.2891 0.8903 +vt 0.3047 0.8825 +vt 0.3125 0.8825 +vt 0.3125 0.8903 +vt 0.3047 0.8903 +vt 0.2578 0.8981 +vt 0.2656 0.8981 +vt 0.2656 0.9060 +vt 0.2578 0.9059 +vt 0.2578 0.8825 +vt 0.2656 0.8825 +vt 0.2656 0.8903 +vt 0.2578 0.8903 +vt 0.2734 0.8825 +vt 0.2812 0.8825 +vt 0.2812 0.8903 +vt 0.2734 0.8903 +vt 0.2578 0.9294 +vt 0.2656 0.9294 +vt 0.2656 0.9372 +vt 0.2578 0.9372 +vt 0.2578 0.9138 +vt 0.2656 0.9138 +vt 0.2656 0.9216 +vt 0.2578 0.9216 +vt 0.2734 0.9138 +vt 0.2812 0.9138 +vt 0.2812 0.9216 +vt 0.2734 0.9216 +vt 0.3515 0.8982 +vt 0.3593 0.8982 +vt 0.3593 0.9060 +vt 0.3515 0.9060 +vt 0.3515 0.8826 +vt 0.3593 0.8826 +vt 0.3593 0.8904 +vt 0.3515 0.8904 +vt 0.3671 0.8826 +vt 0.3749 0.8826 +vt 0.3749 0.8904 +vt 0.3671 0.8904 +vt 0.3203 0.8982 +vt 0.3281 0.8982 +vt 0.3281 0.9060 +vt 0.3203 0.9060 +vt 0.3203 0.8825 +vt 0.3281 0.8825 +vt 0.3281 0.8904 +vt 0.3203 0.8904 +vt 0.3359 0.8825 +vt 0.3437 0.8826 +vt 0.3437 0.8904 +vt 0.3359 0.8904 +vt 0.3203 0.9294 +vt 0.3281 0.9294 +vt 0.3281 0.9372 +vt 0.3203 0.9372 +vt 0.3203 0.9138 +vt 0.3281 0.9138 +vt 0.3281 0.9216 +vt 0.3203 0.9216 +vt 0.3359 0.9138 +vt 0.3437 0.9138 +vt 0.3437 0.9216 +vt 0.3359 0.9216 +vt 0.4142 0.3360 +vt 0.4220 0.3360 +vt 0.4220 0.3438 +vt 0.4142 0.3438 +vt 0.4142 0.3204 +vt 0.4220 0.3204 +vt 0.4220 0.3282 +vt 0.4142 0.3282 +vt 0.4298 0.3204 +vt 0.4376 0.3204 +vt 0.4376 0.3282 +vt 0.4298 0.3282 +vt 0.3829 0.3360 +vt 0.3907 0.3360 +vt 0.3907 0.3438 +vt 0.3829 0.3438 +vt 0.3829 0.3204 +vt 0.3907 0.3204 +vt 0.3907 0.3282 +vt 0.3829 0.3282 +vt 0.3985 0.3204 +vt 0.4064 0.3204 +vt 0.4064 0.3282 +vt 0.3985 0.3282 +vt 0.3829 0.3672 +vt 0.3907 0.3672 +vt 0.3907 0.3750 +vt 0.3829 0.3750 +vt 0.3829 0.3516 +vt 0.3907 0.3516 +vt 0.3907 0.3594 +vt 0.3829 0.3594 +vt 0.3985 0.3516 +vt 0.4063 0.3516 +vt 0.4063 0.3594 +vt 0.3985 0.3594 +vt 0.4142 0.2735 +vt 0.4220 0.2735 +vt 0.4220 0.2813 +vt 0.4142 0.2813 +vt 0.4142 0.2579 +vt 0.4220 0.2579 +vt 0.4220 0.2657 +vt 0.4142 0.2657 +vt 0.4298 0.2579 +vt 0.4376 0.2579 +vt 0.4376 0.2657 +vt 0.4298 0.2657 +vt 0.3829 0.2735 +vt 0.3908 0.2735 +vt 0.3908 0.2813 +vt 0.3829 0.2813 +vt 0.3830 0.2579 +vt 0.3908 0.2579 +vt 0.3908 0.2657 +vt 0.3829 0.2657 +vt 0.3986 0.2579 +vt 0.4064 0.2579 +vt 0.4064 0.2657 +vt 0.3986 0.2657 +vt 0.3829 0.3047 +vt 0.3907 0.3047 +vt 0.3907 0.3126 +vt 0.3829 0.3125 +vt 0.3829 0.2891 +vt 0.3908 0.2891 +vt 0.3907 0.2969 +vt 0.3829 0.2969 +vt 0.3986 0.2891 +vt 0.4064 0.2891 +vt 0.4064 0.2969 +vt 0.3986 0.2969 +vt 0.4766 0.2735 +vt 0.4845 0.2735 +vt 0.4845 0.2813 +vt 0.4766 0.2813 +vt 0.4767 0.2579 +vt 0.4845 0.2579 +vt 0.4845 0.2657 +vt 0.4766 0.2657 +vt 0.4923 0.2579 +vt 0.5001 0.2579 +vt 0.5001 0.2657 +vt 0.4923 0.2657 +vt 0.4454 0.2735 +vt 0.4532 0.2735 +vt 0.4532 0.2813 +vt 0.4454 0.2813 +vt 0.4454 0.2579 +vt 0.4532 0.2579 +vt 0.4532 0.2657 +vt 0.4454 0.2657 +vt 0.4610 0.2579 +vt 0.4688 0.2579 +vt 0.4688 0.2657 +vt 0.4610 0.2657 +vt 0.4454 0.3048 +vt 0.4532 0.3048 +vt 0.4532 0.3126 +vt 0.4454 0.3126 +vt 0.4454 0.2891 +vt 0.4532 0.2891 +vt 0.4532 0.2970 +vt 0.4454 0.2970 +vt 0.4610 0.2891 +vt 0.4688 0.2892 +vt 0.4688 0.2970 +vt 0.4610 0.2970 +vt 0.2892 0.3359 +vt 0.2970 0.3359 +vt 0.2970 0.3438 +vt 0.2892 0.3438 +vt 0.2892 0.3203 +vt 0.2970 0.3203 +vt 0.2970 0.3281 +vt 0.2892 0.3281 +vt 0.3048 0.3203 +vt 0.3127 0.3203 +vt 0.3127 0.3281 +vt 0.3048 0.3281 +vt 0.2580 0.3359 +vt 0.2658 0.3359 +vt 0.2658 0.3437 +vt 0.2580 0.3437 +vt 0.2580 0.3203 +vt 0.2658 0.3203 +vt 0.2658 0.3281 +vt 0.2580 0.3281 +vt 0.2736 0.3203 +vt 0.2814 0.3203 +vt 0.2814 0.3281 +vt 0.2736 0.3281 +vt 0.2580 0.3672 +vt 0.2658 0.3672 +vt 0.2658 0.3750 +vt 0.2580 0.3750 +vt 0.2580 0.3516 +vt 0.2658 0.3516 +vt 0.2658 0.3594 +vt 0.2580 0.3594 +vt 0.2736 0.3516 +vt 0.2814 0.3516 +vt 0.2814 0.3594 +vt 0.2736 0.3594 +vt 0.2892 0.2735 +vt 0.2971 0.2735 +vt 0.2971 0.2813 +vt 0.2892 0.2813 +vt 0.2893 0.2579 +vt 0.2971 0.2579 +vt 0.2971 0.2657 +vt 0.2892 0.2657 +vt 0.3049 0.2579 +vt 0.3127 0.2579 +vt 0.3127 0.2657 +vt 0.3049 0.2657 +vt 0.2580 0.2735 +vt 0.2658 0.2735 +vt 0.2658 0.2813 +vt 0.2580 0.2813 +vt 0.2580 0.2579 +vt 0.2658 0.2579 +vt 0.2658 0.2657 +vt 0.2580 0.2657 +vt 0.2736 0.2579 +vt 0.2814 0.2579 +vt 0.2814 0.2657 +vt 0.2736 0.2657 +vt 0.2580 0.3047 +vt 0.2658 0.3047 +vt 0.2658 0.3125 +vt 0.2580 0.3125 +vt 0.2580 0.2891 +vt 0.2658 0.2891 +vt 0.2658 0.2969 +vt 0.2580 0.2969 +vt 0.2736 0.2891 +vt 0.2814 0.2891 +vt 0.2814 0.2969 +vt 0.2736 0.2969 +vt 0.3517 0.2735 +vt 0.3595 0.2735 +vt 0.3595 0.2813 +vt 0.3517 0.2813 +vt 0.3517 0.2579 +vt 0.3595 0.2579 +vt 0.3595 0.2657 +vt 0.3517 0.2657 +vt 0.3673 0.2579 +vt 0.3751 0.2579 +vt 0.3751 0.2657 +vt 0.3673 0.2657 +vt 0.3205 0.2735 +vt 0.3283 0.2735 +vt 0.3283 0.2813 +vt 0.3205 0.2813 +vt 0.3205 0.2579 +vt 0.3283 0.2579 +vt 0.3283 0.2657 +vt 0.3205 0.2657 +vt 0.3361 0.2579 +vt 0.3439 0.2579 +vt 0.3439 0.2657 +vt 0.3361 0.2657 +vt 0.3205 0.3047 +vt 0.3283 0.3047 +vt 0.3283 0.3125 +vt 0.3205 0.3125 +vt 0.3205 0.2891 +vt 0.3283 0.2891 +vt 0.3283 0.2969 +vt 0.3205 0.2969 +vt 0.3361 0.2891 +vt 0.3439 0.2891 +vt 0.3439 0.2969 +vt 0.3361 0.2969 +vt 0.2892 0.4609 +vt 0.2970 0.4609 +vt 0.2970 0.4687 +vt 0.2892 0.4687 +vt 0.2892 0.4453 +vt 0.2970 0.4453 +vt 0.2970 0.4531 +vt 0.2892 0.4531 +vt 0.3048 0.4453 +vt 0.3126 0.4453 +vt 0.3126 0.4531 +vt 0.3048 0.4531 +vt 0.2580 0.4609 +vt 0.2658 0.4609 +vt 0.2658 0.4687 +vt 0.2580 0.4687 +vt 0.2580 0.4453 +vt 0.2658 0.4453 +vt 0.2658 0.4531 +vt 0.2580 0.4531 +vt 0.2736 0.4453 +vt 0.2814 0.4453 +vt 0.2814 0.4531 +vt 0.2736 0.4531 +vt 0.2579 0.4921 +vt 0.2658 0.4921 +vt 0.2657 0.4999 +vt 0.2579 0.4999 +vt 0.2579 0.4765 +vt 0.2658 0.4765 +vt 0.2658 0.4843 +vt 0.2579 0.4843 +vt 0.2736 0.4765 +vt 0.2814 0.4765 +vt 0.2814 0.4843 +vt 0.2736 0.4843 +vt 0.2892 0.3984 +vt 0.2970 0.3984 +vt 0.2970 0.4062 +vt 0.2892 0.4062 +vt 0.2892 0.3828 +vt 0.2970 0.3828 +vt 0.2970 0.3906 +vt 0.2892 0.3906 +vt 0.3048 0.3828 +vt 0.3126 0.3828 +vt 0.3126 0.3906 +vt 0.3048 0.3906 +vt 0.2580 0.3984 +vt 0.2658 0.3984 +vt 0.2658 0.4062 +vt 0.2580 0.4062 +vt 0.2580 0.3828 +vt 0.2658 0.3828 +vt 0.2658 0.3906 +vt 0.2580 0.3906 +vt 0.2736 0.3828 +vt 0.2814 0.3828 +vt 0.2814 0.3906 +vt 0.2736 0.3906 +vt 0.2580 0.4296 +vt 0.2658 0.4296 +vt 0.2658 0.4374 +vt 0.2580 0.4374 +vt 0.2580 0.4140 +vt 0.2658 0.4140 +vt 0.2658 0.4218 +vt 0.2580 0.4218 +vt 0.2736 0.4140 +vt 0.2814 0.4140 +vt 0.2814 0.4218 +vt 0.2736 0.4218 +vt 0.3517 0.3984 +vt 0.3595 0.3984 +vt 0.3595 0.4062 +vt 0.3517 0.4062 +vt 0.3517 0.3828 +vt 0.3595 0.3828 +vt 0.3595 0.3906 +vt 0.3517 0.3906 +vt 0.3673 0.3828 +vt 0.3751 0.3828 +vt 0.3751 0.3906 +vt 0.3673 0.3906 +vt 0.3204 0.3984 +vt 0.3282 0.3984 +vt 0.3282 0.4062 +vt 0.3204 0.4062 +vt 0.3204 0.3828 +vt 0.3283 0.3828 +vt 0.3283 0.3906 +vt 0.3204 0.3906 +vt 0.3361 0.3828 +vt 0.3439 0.3828 +vt 0.3439 0.3906 +vt 0.3361 0.3906 +vt 0.3204 0.4297 +vt 0.3282 0.4297 +vt 0.3282 0.4375 +vt 0.3204 0.4375 +vt 0.3204 0.4140 +vt 0.3282 0.4140 +vt 0.3282 0.4218 +vt 0.3204 0.4218 +vt 0.3361 0.4140 +vt 0.3439 0.4140 +vt 0.3439 0.4219 +vt 0.3361 0.4219 +vt 0.9139 0.3361 +vt 0.9217 0.3361 +vt 0.9217 0.3440 +vt 0.9139 0.3439 +vt 0.9139 0.3205 +vt 0.9217 0.3205 +vt 0.9217 0.3283 +vt 0.9139 0.3283 +vt 0.9295 0.3205 +vt 0.9373 0.3205 +vt 0.9373 0.3283 +vt 0.9295 0.3283 +vt 0.8827 0.3361 +vt 0.8905 0.3361 +vt 0.8905 0.3439 +vt 0.8827 0.3439 +vt 0.8827 0.3205 +vt 0.8905 0.3205 +vt 0.8905 0.3283 +vt 0.8827 0.3283 +vt 0.8983 0.3205 +vt 0.9061 0.3205 +vt 0.9061 0.3283 +vt 0.8983 0.3283 +vt 0.8827 0.3674 +vt 0.8905 0.3674 +vt 0.8905 0.3752 +vt 0.8827 0.3752 +vt 0.8827 0.3517 +vt 0.8905 0.3517 +vt 0.8905 0.3596 +vt 0.8827 0.3596 +vt 0.8983 0.3518 +vt 0.9061 0.3518 +vt 0.9061 0.3596 +vt 0.8983 0.3596 +vt 0.9139 0.2737 +vt 0.9217 0.2737 +vt 0.9217 0.2815 +vt 0.9139 0.2815 +vt 0.9139 0.2581 +vt 0.9217 0.2581 +vt 0.9217 0.2659 +vt 0.9139 0.2659 +vt 0.9295 0.2581 +vt 0.9373 0.2581 +vt 0.9373 0.2659 +vt 0.9295 0.2659 +vt 0.8827 0.2737 +vt 0.8905 0.2737 +vt 0.8905 0.2815 +vt 0.8827 0.2815 +vt 0.8827 0.2580 +vt 0.8905 0.2580 +vt 0.8905 0.2659 +vt 0.8827 0.2659 +vt 0.8983 0.2581 +vt 0.9061 0.2581 +vt 0.9061 0.2659 +vt 0.8983 0.2659 +vt 0.8827 0.3049 +vt 0.8905 0.3049 +vt 0.8905 0.3127 +vt 0.8827 0.3127 +vt 0.8827 0.2893 +vt 0.8905 0.2893 +vt 0.8905 0.2971 +vt 0.8827 0.2971 +vt 0.8983 0.2893 +vt 0.9061 0.2893 +vt 0.9061 0.2971 +vt 0.8983 0.2971 +vt 0.9764 0.2737 +vt 0.9842 0.2737 +vt 0.9842 0.2815 +vt 0.9764 0.2815 +vt 0.9764 0.2581 +vt 0.9842 0.2581 +vt 0.9842 0.2659 +vt 0.9764 0.2659 +vt 0.9920 0.2581 +vt 0.9998 0.2581 +vt 0.9998 0.2659 +vt 0.9920 0.2659 +vt 0.9452 0.2737 +vt 0.9530 0.2737 +vt 0.9530 0.2815 +vt 0.9452 0.2815 +vt 0.9452 0.2581 +vt 0.9530 0.2581 +vt 0.9530 0.2659 +vt 0.9452 0.2659 +vt 0.9608 0.2581 +vt 0.9686 0.2581 +vt 0.9686 0.2659 +vt 0.9608 0.2659 +vt 0.9451 0.3049 +vt 0.9530 0.3049 +vt 0.9529 0.3127 +vt 0.9451 0.3127 +vt 0.9451 0.2893 +vt 0.9530 0.2893 +vt 0.9530 0.2971 +vt 0.9451 0.2971 +vt 0.9608 0.2893 +vt 0.9686 0.2893 +vt 0.9686 0.2971 +vt 0.9608 0.2971 +vt 0.7890 0.3361 +vt 0.7968 0.3361 +vt 0.7968 0.3439 +vt 0.7890 0.3439 +vt 0.7890 0.3205 +vt 0.7968 0.3205 +vt 0.7968 0.3283 +vt 0.7890 0.3283 +vt 0.8046 0.3205 +vt 0.8124 0.3205 +vt 0.8124 0.3283 +vt 0.8046 0.3283 +vt 0.7577 0.3361 +vt 0.7655 0.3361 +vt 0.7655 0.3439 +vt 0.7577 0.3439 +vt 0.7577 0.3205 +vt 0.7655 0.3205 +vt 0.7655 0.3283 +vt 0.7577 0.3283 +vt 0.7734 0.3205 +vt 0.7812 0.3205 +vt 0.7812 0.3283 +vt 0.7733 0.3283 +vt 0.7577 0.3673 +vt 0.7655 0.3673 +vt 0.7655 0.3751 +vt 0.7577 0.3751 +vt 0.7577 0.3517 +vt 0.7655 0.3517 +vt 0.7655 0.3595 +vt 0.7577 0.3595 +vt 0.7733 0.3517 +vt 0.7812 0.3517 +vt 0.7811 0.3595 +vt 0.7733 0.3595 +vt 0.7890 0.2736 +vt 0.7968 0.2736 +vt 0.7968 0.2814 +vt 0.7890 0.2814 +vt 0.7890 0.2580 +vt 0.7968 0.2580 +vt 0.7968 0.2658 +vt 0.7890 0.2658 +vt 0.8046 0.2580 +vt 0.8124 0.2580 +vt 0.8124 0.2658 +vt 0.8046 0.2658 +vt 0.7577 0.2736 +vt 0.7656 0.2736 +vt 0.7656 0.2814 +vt 0.7577 0.2814 +vt 0.7578 0.2580 +vt 0.7656 0.2580 +vt 0.7656 0.2658 +vt 0.7578 0.2658 +vt 0.7734 0.2580 +vt 0.7812 0.2580 +vt 0.7812 0.2658 +vt 0.7734 0.2658 +vt 0.7577 0.3049 +vt 0.7655 0.3049 +vt 0.7655 0.3127 +vt 0.7577 0.3127 +vt 0.7577 0.2892 +vt 0.7656 0.2892 +vt 0.7656 0.2971 +vt 0.7577 0.2970 +vt 0.7734 0.2892 +vt 0.7812 0.2892 +vt 0.7812 0.2971 +vt 0.7734 0.2971 +vt 0.8515 0.2737 +vt 0.8593 0.2737 +vt 0.8593 0.2815 +vt 0.8514 0.2815 +vt 0.8515 0.2580 +vt 0.8593 0.2580 +vt 0.8593 0.2658 +vt 0.8515 0.2658 +vt 0.8671 0.2580 +vt 0.8749 0.2580 +vt 0.8749 0.2659 +vt 0.8671 0.2658 +vt 0.8202 0.2736 +vt 0.8280 0.2736 +vt 0.8280 0.2815 +vt 0.8202 0.2815 +vt 0.8202 0.2580 +vt 0.8280 0.2580 +vt 0.8280 0.2658 +vt 0.8202 0.2658 +vt 0.8358 0.2580 +vt 0.8436 0.2580 +vt 0.8436 0.2658 +vt 0.8358 0.2658 +vt 0.8202 0.3049 +vt 0.8280 0.3049 +vt 0.8280 0.3127 +vt 0.8202 0.3127 +vt 0.8202 0.2893 +vt 0.8280 0.2893 +vt 0.8280 0.2971 +vt 0.8202 0.2971 +vt 0.8358 0.2893 +vt 0.8436 0.2893 +vt 0.8436 0.2971 +vt 0.8358 0.2971 +vt 0.7889 0.4610 +vt 0.7967 0.4610 +vt 0.7967 0.4688 +vt 0.7889 0.4688 +vt 0.7889 0.4454 +vt 0.7967 0.4454 +vt 0.7967 0.4532 +vt 0.7889 0.4532 +vt 0.8045 0.4454 +vt 0.8124 0.4454 +vt 0.8124 0.4532 +vt 0.8045 0.4532 +vt 0.7577 0.4610 +vt 0.7655 0.4610 +vt 0.7655 0.4688 +vt 0.7577 0.4688 +vt 0.7577 0.4454 +vt 0.7655 0.4454 +vt 0.7655 0.4532 +vt 0.7577 0.4532 +vt 0.7733 0.4454 +vt 0.7811 0.4454 +vt 0.7811 0.4532 +vt 0.7733 0.4532 +vt 0.7577 0.4923 +vt 0.7655 0.4923 +vt 0.7655 0.5001 +vt 0.7577 0.5001 +vt 0.7577 0.4766 +vt 0.7655 0.4766 +vt 0.7655 0.4845 +vt 0.7577 0.4845 +vt 0.7733 0.4766 +vt 0.7811 0.4766 +vt 0.7811 0.4845 +vt 0.7733 0.4845 +vt 0.7889 0.3986 +vt 0.7968 0.3986 +vt 0.7968 0.4064 +vt 0.7889 0.4064 +vt 0.7889 0.3830 +vt 0.7968 0.3830 +vt 0.7968 0.3908 +vt 0.7889 0.3908 +vt 0.8046 0.3830 +vt 0.8124 0.3830 +vt 0.8124 0.3908 +vt 0.8046 0.3908 +vt 0.7577 0.3986 +vt 0.7655 0.3986 +vt 0.7655 0.4064 +vt 0.7577 0.4064 +vt 0.7577 0.3829 +vt 0.7655 0.3829 +vt 0.7655 0.3908 +vt 0.7577 0.3907 +vt 0.7733 0.3829 +vt 0.7811 0.3829 +vt 0.7811 0.3908 +vt 0.7733 0.3908 +vt 0.7577 0.4298 +vt 0.7655 0.4298 +vt 0.7655 0.4376 +vt 0.7577 0.4376 +vt 0.7577 0.4142 +vt 0.7655 0.4142 +vt 0.7655 0.4220 +vt 0.7577 0.4220 +vt 0.7733 0.4142 +vt 0.7811 0.4142 +vt 0.7811 0.4220 +vt 0.7733 0.4220 +vt 0.8514 0.3986 +vt 0.8592 0.3986 +vt 0.8592 0.4064 +vt 0.8514 0.4064 +vt 0.8514 0.3830 +vt 0.8592 0.3830 +vt 0.8592 0.3908 +vt 0.8514 0.3908 +vt 0.8670 0.3830 +vt 0.8748 0.3830 +vt 0.8748 0.3908 +vt 0.8670 0.3908 +vt 0.8202 0.3986 +vt 0.8280 0.3986 +vt 0.8280 0.4064 +vt 0.8202 0.4064 +vt 0.8202 0.3830 +vt 0.8280 0.3830 +vt 0.8280 0.3908 +vt 0.8202 0.3908 +vt 0.8358 0.3830 +vt 0.8436 0.3830 +vt 0.8436 0.3908 +vt 0.8358 0.3908 +vt 0.8202 0.4298 +vt 0.8280 0.4298 +vt 0.8280 0.4376 +vt 0.8202 0.4376 +vt 0.8202 0.4142 +vt 0.8280 0.4142 +vt 0.8280 0.4220 +vt 0.8202 0.4220 +vt 0.8358 0.4142 +vt 0.8436 0.4142 +vt 0.8436 0.4220 +vt 0.8358 0.4220 +vt 0.6640 0.3361 +vt 0.6718 0.3361 +vt 0.6718 0.3439 +vt 0.6640 0.3439 +vt 0.6640 0.3204 +vt 0.6718 0.3204 +vt 0.6718 0.3283 +vt 0.6640 0.3283 +vt 0.6797 0.3204 +vt 0.6875 0.3205 +vt 0.6875 0.3283 +vt 0.6796 0.3283 +vt 0.6328 0.3361 +vt 0.6406 0.3361 +vt 0.6406 0.3439 +vt 0.6328 0.3439 +vt 0.6328 0.3204 +vt 0.6406 0.3204 +vt 0.6406 0.3282 +vt 0.6328 0.3282 +vt 0.6484 0.3204 +vt 0.6562 0.3204 +vt 0.6562 0.3283 +vt 0.6484 0.3282 +vt 0.6328 0.3673 +vt 0.6406 0.3673 +vt 0.6406 0.3751 +vt 0.6328 0.3751 +vt 0.6328 0.3517 +vt 0.6406 0.3517 +vt 0.6406 0.3595 +vt 0.6328 0.3595 +vt 0.6484 0.3517 +vt 0.6562 0.3517 +vt 0.6562 0.3595 +vt 0.6484 0.3595 +vt 0.6640 0.2736 +vt 0.6719 0.2736 +vt 0.6719 0.2814 +vt 0.6640 0.2814 +vt 0.6641 0.2580 +vt 0.6719 0.2580 +vt 0.6719 0.2658 +vt 0.6641 0.2658 +vt 0.6797 0.2580 +vt 0.6875 0.2580 +vt 0.6875 0.2658 +vt 0.6797 0.2658 +vt 0.6328 0.2736 +vt 0.6406 0.2736 +vt 0.6406 0.2814 +vt 0.6328 0.2814 +vt 0.6328 0.2580 +vt 0.6406 0.2580 +vt 0.6406 0.2658 +vt 0.6328 0.2658 +vt 0.6484 0.2580 +vt 0.6562 0.2580 +vt 0.6562 0.2658 +vt 0.6484 0.2658 +vt 0.6328 0.3048 +vt 0.6406 0.3048 +vt 0.6406 0.3126 +vt 0.6328 0.3126 +vt 0.6328 0.2892 +vt 0.6406 0.2892 +vt 0.6406 0.2970 +vt 0.6328 0.2970 +vt 0.6484 0.2892 +vt 0.6562 0.2892 +vt 0.6562 0.2970 +vt 0.6484 0.2970 +vt 0.7265 0.2736 +vt 0.7343 0.2736 +vt 0.7343 0.2814 +vt 0.7265 0.2814 +vt 0.7265 0.2580 +vt 0.7343 0.2580 +vt 0.7343 0.2658 +vt 0.7265 0.2658 +vt 0.7421 0.2580 +vt 0.7499 0.2580 +vt 0.7499 0.2658 +vt 0.7421 0.2658 +vt 0.6953 0.2736 +vt 0.7031 0.2736 +vt 0.7031 0.2814 +vt 0.6953 0.2814 +vt 0.6953 0.2580 +vt 0.7031 0.2580 +vt 0.7031 0.2658 +vt 0.6953 0.2658 +vt 0.7109 0.2580 +vt 0.7187 0.2580 +vt 0.7187 0.2658 +vt 0.7109 0.2658 +vt 0.6953 0.3048 +vt 0.7031 0.3048 +vt 0.7031 0.3126 +vt 0.6953 0.3126 +vt 0.6953 0.2892 +vt 0.7031 0.2892 +vt 0.7031 0.2970 +vt 0.6953 0.2970 +vt 0.7109 0.2892 +vt 0.7187 0.2892 +vt 0.7187 0.2970 +vt 0.7109 0.2970 +vt 0.5391 0.3360 +vt 0.5469 0.3360 +vt 0.5469 0.3438 +vt 0.5391 0.3438 +vt 0.5391 0.3204 +vt 0.5469 0.3204 +vt 0.5469 0.3282 +vt 0.5391 0.3282 +vt 0.5547 0.3204 +vt 0.5625 0.3204 +vt 0.5625 0.3282 +vt 0.5547 0.3282 +vt 0.5079 0.3360 +vt 0.5157 0.3360 +vt 0.5157 0.3438 +vt 0.5079 0.3438 +vt 0.5079 0.3204 +vt 0.5157 0.3204 +vt 0.5157 0.3282 +vt 0.5079 0.3282 +vt 0.5235 0.3204 +vt 0.5313 0.3204 +vt 0.5313 0.3282 +vt 0.5235 0.3282 +vt 0.5079 0.3672 +vt 0.5157 0.3672 +vt 0.5157 0.3751 +vt 0.5078 0.3751 +vt 0.5079 0.3516 +vt 0.5157 0.3516 +vt 0.5157 0.3594 +vt 0.5079 0.3594 +vt 0.5235 0.3516 +vt 0.5313 0.3516 +vt 0.5313 0.3594 +vt 0.5235 0.3594 +vt 0.5391 0.2736 +vt 0.5469 0.2736 +vt 0.5469 0.2814 +vt 0.5391 0.2814 +vt 0.5391 0.2579 +vt 0.5469 0.2579 +vt 0.5469 0.2657 +vt 0.5391 0.2657 +vt 0.5547 0.2579 +vt 0.5625 0.2579 +vt 0.5625 0.2658 +vt 0.5547 0.2658 +vt 0.5079 0.2735 +vt 0.5157 0.2735 +vt 0.5157 0.2814 +vt 0.5079 0.2814 +vt 0.5079 0.2579 +vt 0.5157 0.2579 +vt 0.5157 0.2657 +vt 0.5079 0.2657 +vt 0.5235 0.2579 +vt 0.5313 0.2579 +vt 0.5313 0.2657 +vt 0.5235 0.2657 +vt 0.5079 0.3048 +vt 0.5157 0.3048 +vt 0.5157 0.3126 +vt 0.5079 0.3126 +vt 0.5079 0.2892 +vt 0.5157 0.2892 +vt 0.5157 0.2970 +vt 0.5079 0.2970 +vt 0.5235 0.2892 +vt 0.5313 0.2892 +vt 0.5313 0.2970 +vt 0.5235 0.2970 +vt 0.6016 0.2736 +vt 0.6094 0.2736 +vt 0.6094 0.2814 +vt 0.6016 0.2814 +vt 0.6016 0.2580 +vt 0.6094 0.2580 +vt 0.6094 0.2658 +vt 0.6016 0.2658 +vt 0.6172 0.2580 +vt 0.6250 0.2580 +vt 0.6250 0.2658 +vt 0.6172 0.2658 +vt 0.5703 0.2736 +vt 0.5782 0.2736 +vt 0.5782 0.2814 +vt 0.5703 0.2814 +vt 0.5704 0.2579 +vt 0.5782 0.2580 +vt 0.5782 0.2658 +vt 0.5704 0.2658 +vt 0.5860 0.2580 +vt 0.5938 0.2580 +vt 0.5938 0.2658 +vt 0.5860 0.2658 +vt 0.5703 0.3048 +vt 0.5781 0.3048 +vt 0.5781 0.3126 +vt 0.5703 0.3126 +vt 0.5703 0.2892 +vt 0.5782 0.2892 +vt 0.5781 0.2970 +vt 0.5703 0.2970 +vt 0.5860 0.2892 +vt 0.5938 0.2892 +vt 0.5938 0.2970 +vt 0.5860 0.2970 +vt 0.5391 0.4610 +vt 0.5469 0.4610 +vt 0.5469 0.4688 +vt 0.5391 0.4688 +vt 0.5391 0.4453 +vt 0.5469 0.4453 +vt 0.5469 0.4532 +vt 0.5391 0.4531 +vt 0.5547 0.4453 +vt 0.5625 0.4453 +vt 0.5625 0.4532 +vt 0.5547 0.4532 +vt 0.5078 0.4609 +vt 0.5156 0.4609 +vt 0.5156 0.4688 +vt 0.5078 0.4688 +vt 0.5078 0.4453 +vt 0.5156 0.4453 +vt 0.5156 0.4531 +vt 0.5078 0.4531 +vt 0.5234 0.4453 +vt 0.5313 0.4453 +vt 0.5312 0.4531 +vt 0.5234 0.4531 +vt 0.5078 0.4922 +vt 0.5156 0.4922 +vt 0.5156 0.5000 +vt 0.5078 0.5000 +vt 0.5078 0.4766 +vt 0.5156 0.4766 +vt 0.5156 0.4844 +vt 0.5078 0.4844 +vt 0.5234 0.4766 +vt 0.5312 0.4766 +vt 0.5312 0.4844 +vt 0.5234 0.4844 +vt 0.5391 0.3985 +vt 0.5469 0.3985 +vt 0.5469 0.4063 +vt 0.5391 0.4063 +vt 0.5391 0.3829 +vt 0.5469 0.3829 +vt 0.5469 0.3907 +vt 0.5391 0.3907 +vt 0.5547 0.3829 +vt 0.5625 0.3829 +vt 0.5625 0.3907 +vt 0.5547 0.3907 +vt 0.5078 0.3985 +vt 0.5157 0.3985 +vt 0.5156 0.4063 +vt 0.5078 0.4063 +vt 0.5078 0.3829 +vt 0.5157 0.3829 +vt 0.5157 0.3907 +vt 0.5078 0.3907 +vt 0.5235 0.3829 +vt 0.5313 0.3829 +vt 0.5313 0.3907 +vt 0.5235 0.3907 +vt 0.5078 0.4297 +vt 0.5156 0.4297 +vt 0.5156 0.4375 +vt 0.5078 0.4375 +vt 0.5078 0.4141 +vt 0.5156 0.4141 +vt 0.5156 0.4219 +vt 0.5078 0.4219 +vt 0.5235 0.4141 +vt 0.5313 0.4141 +vt 0.5313 0.4219 +vt 0.5235 0.4219 +vt 0.6015 0.3985 +vt 0.6094 0.3985 +vt 0.6093 0.4063 +vt 0.6015 0.4063 +vt 0.6015 0.3829 +vt 0.6094 0.3829 +vt 0.6094 0.3907 +vt 0.6015 0.3907 +vt 0.6172 0.3829 +vt 0.6250 0.3829 +vt 0.6250 0.3907 +vt 0.6172 0.3907 +vt 0.5703 0.3985 +vt 0.5781 0.3985 +vt 0.5781 0.4063 +vt 0.5703 0.4063 +vt 0.5703 0.3829 +vt 0.5781 0.3829 +vt 0.5781 0.3907 +vt 0.5703 0.3907 +vt 0.5859 0.3829 +vt 0.5937 0.3829 +vt 0.5937 0.3907 +vt 0.5859 0.3907 +vt 0.5703 0.4297 +vt 0.5781 0.4297 +vt 0.5781 0.4375 +vt 0.5703 0.4375 +vt 0.5703 0.4141 +vt 0.5781 0.4141 +vt 0.5781 0.4219 +vt 0.5703 0.4219 +vt 0.5859 0.4141 +vt 0.5937 0.4141 +vt 0.5937 0.4219 +vt 0.5859 0.4219 +vt 0.6641 0.0862 +vt 0.6719 0.0862 +vt 0.6719 0.0940 +vt 0.6641 0.0940 +vt 0.6641 0.0706 +vt 0.6719 0.0706 +vt 0.6719 0.0784 +vt 0.6641 0.0784 +vt 0.6797 0.0706 +vt 0.6875 0.0706 +vt 0.6875 0.0784 +vt 0.6797 0.0784 +vt 0.6329 0.0862 +vt 0.6407 0.0862 +vt 0.6407 0.0940 +vt 0.6329 0.0940 +vt 0.6329 0.0706 +vt 0.6407 0.0706 +vt 0.6407 0.0784 +vt 0.6329 0.0784 +vt 0.6485 0.0706 +vt 0.6563 0.0706 +vt 0.6563 0.0784 +vt 0.6485 0.0784 +vt 0.6329 0.1174 +vt 0.6407 0.1174 +vt 0.6407 0.1252 +vt 0.6329 0.1252 +vt 0.6329 0.1018 +vt 0.6407 0.1018 +vt 0.6407 0.1096 +vt 0.6329 0.1096 +vt 0.6485 0.1018 +vt 0.6563 0.1018 +vt 0.6563 0.1096 +vt 0.6485 0.1096 +vt 0.6641 0.0237 +vt 0.6719 0.0237 +vt 0.6719 0.0315 +vt 0.6641 0.0315 +vt 0.6641 0.0081 +vt 0.6719 0.0081 +vt 0.6719 0.0159 +vt 0.6641 0.0159 +vt 0.6797 0.0081 +vt 0.6876 0.0081 +vt 0.6876 0.0159 +vt 0.6797 0.0159 +vt 0.6329 0.0237 +vt 0.6407 0.0237 +vt 0.6407 0.0315 +vt 0.6329 0.0315 +vt 0.6329 0.0081 +vt 0.6407 0.0081 +vt 0.6407 0.0159 +vt 0.6329 0.0159 +vt 0.6485 0.0081 +vt 0.6563 0.0081 +vt 0.6563 0.0159 +vt 0.6485 0.0159 +vt 0.6329 0.0549 +vt 0.6407 0.0550 +vt 0.6407 0.0628 +vt 0.6329 0.0628 +vt 0.6329 0.0393 +vt 0.6407 0.0393 +vt 0.6407 0.0471 +vt 0.6329 0.0471 +vt 0.6485 0.0393 +vt 0.6563 0.0393 +vt 0.6563 0.0471 +vt 0.6485 0.0471 +vt 0.7266 0.0237 +vt 0.7344 0.0237 +vt 0.7344 0.0316 +vt 0.7266 0.0316 +vt 0.7266 0.0081 +vt 0.7344 0.0081 +vt 0.7344 0.0159 +vt 0.7266 0.0159 +vt 0.7422 0.0081 +vt 0.7500 0.0081 +vt 0.7500 0.0159 +vt 0.7422 0.0159 +vt 0.6954 0.0237 +vt 0.7032 0.0237 +vt 0.7032 0.0315 +vt 0.6954 0.0315 +vt 0.6954 0.0081 +vt 0.7032 0.0081 +vt 0.7032 0.0159 +vt 0.6954 0.0159 +vt 0.7110 0.0081 +vt 0.7188 0.0081 +vt 0.7188 0.0159 +vt 0.7110 0.0159 +vt 0.6953 0.0550 +vt 0.7032 0.0550 +vt 0.7032 0.0628 +vt 0.6953 0.0628 +vt 0.6954 0.0393 +vt 0.7032 0.0394 +vt 0.7032 0.0472 +vt 0.6954 0.0472 +vt 0.7110 0.0394 +vt 0.7188 0.0394 +vt 0.7188 0.0472 +vt 0.7110 0.0472 +vt 0.5392 0.0862 +vt 0.5470 0.0862 +vt 0.5470 0.0940 +vt 0.5392 0.0940 +vt 0.5392 0.0705 +vt 0.5470 0.0705 +vt 0.5470 0.0783 +vt 0.5392 0.0783 +vt 0.5548 0.0705 +vt 0.5626 0.0705 +vt 0.5626 0.0784 +vt 0.5548 0.0784 +vt 0.5079 0.0861 +vt 0.5157 0.0861 +vt 0.5157 0.0940 +vt 0.5079 0.0940 +vt 0.5079 0.0705 +vt 0.5158 0.0705 +vt 0.5157 0.0783 +vt 0.5079 0.0783 +vt 0.5236 0.0705 +vt 0.5314 0.0705 +vt 0.5314 0.0783 +vt 0.5236 0.0783 +vt 0.5079 0.1174 +vt 0.5157 0.1174 +vt 0.5157 0.1252 +vt 0.5079 0.1252 +vt 0.5079 0.1018 +vt 0.5157 0.1018 +vt 0.5157 0.1096 +vt 0.5079 0.1096 +vt 0.5235 0.1018 +vt 0.5314 0.1018 +vt 0.5314 0.1096 +vt 0.5235 0.1096 +vt 0.5392 0.0237 +vt 0.5470 0.0237 +vt 0.5470 0.0315 +vt 0.5392 0.0315 +vt 0.5392 0.0081 +vt 0.5470 0.0081 +vt 0.5470 0.0159 +vt 0.5392 0.0159 +vt 0.5548 0.0081 +vt 0.5626 0.0081 +vt 0.5626 0.0159 +vt 0.5548 0.0159 +vt 0.5080 0.0237 +vt 0.5158 0.0237 +vt 0.5158 0.0315 +vt 0.5080 0.0315 +vt 0.5080 0.0081 +vt 0.5158 0.0081 +vt 0.5158 0.0159 +vt 0.5080 0.0159 +vt 0.5236 0.0081 +vt 0.5314 0.0081 +vt 0.5314 0.0159 +vt 0.5236 0.0159 +vt 0.5079 0.0549 +vt 0.5158 0.0549 +vt 0.5158 0.0627 +vt 0.5079 0.0627 +vt 0.5080 0.0393 +vt 0.5158 0.0393 +vt 0.5158 0.0471 +vt 0.5079 0.0471 +vt 0.5236 0.0393 +vt 0.5314 0.0393 +vt 0.5314 0.0471 +vt 0.5236 0.0471 +vt 0.6017 0.0237 +vt 0.6095 0.0237 +vt 0.6095 0.0315 +vt 0.6017 0.0315 +vt 0.6017 0.0081 +vt 0.6095 0.0081 +vt 0.6095 0.0159 +vt 0.6017 0.0159 +vt 0.6173 0.0081 +vt 0.6251 0.0081 +vt 0.6251 0.0159 +vt 0.6173 0.0159 +vt 0.5704 0.0237 +vt 0.5782 0.0237 +vt 0.5782 0.0315 +vt 0.5704 0.0315 +vt 0.5704 0.0081 +vt 0.5782 0.0081 +vt 0.5782 0.0159 +vt 0.5704 0.0159 +vt 0.5860 0.0081 +vt 0.5939 0.0081 +vt 0.5939 0.0159 +vt 0.5860 0.0159 +vt 0.5704 0.0549 +vt 0.5782 0.0549 +vt 0.5782 0.0627 +vt 0.5704 0.0627 +vt 0.5704 0.0393 +vt 0.5782 0.0393 +vt 0.5782 0.0471 +vt 0.5704 0.0471 +vt 0.5860 0.0393 +vt 0.5938 0.0393 +vt 0.5938 0.0471 +vt 0.5860 0.0471 +vt 0.5391 0.2111 +vt 0.5469 0.2111 +vt 0.5469 0.2189 +vt 0.5391 0.2189 +vt 0.5391 0.1955 +vt 0.5469 0.1955 +vt 0.5469 0.2033 +vt 0.5391 0.2033 +vt 0.5548 0.1955 +vt 0.5626 0.1955 +vt 0.5626 0.2033 +vt 0.5548 0.2033 +vt 0.5079 0.2111 +vt 0.5157 0.2111 +vt 0.5157 0.2189 +vt 0.5079 0.2189 +vt 0.5079 0.1955 +vt 0.5157 0.1955 +vt 0.5157 0.2033 +vt 0.5079 0.2033 +vt 0.5235 0.1955 +vt 0.5313 0.1955 +vt 0.5313 0.2033 +vt 0.5235 0.2033 +vt 0.5079 0.2423 +vt 0.5157 0.2423 +vt 0.5157 0.2501 +vt 0.5079 0.2501 +vt 0.5079 0.2267 +vt 0.5157 0.2267 +vt 0.5157 0.2345 +vt 0.5079 0.2345 +vt 0.5235 0.2267 +vt 0.5313 0.2267 +vt 0.5313 0.2345 +vt 0.5235 0.2345 +vt 0.5392 0.1486 +vt 0.5470 0.1486 +vt 0.5470 0.1564 +vt 0.5391 0.1564 +vt 0.5392 0.1330 +vt 0.5470 0.1330 +vt 0.5470 0.1408 +vt 0.5392 0.1408 +vt 0.5548 0.1330 +vt 0.5626 0.1330 +vt 0.5626 0.1408 +vt 0.5548 0.1408 +vt 0.5079 0.1486 +vt 0.5157 0.1486 +vt 0.5157 0.1564 +vt 0.5079 0.1564 +vt 0.5079 0.1330 +vt 0.5157 0.1330 +vt 0.5157 0.1408 +vt 0.5079 0.1408 +vt 0.5235 0.1330 +vt 0.5313 0.1330 +vt 0.5313 0.1408 +vt 0.5235 0.1408 +vt 0.5079 0.1798 +vt 0.5157 0.1798 +vt 0.5157 0.1877 +vt 0.5079 0.1877 +vt 0.5079 0.1642 +vt 0.5157 0.1642 +vt 0.5157 0.1720 +vt 0.5079 0.1720 +vt 0.5235 0.1642 +vt 0.5313 0.1642 +vt 0.5313 0.1720 +vt 0.5235 0.1720 +vt 0.6016 0.1486 +vt 0.6094 0.1486 +vt 0.6094 0.1565 +vt 0.6016 0.1564 +vt 0.6016 0.1330 +vt 0.6094 0.1330 +vt 0.6094 0.1408 +vt 0.6016 0.1408 +vt 0.6172 0.1330 +vt 0.6250 0.1330 +vt 0.6250 0.1408 +vt 0.6172 0.1408 +vt 0.5704 0.1486 +vt 0.5782 0.1486 +vt 0.5782 0.1564 +vt 0.5704 0.1564 +vt 0.5704 0.1330 +vt 0.5782 0.1330 +vt 0.5782 0.1408 +vt 0.5704 0.1408 +vt 0.5860 0.1330 +vt 0.5938 0.1330 +vt 0.5938 0.1408 +vt 0.5860 0.1408 +vt 0.5704 0.1799 +vt 0.5782 0.1799 +vt 0.5782 0.1877 +vt 0.5704 0.1877 +vt 0.5704 0.1642 +vt 0.5782 0.1642 +vt 0.5782 0.1721 +vt 0.5704 0.1721 +vt 0.5860 0.1643 +vt 0.5938 0.1643 +vt 0.5938 0.1721 +vt 0.5860 0.1721 +vt 0.9140 0.0863 +vt 0.9218 0.0863 +vt 0.9218 0.0941 +vt 0.9140 0.0941 +vt 0.9140 0.0707 +vt 0.9218 0.0707 +vt 0.9218 0.0785 +vt 0.9140 0.0785 +vt 0.9296 0.0707 +vt 0.9374 0.0707 +vt 0.9374 0.0785 +vt 0.9296 0.0785 +vt 0.8827 0.0863 +vt 0.8906 0.0863 +vt 0.8906 0.0941 +vt 0.8827 0.0941 +vt 0.8827 0.0706 +vt 0.8906 0.0706 +vt 0.8906 0.0785 +vt 0.8827 0.0784 +vt 0.8984 0.0706 +vt 0.9062 0.0706 +vt 0.9062 0.0785 +vt 0.8984 0.0785 +vt 0.8827 0.1175 +vt 0.8905 0.1175 +vt 0.8905 0.1253 +vt 0.8827 0.1253 +vt 0.8827 0.1019 +vt 0.8905 0.1019 +vt 0.8905 0.1097 +vt 0.8827 0.1097 +vt 0.8984 0.1019 +vt 0.9062 0.1019 +vt 0.9062 0.1097 +vt 0.8984 0.1097 +vt 0.9140 0.0238 +vt 0.9218 0.0238 +vt 0.9218 0.0316 +vt 0.9140 0.0316 +vt 0.9140 0.0082 +vt 0.9218 0.0082 +vt 0.9218 0.0160 +vt 0.9140 0.0160 +vt 0.9296 0.0082 +vt 0.9374 0.0082 +vt 0.9374 0.0160 +vt 0.9296 0.0160 +vt 0.8828 0.0238 +vt 0.8906 0.0238 +vt 0.8906 0.0316 +vt 0.8828 0.0316 +vt 0.8828 0.0082 +vt 0.8906 0.0082 +vt 0.8906 0.0160 +vt 0.8828 0.0160 +vt 0.8984 0.0082 +vt 0.9062 0.0082 +vt 0.9062 0.0160 +vt 0.8984 0.0160 +vt 0.8828 0.0550 +vt 0.8906 0.0550 +vt 0.8906 0.0628 +vt 0.8828 0.0628 +vt 0.8828 0.0394 +vt 0.8906 0.0394 +vt 0.8906 0.0472 +vt 0.8828 0.0472 +vt 0.8984 0.0394 +vt 0.9062 0.0394 +vt 0.9062 0.0472 +vt 0.8984 0.0472 +vt 0.9765 0.0238 +vt 0.9843 0.0238 +vt 0.9843 0.0316 +vt 0.9765 0.0316 +vt 0.9765 0.0082 +vt 0.9843 0.0082 +vt 0.9843 0.0160 +vt 0.9765 0.0160 +vt 0.9921 0.0082 +vt 0.9999 0.0082 +vt 0.9999 0.0160 +vt 0.9921 0.0160 +vt 0.9452 0.0238 +vt 0.9530 0.0238 +vt 0.9530 0.0316 +vt 0.9452 0.0316 +vt 0.9452 0.0082 +vt 0.9530 0.0082 +vt 0.9530 0.0160 +vt 0.9452 0.0160 +vt 0.9609 0.0082 +vt 0.9687 0.0082 +vt 0.9687 0.0160 +vt 0.9609 0.0160 +vt 0.9452 0.0550 +vt 0.9530 0.0550 +vt 0.9530 0.0629 +vt 0.9452 0.0629 +vt 0.9452 0.0394 +vt 0.9530 0.0394 +vt 0.9530 0.0472 +vt 0.9452 0.0472 +vt 0.9608 0.0394 +vt 0.9687 0.0394 +vt 0.9687 0.0472 +vt 0.9608 0.0472 +vt 0.7890 0.0862 +vt 0.7969 0.0862 +vt 0.7968 0.0940 +vt 0.7890 0.0940 +vt 0.7890 0.0706 +vt 0.7969 0.0706 +vt 0.7969 0.0784 +vt 0.7890 0.0784 +vt 0.8047 0.0706 +vt 0.8125 0.0706 +vt 0.8125 0.0784 +vt 0.8047 0.0784 +vt 0.7578 0.0862 +vt 0.7656 0.0862 +vt 0.7656 0.0940 +vt 0.7578 0.0940 +vt 0.7578 0.0706 +vt 0.7656 0.0706 +vt 0.7656 0.0784 +vt 0.7578 0.0784 +vt 0.7734 0.0706 +vt 0.7812 0.0706 +vt 0.7812 0.0784 +vt 0.7734 0.0784 +vt 0.7578 0.1175 +vt 0.7656 0.1175 +vt 0.7656 0.1253 +vt 0.7578 0.1253 +vt 0.7578 0.1018 +vt 0.7656 0.1018 +vt 0.7656 0.1096 +vt 0.7578 0.1096 +vt 0.7734 0.1018 +vt 0.7812 0.1018 +vt 0.7812 0.1097 +vt 0.7734 0.1097 +vt 0.7891 0.0238 +vt 0.7969 0.0238 +vt 0.7969 0.0316 +vt 0.7891 0.0316 +vt 0.7891 0.0081 +vt 0.7969 0.0081 +vt 0.7969 0.0160 +vt 0.7891 0.0160 +vt 0.8047 0.0081 +vt 0.8125 0.0082 +vt 0.8125 0.0160 +vt 0.8047 0.0160 +vt 0.7578 0.0238 +vt 0.7656 0.0238 +vt 0.7656 0.0316 +vt 0.7578 0.0316 +vt 0.7578 0.0081 +vt 0.7656 0.0081 +vt 0.7656 0.0159 +vt 0.7578 0.0159 +vt 0.7734 0.0081 +vt 0.7813 0.0081 +vt 0.7813 0.0160 +vt 0.7734 0.0159 +vt 0.7578 0.0550 +vt 0.7656 0.0550 +vt 0.7656 0.0628 +vt 0.7578 0.0628 +vt 0.7578 0.0394 +vt 0.7656 0.0394 +vt 0.7656 0.0472 +vt 0.7578 0.0472 +vt 0.7734 0.0394 +vt 0.7812 0.0394 +vt 0.7812 0.0472 +vt 0.7734 0.0472 +vt 0.8515 0.0238 +vt 0.8593 0.0238 +vt 0.8593 0.0316 +vt 0.8515 0.0316 +vt 0.8515 0.0082 +vt 0.8593 0.0082 +vt 0.8593 0.0160 +vt 0.8515 0.0160 +vt 0.8672 0.0082 +vt 0.8750 0.0082 +vt 0.8750 0.0160 +vt 0.8671 0.0160 +vt 0.8203 0.0238 +vt 0.8281 0.0238 +vt 0.8281 0.0316 +vt 0.8203 0.0316 +vt 0.8203 0.0082 +vt 0.8281 0.0082 +vt 0.8281 0.0160 +vt 0.8203 0.0160 +vt 0.8359 0.0082 +vt 0.8437 0.0082 +vt 0.8437 0.0160 +vt 0.8359 0.0160 +vt 0.8203 0.0550 +vt 0.8281 0.0550 +vt 0.8281 0.0628 +vt 0.8203 0.0628 +vt 0.8203 0.0394 +vt 0.8281 0.0394 +vt 0.8281 0.0472 +vt 0.8203 0.0472 +vt 0.8359 0.0394 +vt 0.8437 0.0394 +vt 0.8437 0.0472 +vt 0.8359 0.0472 +vt 0.7890 0.2112 +vt 0.7968 0.2112 +vt 0.7968 0.2190 +vt 0.7890 0.2190 +vt 0.7890 0.1955 +vt 0.7968 0.1956 +vt 0.7968 0.2034 +vt 0.7890 0.2034 +vt 0.8046 0.1956 +vt 0.8124 0.1956 +vt 0.8124 0.2034 +vt 0.8046 0.2034 +vt 0.7578 0.2112 +vt 0.7656 0.2112 +vt 0.7656 0.2190 +vt 0.7578 0.2190 +vt 0.7578 0.1955 +vt 0.7656 0.1955 +vt 0.7656 0.2033 +vt 0.7578 0.2033 +vt 0.7734 0.1955 +vt 0.7812 0.1955 +vt 0.7812 0.2034 +vt 0.7734 0.2034 +vt 0.7578 0.2424 +vt 0.7656 0.2424 +vt 0.7656 0.2502 +vt 0.7578 0.2502 +vt 0.7578 0.2268 +vt 0.7656 0.2268 +vt 0.7656 0.2346 +vt 0.7578 0.2346 +vt 0.7734 0.2268 +vt 0.7812 0.2268 +vt 0.7812 0.2346 +vt 0.7734 0.2346 +vt 0.7890 0.1487 +vt 0.7968 0.1487 +vt 0.7968 0.1565 +vt 0.7890 0.1565 +vt 0.7890 0.1331 +vt 0.7968 0.1331 +vt 0.7968 0.1409 +vt 0.7890 0.1409 +vt 0.8046 0.1331 +vt 0.8125 0.1331 +vt 0.8125 0.1409 +vt 0.8046 0.1409 +vt 0.7578 0.1487 +vt 0.7656 0.1487 +vt 0.7656 0.1565 +vt 0.7578 0.1565 +vt 0.7578 0.1331 +vt 0.7656 0.1331 +vt 0.7656 0.1409 +vt 0.7578 0.1409 +vt 0.7734 0.1331 +vt 0.7812 0.1331 +vt 0.7812 0.1409 +vt 0.7734 0.1409 +vt 0.7578 0.1799 +vt 0.7656 0.1799 +vt 0.7656 0.1877 +vt 0.7578 0.1877 +vt 0.7578 0.1643 +vt 0.7656 0.1643 +vt 0.7656 0.1721 +vt 0.7578 0.1721 +vt 0.7734 0.1643 +vt 0.7812 0.1643 +vt 0.7812 0.1721 +vt 0.7734 0.1721 +vt 0.8515 0.1487 +vt 0.8593 0.1487 +vt 0.8593 0.1565 +vt 0.8515 0.1565 +vt 0.8515 0.1331 +vt 0.8593 0.1331 +vt 0.8593 0.1409 +vt 0.8515 0.1409 +vt 0.8671 0.1331 +vt 0.8749 0.1331 +vt 0.8749 0.1409 +vt 0.8671 0.1409 +vt 0.8203 0.1487 +vt 0.8281 0.1487 +vt 0.8281 0.1565 +vt 0.8203 0.1565 +vt 0.8203 0.1331 +vt 0.8281 0.1331 +vt 0.8281 0.1409 +vt 0.8203 0.1409 +vt 0.8359 0.1331 +vt 0.8437 0.1331 +vt 0.8437 0.1409 +vt 0.8359 0.1409 +vt 0.8202 0.1799 +vt 0.8281 0.1799 +vt 0.8281 0.1878 +vt 0.8202 0.1877 +vt 0.8203 0.1643 +vt 0.8281 0.1643 +vt 0.8281 0.1721 +vt 0.8202 0.1721 +vt 0.8359 0.1643 +vt 0.8437 0.1643 +vt 0.8437 0.1721 +vt 0.8359 0.1721 +vt 0.1643 0.3359 +vt 0.1721 0.3359 +vt 0.1721 0.3437 +vt 0.1643 0.3437 +vt 0.1643 0.3203 +vt 0.1721 0.3203 +vt 0.1721 0.3281 +vt 0.1643 0.3281 +vt 0.1799 0.3203 +vt 0.1877 0.3203 +vt 0.1877 0.3281 +vt 0.1799 0.3281 +vt 0.1331 0.3359 +vt 0.1409 0.3359 +vt 0.1409 0.3437 +vt 0.1331 0.3437 +vt 0.1331 0.3203 +vt 0.1409 0.3203 +vt 0.1409 0.3281 +vt 0.1331 0.3281 +vt 0.1487 0.3203 +vt 0.1565 0.3203 +vt 0.1565 0.3281 +vt 0.1487 0.3281 +vt 0.1331 0.3671 +vt 0.1409 0.3671 +vt 0.1409 0.3749 +vt 0.1330 0.3749 +vt 0.1331 0.3515 +vt 0.1409 0.3515 +vt 0.1409 0.3593 +vt 0.1331 0.3593 +vt 0.1487 0.3515 +vt 0.1565 0.3515 +vt 0.1565 0.3593 +vt 0.1487 0.3593 +vt 0.1643 0.2734 +vt 0.1721 0.2734 +vt 0.1721 0.2812 +vt 0.1643 0.2812 +vt 0.1643 0.2578 +vt 0.1721 0.2578 +vt 0.1721 0.2656 +vt 0.1643 0.2656 +vt 0.1799 0.2578 +vt 0.1877 0.2578 +vt 0.1877 0.2656 +vt 0.1799 0.2656 +vt 0.1331 0.2734 +vt 0.1409 0.2734 +vt 0.1409 0.2812 +vt 0.1331 0.2812 +vt 0.1331 0.2578 +vt 0.1409 0.2578 +vt 0.1409 0.2656 +vt 0.1331 0.2656 +vt 0.1487 0.2578 +vt 0.1565 0.2578 +vt 0.1565 0.2656 +vt 0.1487 0.2656 +vt 0.1331 0.3047 +vt 0.1409 0.3047 +vt 0.1409 0.3125 +vt 0.1331 0.3125 +vt 0.1331 0.2890 +vt 0.1409 0.2890 +vt 0.1409 0.2969 +vt 0.1331 0.2969 +vt 0.1487 0.2890 +vt 0.1565 0.2891 +vt 0.1565 0.2969 +vt 0.1487 0.2969 +vt 0.2268 0.2735 +vt 0.2346 0.2735 +vt 0.2346 0.2813 +vt 0.2268 0.2813 +vt 0.2268 0.2578 +vt 0.2346 0.2578 +vt 0.2346 0.2657 +vt 0.2268 0.2656 +vt 0.2424 0.2578 +vt 0.2502 0.2578 +vt 0.2502 0.2657 +vt 0.2424 0.2657 +vt 0.1955 0.2734 +vt 0.2034 0.2735 +vt 0.2034 0.2813 +vt 0.1955 0.2813 +vt 0.1956 0.2578 +vt 0.2034 0.2578 +vt 0.2034 0.2656 +vt 0.1955 0.2656 +vt 0.2112 0.2578 +vt 0.2190 0.2578 +vt 0.2190 0.2656 +vt 0.2112 0.2656 +vt 0.1955 0.3047 +vt 0.2033 0.3047 +vt 0.2033 0.3125 +vt 0.1955 0.3125 +vt 0.1955 0.2891 +vt 0.2034 0.2891 +vt 0.2033 0.2969 +vt 0.1955 0.2969 +vt 0.2112 0.2891 +vt 0.2190 0.2891 +vt 0.2190 0.2969 +vt 0.2112 0.2969 +vt 0.0394 0.3359 +vt 0.0472 0.3359 +vt 0.0472 0.3437 +vt 0.0394 0.3437 +vt 0.0394 0.3202 +vt 0.0472 0.3202 +vt 0.0472 0.3281 +vt 0.0394 0.3281 +vt 0.0550 0.3203 +vt 0.0628 0.3203 +vt 0.0628 0.3281 +vt 0.0550 0.3281 +vt 0.0081 0.3359 +vt 0.0159 0.3359 +vt 0.0159 0.3437 +vt 0.0081 0.3437 +vt 0.0081 0.3202 +vt 0.0159 0.3202 +vt 0.0159 0.3280 +vt 0.0081 0.3280 +vt 0.0237 0.3202 +vt 0.0316 0.3202 +vt 0.0316 0.3281 +vt 0.0237 0.3280 +vt 0.0081 0.3671 +vt 0.0159 0.3671 +vt 0.0159 0.3749 +vt 0.0081 0.3749 +vt 0.0081 0.3515 +vt 0.0159 0.3515 +vt 0.0159 0.3593 +vt 0.0081 0.3593 +vt 0.0237 0.3515 +vt 0.0315 0.3515 +vt 0.0315 0.3593 +vt 0.0237 0.3593 +vt 0.0394 0.2734 +vt 0.0472 0.2734 +vt 0.0472 0.2812 +vt 0.0394 0.2812 +vt 0.0394 0.2578 +vt 0.0472 0.2578 +vt 0.0472 0.2656 +vt 0.0394 0.2656 +vt 0.0550 0.2578 +vt 0.0628 0.2578 +vt 0.0628 0.2656 +vt 0.0550 0.2656 +vt 0.0081 0.2734 +vt 0.0160 0.2734 +vt 0.0160 0.2812 +vt 0.0081 0.2812 +vt 0.0082 0.2578 +vt 0.0160 0.2578 +vt 0.0160 0.2656 +vt 0.0082 0.2656 +vt 0.0238 0.2578 +vt 0.0316 0.2578 +vt 0.0316 0.2656 +vt 0.0238 0.2656 +vt 0.0081 0.3046 +vt 0.0159 0.3046 +vt 0.0159 0.3124 +vt 0.0081 0.3124 +vt 0.0081 0.2890 +vt 0.0160 0.2890 +vt 0.0159 0.2968 +vt 0.0081 0.2968 +vt 0.0238 0.2890 +vt 0.0316 0.2890 +vt 0.0316 0.2968 +vt 0.0238 0.2968 +vt 0.1018 0.2734 +vt 0.1097 0.2734 +vt 0.1097 0.2812 +vt 0.1018 0.2812 +vt 0.1019 0.2578 +vt 0.1097 0.2578 +vt 0.1097 0.2656 +vt 0.1019 0.2656 +vt 0.1175 0.2578 +vt 0.1253 0.2578 +vt 0.1253 0.2656 +vt 0.1175 0.2656 +vt 0.0706 0.2734 +vt 0.0784 0.2734 +vt 0.0784 0.2812 +vt 0.0706 0.2812 +vt 0.0706 0.2578 +vt 0.0784 0.2578 +vt 0.0784 0.2656 +vt 0.0706 0.2656 +vt 0.0862 0.2578 +vt 0.0940 0.2578 +vt 0.0940 0.2656 +vt 0.0862 0.2656 +vt 0.0706 0.3046 +vt 0.0784 0.3046 +vt 0.0784 0.3125 +vt 0.0706 0.3124 +vt 0.0706 0.2890 +vt 0.0784 0.2890 +vt 0.0784 0.2968 +vt 0.0706 0.2968 +vt 0.0862 0.2890 +vt 0.0940 0.2890 +vt 0.0940 0.2968 +vt 0.0862 0.2968 +vt 0.0393 0.4608 +vt 0.0471 0.4608 +vt 0.0471 0.4686 +vt 0.0393 0.4686 +vt 0.0393 0.4452 +vt 0.0471 0.4452 +vt 0.0471 0.4530 +vt 0.0393 0.4530 +vt 0.0549 0.4452 +vt 0.0627 0.4452 +vt 0.0627 0.4530 +vt 0.0549 0.4530 +vt 0.0081 0.4608 +vt 0.0159 0.4608 +vt 0.0159 0.4686 +vt 0.0081 0.4686 +vt 0.0081 0.4452 +vt 0.0159 0.4452 +vt 0.0159 0.4530 +vt 0.0081 0.4530 +vt 0.0237 0.4452 +vt 0.0315 0.4452 +vt 0.0315 0.4530 +vt 0.0237 0.4530 +vt 0.0081 0.4920 +vt 0.0159 0.4920 +vt 0.0159 0.4998 +vt 0.0081 0.4998 +vt 0.0081 0.4764 +vt 0.0159 0.4764 +vt 0.0159 0.4842 +vt 0.0081 0.4842 +vt 0.0237 0.4764 +vt 0.0315 0.4764 +vt 0.0315 0.4842 +vt 0.0237 0.4842 +vt 0.0393 0.3983 +vt 0.0471 0.3983 +vt 0.0471 0.4061 +vt 0.0393 0.4061 +vt 0.0393 0.3827 +vt 0.0472 0.3827 +vt 0.0472 0.3905 +vt 0.0393 0.3905 +vt 0.0550 0.3827 +vt 0.0628 0.3827 +vt 0.0628 0.3905 +vt 0.0550 0.3905 +vt 0.0081 0.3983 +vt 0.0159 0.3983 +vt 0.0159 0.4061 +vt 0.0081 0.4061 +vt 0.0081 0.3827 +vt 0.0159 0.3827 +vt 0.0159 0.3905 +vt 0.0081 0.3905 +vt 0.0237 0.3827 +vt 0.0315 0.3827 +vt 0.0315 0.3905 +vt 0.0237 0.3905 +vt 0.0081 0.4296 +vt 0.0159 0.4296 +vt 0.0159 0.4374 +vt 0.0081 0.4374 +vt 0.0081 0.4139 +vt 0.0159 0.4139 +vt 0.0159 0.4217 +vt 0.0081 0.4217 +vt 0.0237 0.4139 +vt 0.0315 0.4139 +vt 0.0315 0.4218 +vt 0.0237 0.4217 +vt 0.1018 0.3984 +vt 0.1096 0.3984 +vt 0.1096 0.4062 +vt 0.1018 0.4062 +vt 0.1018 0.3827 +vt 0.1096 0.3827 +vt 0.1096 0.3905 +vt 0.1018 0.3905 +vt 0.1174 0.3827 +vt 0.1252 0.3827 +vt 0.1252 0.3905 +vt 0.1174 0.3905 +vt 0.0706 0.3983 +vt 0.0784 0.3983 +vt 0.0784 0.4062 +vt 0.0706 0.4061 +vt 0.0706 0.3827 +vt 0.0784 0.3827 +vt 0.0784 0.3905 +vt 0.0706 0.3905 +vt 0.0862 0.3827 +vt 0.0940 0.3827 +vt 0.0940 0.3905 +vt 0.0862 0.3905 +vt 0.0706 0.4296 +vt 0.0784 0.4296 +vt 0.0784 0.4374 +vt 0.0706 0.4374 +vt 0.0706 0.4140 +vt 0.0784 0.4140 +vt 0.0784 0.4218 +vt 0.0706 0.4218 +vt 0.0862 0.4140 +vt 0.0940 0.4140 +vt 0.0940 0.4218 +vt 0.0862 0.4218 +vt 0.1644 0.0860 +vt 0.1722 0.0860 +vt 0.1722 0.0939 +vt 0.1644 0.0938 +vt 0.1644 0.0704 +vt 0.1722 0.0704 +vt 0.1722 0.0782 +vt 0.1644 0.0782 +vt 0.1800 0.0704 +vt 0.1878 0.0704 +vt 0.1878 0.0782 +vt 0.1800 0.0782 +vt 0.1331 0.0860 +vt 0.1409 0.0860 +vt 0.1409 0.0938 +vt 0.1331 0.0938 +vt 0.1331 0.0704 +vt 0.1410 0.0704 +vt 0.1410 0.0782 +vt 0.1331 0.0782 +vt 0.1488 0.0704 +vt 0.1566 0.0704 +vt 0.1566 0.0782 +vt 0.1488 0.0782 +vt 0.1331 0.1173 +vt 0.1409 0.1173 +vt 0.1409 0.1251 +vt 0.1331 0.1251 +vt 0.1331 0.1016 +vt 0.1409 0.1016 +vt 0.1409 0.1095 +vt 0.1331 0.1095 +vt 0.1488 0.1017 +vt 0.1566 0.1017 +vt 0.1566 0.1095 +vt 0.1487 0.1095 +vt 0.1644 0.0236 +vt 0.1722 0.0236 +vt 0.1722 0.0314 +vt 0.1644 0.0314 +vt 0.1644 0.0080 +vt 0.1722 0.0080 +vt 0.1722 0.0158 +vt 0.1644 0.0158 +vt 0.1800 0.0080 +vt 0.1878 0.0080 +vt 0.1878 0.0158 +vt 0.1800 0.0158 +vt 0.1332 0.0236 +vt 0.1410 0.0236 +vt 0.1410 0.0314 +vt 0.1332 0.0314 +vt 0.1332 0.0079 +vt 0.1410 0.0080 +vt 0.1410 0.0158 +vt 0.1332 0.0158 +vt 0.1488 0.0080 +vt 0.1566 0.0080 +vt 0.1566 0.0158 +vt 0.1488 0.0158 +vt 0.1332 0.0548 +vt 0.1410 0.0548 +vt 0.1410 0.0626 +vt 0.1331 0.0626 +vt 0.1332 0.0392 +vt 0.1410 0.0392 +vt 0.1410 0.0470 +vt 0.1332 0.0470 +vt 0.1488 0.0392 +vt 0.1566 0.0392 +vt 0.1566 0.0470 +vt 0.1488 0.0470 +vt 0.2269 0.0236 +vt 0.2347 0.0236 +vt 0.2347 0.0314 +vt 0.2269 0.0314 +vt 0.2269 0.0080 +vt 0.2347 0.0080 +vt 0.2347 0.0158 +vt 0.2269 0.0158 +vt 0.2425 0.0080 +vt 0.2503 0.0080 +vt 0.2503 0.0158 +vt 0.2425 0.0158 +vt 0.1956 0.0236 +vt 0.2034 0.0236 +vt 0.2034 0.0314 +vt 0.1956 0.0314 +vt 0.1956 0.0080 +vt 0.2034 0.0080 +vt 0.2034 0.0158 +vt 0.1956 0.0158 +vt 0.2112 0.0080 +vt 0.2191 0.0080 +vt 0.2191 0.0158 +vt 0.2112 0.0158 +vt 0.1956 0.0548 +vt 0.2034 0.0548 +vt 0.2034 0.0626 +vt 0.1956 0.0626 +vt 0.1956 0.0392 +vt 0.2034 0.0392 +vt 0.2034 0.0470 +vt 0.1956 0.0470 +vt 0.2112 0.0392 +vt 0.2190 0.0392 +vt 0.2190 0.0470 +vt 0.2112 0.0470 +vt 0.0394 0.0860 +vt 0.0473 0.0860 +vt 0.0472 0.0938 +vt 0.0394 0.0938 +vt 0.0394 0.0704 +vt 0.0473 0.0704 +vt 0.0473 0.0782 +vt 0.0394 0.0782 +vt 0.0551 0.0704 +vt 0.0629 0.0704 +vt 0.0629 0.0782 +vt 0.0551 0.0782 +vt 0.0082 0.0860 +vt 0.0160 0.0860 +vt 0.0160 0.0938 +vt 0.0082 0.0938 +vt 0.0082 0.0704 +vt 0.0160 0.0704 +vt 0.0160 0.0782 +vt 0.0082 0.0782 +vt 0.0238 0.0704 +vt 0.0316 0.0704 +vt 0.0316 0.0782 +vt 0.0238 0.0782 +vt 0.0082 0.1172 +vt 0.0160 0.1172 +vt 0.0160 0.1250 +vt 0.0082 0.1250 +vt 0.0082 0.1016 +vt 0.0160 0.1016 +vt 0.0160 0.1094 +vt 0.0082 0.1094 +vt 0.0238 0.1016 +vt 0.0316 0.1016 +vt 0.0316 0.1094 +vt 0.0238 0.1094 +vt 0.0395 0.0235 +vt 0.0473 0.0235 +vt 0.0473 0.0313 +vt 0.0395 0.0313 +vt 0.0395 0.0079 +vt 0.0473 0.0079 +vt 0.0473 0.0157 +vt 0.0395 0.0157 +vt 0.0551 0.0079 +vt 0.0629 0.0079 +vt 0.0629 0.0157 +vt 0.0551 0.0157 +vt 0.0082 0.0235 +vt 0.0160 0.0235 +vt 0.0160 0.0313 +vt 0.0082 0.0313 +vt 0.0082 0.0079 +vt 0.0160 0.0079 +vt 0.0160 0.0157 +vt 0.0082 0.0157 +vt 0.0239 0.0079 +vt 0.0317 0.0079 +vt 0.0317 0.0157 +vt 0.0238 0.0157 +vt 0.0082 0.0548 +vt 0.0160 0.0548 +vt 0.0160 0.0626 +vt 0.0082 0.0626 +vt 0.0082 0.0391 +vt 0.0160 0.0391 +vt 0.0160 0.0470 +vt 0.0082 0.0470 +vt 0.0238 0.0391 +vt 0.0316 0.0392 +vt 0.0316 0.0470 +vt 0.0238 0.0470 +vt 0.1019 0.0236 +vt 0.1097 0.0236 +vt 0.1097 0.0314 +vt 0.1019 0.0314 +vt 0.1019 0.0079 +vt 0.1097 0.0079 +vt 0.1097 0.0158 +vt 0.1019 0.0157 +vt 0.1175 0.0079 +vt 0.1254 0.0079 +vt 0.1254 0.0158 +vt 0.1175 0.0158 +vt 0.0707 0.0235 +vt 0.0785 0.0235 +vt 0.0785 0.0314 +vt 0.0707 0.0314 +vt 0.0707 0.0079 +vt 0.0785 0.0079 +vt 0.0785 0.0157 +vt 0.0707 0.0157 +vt 0.0863 0.0079 +vt 0.0941 0.0079 +vt 0.0941 0.0157 +vt 0.0863 0.0157 +vt 0.0707 0.0548 +vt 0.0785 0.0548 +vt 0.0785 0.0626 +vt 0.0707 0.0626 +vt 0.0707 0.0392 +vt 0.0785 0.0392 +vt 0.0785 0.0470 +vt 0.0707 0.0470 +vt 0.0863 0.0392 +vt 0.0941 0.0392 +vt 0.0941 0.0470 +vt 0.0863 0.0470 +vt 0.0394 0.2109 +vt 0.0472 0.2109 +vt 0.0472 0.2187 +vt 0.0394 0.2187 +vt 0.0394 0.1953 +vt 0.0472 0.1953 +vt 0.0472 0.2031 +vt 0.0394 0.2031 +vt 0.0550 0.1953 +vt 0.0628 0.1953 +vt 0.0628 0.2031 +vt 0.0550 0.2031 +vt 0.0082 0.2109 +vt 0.0160 0.2109 +vt 0.0160 0.2187 +vt 0.0082 0.2187 +vt 0.0082 0.1953 +vt 0.0160 0.1953 +vt 0.0160 0.2031 +vt 0.0082 0.2031 +vt 0.0238 0.1953 +vt 0.0316 0.1953 +vt 0.0316 0.2031 +vt 0.0238 0.2031 +vt 0.0082 0.2422 +vt 0.0160 0.2422 +vt 0.0160 0.2500 +vt 0.0082 0.2500 +vt 0.0082 0.2265 +vt 0.0160 0.2265 +vt 0.0160 0.2343 +vt 0.0082 0.2343 +vt 0.0238 0.2265 +vt 0.0316 0.2265 +vt 0.0316 0.2344 +vt 0.0238 0.2344 +vt 0.0394 0.1485 +vt 0.0472 0.1485 +vt 0.0472 0.1563 +vt 0.0394 0.1563 +vt 0.0394 0.1328 +vt 0.0472 0.1329 +vt 0.0472 0.1407 +vt 0.0394 0.1407 +vt 0.0550 0.1329 +vt 0.0629 0.1329 +vt 0.0629 0.1407 +vt 0.0550 0.1407 +vt 0.0082 0.1485 +vt 0.0160 0.1485 +vt 0.0160 0.1563 +vt 0.0082 0.1563 +vt 0.0082 0.1328 +vt 0.0160 0.1328 +vt 0.0160 0.1407 +vt 0.0082 0.1406 +vt 0.0238 0.1328 +vt 0.0316 0.1328 +vt 0.0316 0.1407 +vt 0.0238 0.1407 +vt 0.0082 0.1797 +vt 0.0160 0.1797 +vt 0.0160 0.1875 +vt 0.0082 0.1875 +vt 0.0082 0.1641 +vt 0.0160 0.1641 +vt 0.0160 0.1719 +vt 0.0082 0.1719 +vt 0.0238 0.1641 +vt 0.0316 0.1641 +vt 0.0316 0.1719 +vt 0.0238 0.1719 +vt 0.1019 0.1485 +vt 0.1097 0.1485 +vt 0.1097 0.1563 +vt 0.1019 0.1563 +vt 0.1019 0.1329 +vt 0.1097 0.1329 +vt 0.1097 0.1407 +vt 0.1019 0.1407 +vt 0.1175 0.1329 +vt 0.1253 0.1329 +vt 0.1253 0.1407 +vt 0.1175 0.1407 +vt 0.0707 0.1485 +vt 0.0785 0.1485 +vt 0.0785 0.1563 +vt 0.0707 0.1563 +vt 0.0707 0.1329 +vt 0.0785 0.1329 +vt 0.0785 0.1407 +vt 0.0707 0.1407 +vt 0.0863 0.1329 +vt 0.0941 0.1329 +vt 0.0941 0.1407 +vt 0.0863 0.1407 +vt 0.0706 0.1797 +vt 0.0785 0.1797 +vt 0.0785 0.1875 +vt 0.0706 0.1875 +vt 0.0707 0.1641 +vt 0.0785 0.1641 +vt 0.0785 0.1719 +vt 0.0706 0.1719 +vt 0.0863 0.1641 +vt 0.0941 0.1641 +vt 0.0941 0.1719 +vt 0.0863 0.1719 +vt 0.4142 0.0861 +vt 0.4220 0.0861 +vt 0.4220 0.0939 +vt 0.4142 0.0939 +vt 0.4142 0.0705 +vt 0.4221 0.0705 +vt 0.4220 0.0783 +vt 0.4142 0.0783 +vt 0.4299 0.0705 +vt 0.4377 0.0705 +vt 0.4377 0.0783 +vt 0.4299 0.0783 +vt 0.3830 0.0861 +vt 0.3908 0.0861 +vt 0.3908 0.0939 +vt 0.3830 0.0939 +vt 0.3830 0.0705 +vt 0.3908 0.0705 +vt 0.3908 0.0783 +vt 0.3830 0.0783 +vt 0.3986 0.0705 +vt 0.4064 0.0705 +vt 0.4064 0.0783 +vt 0.3986 0.0783 +vt 0.3830 0.1173 +vt 0.3908 0.1173 +vt 0.3908 0.1252 +vt 0.3830 0.1251 +vt 0.3830 0.1017 +vt 0.3908 0.1017 +vt 0.3908 0.1095 +vt 0.3830 0.1095 +vt 0.3986 0.1017 +vt 0.4064 0.1017 +vt 0.4064 0.1095 +vt 0.3986 0.1095 +vt 0.4143 0.0236 +vt 0.4221 0.0237 +vt 0.4221 0.0315 +vt 0.4143 0.0315 +vt 0.4143 0.0080 +vt 0.4221 0.0080 +vt 0.4221 0.0158 +vt 0.4143 0.0158 +vt 0.4299 0.0080 +vt 0.4377 0.0080 +vt 0.4377 0.0158 +vt 0.4299 0.0158 +vt 0.3830 0.0236 +vt 0.3908 0.0236 +vt 0.3908 0.0315 +vt 0.3830 0.0314 +vt 0.3830 0.0080 +vt 0.3908 0.0080 +vt 0.3908 0.0158 +vt 0.3830 0.0158 +vt 0.3986 0.0080 +vt 0.4065 0.0080 +vt 0.4065 0.0158 +vt 0.3986 0.0158 +vt 0.3830 0.0549 +vt 0.3908 0.0549 +vt 0.3908 0.0627 +vt 0.3830 0.0627 +vt 0.3830 0.0393 +vt 0.3908 0.0393 +vt 0.3908 0.0471 +vt 0.3830 0.0471 +vt 0.3986 0.0393 +vt 0.4064 0.0393 +vt 0.4064 0.0471 +vt 0.3986 0.0471 +vt 0.4767 0.0237 +vt 0.4845 0.0237 +vt 0.4845 0.0315 +vt 0.4767 0.0315 +vt 0.4767 0.0081 +vt 0.4845 0.0081 +vt 0.4845 0.0159 +vt 0.4767 0.0159 +vt 0.4923 0.0081 +vt 0.5002 0.0081 +vt 0.5002 0.0159 +vt 0.4923 0.0159 +vt 0.4455 0.0237 +vt 0.4533 0.0237 +vt 0.4533 0.0315 +vt 0.4455 0.0315 +vt 0.4455 0.0080 +vt 0.4533 0.0080 +vt 0.4533 0.0159 +vt 0.4455 0.0159 +vt 0.4611 0.0080 +vt 0.4689 0.0080 +vt 0.4689 0.0159 +vt 0.4611 0.0159 +vt 0.4455 0.0549 +vt 0.4533 0.0549 +vt 0.4533 0.0627 +vt 0.4455 0.0627 +vt 0.4455 0.0393 +vt 0.4533 0.0393 +vt 0.4533 0.0471 +vt 0.4455 0.0471 +vt 0.4611 0.0393 +vt 0.4689 0.0393 +vt 0.4689 0.0471 +vt 0.4611 0.0471 +vt 0.2893 0.0861 +vt 0.2971 0.0861 +vt 0.2971 0.0939 +vt 0.2893 0.0939 +vt 0.2893 0.0705 +vt 0.2971 0.0705 +vt 0.2971 0.0783 +vt 0.2893 0.0783 +vt 0.3049 0.0705 +vt 0.3127 0.0705 +vt 0.3127 0.0783 +vt 0.3049 0.0783 +vt 0.2581 0.0861 +vt 0.2659 0.0861 +vt 0.2659 0.0939 +vt 0.2581 0.0939 +vt 0.2581 0.0705 +vt 0.2659 0.0705 +vt 0.2659 0.0783 +vt 0.2581 0.0783 +vt 0.2737 0.0705 +vt 0.2815 0.0705 +vt 0.2815 0.0783 +vt 0.2737 0.0783 +vt 0.2581 0.1173 +vt 0.2659 0.1173 +vt 0.2659 0.1251 +vt 0.2581 0.1251 +vt 0.2581 0.1017 +vt 0.2659 0.1017 +vt 0.2659 0.1095 +vt 0.2581 0.1095 +vt 0.2737 0.1017 +vt 0.2815 0.1017 +vt 0.2815 0.1095 +vt 0.2737 0.1095 +vt 0.2893 0.0236 +vt 0.2971 0.0236 +vt 0.2971 0.0314 +vt 0.2893 0.0314 +vt 0.2893 0.0080 +vt 0.2971 0.0080 +vt 0.2971 0.0158 +vt 0.2893 0.0158 +vt 0.3049 0.0080 +vt 0.3128 0.0080 +vt 0.3128 0.0158 +vt 0.3049 0.0158 +vt 0.2581 0.0236 +vt 0.2659 0.0236 +vt 0.2659 0.0314 +vt 0.2581 0.0314 +vt 0.2581 0.0080 +vt 0.2659 0.0080 +vt 0.2659 0.0158 +vt 0.2581 0.0158 +vt 0.2737 0.0080 +vt 0.2815 0.0080 +vt 0.2815 0.0158 +vt 0.2737 0.0158 +vt 0.2581 0.0548 +vt 0.2659 0.0548 +vt 0.2659 0.0626 +vt 0.2581 0.0626 +vt 0.2581 0.0392 +vt 0.2659 0.0392 +vt 0.2659 0.0470 +vt 0.2581 0.0470 +vt 0.2737 0.0392 +vt 0.2815 0.0392 +vt 0.2815 0.0470 +vt 0.2737 0.0470 +vt 0.3518 0.0236 +vt 0.3596 0.0236 +vt 0.3596 0.0314 +vt 0.3518 0.0314 +vt 0.3518 0.0080 +vt 0.3596 0.0080 +vt 0.3596 0.0158 +vt 0.3518 0.0158 +vt 0.3674 0.0080 +vt 0.3752 0.0080 +vt 0.3752 0.0158 +vt 0.3674 0.0158 +vt 0.3206 0.0236 +vt 0.3284 0.0236 +vt 0.3284 0.0314 +vt 0.3206 0.0314 +vt 0.3206 0.0080 +vt 0.3284 0.0080 +vt 0.3284 0.0158 +vt 0.3206 0.0158 +vt 0.3362 0.0080 +vt 0.3440 0.0080 +vt 0.3440 0.0158 +vt 0.3362 0.0158 +vt 0.3205 0.0549 +vt 0.3284 0.0549 +vt 0.3284 0.0627 +vt 0.3205 0.0627 +vt 0.3206 0.0392 +vt 0.3284 0.0392 +vt 0.3284 0.0470 +vt 0.3205 0.0470 +vt 0.3362 0.0392 +vt 0.3440 0.0392 +vt 0.3440 0.0471 +vt 0.3362 0.0471 +vt 0.2893 0.2110 +vt 0.2971 0.2110 +vt 0.2971 0.2188 +vt 0.2893 0.2188 +vt 0.2893 0.1954 +vt 0.2971 0.1954 +vt 0.2971 0.2032 +vt 0.2893 0.2032 +vt 0.3049 0.1954 +vt 0.3127 0.1954 +vt 0.3127 0.2032 +vt 0.3049 0.2032 +vt 0.2580 0.2110 +vt 0.2658 0.2110 +vt 0.2658 0.2188 +vt 0.2580 0.2188 +vt 0.2580 0.1954 +vt 0.2658 0.1954 +vt 0.2658 0.2032 +vt 0.2580 0.2032 +vt 0.2737 0.1954 +vt 0.2815 0.1954 +vt 0.2815 0.2032 +vt 0.2737 0.2032 +vt 0.2580 0.2422 +vt 0.2658 0.2422 +vt 0.2658 0.2500 +vt 0.2580 0.2500 +vt 0.2580 0.2266 +vt 0.2658 0.2266 +vt 0.2658 0.2344 +vt 0.2580 0.2344 +vt 0.2736 0.2266 +vt 0.2815 0.2266 +vt 0.2815 0.2344 +vt 0.2736 0.2344 +vt 0.2893 0.1485 +vt 0.2971 0.1485 +vt 0.2971 0.1564 +vt 0.2893 0.1564 +vt 0.2893 0.1329 +vt 0.2971 0.1329 +vt 0.2971 0.1407 +vt 0.2893 0.1407 +vt 0.3049 0.1329 +vt 0.3127 0.1329 +vt 0.3127 0.1407 +vt 0.3049 0.1407 +vt 0.2581 0.1485 +vt 0.2659 0.1485 +vt 0.2659 0.1563 +vt 0.2581 0.1563 +vt 0.2581 0.1329 +vt 0.2659 0.1329 +vt 0.2659 0.1407 +vt 0.2581 0.1407 +vt 0.2737 0.1329 +vt 0.2815 0.1329 +vt 0.2815 0.1407 +vt 0.2737 0.1407 +vt 0.2580 0.1798 +vt 0.2659 0.1798 +vt 0.2658 0.1876 +vt 0.2580 0.1876 +vt 0.2580 0.1642 +vt 0.2659 0.1642 +vt 0.2659 0.1720 +vt 0.2580 0.1720 +vt 0.2737 0.1642 +vt 0.2815 0.1642 +vt 0.2815 0.1720 +vt 0.2737 0.1720 +vt 0.3518 0.1486 +vt 0.3596 0.1486 +vt 0.3596 0.1564 +vt 0.3517 0.1564 +vt 0.3518 0.1329 +vt 0.3596 0.1329 +vt 0.3596 0.1408 +vt 0.3518 0.1408 +vt 0.3674 0.1330 +vt 0.3752 0.1330 +vt 0.3752 0.1408 +vt 0.3674 0.1408 +vt 0.3205 0.1486 +vt 0.3283 0.1486 +vt 0.3283 0.1564 +vt 0.3205 0.1564 +vt 0.3205 0.1329 +vt 0.3283 0.1329 +vt 0.3283 0.1407 +vt 0.3205 0.1407 +vt 0.3361 0.1329 +vt 0.3439 0.1329 +vt 0.3439 0.1408 +vt 0.3361 0.1408 +vt 0.3205 0.1798 +vt 0.3283 0.1798 +vt 0.3283 0.1876 +vt 0.3205 0.1876 +vt 0.3205 0.1642 +vt 0.3283 0.1642 +vt 0.3283 0.1720 +vt 0.3205 0.1720 +vt 0.3361 0.1642 +vt 0.3439 0.1642 +vt 0.3439 0.1720 +vt 0.3361 0.1720 +vt 0.1641 0.8356 +vt 0.1719 0.8356 +vt 0.1719 0.8435 +vt 0.1641 0.8435 +vt 0.1641 0.8200 +vt 0.1719 0.8200 +vt 0.1719 0.8278 +vt 0.1641 0.8278 +vt 0.1798 0.8200 +vt 0.1876 0.8200 +vt 0.1876 0.8278 +vt 0.1798 0.8278 +vt 0.1329 0.8356 +vt 0.1407 0.8356 +vt 0.1407 0.8434 +vt 0.1329 0.8434 +vt 0.1329 0.8200 +vt 0.1407 0.8200 +vt 0.1407 0.8278 +vt 0.1329 0.8278 +vt 0.1485 0.8200 +vt 0.1563 0.8200 +vt 0.1563 0.8278 +vt 0.1485 0.8278 +vt 0.1329 0.8669 +vt 0.1407 0.8669 +vt 0.1407 0.8747 +vt 0.1329 0.8747 +vt 0.1329 0.8513 +vt 0.1407 0.8513 +vt 0.1407 0.8591 +vt 0.1329 0.8591 +vt 0.1485 0.8513 +vt 0.1563 0.8513 +vt 0.1563 0.8591 +vt 0.1485 0.8591 +vt 0.1642 0.7732 +vt 0.1720 0.7732 +vt 0.1720 0.7810 +vt 0.1642 0.7810 +vt 0.1642 0.7576 +vt 0.1720 0.7576 +vt 0.1720 0.7654 +vt 0.1642 0.7654 +vt 0.1798 0.7576 +vt 0.1876 0.7576 +vt 0.1876 0.7654 +vt 0.1798 0.7654 +vt 0.1329 0.7732 +vt 0.1407 0.7732 +vt 0.1407 0.7810 +vt 0.1329 0.7810 +vt 0.1329 0.7575 +vt 0.1407 0.7576 +vt 0.1407 0.7654 +vt 0.1329 0.7654 +vt 0.1485 0.7576 +vt 0.1563 0.7576 +vt 0.1563 0.7654 +vt 0.1485 0.7654 +vt 0.1329 0.8044 +vt 0.1407 0.8044 +vt 0.1407 0.8122 +vt 0.1329 0.8122 +vt 0.1329 0.7888 +vt 0.1407 0.7888 +vt 0.1407 0.7966 +vt 0.1329 0.7966 +vt 0.1485 0.7888 +vt 0.1563 0.7888 +vt 0.1563 0.7966 +vt 0.1485 0.7966 +vt 0.2266 0.7732 +vt 0.2344 0.7732 +vt 0.2344 0.7810 +vt 0.2266 0.7810 +vt 0.2266 0.7576 +vt 0.2344 0.7576 +vt 0.2344 0.7654 +vt 0.2266 0.7654 +vt 0.2422 0.7576 +vt 0.2501 0.7576 +vt 0.2500 0.7654 +vt 0.2422 0.7654 +vt 0.1954 0.7732 +vt 0.2032 0.7732 +vt 0.2032 0.7810 +vt 0.1954 0.7810 +vt 0.1954 0.7576 +vt 0.2032 0.7576 +vt 0.2032 0.7654 +vt 0.1954 0.7654 +vt 0.2110 0.7576 +vt 0.2188 0.7576 +vt 0.2188 0.7654 +vt 0.2110 0.7654 +vt 0.1954 0.8044 +vt 0.2032 0.8044 +vt 0.2032 0.8122 +vt 0.1954 0.8122 +vt 0.1954 0.7888 +vt 0.2032 0.7888 +vt 0.2032 0.7966 +vt 0.1954 0.7966 +vt 0.2110 0.7888 +vt 0.2188 0.7888 +vt 0.2188 0.7966 +vt 0.2110 0.7966 +vt 0.0392 0.8356 +vt 0.0470 0.8356 +vt 0.0470 0.8434 +vt 0.0392 0.8434 +vt 0.0392 0.8200 +vt 0.0470 0.8200 +vt 0.0470 0.8278 +vt 0.0392 0.8278 +vt 0.0548 0.8200 +vt 0.0626 0.8200 +vt 0.0626 0.8278 +vt 0.0548 0.8278 +vt 0.0080 0.8356 +vt 0.0158 0.8356 +vt 0.0158 0.8434 +vt 0.0080 0.8434 +vt 0.0080 0.8200 +vt 0.0158 0.8200 +vt 0.0158 0.8278 +vt 0.0080 0.8278 +vt 0.0236 0.8200 +vt 0.0314 0.8200 +vt 0.0314 0.8278 +vt 0.0236 0.8278 +vt 0.0080 0.8668 +vt 0.0158 0.8668 +vt 0.0158 0.8746 +vt 0.0079 0.8746 +vt 0.0080 0.8512 +vt 0.0158 0.8512 +vt 0.0158 0.8590 +vt 0.0080 0.8590 +vt 0.0236 0.8512 +vt 0.0314 0.8512 +vt 0.0314 0.8590 +vt 0.0236 0.8590 +vt 0.0392 0.7731 +vt 0.0470 0.7731 +vt 0.0470 0.7809 +vt 0.0392 0.7809 +vt 0.0392 0.7575 +vt 0.0470 0.7575 +vt 0.0470 0.7653 +vt 0.0392 0.7653 +vt 0.0548 0.7575 +vt 0.0626 0.7575 +vt 0.0626 0.7653 +vt 0.0548 0.7653 +vt 0.0080 0.7731 +vt 0.0158 0.7731 +vt 0.0158 0.7809 +vt 0.0080 0.7809 +vt 0.0080 0.7575 +vt 0.0158 0.7575 +vt 0.0158 0.7653 +vt 0.0080 0.7653 +vt 0.0236 0.7575 +vt 0.0314 0.7575 +vt 0.0314 0.7653 +vt 0.0236 0.7653 +vt 0.0080 0.8044 +vt 0.0158 0.8044 +vt 0.0158 0.8122 +vt 0.0080 0.8122 +vt 0.0080 0.7887 +vt 0.0158 0.7887 +vt 0.0158 0.7966 +vt 0.0080 0.7966 +vt 0.0236 0.7887 +vt 0.0314 0.7887 +vt 0.0314 0.7966 +vt 0.0236 0.7966 +vt 0.1017 0.7732 +vt 0.1095 0.7732 +vt 0.1095 0.7810 +vt 0.1017 0.7810 +vt 0.1017 0.7575 +vt 0.1095 0.7575 +vt 0.1095 0.7653 +vt 0.1017 0.7653 +vt 0.1173 0.7575 +vt 0.1251 0.7575 +vt 0.1251 0.7654 +vt 0.1173 0.7654 +vt 0.0705 0.7731 +vt 0.0783 0.7731 +vt 0.0783 0.7810 +vt 0.0704 0.7810 +vt 0.0705 0.7575 +vt 0.0783 0.7575 +vt 0.0783 0.7653 +vt 0.0705 0.7653 +vt 0.0861 0.7575 +vt 0.0939 0.7575 +vt 0.0939 0.7653 +vt 0.0861 0.7653 +vt 0.0704 0.8044 +vt 0.0782 0.8044 +vt 0.0782 0.8122 +vt 0.0704 0.8122 +vt 0.0704 0.7888 +vt 0.0783 0.7888 +vt 0.0783 0.7966 +vt 0.0704 0.7966 +vt 0.0861 0.7888 +vt 0.0939 0.7888 +vt 0.0939 0.7966 +vt 0.0861 0.7966 +vt 0.0392 0.9605 +vt 0.0470 0.9605 +vt 0.0470 0.9684 +vt 0.0392 0.9684 +vt 0.0392 0.9449 +vt 0.0470 0.9449 +vt 0.0470 0.9527 +vt 0.0392 0.9527 +vt 0.0548 0.9449 +vt 0.0626 0.9449 +vt 0.0626 0.9527 +vt 0.0548 0.9527 +vt 0.0079 0.9605 +vt 0.0157 0.9605 +vt 0.0157 0.9683 +vt 0.0079 0.9683 +vt 0.0079 0.9449 +vt 0.0157 0.9449 +vt 0.0157 0.9527 +vt 0.0079 0.9527 +vt 0.0235 0.9449 +vt 0.0314 0.9449 +vt 0.0313 0.9527 +vt 0.0235 0.9527 +vt 0.0079 0.9918 +vt 0.0157 0.9918 +vt 0.0157 0.9996 +vt 0.0079 0.9996 +vt 0.0079 0.9761 +vt 0.0157 0.9762 +vt 0.0157 0.9840 +vt 0.0079 0.9840 +vt 0.0235 0.9762 +vt 0.0313 0.9762 +vt 0.0313 0.9840 +vt 0.0235 0.9840 +vt 0.0392 0.8981 +vt 0.0470 0.8981 +vt 0.0470 0.9059 +vt 0.0392 0.9059 +vt 0.0392 0.8825 +vt 0.0470 0.8825 +vt 0.0470 0.8903 +vt 0.0392 0.8903 +vt 0.0548 0.8825 +vt 0.0626 0.8825 +vt 0.0626 0.8903 +vt 0.0548 0.8903 +vt 0.0079 0.8981 +vt 0.0157 0.8981 +vt 0.0157 0.9059 +vt 0.0079 0.9059 +vt 0.0079 0.8824 +vt 0.0158 0.8824 +vt 0.0158 0.8903 +vt 0.0079 0.8903 +vt 0.0236 0.8825 +vt 0.0314 0.8825 +vt 0.0314 0.8903 +vt 0.0236 0.8903 +vt 0.0079 0.9293 +vt 0.0157 0.9293 +vt 0.0157 0.9371 +vt 0.0079 0.9371 +vt 0.0079 0.9137 +vt 0.0157 0.9137 +vt 0.0157 0.9215 +vt 0.0079 0.9215 +vt 0.0236 0.9137 +vt 0.0314 0.9137 +vt 0.0314 0.9215 +vt 0.0236 0.9215 +vt 0.1016 0.8981 +vt 0.1095 0.8981 +vt 0.1095 0.9059 +vt 0.1016 0.9059 +vt 0.1016 0.8825 +vt 0.1095 0.8825 +vt 0.1095 0.8903 +vt 0.1016 0.8903 +vt 0.1173 0.8825 +vt 0.1251 0.8825 +vt 0.1251 0.8903 +vt 0.1173 0.8903 +vt 0.0704 0.8981 +vt 0.0782 0.8981 +vt 0.0782 0.9059 +vt 0.0704 0.9059 +vt 0.0704 0.8825 +vt 0.0782 0.8825 +vt 0.0782 0.8903 +vt 0.0704 0.8903 +vt 0.0860 0.8825 +vt 0.0938 0.8825 +vt 0.0938 0.8903 +vt 0.0860 0.8903 +vt 0.0704 0.9293 +vt 0.0782 0.9293 +vt 0.0782 0.9371 +vt 0.0704 0.9371 +vt 0.0704 0.9137 +vt 0.0782 0.9137 +vt 0.0782 0.9215 +vt 0.0704 0.9215 +vt 0.0860 0.9137 +vt 0.0938 0.9137 +vt 0.0938 0.9215 +vt 0.0860 0.9215 +vt 0.1642 0.5858 +vt 0.1720 0.5858 +vt 0.1720 0.5936 +vt 0.1642 0.5936 +vt 0.1642 0.5702 +vt 0.1720 0.5702 +vt 0.1720 0.5780 +vt 0.1642 0.5780 +vt 0.1798 0.5702 +vt 0.1876 0.5702 +vt 0.1876 0.5780 +vt 0.1798 0.5780 +vt 0.1330 0.5858 +vt 0.1408 0.5858 +vt 0.1408 0.5936 +vt 0.1330 0.5936 +vt 0.1330 0.5701 +vt 0.1408 0.5701 +vt 0.1408 0.5780 +vt 0.1330 0.5780 +vt 0.1486 0.5702 +vt 0.1564 0.5702 +vt 0.1564 0.5780 +vt 0.1486 0.5780 +vt 0.1330 0.6170 +vt 0.1408 0.6170 +vt 0.1408 0.6248 +vt 0.1330 0.6248 +vt 0.1330 0.6014 +vt 0.1408 0.6014 +vt 0.1408 0.6092 +vt 0.1330 0.6092 +vt 0.1486 0.6014 +vt 0.1564 0.6014 +vt 0.1564 0.6092 +vt 0.1486 0.6092 +vt 0.1642 0.5233 +vt 0.1720 0.5233 +vt 0.1720 0.5311 +vt 0.1642 0.5311 +vt 0.1642 0.5077 +vt 0.1720 0.5077 +vt 0.1720 0.5155 +vt 0.1642 0.5155 +vt 0.1799 0.5077 +vt 0.1877 0.5077 +vt 0.1877 0.5155 +vt 0.1799 0.5155 +vt 0.1330 0.5233 +vt 0.1408 0.5233 +vt 0.1408 0.5311 +vt 0.1330 0.5311 +vt 0.1330 0.5077 +vt 0.1408 0.5077 +vt 0.1408 0.5155 +vt 0.1330 0.5155 +vt 0.1486 0.5077 +vt 0.1564 0.5077 +vt 0.1564 0.5155 +vt 0.1486 0.5155 +vt 0.1330 0.5545 +vt 0.1408 0.5545 +vt 0.1408 0.5623 +vt 0.1330 0.5623 +vt 0.1330 0.5389 +vt 0.1408 0.5389 +vt 0.1408 0.5467 +vt 0.1330 0.5467 +vt 0.1486 0.5389 +vt 0.1564 0.5389 +vt 0.1564 0.5467 +vt 0.1486 0.5467 +vt 0.2267 0.5233 +vt 0.2345 0.5233 +vt 0.2345 0.5311 +vt 0.2267 0.5311 +vt 0.2267 0.5077 +vt 0.2345 0.5077 +vt 0.2345 0.5155 +vt 0.2267 0.5155 +vt 0.2423 0.5077 +vt 0.2501 0.5077 +vt 0.2501 0.5155 +vt 0.2423 0.5155 +vt 0.1955 0.5233 +vt 0.2033 0.5233 +vt 0.2033 0.5311 +vt 0.1955 0.5311 +vt 0.1955 0.5077 +vt 0.2033 0.5077 +vt 0.2033 0.5155 +vt 0.1955 0.5155 +vt 0.2111 0.5077 +vt 0.2189 0.5077 +vt 0.2189 0.5155 +vt 0.2111 0.5155 +vt 0.1955 0.5545 +vt 0.2033 0.5546 +vt 0.2033 0.5624 +vt 0.1955 0.5624 +vt 0.1955 0.5389 +vt 0.2033 0.5389 +vt 0.2033 0.5467 +vt 0.1955 0.5467 +vt 0.2111 0.5389 +vt 0.2189 0.5389 +vt 0.2189 0.5467 +vt 0.2111 0.5467 +vt 0.0393 0.5857 +vt 0.0471 0.5857 +vt 0.0471 0.5935 +vt 0.0393 0.5935 +vt 0.0393 0.5701 +vt 0.0471 0.5701 +vt 0.0471 0.5779 +vt 0.0393 0.5779 +vt 0.0549 0.5701 +vt 0.0627 0.5701 +vt 0.0627 0.5779 +vt 0.0549 0.5779 +vt 0.0080 0.5857 +vt 0.0159 0.5857 +vt 0.0158 0.5935 +vt 0.0080 0.5935 +vt 0.0080 0.5701 +vt 0.0159 0.5701 +vt 0.0159 0.5779 +vt 0.0080 0.5779 +vt 0.0237 0.5701 +vt 0.0315 0.5701 +vt 0.0315 0.5779 +vt 0.0237 0.5779 +vt 0.0080 0.6170 +vt 0.0158 0.6170 +vt 0.0158 0.6248 +vt 0.0080 0.6248 +vt 0.0080 0.6013 +vt 0.0158 0.6013 +vt 0.0158 0.6091 +vt 0.0080 0.6091 +vt 0.0237 0.6013 +vt 0.0315 0.6013 +vt 0.0315 0.6092 +vt 0.0237 0.6092 +vt 0.0393 0.5233 +vt 0.0471 0.5233 +vt 0.0471 0.5311 +vt 0.0393 0.5311 +vt 0.0393 0.5076 +vt 0.0471 0.5076 +vt 0.0471 0.5155 +vt 0.0393 0.5155 +vt 0.0549 0.5077 +vt 0.0627 0.5077 +vt 0.0627 0.5155 +vt 0.0549 0.5155 +vt 0.0081 0.5233 +vt 0.0159 0.5233 +vt 0.0159 0.5311 +vt 0.0081 0.5311 +vt 0.0081 0.5076 +vt 0.0159 0.5076 +vt 0.0159 0.5154 +vt 0.0081 0.5154 +vt 0.0237 0.5076 +vt 0.0315 0.5076 +vt 0.0315 0.5155 +vt 0.0237 0.5154 +vt 0.0081 0.5545 +vt 0.0159 0.5545 +vt 0.0159 0.5623 +vt 0.0081 0.5623 +vt 0.0081 0.5389 +vt 0.0159 0.5389 +vt 0.0159 0.5467 +vt 0.0081 0.5467 +vt 0.0237 0.5389 +vt 0.0315 0.5389 +vt 0.0315 0.5467 +vt 0.0237 0.5467 +vt 0.1018 0.5233 +vt 0.1096 0.5233 +vt 0.1096 0.5311 +vt 0.1018 0.5311 +vt 0.1018 0.5077 +vt 0.1096 0.5077 +vt 0.1096 0.5155 +vt 0.1018 0.5155 +vt 0.1174 0.5077 +vt 0.1252 0.5077 +vt 0.1252 0.5155 +vt 0.1174 0.5155 +vt 0.0705 0.5233 +vt 0.0783 0.5233 +vt 0.0783 0.5311 +vt 0.0705 0.5311 +vt 0.0705 0.5077 +vt 0.0783 0.5077 +vt 0.0783 0.5155 +vt 0.0705 0.5155 +vt 0.0862 0.5077 +vt 0.0940 0.5077 +vt 0.0940 0.5155 +vt 0.0862 0.5155 +vt 0.0705 0.5545 +vt 0.0783 0.5545 +vt 0.0783 0.5623 +vt 0.0705 0.5623 +vt 0.0705 0.5389 +vt 0.0783 0.5389 +vt 0.0783 0.5467 +vt 0.0705 0.5467 +vt 0.0861 0.5389 +vt 0.0940 0.5389 +vt 0.0939 0.5467 +vt 0.0861 0.5467 +vt 0.0392 0.7107 +vt 0.0470 0.7107 +vt 0.0470 0.7185 +vt 0.0392 0.7185 +vt 0.0392 0.6950 +vt 0.0471 0.6951 +vt 0.0470 0.7029 +vt 0.0392 0.7029 +vt 0.0549 0.6951 +vt 0.0627 0.6951 +vt 0.0627 0.7029 +vt 0.0549 0.7029 +vt 0.0080 0.7107 +vt 0.0158 0.7107 +vt 0.0158 0.7185 +vt 0.0080 0.7185 +vt 0.0080 0.6950 +vt 0.0158 0.6950 +vt 0.0158 0.7029 +vt 0.0080 0.7028 +vt 0.0236 0.6950 +vt 0.0314 0.6950 +vt 0.0314 0.7029 +vt 0.0236 0.7029 +vt 0.0080 0.7419 +vt 0.0158 0.7419 +vt 0.0158 0.7497 +vt 0.0080 0.7497 +vt 0.0080 0.7263 +vt 0.0158 0.7263 +vt 0.0158 0.7341 +vt 0.0080 0.7341 +vt 0.0236 0.7263 +vt 0.0314 0.7263 +vt 0.0314 0.7341 +vt 0.0236 0.7341 +vt 0.0393 0.6482 +vt 0.0471 0.6482 +vt 0.0471 0.6560 +vt 0.0393 0.6560 +vt 0.0393 0.6326 +vt 0.0471 0.6326 +vt 0.0471 0.6404 +vt 0.0393 0.6404 +vt 0.0549 0.6326 +vt 0.0627 0.6326 +vt 0.0627 0.6404 +vt 0.0549 0.6404 +vt 0.0080 0.6482 +vt 0.0158 0.6482 +vt 0.0158 0.6560 +vt 0.0080 0.6560 +vt 0.0080 0.6326 +vt 0.0158 0.6326 +vt 0.0158 0.6404 +vt 0.0080 0.6404 +vt 0.0236 0.6326 +vt 0.0315 0.6326 +vt 0.0315 0.6404 +vt 0.0236 0.6404 +vt 0.0080 0.6794 +vt 0.0158 0.6794 +vt 0.0158 0.6872 +vt 0.0080 0.6872 +vt 0.0080 0.6638 +vt 0.0158 0.6638 +vt 0.0158 0.6716 +vt 0.0080 0.6716 +vt 0.0236 0.6638 +vt 0.0314 0.6638 +vt 0.0314 0.6716 +vt 0.0236 0.6716 +vt 0.1017 0.6482 +vt 0.1095 0.6482 +vt 0.1095 0.6560 +vt 0.1017 0.6560 +vt 0.1017 0.6326 +vt 0.1095 0.6326 +vt 0.1095 0.6404 +vt 0.1017 0.6404 +vt 0.1173 0.6326 +vt 0.1252 0.6326 +vt 0.1252 0.6404 +vt 0.1173 0.6404 +vt 0.0705 0.6482 +vt 0.0783 0.6482 +vt 0.0783 0.6560 +vt 0.0705 0.6560 +vt 0.0705 0.6326 +vt 0.0783 0.6326 +vt 0.0783 0.6404 +vt 0.0705 0.6404 +vt 0.0861 0.6326 +vt 0.0939 0.6326 +vt 0.0939 0.6404 +vt 0.0861 0.6404 +vt 0.0705 0.6794 +vt 0.0783 0.6794 +vt 0.0783 0.6873 +vt 0.0705 0.6873 +vt 0.0705 0.6638 +vt 0.0783 0.6638 +vt 0.0783 0.6716 +vt 0.0705 0.6716 +vt 0.0861 0.6638 +vt 0.0939 0.6638 +vt 0.0939 0.6716 +vt 0.0861 0.6716 +vt 0.4141 0.5859 +vt 0.4219 0.5859 +vt 0.4219 0.5937 +vt 0.4141 0.5937 +vt 0.4141 0.5702 +vt 0.4219 0.5702 +vt 0.4219 0.5780 +vt 0.4141 0.5780 +vt 0.4297 0.5702 +vt 0.4375 0.5702 +vt 0.4375 0.5781 +vt 0.4297 0.5780 +vt 0.3828 0.5858 +vt 0.3907 0.5858 +vt 0.3907 0.5937 +vt 0.3828 0.5937 +vt 0.3829 0.5702 +vt 0.3907 0.5702 +vt 0.3907 0.5780 +vt 0.3829 0.5780 +vt 0.3985 0.5702 +vt 0.4063 0.5702 +vt 0.4063 0.5780 +vt 0.3985 0.5780 +vt 0.3828 0.6171 +vt 0.3906 0.6171 +vt 0.3906 0.6249 +vt 0.3828 0.6249 +vt 0.3828 0.6015 +vt 0.3907 0.6015 +vt 0.3906 0.6093 +vt 0.3828 0.6093 +vt 0.3985 0.6015 +vt 0.4063 0.6015 +vt 0.4063 0.6093 +vt 0.3985 0.6093 +vt 0.4141 0.5234 +vt 0.4219 0.5234 +vt 0.4219 0.5312 +vt 0.4141 0.5312 +vt 0.4141 0.5078 +vt 0.4219 0.5078 +vt 0.4219 0.5156 +vt 0.4141 0.5156 +vt 0.4297 0.5078 +vt 0.4375 0.5078 +vt 0.4375 0.5156 +vt 0.4297 0.5156 +vt 0.3829 0.5234 +vt 0.3907 0.5234 +vt 0.3907 0.5312 +vt 0.3829 0.5312 +vt 0.3829 0.5078 +vt 0.3907 0.5078 +vt 0.3907 0.5156 +vt 0.3829 0.5156 +vt 0.3985 0.5078 +vt 0.4063 0.5078 +vt 0.4063 0.5156 +vt 0.3985 0.5156 +vt 0.3829 0.5546 +vt 0.3907 0.5546 +vt 0.3907 0.5624 +vt 0.3829 0.5624 +vt 0.3829 0.5390 +vt 0.3907 0.5390 +vt 0.3907 0.5468 +vt 0.3829 0.5468 +vt 0.3985 0.5390 +vt 0.4063 0.5390 +vt 0.4063 0.5468 +vt 0.3985 0.5468 +vt 0.4766 0.5234 +vt 0.4844 0.5234 +vt 0.4844 0.5312 +vt 0.4766 0.5312 +vt 0.4766 0.5078 +vt 0.4844 0.5078 +vt 0.4844 0.5156 +vt 0.4766 0.5156 +vt 0.4922 0.5078 +vt 0.5000 0.5078 +vt 0.5000 0.5156 +vt 0.4922 0.5156 +vt 0.4453 0.5234 +vt 0.4531 0.5234 +vt 0.4531 0.5312 +vt 0.4453 0.5312 +vt 0.4453 0.5078 +vt 0.4531 0.5078 +vt 0.4531 0.5156 +vt 0.4453 0.5156 +vt 0.4610 0.5078 +vt 0.4688 0.5078 +vt 0.4688 0.5156 +vt 0.4610 0.5156 +vt 0.4453 0.5546 +vt 0.4531 0.5546 +vt 0.4531 0.5624 +vt 0.4453 0.5624 +vt 0.4453 0.5390 +vt 0.4531 0.5390 +vt 0.4531 0.5468 +vt 0.4453 0.5468 +vt 0.4609 0.5390 +vt 0.4688 0.5390 +vt 0.4688 0.5468 +vt 0.4609 0.5468 +vt 0.2891 0.5858 +vt 0.2970 0.5858 +vt 0.2970 0.5936 +vt 0.2891 0.5936 +vt 0.2892 0.5702 +vt 0.2970 0.5702 +vt 0.2970 0.5780 +vt 0.2892 0.5780 +vt 0.3048 0.5702 +vt 0.3126 0.5702 +vt 0.3126 0.5780 +vt 0.3048 0.5780 +vt 0.2579 0.5858 +vt 0.2657 0.5858 +vt 0.2657 0.5936 +vt 0.2579 0.5936 +vt 0.2579 0.5702 +vt 0.2657 0.5702 +vt 0.2657 0.5780 +vt 0.2579 0.5780 +vt 0.2735 0.5702 +vt 0.2813 0.5702 +vt 0.2813 0.5780 +vt 0.2735 0.5780 +vt 0.2579 0.6170 +vt 0.2657 0.6170 +vt 0.2657 0.6248 +vt 0.2579 0.6248 +vt 0.2579 0.6014 +vt 0.2657 0.6014 +vt 0.2657 0.6092 +vt 0.2579 0.6092 +vt 0.2735 0.6014 +vt 0.2813 0.6014 +vt 0.2813 0.6092 +vt 0.2735 0.6092 +vt 0.2892 0.5233 +vt 0.2970 0.5233 +vt 0.2970 0.5312 +vt 0.2892 0.5312 +vt 0.2892 0.5077 +vt 0.2970 0.5077 +vt 0.2970 0.5155 +vt 0.2892 0.5155 +vt 0.3048 0.5077 +vt 0.3126 0.5077 +vt 0.3126 0.5155 +vt 0.3048 0.5155 +vt 0.2579 0.5233 +vt 0.2657 0.5233 +vt 0.2657 0.5311 +vt 0.2579 0.5311 +vt 0.2579 0.5077 +vt 0.2657 0.5077 +vt 0.2657 0.5155 +vt 0.2579 0.5155 +vt 0.2736 0.5077 +vt 0.2814 0.5077 +vt 0.2814 0.5155 +vt 0.2736 0.5155 +vt 0.2579 0.5546 +vt 0.2657 0.5546 +vt 0.2657 0.5624 +vt 0.2579 0.5624 +vt 0.2579 0.5390 +vt 0.2657 0.5390 +vt 0.2657 0.5468 +vt 0.2579 0.5468 +vt 0.2735 0.5390 +vt 0.2814 0.5390 +vt 0.2814 0.5468 +vt 0.2735 0.5468 +vt 0.3516 0.5234 +vt 0.3594 0.5234 +vt 0.3594 0.5312 +vt 0.3516 0.5312 +vt 0.3516 0.5077 +vt 0.3594 0.5078 +vt 0.3594 0.5156 +vt 0.3516 0.5156 +vt 0.3673 0.5078 +vt 0.3751 0.5078 +vt 0.3751 0.5156 +vt 0.3673 0.5156 +vt 0.3204 0.5234 +vt 0.3282 0.5234 +vt 0.3282 0.5312 +vt 0.3204 0.5312 +vt 0.3204 0.5077 +vt 0.3282 0.5077 +vt 0.3282 0.5155 +vt 0.3204 0.5155 +vt 0.3360 0.5077 +vt 0.3438 0.5077 +vt 0.3438 0.5156 +vt 0.3360 0.5156 +vt 0.3204 0.5546 +vt 0.3282 0.5546 +vt 0.3282 0.5624 +vt 0.3204 0.5624 +vt 0.3204 0.5390 +vt 0.3282 0.5390 +vt 0.3282 0.5468 +vt 0.3204 0.5468 +vt 0.3360 0.5390 +vt 0.3438 0.5390 +vt 0.3438 0.5468 +vt 0.3360 0.5468 +vt 0.2891 0.7107 +vt 0.2969 0.7107 +vt 0.2969 0.7186 +vt 0.2891 0.7186 +vt 0.2891 0.6951 +vt 0.2969 0.6951 +vt 0.2969 0.7029 +vt 0.2891 0.7029 +vt 0.3047 0.6951 +vt 0.3125 0.6951 +vt 0.3125 0.7029 +vt 0.3047 0.7029 +vt 0.2579 0.7107 +vt 0.2657 0.7107 +vt 0.2657 0.7185 +vt 0.2579 0.7185 +vt 0.2579 0.6951 +vt 0.2657 0.6951 +vt 0.2657 0.7029 +vt 0.2579 0.7029 +vt 0.2735 0.6951 +vt 0.2813 0.6951 +vt 0.2813 0.7029 +vt 0.2735 0.7029 +vt 0.2579 0.7420 +vt 0.2657 0.7420 +vt 0.2657 0.7498 +vt 0.2579 0.7498 +vt 0.2579 0.7264 +vt 0.2657 0.7264 +vt 0.2657 0.7342 +vt 0.2579 0.7342 +vt 0.2735 0.7264 +vt 0.2813 0.7264 +vt 0.2813 0.7342 +vt 0.2735 0.7342 +vt 0.2891 0.6483 +vt 0.2969 0.6483 +vt 0.2969 0.6561 +vt 0.2891 0.6561 +vt 0.2891 0.6327 +vt 0.2969 0.6327 +vt 0.2969 0.6405 +vt 0.2891 0.6405 +vt 0.3047 0.6327 +vt 0.3126 0.6327 +vt 0.3126 0.6405 +vt 0.3047 0.6405 +vt 0.2579 0.6483 +vt 0.2657 0.6483 +vt 0.2657 0.6561 +vt 0.2579 0.6561 +vt 0.2579 0.6327 +vt 0.2657 0.6327 +vt 0.2657 0.6405 +vt 0.2579 0.6405 +vt 0.2735 0.6327 +vt 0.2813 0.6327 +vt 0.2813 0.6405 +vt 0.2735 0.6405 +vt 0.2579 0.6795 +vt 0.2657 0.6795 +vt 0.2657 0.6873 +vt 0.2579 0.6873 +vt 0.2579 0.6639 +vt 0.2657 0.6639 +vt 0.2657 0.6717 +vt 0.2579 0.6717 +vt 0.2735 0.6639 +vt 0.2813 0.6639 +vt 0.2813 0.6717 +vt 0.2735 0.6717 +vt 0.3516 0.6483 +vt 0.3594 0.6483 +vt 0.3594 0.6561 +vt 0.3516 0.6561 +vt 0.3516 0.6327 +vt 0.3594 0.6327 +vt 0.3594 0.6405 +vt 0.3516 0.6405 +vt 0.3672 0.6327 +vt 0.3750 0.6327 +vt 0.3750 0.6405 +vt 0.3672 0.6405 +vt 0.3204 0.6483 +vt 0.3282 0.6483 +vt 0.3282 0.6561 +vt 0.3204 0.6561 +vt 0.3204 0.6327 +vt 0.3282 0.6327 +vt 0.3282 0.6405 +vt 0.3204 0.6405 +vt 0.3360 0.6327 +vt 0.3438 0.6327 +vt 0.3438 0.6405 +vt 0.3360 0.6405 +vt 0.3204 0.6795 +vt 0.3282 0.6795 +vt 0.3282 0.6873 +vt 0.3203 0.6873 +vt 0.3204 0.6639 +vt 0.3282 0.6639 +vt 0.3282 0.6717 +vt 0.3204 0.6717 +vt 0.3360 0.6639 +vt 0.3438 0.6639 +vt 0.3438 0.6717 +vt 0.3360 0.6717 +vt 0.6639 0.8358 +vt 0.6717 0.8358 +vt 0.6717 0.8436 +vt 0.6639 0.8436 +vt 0.6639 0.8202 +vt 0.6717 0.8202 +vt 0.6717 0.8280 +vt 0.6639 0.8280 +vt 0.6795 0.8202 +vt 0.6873 0.8202 +vt 0.6873 0.8280 +vt 0.6795 0.8280 +vt 0.6326 0.8358 +vt 0.6404 0.8358 +vt 0.6404 0.8436 +vt 0.6326 0.8436 +vt 0.6326 0.8202 +vt 0.6405 0.8202 +vt 0.6405 0.8280 +vt 0.6326 0.8280 +vt 0.6483 0.8202 +vt 0.6561 0.8202 +vt 0.6561 0.8280 +vt 0.6483 0.8280 +vt 0.6326 0.8670 +vt 0.6404 0.8670 +vt 0.6404 0.8748 +vt 0.6326 0.8748 +vt 0.6326 0.8514 +vt 0.6404 0.8514 +vt 0.6404 0.8592 +vt 0.6326 0.8592 +vt 0.6483 0.8514 +vt 0.6561 0.8514 +vt 0.6561 0.8592 +vt 0.6482 0.8592 +vt 0.6639 0.7733 +vt 0.6717 0.7733 +vt 0.6717 0.7811 +vt 0.6639 0.7811 +vt 0.6639 0.7577 +vt 0.6717 0.7577 +vt 0.6717 0.7655 +vt 0.6639 0.7655 +vt 0.6795 0.7577 +vt 0.6873 0.7577 +vt 0.6873 0.7655 +vt 0.6795 0.7655 +vt 0.6327 0.7733 +vt 0.6405 0.7733 +vt 0.6405 0.7811 +vt 0.6327 0.7811 +vt 0.6327 0.7577 +vt 0.6405 0.7577 +vt 0.6405 0.7655 +vt 0.6327 0.7655 +vt 0.6483 0.7577 +vt 0.6561 0.7577 +vt 0.6561 0.7655 +vt 0.6483 0.7655 +vt 0.6326 0.8046 +vt 0.6405 0.8046 +vt 0.6405 0.8124 +vt 0.6326 0.8124 +vt 0.6327 0.7889 +vt 0.6405 0.7889 +vt 0.6405 0.7967 +vt 0.6327 0.7967 +vt 0.6483 0.7889 +vt 0.6561 0.7889 +vt 0.6561 0.7968 +vt 0.6483 0.7968 +vt 0.7264 0.7733 +vt 0.7342 0.7734 +vt 0.7342 0.7812 +vt 0.7264 0.7812 +vt 0.7264 0.7577 +vt 0.7342 0.7577 +vt 0.7342 0.7655 +vt 0.7264 0.7655 +vt 0.7420 0.7577 +vt 0.7498 0.7577 +vt 0.7498 0.7655 +vt 0.7420 0.7655 +vt 0.6951 0.7733 +vt 0.7029 0.7733 +vt 0.7029 0.7812 +vt 0.6951 0.7811 +vt 0.6951 0.7577 +vt 0.7029 0.7577 +vt 0.7029 0.7655 +vt 0.6951 0.7655 +vt 0.7107 0.7577 +vt 0.7186 0.7577 +vt 0.7186 0.7655 +vt 0.7107 0.7655 +vt 0.6951 0.8046 +vt 0.7029 0.8046 +vt 0.7029 0.8124 +vt 0.6951 0.8124 +vt 0.6951 0.7890 +vt 0.7029 0.7890 +vt 0.7029 0.7968 +vt 0.6951 0.7968 +vt 0.7107 0.7890 +vt 0.7185 0.7890 +vt 0.7185 0.7968 +vt 0.7107 0.7968 +vt 0.5389 0.8358 +vt 0.5467 0.8358 +vt 0.5467 0.8436 +vt 0.5389 0.8436 +vt 0.5389 0.8201 +vt 0.5468 0.8201 +vt 0.5468 0.8280 +vt 0.5389 0.8280 +vt 0.5546 0.8201 +vt 0.5624 0.8201 +vt 0.5624 0.8280 +vt 0.5546 0.8280 +vt 0.5077 0.8357 +vt 0.5155 0.8358 +vt 0.5155 0.8436 +vt 0.5077 0.8436 +vt 0.5077 0.8201 +vt 0.5155 0.8201 +vt 0.5155 0.8279 +vt 0.5077 0.8279 +vt 0.5233 0.8201 +vt 0.5311 0.8201 +vt 0.5311 0.8279 +vt 0.5233 0.8279 +vt 0.5077 0.8670 +vt 0.5155 0.8670 +vt 0.5155 0.8748 +vt 0.5077 0.8748 +vt 0.5077 0.8514 +vt 0.5155 0.8514 +vt 0.5155 0.8592 +vt 0.5077 0.8592 +vt 0.5233 0.8514 +vt 0.5311 0.8514 +vt 0.5311 0.8592 +vt 0.5233 0.8592 +vt 0.5390 0.7733 +vt 0.5468 0.7733 +vt 0.5468 0.7811 +vt 0.5390 0.7811 +vt 0.5390 0.7577 +vt 0.5468 0.7577 +vt 0.5468 0.7655 +vt 0.5390 0.7655 +vt 0.5546 0.7577 +vt 0.5624 0.7577 +vt 0.5624 0.7655 +vt 0.5546 0.7655 +vt 0.5077 0.7733 +vt 0.5155 0.7733 +vt 0.5155 0.7811 +vt 0.5077 0.7811 +vt 0.5077 0.7577 +vt 0.5155 0.7577 +vt 0.5155 0.7655 +vt 0.5077 0.7655 +vt 0.5233 0.7577 +vt 0.5312 0.7577 +vt 0.5312 0.7655 +vt 0.5233 0.7655 +vt 0.5077 0.8045 +vt 0.5155 0.8045 +vt 0.5155 0.8123 +vt 0.5077 0.8123 +vt 0.5077 0.7889 +vt 0.5155 0.7889 +vt 0.5155 0.7967 +vt 0.5077 0.7967 +vt 0.5233 0.7889 +vt 0.5311 0.7889 +vt 0.5311 0.7967 +vt 0.5233 0.7967 +vt 0.6014 0.7733 +vt 0.6092 0.7733 +vt 0.6092 0.7811 +vt 0.6014 0.7811 +vt 0.6014 0.7577 +vt 0.6092 0.7577 +vt 0.6092 0.7655 +vt 0.6014 0.7655 +vt 0.6170 0.7577 +vt 0.6249 0.7577 +vt 0.6249 0.7655 +vt 0.6170 0.7655 +vt 0.5702 0.7733 +vt 0.5780 0.7733 +vt 0.5780 0.7811 +vt 0.5702 0.7811 +vt 0.5702 0.7577 +vt 0.5780 0.7577 +vt 0.5780 0.7655 +vt 0.5702 0.7655 +vt 0.5858 0.7577 +vt 0.5936 0.7577 +vt 0.5936 0.7655 +vt 0.5858 0.7655 +vt 0.5702 0.8045 +vt 0.5780 0.8045 +vt 0.5780 0.8123 +vt 0.5702 0.8123 +vt 0.5702 0.7889 +vt 0.5780 0.7889 +vt 0.5780 0.7967 +vt 0.5702 0.7967 +vt 0.5858 0.7889 +vt 0.5936 0.7889 +vt 0.5936 0.7967 +vt 0.5858 0.7967 +vt 0.5389 0.9607 +vt 0.5467 0.9607 +vt 0.5467 0.9685 +vt 0.5389 0.9685 +vt 0.5389 0.9451 +vt 0.5467 0.9451 +vt 0.5467 0.9529 +vt 0.5389 0.9529 +vt 0.5545 0.9451 +vt 0.5623 0.9451 +vt 0.5623 0.9529 +vt 0.5545 0.9529 +vt 0.5077 0.9607 +vt 0.5155 0.9607 +vt 0.5155 0.9685 +vt 0.5077 0.9685 +vt 0.5077 0.9451 +vt 0.5155 0.9451 +vt 0.5155 0.9529 +vt 0.5077 0.9529 +vt 0.5233 0.9451 +vt 0.5311 0.9451 +vt 0.5311 0.9529 +vt 0.5233 0.9529 +vt 0.5077 0.9919 +vt 0.5155 0.9919 +vt 0.5155 0.9997 +vt 0.5077 0.9997 +vt 0.5077 0.9763 +vt 0.5155 0.9763 +vt 0.5155 0.9841 +vt 0.5077 0.9841 +vt 0.5233 0.9763 +vt 0.5311 0.9763 +vt 0.5311 0.9841 +vt 0.5233 0.9841 +vt 0.5389 0.8982 +vt 0.5467 0.8982 +vt 0.5467 0.9060 +vt 0.5389 0.9060 +vt 0.5389 0.8826 +vt 0.5467 0.8826 +vt 0.5467 0.8904 +vt 0.5389 0.8904 +vt 0.5545 0.8826 +vt 0.5624 0.8826 +vt 0.5623 0.8904 +vt 0.5545 0.8904 +vt 0.5077 0.8982 +vt 0.5155 0.8982 +vt 0.5155 0.9060 +vt 0.5077 0.9060 +vt 0.5077 0.8826 +vt 0.5155 0.8826 +vt 0.5155 0.8904 +vt 0.5077 0.8904 +vt 0.5233 0.8826 +vt 0.5311 0.8826 +vt 0.5311 0.8904 +vt 0.5233 0.8904 +vt 0.5077 0.9295 +vt 0.5155 0.9295 +vt 0.5155 0.9373 +vt 0.5077 0.9373 +vt 0.5077 0.9138 +vt 0.5155 0.9138 +vt 0.5155 0.9216 +vt 0.5077 0.9216 +vt 0.5233 0.9138 +vt 0.5311 0.9138 +vt 0.5311 0.9216 +vt 0.5233 0.9216 +vt 0.6014 0.8982 +vt 0.6092 0.8982 +vt 0.6092 0.9061 +vt 0.6014 0.9061 +vt 0.6014 0.8826 +vt 0.6092 0.8826 +vt 0.6092 0.8904 +vt 0.6014 0.8904 +vt 0.6170 0.8826 +vt 0.6248 0.8826 +vt 0.6248 0.8904 +vt 0.6170 0.8904 +vt 0.5702 0.8982 +vt 0.5780 0.8982 +vt 0.5780 0.9060 +vt 0.5702 0.9060 +vt 0.5702 0.8826 +vt 0.5780 0.8826 +vt 0.5780 0.8904 +vt 0.5702 0.8904 +vt 0.5858 0.8826 +vt 0.5936 0.8826 +vt 0.5936 0.8904 +vt 0.5858 0.8904 +vt 0.5701 0.9295 +vt 0.5780 0.9295 +vt 0.5780 0.9373 +vt 0.5701 0.9373 +vt 0.5701 0.9139 +vt 0.5780 0.9139 +vt 0.5780 0.9217 +vt 0.5701 0.9217 +vt 0.5858 0.9139 +vt 0.5936 0.9139 +vt 0.5936 0.9217 +vt 0.5858 0.9217 +vt 0.6640 0.5859 +vt 0.6718 0.5859 +vt 0.6718 0.5937 +vt 0.6639 0.5937 +vt 0.6640 0.5703 +vt 0.6718 0.5703 +vt 0.6718 0.5781 +vt 0.6640 0.5781 +vt 0.6796 0.5703 +vt 0.6874 0.5703 +vt 0.6874 0.5781 +vt 0.6796 0.5781 +vt 0.6327 0.5859 +vt 0.6405 0.5859 +vt 0.6405 0.5937 +vt 0.6327 0.5937 +vt 0.6327 0.5703 +vt 0.6405 0.5703 +vt 0.6405 0.5781 +vt 0.6327 0.5781 +vt 0.6483 0.5703 +vt 0.6561 0.5703 +vt 0.6561 0.5781 +vt 0.6483 0.5781 +vt 0.6327 0.6172 +vt 0.6405 0.6172 +vt 0.6405 0.6250 +vt 0.6327 0.6250 +vt 0.6327 0.6015 +vt 0.6405 0.6015 +vt 0.6405 0.6093 +vt 0.6327 0.6093 +vt 0.6483 0.6015 +vt 0.6561 0.6015 +vt 0.6561 0.6094 +vt 0.6483 0.6093 +vt 0.6640 0.5235 +vt 0.6718 0.5235 +vt 0.6718 0.5313 +vt 0.6640 0.5313 +vt 0.6640 0.5078 +vt 0.6718 0.5078 +vt 0.6718 0.5157 +vt 0.6640 0.5157 +vt 0.6796 0.5079 +vt 0.6874 0.5079 +vt 0.6874 0.5157 +vt 0.6796 0.5157 +vt 0.6327 0.5235 +vt 0.6405 0.5235 +vt 0.6405 0.5313 +vt 0.6327 0.5313 +vt 0.6327 0.5078 +vt 0.6406 0.5078 +vt 0.6405 0.5156 +vt 0.6327 0.5156 +vt 0.6484 0.5078 +vt 0.6562 0.5078 +vt 0.6562 0.5157 +vt 0.6484 0.5156 +vt 0.6327 0.5547 +vt 0.6405 0.5547 +vt 0.6405 0.5625 +vt 0.6327 0.5625 +vt 0.6327 0.5391 +vt 0.6405 0.5391 +vt 0.6405 0.5469 +vt 0.6327 0.5469 +vt 0.6483 0.5391 +vt 0.6562 0.5391 +vt 0.6562 0.5469 +vt 0.6483 0.5469 +vt 0.7264 0.5235 +vt 0.7342 0.5235 +vt 0.7342 0.5313 +vt 0.7264 0.5313 +vt 0.7264 0.5079 +vt 0.7343 0.5079 +vt 0.7342 0.5157 +vt 0.7264 0.5157 +vt 0.7421 0.5079 +vt 0.7499 0.5079 +vt 0.7499 0.5157 +vt 0.7421 0.5157 +vt 0.6952 0.5235 +vt 0.7030 0.5235 +vt 0.7030 0.5313 +vt 0.6952 0.5313 +vt 0.6952 0.5079 +vt 0.7030 0.5079 +vt 0.7030 0.5157 +vt 0.6952 0.5157 +vt 0.7108 0.5079 +vt 0.7186 0.5079 +vt 0.7186 0.5157 +vt 0.7108 0.5157 +vt 0.6952 0.5547 +vt 0.7030 0.5547 +vt 0.7030 0.5625 +vt 0.6952 0.5625 +vt 0.6952 0.5391 +vt 0.7030 0.5391 +vt 0.7030 0.5469 +vt 0.6952 0.5469 +vt 0.7108 0.5391 +vt 0.7186 0.5391 +vt 0.7186 0.5469 +vt 0.7108 0.5469 +vt 0.5390 0.5859 +vt 0.5468 0.5859 +vt 0.5468 0.5937 +vt 0.5390 0.5937 +vt 0.5390 0.5703 +vt 0.5468 0.5703 +vt 0.5468 0.5781 +vt 0.5390 0.5781 +vt 0.5546 0.5703 +vt 0.5624 0.5703 +vt 0.5624 0.5781 +vt 0.5546 0.5781 +vt 0.5078 0.5859 +vt 0.5156 0.5859 +vt 0.5156 0.5937 +vt 0.5078 0.5937 +vt 0.5078 0.5703 +vt 0.5156 0.5703 +vt 0.5156 0.5781 +vt 0.5078 0.5781 +vt 0.5234 0.5703 +vt 0.5312 0.5703 +vt 0.5312 0.5781 +vt 0.5234 0.5781 +vt 0.5078 0.6171 +vt 0.5156 0.6171 +vt 0.5156 0.6249 +vt 0.5078 0.6249 +vt 0.5078 0.6015 +vt 0.5156 0.6015 +vt 0.5156 0.6093 +vt 0.5078 0.6093 +vt 0.5234 0.6015 +vt 0.5312 0.6015 +vt 0.5312 0.6093 +vt 0.5234 0.6093 +vt 0.5390 0.5234 +vt 0.5468 0.5234 +vt 0.5468 0.5312 +vt 0.5390 0.5312 +vt 0.5390 0.5078 +vt 0.5468 0.5078 +vt 0.5468 0.5156 +vt 0.5390 0.5156 +vt 0.5547 0.5078 +vt 0.5625 0.5078 +vt 0.5625 0.5156 +vt 0.5547 0.5156 +vt 0.5078 0.5234 +vt 0.5156 0.5234 +vt 0.5156 0.5312 +vt 0.5078 0.5312 +vt 0.5078 0.5078 +vt 0.5156 0.5078 +vt 0.5156 0.5156 +vt 0.5078 0.5156 +vt 0.5234 0.5078 +vt 0.5312 0.5078 +vt 0.5312 0.5156 +vt 0.5234 0.5156 +vt 0.5078 0.5546 +vt 0.5156 0.5546 +vt 0.5156 0.5625 +vt 0.5078 0.5625 +vt 0.5078 0.5390 +vt 0.5156 0.5390 +vt 0.5156 0.5468 +vt 0.5078 0.5468 +vt 0.5234 0.5390 +vt 0.5312 0.5390 +vt 0.5312 0.5468 +vt 0.5234 0.5468 +vt 0.6015 0.5234 +vt 0.6093 0.5234 +vt 0.6093 0.5313 +vt 0.6015 0.5313 +vt 0.6015 0.5078 +vt 0.6093 0.5078 +vt 0.6093 0.5156 +vt 0.6015 0.5156 +vt 0.6171 0.5078 +vt 0.6249 0.5078 +vt 0.6249 0.5156 +vt 0.6171 0.5156 +vt 0.5703 0.5234 +vt 0.5781 0.5234 +vt 0.5781 0.5312 +vt 0.5703 0.5312 +vt 0.5703 0.5078 +vt 0.5781 0.5078 +vt 0.5781 0.5156 +vt 0.5703 0.5156 +vt 0.5859 0.5078 +vt 0.5937 0.5078 +vt 0.5937 0.5156 +vt 0.5859 0.5156 +vt 0.5703 0.5547 +vt 0.5781 0.5547 +vt 0.5781 0.5625 +vt 0.5703 0.5625 +vt 0.5703 0.5391 +vt 0.5781 0.5391 +vt 0.5781 0.5469 +vt 0.5703 0.5469 +vt 0.5859 0.5391 +vt 0.5937 0.5391 +vt 0.5937 0.5469 +vt 0.5859 0.5469 +vt 0.5390 0.7108 +vt 0.5468 0.7108 +vt 0.5468 0.7186 +vt 0.5390 0.7186 +vt 0.5390 0.6952 +vt 0.5468 0.6952 +vt 0.5468 0.7030 +vt 0.5390 0.7030 +vt 0.5546 0.6952 +vt 0.5624 0.6952 +vt 0.5624 0.7030 +vt 0.5546 0.7030 +vt 0.5077 0.7108 +vt 0.5156 0.7108 +vt 0.5156 0.7186 +vt 0.5077 0.7186 +vt 0.5077 0.6952 +vt 0.5156 0.6952 +vt 0.5156 0.7030 +vt 0.5077 0.7030 +vt 0.5234 0.6952 +vt 0.5312 0.6952 +vt 0.5312 0.7030 +vt 0.5234 0.7030 +vt 0.5077 0.7420 +vt 0.5155 0.7421 +vt 0.5155 0.7499 +vt 0.5077 0.7499 +vt 0.5077 0.7264 +vt 0.5155 0.7264 +vt 0.5155 0.7342 +vt 0.5077 0.7342 +vt 0.5234 0.7264 +vt 0.5312 0.7264 +vt 0.5312 0.7342 +vt 0.5234 0.7342 +vt 0.5390 0.6484 +vt 0.5468 0.6484 +vt 0.5468 0.6562 +vt 0.5390 0.6562 +vt 0.5390 0.6327 +vt 0.5468 0.6327 +vt 0.5468 0.6406 +vt 0.5390 0.6405 +vt 0.5546 0.6327 +vt 0.5624 0.6327 +vt 0.5624 0.6406 +vt 0.5546 0.6406 +vt 0.5078 0.6483 +vt 0.5156 0.6484 +vt 0.5156 0.6562 +vt 0.5078 0.6562 +vt 0.5078 0.6327 +vt 0.5156 0.6327 +vt 0.5156 0.6405 +vt 0.5078 0.6405 +vt 0.5234 0.6327 +vt 0.5312 0.6327 +vt 0.5312 0.6405 +vt 0.5234 0.6405 +vt 0.5078 0.6796 +vt 0.5156 0.6796 +vt 0.5156 0.6874 +vt 0.5078 0.6874 +vt 0.5078 0.6640 +vt 0.5156 0.6640 +vt 0.5156 0.6718 +vt 0.5078 0.6718 +vt 0.5234 0.6640 +vt 0.5312 0.6640 +vt 0.5312 0.6718 +vt 0.5234 0.6718 +vt 0.6015 0.6484 +vt 0.6093 0.6484 +vt 0.6093 0.6562 +vt 0.6015 0.6562 +vt 0.6015 0.6328 +vt 0.6093 0.6328 +vt 0.6093 0.6406 +vt 0.6015 0.6406 +vt 0.6171 0.6328 +vt 0.6249 0.6328 +vt 0.6249 0.6406 +vt 0.6171 0.6406 +vt 0.5702 0.6484 +vt 0.5780 0.6484 +vt 0.5780 0.6562 +vt 0.5702 0.6562 +vt 0.5702 0.6328 +vt 0.5780 0.6328 +vt 0.5780 0.6406 +vt 0.5702 0.6406 +vt 0.5859 0.6328 +vt 0.5937 0.6328 +vt 0.5937 0.6406 +vt 0.5858 0.6406 +vt 0.5702 0.6796 +vt 0.5780 0.6796 +vt 0.5780 0.6874 +vt 0.5702 0.6874 +vt 0.5702 0.6640 +vt 0.5780 0.6640 +vt 0.5780 0.6718 +vt 0.5702 0.6718 +vt 0.5858 0.6640 +vt 0.5937 0.6640 +vt 0.5936 0.6718 +vt 0.5858 0.6718 +vt 0.9138 0.5860 +vt 0.9216 0.5860 +vt 0.9216 0.5938 +vt 0.9138 0.5938 +vt 0.9138 0.5704 +vt 0.9216 0.5704 +vt 0.9216 0.5782 +vt 0.9138 0.5782 +vt 0.9294 0.5704 +vt 0.9372 0.5704 +vt 0.9372 0.5782 +vt 0.9294 0.5782 +vt 0.8826 0.5860 +vt 0.8904 0.5860 +vt 0.8904 0.5938 +vt 0.8826 0.5938 +vt 0.8826 0.5704 +vt 0.8904 0.5704 +vt 0.8904 0.5782 +vt 0.8826 0.5782 +vt 0.8982 0.5704 +vt 0.9060 0.5704 +vt 0.9060 0.5782 +vt 0.8982 0.5782 +vt 0.8826 0.6172 +vt 0.8904 0.6172 +vt 0.8904 0.6250 +vt 0.8826 0.6250 +vt 0.8826 0.6016 +vt 0.8904 0.6016 +vt 0.8904 0.6094 +vt 0.8826 0.6094 +vt 0.8982 0.6016 +vt 0.9060 0.6016 +vt 0.9060 0.6094 +vt 0.8982 0.6094 +vt 0.9138 0.5235 +vt 0.9216 0.5235 +vt 0.9216 0.5314 +vt 0.9138 0.5314 +vt 0.9138 0.5079 +vt 0.9217 0.5079 +vt 0.9216 0.5157 +vt 0.9138 0.5157 +vt 0.9295 0.5079 +vt 0.9373 0.5079 +vt 0.9373 0.5157 +vt 0.9295 0.5157 +vt 0.8826 0.5235 +vt 0.8904 0.5235 +vt 0.8904 0.5313 +vt 0.8826 0.5313 +vt 0.8826 0.5079 +vt 0.8904 0.5079 +vt 0.8904 0.5157 +vt 0.8826 0.5157 +vt 0.8982 0.5079 +vt 0.9060 0.5079 +vt 0.9060 0.5157 +vt 0.8982 0.5157 +vt 0.8826 0.5548 +vt 0.8904 0.5548 +vt 0.8904 0.5626 +vt 0.8826 0.5626 +vt 0.8826 0.5391 +vt 0.8904 0.5392 +vt 0.8904 0.5470 +vt 0.8826 0.5470 +vt 0.8982 0.5392 +vt 0.9060 0.5392 +vt 0.9060 0.5470 +vt 0.8982 0.5470 +vt 0.9763 0.5236 +vt 0.9841 0.5236 +vt 0.9841 0.5314 +vt 0.9763 0.5314 +vt 0.9763 0.5079 +vt 0.9841 0.5079 +vt 0.9841 0.5158 +vt 0.9763 0.5158 +vt 0.9919 0.5080 +vt 0.9997 0.5080 +vt 0.9997 0.5158 +vt 0.9919 0.5158 +vt 0.9451 0.5236 +vt 0.9529 0.5236 +vt 0.9529 0.5314 +vt 0.9451 0.5314 +vt 0.9451 0.5079 +vt 0.9529 0.5079 +vt 0.9529 0.5157 +vt 0.9451 0.5157 +vt 0.9607 0.5079 +vt 0.9685 0.5079 +vt 0.9685 0.5158 +vt 0.9607 0.5157 +vt 0.9451 0.5548 +vt 0.9529 0.5548 +vt 0.9529 0.5626 +vt 0.9451 0.5626 +vt 0.9451 0.5392 +vt 0.9529 0.5392 +vt 0.9529 0.5470 +vt 0.9451 0.5470 +vt 0.9607 0.5392 +vt 0.9685 0.5392 +vt 0.9685 0.5470 +vt 0.9607 0.5470 +vt 0.7889 0.5860 +vt 0.7967 0.5860 +vt 0.7967 0.5938 +vt 0.7889 0.5938 +vt 0.7889 0.5704 +vt 0.7967 0.5704 +vt 0.7967 0.5782 +vt 0.7889 0.5782 +vt 0.8045 0.5704 +vt 0.8123 0.5704 +vt 0.8123 0.5782 +vt 0.8045 0.5782 +vt 0.7577 0.5860 +vt 0.7655 0.5860 +vt 0.7655 0.5938 +vt 0.7576 0.5938 +vt 0.7577 0.5703 +vt 0.7655 0.5703 +vt 0.7655 0.5782 +vt 0.7577 0.5782 +vt 0.7733 0.5703 +vt 0.7811 0.5703 +vt 0.7811 0.5782 +vt 0.7733 0.5782 +vt 0.7576 0.6172 +vt 0.7654 0.6172 +vt 0.7654 0.6250 +vt 0.7576 0.6250 +vt 0.7576 0.6016 +vt 0.7655 0.6016 +vt 0.7655 0.6094 +vt 0.7576 0.6094 +vt 0.7733 0.6016 +vt 0.7811 0.6016 +vt 0.7811 0.6094 +vt 0.7733 0.6094 +vt 0.7889 0.5235 +vt 0.7967 0.5235 +vt 0.7967 0.5313 +vt 0.7889 0.5313 +vt 0.7889 0.5079 +vt 0.7967 0.5079 +vt 0.7967 0.5157 +vt 0.7889 0.5157 +vt 0.8045 0.5079 +vt 0.8123 0.5079 +vt 0.8123 0.5157 +vt 0.8045 0.5157 +vt 0.7577 0.5235 +vt 0.7655 0.5235 +vt 0.7655 0.5313 +vt 0.7577 0.5313 +vt 0.7577 0.5079 +vt 0.7655 0.5079 +vt 0.7655 0.5157 +vt 0.7577 0.5157 +vt 0.7733 0.5079 +vt 0.7811 0.5079 +vt 0.7811 0.5157 +vt 0.7733 0.5157 +vt 0.7577 0.5547 +vt 0.7655 0.5547 +vt 0.7655 0.5625 +vt 0.7577 0.5625 +vt 0.7577 0.5391 +vt 0.7655 0.5391 +vt 0.7655 0.5469 +vt 0.7577 0.5469 +vt 0.7733 0.5391 +vt 0.7811 0.5391 +vt 0.7811 0.5469 +vt 0.7733 0.5469 +vt 0.8514 0.5235 +vt 0.8592 0.5235 +vt 0.8592 0.5313 +vt 0.8514 0.5313 +vt 0.8514 0.5079 +vt 0.8592 0.5079 +vt 0.8592 0.5157 +vt 0.8514 0.5157 +vt 0.8670 0.5079 +vt 0.8748 0.5079 +vt 0.8748 0.5157 +vt 0.8670 0.5157 +vt 0.8201 0.5235 +vt 0.8279 0.5235 +vt 0.8279 0.5313 +vt 0.8201 0.5313 +vt 0.8201 0.5079 +vt 0.8280 0.5079 +vt 0.8279 0.5157 +vt 0.8201 0.5157 +vt 0.8358 0.5079 +vt 0.8436 0.5079 +vt 0.8436 0.5157 +vt 0.8358 0.5157 +vt 0.8201 0.5547 +vt 0.8279 0.5547 +vt 0.8279 0.5626 +vt 0.8201 0.5626 +vt 0.8201 0.5391 +vt 0.8279 0.5391 +vt 0.8279 0.5469 +vt 0.8201 0.5469 +vt 0.8357 0.5391 +vt 0.8436 0.5391 +vt 0.8436 0.5469 +vt 0.8357 0.5469 +vt 0.7888 0.7109 +vt 0.7967 0.7109 +vt 0.7967 0.7187 +vt 0.7888 0.7187 +vt 0.7888 0.6953 +vt 0.7967 0.6953 +vt 0.7967 0.7031 +vt 0.7888 0.7031 +vt 0.8045 0.6953 +vt 0.8123 0.6953 +vt 0.8123 0.7031 +vt 0.8045 0.7031 +vt 0.7576 0.7109 +vt 0.7654 0.7109 +vt 0.7654 0.7187 +vt 0.7576 0.7187 +vt 0.7576 0.6953 +vt 0.7654 0.6953 +vt 0.7654 0.7031 +vt 0.7576 0.7031 +vt 0.7732 0.6953 +vt 0.7810 0.6953 +vt 0.7810 0.7031 +vt 0.7732 0.7031 +vt 0.7576 0.7421 +vt 0.7654 0.7421 +vt 0.7654 0.7499 +vt 0.7576 0.7499 +vt 0.7576 0.7265 +vt 0.7654 0.7265 +vt 0.7654 0.7343 +vt 0.7576 0.7343 +vt 0.7732 0.7265 +vt 0.7810 0.7265 +vt 0.7810 0.7343 +vt 0.7732 0.7343 +vt 0.7889 0.6484 +vt 0.7967 0.6484 +vt 0.7967 0.6562 +vt 0.7889 0.6562 +vt 0.7889 0.6328 +vt 0.7967 0.6328 +vt 0.7967 0.6406 +vt 0.7889 0.6406 +vt 0.8045 0.6328 +vt 0.8123 0.6328 +vt 0.8123 0.6406 +vt 0.8045 0.6406 +vt 0.7576 0.6484 +vt 0.7654 0.6484 +vt 0.7654 0.6562 +vt 0.7576 0.6562 +vt 0.7576 0.6328 +vt 0.7654 0.6328 +vt 0.7654 0.6406 +vt 0.7576 0.6406 +vt 0.7733 0.6328 +vt 0.7811 0.6328 +vt 0.7811 0.6406 +vt 0.7733 0.6406 +vt 0.7576 0.6797 +vt 0.7654 0.6797 +vt 0.7654 0.6875 +vt 0.7576 0.6875 +vt 0.7576 0.6640 +vt 0.7654 0.6640 +vt 0.7654 0.6719 +vt 0.7576 0.6719 +vt 0.7732 0.6640 +vt 0.7811 0.6641 +vt 0.7810 0.6719 +vt 0.7732 0.6719 +vt 0.8513 0.6485 +vt 0.8591 0.6485 +vt 0.8591 0.6563 +vt 0.8513 0.6563 +vt 0.8513 0.6328 +vt 0.8591 0.6328 +vt 0.8591 0.6406 +vt 0.8513 0.6406 +vt 0.8670 0.6328 +vt 0.8748 0.6328 +vt 0.8748 0.6407 +vt 0.8670 0.6407 +vt 0.8201 0.6484 +vt 0.8279 0.6484 +vt 0.8279 0.6563 +vt 0.8201 0.6563 +vt 0.8201 0.6328 +vt 0.8279 0.6328 +vt 0.8279 0.6406 +vt 0.8201 0.6406 +vt 0.8357 0.6328 +vt 0.8435 0.6328 +vt 0.8435 0.6406 +vt 0.8357 0.6406 +vt 0.8201 0.6797 +vt 0.8279 0.6797 +vt 0.8279 0.6875 +vt 0.8201 0.6875 +vt 0.8201 0.6641 +vt 0.8279 0.6641 +vt 0.8279 0.6719 +vt 0.8201 0.6719 +vt 0.8357 0.6641 +vt 0.8435 0.6641 +vt 0.8435 0.6719 +vt 0.8357 0.6719 +vt 0.9138 0.7109 +vt 0.9216 0.7109 +vt 0.9216 0.7188 +vt 0.9138 0.7188 +vt 0.9138 0.6953 +vt 0.9216 0.6953 +vt 0.9216 0.7031 +vt 0.9138 0.7031 +vt 0.9294 0.6953 +vt 0.9372 0.6953 +vt 0.9372 0.7031 +vt 0.9294 0.7031 +vt 0.8825 0.7109 +vt 0.8904 0.7109 +vt 0.8904 0.7187 +vt 0.8825 0.7187 +vt 0.8825 0.6953 +vt 0.8904 0.6953 +vt 0.8904 0.7031 +vt 0.8825 0.7031 +vt 0.8982 0.6953 +vt 0.9060 0.6953 +vt 0.9060 0.7031 +vt 0.8982 0.7031 +vt 0.8825 0.7422 +vt 0.8903 0.7422 +vt 0.8903 0.7500 +vt 0.8825 0.7500 +vt 0.8825 0.7265 +vt 0.8903 0.7266 +vt 0.8903 0.7344 +vt 0.8825 0.7344 +vt 0.8982 0.7266 +vt 0.9060 0.7266 +vt 0.9060 0.7344 +vt 0.8982 0.7344 +vt 0.9138 0.6485 +vt 0.9216 0.6485 +vt 0.9216 0.6563 +vt 0.9138 0.6563 +vt 0.9138 0.6329 +vt 0.9216 0.6329 +vt 0.9216 0.6407 +vt 0.9138 0.6407 +vt 0.9294 0.6329 +vt 0.9372 0.6329 +vt 0.9372 0.6407 +vt 0.9294 0.6407 +vt 0.8826 0.6485 +vt 0.8904 0.6485 +vt 0.8904 0.6563 +vt 0.8826 0.6563 +vt 0.8826 0.6328 +vt 0.8904 0.6329 +vt 0.8904 0.6407 +vt 0.8826 0.6407 +vt 0.8982 0.6329 +vt 0.9060 0.6329 +vt 0.9060 0.6407 +vt 0.8982 0.6407 +vt 0.8826 0.6797 +vt 0.8904 0.6797 +vt 0.8904 0.6875 +vt 0.8826 0.6875 +vt 0.8826 0.6641 +vt 0.8904 0.6641 +vt 0.8904 0.6719 +vt 0.8826 0.6719 +vt 0.8982 0.6641 +vt 0.9060 0.6641 +vt 0.9060 0.6719 +vt 0.8982 0.6719 +vt 0.9763 0.6485 +vt 0.9841 0.6485 +vt 0.9841 0.6563 +vt 0.9763 0.6563 +vt 0.9763 0.6329 +vt 0.9841 0.6329 +vt 0.9841 0.6407 +vt 0.9763 0.6407 +vt 0.9919 0.6329 +vt 0.9997 0.6329 +vt 0.9997 0.6407 +vt 0.9919 0.6407 +vt 0.9450 0.6485 +vt 0.9528 0.6485 +vt 0.9528 0.6563 +vt 0.9450 0.6563 +vt 0.9450 0.6329 +vt 0.9528 0.6329 +vt 0.9528 0.6407 +vt 0.9450 0.6407 +vt 0.9607 0.6329 +vt 0.9685 0.6329 +vt 0.9685 0.6407 +vt 0.9607 0.6407 +vt 0.9450 0.6797 +vt 0.9528 0.6797 +vt 0.9528 0.6875 +vt 0.9450 0.6875 +vt 0.9450 0.6641 +vt 0.9528 0.6641 +vt 0.9528 0.6719 +vt 0.9450 0.6719 +vt 0.9606 0.6641 +vt 0.9685 0.6641 +vt 0.9684 0.6719 +vt 0.9606 0.6719 +vt 0.6639 0.7109 +vt 0.6717 0.7109 +vt 0.6717 0.7187 +vt 0.6639 0.7187 +vt 0.6639 0.6952 +vt 0.6717 0.6952 +vt 0.6717 0.7031 +vt 0.6639 0.7031 +vt 0.6795 0.6953 +vt 0.6873 0.6953 +vt 0.6873 0.7031 +vt 0.6795 0.7031 +vt 0.6327 0.7109 +vt 0.6405 0.7109 +vt 0.6405 0.7187 +vt 0.6327 0.7187 +vt 0.6327 0.6952 +vt 0.6405 0.6952 +vt 0.6405 0.7030 +vt 0.6327 0.7030 +vt 0.6483 0.6952 +vt 0.6561 0.6952 +vt 0.6561 0.7031 +vt 0.6483 0.7031 +vt 0.6327 0.7421 +vt 0.6405 0.7421 +vt 0.6405 0.7499 +vt 0.6327 0.7499 +vt 0.6327 0.7265 +vt 0.6405 0.7265 +vt 0.6405 0.7343 +vt 0.6327 0.7343 +vt 0.6483 0.7265 +vt 0.6561 0.7265 +vt 0.6561 0.7343 +vt 0.6483 0.7343 +vt 0.6639 0.6484 +vt 0.6717 0.6484 +vt 0.6717 0.6562 +vt 0.6639 0.6562 +vt 0.6639 0.6328 +vt 0.6717 0.6328 +vt 0.6717 0.6406 +vt 0.6639 0.6406 +vt 0.6796 0.6328 +vt 0.6874 0.6328 +vt 0.6874 0.6406 +vt 0.6796 0.6406 +vt 0.6327 0.6484 +vt 0.6405 0.6484 +vt 0.6405 0.6562 +vt 0.6327 0.6562 +vt 0.6327 0.6328 +vt 0.6405 0.6328 +vt 0.6405 0.6406 +vt 0.6327 0.6406 +vt 0.6483 0.6328 +vt 0.6561 0.6328 +vt 0.6561 0.6406 +vt 0.6483 0.6406 +vt 0.6327 0.6796 +vt 0.6405 0.6796 +vt 0.6405 0.6874 +vt 0.6327 0.6874 +vt 0.6327 0.6640 +vt 0.6405 0.6640 +vt 0.6405 0.6718 +vt 0.6327 0.6718 +vt 0.6483 0.6640 +vt 0.6561 0.6640 +vt 0.6561 0.6718 +vt 0.6483 0.6718 +vt 0.7264 0.6484 +vt 0.7342 0.6484 +vt 0.7342 0.6562 +vt 0.7264 0.6562 +vt 0.7264 0.6328 +vt 0.7342 0.6328 +vt 0.7342 0.6406 +vt 0.7264 0.6406 +vt 0.7420 0.6328 +vt 0.7498 0.6328 +vt 0.7498 0.6406 +vt 0.7420 0.6406 +vt 0.6952 0.6484 +vt 0.7030 0.6484 +vt 0.7030 0.6562 +vt 0.6952 0.6562 +vt 0.6952 0.6328 +vt 0.7030 0.6328 +vt 0.7030 0.6406 +vt 0.6952 0.6406 +vt 0.7108 0.6328 +vt 0.7186 0.6328 +vt 0.7186 0.6406 +vt 0.7108 0.6406 +vt 0.6952 0.6796 +vt 0.7030 0.6796 +vt 0.7030 0.6875 +vt 0.6952 0.6874 +vt 0.6952 0.6640 +vt 0.7030 0.6640 +vt 0.7030 0.6718 +vt 0.6952 0.6718 +vt 0.7108 0.6640 +vt 0.7186 0.6640 +vt 0.7186 0.6718 +vt 0.7108 0.6718 +vt 0.6638 0.9607 +vt 0.6716 0.9607 +vt 0.6716 0.9685 +vt 0.6638 0.9685 +vt 0.6638 0.9451 +vt 0.6716 0.9451 +vt 0.6716 0.9529 +vt 0.6638 0.9529 +vt 0.6795 0.9451 +vt 0.6873 0.9451 +vt 0.6873 0.9529 +vt 0.6795 0.9529 +vt 0.6326 0.9607 +vt 0.6404 0.9607 +vt 0.6404 0.9685 +vt 0.6326 0.9685 +vt 0.6326 0.9451 +vt 0.6404 0.9451 +vt 0.6404 0.9529 +vt 0.6326 0.9529 +vt 0.6482 0.9451 +vt 0.6560 0.9451 +vt 0.6560 0.9529 +vt 0.6482 0.9529 +vt 0.6326 0.9920 +vt 0.6404 0.9920 +vt 0.6404 0.9998 +vt 0.6326 0.9998 +vt 0.6326 0.9763 +vt 0.6404 0.9763 +vt 0.6404 0.9841 +vt 0.6326 0.9841 +vt 0.6482 0.9763 +vt 0.6560 0.9763 +vt 0.6560 0.9842 +vt 0.6482 0.9842 +vt 0.6639 0.8983 +vt 0.6717 0.8983 +vt 0.6717 0.9061 +vt 0.6639 0.9061 +vt 0.6639 0.8826 +vt 0.6717 0.8826 +vt 0.6717 0.8905 +vt 0.6639 0.8905 +vt 0.6795 0.8827 +vt 0.6873 0.8827 +vt 0.6873 0.8905 +vt 0.6795 0.8905 +vt 0.6326 0.8983 +vt 0.6404 0.8983 +vt 0.6404 0.9061 +vt 0.6326 0.9061 +vt 0.6326 0.8826 +vt 0.6404 0.8826 +vt 0.6404 0.8904 +vt 0.6326 0.8904 +vt 0.6482 0.8826 +vt 0.6561 0.8826 +vt 0.6560 0.8905 +vt 0.6482 0.8905 +vt 0.6326 0.9295 +vt 0.6404 0.9295 +vt 0.6404 0.9373 +vt 0.6326 0.9373 +vt 0.6326 0.9139 +vt 0.6404 0.9139 +vt 0.6404 0.9217 +vt 0.6326 0.9217 +vt 0.6482 0.9139 +vt 0.6560 0.9139 +vt 0.6560 0.9217 +vt 0.6482 0.9217 +vt 0.7263 0.8983 +vt 0.7341 0.8983 +vt 0.7341 0.9061 +vt 0.7263 0.9061 +vt 0.7263 0.8827 +vt 0.7341 0.8827 +vt 0.7341 0.8905 +vt 0.7263 0.8905 +vt 0.7419 0.8827 +vt 0.7498 0.8827 +vt 0.7497 0.8905 +vt 0.7419 0.8905 +vt 0.6951 0.8983 +vt 0.7029 0.8983 +vt 0.7029 0.9061 +vt 0.6951 0.9061 +vt 0.6951 0.8827 +vt 0.7029 0.8827 +vt 0.7029 0.8905 +vt 0.6951 0.8905 +vt 0.7107 0.8827 +vt 0.7185 0.8827 +vt 0.7185 0.8905 +vt 0.7107 0.8905 +vt 0.6951 0.9295 +vt 0.7029 0.9295 +vt 0.7029 0.9373 +vt 0.6951 0.9373 +vt 0.6951 0.9139 +vt 0.7029 0.9139 +vt 0.7029 0.9217 +vt 0.6951 0.9217 +vt 0.7107 0.9139 +vt 0.7185 0.9139 +vt 0.7185 0.9217 +vt 0.7107 0.9217 +vt 0.4140 0.7108 +vt 0.4219 0.7108 +vt 0.4218 0.7186 +vt 0.4140 0.7186 +vt 0.4140 0.6952 +vt 0.4219 0.6952 +vt 0.4219 0.7030 +vt 0.4140 0.7030 +vt 0.4297 0.6952 +vt 0.4375 0.6952 +vt 0.4375 0.7030 +vt 0.4297 0.7030 +vt 0.3828 0.7108 +vt 0.3906 0.7108 +vt 0.3906 0.7186 +vt 0.3828 0.7186 +vt 0.3828 0.6952 +vt 0.3906 0.6952 +vt 0.3906 0.7030 +vt 0.3828 0.7030 +vt 0.3984 0.6952 +vt 0.4062 0.6952 +vt 0.4062 0.7030 +vt 0.3984 0.7030 +vt 0.3828 0.7420 +vt 0.3906 0.7420 +vt 0.3906 0.7498 +vt 0.3828 0.7498 +vt 0.3828 0.7264 +vt 0.3906 0.7264 +vt 0.3906 0.7342 +vt 0.3828 0.7342 +vt 0.3984 0.7264 +vt 0.4062 0.7264 +vt 0.4062 0.7342 +vt 0.3984 0.7342 +vt 0.4141 0.6483 +vt 0.4219 0.6483 +vt 0.4219 0.6561 +vt 0.4141 0.6561 +vt 0.4141 0.6327 +vt 0.4219 0.6327 +vt 0.4219 0.6405 +vt 0.4141 0.6405 +vt 0.4297 0.6327 +vt 0.4375 0.6327 +vt 0.4375 0.6405 +vt 0.4297 0.6405 +vt 0.3828 0.6483 +vt 0.3906 0.6483 +vt 0.3906 0.6561 +vt 0.3828 0.6561 +vt 0.3828 0.6327 +vt 0.3906 0.6327 +vt 0.3906 0.6405 +vt 0.3828 0.6405 +vt 0.3985 0.6327 +vt 0.4063 0.6327 +vt 0.4063 0.6405 +vt 0.3984 0.6405 +vt 0.3828 0.6795 +vt 0.3906 0.6795 +vt 0.3906 0.6874 +vt 0.3828 0.6874 +vt 0.3828 0.6639 +vt 0.3906 0.6639 +vt 0.3906 0.6717 +vt 0.3828 0.6717 +vt 0.3984 0.6639 +vt 0.4062 0.6639 +vt 0.4062 0.6717 +vt 0.3984 0.6717 +vt 0.4765 0.6483 +vt 0.4843 0.6483 +vt 0.4843 0.6561 +vt 0.4765 0.6561 +vt 0.4765 0.6327 +vt 0.4843 0.6327 +vt 0.4843 0.6405 +vt 0.4765 0.6405 +vt 0.4922 0.6327 +vt 0.5000 0.6327 +vt 0.5000 0.6405 +vt 0.4921 0.6405 +vt 0.4453 0.6483 +vt 0.4531 0.6483 +vt 0.4531 0.6561 +vt 0.4453 0.6561 +vt 0.4453 0.6327 +vt 0.4531 0.6327 +vt 0.4531 0.6405 +vt 0.4453 0.6405 +vt 0.4609 0.6327 +vt 0.4687 0.6327 +vt 0.4687 0.6405 +vt 0.4609 0.6405 +vt 0.4453 0.6796 +vt 0.4531 0.6796 +vt 0.4531 0.6874 +vt 0.4453 0.6874 +vt 0.4453 0.6639 +vt 0.4531 0.6639 +vt 0.4531 0.6718 +vt 0.4453 0.6718 +vt 0.4609 0.6640 +vt 0.4687 0.6640 +vt 0.4687 0.6718 +vt 0.4609 0.6718 +vt 0.1642 0.7107 +vt 0.1720 0.7107 +vt 0.1720 0.7185 +vt 0.1642 0.7185 +vt 0.1642 0.6951 +vt 0.1720 0.6951 +vt 0.1720 0.7029 +vt 0.1642 0.7029 +vt 0.1798 0.6951 +vt 0.1876 0.6951 +vt 0.1876 0.7029 +vt 0.1798 0.7029 +vt 0.1329 0.7107 +vt 0.1407 0.7107 +vt 0.1407 0.7185 +vt 0.1329 0.7185 +vt 0.1329 0.6951 +vt 0.1408 0.6951 +vt 0.1407 0.7029 +vt 0.1329 0.7029 +vt 0.1486 0.6951 +vt 0.1564 0.6951 +vt 0.1564 0.7029 +vt 0.1486 0.7029 +vt 0.1329 0.7419 +vt 0.1407 0.7419 +vt 0.1407 0.7497 +vt 0.1329 0.7497 +vt 0.1329 0.7263 +vt 0.1407 0.7263 +vt 0.1407 0.7341 +vt 0.1329 0.7341 +vt 0.1486 0.7263 +vt 0.1564 0.7263 +vt 0.1564 0.7341 +vt 0.1485 0.7341 +vt 0.1642 0.6482 +vt 0.1720 0.6482 +vt 0.1720 0.6561 +vt 0.1642 0.6560 +vt 0.1642 0.6326 +vt 0.1720 0.6326 +vt 0.1720 0.6404 +vt 0.1642 0.6404 +vt 0.1798 0.6326 +vt 0.1876 0.6326 +vt 0.1876 0.6404 +vt 0.1798 0.6404 +vt 0.1330 0.6482 +vt 0.1408 0.6482 +vt 0.1408 0.6560 +vt 0.1330 0.6560 +vt 0.1330 0.6326 +vt 0.1408 0.6326 +vt 0.1408 0.6404 +vt 0.1330 0.6404 +vt 0.1486 0.6326 +vt 0.1564 0.6326 +vt 0.1564 0.6404 +vt 0.1486 0.6404 +vt 0.1329 0.6795 +vt 0.1408 0.6795 +vt 0.1408 0.6873 +vt 0.1329 0.6873 +vt 0.1330 0.6638 +vt 0.1408 0.6638 +vt 0.1408 0.6717 +vt 0.1330 0.6717 +vt 0.1486 0.6639 +vt 0.1564 0.6639 +vt 0.1564 0.6717 +vt 0.1486 0.6717 +vt 0.2267 0.6483 +vt 0.2345 0.6483 +vt 0.2345 0.6561 +vt 0.2267 0.6561 +vt 0.2267 0.6326 +vt 0.2345 0.6326 +vt 0.2345 0.6405 +vt 0.2267 0.6405 +vt 0.2423 0.6326 +vt 0.2501 0.6327 +vt 0.2501 0.6405 +vt 0.2423 0.6405 +vt 0.1954 0.6482 +vt 0.2032 0.6483 +vt 0.2032 0.6561 +vt 0.1954 0.6561 +vt 0.1954 0.6326 +vt 0.2032 0.6326 +vt 0.2032 0.6404 +vt 0.1954 0.6404 +vt 0.2110 0.6326 +vt 0.2189 0.6326 +vt 0.2189 0.6404 +vt 0.2110 0.6404 +vt 0.1954 0.6795 +vt 0.2032 0.6795 +vt 0.2032 0.6873 +vt 0.1954 0.6873 +vt 0.1954 0.6639 +vt 0.2032 0.6639 +vt 0.2032 0.6717 +vt 0.1954 0.6717 +vt 0.2110 0.6639 +vt 0.2188 0.6639 +vt 0.2188 0.6717 +vt 0.2110 0.6717 +vt 0.1641 0.9606 +vt 0.1719 0.9606 +vt 0.1719 0.9684 +vt 0.1641 0.9684 +vt 0.1641 0.9450 +vt 0.1719 0.9450 +vt 0.1719 0.9528 +vt 0.1641 0.9528 +vt 0.1797 0.9450 +vt 0.1875 0.9450 +vt 0.1875 0.9528 +vt 0.1797 0.9528 +vt 0.1329 0.9606 +vt 0.1407 0.9606 +vt 0.1407 0.9684 +vt 0.1329 0.9684 +vt 0.1329 0.9450 +vt 0.1407 0.9450 +vt 0.1407 0.9528 +vt 0.1329 0.9528 +vt 0.1485 0.9450 +vt 0.1563 0.9450 +vt 0.1563 0.9528 +vt 0.1485 0.9528 +vt 0.1328 0.9918 +vt 0.1407 0.9918 +vt 0.1407 0.9996 +vt 0.1328 0.9996 +vt 0.1329 0.9762 +vt 0.1407 0.9762 +vt 0.1407 0.9840 +vt 0.1329 0.9840 +vt 0.1485 0.9762 +vt 0.1563 0.9762 +vt 0.1563 0.9840 +vt 0.1485 0.9840 +vt 0.1641 0.8981 +vt 0.1719 0.8981 +vt 0.1719 0.9059 +vt 0.1641 0.9059 +vt 0.1641 0.8825 +vt 0.1719 0.8825 +vt 0.1719 0.8903 +vt 0.1641 0.8903 +vt 0.1797 0.8825 +vt 0.1875 0.8825 +vt 0.1875 0.8903 +vt 0.1797 0.8903 +vt 0.1329 0.8981 +vt 0.1407 0.8981 +vt 0.1407 0.9059 +vt 0.1329 0.9059 +vt 0.1329 0.8825 +vt 0.1407 0.8825 +vt 0.1407 0.8903 +vt 0.1329 0.8903 +vt 0.1485 0.8825 +vt 0.1563 0.8825 +vt 0.1563 0.8903 +vt 0.1485 0.8903 +vt 0.1329 0.9293 +vt 0.1407 0.9293 +vt 0.1407 0.9371 +vt 0.1329 0.9371 +vt 0.1329 0.9137 +vt 0.1407 0.9137 +vt 0.1407 0.9215 +vt 0.1329 0.9215 +vt 0.1485 0.9137 +vt 0.1563 0.9137 +vt 0.1563 0.9215 +vt 0.1485 0.9215 +vt 0.2266 0.8981 +vt 0.2344 0.8981 +vt 0.2344 0.9059 +vt 0.2266 0.9059 +vt 0.2266 0.8825 +vt 0.2344 0.8825 +vt 0.2344 0.8903 +vt 0.2266 0.8903 +vt 0.2422 0.8825 +vt 0.2500 0.8825 +vt 0.2500 0.8903 +vt 0.2422 0.8903 +vt 0.1953 0.8981 +vt 0.2032 0.8981 +vt 0.2032 0.9059 +vt 0.1953 0.9059 +vt 0.1954 0.8825 +vt 0.2032 0.8825 +vt 0.2032 0.8903 +vt 0.1953 0.8903 +vt 0.2110 0.8825 +vt 0.2188 0.8825 +vt 0.2188 0.8903 +vt 0.2110 0.8903 +vt 0.1953 0.9294 +vt 0.2031 0.9294 +vt 0.2031 0.9372 +vt 0.1953 0.9372 +vt 0.1953 0.9137 +vt 0.2032 0.9137 +vt 0.2031 0.9216 +vt 0.1953 0.9215 +vt 0.2110 0.9137 +vt 0.2188 0.9137 +vt 0.2188 0.9216 +vt 0.2110 0.9216 +vt 0.4142 0.2110 +vt 0.4220 0.2111 +vt 0.4220 0.2189 +vt 0.4142 0.2189 +vt 0.4142 0.1954 +vt 0.4220 0.1954 +vt 0.4220 0.2032 +vt 0.4142 0.2032 +vt 0.4298 0.1954 +vt 0.4376 0.1954 +vt 0.4376 0.2032 +vt 0.4298 0.2032 +vt 0.3830 0.2110 +vt 0.3908 0.2110 +vt 0.3908 0.2189 +vt 0.3830 0.2188 +vt 0.3830 0.1954 +vt 0.3908 0.1954 +vt 0.3908 0.2032 +vt 0.3830 0.2032 +vt 0.3986 0.1954 +vt 0.4064 0.1954 +vt 0.4064 0.2032 +vt 0.3986 0.2032 +vt 0.3830 0.2423 +vt 0.3908 0.2423 +vt 0.3908 0.2501 +vt 0.3830 0.2501 +vt 0.3830 0.2267 +vt 0.3908 0.2267 +vt 0.3908 0.2345 +vt 0.3830 0.2345 +vt 0.3986 0.2267 +vt 0.4064 0.2267 +vt 0.4064 0.2345 +vt 0.3986 0.2345 +vt 0.4142 0.1486 +vt 0.4220 0.1486 +vt 0.4220 0.1564 +vt 0.4142 0.1564 +vt 0.4142 0.1330 +vt 0.4220 0.1330 +vt 0.4220 0.1408 +vt 0.4142 0.1408 +vt 0.4298 0.1330 +vt 0.4376 0.1330 +vt 0.4376 0.1408 +vt 0.4298 0.1408 +vt 0.3830 0.1486 +vt 0.3908 0.1486 +vt 0.3908 0.1564 +vt 0.3830 0.1564 +vt 0.3830 0.1330 +vt 0.3908 0.1330 +vt 0.3908 0.1408 +vt 0.3830 0.1408 +vt 0.3986 0.1330 +vt 0.4064 0.1330 +vt 0.4064 0.1408 +vt 0.3986 0.1408 +vt 0.3830 0.1798 +vt 0.3908 0.1798 +vt 0.3908 0.1876 +vt 0.3830 0.1876 +vt 0.3830 0.1642 +vt 0.3908 0.1642 +vt 0.3908 0.1720 +vt 0.3830 0.1720 +vt 0.3986 0.1642 +vt 0.4064 0.1642 +vt 0.4064 0.1720 +vt 0.3986 0.1720 +vt 0.4767 0.1486 +vt 0.4845 0.1486 +vt 0.4845 0.1564 +vt 0.4767 0.1564 +vt 0.4767 0.1330 +vt 0.4845 0.1330 +vt 0.4845 0.1408 +vt 0.4767 0.1408 +vt 0.4923 0.1330 +vt 0.5001 0.1330 +vt 0.5001 0.1408 +vt 0.4923 0.1408 +vt 0.4455 0.1486 +vt 0.4533 0.1486 +vt 0.4533 0.1564 +vt 0.4454 0.1564 +vt 0.4455 0.1330 +vt 0.4533 0.1330 +vt 0.4533 0.1408 +vt 0.4455 0.1408 +vt 0.4611 0.1330 +vt 0.4689 0.1330 +vt 0.4689 0.1408 +vt 0.4611 0.1408 +vt 0.4454 0.1798 +vt 0.4533 0.1798 +vt 0.4532 0.1876 +vt 0.4454 0.1876 +vt 0.4454 0.1642 +vt 0.4533 0.1642 +vt 0.4533 0.1720 +vt 0.4454 0.1720 +vt 0.4611 0.1642 +vt 0.4689 0.1642 +vt 0.4689 0.1720 +vt 0.4611 0.1720 +vt 0.1643 0.2110 +vt 0.1721 0.2110 +vt 0.1721 0.2188 +vt 0.1643 0.2188 +vt 0.1643 0.1954 +vt 0.1721 0.1954 +vt 0.1721 0.2032 +vt 0.1643 0.2032 +vt 0.1800 0.1954 +vt 0.1878 0.1954 +vt 0.1878 0.2032 +vt 0.1800 0.2032 +vt 0.1331 0.2110 +vt 0.1409 0.2110 +vt 0.1409 0.2188 +vt 0.1331 0.2188 +vt 0.1331 0.1953 +vt 0.1409 0.1953 +vt 0.1409 0.2032 +vt 0.1331 0.2032 +vt 0.1487 0.1954 +vt 0.1565 0.1954 +vt 0.1565 0.2032 +vt 0.1487 0.2032 +vt 0.1331 0.2422 +vt 0.1409 0.2422 +vt 0.1409 0.2500 +vt 0.1331 0.2500 +vt 0.1331 0.2266 +vt 0.1409 0.2266 +vt 0.1409 0.2344 +vt 0.1331 0.2344 +vt 0.1487 0.2266 +vt 0.1565 0.2266 +vt 0.1565 0.2344 +vt 0.1487 0.2344 +vt 0.1644 0.1485 +vt 0.1722 0.1485 +vt 0.1722 0.1563 +vt 0.1644 0.1563 +vt 0.1644 0.1329 +vt 0.1722 0.1329 +vt 0.1722 0.1407 +vt 0.1644 0.1407 +vt 0.1800 0.1329 +vt 0.1878 0.1329 +vt 0.1878 0.1407 +vt 0.1800 0.1407 +vt 0.1331 0.1485 +vt 0.1409 0.1485 +vt 0.1409 0.1563 +vt 0.1331 0.1563 +vt 0.1331 0.1329 +vt 0.1409 0.1329 +vt 0.1409 0.1407 +vt 0.1331 0.1407 +vt 0.1487 0.1329 +vt 0.1566 0.1329 +vt 0.1565 0.1407 +vt 0.1487 0.1407 +vt 0.1331 0.1797 +vt 0.1409 0.1797 +vt 0.1409 0.1875 +vt 0.1331 0.1875 +vt 0.1331 0.1641 +vt 0.1409 0.1641 +vt 0.1409 0.1719 +vt 0.1331 0.1719 +vt 0.1487 0.1641 +vt 0.1565 0.1641 +vt 0.1565 0.1719 +vt 0.1487 0.1719 +vt 0.2268 0.1485 +vt 0.2346 0.1485 +vt 0.2346 0.1563 +vt 0.2268 0.1563 +vt 0.2268 0.1329 +vt 0.2346 0.1329 +vt 0.2346 0.1407 +vt 0.2268 0.1407 +vt 0.2424 0.1329 +vt 0.2502 0.1329 +vt 0.2502 0.1407 +vt 0.2424 0.1407 +vt 0.1956 0.1485 +vt 0.2034 0.1485 +vt 0.2034 0.1563 +vt 0.1956 0.1563 +vt 0.1956 0.1329 +vt 0.2034 0.1329 +vt 0.2034 0.1407 +vt 0.1956 0.1407 +vt 0.2112 0.1329 +vt 0.2190 0.1329 +vt 0.2190 0.1407 +vt 0.2112 0.1407 +vt 0.1956 0.1797 +vt 0.2034 0.1798 +vt 0.2034 0.1876 +vt 0.1956 0.1876 +vt 0.1956 0.1641 +vt 0.2034 0.1641 +vt 0.2034 0.1719 +vt 0.1956 0.1719 +vt 0.2112 0.1641 +vt 0.2190 0.1641 +vt 0.2190 0.1719 +vt 0.2112 0.1719 +vt 0.1643 0.4608 +vt 0.1721 0.4608 +vt 0.1721 0.4686 +vt 0.1643 0.4686 +vt 0.1643 0.4452 +vt 0.1721 0.4452 +vt 0.1721 0.4530 +vt 0.1643 0.4530 +vt 0.1799 0.4452 +vt 0.1877 0.4452 +vt 0.1877 0.4530 +vt 0.1799 0.4530 +vt 0.1330 0.4608 +vt 0.1408 0.4608 +vt 0.1408 0.4686 +vt 0.1330 0.4686 +vt 0.1330 0.4452 +vt 0.1408 0.4452 +vt 0.1408 0.4530 +vt 0.1330 0.4530 +vt 0.1486 0.4452 +vt 0.1565 0.4452 +vt 0.1564 0.4530 +vt 0.1486 0.4530 +vt 0.1330 0.4921 +vt 0.1408 0.4921 +vt 0.1408 0.4999 +vt 0.1330 0.4999 +vt 0.1330 0.4764 +vt 0.1408 0.4764 +vt 0.1408 0.4843 +vt 0.1330 0.4843 +vt 0.1486 0.4764 +vt 0.1564 0.4765 +vt 0.1564 0.4843 +vt 0.1486 0.4843 +vt 0.1643 0.3984 +vt 0.1721 0.3984 +vt 0.1721 0.4062 +vt 0.1643 0.4062 +vt 0.1643 0.3828 +vt 0.1721 0.3828 +vt 0.1721 0.3906 +vt 0.1643 0.3906 +vt 0.1799 0.3828 +vt 0.1877 0.3828 +vt 0.1877 0.3906 +vt 0.1799 0.3906 +vt 0.1330 0.3984 +vt 0.1408 0.3984 +vt 0.1408 0.4062 +vt 0.1330 0.4062 +vt 0.1330 0.3827 +vt 0.1409 0.3827 +vt 0.1409 0.3906 +vt 0.1330 0.3906 +vt 0.1487 0.3827 +vt 0.1565 0.3828 +vt 0.1565 0.3906 +vt 0.1487 0.3906 +vt 0.1330 0.4296 +vt 0.1408 0.4296 +vt 0.1408 0.4374 +vt 0.1330 0.4374 +vt 0.1330 0.4140 +vt 0.1408 0.4140 +vt 0.1408 0.4218 +vt 0.1330 0.4218 +vt 0.1487 0.4140 +vt 0.1565 0.4140 +vt 0.1565 0.4218 +vt 0.1486 0.4218 +vt 0.2267 0.3984 +vt 0.2345 0.3984 +vt 0.2345 0.4062 +vt 0.2267 0.4062 +vt 0.2267 0.3828 +vt 0.2346 0.3828 +vt 0.2346 0.3906 +vt 0.2267 0.3906 +vt 0.2424 0.3828 +vt 0.2502 0.3828 +vt 0.2502 0.3906 +vt 0.2424 0.3906 +vt 0.1955 0.3984 +vt 0.2033 0.3984 +vt 0.2033 0.4062 +vt 0.1955 0.4062 +vt 0.1955 0.3828 +vt 0.2033 0.3828 +vt 0.2033 0.3906 +vt 0.1955 0.3906 +vt 0.2111 0.3828 +vt 0.2189 0.3828 +vt 0.2189 0.3906 +vt 0.2111 0.3906 +vt 0.1955 0.4296 +vt 0.2033 0.4296 +vt 0.2033 0.4374 +vt 0.1955 0.4374 +vt 0.1955 0.4140 +vt 0.2033 0.4140 +vt 0.2033 0.4218 +vt 0.1955 0.4218 +vt 0.2111 0.4140 +vt 0.2189 0.4140 +vt 0.2189 0.4218 +vt 0.2111 0.4218 +vt 0.9139 0.2112 +vt 0.9217 0.2112 +vt 0.9217 0.2190 +vt 0.9139 0.2190 +vt 0.9139 0.1956 +vt 0.9218 0.1956 +vt 0.9218 0.2034 +vt 0.9139 0.2034 +vt 0.9296 0.1956 +vt 0.9374 0.1956 +vt 0.9374 0.2034 +vt 0.9296 0.2034 +vt 0.8827 0.2112 +vt 0.8905 0.2112 +vt 0.8905 0.2190 +vt 0.8827 0.2190 +vt 0.8827 0.1956 +vt 0.8905 0.1956 +vt 0.8905 0.2034 +vt 0.8827 0.2034 +vt 0.8983 0.1956 +vt 0.9061 0.1956 +vt 0.9061 0.2034 +vt 0.8983 0.2034 +vt 0.8827 0.2424 +vt 0.8905 0.2424 +vt 0.8905 0.2502 +vt 0.8827 0.2502 +vt 0.8827 0.2268 +vt 0.8905 0.2268 +vt 0.8905 0.2346 +vt 0.8827 0.2346 +vt 0.8983 0.2268 +vt 0.9061 0.2268 +vt 0.9061 0.2346 +vt 0.8983 0.2346 +vt 0.9140 0.1487 +vt 0.9218 0.1487 +vt 0.9218 0.1565 +vt 0.9140 0.1565 +vt 0.9140 0.1331 +vt 0.9218 0.1331 +vt 0.9218 0.1409 +vt 0.9140 0.1409 +vt 0.9296 0.1331 +vt 0.9374 0.1331 +vt 0.9374 0.1409 +vt 0.9296 0.1409 +vt 0.8827 0.1487 +vt 0.8905 0.1487 +vt 0.8905 0.1565 +vt 0.8827 0.1565 +vt 0.8827 0.1331 +vt 0.8905 0.1331 +vt 0.8905 0.1409 +vt 0.8827 0.1409 +vt 0.8983 0.1331 +vt 0.9062 0.1331 +vt 0.9062 0.1409 +vt 0.8983 0.1409 +vt 0.8827 0.1800 +vt 0.8905 0.1800 +vt 0.8905 0.1878 +vt 0.8827 0.1878 +vt 0.8827 0.1643 +vt 0.8905 0.1643 +vt 0.8905 0.1722 +vt 0.8827 0.1722 +vt 0.8983 0.1643 +vt 0.9061 0.1644 +vt 0.9061 0.1722 +vt 0.8983 0.1722 +vt 0.9764 0.1488 +vt 0.9842 0.1488 +vt 0.9842 0.1566 +vt 0.9764 0.1566 +vt 0.9764 0.1331 +vt 0.9842 0.1331 +vt 0.9842 0.1410 +vt 0.9764 0.1409 +vt 0.9920 0.1331 +vt 0.9999 0.1331 +vt 0.9999 0.1410 +vt 0.9920 0.1410 +vt 0.9452 0.1487 +vt 0.9530 0.1487 +vt 0.9530 0.1566 +vt 0.9452 0.1566 +vt 0.9452 0.1331 +vt 0.9530 0.1331 +vt 0.9530 0.1409 +vt 0.9452 0.1409 +vt 0.9608 0.1331 +vt 0.9686 0.1331 +vt 0.9686 0.1409 +vt 0.9608 0.1409 +vt 0.9452 0.1800 +vt 0.9530 0.1800 +vt 0.9530 0.1878 +vt 0.9452 0.1878 +vt 0.9452 0.1644 +vt 0.9530 0.1644 +vt 0.9530 0.1722 +vt 0.9452 0.1722 +vt 0.9608 0.1644 +vt 0.9686 0.1644 +vt 0.9686 0.1722 +vt 0.9608 0.1722 +vt 0.6641 0.2111 +vt 0.6719 0.2111 +vt 0.6719 0.2189 +vt 0.6641 0.2189 +vt 0.6641 0.1955 +vt 0.6719 0.1955 +vt 0.6719 0.2033 +vt 0.6641 0.2033 +vt 0.6797 0.1955 +vt 0.6875 0.1955 +vt 0.6875 0.2033 +vt 0.6797 0.2033 +vt 0.6328 0.2111 +vt 0.6406 0.2111 +vt 0.6406 0.2189 +vt 0.6328 0.2189 +vt 0.6328 0.1955 +vt 0.6406 0.1955 +vt 0.6406 0.2033 +vt 0.6328 0.2033 +vt 0.6485 0.1955 +vt 0.6563 0.1955 +vt 0.6563 0.2033 +vt 0.6485 0.2033 +vt 0.6328 0.2424 +vt 0.6406 0.2424 +vt 0.6406 0.2502 +vt 0.6328 0.2502 +vt 0.6328 0.2267 +vt 0.6406 0.2267 +vt 0.6406 0.2345 +vt 0.6328 0.2345 +vt 0.6484 0.2267 +vt 0.6563 0.2267 +vt 0.6563 0.2345 +vt 0.6484 0.2345 +vt 0.6641 0.1487 +vt 0.6719 0.1487 +vt 0.6719 0.1565 +vt 0.6641 0.1565 +vt 0.6641 0.1330 +vt 0.6719 0.1330 +vt 0.6719 0.1409 +vt 0.6641 0.1409 +vt 0.6797 0.1330 +vt 0.6875 0.1330 +vt 0.6875 0.1409 +vt 0.6797 0.1409 +vt 0.6329 0.1486 +vt 0.6407 0.1487 +vt 0.6407 0.1565 +vt 0.6329 0.1565 +vt 0.6329 0.1330 +vt 0.6407 0.1330 +vt 0.6407 0.1408 +vt 0.6329 0.1408 +vt 0.6485 0.1330 +vt 0.6563 0.1330 +vt 0.6563 0.1408 +vt 0.6485 0.1408 +vt 0.6328 0.1799 +vt 0.6407 0.1799 +vt 0.6406 0.1877 +vt 0.6328 0.1877 +vt 0.6328 0.1643 +vt 0.6407 0.1643 +vt 0.6407 0.1721 +vt 0.6328 0.1721 +vt 0.6485 0.1643 +vt 0.6563 0.1643 +vt 0.6563 0.1721 +vt 0.6485 0.1721 +vt 0.7266 0.1487 +vt 0.7344 0.1487 +vt 0.7344 0.1565 +vt 0.7266 0.1565 +vt 0.7266 0.1331 +vt 0.7344 0.1331 +vt 0.7344 0.1409 +vt 0.7266 0.1409 +vt 0.7422 0.1331 +vt 0.7500 0.1331 +vt 0.7500 0.1409 +vt 0.7422 0.1409 +vt 0.6953 0.1487 +vt 0.7031 0.1487 +vt 0.7031 0.1565 +vt 0.6953 0.1565 +vt 0.6953 0.1331 +vt 0.7031 0.1331 +vt 0.7031 0.1409 +vt 0.6953 0.1409 +vt 0.7109 0.1331 +vt 0.7188 0.1331 +vt 0.7187 0.1409 +vt 0.7109 0.1409 +vt 0.6953 0.1799 +vt 0.7031 0.1799 +vt 0.7031 0.1877 +vt 0.6953 0.1877 +vt 0.6953 0.1643 +vt 0.7031 0.1643 +vt 0.7031 0.1721 +vt 0.6953 0.1721 +vt 0.7109 0.1643 +vt 0.7187 0.1643 +vt 0.7187 0.1721 +vt 0.7109 0.1721 +vt 0.6640 0.4610 +vt 0.6718 0.4610 +vt 0.6718 0.4688 +vt 0.6640 0.4688 +vt 0.6640 0.4454 +vt 0.6718 0.4454 +vt 0.6718 0.4532 +vt 0.6640 0.4532 +vt 0.6796 0.4454 +vt 0.6874 0.4454 +vt 0.6874 0.4532 +vt 0.6796 0.4532 +vt 0.6328 0.4610 +vt 0.6406 0.4610 +vt 0.6406 0.4688 +vt 0.6328 0.4688 +vt 0.6328 0.4454 +vt 0.6406 0.4454 +vt 0.6406 0.4532 +vt 0.6328 0.4532 +vt 0.6484 0.4454 +vt 0.6562 0.4454 +vt 0.6562 0.4532 +vt 0.6484 0.4532 +vt 0.6327 0.4922 +vt 0.6406 0.4922 +vt 0.6406 0.5000 +vt 0.6327 0.5000 +vt 0.6328 0.4766 +vt 0.6406 0.4766 +vt 0.6406 0.4844 +vt 0.6327 0.4844 +vt 0.6484 0.4766 +vt 0.6562 0.4766 +vt 0.6562 0.4844 +vt 0.6484 0.4844 +vt 0.6640 0.3985 +vt 0.6718 0.3985 +vt 0.6718 0.4063 +vt 0.6640 0.4063 +vt 0.6640 0.3829 +vt 0.6718 0.3829 +vt 0.6718 0.3907 +vt 0.6640 0.3907 +vt 0.6796 0.3829 +vt 0.6874 0.3829 +vt 0.6874 0.3907 +vt 0.6796 0.3907 +vt 0.6328 0.3985 +vt 0.6406 0.3985 +vt 0.6406 0.4063 +vt 0.6328 0.4063 +vt 0.6328 0.3829 +vt 0.6406 0.3829 +vt 0.6406 0.3907 +vt 0.6328 0.3907 +vt 0.6484 0.3829 +vt 0.6562 0.3829 +vt 0.6562 0.3907 +vt 0.6484 0.3907 +vt 0.6328 0.4298 +vt 0.6406 0.4298 +vt 0.6406 0.4376 +vt 0.6328 0.4376 +vt 0.6328 0.4141 +vt 0.6406 0.4141 +vt 0.6406 0.4219 +vt 0.6328 0.4219 +vt 0.6484 0.4141 +vt 0.6562 0.4141 +vt 0.6562 0.4220 +vt 0.6484 0.4219 +vt 0.7265 0.3985 +vt 0.7343 0.3986 +vt 0.7343 0.4064 +vt 0.7265 0.4064 +vt 0.7265 0.3829 +vt 0.7343 0.3829 +vt 0.7343 0.3907 +vt 0.7265 0.3907 +vt 0.7421 0.3829 +vt 0.7499 0.3829 +vt 0.7499 0.3907 +vt 0.7421 0.3907 +vt 0.6952 0.3985 +vt 0.7031 0.3985 +vt 0.7030 0.4063 +vt 0.6952 0.4063 +vt 0.6952 0.3829 +vt 0.7031 0.3829 +vt 0.7031 0.3907 +vt 0.6952 0.3907 +vt 0.7109 0.3829 +vt 0.7187 0.3829 +vt 0.7187 0.3907 +vt 0.7109 0.3907 +vt 0.6952 0.4298 +vt 0.7030 0.4298 +vt 0.7030 0.4376 +vt 0.6952 0.4376 +vt 0.6952 0.4142 +vt 0.7030 0.4142 +vt 0.7030 0.4220 +vt 0.6952 0.4220 +vt 0.7109 0.4142 +vt 0.7187 0.4142 +vt 0.7187 0.4220 +vt 0.7109 0.4220 +vt 0.9139 0.4611 +vt 0.9217 0.4611 +vt 0.9217 0.4689 +vt 0.9139 0.4689 +vt 0.9139 0.4455 +vt 0.9217 0.4455 +vt 0.9217 0.4533 +vt 0.9139 0.4533 +vt 0.9295 0.4455 +vt 0.9373 0.4455 +vt 0.9373 0.4533 +vt 0.9295 0.4533 +vt 0.8826 0.4611 +vt 0.8904 0.4611 +vt 0.8904 0.4689 +vt 0.8826 0.4689 +vt 0.8826 0.4454 +vt 0.8904 0.4455 +vt 0.8904 0.4533 +vt 0.8826 0.4533 +vt 0.8982 0.4455 +vt 0.9061 0.4455 +vt 0.9061 0.4533 +vt 0.8982 0.4533 +vt 0.8826 0.4923 +vt 0.8904 0.4923 +vt 0.8904 0.5001 +vt 0.8826 0.5001 +vt 0.8826 0.4767 +vt 0.8904 0.4767 +vt 0.8904 0.4845 +vt 0.8826 0.4845 +vt 0.8982 0.4767 +vt 0.9060 0.4767 +vt 0.9060 0.4845 +vt 0.8982 0.4845 +vt 0.9139 0.3986 +vt 0.9217 0.3986 +vt 0.9217 0.4064 +vt 0.9139 0.4064 +vt 0.9139 0.3830 +vt 0.9217 0.3830 +vt 0.9217 0.3908 +vt 0.9139 0.3908 +vt 0.9295 0.3830 +vt 0.9373 0.3830 +vt 0.9373 0.3908 +vt 0.9295 0.3908 +vt 0.8826 0.3986 +vt 0.8905 0.3986 +vt 0.8905 0.4064 +vt 0.8826 0.4064 +vt 0.8827 0.3830 +vt 0.8905 0.3830 +vt 0.8905 0.3908 +vt 0.8826 0.3908 +vt 0.8983 0.3830 +vt 0.9061 0.3830 +vt 0.9061 0.3908 +vt 0.8983 0.3908 +vt 0.8826 0.4298 +vt 0.8904 0.4298 +vt 0.8904 0.4376 +vt 0.8826 0.4376 +vt 0.8826 0.4142 +vt 0.8904 0.4142 +vt 0.8904 0.4220 +vt 0.8826 0.4220 +vt 0.8983 0.4142 +vt 0.9061 0.4142 +vt 0.9061 0.4220 +vt 0.8983 0.4220 +vt 0.9763 0.3986 +vt 0.9842 0.3986 +vt 0.9842 0.4064 +vt 0.9763 0.4064 +vt 0.9764 0.3830 +vt 0.9842 0.3830 +vt 0.9842 0.3908 +vt 0.9763 0.3908 +vt 0.9920 0.3830 +vt 0.9998 0.3830 +vt 0.9998 0.3908 +vt 0.9920 0.3908 +vt 0.9451 0.3986 +vt 0.9529 0.3986 +vt 0.9529 0.4064 +vt 0.9451 0.4064 +vt 0.9451 0.3830 +vt 0.9529 0.3830 +vt 0.9529 0.3908 +vt 0.9451 0.3908 +vt 0.9607 0.3830 +vt 0.9685 0.3830 +vt 0.9685 0.3908 +vt 0.9607 0.3908 +vt 0.9451 0.4299 +vt 0.9529 0.4299 +vt 0.9529 0.4377 +vt 0.9451 0.4377 +vt 0.9451 0.4142 +vt 0.9529 0.4142 +vt 0.9529 0.4220 +vt 0.9451 0.4220 +vt 0.9607 0.4142 +vt 0.9685 0.4142 +vt 0.9685 0.4221 +vt 0.9607 0.4220 +vt 0.4141 0.4609 +vt 0.4219 0.4609 +vt 0.4219 0.4687 +vt 0.4141 0.4687 +vt 0.4141 0.4453 +vt 0.4219 0.4453 +vt 0.4219 0.4531 +vt 0.4141 0.4531 +vt 0.4297 0.4453 +vt 0.4376 0.4453 +vt 0.4375 0.4531 +vt 0.4297 0.4531 +vt 0.3829 0.4609 +vt 0.3907 0.4609 +vt 0.3907 0.4687 +vt 0.3829 0.4687 +vt 0.3829 0.4453 +vt 0.3907 0.4453 +vt 0.3907 0.4531 +vt 0.3829 0.4531 +vt 0.3985 0.4453 +vt 0.4063 0.4453 +vt 0.4063 0.4531 +vt 0.3985 0.4531 +vt 0.3829 0.4921 +vt 0.3907 0.4921 +vt 0.3907 0.5000 +vt 0.3829 0.4999 +vt 0.3829 0.4765 +vt 0.3907 0.4765 +vt 0.3907 0.4843 +vt 0.3829 0.4843 +vt 0.3985 0.4765 +vt 0.4063 0.4765 +vt 0.4063 0.4843 +vt 0.3985 0.4843 +vt 0.4141 0.3985 +vt 0.4219 0.3985 +vt 0.4219 0.4063 +vt 0.4141 0.4063 +vt 0.4141 0.3828 +vt 0.4220 0.3828 +vt 0.4220 0.3906 +vt 0.4141 0.3906 +vt 0.4298 0.3828 +vt 0.4376 0.3828 +vt 0.4376 0.3906 +vt 0.4298 0.3906 +vt 0.3829 0.3984 +vt 0.3907 0.3984 +vt 0.3907 0.4063 +vt 0.3829 0.4062 +vt 0.3829 0.3828 +vt 0.3907 0.3828 +vt 0.3907 0.3906 +vt 0.3829 0.3906 +vt 0.3985 0.3828 +vt 0.4063 0.3828 +vt 0.4063 0.3906 +vt 0.3985 0.3906 +vt 0.3829 0.4297 +vt 0.3907 0.4297 +vt 0.3907 0.4375 +vt 0.3829 0.4375 +vt 0.3829 0.4141 +vt 0.3907 0.4141 +vt 0.3907 0.4219 +vt 0.3829 0.4219 +vt 0.3985 0.4141 +vt 0.4063 0.4141 +vt 0.4063 0.4219 +vt 0.3985 0.4219 +vt 0.4766 0.3985 +vt 0.4844 0.3985 +vt 0.4844 0.4063 +vt 0.4766 0.4063 +vt 0.4766 0.3829 +vt 0.4844 0.3829 +vt 0.4844 0.3907 +vt 0.4766 0.3907 +vt 0.4922 0.3829 +vt 0.5000 0.3829 +vt 0.5000 0.3907 +vt 0.4922 0.3907 +vt 0.4454 0.3985 +vt 0.4532 0.3985 +vt 0.4532 0.4063 +vt 0.4454 0.4063 +vt 0.4454 0.3828 +vt 0.4532 0.3828 +vt 0.4532 0.3907 +vt 0.4454 0.3907 +vt 0.4610 0.3828 +vt 0.4688 0.3829 +vt 0.4688 0.3907 +vt 0.4610 0.3907 +vt 0.4454 0.4297 +vt 0.4532 0.4297 +vt 0.4532 0.4375 +vt 0.4454 0.4375 +vt 0.4454 0.4141 +vt 0.4532 0.4141 +vt 0.4532 0.4219 +vt 0.4454 0.4219 +vt 0.4610 0.4141 +vt 0.4688 0.4141 +vt 0.4688 0.4219 +vt 0.4610 0.4219 +vt 0.4140 0.9607 +vt 0.4218 0.9607 +vt 0.4218 0.9685 +vt 0.4140 0.9685 +vt 0.4140 0.9450 +vt 0.4218 0.9450 +vt 0.4218 0.9529 +vt 0.4140 0.9528 +vt 0.4296 0.9450 +vt 0.4374 0.9450 +vt 0.4374 0.9529 +vt 0.4296 0.9529 +vt 0.3827 0.9606 +vt 0.3905 0.9606 +vt 0.3905 0.9685 +vt 0.3827 0.9685 +vt 0.3827 0.9450 +vt 0.3905 0.9450 +vt 0.3905 0.9528 +vt 0.3827 0.9528 +vt 0.3984 0.9450 +vt 0.4062 0.9450 +vt 0.4062 0.9528 +vt 0.3984 0.9528 +vt 0.3827 0.9919 +vt 0.3905 0.9919 +vt 0.3905 0.9997 +vt 0.3827 0.9997 +vt 0.3827 0.9763 +vt 0.3905 0.9763 +vt 0.3905 0.9841 +vt 0.3827 0.9841 +vt 0.3983 0.9763 +vt 0.4062 0.9763 +vt 0.4062 0.9841 +vt 0.3983 0.9841 +vt 0.4140 0.8982 +vt 0.4218 0.8982 +vt 0.4218 0.9060 +vt 0.4140 0.9060 +vt 0.4140 0.8826 +vt 0.4218 0.8826 +vt 0.4218 0.8904 +vt 0.4140 0.8904 +vt 0.4296 0.8826 +vt 0.4374 0.8826 +vt 0.4374 0.8904 +vt 0.4296 0.8904 +vt 0.3828 0.8982 +vt 0.3906 0.8982 +vt 0.3906 0.9060 +vt 0.3827 0.9060 +vt 0.3828 0.8826 +vt 0.3906 0.8826 +vt 0.3906 0.8904 +vt 0.3828 0.8904 +vt 0.3984 0.8826 +vt 0.4062 0.8826 +vt 0.4062 0.8904 +vt 0.3984 0.8904 +vt 0.3827 0.9294 +vt 0.3906 0.9294 +vt 0.3905 0.9372 +vt 0.3827 0.9372 +vt 0.3827 0.9138 +vt 0.3906 0.9138 +vt 0.3906 0.9216 +vt 0.3827 0.9216 +vt 0.3984 0.9138 +vt 0.4062 0.9138 +vt 0.4062 0.9216 +vt 0.3984 0.9216 +vt 0.4765 0.8982 +vt 0.4843 0.8982 +vt 0.4843 0.9060 +vt 0.4765 0.9060 +vt 0.4765 0.8826 +vt 0.4843 0.8826 +vt 0.4843 0.8904 +vt 0.4765 0.8904 +vt 0.4921 0.8826 +vt 0.4999 0.8826 +vt 0.4999 0.8904 +vt 0.4921 0.8904 +vt 0.4452 0.8982 +vt 0.4530 0.8982 +vt 0.4530 0.9060 +vt 0.4452 0.9060 +vt 0.4452 0.8826 +vt 0.4530 0.8826 +vt 0.4530 0.8904 +vt 0.4452 0.8904 +vt 0.4608 0.8826 +vt 0.4686 0.8826 +vt 0.4686 0.8904 +vt 0.4608 0.8904 +vt 0.4452 0.9294 +vt 0.4530 0.9294 +vt 0.4530 0.9372 +vt 0.4452 0.9372 +vt 0.4452 0.9138 +vt 0.4530 0.9138 +vt 0.4530 0.9216 +vt 0.4452 0.9216 +vt 0.4608 0.9138 +vt 0.4686 0.9138 +vt 0.4686 0.9216 +vt 0.4608 0.9216 +vt 0.9137 0.9608 +vt 0.9215 0.9608 +vt 0.9215 0.9686 +vt 0.9137 0.9686 +vt 0.9137 0.9452 +vt 0.9215 0.9452 +vt 0.9215 0.9530 +vt 0.9137 0.9530 +vt 0.9293 0.9452 +vt 0.9371 0.9452 +vt 0.9371 0.9530 +vt 0.9293 0.9530 +vt 0.8825 0.9608 +vt 0.8903 0.9608 +vt 0.8903 0.9686 +vt 0.8825 0.9686 +vt 0.8825 0.9452 +vt 0.8903 0.9452 +vt 0.8903 0.9530 +vt 0.8825 0.9530 +vt 0.8981 0.9452 +vt 0.9059 0.9452 +vt 0.9059 0.9530 +vt 0.8981 0.9530 +vt 0.8825 0.9920 +vt 0.8903 0.9920 +vt 0.8903 0.9998 +vt 0.8825 0.9998 +vt 0.8825 0.9764 +vt 0.8903 0.9764 +vt 0.8903 0.9842 +vt 0.8825 0.9842 +vt 0.8981 0.9764 +vt 0.9059 0.9764 +vt 0.9059 0.9842 +vt 0.8981 0.9842 +vt 0.9137 0.8983 +vt 0.9215 0.8983 +vt 0.9215 0.9062 +vt 0.9137 0.9061 +vt 0.9137 0.8827 +vt 0.9215 0.8827 +vt 0.9215 0.8905 +vt 0.9137 0.8905 +vt 0.9293 0.8827 +vt 0.9371 0.8827 +vt 0.9371 0.8905 +vt 0.9293 0.8905 +vt 0.8825 0.8983 +vt 0.8903 0.8983 +vt 0.8903 0.9061 +vt 0.8825 0.9061 +vt 0.8825 0.8827 +vt 0.8903 0.8827 +vt 0.8903 0.8905 +vt 0.8825 0.8905 +vt 0.8981 0.8827 +vt 0.9059 0.8827 +vt 0.9059 0.8905 +vt 0.8981 0.8905 +vt 0.8825 0.9296 +vt 0.8903 0.9296 +vt 0.8903 0.9374 +vt 0.8825 0.9374 +vt 0.8825 0.9139 +vt 0.8903 0.9139 +vt 0.8903 0.9218 +vt 0.8825 0.9218 +vt 0.8981 0.9140 +vt 0.9059 0.9140 +vt 0.9059 0.9218 +vt 0.8981 0.9218 +vt 0.9762 0.8984 +vt 0.9840 0.8984 +vt 0.9840 0.9062 +vt 0.9762 0.9062 +vt 0.9762 0.8827 +vt 0.9840 0.8827 +vt 0.9840 0.8906 +vt 0.9762 0.8906 +vt 0.9918 0.8827 +vt 0.9996 0.8828 +vt 0.9996 0.8906 +vt 0.9918 0.8906 +vt 0.9450 0.8983 +vt 0.9528 0.8984 +vt 0.9528 0.9062 +vt 0.9449 0.9062 +vt 0.9450 0.8827 +vt 0.9528 0.8827 +vt 0.9528 0.8905 +vt 0.9450 0.8905 +vt 0.9606 0.8827 +vt 0.9684 0.8827 +vt 0.9684 0.8905 +vt 0.9606 0.8905 +vt 0.9449 0.9296 +vt 0.9527 0.9296 +vt 0.9527 0.9374 +vt 0.9449 0.9374 +vt 0.9449 0.9140 +vt 0.9528 0.9140 +vt 0.9528 0.9218 +vt 0.9449 0.9218 +vt 0.9606 0.9140 +vt 0.9684 0.9140 +vt 0.9684 0.9218 +vt 0.9606 0.9218 +vt 0.9762 0.9296 +vt 0.9840 0.9296 +vt 0.9840 0.9374 +vt 0.9762 0.9374 +vt 0.9762 0.9140 +vt 0.9840 0.9140 +vt 0.9840 0.9218 +vt 0.9762 0.9218 +vt 0.9918 0.9140 +vt 0.9996 0.9140 +vt 0.9996 0.9218 +vt 0.9918 0.9218 +vt 0.9137 0.9296 +vt 0.9215 0.9296 +vt 0.9215 0.9374 +vt 0.9137 0.9374 +vt 0.9137 0.9140 +vt 0.9215 0.9140 +vt 0.9215 0.9218 +vt 0.9137 0.9218 +vt 0.9293 0.9140 +vt 0.9371 0.9140 +vt 0.9371 0.9218 +vt 0.9293 0.9218 +vt 0.9137 0.9920 +vt 0.9215 0.9920 +vt 0.9215 0.9998 +vt 0.9137 0.9998 +vt 0.9137 0.9764 +vt 0.9215 0.9764 +vt 0.9215 0.9842 +vt 0.9137 0.9842 +vt 0.9293 0.9764 +vt 0.9371 0.9764 +vt 0.9371 0.9842 +vt 0.9293 0.9842 +vt 0.4764 0.9294 +vt 0.4843 0.9294 +vt 0.4843 0.9373 +vt 0.4764 0.9372 +vt 0.4764 0.9138 +vt 0.4843 0.9138 +vt 0.4843 0.9216 +vt 0.4764 0.9216 +vt 0.4921 0.9138 +vt 0.4999 0.9138 +vt 0.4999 0.9216 +vt 0.4921 0.9216 +vt 0.4140 0.9294 +vt 0.4218 0.9294 +vt 0.4218 0.9372 +vt 0.4140 0.9372 +vt 0.4140 0.9138 +vt 0.4218 0.9138 +vt 0.4218 0.9216 +vt 0.4140 0.9216 +vt 0.4296 0.9138 +vt 0.4374 0.9138 +vt 0.4374 0.9216 +vt 0.4296 0.9216 +vt 0.4140 0.9919 +vt 0.4218 0.9919 +vt 0.4218 0.9997 +vt 0.4140 0.9997 +vt 0.4140 0.9763 +vt 0.4218 0.9763 +vt 0.4218 0.9841 +vt 0.4140 0.9841 +vt 0.4296 0.9763 +vt 0.4374 0.9763 +vt 0.4374 0.9841 +vt 0.4296 0.9841 +vt 0.4766 0.4297 +vt 0.4844 0.4297 +vt 0.4844 0.4375 +vt 0.4766 0.4375 +vt 0.4766 0.4141 +vt 0.4844 0.4141 +vt 0.4844 0.4219 +vt 0.4766 0.4219 +vt 0.4922 0.4141 +vt 0.5000 0.4141 +vt 0.5000 0.4219 +vt 0.4922 0.4219 +vt 0.4141 0.4297 +vt 0.4219 0.4297 +vt 0.4219 0.4375 +vt 0.4141 0.4375 +vt 0.4141 0.4141 +vt 0.4219 0.4141 +vt 0.4219 0.4219 +vt 0.4141 0.4219 +vt 0.4298 0.4141 +vt 0.4376 0.4141 +vt 0.4376 0.4219 +vt 0.4298 0.4219 +vt 0.4141 0.4922 +vt 0.4219 0.4922 +vt 0.4219 0.5000 +vt 0.4141 0.5000 +vt 0.4141 0.4765 +vt 0.4219 0.4765 +vt 0.4219 0.4843 +vt 0.4141 0.4843 +vt 0.4297 0.4765 +vt 0.4375 0.4765 +vt 0.4375 0.4843 +vt 0.4297 0.4843 +vt 0.9763 0.4299 +vt 0.9841 0.4299 +vt 0.9841 0.4377 +vt 0.9763 0.4377 +vt 0.9763 0.4142 +vt 0.9841 0.4142 +vt 0.9841 0.4221 +vt 0.9763 0.4221 +vt 0.9920 0.4143 +vt 0.9998 0.4143 +vt 0.9998 0.4221 +vt 0.9920 0.4221 +vt 0.9139 0.4298 +vt 0.9217 0.4298 +vt 0.9217 0.4377 +vt 0.9139 0.4377 +vt 0.9139 0.4142 +vt 0.9217 0.4142 +vt 0.9217 0.4220 +vt 0.9139 0.4220 +vt 0.9295 0.4142 +vt 0.9373 0.4142 +vt 0.9373 0.4220 +vt 0.9295 0.4220 +vt 0.9138 0.4923 +vt 0.9217 0.4923 +vt 0.9217 0.5001 +vt 0.9138 0.5001 +vt 0.9139 0.4767 +vt 0.9217 0.4767 +vt 0.9217 0.4845 +vt 0.9139 0.4845 +vt 0.9295 0.4767 +vt 0.9373 0.4767 +vt 0.9373 0.4845 +vt 0.9295 0.4845 +vt 0.7265 0.4298 +vt 0.7343 0.4298 +vt 0.7343 0.4376 +vt 0.7265 0.4376 +vt 0.7265 0.4142 +vt 0.7343 0.4142 +vt 0.7343 0.4220 +vt 0.7265 0.4220 +vt 0.7421 0.4142 +vt 0.7499 0.4142 +vt 0.7499 0.4220 +vt 0.7421 0.4220 +vt 0.6640 0.4298 +vt 0.6718 0.4298 +vt 0.6718 0.4376 +vt 0.6640 0.4376 +vt 0.6640 0.4141 +vt 0.6718 0.4141 +vt 0.6718 0.4220 +vt 0.6640 0.4220 +vt 0.6796 0.4142 +vt 0.6874 0.4142 +vt 0.6874 0.4220 +vt 0.6796 0.4220 +vt 0.6640 0.4922 +vt 0.6718 0.4922 +vt 0.6718 0.5000 +vt 0.6640 0.5000 +vt 0.6640 0.4766 +vt 0.6718 0.4766 +vt 0.6718 0.4844 +vt 0.6640 0.4844 +vt 0.6796 0.4766 +vt 0.6874 0.4766 +vt 0.6874 0.4844 +vt 0.6796 0.4844 +vt 0.7265 0.1799 +vt 0.7344 0.1799 +vt 0.7344 0.1877 +vt 0.7265 0.1877 +vt 0.7265 0.1643 +vt 0.7344 0.1643 +vt 0.7344 0.1721 +vt 0.7265 0.1721 +vt 0.7422 0.1643 +vt 0.7500 0.1643 +vt 0.7500 0.1721 +vt 0.7422 0.1721 +vt 0.6641 0.1799 +vt 0.6719 0.1799 +vt 0.6719 0.1877 +vt 0.6641 0.1877 +vt 0.6641 0.1643 +vt 0.6719 0.1643 +vt 0.6719 0.1721 +vt 0.6641 0.1721 +vt 0.6797 0.1643 +vt 0.6875 0.1643 +vt 0.6875 0.1721 +vt 0.6797 0.1721 +vt 0.6641 0.2424 +vt 0.6719 0.2424 +vt 0.6719 0.2502 +vt 0.6641 0.2502 +vt 0.6641 0.2267 +vt 0.6719 0.2267 +vt 0.6719 0.2346 +vt 0.6641 0.2346 +vt 0.6797 0.2267 +vt 0.6875 0.2268 +vt 0.6875 0.2346 +vt 0.6797 0.2346 +vt 0.9764 0.1800 +vt 0.9842 0.1800 +vt 0.9842 0.1878 +vt 0.9764 0.1878 +vt 0.9764 0.1644 +vt 0.9842 0.1644 +vt 0.9842 0.1722 +vt 0.9764 0.1722 +vt 0.9920 0.1644 +vt 0.9998 0.1644 +vt 0.9998 0.1722 +vt 0.9920 0.1722 +vt 0.9139 0.1800 +vt 0.9218 0.1800 +vt 0.9218 0.1878 +vt 0.9139 0.1878 +vt 0.9140 0.1644 +vt 0.9218 0.1644 +vt 0.9218 0.1722 +vt 0.9140 0.1722 +vt 0.9296 0.1644 +vt 0.9374 0.1644 +vt 0.9374 0.1722 +vt 0.9296 0.1722 +vt 0.9139 0.2424 +vt 0.9217 0.2424 +vt 0.9217 0.2502 +vt 0.9139 0.2502 +vt 0.9139 0.2268 +vt 0.9217 0.2268 +vt 0.9217 0.2346 +vt 0.9139 0.2346 +vt 0.9296 0.2268 +vt 0.9374 0.2268 +vt 0.9374 0.2346 +vt 0.9295 0.2346 +vt 0.2267 0.4296 +vt 0.2345 0.4296 +vt 0.2345 0.4374 +vt 0.2267 0.4374 +vt 0.2267 0.4140 +vt 0.2345 0.4140 +vt 0.2345 0.4218 +vt 0.2267 0.4218 +vt 0.2424 0.4140 +vt 0.2502 0.4140 +vt 0.2502 0.4218 +vt 0.2423 0.4218 +vt 0.1643 0.4296 +vt 0.1721 0.4296 +vt 0.1721 0.4374 +vt 0.1643 0.4374 +vt 0.1643 0.4140 +vt 0.1721 0.4140 +vt 0.1721 0.4218 +vt 0.1643 0.4218 +vt 0.1799 0.4140 +vt 0.1877 0.4140 +vt 0.1877 0.4218 +vt 0.1799 0.4218 +vt 0.1642 0.4921 +vt 0.1721 0.4921 +vt 0.1720 0.4999 +vt 0.1642 0.4999 +vt 0.1642 0.4765 +vt 0.1721 0.4765 +vt 0.1721 0.4843 +vt 0.1642 0.4843 +vt 0.1799 0.4765 +vt 0.1877 0.4765 +vt 0.1877 0.4843 +vt 0.1799 0.4843 +vt 0.2268 0.1798 +vt 0.2346 0.1798 +vt 0.2346 0.1876 +vt 0.2268 0.1876 +vt 0.2268 0.1641 +vt 0.2346 0.1641 +vt 0.2346 0.1720 +vt 0.2268 0.1720 +vt 0.2424 0.1641 +vt 0.2502 0.1641 +vt 0.2502 0.1720 +vt 0.2424 0.1720 +vt 0.1643 0.1797 +vt 0.1722 0.1797 +vt 0.1721 0.1875 +vt 0.1643 0.1875 +vt 0.1643 0.1641 +vt 0.1722 0.1641 +vt 0.1722 0.1719 +vt 0.1643 0.1719 +vt 0.1800 0.1641 +vt 0.1878 0.1641 +vt 0.1878 0.1719 +vt 0.1800 0.1719 +vt 0.1643 0.2422 +vt 0.1721 0.2422 +vt 0.1721 0.2500 +vt 0.1643 0.2500 +vt 0.1643 0.2266 +vt 0.1721 0.2266 +vt 0.1721 0.2344 +vt 0.1643 0.2344 +vt 0.1799 0.2266 +vt 0.1878 0.2266 +vt 0.1878 0.2344 +vt 0.1799 0.2344 +vt 0.4767 0.1798 +vt 0.4845 0.1798 +vt 0.4845 0.1876 +vt 0.4767 0.1876 +vt 0.4767 0.1642 +vt 0.4845 0.1642 +vt 0.4845 0.1720 +vt 0.4767 0.1720 +vt 0.4923 0.1642 +vt 0.5001 0.1642 +vt 0.5001 0.1720 +vt 0.4923 0.1720 +vt 0.4142 0.1798 +vt 0.4220 0.1798 +vt 0.4220 0.1876 +vt 0.4142 0.1876 +vt 0.4142 0.1642 +vt 0.4220 0.1642 +vt 0.4220 0.1720 +vt 0.4142 0.1720 +vt 0.4298 0.1642 +vt 0.4376 0.1642 +vt 0.4376 0.1720 +vt 0.4298 0.1720 +vt 0.4142 0.2423 +vt 0.4220 0.2423 +vt 0.4220 0.2501 +vt 0.4142 0.2501 +vt 0.4142 0.2267 +vt 0.4220 0.2267 +vt 0.4220 0.2345 +vt 0.4142 0.2345 +vt 0.4298 0.2267 +vt 0.4376 0.2267 +vt 0.4376 0.2345 +vt 0.4298 0.2345 +vt 0.2266 0.9294 +vt 0.2344 0.9294 +vt 0.2344 0.9372 +vt 0.2266 0.9372 +vt 0.2266 0.9137 +vt 0.2344 0.9138 +vt 0.2344 0.9216 +vt 0.2266 0.9216 +vt 0.2422 0.9138 +vt 0.2500 0.9138 +vt 0.2500 0.9216 +vt 0.2422 0.9216 +vt 0.1641 0.9293 +vt 0.1719 0.9293 +vt 0.1719 0.9372 +vt 0.1641 0.9372 +vt 0.1641 0.9137 +vt 0.1719 0.9137 +vt 0.1719 0.9215 +vt 0.1641 0.9215 +vt 0.1797 0.9137 +vt 0.1875 0.9137 +vt 0.1875 0.9215 +vt 0.1797 0.9215 +vt 0.1641 0.9918 +vt 0.1719 0.9918 +vt 0.1719 0.9996 +vt 0.1641 0.9996 +vt 0.1641 0.9762 +vt 0.1719 0.9762 +vt 0.1719 0.9840 +vt 0.1641 0.9840 +vt 0.1797 0.9762 +vt 0.1875 0.9762 +vt 0.1875 0.9840 +vt 0.1797 0.9840 +vt 0.2267 0.6795 +vt 0.2345 0.6795 +vt 0.2345 0.6873 +vt 0.2266 0.6873 +vt 0.2267 0.6639 +vt 0.2345 0.6639 +vt 0.2345 0.6717 +vt 0.2267 0.6717 +vt 0.2423 0.6639 +vt 0.2501 0.6639 +vt 0.2501 0.6717 +vt 0.2423 0.6717 +vt 0.1642 0.6795 +vt 0.1720 0.6795 +vt 0.1720 0.6873 +vt 0.1642 0.6873 +vt 0.1642 0.6639 +vt 0.1720 0.6639 +vt 0.1720 0.6717 +vt 0.1642 0.6717 +vt 0.1798 0.6639 +vt 0.1876 0.6639 +vt 0.1876 0.6717 +vt 0.1798 0.6717 +vt 0.1642 0.7419 +vt 0.1720 0.7419 +vt 0.1720 0.7498 +vt 0.1642 0.7498 +vt 0.1642 0.7263 +vt 0.1720 0.7263 +vt 0.1720 0.7341 +vt 0.1642 0.7341 +vt 0.1798 0.7263 +vt 0.1876 0.7263 +vt 0.1876 0.7341 +vt 0.1798 0.7341 +vt 0.4765 0.6796 +vt 0.4843 0.6796 +vt 0.4843 0.6874 +vt 0.4765 0.6874 +vt 0.4765 0.6640 +vt 0.4843 0.6640 +vt 0.4843 0.6718 +vt 0.4765 0.6718 +vt 0.4921 0.6640 +vt 0.5000 0.6640 +vt 0.4999 0.6718 +vt 0.4921 0.6718 +vt 0.4141 0.6796 +vt 0.4219 0.6796 +vt 0.4219 0.6874 +vt 0.4141 0.6874 +vt 0.4141 0.6639 +vt 0.4219 0.6639 +vt 0.4219 0.6717 +vt 0.4141 0.6717 +vt 0.4297 0.6639 +vt 0.4375 0.6639 +vt 0.4375 0.6718 +vt 0.4297 0.6717 +vt 0.4140 0.7420 +vt 0.4218 0.7420 +vt 0.4218 0.7498 +vt 0.4140 0.7498 +vt 0.4140 0.7264 +vt 0.4218 0.7264 +vt 0.4218 0.7342 +vt 0.4140 0.7342 +vt 0.4297 0.7264 +vt 0.4375 0.7264 +vt 0.4375 0.7342 +vt 0.4297 0.7342 +vt 0.7263 0.9295 +vt 0.7341 0.9295 +vt 0.7341 0.9373 +vt 0.7263 0.9373 +vt 0.7263 0.9139 +vt 0.7341 0.9139 +vt 0.7341 0.9217 +vt 0.7263 0.9217 +vt 0.7419 0.9139 +vt 0.7497 0.9139 +vt 0.7497 0.9217 +vt 0.7419 0.9217 +vt 0.6638 0.9295 +vt 0.6717 0.9295 +vt 0.6717 0.9373 +vt 0.6638 0.9373 +vt 0.6638 0.9139 +vt 0.6717 0.9139 +vt 0.6717 0.9217 +vt 0.6638 0.9217 +vt 0.6795 0.9139 +vt 0.6873 0.9139 +vt 0.6873 0.9217 +vt 0.6795 0.9217 +vt 0.6638 0.9920 +vt 0.6716 0.9920 +vt 0.6716 0.9998 +vt 0.6638 0.9998 +vt 0.6638 0.9763 +vt 0.6716 0.9763 +vt 0.6716 0.9842 +vt 0.6638 0.9842 +vt 0.6794 0.9764 +vt 0.6873 0.9764 +vt 0.6873 0.9842 +vt 0.6794 0.9842 +vt 0.7264 0.6796 +vt 0.7342 0.6797 +vt 0.7342 0.6875 +vt 0.7264 0.6875 +vt 0.7264 0.6640 +vt 0.7342 0.6640 +vt 0.7342 0.6718 +vt 0.7264 0.6718 +vt 0.7420 0.6640 +vt 0.7498 0.6640 +vt 0.7498 0.6718 +vt 0.7420 0.6718 +vt 0.6639 0.6796 +vt 0.6717 0.6796 +vt 0.6717 0.6874 +vt 0.6639 0.6874 +vt 0.6639 0.6640 +vt 0.6717 0.6640 +vt 0.6717 0.6718 +vt 0.6639 0.6718 +vt 0.6795 0.6640 +vt 0.6874 0.6640 +vt 0.6873 0.6718 +vt 0.6795 0.6718 +vt 0.6639 0.7421 +vt 0.6717 0.7421 +vt 0.6717 0.7499 +vt 0.6639 0.7499 +vt 0.6639 0.7265 +vt 0.6717 0.7265 +vt 0.6717 0.7343 +vt 0.6639 0.7343 +vt 0.6795 0.7265 +vt 0.6873 0.7265 +vt 0.6873 0.7343 +vt 0.6795 0.7343 +vt 0.9763 0.6797 +vt 0.9841 0.6797 +vt 0.9841 0.6875 +vt 0.9763 0.6875 +vt 0.9763 0.6641 +vt 0.9841 0.6641 +vt 0.9841 0.6719 +vt 0.9763 0.6719 +vt 0.9919 0.6641 +vt 0.9997 0.6641 +vt 0.9997 0.6719 +vt 0.9919 0.6719 +vt 0.9138 0.6797 +vt 0.9216 0.6797 +vt 0.9216 0.6875 +vt 0.9138 0.6875 +vt 0.9138 0.6641 +vt 0.9216 0.6641 +vt 0.9216 0.6719 +vt 0.9138 0.6719 +vt 0.9294 0.6641 +vt 0.9372 0.6641 +vt 0.9372 0.6719 +vt 0.9294 0.6719 +vt 0.9138 0.7422 +vt 0.9216 0.7422 +vt 0.9216 0.7500 +vt 0.9138 0.7500 +vt 0.9138 0.7266 +vt 0.9216 0.7266 +vt 0.9216 0.7344 +vt 0.9138 0.7344 +vt 0.9294 0.7266 +vt 0.9372 0.7266 +vt 0.9372 0.7344 +vt 0.9294 0.7344 +vt 0.8513 0.6797 +vt 0.8591 0.6797 +vt 0.8591 0.6875 +vt 0.8513 0.6875 +vt 0.8513 0.6641 +vt 0.8591 0.6641 +vt 0.8591 0.6719 +vt 0.8513 0.6719 +vt 0.8669 0.6641 +vt 0.8748 0.6641 +vt 0.8747 0.6719 +vt 0.8669 0.6719 +vt 0.7889 0.6797 +vt 0.7967 0.6797 +vt 0.7967 0.6875 +vt 0.7889 0.6875 +vt 0.7889 0.6641 +vt 0.7967 0.6641 +vt 0.7967 0.6719 +vt 0.7889 0.6719 +vt 0.8045 0.6641 +vt 0.8123 0.6641 +vt 0.8123 0.6719 +vt 0.8045 0.6719 +vt 0.7888 0.7421 +vt 0.7966 0.7421 +vt 0.7966 0.7499 +vt 0.7888 0.7499 +vt 0.7888 0.7265 +vt 0.7966 0.7265 +vt 0.7966 0.7343 +vt 0.7888 0.7343 +vt 0.8045 0.7265 +vt 0.8123 0.7265 +vt 0.8123 0.7343 +vt 0.8045 0.7343 +vt 0.8514 0.5548 +vt 0.8592 0.5548 +vt 0.8592 0.5626 +vt 0.8514 0.5626 +vt 0.8514 0.5391 +vt 0.8592 0.5391 +vt 0.8592 0.5469 +vt 0.8514 0.5469 +vt 0.8670 0.5391 +vt 0.8748 0.5391 +vt 0.8748 0.5470 +vt 0.8670 0.5470 +vt 0.7889 0.5547 +vt 0.7967 0.5547 +vt 0.7967 0.5625 +vt 0.7889 0.5625 +vt 0.7889 0.5391 +vt 0.7967 0.5391 +vt 0.7967 0.5469 +vt 0.7889 0.5469 +vt 0.8045 0.5391 +vt 0.8123 0.5391 +vt 0.8123 0.5469 +vt 0.8045 0.5469 +vt 0.7889 0.6172 +vt 0.7967 0.6172 +vt 0.7967 0.6250 +vt 0.7889 0.6250 +vt 0.7889 0.6016 +vt 0.7967 0.6016 +vt 0.7967 0.6094 +vt 0.7889 0.6094 +vt 0.8045 0.6016 +vt 0.8123 0.6016 +vt 0.8123 0.6094 +vt 0.8045 0.6094 +vt 0.9763 0.5548 +vt 0.9841 0.5548 +vt 0.9841 0.5626 +vt 0.9763 0.5626 +vt 0.9763 0.5392 +vt 0.9841 0.5392 +vt 0.9841 0.5470 +vt 0.9763 0.5470 +vt 0.9919 0.5392 +vt 0.9997 0.5392 +vt 0.9997 0.5470 +vt 0.9919 0.5470 +vt 0.9138 0.5548 +vt 0.9216 0.5548 +vt 0.9216 0.5626 +vt 0.9138 0.5626 +vt 0.9138 0.5392 +vt 0.9216 0.5392 +vt 0.9216 0.5470 +vt 0.9138 0.5470 +vt 0.9294 0.5392 +vt 0.9373 0.5392 +vt 0.9373 0.5470 +vt 0.9294 0.5470 +vt 0.9138 0.6172 +vt 0.9216 0.6172 +vt 0.9216 0.6251 +vt 0.9138 0.6251 +vt 0.9138 0.6016 +vt 0.9216 0.6016 +vt 0.9216 0.6094 +vt 0.9138 0.6094 +vt 0.9294 0.6016 +vt 0.9372 0.6016 +vt 0.9372 0.6094 +vt 0.9294 0.6094 +vt 0.6015 0.6796 +vt 0.6093 0.6796 +vt 0.6093 0.6874 +vt 0.6015 0.6874 +vt 0.6015 0.6640 +vt 0.6093 0.6640 +vt 0.6093 0.6718 +vt 0.6015 0.6718 +vt 0.6171 0.6640 +vt 0.6249 0.6640 +vt 0.6249 0.6718 +vt 0.6171 0.6718 +vt 0.5390 0.6796 +vt 0.5468 0.6796 +vt 0.5468 0.6874 +vt 0.5390 0.6874 +vt 0.5390 0.6640 +vt 0.5468 0.6640 +vt 0.5468 0.6718 +vt 0.5390 0.6718 +vt 0.5546 0.6640 +vt 0.5624 0.6640 +vt 0.5624 0.6718 +vt 0.5546 0.6718 +vt 0.5390 0.7421 +vt 0.5468 0.7421 +vt 0.5468 0.7499 +vt 0.5390 0.7499 +vt 0.5390 0.7264 +vt 0.5468 0.7264 +vt 0.5468 0.7343 +vt 0.5390 0.7343 +vt 0.5546 0.7264 +vt 0.5624 0.7264 +vt 0.5624 0.7343 +vt 0.5546 0.7343 +vt 0.6015 0.5547 +vt 0.6093 0.5547 +vt 0.6093 0.5625 +vt 0.6015 0.5625 +vt 0.6015 0.5391 +vt 0.6093 0.5391 +vt 0.6093 0.5469 +vt 0.6015 0.5469 +vt 0.6171 0.5391 +vt 0.6249 0.5391 +vt 0.6249 0.5469 +vt 0.6171 0.5469 +vt 0.5390 0.5547 +vt 0.5468 0.5547 +vt 0.5468 0.5625 +vt 0.5390 0.5625 +vt 0.5390 0.5390 +vt 0.5468 0.5390 +vt 0.5468 0.5469 +vt 0.5390 0.5468 +vt 0.5546 0.5390 +vt 0.5625 0.5390 +vt 0.5625 0.5469 +vt 0.5546 0.5469 +vt 0.5390 0.6171 +vt 0.5468 0.6171 +vt 0.5468 0.6249 +vt 0.5390 0.6249 +vt 0.5390 0.6015 +vt 0.5468 0.6015 +vt 0.5468 0.6093 +vt 0.5390 0.6093 +vt 0.5546 0.6015 +vt 0.5624 0.6015 +vt 0.5624 0.6093 +vt 0.5546 0.6093 +vt 0.7264 0.5547 +vt 0.7342 0.5547 +vt 0.7342 0.5625 +vt 0.7264 0.5625 +vt 0.7264 0.5391 +vt 0.7342 0.5391 +vt 0.7342 0.5469 +vt 0.7264 0.5469 +vt 0.7420 0.5391 +vt 0.7499 0.5391 +vt 0.7499 0.5469 +vt 0.7420 0.5469 +vt 0.6640 0.5547 +vt 0.6718 0.5547 +vt 0.6718 0.5625 +vt 0.6640 0.5625 +vt 0.6640 0.5391 +vt 0.6718 0.5391 +vt 0.6718 0.5469 +vt 0.6640 0.5469 +vt 0.6796 0.5391 +vt 0.6874 0.5391 +vt 0.6874 0.5469 +vt 0.6796 0.5469 +vt 0.6639 0.6172 +vt 0.6717 0.6172 +vt 0.6717 0.6250 +vt 0.6639 0.6250 +vt 0.6639 0.6015 +vt 0.6718 0.6015 +vt 0.6718 0.6094 +vt 0.6639 0.6094 +vt 0.6796 0.6016 +vt 0.6874 0.6016 +vt 0.6874 0.6094 +vt 0.6796 0.6094 +vt 0.6014 0.9295 +vt 0.6092 0.9295 +vt 0.6092 0.9373 +vt 0.6014 0.9373 +vt 0.6014 0.9139 +vt 0.6092 0.9139 +vt 0.6092 0.9217 +vt 0.6014 0.9217 +vt 0.6170 0.9139 +vt 0.6248 0.9139 +vt 0.6248 0.9217 +vt 0.6170 0.9217 +vt 0.5389 0.9295 +vt 0.5467 0.9295 +vt 0.5467 0.9373 +vt 0.5389 0.9373 +vt 0.5389 0.9138 +vt 0.5467 0.9138 +vt 0.5467 0.9217 +vt 0.5389 0.9217 +vt 0.5545 0.9138 +vt 0.5623 0.9138 +vt 0.5623 0.9217 +vt 0.5545 0.9217 +vt 0.5389 0.9919 +vt 0.5467 0.9919 +vt 0.5467 0.9997 +vt 0.5389 0.9997 +vt 0.5389 0.9763 +vt 0.5467 0.9763 +vt 0.5467 0.9841 +vt 0.5389 0.9841 +vt 0.5545 0.9763 +vt 0.5623 0.9763 +vt 0.5623 0.9841 +vt 0.5545 0.9841 +vt 0.6014 0.8045 +vt 0.6092 0.8045 +vt 0.6092 0.8124 +vt 0.6014 0.8124 +vt 0.6014 0.7889 +vt 0.6092 0.7889 +vt 0.6092 0.7967 +vt 0.6014 0.7967 +vt 0.6170 0.7889 +vt 0.6248 0.7889 +vt 0.6248 0.7967 +vt 0.6170 0.7967 +vt 0.5389 0.8045 +vt 0.5468 0.8045 +vt 0.5468 0.8123 +vt 0.5389 0.8123 +vt 0.5390 0.7889 +vt 0.5468 0.7889 +vt 0.5468 0.7967 +vt 0.5390 0.7967 +vt 0.5546 0.7889 +vt 0.5624 0.7889 +vt 0.5624 0.7967 +vt 0.5546 0.7967 +vt 0.5389 0.8670 +vt 0.5467 0.8670 +vt 0.5467 0.8748 +vt 0.5389 0.8748 +vt 0.5389 0.8514 +vt 0.5467 0.8514 +vt 0.5467 0.8592 +vt 0.5389 0.8592 +vt 0.5546 0.8514 +vt 0.5624 0.8514 +vt 0.5624 0.8592 +vt 0.5545 0.8592 +vt 0.7263 0.8046 +vt 0.7342 0.8046 +vt 0.7342 0.8124 +vt 0.7263 0.8124 +vt 0.7264 0.7890 +vt 0.7342 0.7890 +vt 0.7342 0.7968 +vt 0.7264 0.7968 +vt 0.7420 0.7890 +vt 0.7498 0.7890 +vt 0.7498 0.7968 +vt 0.7420 0.7968 +vt 0.6639 0.8046 +vt 0.6717 0.8046 +vt 0.6717 0.8124 +vt 0.6639 0.8124 +vt 0.6639 0.7889 +vt 0.6717 0.7889 +vt 0.6717 0.7968 +vt 0.6639 0.7968 +vt 0.6795 0.7890 +vt 0.6873 0.7890 +vt 0.6873 0.7968 +vt 0.6795 0.7968 +vt 0.6639 0.8670 +vt 0.6717 0.8670 +vt 0.6717 0.8748 +vt 0.6639 0.8748 +vt 0.6639 0.8514 +vt 0.6717 0.8514 +vt 0.6717 0.8592 +vt 0.6639 0.8592 +vt 0.6795 0.8514 +vt 0.6873 0.8514 +vt 0.6873 0.8592 +vt 0.6795 0.8592 +vt 0.3516 0.6795 +vt 0.3594 0.6795 +vt 0.3594 0.6873 +vt 0.3516 0.6873 +vt 0.3516 0.6639 +vt 0.3594 0.6639 +vt 0.3594 0.6717 +vt 0.3516 0.6717 +vt 0.3672 0.6639 +vt 0.3750 0.6639 +vt 0.3750 0.6717 +vt 0.3672 0.6717 +vt 0.2891 0.6795 +vt 0.2969 0.6795 +vt 0.2969 0.6873 +vt 0.2891 0.6873 +vt 0.2891 0.6639 +vt 0.2969 0.6639 +vt 0.2969 0.6717 +vt 0.2891 0.6717 +vt 0.3047 0.6639 +vt 0.3125 0.6639 +vt 0.3125 0.6717 +vt 0.3047 0.6717 +vt 0.2891 0.7420 +vt 0.2969 0.7420 +vt 0.2969 0.7498 +vt 0.2891 0.7498 +vt 0.2891 0.7264 +vt 0.2969 0.7264 +vt 0.2969 0.7342 +vt 0.2891 0.7342 +vt 0.3047 0.7264 +vt 0.3125 0.7264 +vt 0.3125 0.7342 +vt 0.3047 0.7342 +vt 0.3516 0.5546 +vt 0.3594 0.5546 +vt 0.3594 0.5624 +vt 0.3516 0.5624 +vt 0.3516 0.5390 +vt 0.3594 0.5390 +vt 0.3594 0.5468 +vt 0.3516 0.5468 +vt 0.3672 0.5390 +vt 0.3751 0.5390 +vt 0.3751 0.5468 +vt 0.3672 0.5468 +vt 0.2892 0.5546 +vt 0.2970 0.5546 +vt 0.2970 0.5624 +vt 0.2892 0.5624 +vt 0.2892 0.5390 +vt 0.2970 0.5390 +vt 0.2970 0.5468 +vt 0.2892 0.5468 +vt 0.3048 0.5390 +vt 0.3126 0.5390 +vt 0.3126 0.5468 +vt 0.3048 0.5468 +vt 0.2891 0.6170 +vt 0.2969 0.6170 +vt 0.2969 0.6249 +vt 0.2891 0.6249 +vt 0.2891 0.6014 +vt 0.2970 0.6014 +vt 0.2969 0.6092 +vt 0.2891 0.6092 +vt 0.3048 0.6014 +vt 0.3126 0.6014 +vt 0.3126 0.6092 +vt 0.3048 0.6092 +vt 0.4766 0.5546 +vt 0.4844 0.5546 +vt 0.4844 0.5624 +vt 0.4766 0.5624 +vt 0.4766 0.5390 +vt 0.4844 0.5390 +vt 0.4844 0.5468 +vt 0.4766 0.5468 +vt 0.4922 0.5390 +vt 0.5000 0.5390 +vt 0.5000 0.5468 +vt 0.4922 0.5468 +vt 0.4141 0.5546 +vt 0.4219 0.5546 +vt 0.4219 0.5624 +vt 0.4141 0.5624 +vt 0.4141 0.5390 +vt 0.4219 0.5390 +vt 0.4219 0.5468 +vt 0.4141 0.5468 +vt 0.4297 0.5390 +vt 0.4375 0.5390 +vt 0.4375 0.5468 +vt 0.4297 0.5468 +vt 0.4141 0.6171 +vt 0.4219 0.6171 +vt 0.4219 0.6249 +vt 0.4141 0.6249 +vt 0.4141 0.6015 +vt 0.4219 0.6015 +vt 0.4219 0.6093 +vt 0.4141 0.6093 +vt 0.4297 0.6015 +vt 0.4375 0.6015 +vt 0.4375 0.6093 +vt 0.4297 0.6093 +vt 0.1017 0.6795 +vt 0.1095 0.6795 +vt 0.1095 0.6873 +vt 0.1017 0.6873 +vt 0.1017 0.6638 +vt 0.1095 0.6638 +vt 0.1095 0.6716 +vt 0.1017 0.6716 +vt 0.1173 0.6638 +vt 0.1251 0.6638 +vt 0.1251 0.6717 +vt 0.1173 0.6716 +vt 0.0392 0.6794 +vt 0.0471 0.6794 +vt 0.0471 0.6872 +vt 0.0392 0.6872 +vt 0.0393 0.6638 +vt 0.0471 0.6638 +vt 0.0471 0.6716 +vt 0.0392 0.6716 +vt 0.0549 0.6638 +vt 0.0627 0.6638 +vt 0.0627 0.6716 +vt 0.0549 0.6716 +vt 0.0392 0.7419 +vt 0.0470 0.7419 +vt 0.0470 0.7497 +vt 0.0392 0.7497 +vt 0.0392 0.7263 +vt 0.0470 0.7263 +vt 0.0470 0.7341 +vt 0.0392 0.7341 +vt 0.0548 0.7263 +vt 0.0627 0.7263 +vt 0.0627 0.7341 +vt 0.0548 0.7341 +vt 0.1018 0.5545 +vt 0.1096 0.5545 +vt 0.1096 0.5623 +vt 0.1018 0.5623 +vt 0.1018 0.5389 +vt 0.1096 0.5389 +vt 0.1096 0.5467 +vt 0.1018 0.5467 +vt 0.1174 0.5389 +vt 0.1252 0.5389 +vt 0.1252 0.5467 +vt 0.1174 0.5467 +vt 0.0393 0.5545 +vt 0.0471 0.5545 +vt 0.0471 0.5623 +vt 0.0393 0.5623 +vt 0.0393 0.5389 +vt 0.0471 0.5389 +vt 0.0471 0.5467 +vt 0.0393 0.5467 +vt 0.0549 0.5389 +vt 0.0627 0.5389 +vt 0.0627 0.5467 +vt 0.0549 0.5467 +vt 0.0393 0.6170 +vt 0.0471 0.6170 +vt 0.0471 0.6248 +vt 0.0393 0.6248 +vt 0.0393 0.6013 +vt 0.0471 0.6014 +vt 0.0471 0.6092 +vt 0.0393 0.6092 +vt 0.0549 0.6014 +vt 0.0627 0.6014 +vt 0.0627 0.6092 +vt 0.0549 0.6092 +vt 0.2267 0.5546 +vt 0.2345 0.5546 +vt 0.2345 0.5624 +vt 0.2267 0.5624 +vt 0.2267 0.5389 +vt 0.2345 0.5389 +vt 0.2345 0.5468 +vt 0.2267 0.5468 +vt 0.2423 0.5389 +vt 0.2501 0.5389 +vt 0.2501 0.5468 +vt 0.2423 0.5468 +vt 0.1642 0.5545 +vt 0.1720 0.5545 +vt 0.1720 0.5623 +vt 0.1642 0.5623 +vt 0.1642 0.5389 +vt 0.1720 0.5389 +vt 0.1720 0.5467 +vt 0.1642 0.5467 +vt 0.1798 0.5389 +vt 0.1877 0.5389 +vt 0.1877 0.5467 +vt 0.1798 0.5467 +vt 0.1642 0.6170 +vt 0.1720 0.6170 +vt 0.1720 0.6248 +vt 0.1642 0.6248 +vt 0.1642 0.6014 +vt 0.1720 0.6014 +vt 0.1720 0.6092 +vt 0.1642 0.6092 +vt 0.1798 0.6014 +vt 0.1876 0.6014 +vt 0.1876 0.6092 +vt 0.1798 0.6092 +vt 0.1016 0.9293 +vt 0.1094 0.9293 +vt 0.1094 0.9371 +vt 0.1016 0.9371 +vt 0.1016 0.9137 +vt 0.1094 0.9137 +vt 0.1094 0.9215 +vt 0.1016 0.9215 +vt 0.1173 0.9137 +vt 0.1251 0.9137 +vt 0.1251 0.9215 +vt 0.1173 0.9215 +vt 0.0392 0.9293 +vt 0.0470 0.9293 +vt 0.0470 0.9371 +vt 0.0392 0.9371 +vt 0.0392 0.9137 +vt 0.0470 0.9137 +vt 0.0470 0.9215 +vt 0.0392 0.9215 +vt 0.0548 0.9137 +vt 0.0626 0.9137 +vt 0.0626 0.9215 +vt 0.0548 0.9215 +vt 0.0391 0.9918 +vt 0.0470 0.9918 +vt 0.0470 0.9996 +vt 0.0391 0.9996 +vt 0.0392 0.9762 +vt 0.0470 0.9762 +vt 0.0470 0.9840 +vt 0.0391 0.9840 +vt 0.0548 0.9762 +vt 0.0626 0.9762 +vt 0.0626 0.9840 +vt 0.0548 0.9840 +vt 0.1017 0.8044 +vt 0.1095 0.8044 +vt 0.1095 0.8122 +vt 0.1017 0.8122 +vt 0.1017 0.7888 +vt 0.1095 0.7888 +vt 0.1095 0.7966 +vt 0.1017 0.7966 +vt 0.1173 0.7888 +vt 0.1251 0.7888 +vt 0.1251 0.7966 +vt 0.1173 0.7966 +vt 0.0392 0.8044 +vt 0.0470 0.8044 +vt 0.0470 0.8122 +vt 0.0392 0.8122 +vt 0.0392 0.7888 +vt 0.0470 0.7888 +vt 0.0470 0.7966 +vt 0.0392 0.7966 +vt 0.0548 0.7888 +vt 0.0626 0.7888 +vt 0.0626 0.7966 +vt 0.0548 0.7966 +vt 0.0392 0.8668 +vt 0.0470 0.8668 +vt 0.0470 0.8746 +vt 0.0392 0.8746 +vt 0.0392 0.8512 +vt 0.0470 0.8512 +vt 0.0470 0.8590 +vt 0.0392 0.8590 +vt 0.0548 0.8512 +vt 0.0626 0.8512 +vt 0.0626 0.8590 +vt 0.0548 0.8590 +vt 0.2266 0.8044 +vt 0.2344 0.8044 +vt 0.2344 0.8122 +vt 0.2266 0.8122 +vt 0.2266 0.7888 +vt 0.2344 0.7888 +vt 0.2344 0.7966 +vt 0.2266 0.7966 +vt 0.2422 0.7888 +vt 0.2500 0.7888 +vt 0.2500 0.7966 +vt 0.2422 0.7966 +vt 0.1641 0.8044 +vt 0.1720 0.8044 +vt 0.1719 0.8122 +vt 0.1641 0.8122 +vt 0.1641 0.7888 +vt 0.1720 0.7888 +vt 0.1720 0.7966 +vt 0.1641 0.7966 +vt 0.1798 0.7888 +vt 0.1876 0.7888 +vt 0.1876 0.7966 +vt 0.1798 0.7966 +vt 0.1641 0.8669 +vt 0.1719 0.8669 +vt 0.1719 0.8747 +vt 0.1641 0.8747 +vt 0.1641 0.8513 +vt 0.1719 0.8513 +vt 0.1719 0.8591 +vt 0.1641 0.8591 +vt 0.1797 0.8513 +vt 0.1876 0.8513 +vt 0.1876 0.8591 +vt 0.1797 0.8591 +vt 0.3517 0.1798 +vt 0.3596 0.1798 +vt 0.3595 0.1876 +vt 0.3517 0.1876 +vt 0.3517 0.1642 +vt 0.3596 0.1642 +vt 0.3596 0.1720 +vt 0.3517 0.1720 +vt 0.3674 0.1642 +vt 0.3752 0.1642 +vt 0.3752 0.1720 +vt 0.3674 0.1720 +vt 0.2893 0.1798 +vt 0.2971 0.1798 +vt 0.2971 0.1876 +vt 0.2893 0.1876 +vt 0.2893 0.1642 +vt 0.2971 0.1642 +vt 0.2971 0.1720 +vt 0.2893 0.1720 +vt 0.3049 0.1642 +vt 0.3127 0.1642 +vt 0.3127 0.1720 +vt 0.3049 0.1720 +vt 0.2893 0.2422 +vt 0.2971 0.2422 +vt 0.2971 0.2501 +vt 0.2893 0.2501 +vt 0.2893 0.2266 +vt 0.2971 0.2266 +vt 0.2971 0.2344 +vt 0.2893 0.2344 +vt 0.3049 0.2266 +vt 0.3127 0.2266 +vt 0.3127 0.2344 +vt 0.3049 0.2344 +vt 0.3518 0.0549 +vt 0.3596 0.0549 +vt 0.3596 0.0627 +vt 0.3518 0.0627 +vt 0.3518 0.0392 +vt 0.3596 0.0393 +vt 0.3596 0.0471 +vt 0.3518 0.0471 +vt 0.3674 0.0393 +vt 0.3752 0.0393 +vt 0.3752 0.0471 +vt 0.3674 0.0471 +vt 0.2893 0.0548 +vt 0.2971 0.0548 +vt 0.2971 0.0627 +vt 0.2893 0.0627 +vt 0.2893 0.0392 +vt 0.2971 0.0392 +vt 0.2971 0.0470 +vt 0.2893 0.0470 +vt 0.3049 0.0392 +vt 0.3127 0.0392 +vt 0.3127 0.0470 +vt 0.3049 0.0470 +vt 0.2893 0.1173 +vt 0.2971 0.1173 +vt 0.2971 0.1251 +vt 0.2893 0.1251 +vt 0.2893 0.1017 +vt 0.2971 0.1017 +vt 0.2971 0.1095 +vt 0.2893 0.1095 +vt 0.3049 0.1017 +vt 0.3127 0.1017 +vt 0.3127 0.1095 +vt 0.3049 0.1095 +vt 0.4767 0.0549 +vt 0.4845 0.0549 +vt 0.4845 0.0627 +vt 0.4767 0.0627 +vt 0.4767 0.0393 +vt 0.4845 0.0393 +vt 0.4845 0.0471 +vt 0.4767 0.0471 +vt 0.4923 0.0393 +vt 0.5001 0.0393 +vt 0.5001 0.0471 +vt 0.4923 0.0471 +vt 0.4142 0.0549 +vt 0.4221 0.0549 +vt 0.4221 0.0627 +vt 0.4142 0.0627 +vt 0.4143 0.0393 +vt 0.4221 0.0393 +vt 0.4221 0.0471 +vt 0.4142 0.0471 +vt 0.4299 0.0393 +vt 0.4377 0.0393 +vt 0.4377 0.0471 +vt 0.4299 0.0471 +vt 0.4142 0.1173 +vt 0.4220 0.1174 +vt 0.4220 0.1252 +vt 0.4142 0.1252 +vt 0.4142 0.1017 +vt 0.4220 0.1017 +vt 0.4220 0.1095 +vt 0.4142 0.1095 +vt 0.4298 0.1017 +vt 0.4377 0.1017 +vt 0.4377 0.1095 +vt 0.4298 0.1095 +vt 0.1019 0.1797 +vt 0.1097 0.1797 +vt 0.1097 0.1875 +vt 0.1019 0.1875 +vt 0.1019 0.1641 +vt 0.1097 0.1641 +vt 0.1097 0.1719 +vt 0.1019 0.1719 +vt 0.1175 0.1641 +vt 0.1253 0.1641 +vt 0.1253 0.1719 +vt 0.1175 0.1719 +vt 0.0394 0.1797 +vt 0.0472 0.1797 +vt 0.0472 0.1875 +vt 0.0394 0.1875 +vt 0.0394 0.1641 +vt 0.0472 0.1641 +vt 0.0472 0.1719 +vt 0.0394 0.1719 +vt 0.0550 0.1641 +vt 0.0628 0.1641 +vt 0.0628 0.1719 +vt 0.0550 0.1719 +vt 0.0394 0.2422 +vt 0.0472 0.2422 +vt 0.0472 0.2500 +vt 0.0394 0.2500 +vt 0.0394 0.2265 +vt 0.0472 0.2266 +vt 0.0472 0.2344 +vt 0.0394 0.2344 +vt 0.0550 0.2266 +vt 0.0628 0.2266 +vt 0.0628 0.2344 +vt 0.0550 0.2344 +vt 0.1019 0.0548 +vt 0.1097 0.0548 +vt 0.1097 0.0626 +vt 0.1019 0.0626 +vt 0.1019 0.0392 +vt 0.1097 0.0392 +vt 0.1097 0.0470 +vt 0.1019 0.0470 +vt 0.1175 0.0392 +vt 0.1253 0.0392 +vt 0.1253 0.0470 +vt 0.1175 0.0470 +vt 0.0395 0.0548 +vt 0.0473 0.0548 +vt 0.0473 0.0626 +vt 0.0395 0.0626 +vt 0.0395 0.0392 +vt 0.0473 0.0392 +vt 0.0473 0.0470 +vt 0.0395 0.0470 +vt 0.0551 0.0392 +vt 0.0629 0.0392 +vt 0.0629 0.0470 +vt 0.0551 0.0470 +vt 0.0394 0.1172 +vt 0.0472 0.1172 +vt 0.0472 0.1250 +vt 0.0394 0.1250 +vt 0.0394 0.1016 +vt 0.0472 0.1016 +vt 0.0472 0.1094 +vt 0.0394 0.1094 +vt 0.0551 0.1016 +vt 0.0629 0.1016 +vt 0.0629 0.1094 +vt 0.0551 0.1094 +vt 0.2268 0.0548 +vt 0.2347 0.0548 +vt 0.2347 0.0626 +vt 0.2268 0.0626 +vt 0.2269 0.0392 +vt 0.2347 0.0392 +vt 0.2347 0.0470 +vt 0.2269 0.0470 +vt 0.2425 0.0392 +vt 0.2503 0.0392 +vt 0.2503 0.0470 +vt 0.2425 0.0470 +vt 0.1644 0.0548 +vt 0.1722 0.0548 +vt 0.1722 0.0626 +vt 0.1644 0.0626 +vt 0.1644 0.0392 +vt 0.1722 0.0392 +vt 0.1722 0.0470 +vt 0.1644 0.0470 +vt 0.1800 0.0392 +vt 0.1878 0.0392 +vt 0.1878 0.0470 +vt 0.1800 0.0470 +vt 0.1644 0.1173 +vt 0.1722 0.1173 +vt 0.1722 0.1251 +vt 0.1644 0.1251 +vt 0.1644 0.1017 +vt 0.1722 0.1017 +vt 0.1722 0.1095 +vt 0.1644 0.1095 +vt 0.1800 0.1017 +vt 0.1878 0.1017 +vt 0.1878 0.1095 +vt 0.1800 0.1095 +vt 0.1018 0.4296 +vt 0.1096 0.4296 +vt 0.1096 0.4374 +vt 0.1018 0.4374 +vt 0.1018 0.4140 +vt 0.1096 0.4140 +vt 0.1096 0.4218 +vt 0.1018 0.4218 +vt 0.1174 0.4140 +vt 0.1252 0.4140 +vt 0.1252 0.4218 +vt 0.1174 0.4218 +vt 0.0393 0.4296 +vt 0.0471 0.4296 +vt 0.0471 0.4374 +vt 0.0393 0.4374 +vt 0.0393 0.4139 +vt 0.0471 0.4139 +vt 0.0471 0.4218 +vt 0.0393 0.4218 +vt 0.0550 0.4140 +vt 0.0628 0.4140 +vt 0.0628 0.4218 +vt 0.0549 0.4218 +vt 0.0393 0.4920 +vt 0.0471 0.4920 +vt 0.0471 0.4998 +vt 0.0393 0.4998 +vt 0.0393 0.4764 +vt 0.0471 0.4764 +vt 0.0471 0.4842 +vt 0.0393 0.4842 +vt 0.0549 0.4764 +vt 0.0627 0.4764 +vt 0.0627 0.4842 +vt 0.0549 0.4842 +vt 0.1018 0.3047 +vt 0.1096 0.3047 +vt 0.1096 0.3125 +vt 0.1018 0.3125 +vt 0.1018 0.2890 +vt 0.1097 0.2890 +vt 0.1096 0.2968 +vt 0.1018 0.2968 +vt 0.1175 0.2890 +vt 0.1253 0.2890 +vt 0.1253 0.2969 +vt 0.1175 0.2968 +vt 0.0394 0.3046 +vt 0.0472 0.3046 +vt 0.0472 0.3124 +vt 0.0394 0.3124 +vt 0.0394 0.2890 +vt 0.0472 0.2890 +vt 0.0472 0.2968 +vt 0.0394 0.2968 +vt 0.0550 0.2890 +vt 0.0628 0.2890 +vt 0.0628 0.2968 +vt 0.0550 0.2968 +vt 0.0394 0.3671 +vt 0.0472 0.3671 +vt 0.0472 0.3749 +vt 0.0393 0.3749 +vt 0.0394 0.3515 +vt 0.0472 0.3515 +vt 0.0472 0.3593 +vt 0.0394 0.3593 +vt 0.0550 0.3515 +vt 0.0628 0.3515 +vt 0.0628 0.3593 +vt 0.0550 0.3593 +vt 0.2268 0.3047 +vt 0.2346 0.3047 +vt 0.2346 0.3125 +vt 0.2268 0.3125 +vt 0.2268 0.2891 +vt 0.2346 0.2891 +vt 0.2346 0.2969 +vt 0.2268 0.2969 +vt 0.2424 0.2891 +vt 0.2502 0.2891 +vt 0.2502 0.2969 +vt 0.2424 0.2969 +vt 0.1643 0.3047 +vt 0.1721 0.3047 +vt 0.1721 0.3125 +vt 0.1643 0.3125 +vt 0.1643 0.2891 +vt 0.1721 0.2891 +vt 0.1721 0.2969 +vt 0.1643 0.2969 +vt 0.1799 0.2891 +vt 0.1877 0.2891 +vt 0.1877 0.2969 +vt 0.1799 0.2969 +vt 0.1643 0.3671 +vt 0.1721 0.3671 +vt 0.1721 0.3749 +vt 0.1643 0.3749 +vt 0.1643 0.3515 +vt 0.1721 0.3515 +vt 0.1721 0.3593 +vt 0.1643 0.3593 +vt 0.1799 0.3515 +vt 0.1877 0.3515 +vt 0.1877 0.3593 +vt 0.1799 0.3593 +vt 0.8515 0.1800 +vt 0.8593 0.1800 +vt 0.8593 0.1878 +vt 0.8515 0.1878 +vt 0.8515 0.1643 +vt 0.8593 0.1643 +vt 0.8593 0.1721 +vt 0.8515 0.1721 +vt 0.8671 0.1643 +vt 0.8749 0.1643 +vt 0.8749 0.1721 +vt 0.8671 0.1721 +vt 0.7890 0.1799 +vt 0.7968 0.1799 +vt 0.7968 0.1877 +vt 0.7890 0.1877 +vt 0.7890 0.1643 +vt 0.7968 0.1643 +vt 0.7968 0.1721 +vt 0.7890 0.1721 +vt 0.8046 0.1643 +vt 0.8124 0.1643 +vt 0.8124 0.1721 +vt 0.8046 0.1721 +vt 0.7890 0.2424 +vt 0.7968 0.2424 +vt 0.7968 0.2502 +vt 0.7890 0.2502 +vt 0.7890 0.2268 +vt 0.7968 0.2268 +vt 0.7968 0.2346 +vt 0.7890 0.2346 +vt 0.8046 0.2268 +vt 0.8124 0.2268 +vt 0.8124 0.2346 +vt 0.8046 0.2346 +vt 0.8515 0.0550 +vt 0.8593 0.0550 +vt 0.8593 0.0628 +vt 0.8515 0.0628 +vt 0.8515 0.0394 +vt 0.8593 0.0394 +vt 0.8593 0.0472 +vt 0.8515 0.0472 +vt 0.8671 0.0394 +vt 0.8750 0.0394 +vt 0.8749 0.0472 +vt 0.8671 0.0472 +vt 0.7891 0.0550 +vt 0.7969 0.0550 +vt 0.7969 0.0628 +vt 0.7890 0.0628 +vt 0.7891 0.0394 +vt 0.7969 0.0394 +vt 0.7969 0.0472 +vt 0.7891 0.0472 +vt 0.8047 0.0394 +vt 0.8125 0.0394 +vt 0.8125 0.0472 +vt 0.8047 0.0472 +vt 0.7890 0.1175 +vt 0.7968 0.1175 +vt 0.7968 0.1253 +vt 0.7890 0.1253 +vt 0.7890 0.1018 +vt 0.7968 0.1018 +vt 0.7968 0.1097 +vt 0.7890 0.1097 +vt 0.8047 0.1019 +vt 0.8125 0.1019 +vt 0.8125 0.1097 +vt 0.8047 0.1097 +vt 0.9765 0.0551 +vt 0.9843 0.0551 +vt 0.9843 0.0629 +vt 0.9765 0.0629 +vt 0.9765 0.0394 +vt 0.9843 0.0394 +vt 0.9843 0.0472 +vt 0.9765 0.0472 +vt 0.9921 0.0394 +vt 0.9999 0.0394 +vt 0.9999 0.0473 +vt 0.9921 0.0472 +vt 0.9140 0.0550 +vt 0.9218 0.0550 +vt 0.9218 0.0628 +vt 0.9140 0.0628 +vt 0.9140 0.0394 +vt 0.9218 0.0394 +vt 0.9218 0.0472 +vt 0.9140 0.0472 +vt 0.9296 0.0394 +vt 0.9374 0.0394 +vt 0.9374 0.0472 +vt 0.9296 0.0472 +vt 0.9140 0.1175 +vt 0.9218 0.1175 +vt 0.9218 0.1253 +vt 0.9140 0.1253 +vt 0.9140 0.1019 +vt 0.9218 0.1019 +vt 0.9218 0.1097 +vt 0.9140 0.1097 +vt 0.9296 0.1019 +vt 0.9374 0.1019 +vt 0.9374 0.1097 +vt 0.9296 0.1097 +vt 0.6016 0.1799 +vt 0.6094 0.1799 +vt 0.6094 0.1877 +vt 0.6016 0.1877 +vt 0.6016 0.1643 +vt 0.6094 0.1643 +vt 0.6094 0.1721 +vt 0.6016 0.1721 +vt 0.6172 0.1643 +vt 0.6250 0.1643 +vt 0.6250 0.1721 +vt 0.6172 0.1721 +vt 0.5391 0.1799 +vt 0.5470 0.1799 +vt 0.5469 0.1877 +vt 0.5391 0.1877 +vt 0.5391 0.1642 +vt 0.5470 0.1642 +vt 0.5470 0.1720 +vt 0.5391 0.1720 +vt 0.5548 0.1642 +vt 0.5626 0.1642 +vt 0.5626 0.1721 +vt 0.5548 0.1721 +vt 0.5391 0.2423 +vt 0.5469 0.2423 +vt 0.5469 0.2501 +vt 0.5391 0.2501 +vt 0.5391 0.2267 +vt 0.5469 0.2267 +vt 0.5469 0.2345 +vt 0.5391 0.2345 +vt 0.5547 0.2267 +vt 0.5626 0.2267 +vt 0.5626 0.2345 +vt 0.5547 0.2345 +vt 0.6016 0.0549 +vt 0.6095 0.0549 +vt 0.6095 0.0627 +vt 0.6016 0.0627 +vt 0.6017 0.0393 +vt 0.6095 0.0393 +vt 0.6095 0.0471 +vt 0.6017 0.0471 +vt 0.6173 0.0393 +vt 0.6251 0.0393 +vt 0.6251 0.0471 +vt 0.6173 0.0471 +vt 0.5392 0.0549 +vt 0.5470 0.0549 +vt 0.5470 0.0627 +vt 0.5392 0.0627 +vt 0.5392 0.0393 +vt 0.5470 0.0393 +vt 0.5470 0.0471 +vt 0.5392 0.0471 +vt 0.5548 0.0393 +vt 0.5626 0.0393 +vt 0.5626 0.0471 +vt 0.5548 0.0471 +vt 0.5392 0.1174 +vt 0.5470 0.1174 +vt 0.5470 0.1252 +vt 0.5392 0.1252 +vt 0.5392 0.1018 +vt 0.5470 0.1018 +vt 0.5470 0.1096 +vt 0.5392 0.1096 +vt 0.5548 0.1018 +vt 0.5626 0.1018 +vt 0.5626 0.1096 +vt 0.5548 0.1096 +vt 0.7266 0.0550 +vt 0.7344 0.0550 +vt 0.7344 0.0628 +vt 0.7266 0.0628 +vt 0.7266 0.0394 +vt 0.7344 0.0394 +vt 0.7344 0.0472 +vt 0.7266 0.0472 +vt 0.7422 0.0394 +vt 0.7500 0.0394 +vt 0.7500 0.0472 +vt 0.7422 0.0472 +vt 0.6641 0.0550 +vt 0.6719 0.0550 +vt 0.6719 0.0628 +vt 0.6641 0.0628 +vt 0.6641 0.0393 +vt 0.6719 0.0393 +vt 0.6719 0.0472 +vt 0.6641 0.0471 +vt 0.6797 0.0393 +vt 0.6875 0.0393 +vt 0.6875 0.0472 +vt 0.6797 0.0472 +vt 0.6641 0.1174 +vt 0.6719 0.1174 +vt 0.6719 0.1252 +vt 0.6641 0.1252 +vt 0.6641 0.1018 +vt 0.6719 0.1018 +vt 0.6719 0.1096 +vt 0.6641 0.1096 +vt 0.6797 0.1018 +vt 0.6875 0.1018 +vt 0.6875 0.1096 +vt 0.6797 0.1096 +vt 0.6015 0.4297 +vt 0.6093 0.4297 +vt 0.6093 0.4376 +vt 0.6015 0.4376 +vt 0.6015 0.4141 +vt 0.6093 0.4141 +vt 0.6093 0.4219 +vt 0.6015 0.4219 +vt 0.6172 0.4141 +vt 0.6250 0.4141 +vt 0.6250 0.4219 +vt 0.6172 0.4219 +vt 0.5391 0.4297 +vt 0.5469 0.4297 +vt 0.5469 0.4375 +vt 0.5391 0.4375 +vt 0.5391 0.4141 +vt 0.5469 0.4141 +vt 0.5469 0.4219 +vt 0.5391 0.4219 +vt 0.5547 0.4141 +vt 0.5625 0.4141 +vt 0.5625 0.4219 +vt 0.5547 0.4219 +vt 0.5390 0.4922 +vt 0.5469 0.4922 +vt 0.5469 0.5000 +vt 0.5390 0.5000 +vt 0.5391 0.4766 +vt 0.5469 0.4766 +vt 0.5469 0.4844 +vt 0.5390 0.4844 +vt 0.5547 0.4766 +vt 0.5625 0.4766 +vt 0.5625 0.4844 +vt 0.5547 0.4844 +vt 0.6016 0.3048 +vt 0.6094 0.3048 +vt 0.6094 0.3126 +vt 0.6016 0.3126 +vt 0.6016 0.2892 +vt 0.6094 0.2892 +vt 0.6094 0.2970 +vt 0.6016 0.2970 +vt 0.6172 0.2892 +vt 0.6250 0.2892 +vt 0.6250 0.2970 +vt 0.6172 0.2970 +vt 0.5391 0.3048 +vt 0.5469 0.3048 +vt 0.5469 0.3126 +vt 0.5391 0.3126 +vt 0.5391 0.2892 +vt 0.5469 0.2892 +vt 0.5469 0.2970 +vt 0.5391 0.2970 +vt 0.5547 0.2892 +vt 0.5625 0.2892 +vt 0.5625 0.2970 +vt 0.5547 0.2970 +vt 0.5391 0.3673 +vt 0.5469 0.3673 +vt 0.5469 0.3751 +vt 0.5391 0.3751 +vt 0.5391 0.3516 +vt 0.5469 0.3516 +vt 0.5469 0.3594 +vt 0.5391 0.3594 +vt 0.5547 0.3516 +vt 0.5625 0.3516 +vt 0.5625 0.3595 +vt 0.5547 0.3595 +vt 0.7265 0.3048 +vt 0.7343 0.3048 +vt 0.7343 0.3127 +vt 0.7265 0.3127 +vt 0.7265 0.2892 +vt 0.7343 0.2892 +vt 0.7343 0.2970 +vt 0.7265 0.2970 +vt 0.7421 0.2892 +vt 0.7499 0.2892 +vt 0.7499 0.2970 +vt 0.7421 0.2970 +vt 0.6640 0.3048 +vt 0.6718 0.3048 +vt 0.6718 0.3126 +vt 0.6640 0.3126 +vt 0.6640 0.2892 +vt 0.6719 0.2892 +vt 0.6718 0.2970 +vt 0.6640 0.2970 +vt 0.6797 0.2892 +vt 0.6875 0.2892 +vt 0.6875 0.2970 +vt 0.6797 0.2970 +vt 0.6640 0.3673 +vt 0.6718 0.3673 +vt 0.6718 0.3751 +vt 0.6640 0.3751 +vt 0.6640 0.3517 +vt 0.6718 0.3517 +vt 0.6718 0.3595 +vt 0.6640 0.3595 +vt 0.6796 0.3517 +vt 0.6874 0.3517 +vt 0.6874 0.3595 +vt 0.6796 0.3595 +vt 0.8514 0.4298 +vt 0.8592 0.4298 +vt 0.8592 0.4376 +vt 0.8514 0.4376 +vt 0.8514 0.4142 +vt 0.8592 0.4142 +vt 0.8592 0.4220 +vt 0.8514 0.4220 +vt 0.8670 0.4142 +vt 0.8748 0.4142 +vt 0.8748 0.4220 +vt 0.8670 0.4220 +vt 0.7889 0.4298 +vt 0.7967 0.4298 +vt 0.7967 0.4376 +vt 0.7889 0.4376 +vt 0.7889 0.4142 +vt 0.7967 0.4142 +vt 0.7967 0.4220 +vt 0.7889 0.4220 +vt 0.8046 0.4142 +vt 0.8124 0.4142 +vt 0.8124 0.4220 +vt 0.8046 0.4220 +vt 0.7889 0.4923 +vt 0.7967 0.4923 +vt 0.7967 0.5001 +vt 0.7889 0.5001 +vt 0.7889 0.4767 +vt 0.7967 0.4767 +vt 0.7967 0.4845 +vt 0.7889 0.4845 +vt 0.8045 0.4767 +vt 0.8123 0.4767 +vt 0.8123 0.4845 +vt 0.8045 0.4845 +vt 0.8514 0.3049 +vt 0.8592 0.3049 +vt 0.8592 0.3127 +vt 0.8514 0.3127 +vt 0.8514 0.2893 +vt 0.8593 0.2893 +vt 0.8593 0.2971 +vt 0.8514 0.2971 +vt 0.8671 0.2893 +vt 0.8749 0.2893 +vt 0.8749 0.2971 +vt 0.8671 0.2971 +vt 0.7890 0.3049 +vt 0.7968 0.3049 +vt 0.7968 0.3127 +vt 0.7890 0.3127 +vt 0.7890 0.2892 +vt 0.7968 0.2893 +vt 0.7968 0.2971 +vt 0.7890 0.2971 +vt 0.8046 0.2893 +vt 0.8124 0.2893 +vt 0.8124 0.2971 +vt 0.8046 0.2971 +vt 0.7890 0.3673 +vt 0.7968 0.3673 +vt 0.7968 0.3751 +vt 0.7890 0.3751 +vt 0.7890 0.3517 +vt 0.7968 0.3517 +vt 0.7968 0.3595 +vt 0.7890 0.3595 +vt 0.8046 0.3517 +vt 0.8124 0.3517 +vt 0.8124 0.3595 +vt 0.8046 0.3595 +vt 0.9764 0.3049 +vt 0.9842 0.3049 +vt 0.9842 0.3127 +vt 0.9764 0.3127 +vt 0.9764 0.2893 +vt 0.9842 0.2893 +vt 0.9842 0.2971 +vt 0.9764 0.2971 +vt 0.9920 0.2893 +vt 0.9998 0.2893 +vt 0.9998 0.2971 +vt 0.9920 0.2971 +vt 0.9139 0.3049 +vt 0.9217 0.3049 +vt 0.9217 0.3127 +vt 0.9139 0.3127 +vt 0.9139 0.2893 +vt 0.9217 0.2893 +vt 0.9217 0.2971 +vt 0.9139 0.2971 +vt 0.9295 0.2893 +vt 0.9373 0.2893 +vt 0.9373 0.2971 +vt 0.9295 0.2971 +vt 0.9139 0.3674 +vt 0.9217 0.3674 +vt 0.9217 0.3752 +vt 0.9139 0.3752 +vt 0.9139 0.3518 +vt 0.9217 0.3518 +vt 0.9217 0.3596 +vt 0.9139 0.3596 +vt 0.9295 0.3518 +vt 0.9373 0.3518 +vt 0.9373 0.3596 +vt 0.9295 0.3596 +vt 0.3517 0.4297 +vt 0.3595 0.4297 +vt 0.3595 0.4375 +vt 0.3517 0.4375 +vt 0.3517 0.4140 +vt 0.3595 0.4140 +vt 0.3595 0.4219 +vt 0.3517 0.4219 +vt 0.3673 0.4141 +vt 0.3751 0.4141 +vt 0.3751 0.4219 +vt 0.3673 0.4219 +vt 0.2892 0.4296 +vt 0.2970 0.4296 +vt 0.2970 0.4375 +vt 0.2892 0.4375 +vt 0.2892 0.4140 +vt 0.2970 0.4140 +vt 0.2970 0.4218 +vt 0.2892 0.4218 +vt 0.3048 0.4140 +vt 0.3126 0.4140 +vt 0.3126 0.4218 +vt 0.3048 0.4218 +vt 0.2892 0.4921 +vt 0.2970 0.4921 +vt 0.2970 0.4999 +vt 0.2892 0.4999 +vt 0.2892 0.4765 +vt 0.2970 0.4765 +vt 0.2970 0.4843 +vt 0.2892 0.4843 +vt 0.3048 0.4765 +vt 0.3126 0.4765 +vt 0.3126 0.4843 +vt 0.3048 0.4843 +vt 0.3517 0.3047 +vt 0.3595 0.3047 +vt 0.3595 0.3125 +vt 0.3517 0.3125 +vt 0.3517 0.2891 +vt 0.3595 0.2891 +vt 0.3595 0.2969 +vt 0.3517 0.2969 +vt 0.3673 0.2891 +vt 0.3751 0.2891 +vt 0.3751 0.2969 +vt 0.3673 0.2969 +vt 0.2892 0.3047 +vt 0.2970 0.3047 +vt 0.2970 0.3125 +vt 0.2892 0.3125 +vt 0.2892 0.2891 +vt 0.2971 0.2891 +vt 0.2970 0.2969 +vt 0.2892 0.2969 +vt 0.3049 0.2891 +vt 0.3127 0.2891 +vt 0.3127 0.2969 +vt 0.3049 0.2969 +vt 0.2892 0.3672 +vt 0.2970 0.3672 +vt 0.2970 0.3750 +vt 0.2892 0.3750 +vt 0.2892 0.3516 +vt 0.2970 0.3516 +vt 0.2970 0.3594 +vt 0.2892 0.3594 +vt 0.3048 0.3516 +vt 0.3126 0.3516 +vt 0.3126 0.3594 +vt 0.3048 0.3594 +vt 0.4766 0.3048 +vt 0.4844 0.3048 +vt 0.4844 0.3126 +vt 0.4766 0.3126 +vt 0.4766 0.2892 +vt 0.4845 0.2892 +vt 0.4844 0.2970 +vt 0.4766 0.2970 +vt 0.4923 0.2892 +vt 0.5001 0.2892 +vt 0.5001 0.2970 +vt 0.4923 0.2970 +vt 0.4142 0.3047 +vt 0.4220 0.3048 +vt 0.4220 0.3126 +vt 0.4142 0.3126 +vt 0.4142 0.2891 +vt 0.4220 0.2891 +vt 0.4220 0.2969 +vt 0.4142 0.2969 +vt 0.4298 0.2891 +vt 0.4376 0.2891 +vt 0.4376 0.2969 +vt 0.4298 0.2969 +vt 0.4142 0.3672 +vt 0.4220 0.3672 +vt 0.4220 0.3750 +vt 0.4141 0.3750 +vt 0.4142 0.3516 +vt 0.4220 0.3516 +vt 0.4220 0.3594 +vt 0.4142 0.3594 +vt 0.4298 0.3516 +vt 0.4376 0.3516 +vt 0.4376 0.3594 +vt 0.4298 0.3594 +vt 0.3515 0.9294 +vt 0.3593 0.9294 +vt 0.3593 0.9372 +vt 0.3515 0.9372 +vt 0.3515 0.9138 +vt 0.3593 0.9138 +vt 0.3593 0.9216 +vt 0.3515 0.9216 +vt 0.3671 0.9138 +vt 0.3749 0.9138 +vt 0.3749 0.9216 +vt 0.3671 0.9216 +vt 0.2890 0.9294 +vt 0.2968 0.9294 +vt 0.2968 0.9372 +vt 0.2890 0.9372 +vt 0.2890 0.9138 +vt 0.2969 0.9138 +vt 0.2969 0.9216 +vt 0.2890 0.9216 +vt 0.3047 0.9138 +vt 0.3125 0.9138 +vt 0.3125 0.9216 +vt 0.3047 0.9216 +vt 0.2890 0.9919 +vt 0.2968 0.9919 +vt 0.2968 0.9997 +vt 0.2890 0.9997 +vt 0.2890 0.9762 +vt 0.2968 0.9762 +vt 0.2968 0.9840 +vt 0.2890 0.9840 +vt 0.3046 0.9762 +vt 0.3125 0.9762 +vt 0.3124 0.9841 +vt 0.3046 0.9840 +vt 0.3515 0.8045 +vt 0.3594 0.8045 +vt 0.3594 0.8123 +vt 0.3515 0.8123 +vt 0.3516 0.7889 +vt 0.3594 0.7889 +vt 0.3594 0.7967 +vt 0.3515 0.7967 +vt 0.3672 0.7889 +vt 0.3750 0.7889 +vt 0.3750 0.7967 +vt 0.3672 0.7967 +vt 0.2891 0.8044 +vt 0.2969 0.8045 +vt 0.2969 0.8123 +vt 0.2891 0.8123 +vt 0.2891 0.7888 +vt 0.2969 0.7888 +vt 0.2969 0.7966 +vt 0.2891 0.7966 +vt 0.3047 0.7888 +vt 0.3125 0.7888 +vt 0.3125 0.7966 +vt 0.3047 0.7966 +vt 0.2891 0.8669 +vt 0.2969 0.8669 +vt 0.2969 0.8747 +vt 0.2891 0.8747 +vt 0.2891 0.8513 +vt 0.2969 0.8513 +vt 0.2969 0.8591 +vt 0.2891 0.8591 +vt 0.3047 0.8513 +vt 0.3125 0.8513 +vt 0.3125 0.8591 +vt 0.3047 0.8591 +vt 0.4765 0.8045 +vt 0.4843 0.8045 +vt 0.4843 0.8123 +vt 0.4765 0.8123 +vt 0.4765 0.7889 +vt 0.4843 0.7889 +vt 0.4843 0.7967 +vt 0.4765 0.7967 +vt 0.4921 0.7889 +vt 0.4999 0.7889 +vt 0.4999 0.7967 +vt 0.4921 0.7967 +vt 0.4140 0.8045 +vt 0.4218 0.8045 +vt 0.4218 0.8123 +vt 0.4140 0.8123 +vt 0.4140 0.7889 +vt 0.4218 0.7889 +vt 0.4218 0.7967 +vt 0.4140 0.7967 +vt 0.4296 0.7889 +vt 0.4374 0.7889 +vt 0.4374 0.7967 +vt 0.4296 0.7967 +vt 0.4140 0.8670 +vt 0.4218 0.8670 +vt 0.4218 0.8748 +vt 0.4140 0.8748 +vt 0.4140 0.8513 +vt 0.4218 0.8513 +vt 0.4218 0.8591 +vt 0.4140 0.8591 +vt 0.4296 0.8513 +vt 0.4374 0.8513 +vt 0.4374 0.8592 +vt 0.4296 0.8592 +vt 0.8512 0.9296 +vt 0.8591 0.9296 +vt 0.8590 0.9374 +vt 0.8512 0.9374 +vt 0.8512 0.9139 +vt 0.8591 0.9139 +vt 0.8591 0.9217 +vt 0.8512 0.9217 +vt 0.8669 0.9139 +vt 0.8747 0.9139 +vt 0.8747 0.9218 +vt 0.8669 0.9217 +vt 0.7888 0.9295 +vt 0.7966 0.9295 +vt 0.7966 0.9373 +vt 0.7888 0.9373 +vt 0.7888 0.9139 +vt 0.7966 0.9139 +vt 0.7966 0.9217 +vt 0.7888 0.9217 +vt 0.8044 0.9139 +vt 0.8122 0.9139 +vt 0.8122 0.9217 +vt 0.8044 0.9217 +vt 0.7888 0.9920 +vt 0.7966 0.9920 +vt 0.7966 0.9998 +vt 0.7888 0.9998 +vt 0.7888 0.9764 +vt 0.7966 0.9764 +vt 0.7966 0.9842 +vt 0.7888 0.9842 +vt 0.8044 0.9764 +vt 0.8122 0.9764 +vt 0.8122 0.9842 +vt 0.8044 0.9842 +vt 0.8513 0.8046 +vt 0.8591 0.8046 +vt 0.8591 0.8124 +vt 0.8513 0.8124 +vt 0.8513 0.7890 +vt 0.8591 0.7890 +vt 0.8591 0.7968 +vt 0.8513 0.7968 +vt 0.8669 0.7890 +vt 0.8747 0.7890 +vt 0.8747 0.7968 +vt 0.8669 0.7968 +vt 0.7888 0.8046 +vt 0.7966 0.8046 +vt 0.7966 0.8124 +vt 0.7888 0.8124 +vt 0.7888 0.7890 +vt 0.7966 0.7890 +vt 0.7966 0.7968 +vt 0.7888 0.7968 +vt 0.8044 0.7890 +vt 0.8122 0.7890 +vt 0.8122 0.7968 +vt 0.8044 0.7968 +vt 0.7888 0.8671 +vt 0.7966 0.8671 +vt 0.7966 0.8749 +vt 0.7888 0.8749 +vt 0.7888 0.8515 +vt 0.7966 0.8515 +vt 0.7966 0.8593 +vt 0.7888 0.8593 +vt 0.8044 0.8515 +vt 0.8122 0.8515 +vt 0.8122 0.8593 +vt 0.8044 0.8593 +vt 0.9762 0.8047 +vt 0.9840 0.8047 +vt 0.9840 0.8125 +vt 0.9762 0.8125 +vt 0.9762 0.7890 +vt 0.9840 0.7890 +vt 0.9840 0.7969 +vt 0.9762 0.7969 +vt 0.9918 0.7890 +vt 0.9996 0.7891 +vt 0.9996 0.7969 +vt 0.9918 0.7969 +vt 0.9137 0.8046 +vt 0.9216 0.8046 +vt 0.9216 0.8125 +vt 0.9137 0.8124 +vt 0.9138 0.7890 +vt 0.9216 0.7890 +vt 0.9216 0.7968 +vt 0.9138 0.7968 +vt 0.9294 0.7890 +vt 0.9372 0.7890 +vt 0.9372 0.7968 +vt 0.9294 0.7968 +vt 0.9137 0.8671 +vt 0.9215 0.8671 +vt 0.9215 0.8749 +vt 0.9137 0.8749 +vt 0.9137 0.8515 +vt 0.9215 0.8515 +vt 0.9215 0.8593 +vt 0.9137 0.8593 +vt 0.9293 0.8515 +vt 0.9372 0.8515 +vt 0.9372 0.8593 +vt 0.9293 0.8593 +vt 0.9762 0.8671 +vt 0.9840 0.8671 +vt 0.9840 0.8749 +vt 0.9762 0.8749 +vt 0.9762 0.8515 +vt 0.9840 0.8515 +vt 0.9840 0.8593 +vt 0.9762 0.8593 +vt 0.9918 0.8515 +vt 0.9996 0.8515 +vt 0.9996 0.8593 +vt 0.9918 0.8593 +vt 0.8513 0.8671 +vt 0.8591 0.8671 +vt 0.8591 0.8749 +vt 0.8513 0.8749 +vt 0.8513 0.8515 +vt 0.8591 0.8515 +vt 0.8591 0.8593 +vt 0.8513 0.8593 +vt 0.8669 0.8515 +vt 0.8747 0.8515 +vt 0.8747 0.8593 +vt 0.8669 0.8593 +vt 0.8512 0.9920 +vt 0.8590 0.9920 +vt 0.8590 0.9998 +vt 0.8512 0.9998 +vt 0.8512 0.9764 +vt 0.8590 0.9764 +vt 0.8590 0.9842 +vt 0.8512 0.9842 +vt 0.8668 0.9764 +vt 0.8747 0.9764 +vt 0.8747 0.9842 +vt 0.8668 0.9842 +vt 0.4765 0.8670 +vt 0.4843 0.8670 +vt 0.4843 0.8748 +vt 0.4765 0.8748 +vt 0.4765 0.8514 +vt 0.4843 0.8514 +vt 0.4843 0.8592 +vt 0.4765 0.8592 +vt 0.4921 0.8514 +vt 0.4999 0.8514 +vt 0.4999 0.8592 +vt 0.4921 0.8592 +vt 0.3515 0.8669 +vt 0.3593 0.8669 +vt 0.3593 0.8747 +vt 0.3515 0.8747 +vt 0.3515 0.8513 +vt 0.3593 0.8513 +vt 0.3593 0.8591 +vt 0.3515 0.8591 +vt 0.3671 0.8513 +vt 0.3750 0.8513 +vt 0.3750 0.8591 +vt 0.3671 0.8591 +vt 0.3515 0.9919 +vt 0.3593 0.9919 +vt 0.3593 0.9997 +vt 0.3515 0.9997 +vt 0.3515 0.9763 +vt 0.3593 0.9763 +vt 0.3593 0.9841 +vt 0.3515 0.9841 +vt 0.3671 0.9763 +vt 0.3749 0.9763 +vt 0.3749 0.9841 +vt 0.3671 0.9841 +vt 0.4766 0.3672 +vt 0.4844 0.3672 +vt 0.4844 0.3750 +vt 0.4766 0.3750 +vt 0.4766 0.3516 +vt 0.4844 0.3516 +vt 0.4844 0.3594 +vt 0.4766 0.3594 +vt 0.4922 0.3516 +vt 0.5000 0.3516 +vt 0.5000 0.3594 +vt 0.4922 0.3594 +vt 0.3517 0.3672 +vt 0.3595 0.3672 +vt 0.3595 0.3750 +vt 0.3517 0.3750 +vt 0.3517 0.3516 +vt 0.3595 0.3516 +vt 0.3595 0.3594 +vt 0.3517 0.3594 +vt 0.3673 0.3516 +vt 0.3751 0.3516 +vt 0.3751 0.3594 +vt 0.3673 0.3594 +vt 0.3516 0.4921 +vt 0.3595 0.4921 +vt 0.3595 0.4999 +vt 0.3516 0.4999 +vt 0.3516 0.4765 +vt 0.3595 0.4765 +vt 0.3595 0.4843 +vt 0.3516 0.4843 +vt 0.3673 0.4765 +vt 0.3751 0.4765 +vt 0.3751 0.4843 +vt 0.3673 0.4843 +vt 0.9764 0.3674 +vt 0.9842 0.3674 +vt 0.9842 0.3752 +vt 0.9764 0.3752 +vt 0.9764 0.3518 +vt 0.9842 0.3518 +vt 0.9842 0.3596 +vt 0.9764 0.3596 +vt 0.9920 0.3518 +vt 0.9998 0.3518 +vt 0.9998 0.3596 +vt 0.9920 0.3596 +vt 0.8514 0.3674 +vt 0.8592 0.3674 +vt 0.8592 0.3752 +vt 0.8514 0.3752 +vt 0.8514 0.3517 +vt 0.8592 0.3517 +vt 0.8592 0.3595 +vt 0.8514 0.3595 +vt 0.8670 0.3517 +vt 0.8749 0.3517 +vt 0.8748 0.3596 +vt 0.8670 0.3596 +vt 0.8514 0.4923 +vt 0.8592 0.4923 +vt 0.8592 0.5001 +vt 0.8514 0.5001 +vt 0.8514 0.4767 +vt 0.8592 0.4767 +vt 0.8592 0.4845 +vt 0.8514 0.4845 +vt 0.8670 0.4767 +vt 0.8748 0.4767 +vt 0.8748 0.4845 +vt 0.8670 0.4845 +vt 0.7265 0.3673 +vt 0.7343 0.3673 +vt 0.7343 0.3751 +vt 0.7265 0.3751 +vt 0.7265 0.3517 +vt 0.7343 0.3517 +vt 0.7343 0.3595 +vt 0.7265 0.3595 +vt 0.7421 0.3517 +vt 0.7499 0.3517 +vt 0.7499 0.3595 +vt 0.7421 0.3595 +vt 0.6016 0.3673 +vt 0.6094 0.3673 +vt 0.6094 0.3751 +vt 0.6015 0.3751 +vt 0.6016 0.3517 +vt 0.6094 0.3517 +vt 0.6094 0.3595 +vt 0.6016 0.3595 +vt 0.6172 0.3517 +vt 0.6250 0.3517 +vt 0.6250 0.3595 +vt 0.6172 0.3595 +vt 0.6015 0.4922 +vt 0.6093 0.4922 +vt 0.6093 0.5000 +vt 0.6015 0.5000 +vt 0.6015 0.4766 +vt 0.6093 0.4766 +vt 0.6093 0.4844 +vt 0.6015 0.4844 +vt 0.6171 0.4766 +vt 0.6249 0.4766 +vt 0.6249 0.4844 +vt 0.6171 0.4844 +vt 0.7266 0.1174 +vt 0.7344 0.1174 +vt 0.7344 0.1253 +vt 0.7266 0.1253 +vt 0.7266 0.1018 +vt 0.7344 0.1018 +vt 0.7344 0.1096 +vt 0.7266 0.1096 +vt 0.7422 0.1018 +vt 0.7500 0.1018 +vt 0.7500 0.1096 +vt 0.7422 0.1096 +vt 0.6016 0.1174 +vt 0.6094 0.1174 +vt 0.6094 0.1252 +vt 0.6016 0.1252 +vt 0.6016 0.1018 +vt 0.6094 0.1018 +vt 0.6094 0.1096 +vt 0.6016 0.1096 +vt 0.6173 0.1018 +vt 0.6251 0.1018 +vt 0.6251 0.1096 +vt 0.6172 0.1096 +vt 0.6016 0.2423 +vt 0.6094 0.2423 +vt 0.6094 0.2502 +vt 0.6016 0.2501 +vt 0.6016 0.2267 +vt 0.6094 0.2267 +vt 0.6094 0.2345 +vt 0.6016 0.2345 +vt 0.6172 0.2267 +vt 0.6250 0.2267 +vt 0.6250 0.2345 +vt 0.6172 0.2345 +vt 0.9764 0.1175 +vt 0.9842 0.1175 +vt 0.9842 0.1253 +vt 0.9764 0.1253 +vt 0.9764 0.1019 +vt 0.9843 0.1019 +vt 0.9842 0.1097 +vt 0.9764 0.1097 +vt 0.9921 0.1019 +vt 0.9999 0.1019 +vt 0.9999 0.1097 +vt 0.9921 0.1097 +vt 0.8515 0.1175 +vt 0.8593 0.1175 +vt 0.8593 0.1253 +vt 0.8515 0.1253 +vt 0.8515 0.1019 +vt 0.8593 0.1019 +vt 0.8593 0.1097 +vt 0.8515 0.1097 +vt 0.8671 0.1019 +vt 0.8749 0.1019 +vt 0.8749 0.1097 +vt 0.8671 0.1097 +vt 0.8515 0.2424 +vt 0.8593 0.2424 +vt 0.8593 0.2502 +vt 0.8515 0.2502 +vt 0.8515 0.2268 +vt 0.8593 0.2268 +vt 0.8593 0.2346 +vt 0.8515 0.2346 +vt 0.8671 0.2268 +vt 0.8749 0.2268 +vt 0.8749 0.2346 +vt 0.8671 0.2346 +vt 0.2268 0.3672 +vt 0.2346 0.3672 +vt 0.2346 0.3750 +vt 0.2267 0.3750 +vt 0.2268 0.3515 +vt 0.2346 0.3515 +vt 0.2346 0.3594 +vt 0.2268 0.3593 +vt 0.2424 0.3515 +vt 0.2502 0.3515 +vt 0.2502 0.3594 +vt 0.2424 0.3594 +vt 0.1018 0.3671 +vt 0.1096 0.3671 +vt 0.1096 0.3749 +vt 0.1018 0.3749 +vt 0.1018 0.3515 +vt 0.1096 0.3515 +vt 0.1096 0.3593 +vt 0.1018 0.3593 +vt 0.1174 0.3515 +vt 0.1252 0.3515 +vt 0.1252 0.3593 +vt 0.1174 0.3593 +vt 0.1018 0.4921 +vt 0.1096 0.4921 +vt 0.1096 0.4999 +vt 0.1018 0.4999 +vt 0.1018 0.4764 +vt 0.1096 0.4764 +vt 0.1096 0.4842 +vt 0.1018 0.4842 +vt 0.1174 0.4764 +vt 0.1252 0.4764 +vt 0.1252 0.4843 +vt 0.1174 0.4842 +vt 0.2268 0.1173 +vt 0.2346 0.1173 +vt 0.2346 0.1251 +vt 0.2268 0.1251 +vt 0.2268 0.1017 +vt 0.2346 0.1017 +vt 0.2346 0.1095 +vt 0.2268 0.1095 +vt 0.2425 0.1017 +vt 0.2503 0.1017 +vt 0.2503 0.1095 +vt 0.2424 0.1095 +vt 0.1019 0.1173 +vt 0.1097 0.1173 +vt 0.1097 0.1251 +vt 0.1019 0.1251 +vt 0.1019 0.1016 +vt 0.1097 0.1016 +vt 0.1097 0.1094 +vt 0.1019 0.1094 +vt 0.1175 0.1016 +vt 0.1253 0.1016 +vt 0.1253 0.1095 +vt 0.1175 0.1095 +vt 0.1019 0.2422 +vt 0.1097 0.2422 +vt 0.1097 0.2500 +vt 0.1019 0.2500 +vt 0.1019 0.2266 +vt 0.1097 0.2266 +vt 0.1097 0.2344 +vt 0.1019 0.2344 +vt 0.1175 0.2266 +vt 0.1253 0.2266 +vt 0.1253 0.2344 +vt 0.1175 0.2344 +vt 0.4767 0.1174 +vt 0.4845 0.1174 +vt 0.4845 0.1252 +vt 0.4767 0.1252 +vt 0.4767 0.1018 +vt 0.4845 0.1018 +vt 0.4845 0.1096 +vt 0.4767 0.1096 +vt 0.4923 0.1018 +vt 0.5001 0.1018 +vt 0.5001 0.1096 +vt 0.4923 0.1096 +vt 0.3518 0.1173 +vt 0.3596 0.1173 +vt 0.3596 0.1251 +vt 0.3518 0.1251 +vt 0.3518 0.1017 +vt 0.3596 0.1017 +vt 0.3596 0.1095 +vt 0.3518 0.1095 +vt 0.3674 0.1017 +vt 0.3752 0.1017 +vt 0.3752 0.1095 +vt 0.3674 0.1095 +vt 0.3517 0.2423 +vt 0.3595 0.2423 +vt 0.3595 0.2501 +vt 0.3517 0.2501 +vt 0.3517 0.2266 +vt 0.3595 0.2266 +vt 0.3595 0.2345 +vt 0.3517 0.2345 +vt 0.3673 0.2267 +vt 0.3752 0.2267 +vt 0.3752 0.2345 +vt 0.3673 0.2345 +vt 0.2266 0.8669 +vt 0.2344 0.8669 +vt 0.2344 0.8747 +vt 0.2266 0.8747 +vt 0.2266 0.8513 +vt 0.2344 0.8513 +vt 0.2344 0.8591 +vt 0.2266 0.8591 +vt 0.2422 0.8513 +vt 0.2500 0.8513 +vt 0.2500 0.8591 +vt 0.2422 0.8591 +vt 0.1017 0.8669 +vt 0.1095 0.8669 +vt 0.1095 0.8747 +vt 0.1017 0.8747 +vt 0.1017 0.8512 +vt 0.1095 0.8512 +vt 0.1095 0.8591 +vt 0.1017 0.8590 +vt 0.1173 0.8512 +vt 0.1251 0.8512 +vt 0.1251 0.8591 +vt 0.1173 0.8591 +vt 0.1016 0.9918 +vt 0.1094 0.9918 +vt 0.1094 0.9996 +vt 0.1016 0.9996 +vt 0.1016 0.9762 +vt 0.1094 0.9762 +vt 0.1094 0.9840 +vt 0.1016 0.9840 +vt 0.1172 0.9762 +vt 0.1250 0.9762 +vt 0.1250 0.9840 +vt 0.1172 0.9840 +vt 0.2267 0.6170 +vt 0.2345 0.6170 +vt 0.2345 0.6248 +vt 0.2267 0.6248 +vt 0.2267 0.6014 +vt 0.2345 0.6014 +vt 0.2345 0.6092 +vt 0.2267 0.6092 +vt 0.2423 0.6014 +vt 0.2501 0.6014 +vt 0.2501 0.6092 +vt 0.2423 0.6092 +vt 0.1017 0.6170 +vt 0.1095 0.6170 +vt 0.1095 0.6248 +vt 0.1017 0.6248 +vt 0.1017 0.6014 +vt 0.1095 0.6014 +vt 0.1095 0.6092 +vt 0.1017 0.6092 +vt 0.1174 0.6014 +vt 0.1252 0.6014 +vt 0.1252 0.6092 +vt 0.1174 0.6092 +vt 0.1017 0.7419 +vt 0.1095 0.7419 +vt 0.1095 0.7497 +vt 0.1017 0.7497 +vt 0.1017 0.7263 +vt 0.1095 0.7263 +vt 0.1095 0.7341 +vt 0.1017 0.7341 +vt 0.1173 0.7263 +vt 0.1251 0.7263 +vt 0.1251 0.7341 +vt 0.1173 0.7341 +vt 0.4765 0.6171 +vt 0.4843 0.6171 +vt 0.4843 0.6249 +vt 0.4765 0.6249 +vt 0.4765 0.6015 +vt 0.4844 0.6015 +vt 0.4844 0.6093 +vt 0.4765 0.6093 +vt 0.4922 0.6015 +vt 0.5000 0.6015 +vt 0.5000 0.6093 +vt 0.4922 0.6093 +vt 0.3516 0.6171 +vt 0.3594 0.6171 +vt 0.3594 0.6249 +vt 0.3516 0.6249 +vt 0.3516 0.6014 +vt 0.3594 0.6015 +vt 0.3594 0.6093 +vt 0.3516 0.6093 +vt 0.3672 0.6015 +vt 0.3750 0.6015 +vt 0.3750 0.6093 +vt 0.3672 0.6093 +vt 0.3516 0.7420 +vt 0.3594 0.7420 +vt 0.3594 0.7498 +vt 0.3516 0.7498 +vt 0.3516 0.7264 +vt 0.3594 0.7264 +vt 0.3594 0.7342 +vt 0.3516 0.7342 +vt 0.3672 0.7264 +vt 0.3750 0.7264 +vt 0.3750 0.7342 +vt 0.3672 0.7342 +vt 0.7263 0.8670 +vt 0.7341 0.8671 +vt 0.7341 0.8749 +vt 0.7263 0.8749 +vt 0.7263 0.8514 +vt 0.7341 0.8514 +vt 0.7341 0.8592 +vt 0.7263 0.8592 +vt 0.7420 0.8514 +vt 0.7498 0.8514 +vt 0.7498 0.8592 +vt 0.7419 0.8592 +vt 0.6014 0.8670 +vt 0.6092 0.8670 +vt 0.6092 0.8748 +vt 0.6014 0.8748 +vt 0.6014 0.8514 +vt 0.6092 0.8514 +vt 0.6092 0.8592 +vt 0.6014 0.8592 +vt 0.6170 0.8514 +vt 0.6248 0.8514 +vt 0.6248 0.8592 +vt 0.6170 0.8592 +vt 0.6014 0.9919 +vt 0.6092 0.9919 +vt 0.6092 0.9998 +vt 0.6014 0.9998 +vt 0.6014 0.9763 +vt 0.6092 0.9763 +vt 0.6092 0.9841 +vt 0.6014 0.9841 +vt 0.6170 0.9763 +vt 0.6248 0.9763 +vt 0.6248 0.9841 +vt 0.6170 0.9841 +vt 0.7264 0.6172 +vt 0.7342 0.6172 +vt 0.7342 0.6250 +vt 0.7264 0.6250 +vt 0.7264 0.6016 +vt 0.7342 0.6016 +vt 0.7342 0.6094 +vt 0.7264 0.6094 +vt 0.7420 0.6016 +vt 0.7498 0.6016 +vt 0.7498 0.6094 +vt 0.7420 0.6094 +vt 0.6015 0.6171 +vt 0.6093 0.6171 +vt 0.6093 0.6250 +vt 0.6015 0.6250 +vt 0.6015 0.6015 +vt 0.6093 0.6015 +vt 0.6093 0.6093 +vt 0.6015 0.6093 +vt 0.6171 0.6015 +vt 0.6249 0.6015 +vt 0.6249 0.6093 +vt 0.6171 0.6093 +vt 0.6014 0.7421 +vt 0.6092 0.7421 +vt 0.6092 0.7499 +vt 0.6014 0.7499 +vt 0.6014 0.7265 +vt 0.6092 0.7265 +vt 0.6092 0.7343 +vt 0.6014 0.7343 +vt 0.6171 0.7265 +vt 0.6249 0.7265 +vt 0.6249 0.7343 +vt 0.6171 0.7343 +vt 0.9763 0.6173 +vt 0.9841 0.6173 +vt 0.9841 0.6251 +vt 0.9763 0.6251 +vt 0.9763 0.6016 +vt 0.9841 0.6016 +vt 0.9841 0.6095 +vt 0.9763 0.6095 +vt 0.9919 0.6017 +vt 0.9997 0.6017 +vt 0.9997 0.6095 +vt 0.9919 0.6095 +vt 0.8513 0.6172 +vt 0.8591 0.6172 +vt 0.8591 0.6250 +vt 0.8513 0.6250 +vt 0.8513 0.6016 +vt 0.8592 0.6016 +vt 0.8592 0.6094 +vt 0.8513 0.6094 +vt 0.8670 0.6016 +vt 0.8748 0.6016 +vt 0.8748 0.6094 +vt 0.8670 0.6094 +vt 0.8513 0.7422 +vt 0.8591 0.7422 +vt 0.8591 0.7500 +vt 0.8513 0.7500 +vt 0.8513 0.7265 +vt 0.8591 0.7265 +vt 0.8591 0.7343 +vt 0.8513 0.7343 +vt 0.8669 0.7265 +vt 0.8747 0.7265 +vt 0.8747 0.7344 +vt 0.8669 0.7344 +vt 0.9762 0.7422 +vt 0.9840 0.7422 +vt 0.9840 0.7500 +vt 0.9762 0.7500 +vt 0.9762 0.7266 +vt 0.9840 0.7266 +vt 0.9840 0.7344 +vt 0.9762 0.7344 +vt 0.9919 0.7266 +vt 0.9997 0.7266 +vt 0.9997 0.7344 +vt 0.9919 0.7344 +vt 0.7264 0.7421 +vt 0.7342 0.7421 +vt 0.7342 0.7499 +vt 0.7264 0.7499 +vt 0.7264 0.7265 +vt 0.7342 0.7265 +vt 0.7342 0.7343 +vt 0.7264 0.7343 +vt 0.7420 0.7265 +vt 0.7498 0.7265 +vt 0.7498 0.7343 +vt 0.7420 0.7343 +vt 0.7263 0.9920 +vt 0.7341 0.9920 +vt 0.7341 0.9998 +vt 0.7263 0.9998 +vt 0.7263 0.9764 +vt 0.7341 0.9764 +vt 0.7341 0.9842 +vt 0.7263 0.9842 +vt 0.7419 0.9764 +vt 0.7497 0.9764 +vt 0.7497 0.9842 +vt 0.7419 0.9842 +vt 0.4765 0.7420 +vt 0.4843 0.7420 +vt 0.4843 0.7499 +vt 0.4765 0.7498 +vt 0.4765 0.7264 +vt 0.4843 0.7264 +vt 0.4843 0.7342 +vt 0.4765 0.7342 +vt 0.4921 0.7264 +vt 0.4999 0.7264 +vt 0.4999 0.7342 +vt 0.4921 0.7342 +vt 0.2266 0.7420 +vt 0.2344 0.7420 +vt 0.2344 0.7498 +vt 0.2266 0.7498 +vt 0.2266 0.7263 +vt 0.2344 0.7263 +vt 0.2344 0.7342 +vt 0.2266 0.7342 +vt 0.2423 0.7263 +vt 0.2501 0.7264 +vt 0.2501 0.7342 +vt 0.2423 0.7342 +vt 0.2266 0.9918 +vt 0.2344 0.9918 +vt 0.2344 0.9996 +vt 0.2266 0.9996 +vt 0.2266 0.9762 +vt 0.2344 0.9762 +vt 0.2344 0.9840 +vt 0.2266 0.9840 +vt 0.2422 0.9762 +vt 0.2500 0.9762 +vt 0.2500 0.9840 +vt 0.2422 0.9840 +vt 0.4767 0.2423 +vt 0.4845 0.2423 +vt 0.4845 0.2501 +vt 0.4767 0.2501 +vt 0.4767 0.2267 +vt 0.4845 0.2267 +vt 0.4845 0.2345 +vt 0.4767 0.2345 +vt 0.4923 0.2267 +vt 0.5001 0.2267 +vt 0.5001 0.2345 +vt 0.4923 0.2345 +vt 0.2268 0.2422 +vt 0.2346 0.2422 +vt 0.2346 0.2500 +vt 0.2268 0.2500 +vt 0.2268 0.2266 +vt 0.2346 0.2266 +vt 0.2346 0.2344 +vt 0.2268 0.2344 +vt 0.2424 0.2266 +vt 0.2502 0.2266 +vt 0.2502 0.2344 +vt 0.2424 0.2344 +vt 0.2267 0.4921 +vt 0.2345 0.4921 +vt 0.2345 0.4999 +vt 0.2267 0.4999 +vt 0.2267 0.4765 +vt 0.2345 0.4765 +vt 0.2345 0.4843 +vt 0.2267 0.4843 +vt 0.2423 0.4765 +vt 0.2501 0.4765 +vt 0.2501 0.4843 +vt 0.2423 0.4843 +vt 0.9764 0.2425 +vt 0.9842 0.2425 +vt 0.9842 0.2503 +vt 0.9764 0.2503 +vt 0.9764 0.2268 +vt 0.9842 0.2268 +vt 0.9842 0.2347 +vt 0.9764 0.2347 +vt 0.9920 0.2268 +vt 0.9998 0.2268 +vt 0.9998 0.2347 +vt 0.9920 0.2347 +vt 0.7265 0.2424 +vt 0.7343 0.2424 +vt 0.7343 0.2502 +vt 0.7265 0.2502 +vt 0.7265 0.2268 +vt 0.7343 0.2268 +vt 0.7343 0.2346 +vt 0.7265 0.2346 +vt 0.7421 0.2268 +vt 0.7500 0.2268 +vt 0.7500 0.2346 +vt 0.7421 0.2346 +vt 0.7264 0.4922 +vt 0.7343 0.4923 +vt 0.7343 0.5001 +vt 0.7264 0.5001 +vt 0.7265 0.4766 +vt 0.7343 0.4766 +vt 0.7343 0.4844 +vt 0.7264 0.4844 +vt 0.7421 0.4766 +vt 0.7499 0.4766 +vt 0.7499 0.4844 +vt 0.7421 0.4844 +vt 0.9763 0.4923 +vt 0.9841 0.4923 +vt 0.9841 0.5001 +vt 0.9763 0.5001 +vt 0.9763 0.4767 +vt 0.9841 0.4767 +vt 0.9841 0.4845 +vt 0.9763 0.4845 +vt 0.9919 0.4767 +vt 0.9997 0.4767 +vt 0.9997 0.4845 +vt 0.9919 0.4845 +vt 0.4766 0.4922 +vt 0.4844 0.4922 +vt 0.4844 0.5000 +vt 0.4766 0.5000 +vt 0.4766 0.4766 +vt 0.4844 0.4766 +vt 0.4844 0.4844 +vt 0.4766 0.4844 +vt 0.4922 0.4766 +vt 0.5000 0.4766 +vt 0.5000 0.4844 +vt 0.4922 0.4844 +vt 0.4764 0.9919 +vt 0.4842 0.9919 +vt 0.4842 0.9997 +vt 0.4764 0.9997 +vt 0.4764 0.9763 +vt 0.4842 0.9763 +vt 0.4842 0.9841 +vt 0.4764 0.9841 +vt 0.4920 0.9763 +vt 0.4999 0.9763 +vt 0.4999 0.9841 +vt 0.4920 0.9841 +vt 0.9762 0.9921 +vt 0.9840 0.9921 +vt 0.9840 0.9999 +vt 0.9762 0.9999 +vt 0.9762 0.9764 +vt 0.9840 0.9764 +vt 0.9840 0.9843 +vt 0.9762 0.9842 +vt 0.9918 0.9764 +vt 0.9996 0.9764 +vt 0.9996 0.9843 +vt 0.9918 0.9843 +vt 0.0002 0.6638 +vt 0.0002 0.6716 +vt 0.0002 0.6560 +vt 0.0002 0.6794 +vt 0.0002 0.6872 +vt 0.0002 0.6326 +vt 0.0002 0.6404 +vt 0.0002 0.6248 +vt 0.0002 0.6482 +vt 0.0002 0.7263 +vt 0.0002 0.7341 +vt 0.0002 0.7185 +vt 0.0002 0.7419 +vt 0.0002 0.7497 +vt 0.0002 0.6950 +vt 0.0002 0.7028 +vt 0.0002 0.7107 +vt 0.0003 0.5389 +vt 0.0002 0.5467 +vt 0.0003 0.5311 +vt 0.0002 0.5545 +vt 0.0002 0.5623 +vt 0.0003 0.5076 +vt 0.0003 0.5154 +vt 0.0003 0.4998 +vt 0.0003 0.5233 +vt 0.0002 0.6013 +vt 0.0002 0.6091 +vt 0.0002 0.5935 +vt 0.0002 0.6170 +vt 0.0002 0.5701 +vt 0.0002 0.5779 +vt 0.0002 0.5857 +vt 0.0001 0.9137 +vt 0.0001 0.9215 +vt 0.0001 0.9059 +vt 0.0001 0.9293 +vt 0.0001 0.9371 +vt 0.0001 0.8824 +vt 0.0001 0.8903 +vt 0.0001 0.8746 +vt 0.0001 0.8981 +vt 0.0001 0.9761 +vt 0.0001 0.9840 +vt 0.0001 0.9683 +vt 0.0001 0.9918 +vt 0.0001 0.9996 +vt 0.0001 0.9449 +vt 0.0001 0.9527 +vt 0.0001 0.9605 +vt 0.0002 0.7887 +vt 0.0002 0.7965 +vt 0.0002 0.7809 +vt 0.0002 0.8044 +vt 0.0002 0.8122 +vt 0.0002 0.7575 +vt 0.0002 0.7653 +vt 0.0002 0.7731 +vt 0.0001 0.8512 +vt 0.0001 0.8590 +vt 0.0002 0.8434 +vt 0.0001 0.8668 +vt 0.0002 0.8200 +vt 0.0002 0.8278 +vt 0.0002 0.8356 +vt 0.3284 0.0002 +vt 0.3362 0.0002 +vt 0.3440 0.0002 +vt 0.3128 0.0002 +vt 0.3206 0.0002 +vt 0.3596 0.0002 +vt 0.3674 0.0002 +vt 0.3752 0.0002 +vt 0.3518 0.0002 +vt 0.2659 0.0002 +vt 0.2737 0.0002 +vt 0.2815 0.0002 +vt 0.2503 0.0002 +vt 0.2581 0.0002 +vt 0.2971 0.0002 +vt 0.3049 0.0002 +vt 0.2893 0.0002 +vt 0.4533 0.0002 +vt 0.4611 0.0002 +vt 0.4689 0.0002 +vt 0.4377 0.0002 +vt 0.4455 0.0002 +vt 0.4845 0.0002 +vt 0.4923 0.0002 +vt 0.5002 0.0003 +vt 0.4767 0.0002 +vt 0.3908 0.0002 +vt 0.3986 0.0002 +vt 0.4065 0.0002 +vt 0.3830 0.0002 +vt 0.4221 0.0002 +vt 0.4299 0.0002 +vt 0.4143 0.0002 +vt 0.0004 0.1641 +vt 0.0004 0.1719 +vt 0.0004 0.1563 +vt 0.0004 0.1797 +vt 0.0004 0.1875 +vt 0.0004 0.1328 +vt 0.0004 0.1406 +vt 0.0004 0.1250 +vt 0.0004 0.1485 +vt 0.0004 0.2265 +vt 0.0004 0.2343 +vt 0.0004 0.2187 +vt 0.0004 0.2422 +vt 0.0003 0.2500 +vt 0.0004 0.1953 +vt 0.0004 0.2031 +vt 0.0004 0.2109 +vt 0.0785 0.0001 +vt 0.0863 0.0001 +vt 0.0941 0.0001 +vt 0.0629 0.0001 +vt 0.0707 0.0001 +vt 0.1097 0.0001 +vt 0.1176 0.0001 +vt 0.1254 0.0001 +vt 0.1019 0.0001 +vt 0.0004 0.0391 +vt 0.0004 0.0469 +vt 0.0004 0.0313 +vt 0.0004 0.0548 +vt 0.0004 0.0626 +vt 0.0160 0.0001 +vt 0.0239 0.0001 +vt 0.0317 0.0001 +vt 0.0004 0.0079 +vt 0.0004 0.0157 +vt 0.0004 0.0001 +vt 0.0082 0.0001 +vt 0.0004 0.0235 +vt 0.0473 0.0001 +vt 0.0551 0.0001 +vt 0.0395 0.0001 +vt 0.0004 0.1016 +vt 0.0004 0.1094 +vt 0.0004 0.0938 +vt 0.0004 0.1172 +vt 0.0004 0.0704 +vt 0.0004 0.0782 +vt 0.0004 0.0860 +vt 0.2034 0.0002 +vt 0.2112 0.0002 +vt 0.2191 0.0002 +vt 0.1878 0.0002 +vt 0.1956 0.0002 +vt 0.2347 0.0002 +vt 0.2425 0.0002 +vt 0.2269 0.0002 +vt 0.1410 0.0001 +vt 0.1488 0.0001 +vt 0.1566 0.0001 +vt 0.1332 0.0001 +vt 0.1722 0.0002 +vt 0.1800 0.0002 +vt 0.1644 0.0002 +vt 0.0003 0.4139 +vt 0.0003 0.4217 +vt 0.0003 0.4061 +vt 0.0003 0.4295 +vt 0.0003 0.4374 +vt 0.0003 0.3827 +vt 0.0003 0.3905 +vt 0.0003 0.3749 +vt 0.0003 0.3983 +vt 0.0003 0.4764 +vt 0.0003 0.4842 +vt 0.0003 0.4686 +vt 0.0003 0.4920 +vt 0.0003 0.4452 +vt 0.0003 0.4530 +vt 0.0003 0.4608 +vt 0.0003 0.2890 +vt 0.0003 0.2968 +vt 0.0003 0.2812 +vt 0.0003 0.3046 +vt 0.0003 0.3124 +vt 0.0003 0.2578 +vt 0.0003 0.2656 +vt 0.0003 0.2734 +vt 0.0003 0.3515 +vt 0.0003 0.3593 +vt 0.0003 0.3437 +vt 0.0003 0.3671 +vt 0.0003 0.3202 +vt 0.0003 0.3280 +vt 0.0003 0.3359 +vt 0.8281 0.0003 +vt 0.8359 0.0003 +vt 0.8437 0.0004 +vt 0.8125 0.0003 +vt 0.8203 0.0003 +vt 0.8593 0.0004 +vt 0.8672 0.0004 +vt 0.8750 0.0004 +vt 0.8515 0.0004 +vt 0.7656 0.0003 +vt 0.7735 0.0003 +vt 0.7813 0.0003 +vt 0.7500 0.0003 +vt 0.7578 0.0003 +vt 0.7969 0.0003 +vt 0.8047 0.0003 +vt 0.7891 0.0003 +vt 0.9530 0.0004 +vt 0.9609 0.0004 +vt 0.9687 0.0004 +vt 0.9374 0.0004 +vt 0.9452 0.0004 +vt 0.9843 0.0004 +vt 0.9921 0.0004 +vt 0.9999 0.0004 +vt 0.9765 0.0004 +vt 0.8906 0.0004 +vt 0.8984 0.0004 +vt 0.9062 0.0004 +vt 0.8828 0.0004 +vt 0.9218 0.0004 +vt 0.9296 0.0004 +vt 0.9140 0.0004 +vt 0.5782 0.0003 +vt 0.5860 0.0003 +vt 0.5939 0.0003 +vt 0.5626 0.0003 +vt 0.5704 0.0003 +vt 0.6095 0.0003 +vt 0.6173 0.0003 +vt 0.6251 0.0003 +vt 0.6017 0.0003 +vt 0.5158 0.0003 +vt 0.5236 0.0003 +vt 0.5314 0.0003 +vt 0.5080 0.0003 +vt 0.5470 0.0003 +vt 0.5548 0.0003 +vt 0.5392 0.0003 +vt 0.7032 0.0003 +vt 0.7110 0.0003 +vt 0.7188 0.0003 +vt 0.6876 0.0003 +vt 0.6954 0.0003 +vt 0.7344 0.0003 +vt 0.7422 0.0003 +vt 0.7266 0.0003 +vt 0.6407 0.0003 +vt 0.6485 0.0003 +vt 0.6563 0.0003 +vt 0.6329 0.0003 +vt 0.6719 0.0003 +vt 0.6797 0.0003 +vt 0.6641 0.0003 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +usemtl None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +s 1 +f 338/5/2 334/6/2 846/7/2 850/8/2 +f 431/9/3 433/10/3 945/11/3 943/12/3 +f 395/13/2 389/14/2 901/15/2 907/16/2 +f 248/17/4 249/18/4 761/19/4 760/20/4 +f 79/21/4 184/22/4 696/23/4 591/24/4 +f 509/25/2 507/26/2 1019/27/2 1021/28/2 +f 133/29/5 130/30/5 642/31/5 645/32/5 +f 356/33/2 345/34/2 857/35/2 868/36/2 +f 33/37/4 230/38/4 742/39/4 545/40/4 +f 383/41/2 380/42/2 892/43/2 895/44/2 +f 222/45/4 223/46/4 735/47/4 734/48/4 +f 153/49/4 46/50/4 558/51/4 665/52/4 +f 67/53/5 132/54/5 644/55/5 579/56/5 +f 295/57/3 301/58/3 813/59/3 807/60/3 +f 22/61/4 23/62/4 535/63/4 534/64/4 +f 417/65/2 421/66/2 933/67/2 929/68/2 +f 66/69/5 67/53/5 579/56/5 578/70/5 +f 111/71/4 152/72/4 664/73/4 623/74/4 +f 336/75/2 341/76/2 853/77/2 848/78/2 +f 48/79/4 49/80/4 561/81/4 560/82/4 +f 409/83/2 414/84/2 926/85/2 921/86/2 +f 26/87/5 27/88/5 539/89/5 538/90/5 +f 274/91/3 264/92/3 776/93/3 786/94/3 +f 358/95/3 360/96/3 872/97/3 870/98/3 +f 292/99/3 291/100/3 803/101/3 804/102/3 +f 231/103/4 102/104/4 614/105/4 743/106/4 +f 471/107/2 472/108/2 984/109/2 983/110/2 +f 433/10/3 437/111/3 949/112/3 945/11/3 +f 350/113/2 347/114/2 859/115/2 862/116/2 +f 476/117/2 17672/118/2 17676/119/2 988/120/2 +f 221/121/5 42/122/5 554/123/5 733/124/5 +f 496/125/2 497/126/2 1009/127/2 1008/128/2 +f 240/129/4 241/130/4 753/131/4 752/132/4 +f 59/133/5 140/134/5 652/135/5 571/136/5 +f 119/137/4 144/138/4 656/139/4 631/140/4 +f 107/141/5 234/142/5 746/143/5 619/144/5 +f 174/145/4 175/146/4 687/147/4 686/148/4 +f 300/149/3 321/150/3 833/151/3 812/152/3 +f 377/153/2 383/41/2 895/44/2 889/154/2 +f 104/155/4 105/156/4 617/157/4 616/158/4 +f 200/159/4 201/160/4 713/161/4 712/162/4 +f 125/163/5 252/164/5 764/165/5 637/166/5 +f 270/167/3 269/168/3 781/169/3 782/170/3 +f 269/168/3 271/171/3 783/172/3 781/169/3 +f 237/173/5 26/87/5 538/90/5 749/174/5 +f 206/175/4 207/176/4 719/177/4 718/178/4 +f 141/179/5 122/180/5 634/181/5 653/182/5 +f 482/183/2 479/184/2 991/185/2 994/186/2 +f 70/187/4 71/188/4 583/189/4 582/190/4 +f 10/191/5 11/192/5 523/193/5 522/194/5 +f 429/195/3 449/196/3 961/197/3 941/198/3 +f 352/199/2 353/200/2 865/201/2 864/202/2 +f 419/203/2 420/204/2 932/205/2 931/206/2 +f 340/207/2 328/208/2 840/209/2 852/210/2 +f 88/211/4 89/212/4 601/213/4 600/214/4 +f 212/215/5 213/216/5 725/217/5 724/218/5 +f 483/219/2 484/220/2 996/221/2 995/222/2 +f 512/223/2 516/224/2 1028/225/2 1024/226/2 +f 420/204/2 410/227/2 922/228/2 932/205/2 +f 30/229/4 31/230/4 543/231/4 542/232/4 +f 264/92/3 263/233/3 775/234/3 776/93/3 +f 24/235/4 25/236/4 537/237/4 536/238/4 +f 353/200/2 357/239/2 869/240/2 865/201/2 +f 165/241/5 98/242/5 610/243/5 677/244/5 +f 16/245/4 17/246/4 529/247/4 528/248/4 +f 7/249/4 256/250/4 768/251/4 519/252/4 +f 503/253/2 504/254/2 1016/255/2 1015/256/2 +f 159/257/4 40/258/4 552/259/4 671/260/4 +f 462/261/2 463/262/2 975/263/2 974/264/2 +f 35/265/5 194/266/5 706/267/5 547/268/5 +f 213/216/5 50/269/5 562/270/5 725/217/5 +f 371/271/3 370/272/3 882/273/3 883/274/3 +f 497/126/2 501/275/2 1013/276/2 1009/127/2 +f 370/272/3 368/277/3 880/278/3 882/273/3 +f 169/279/4 14/280/4 526/281/4 681/282/4 +f 287/283/3 286/284/3 798/285/3 799/286/3 +f 182/287/4 183/288/4 695/289/4 694/290/4 +f 191/291/4 30/229/4 542/232/4 703/292/4 +f 487/293/2 488/294/2 1000/295/2 999/296/2 +f 355/297/2 356/33/2 868/36/2 867/298/2 +f 65/299/4 198/300/4 710/301/4 577/302/4 +f 257/303/4 128/304/4 640/305/4 769/306/4 +f 37/307/5 162/308/5 674/309/5 549/310/5 +f 368/277/3 367/311/3 879/312/3 880/278/3 +f 128/304/4 129/313/4 641/314/4 640/305/4 +f 63/315/4 200/159/4 712/162/4 575/316/4 +f 148/317/5 149/318/5 661/319/5 660/320/5 +f 188/321/5 189/322/5 701/323/5 700/324/5 +f 513/325/2 510/326/2 1022/327/2 1025/328/2 +f 112/329/4 113/330/4 625/331/4 624/332/4 +f 282/333/3 284/334/3 796/335/3 794/336/3 +f 379/337/2 375/338/2 887/339/2 891/340/2 +f 195/341/5 68/342/5 580/343/5 707/344/5 +f 406/345/3 405/346/3 917/347/3 918/348/3 +f 330/349/2 331/350/2 843/351/2 842/352/2 +f 223/46/4 94/353/4 606/354/4 735/47/4 +f 115/355/5 242/356/5 754/357/5 627/358/5 +f 411/359/2 407/360/2 919/361/2 923/362/2 +f 58/363/5 59/133/5 571/136/5 570/364/5 +f 184/22/4 185/365/4 697/366/4 696/23/4 +f 164/367/5 165/241/5 677/244/5 676/368/5 +f 376/369/2 377/153/2 889/154/2 888/370/2 +f 81/371/4 182/287/4 694/290/4 593/372/4 +f 204/373/5 205/374/5 717/375/5 716/376/5 +f 374/377/3 373/378/3 885/379/3 886/380/3 +f 310/381/3 312/382/3 824/383/3 822/384/3 +f 253/385/5 10/191/5 522/194/5 765/386/5 +f 315/387/3 273/388/3 785/389/3 827/390/3 +f 373/378/3 372/391/3 884/392/3 885/379/3 +f 346/393/2 342/394/2 854/395/2 858/396/2 +f 275/397/3 274/91/3 786/94/3 787/398/3 +f 43/399/5 156/400/5 668/401/5 555/402/5 +f 168/403/4 169/279/4 681/282/4 680/404/4 +f 400/405/3 402/406/3 914/407/3 912/408/3 +f 32/409/4 33/37/4 545/40/4 544/410/4 +f 55/411/4 208/412/4 720/413/4 567/414/4 +f 21/415/5 180/416/5 692/417/5 533/418/5 +f 73/419/4 190/420/4 702/421/4 585/422/4 +f 321/150/3 319/423/3 831/424/3 833/151/3 +f 49/80/4 214/425/4 726/426/4 561/81/4 +f 337/427/2 338/5/2 850/8/2 849/428/2 +f 122/180/5 123/429/5 635/430/5 634/181/5 +f 57/431/4 206/175/4 718/178/4 569/432/4 +f 514/433/2 515/434/2 1027/435/2 1026/436/2 +f 361/437/3 359/438/3 871/439/3 873/440/3 +f 284/334/3 434/441/3 946/442/3 796/335/3 +f 296/443/3 294/444/3 806/445/3 808/446/3 +f 474/447/2 470/448/2 982/449/2 986/450/2 +f 145/451/4 54/452/4 566/453/4 657/454/4 +f 313/455/3 311/456/3 823/457/3 825/458/3 +f 319/423/3 318/459/3 830/460/3 831/424/3 +f 150/461/4 151/462/4 663/463/4 662/464/4 +f 192/465/4 193/466/4 705/467/4 704/468/4 +f 348/469/2 349/470/2 861/471/2 860/472/2 +f 265/473/3 267/474/3 779/475/3 777/476/3 +f 327/477/2 333/478/2 845/479/2 839/480/2 +f 72/481/4 73/419/4 585/422/4 584/482/4 +f 297/483/3 296/443/3 808/446/3 809/484/3 +f 194/266/5 195/341/5 707/344/5 706/267/5 +f 291/100/3 290/485/3 802/486/3 803/101/3 +f 459/487/2 460/488/2 972/489/2 971/490/2 +f 87/491/4 176/492/4 688/493/4 599/494/4 +f 389/14/2 390/495/2 902/496/2 901/15/2 +f 405/346/3 404/497/3 916/498/3 917/347/3 +f 335/499/2 336/75/2 848/78/2 847/500/2 +f 410/227/2 411/359/2 923/362/2 922/228/2 +f 498/501/2 495/502/2 1007/503/2 1010/504/2 +f 312/382/3 317/505/3 829/506/3 824/383/3 +f 425/507/3 423/508/3 935/509/3 937/510/3 +f 504/254/2 509/25/2 1021/28/2 1016/255/2 +f 480/511/2 481/512/2 993/513/2 992/514/2 +f 266/515/3 265/473/3 777/476/3 778/516/3 +f 385/517/3 384/518/3 896/519/3 897/520/3 +f 85/521/5 212/215/5 724/218/5 597/522/5 +f 254/523/4 255/524/4 767/525/4 766/526/4 +f 42/122/5 43/399/5 555/402/5 554/123/5 +f 189/322/5 74/527/5 586/528/5 701/323/5 +f 52/529/5 53/530/5 565/531/5 564/532/5 +f 351/533/2 352/199/2 864/202/2 863/534/2 +f 12/535/5 13/536/5 525/537/5 524/538/5 +f 501/275/2 499/539/2 1011/540/2 1013/276/2 +f 407/360/2 408/541/2 920/542/2 919/361/2 +f 311/456/3 310/381/3 822/384/3 823/457/3 +f 9/543/4 254/523/4 766/526/4 521/544/4 +f 147/545/5 116/546/5 628/547/5 659/548/5 +f 117/549/5 244/550/5 756/551/5 629/552/5 +f 475/553/2 476/117/2 988/120/2 987/554/2 +f 129/313/4 134/555/4 646/556/4 641/314/4 +f 207/176/4 78/557/4 590/558/4 719/177/4 +f 394/559/2 395/13/2 907/16/2 906/560/2 +f 203/561/5 60/562/5 572/563/5 715/564/5 +f 232/565/4 233/566/4 745/567/4 744/568/4 +f 322/569/3 314/570/3 826/571/3 834/572/3 +f 384/518/3 386/573/3 898/574/3 896/519/3 +f 306/575/3 305/576/3 817/577/3 818/578/3 +f 449/196/3 447/579/3 959/580/3 961/197/3 +f 243/581/5 20/582/5 532/583/5 755/584/5 +f 334/6/2 335/499/2 847/500/2 846/7/2 +f 242/356/5 243/581/5 755/584/5 754/357/5 +f 458/585/2 459/487/2 971/490/2 970/586/2 +f 190/420/4 191/291/4 703/292/4 702/421/4 +f 83/587/5 210/588/5 722/589/5 595/590/5 +f 493/591/2 513/325/2 1025/328/2 1005/592/2 +f 271/171/3 276/593/3 788/594/3 783/172/3 +f 404/497/3 388/595/3 900/596/3 916/498/3 +f 68/342/5 69/597/5 581/598/5 580/343/5 +f 430/599/3 428/600/3 940/601/3 942/602/3 +f 450/603/3 442/604/3 954/605/3 962/606/3 +f 218/607/5 219/608/5 731/609/5 730/610/5 +f 143/611/4 56/612/4 568/613/4 655/614/4 +f 432/615/3 431/9/3 943/12/3 944/616/3 +f 256/250/4 257/303/4 769/306/4 768/251/4 +f 114/617/5 115/355/5 627/358/5 626/618/5 +f 80/619/4 81/371/4 593/372/4 592/620/4 +f 29/621/5 188/321/5 700/324/5 541/622/5 +f 428/600/3 427/623/3 939/624/3 940/601/3 +f 95/625/4 168/403/4 680/404/4 607/626/4 +f 272/627/3 270/167/3 782/170/3 784/628/3 +f 333/478/2 330/349/2 842/352/2 845/479/2 +f 506/629/2 502/630/2 1014/631/2 1018/632/2 +f 146/633/5 147/545/5 659/548/5 658/634/5 +f 423/508/3 422/635/3 934/636/3 935/509/3 +f 285/637/3 283/638/3 795/639/3 797/640/3 +f 249/18/4 120/641/4 632/642/4 761/19/4 +f 437/111/3 436/643/3 948/644/3 949/112/3 +f 171/645/5 92/646/5 604/647/5 683/648/5 +f 246/649/4 247/650/4 759/651/4 758/652/4 +f 422/635/3 424/653/3 936/654/3 934/636/3 +f 447/579/3 446/655/3 958/656/3 959/580/3 +f 510/326/2 511/657/2 1023/658/2 1022/327/2 +f 491/659/2 492/660/2 1004/661/2 1003/662/2 +f 93/663/5 220/664/5 732/665/5 605/666/5 +f 154/667/5 155/668/5 667/669/5 666/670/5 +f 100/671/5 101/672/5 613/673/5 612/674/5 +f 408/541/2 409/83/2 921/86/2 920/542/2 +f 118/675/4 119/137/4 631/140/4 630/676/4 +f 477/677/5 172/678/5 684/679/5 989/680/5 +f 211/681/5 52/529/5 564/532/5 723/682/5 +f 451/683/3 450/603/3 962/606/3 963/684/3 +f 138/685/5 139/686/5 651/687/5 650/688/5 +f 325/689/2 326/690/2 838/691/2 837/692/2 +f 108/693/5 109/694/5 621/695/5 620/696/5 +f 41/697/4 222/45/4 734/48/4 553/698/4 +f 507/26/2 508/699/2 1020/700/2 1019/27/2 +f 286/284/3 288/701/3 800/702/3 798/285/3 +f 366/703/3 364/704/3 876/705/3 878/706/3 +f 436/643/3 435/707/3 947/708/3 948/644/3 +f 391/709/2 399/710/2 911/711/2 903/712/2 +f 463/262/2 464/713/2 976/714/2 975/263/2 +f 490/715/2 486/716/2 998/717/2 1002/718/2 +f 508/699/2 465/719/2 977/720/2 1020/700/2 +f 364/704/3 363/721/3 875/722/3 876/705/3 +f 301/58/3 299/723/3 811/724/3 813/59/3 +f 34/725/5 35/265/5 547/268/5 546/726/5 +f 262/727/3 268/728/3 780/729/3 774/730/3 +f 163/731/5 100/671/5 612/674/5 675/732/5 +f 45/733/5 154/667/5 666/670/5 557/734/5 +f 106/735/5 107/141/5 619/144/5 618/736/5 +f 345/34/2 346/393/2 858/396/2 857/35/2 +f 481/512/2 485/737/2 997/738/2 993/513/2 +f 369/739/3 374/377/3 886/380/3 881/740/3 +f 281/741/3 280/742/3 792/743/3 793/744/3 +f 317/505/3 316/745/3 828/746/3 829/506/3 +f 135/747/4 64/748/4 576/749/4 647/750/4 +f 180/416/5 181/751/5 693/752/5 692/417/5 +f 103/753/4 160/754/4 672/755/4 615/756/4 +f 15/757/4 248/17/4 760/20/4 527/758/4 +f 328/208/2 329/759/2 841/760/2 840/209/2 +f 516/224/2 514/433/2 1026/436/2 1028/225/2 +f 225/761/4 96/762/4 608/763/4 737/764/4 +f 359/438/3 358/95/3 870/98/3 871/439/3 +f 102/104/4 103/753/4 615/756/4 614/105/4 +f 17/246/4 246/649/4 758/652/4 529/247/4 +f 489/765/2 490/715/2 1002/718/2 1001/766/2 +f 362/767/3 361/437/3 873/440/3 874/768/3 +f 251/769/5 12/535/5 524/538/5 763/770/5 +f 484/220/2 473/771/2 985/772/2 996/221/2 +f 473/771/2 474/447/2 986/450/2 985/772/2 +f 121/773/4 142/774/4 654/775/4 633/776/4 +f 241/130/4 112/329/4 624/332/4 753/131/4 +f 347/114/2 348/469/2 860/472/2 859/115/2 +f 46/50/4 47/777/4 559/778/4 558/51/4 +f 62/779/4 63/315/4 575/316/4 574/780/4 +f 224/781/4 225/761/4 737/764/4 736/782/4 +f 210/588/5 211/681/5 723/682/5 722/589/5 +f 158/783/4 159/257/4 671/260/4 670/784/4 +f 27/88/5 186/785/5 698/786/5 539/89/5 +f 205/374/5 58/363/5 570/364/5 717/375/5 +f 349/470/2 498/501/2 1010/504/2 861/471/2 +f 98/242/5 99/787/5 611/788/5 610/243/5 +f 308/789/3 307/790/3 819/791/3 820/792/3 +f 343/793/2 344/794/2 856/795/2 855/796/2 +f 198/300/4 199/797/4 711/798/4 710/301/4 +f 199/797/4 70/187/4 582/190/4 711/798/4 +f 393/799/3 392/800/3 904/801/3 905/802/3 +f 382/803/2 418/804/2 930/805/2 894/806/2 +f 14/280/4 15/757/4 527/758/4 526/281/4 +f 440/807/3 445/808/3 957/809/3 952/810/3 +f 445/808/3 444/811/3 956/812/3 957/809/3 +f 263/233/3 261/813/3 773/814/3 775/234/3 +f 173/815/5 90/816/5 602/817/5 685/818/5 +f 247/650/4 118/675/4 630/676/4 759/651/4 +f 412/819/2 413/820/2 925/821/2 924/822/2 +f 402/406/3 406/345/3 918/348/3 914/407/3 +f 418/804/2 415/823/2 927/824/2 930/805/2 +f 139/686/5 124/825/5 636/826/5 651/687/5 +f 461/827/2 458/585/2 970/586/2 973/828/2 +f 479/184/2 480/511/2 992/514/2 991/185/2 +f 53/530/5 146/633/5 658/634/5 565/531/5 +f 390/495/2 391/709/2 903/712/2 902/496/2 +f 342/394/2 343/793/2 855/796/2 854/395/2 +f 92/646/5 93/663/5 605/666/5 604/647/5 +f 56/612/4 57/431/4 569/432/4 568/613/4 +f 227/829/5 36/830/5 548/831/5 739/832/5 +f 44/833/5 45/733/5 557/734/5 556/834/5 +f 331/350/2 332/835/2 844/836/2 843/351/2 +f 244/550/5 245/837/5 757/838/5 756/551/5 +f 299/723/3 298/839/3 810/840/3 811/724/3 +f 156/400/5 157/841/5 669/842/5 668/401/5 +f 323/843/3 322/569/3 834/572/3 835/844/3 +f 50/269/5 51/845/5 563/846/5 562/270/5 +f 136/847/4 137/848/4 649/849/4 648/850/4 +f 140/134/5 141/179/5 653/182/5 652/135/5 +f 261/813/3 260/851/3 772/852/3 773/814/3 +f 387/853/3 385/517/3 897/520/3 899/854/3 +f 228/855/5 229/856/5 741/857/5 740/858/5 +f 386/573/3 396/859/3 908/860/3 898/574/3 +f 84/861/5 85/521/5 597/522/5 596/862/5 +f 278/863/3 277/864/3 789/865/3 790/866/3 +f 220/664/5 221/121/5 733/124/5 732/665/5 +f 77/867/5 204/373/5 716/376/5 589/868/5 +f 233/566/4 104/155/4 616/158/4 745/567/4 +f 151/462/4 48/79/4 560/82/4 663/463/4 +f 293/869/3 295/57/3 807/60/3 805/870/3 +f 298/839/3 300/149/3 812/152/3 810/840/3 +f 434/441/3 432/615/3 944/616/3 946/442/3 +f 380/42/2 381/871/2 893/872/2 892/43/2 +f 435/707/3 426/873/3 938/874/3 947/708/3 +f 74/527/5 75/875/5 587/876/5 586/528/5 +f 196/877/5 197/878/5 709/879/5 708/880/5 +f 157/841/5 106/735/5 618/736/5 669/842/5 +f 332/835/2 354/881/2 866/882/2 844/836/2 +f 252/164/5 253/385/5 765/386/5 764/165/5 +f 515/434/2 505/883/2 1017/884/2 1027/435/2 +f 170/885/5 171/645/5 683/648/5 682/886/5 +f 97/887/4 166/888/4 678/889/4 609/890/4 +f 131/891/5 258/892/5 770/893/5 643/894/5 +f 230/38/4 231/103/4 743/106/4 742/39/4 +f 500/895/2 489/765/2 1001/766/2 1012/896/2 +f 245/837/5 18/897/5 530/898/5 757/838/5 +f 397/899/2 398/900/2 910/901/2 909/902/2 +f 511/657/2 512/223/2 1024/226/2 1023/658/2 +f 470/448/2 471/107/2 983/110/2 982/449/2 +f 202/903/5 203/561/5 715/564/5 714/904/5 +f 82/905/5 83/587/5 595/590/5 594/906/5 +f 78/557/4 79/21/4 591/24/4 590/558/4 +f 142/774/4 143/611/4 655/614/4 654/775/4 +f 167/907/4 16/245/4 528/248/4 679/908/4 +f 215/909/4 86/910/4 598/911/4 727/912/4 +f 365/913/3 403/914/3 915/915/3 877/916/3 +f 76/917/5 77/867/5 589/868/5 588/918/5 +f 13/536/5 170/885/5 682/886/5 525/537/5 +f 381/871/2 382/803/2 894/806/2 893/872/2 +f 467/919/2 468/920/2 980/921/2 979/922/2 +f 208/412/4 209/923/4 721/924/4 720/413/4 +f 96/762/4 97/887/4 609/890/4 608/763/4 +f 64/748/4 65/299/4 577/302/4 576/749/4 +f 60/562/5 61/925/5 573/926/5 572/563/5 +f 19/927/5 164/367/5 676/368/5 531/928/5 +f 250/929/5 251/769/5 763/770/5 762/930/5 +f 469/931/2 467/919/2 979/922/2 981/932/2 +f 457/933/2 453/934/2 965/935/2 969/936/2 +f 109/694/5 236/937/5 748/938/5 621/695/5 +f 236/937/5 237/173/5 749/174/5 748/938/5 +f 6/939/4 7/249/4 519/252/4 518/940/4 +f 36/830/5 37/307/5 549/310/5 548/831/5 +f 130/30/5 131/891/5 643/894/5 642/31/5 +f 123/429/5 250/929/5 762/930/5 635/430/5 +f 258/892/5 259/941/5 771/942/5 770/893/5 +f 90/816/5 91/943/5 603/944/5 602/817/5 +f 399/710/2 397/899/2 909/902/2 911/711/2 +f 446/655/3 448/945/3 960/946/3 958/656/3 +f 216/947/4 217/948/4 729/949/4 728/950/4 +f 187/951/5 76/917/5 588/918/5 699/952/5 +f 464/713/2 469/931/2 981/932/2 976/714/2 +f 105/156/4 158/783/4 670/784/4 617/157/4 +f 235/953/5 28/954/5 540/955/5 747/956/5 +f 466/957/2 462/261/2 974/264/2 978/958/2 +f 505/883/2 506/629/2 1018/632/2 1017/884/2 +f 175/146/4 17671/959/4 17675/960/4 687/147/4 +f 219/608/5 44/833/5 556/834/5 731/609/5 +f 314/570/3 313/455/3 825/458/3 826/571/3 +f 495/502/2 496/125/2 1008/128/2 1007/503/2 +f 453/934/2 454/961/2 966/962/2 965/935/2 +f 452/963/3 451/683/3 963/684/3 964/964/3 +f 344/794/2 350/113/2 862/116/2 856/795/2 +f 492/660/2 493/591/2 1005/592/2 1004/661/2 +f 51/845/5 148/317/5 660/320/5 563/846/5 +f 277/864/3 279/965/3 791/966/3 789/865/3 +f 155/668/5 108/693/5 620/696/5 667/669/5 +f 454/961/2 455/967/2 967/968/2 966/962/2 +f 426/873/3 425/507/3 937/510/3 938/874/3 +f 302/969/3 304/970/3 816/971/3 814/972/3 +f 488/294/2 494/973/2 1006/974/2 1000/295/2 +f 217/948/4 88/211/4 600/214/4 729/949/4 +f 421/66/2 419/203/2 931/206/2 933/67/2 +f 320/975/3 324/976/3 836/977/3 832/978/3 +f 424/653/3 430/599/3 942/602/3 936/654/3 +f 99/787/5 226/979/5 738/980/5 611/788/5 +f 61/925/5 138/685/5 650/688/5 573/926/5 +f 367/311/3 369/739/3 881/740/3 879/312/3 +f 127/981/4 136/847/4 648/850/4 639/982/4 +f 38/983/4 39/984/4 551/985/4 550/986/4 +f 89/212/4 174/145/4 686/148/4 601/213/4 +f 502/630/2 503/253/2 1015/256/2 1014/631/2 +f 360/96/3 366/703/3 878/706/3 872/97/3 +f 316/745/3 315/387/3 827/390/3 828/746/3 +f 305/576/3 303/987/3 815/988/3 817/577/3 +f 23/62/4 240/129/4 752/132/4 535/63/4 +f 304/970/3 309/989/3 821/990/3 816/971/3 +f 378/991/2 379/337/2 891/340/2 890/992/2 +f 197/878/5 66/69/5 578/70/5 709/879/5 +f 289/993/3 287/283/3 799/286/3 801/994/3 +f 357/239/2 355/297/2 867/298/2 869/240/2 +f 20/582/5 21/415/5 533/418/5 532/583/5 +f 144/138/4 145/451/4 657/454/4 656/139/4 +f 472/108/2 478/995/2 990/996/2 984/109/2 +f 485/737/2 483/219/2 995/222/2 997/738/2 +f 375/338/2 376/369/2 888/370/2 887/339/2 +f 290/485/3 281/741/3 793/744/3 802/486/3 +f 178/997/5 179/998/5 691/999/5 690/1000/5 +f 468/920/2 456/1001/2 968/1002/2 980/921/2 +f 181/751/5 82/905/5 594/906/5 693/752/5 +f 86/910/4 87/491/4 599/494/4 598/911/4 +f 309/989/3 308/789/3 820/792/3 821/990/3 +f 91/943/5 218/607/5 730/610/5 603/944/5 +f 214/425/4 215/909/4 727/912/4 726/426/4 +f 47/777/4 216/947/4 728/950/4 559/778/4 +f 31/230/4 232/565/4 744/568/4 543/231/4 +f 134/555/4 135/747/4 647/750/4 646/556/4 +f 226/979/5 227/829/5 739/832/5 738/980/5 +f 161/1003/4 38/983/4 550/986/4 673/1004/4 +f 238/1005/4 239/1006/4 751/1007/4 750/1008/4 +f 318/459/3 320/975/3 832/978/3 830/460/3 +f 160/754/4 161/1003/4 673/1004/4 672/755/4 +f 456/1001/2 457/933/2 969/936/2 968/1002/2 +f 5/1009/5 17670/1010/5 17674/1011/5 517/1012/5 +f 441/1013/3 439/1014/3 951/1015/3 953/1016/3 +f 478/995/2 475/553/2 987/554/2 990/996/2 +f 448/945/3 452/963/3 964/964/3 960/946/3 +f 372/391/3 362/767/3 874/768/3 884/392/3 +f 460/488/2 482/183/2 994/186/2 972/489/2 +f 396/859/3 393/799/3 905/802/3 908/860/3 +f 132/54/5 133/29/5 645/32/5 644/55/5 +f 413/820/2 337/427/2 849/428/2 925/821/2 +f 172/678/5 173/815/5 685/818/5 684/679/5 +f 101/672/5 228/855/5 740/858/5 613/673/5 +f 329/759/2 325/689/2 837/692/2 841/760/2 +f 201/160/4 72/481/4 584/482/4 713/161/4 +f 179/998/5 84/861/5 596/862/5 691/999/5 +f 303/987/3 302/969/3 814/972/3 815/988/3 +f 438/1017/3 440/807/3 952/810/3 950/1018/3 +f 392/800/3 17673/1019/3 17677/1020/3 904/801/3 +f 486/716/2 487/293/2 999/296/2 998/717/2 +f 176/492/4 177/1021/4 689/1022/4 688/493/4 +f 354/881/2 351/533/2 863/534/2 866/882/2 +f 307/790/3 297/483/3 809/484/3 819/791/3 +f 280/742/3 278/863/3 790/866/3 792/743/3 +f 260/851/3 262/727/3 774/730/3 772/852/3 +f 443/1023/3 371/271/3 883/274/3 955/1024/3 +f 259/941/5 5/1009/5 517/1012/5 771/942/5 +f 444/811/3 443/1023/3 955/1024/3 956/812/3 +f 326/690/2 327/477/2 839/480/2 838/691/2 +f 229/856/5 34/725/5 546/726/5 741/857/5 +f 283/638/3 282/333/3 794/336/3 795/639/3 +f 239/1006/4 110/1025/4 622/1026/4 751/1007/4 +f 75/875/5 202/903/5 714/904/5 587/876/5 +f 439/1014/3 438/1017/3 950/1018/3 951/1015/3 +f 288/701/3 292/99/3 804/102/3 800/702/3 +f 54/452/4 55/411/4 567/414/4 566/453/4 +f 25/236/4 238/1005/4 750/1008/4 537/237/4 +f 116/546/5 117/549/5 629/552/5 628/547/5 +f 69/597/5 196/877/5 708/880/5 581/598/5 +f 255/524/4 126/1027/4 638/1028/4 767/525/4 +f 499/539/2 500/895/2 1012/896/2 1011/540/2 +f 40/258/4 41/697/4 553/698/4 552/259/4 +f 28/954/5 29/621/5 541/622/5 540/955/5 +f 209/923/4 80/619/4 592/620/4 721/924/4 +f 71/188/4 192/465/4 704/468/4 583/189/4 +f 403/914/3 401/1029/3 913/1030/3 915/915/3 +f 398/900/2 378/991/2 890/992/2 910/901/2 +f 324/976/3 323/843/3 835/844/3 836/977/3 +f 414/84/2 412/819/2 924/822/2 926/85/2 +f 273/388/3 272/627/3 784/628/3 785/389/3 +f 415/823/2 416/1031/2 928/1032/2 927/824/2 +f 39/984/4 224/781/4 736/782/4 551/985/4 +f 193/466/4 32/409/4 544/410/4 705/467/4 +f 276/593/3 275/397/3 787/398/3 788/594/3 +f 185/365/4 24/235/4 536/238/4 697/366/4 +f 113/330/4 150/461/4 662/464/4 625/331/4 +f 18/897/5 19/927/5 531/928/5 530/898/5 +f 11/192/5 178/997/5 690/1000/5 523/193/5 +f 162/308/5 163/731/5 675/732/5 674/309/5 +f 124/825/5 125/163/5 637/166/5 636/826/5 +f 110/1025/4 111/71/4 623/74/4 622/1026/4 +f 8/1033/4 9/543/4 521/544/4 520/1034/4 +f 152/72/4 153/49/4 665/52/4 664/73/4 +f 149/318/5 114/617/5 626/618/5 661/319/5 +f 186/785/5 187/951/5 699/952/5 698/786/5 +f 427/623/3 429/195/3 941/198/3 939/624/3 +f 388/595/3 387/853/3 899/854/3 900/596/3 +f 401/1029/3 400/405/3 912/408/3 913/1030/3 +f 455/967/2 461/827/2 973/828/2 967/968/2 +f 126/1027/4 127/981/4 639/982/4 638/1028/4 +f 177/1021/4 8/1033/4 520/1034/4 689/1022/4 +f 137/848/4 62/779/4 574/780/4 649/849/4 +f 234/142/5 235/953/5 747/956/5 746/143/5 +f 339/1035/2 340/207/2 852/210/2 851/1036/2 +f 268/728/3 266/515/3 778/516/3 780/729/3 +f 494/973/2 491/659/2 1003/662/2 1006/974/2 +f 294/444/3 293/869/3 805/870/3 806/445/3 +f 183/288/4 22/61/4 534/64/4 695/289/4 +f 279/965/3 285/637/3 797/640/3 791/966/3 +f 267/474/3 289/993/3 801/994/3 779/475/3 +f 363/721/3 365/913/3 877/916/3 875/722/3 +f 465/719/2 466/957/2 978/958/2 977/720/2 +f 341/76/2 339/1035/2 851/1036/2 853/77/2 +f 416/1031/2 417/65/2 929/68/2 928/1032/2 +f 166/888/4 167/907/4 679/908/4 678/889/4 +f 442/604/3 441/1013/3 953/1016/3 954/605/3 +f 120/641/4 121/773/4 633/776/4 632/642/4 +f 94/353/4 95/625/4 607/626/4 606/354/4 +f 1029/1037/1 1030/1038/1 1031/1039/1 1032/1040/1 +f 1033/1041/1 1034/1042/1 1035/1043/1 1036/1044/1 +f 1037/1045/1 1038/1046/1 1039/1047/1 1040/1048/1 +f 1041/1049/1 1042/1050/1 1043/1051/1 1044/1052/1 +f 1045/1053/1 1046/1054/1 1047/1055/1 1048/1056/1 +f 1049/1057/1 1050/1058/1 1051/1059/1 1052/1060/1 +f 1053/1061/1 1054/1062/1 1055/1063/1 1056/1064/1 +f 1057/1065/1 1058/1066/1 1059/1067/1 1060/1068/1 +f 1061/1069/1 1062/1070/1 1063/1071/1 1064/1072/1 +f 1065/1073/1 1066/1074/1 1067/1075/1 1068/1076/1 +f 1069/1077/1 1070/1078/1 1071/1079/1 1072/1080/1 +f 1073/1081/1 1074/1082/1 1075/1083/1 1076/1084/1 +f 1077/1085/1 1078/1086/1 1079/1087/1 1080/1088/1 +f 1081/1089/1 1082/1090/1 1083/1091/1 1084/1092/1 +f 1085/1093/1 1086/1094/1 1087/1095/1 1088/1096/1 +f 1089/1097/1 1090/1098/1 1091/1099/1 1092/1100/1 +f 1093/1101/1 1094/1102/1 1095/1103/1 1096/1104/1 +f 1097/1105/1 1098/1106/1 1099/1107/1 1100/1108/1 +f 1101/1109/1 1102/1110/1 1103/1111/1 1104/1112/1 +f 1105/1113/1 1106/1114/1 1107/1115/1 1108/1116/1 +f 1109/1117/1 1110/1118/1 1111/1119/1 1112/1120/1 +f 1113/1121/1 1114/1122/1 1115/1123/1 1116/1124/1 +f 1117/1125/1 1118/1126/1 1119/1127/1 1120/1128/1 +f 1121/1129/1 1122/1130/1 1123/1131/1 1124/1132/1 +f 1125/1133/1 1126/1134/1 1127/1135/1 1128/1136/1 +f 1129/1137/1 1130/1138/1 1131/1139/1 1132/1140/1 +f 1133/1141/1 1134/1142/1 1135/1143/1 1136/1144/1 +f 1137/1145/1 1138/1146/1 1139/1147/1 1140/1148/1 +f 1141/1149/1 1142/1150/1 1143/1151/1 1144/1152/1 +f 1145/1153/1 1146/1154/1 1147/1155/1 1148/1156/1 +f 1149/1157/1 1150/1158/1 1151/1159/1 1152/1160/1 +f 1153/1161/1 1154/1162/1 1155/1163/1 1156/1164/1 +f 1157/1165/1 1158/1166/1 1159/1167/1 1160/1168/1 +f 1161/1169/1 1162/1170/1 1163/1171/1 1164/1172/1 +f 1165/1173/1 1166/1174/1 1167/1175/1 1168/1176/1 +f 1169/1177/1 1170/1178/1 1171/1179/1 1172/1180/1 +f 1173/1181/1 1174/1182/1 1175/1183/1 1176/1184/1 +f 1177/1185/1 1178/1186/1 1179/1187/1 1180/1188/1 +f 1181/1189/1 1182/1190/1 1183/1191/1 1184/1192/1 +f 1185/1193/1 1186/1194/1 1187/1195/1 1188/1196/1 +f 1189/1197/1 1190/1198/1 1191/1199/1 1192/1200/1 +f 1193/1201/1 1194/1202/1 1195/1203/1 1196/1204/1 +f 1197/1205/1 1198/1206/1 1199/1207/1 1200/1208/1 +f 1201/1209/1 1202/1210/1 1203/1211/1 1204/1212/1 +f 1205/1213/1 1206/1214/1 1207/1215/1 1208/1216/1 +f 1209/1217/1 1210/1218/1 1211/1219/1 1212/1220/1 +f 1213/1221/1 1214/1222/1 1215/1223/1 1216/1224/1 +f 1217/1225/1 1218/1226/1 1219/1227/1 1220/1228/1 +f 1221/1229/1 1222/1230/1 1223/1231/1 1224/1232/1 +f 1225/1233/1 1226/1234/1 1227/1235/1 1228/1236/1 +f 1229/1237/1 1230/1238/1 1231/1239/1 1232/1240/1 +f 1233/1241/1 1234/1242/1 1235/1243/1 1236/1244/1 +f 1237/1245/1 1238/1246/1 1239/1247/1 1240/1248/1 +f 1241/1249/1 1242/1250/1 1243/1251/1 1244/1252/1 +f 1245/1253/1 1246/1254/1 1247/1255/1 1248/1256/1 +f 1249/1257/1 1250/1258/1 1251/1259/1 1252/1260/1 +f 1253/1261/1 1254/1262/1 1255/1263/1 1256/1264/1 +f 1257/1265/1 1258/1266/1 1259/1267/1 1260/1268/1 +f 1261/1269/1 1262/1270/1 1263/1271/1 1264/1272/1 +f 1265/1273/1 1266/1274/1 1267/1275/1 1268/1276/1 +f 1269/1277/1 1270/1278/1 1271/1279/1 1272/1280/1 +f 1273/1281/1 1274/1282/1 1275/1283/1 1276/1284/1 +f 1277/1285/1 1278/1286/1 1279/1287/1 1280/1288/1 +f 1281/1289/1 1282/1290/1 1283/1291/1 1284/1292/1 +f 1285/1293/1 1286/1294/1 1287/1295/1 1288/1296/1 +f 1289/1297/1 1290/1298/1 1291/1299/1 1292/1300/1 +f 1293/1301/1 1294/1302/1 1295/1303/1 1296/1304/1 +f 1297/1305/1 1298/1306/1 1299/1307/1 1300/1308/1 +f 1301/1309/1 1302/1310/1 1303/1311/1 1304/1312/1 +f 1305/1313/1 1306/1314/1 1307/1315/1 1308/1316/1 +f 1309/1317/1 1310/1318/1 1311/1319/1 1312/1320/1 +f 1313/1321/1 1314/1322/1 1315/1323/1 1316/1324/1 +f 1317/1325/1 1318/1326/1 1319/1327/1 1320/1328/1 +f 1321/1329/1 1322/1330/1 1323/1331/1 1324/1332/1 +f 1325/1333/1 1326/1334/1 1327/1335/1 1328/1336/1 +f 1329/1337/1 1330/1338/1 1331/1339/1 1332/1340/1 +f 1333/1341/1 1334/1342/1 1335/1343/1 1336/1344/1 +f 1337/1345/1 1338/1346/1 1339/1347/1 1340/1348/1 +f 1341/1349/1 1342/1350/1 1343/1351/1 1344/1352/1 +f 1345/1353/1 1346/1354/1 1347/1355/1 1348/1356/1 +f 1349/1357/1 1350/1358/1 1351/1359/1 1352/1360/1 +f 1353/1361/1 1354/1362/1 1355/1363/1 1356/1364/1 +f 1357/1365/1 1358/1366/1 1359/1367/1 1360/1368/1 +f 1361/1369/1 1362/1370/1 1363/1371/1 1364/1372/1 +f 1365/1373/1 1366/1374/1 1367/1375/1 1368/1376/1 +f 1369/1377/1 1370/1378/1 1371/1379/1 1372/1380/1 +f 1373/1381/1 1374/1382/1 1375/1383/1 1376/1384/1 +f 1377/1385/1 1378/1386/1 1379/1387/1 1380/1388/1 +f 1381/1389/1 1382/1390/1 1383/1391/1 1384/1392/1 +f 1385/1393/1 1386/1394/1 1387/1395/1 1388/1396/1 +f 1389/1397/1 1390/1398/1 1391/1399/1 1392/1400/1 +f 1393/1401/1 1394/1402/1 1395/1403/1 1396/1404/1 +f 1397/1405/1 1398/1406/1 1399/1407/1 1400/1408/1 +f 1401/1409/1 1402/1410/1 1403/1411/1 1404/1412/1 +f 1405/1413/1 1406/1414/1 1407/1415/1 1408/1416/1 +f 1409/1417/1 1410/1418/1 1411/1419/1 1412/1420/1 +f 1413/1421/1 1414/1422/1 1415/1423/1 1416/1424/1 +f 1417/1425/1 1418/1426/1 1419/1427/1 1420/1428/1 +f 1421/1429/1 1422/1430/1 1423/1431/1 1424/1432/1 +f 1425/1433/1 1426/1434/1 1427/1435/1 1428/1436/1 +f 1429/1437/1 1430/1438/1 1431/1439/1 1432/1440/1 +f 1433/1441/1 1434/1442/1 1435/1443/1 1436/1444/1 +f 1437/1445/1 1438/1446/1 1439/1447/1 1440/1448/1 +f 1441/1449/1 1442/1450/1 1443/1451/1 1444/1452/1 +f 1445/1453/1 1446/1454/1 1447/1455/1 1448/1456/1 +f 1449/1457/1 1450/1458/1 1451/1459/1 1452/1460/1 +f 1453/1461/1 1454/1462/1 1455/1463/1 1456/1464/1 +f 1457/1465/1 1458/1466/1 1459/1467/1 1460/1468/1 +f 1461/1469/1 1462/1470/1 1463/1471/1 1464/1472/1 +f 1465/1473/1 1466/1474/1 1467/1475/1 1468/1476/1 +f 1469/1477/1 1470/1478/1 1471/1479/1 1472/1480/1 +f 1473/1481/1 1474/1482/1 1475/1483/1 1476/1484/1 +f 1477/1485/1 1478/1486/1 1479/1487/1 1480/1488/1 +f 1481/1489/1 1482/1490/1 1483/1491/1 1484/1492/1 +f 1485/1493/1 1486/1494/1 1487/1495/1 1488/1496/1 +f 1489/1497/1 1490/1498/1 1491/1499/1 1492/1500/1 +f 1493/1501/1 1494/1502/1 1495/1503/1 1496/1504/1 +f 1497/1505/1 1498/1506/1 1499/1507/1 1500/1508/1 +f 1501/1509/1 1502/1510/1 1503/1511/1 1504/1512/1 +f 1505/1513/1 1506/1514/1 1507/1515/1 1508/1516/1 +f 1509/1517/1 1510/1518/1 1511/1519/1 1512/1520/1 +f 1513/1521/1 1514/1522/1 1515/1523/1 1516/1524/1 +f 1517/1525/1 1518/1526/1 1519/1527/1 1520/1528/1 +f 1521/1529/1 1522/1530/1 1523/1531/1 1524/1532/1 +f 1525/1533/1 1526/1534/1 1527/1535/1 1528/1536/1 +f 1529/1537/1 1530/1538/1 1531/1539/1 1532/1540/1 +f 1533/1541/1 1534/1542/1 1535/1543/1 1536/1544/1 +f 1537/1545/1 1538/1546/1 1539/1547/1 1540/1548/1 +f 1541/1549/1 1542/1550/1 1543/1551/1 1544/1552/1 +f 1545/1553/1 1546/1554/1 1547/1555/1 1548/1556/1 +f 1549/1557/1 1550/1558/1 1551/1559/1 1552/1560/1 +f 1553/1561/1 1554/1562/1 1555/1563/1 1556/1564/1 +f 1557/1565/1 1558/1566/1 1559/1567/1 1560/1568/1 +f 1561/1569/1 1562/1570/1 1563/1571/1 1564/1572/1 +f 1565/1573/1 1566/1574/1 1567/1575/1 1568/1576/1 +f 1569/1577/1 1570/1578/1 1571/1579/1 1572/1580/1 +f 1573/1581/1 1574/1582/1 1575/1583/1 1576/1584/1 +f 1577/1585/1 1578/1586/1 1579/1587/1 1580/1588/1 +f 1581/1589/1 1582/1590/1 1583/1591/1 1584/1592/1 +f 1585/1593/1 1586/1594/1 1587/1595/1 1588/1596/1 +f 1589/1597/1 1590/1598/1 1591/1599/1 1592/1600/1 +f 1593/1601/1 1594/1602/1 1595/1603/1 1596/1604/1 +f 1597/1605/1 1598/1606/1 1599/1607/1 1600/1608/1 +f 1601/1609/1 1602/1610/1 1603/1611/1 1604/1612/1 +f 1605/1613/1 1606/1614/1 1607/1615/1 1608/1616/1 +f 1609/1617/1 1610/1618/1 1611/1619/1 1612/1620/1 +f 1613/1621/1 1614/1622/1 1615/1623/1 1616/1624/1 +f 1617/1625/1 1618/1626/1 1619/1627/1 1620/1628/1 +f 1621/1629/1 1622/1630/1 1623/1631/1 1624/1632/1 +f 1625/1633/1 1626/1634/1 1627/1635/1 1628/1636/1 +f 1629/1637/1 1630/1638/1 1631/1639/1 1632/1640/1 +f 1633/1641/1 1634/1642/1 1635/1643/1 1636/1644/1 +f 1637/1645/1 1638/1646/1 1639/1647/1 1640/1648/1 +f 1641/1649/1 1642/1650/1 1643/1651/1 1644/1652/1 +f 1645/1653/1 1646/1654/1 1647/1655/1 1648/1656/1 +f 1649/1657/1 1650/1658/1 1651/1659/1 1652/1660/1 +f 1653/1661/1 1654/1662/1 1655/1663/1 1656/1664/1 +f 1657/1665/1 1658/1666/1 1659/1667/1 1660/1668/1 +f 1661/1669/1 1662/1670/1 1663/1671/1 1664/1672/1 +f 1665/1673/1 1666/1674/1 1667/1675/1 1668/1676/1 +f 1669/1677/1 1670/1678/1 1671/1679/1 1672/1680/1 +f 1673/1681/1 1674/1682/1 1675/1683/1 1676/1684/1 +f 1677/1685/1 1678/1686/1 1679/1687/1 1680/1688/1 +f 1681/1689/1 1682/1690/1 1683/1691/1 1684/1692/1 +f 1685/1693/1 1686/1694/1 1687/1695/1 1688/1696/1 +f 1689/1697/1 1690/1698/1 1691/1699/1 1692/1700/1 +f 1693/1701/1 1694/1702/1 1695/1703/1 1696/1704/1 +f 1697/1705/1 1698/1706/1 1699/1707/1 1700/1708/1 +f 1701/1709/1 1702/1710/1 1703/1711/1 1704/1712/1 +f 1705/1713/1 1706/1714/1 1707/1715/1 1708/1716/1 +f 1709/1717/1 1710/1718/1 1711/1719/1 1712/1720/1 +f 1713/1721/1 1714/1722/1 1715/1723/1 1716/1724/1 +f 1717/1725/1 1718/1726/1 1719/1727/1 1720/1728/1 +f 1721/1729/1 1722/1730/1 1723/1731/1 1724/1732/1 +f 1725/1733/1 1726/1734/1 1727/1735/1 1728/1736/1 +f 1729/1737/1 1730/1738/1 1731/1739/1 1732/1740/1 +f 1733/1741/1 1734/1742/1 1735/1743/1 1736/1744/1 +f 1737/1745/1 1738/1746/1 1739/1747/1 1740/1748/1 +f 1741/1749/1 1742/1750/1 1743/1751/1 1744/1752/1 +f 1745/1753/1 1746/1754/1 1747/1755/1 1748/1756/1 +f 1749/1757/1 1750/1758/1 1751/1759/1 1752/1760/1 +f 1753/1761/1 1754/1762/1 1755/1763/1 1756/1764/1 +f 1757/1765/1 1758/1766/1 1759/1767/1 1760/1768/1 +f 1761/1769/1 1762/1770/1 1763/1771/1 1764/1772/1 +f 1765/1773/1 1766/1774/1 1767/1775/1 1768/1776/1 +f 1769/1777/1 1770/1778/1 1771/1779/1 1772/1780/1 +f 1773/1781/1 1774/1782/1 1775/1783/1 1776/1784/1 +f 1777/1785/1 1778/1786/1 1779/1787/1 1780/1788/1 +f 1781/1789/1 1782/1790/1 1783/1791/1 1784/1792/1 +f 1785/1793/1 1786/1794/1 1787/1795/1 1788/1796/1 +f 1789/1797/1 1790/1798/1 1791/1799/1 1792/1800/1 +f 1793/1801/1 1794/1802/1 1795/1803/1 1796/1804/1 +f 1797/1805/1 1798/1806/1 1799/1807/1 1800/1808/1 +f 1801/1809/1 1802/1810/1 1803/1811/1 1804/1812/1 +f 1805/1813/1 1806/1814/1 1807/1815/1 1808/1816/1 +f 1809/1817/1 1810/1818/1 1811/1819/1 1812/1820/1 +f 1813/1821/1 1814/1822/1 1815/1823/1 1816/1824/1 +f 1817/1825/1 1818/1826/1 1819/1827/1 1820/1828/1 +f 1821/1829/1 1822/1830/1 1823/1831/1 1824/1832/1 +f 1825/1833/1 1826/1834/1 1827/1835/1 1828/1836/1 +f 1829/1837/1 1830/1838/1 1831/1839/1 1832/1840/1 +f 1833/1841/1 1834/1842/1 1835/1843/1 1836/1844/1 +f 1837/1845/1 1838/1846/1 1839/1847/1 1840/1848/1 +f 1841/1849/1 1842/1850/1 1843/1851/1 1844/1852/1 +f 1845/1853/1 1846/1854/1 1847/1855/1 1848/1856/1 +f 1849/1857/1 1850/1858/1 1851/1859/1 1852/1860/1 +f 1853/1861/1 1854/1862/1 1855/1863/1 1856/1864/1 +f 1857/1865/1 1858/1866/1 1859/1867/1 1860/1868/1 +f 1861/1869/1 1862/1870/1 1863/1871/1 1864/1872/1 +f 1865/1873/1 1866/1874/1 1867/1875/1 1868/1876/1 +f 1869/1877/1 1870/1878/1 1871/1879/1 1872/1880/1 +f 1873/1881/1 1874/1882/1 1875/1883/1 1876/1884/1 +f 1877/1885/1 1878/1886/1 1879/1887/1 1880/1888/1 +f 1881/1889/1 1882/1890/1 1883/1891/1 1884/1892/1 +f 1885/1893/1 1886/1894/1 1887/1895/1 1888/1896/1 +f 1889/1897/1 1890/1898/1 1891/1899/1 1892/1900/1 +f 1893/1901/1 1894/1902/1 1895/1903/1 1896/1904/1 +f 1897/1905/1 1898/1906/1 1899/1907/1 1900/1908/1 +f 1901/1909/1 1902/1910/1 1903/1911/1 1904/1912/1 +f 1905/1913/1 1906/1914/1 1907/1915/1 1908/1916/1 +f 1909/1917/1 1910/1918/1 1911/1919/1 1912/1920/1 +f 1913/1921/1 1914/1922/1 1915/1923/1 1916/1924/1 +f 1917/1925/1 1918/1926/1 1919/1927/1 1920/1928/1 +f 1921/1929/1 1922/1930/1 1923/1931/1 1924/1932/1 +f 1925/1933/1 1926/1934/1 1927/1935/1 1928/1936/1 +f 1929/1937/1 1930/1938/1 1931/1939/1 1932/1940/1 +f 1933/1941/1 1934/1942/1 1935/1943/1 1936/1944/1 +f 1937/1945/1 1938/1946/1 1939/1947/1 1940/1948/1 +f 1941/1949/1 1942/1950/1 1943/1951/1 1944/1952/1 +f 1945/1953/1 1946/1954/1 1947/1955/1 1948/1956/1 +f 1949/1957/1 1950/1958/1 1951/1959/1 1952/1960/1 +f 1953/1961/1 1954/1962/1 1955/1963/1 1956/1964/1 +f 1957/1965/1 1958/1966/1 1959/1967/1 1960/1968/1 +f 1961/1969/1 1962/1970/1 1963/1971/1 1964/1972/1 +f 1965/1973/1 1966/1974/1 1967/1975/1 1968/1976/1 +f 1969/1977/1 1970/1978/1 1971/1979/1 1972/1980/1 +f 1973/1981/1 1974/1982/1 1975/1983/1 1976/1984/1 +f 1977/1985/1 1978/1986/1 1979/1987/1 1980/1988/1 +f 1981/1989/1 1982/1990/1 1983/1991/1 1984/1992/1 +f 1985/1993/1 1986/1994/1 1987/1995/1 1988/1996/1 +f 1989/1997/1 1990/1998/1 1991/1999/1 1992/2000/1 +f 1993/2001/1 1994/2002/1 1995/2003/1 1996/2004/1 +f 1997/2005/1 1998/2006/1 1999/2007/1 2000/2008/1 +f 2001/2009/1 2002/2010/1 2003/2011/1 2004/2012/1 +f 2005/2013/1 2006/2014/1 2007/2015/1 2008/2016/1 +f 2009/2017/1 2010/2018/1 2011/2019/1 2012/2020/1 +f 2013/2021/1 2014/2022/1 2015/2023/1 2016/2024/1 +f 2017/2025/1 2018/2026/1 2019/2027/1 2020/2028/1 +f 2021/2029/1 2022/2030/1 2023/2031/1 2024/2032/1 +f 2025/2033/1 2026/2034/1 2027/2035/1 2028/2036/1 +f 2029/2037/1 2030/2038/1 2031/2039/1 2032/2040/1 +f 2033/2041/1 2034/2042/1 2035/2043/1 2036/2044/1 +f 2037/2045/1 2038/2046/1 2039/2047/1 2040/2048/1 +f 2041/2049/1 2042/2050/1 2043/2051/1 2044/2052/1 +f 2045/2053/1 2046/2054/1 2047/2055/1 2048/2056/1 +f 2049/2057/1 2050/2058/1 2051/2059/1 2052/2060/1 +f 2053/2061/1 2054/2062/1 2055/2063/1 2056/2064/1 +f 2057/2065/1 2058/2066/1 2059/2067/1 2060/2068/1 +f 2061/2069/1 2062/2070/1 2063/2071/1 2064/2072/1 +f 2065/2073/1 2066/2074/1 2067/2075/1 2068/2076/1 +f 2069/2077/1 2070/2078/1 2071/2079/1 2072/2080/1 +f 2073/2081/1 2074/2082/1 2075/2083/1 2076/2084/1 +f 2077/2085/1 2078/2086/1 2079/2087/1 2080/2088/1 +f 2081/2089/1 2082/2090/1 2083/2091/1 2084/2092/1 +f 2085/2093/1 2086/2094/1 2087/2095/1 2088/2096/1 +f 2089/2097/1 2090/2098/1 2091/2099/1 2092/2100/1 +f 2093/2101/1 2094/2102/1 2095/2103/1 2096/2104/1 +f 2097/2105/1 2098/2106/1 2099/2107/1 2100/2108/1 +f 2101/2109/1 2102/2110/1 2103/2111/1 2104/2112/1 +f 2105/2113/1 2106/2114/1 2107/2115/1 2108/2116/1 +f 2109/2117/1 2110/2118/1 2111/2119/1 2112/2120/1 +f 2113/2121/1 2114/2122/1 2115/2123/1 2116/2124/1 +f 2117/2125/1 2118/2126/1 2119/2127/1 2120/2128/1 +f 2121/2129/1 2122/2130/1 2123/2131/1 2124/2132/1 +f 2125/2133/1 2126/2134/1 2127/2135/1 2128/2136/1 +f 2129/2137/1 2130/2138/1 2131/2139/1 2132/2140/1 +f 2133/2141/1 2134/2142/1 2135/2143/1 2136/2144/1 +f 2137/2145/1 2138/2146/1 2139/2147/1 2140/2148/1 +f 2141/2149/1 2142/2150/1 2143/2151/1 2144/2152/1 +f 2145/2153/1 2146/2154/1 2147/2155/1 2148/2156/1 +f 2149/2157/1 2150/2158/1 2151/2159/1 2152/2160/1 +f 2153/2161/1 2154/2162/1 2155/2163/1 2156/2164/1 +f 2157/2165/1 2158/2166/1 2159/2167/1 2160/2168/1 +f 2161/2169/1 2162/2170/1 2163/2171/1 2164/2172/1 +f 2165/2173/1 2166/2174/1 2167/2175/1 2168/2176/1 +f 2169/2177/1 2170/2178/1 2171/2179/1 2172/2180/1 +f 2173/2181/1 2174/2182/1 2175/2183/1 2176/2184/1 +f 2177/2185/1 2178/2186/1 2179/2187/1 2180/2188/1 +f 2181/2189/1 2182/2190/1 2183/2191/1 2184/2192/1 +f 2185/2193/1 2186/2194/1 2187/2195/1 2188/2196/1 +f 2189/2197/1 2190/2198/1 2191/2199/1 2192/2200/1 +f 2193/2201/1 2194/2202/1 2195/2203/1 2196/2204/1 +f 2197/2205/1 2198/2206/1 2199/2207/1 2200/2208/1 +f 2201/2209/1 2202/2210/1 2203/2211/1 2204/2212/1 +f 2205/2213/1 2206/2214/1 2207/2215/1 2208/2216/1 +f 2209/2217/1 2210/2218/1 2211/2219/1 2212/2220/1 +f 2213/2221/1 2214/2222/1 2215/2223/1 2216/2224/1 +f 2217/2225/1 2218/2226/1 2219/2227/1 2220/2228/1 +f 2221/2229/1 2222/2230/1 2223/2231/1 2224/2232/1 +f 2225/2233/1 2226/2234/1 2227/2235/1 2228/2236/1 +f 2229/2237/1 2230/2238/1 2231/2239/1 2232/2240/1 +f 2233/2241/1 2234/2242/1 2235/2243/1 2236/2244/1 +f 2237/2245/1 2238/2246/1 2239/2247/1 2240/2248/1 +f 2241/2249/1 2242/2250/1 2243/2251/1 2244/2252/1 +f 2245/2253/1 2246/2254/1 2247/2255/1 2248/2256/1 +f 2249/2257/1 2250/2258/1 2251/2259/1 2252/2260/1 +f 2253/2261/1 2254/2262/1 2255/2263/1 2256/2264/1 +f 2257/2265/1 2258/2266/1 2259/2267/1 2260/2268/1 +f 2261/2269/1 2262/2270/1 2263/2271/1 2264/2272/1 +f 2265/2273/1 2266/2274/1 2267/2275/1 2268/2276/1 +f 2269/2277/1 2270/2278/1 2271/2279/1 2272/2280/1 +f 2273/2281/1 2274/2282/1 2275/2283/1 2276/2284/1 +f 2277/2285/1 2278/2286/1 2279/2287/1 2280/2288/1 +f 2281/2289/1 2282/2290/1 2283/2291/1 2284/2292/1 +f 2285/2293/1 2286/2294/1 2287/2295/1 2288/2296/1 +f 2289/2297/1 2290/2298/1 2291/2299/1 2292/2300/1 +f 2293/2301/1 2294/2302/1 2295/2303/1 2296/2304/1 +f 2297/2305/1 2298/2306/1 2299/2307/1 2300/2308/1 +f 2301/2309/1 2302/2310/1 2303/2311/1 2304/2312/1 +f 2305/2313/1 2306/2314/1 2307/2315/1 2308/2316/1 +f 2309/2317/1 2310/2318/1 2311/2319/1 2312/2320/1 +f 2313/2321/1 2314/2322/1 2315/2323/1 2316/2324/1 +f 2317/2325/1 2318/2326/1 2319/2327/1 2320/2328/1 +f 2321/2329/1 2322/2330/1 2323/2331/1 2324/2332/1 +f 2325/2333/1 2326/2334/1 2327/2335/1 2328/2336/1 +f 2329/2337/1 2330/2338/1 2331/2339/1 2332/2340/1 +f 2333/2341/1 2334/2342/1 2335/2343/1 2336/2344/1 +f 2337/2345/1 2338/2346/1 2339/2347/1 2340/2348/1 +f 2341/2349/1 2342/2350/1 2343/2351/1 2344/2352/1 +f 2345/2353/1 2346/2354/1 2347/2355/1 2348/2356/1 +f 2349/2357/1 2350/2358/1 2351/2359/1 2352/2360/1 +f 2353/2361/1 2354/2362/1 2355/2363/1 2356/2364/1 +f 2357/2365/1 2358/2366/1 2359/2367/1 2360/2368/1 +f 2361/2369/1 2362/2370/1 2363/2371/1 2364/2372/1 +f 2365/2373/1 2366/2374/1 2367/2375/1 2368/2376/1 +f 2369/2377/1 2370/2378/1 2371/2379/1 2372/2380/1 +f 2373/2381/1 2374/2382/1 2375/2383/1 2376/2384/1 +f 2377/2385/1 2378/2386/1 2379/2387/1 2380/2388/1 +f 2381/2389/1 2382/2390/1 2383/2391/1 2384/2392/1 +f 2385/2393/1 2386/2394/1 2387/2395/1 2388/2396/1 +f 2389/2397/1 2390/2398/1 2391/2399/1 2392/2400/1 +f 2393/2401/1 2394/2402/1 2395/2403/1 2396/2404/1 +f 2397/2405/1 2398/2406/1 2399/2407/1 2400/2408/1 +f 2401/2409/1 2402/2410/1 2403/2411/1 2404/2412/1 +f 2405/2413/1 2406/2414/1 2407/2415/1 2408/2416/1 +f 2409/2417/1 2410/2418/1 2411/2419/1 2412/2420/1 +f 2413/2421/1 2414/2422/1 2415/2423/1 2416/2424/1 +f 2417/2425/1 2418/2426/1 2419/2427/1 2420/2428/1 +f 2421/2429/1 2422/2430/1 2423/2431/1 2424/2432/1 +f 2425/2433/1 2426/2434/1 2427/2435/1 2428/2436/1 +f 2429/2437/1 2430/2438/1 2431/2439/1 2432/2440/1 +f 2433/2441/1 2434/2442/1 2435/2443/1 2436/2444/1 +f 2437/2445/1 2438/2446/1 2439/2447/1 2440/2448/1 +f 2441/2449/1 2442/2450/1 2443/2451/1 2444/2452/1 +f 2445/2453/1 2446/2454/1 2447/2455/1 2448/2456/1 +f 2449/2457/1 2450/2458/1 2451/2459/1 2452/2460/1 +f 2453/2461/1 2454/2462/1 2455/2463/1 2456/2464/1 +f 2457/2465/1 2458/2466/1 2459/2467/1 2460/2468/1 +f 2461/2469/1 2462/2470/1 2463/2471/1 2464/2472/1 +f 2465/2473/1 2466/2474/1 2467/2475/1 2468/2476/1 +f 2469/2477/1 2470/2478/1 2471/2479/1 2472/2480/1 +f 2473/2481/1 2474/2482/1 2475/2483/1 2476/2484/1 +f 2477/2485/1 2478/2486/1 2479/2487/1 2480/2488/1 +f 2481/2489/1 2482/2490/1 2483/2491/1 2484/2492/1 +f 2485/2493/1 2486/2494/1 2487/2495/1 2488/2496/1 +f 2489/2497/1 2490/2498/1 2491/2499/1 2492/2500/1 +f 2493/2501/1 2494/2502/1 2495/2503/1 2496/2504/1 +f 2497/2505/1 2498/2506/1 2499/2507/1 2500/2508/1 +f 2501/2509/1 2502/2510/1 2503/2511/1 2504/2512/1 +f 2505/2513/1 2506/2514/1 2507/2515/1 2508/2516/1 +f 2509/2517/1 2510/2518/1 2511/2519/1 2512/2520/1 +f 2513/2521/1 2514/2522/1 2515/2523/1 2516/2524/1 +f 2517/2525/1 2518/2526/1 2519/2527/1 2520/2528/1 +f 2521/2529/1 2522/2530/1 2523/2531/1 2524/2532/1 +f 2525/2533/1 2526/2534/1 2527/2535/1 2528/2536/1 +f 2529/2537/1 2530/2538/1 2531/2539/1 2532/2540/1 +f 2533/2541/1 2534/2542/1 2535/2543/1 2536/2544/1 +f 2537/2545/1 2538/2546/1 2539/2547/1 2540/2548/1 +f 2541/2549/1 2542/2550/1 2543/2551/1 2544/2552/1 +f 2545/2553/1 2546/2554/1 2547/2555/1 2548/2556/1 +f 2549/2557/1 2550/2558/1 2551/2559/1 2552/2560/1 +f 2553/2561/1 2554/2562/1 2555/2563/1 2556/2564/1 +f 2557/2565/1 2558/2566/1 2559/2567/1 2560/2568/1 +f 2561/2569/1 2562/2570/1 2563/2571/1 2564/2572/1 +f 2565/2573/1 2566/2574/1 2567/2575/1 2568/2576/1 +f 2569/2577/1 2570/2578/1 2571/2579/1 2572/2580/1 +f 2573/2581/1 2574/2582/1 2575/2583/1 2576/2584/1 +f 2577/2585/1 2578/2586/1 2579/2587/1 2580/2588/1 +f 2581/2589/1 2582/2590/1 2583/2591/1 2584/2592/1 +f 2585/2593/1 2586/2594/1 2587/2595/1 2588/2596/1 +f 2589/2597/1 2590/2598/1 2591/2599/1 2592/2600/1 +f 2593/2601/1 2594/2602/1 2595/2603/1 2596/2604/1 +f 2597/2605/1 2598/2606/1 2599/2607/1 2600/2608/1 +f 2601/2609/1 2602/2610/1 2603/2611/1 2604/2612/1 +f 2605/2613/1 2606/2614/1 2607/2615/1 2608/2616/1 +f 2609/2617/1 2610/2618/1 2611/2619/1 2612/2620/1 +f 2613/2621/1 2614/2622/1 2615/2623/1 2616/2624/1 +f 2617/2625/1 2618/2626/1 2619/2627/1 2620/2628/1 +f 2621/2629/1 2622/2630/1 2623/2631/1 2624/2632/1 +f 2625/2633/1 2626/2634/1 2627/2635/1 2628/2636/1 +f 2629/2637/1 2630/2638/1 2631/2639/1 2632/2640/1 +f 2633/2641/1 2634/2642/1 2635/2643/1 2636/2644/1 +f 2637/2645/1 2638/2646/1 2639/2647/1 2640/2648/1 +f 2641/2649/1 2642/2650/1 2643/2651/1 2644/2652/1 +f 2645/2653/1 2646/2654/1 2647/2655/1 2648/2656/1 +f 2649/2657/1 2650/2658/1 2651/2659/1 2652/2660/1 +f 2653/2661/1 2654/2662/1 2655/2663/1 2656/2664/1 +f 2657/2665/1 2658/2666/1 2659/2667/1 2660/2668/1 +f 2661/2669/1 2662/2670/1 2663/2671/1 2664/2672/1 +f 2665/2673/1 2666/2674/1 2667/2675/1 2668/2676/1 +f 2669/2677/1 2670/2678/1 2671/2679/1 2672/2680/1 +f 2673/2681/1 2674/2682/1 2675/2683/1 2676/2684/1 +f 2677/2685/1 2678/2686/1 2679/2687/1 2680/2688/1 +f 2681/2689/1 2682/2690/1 2683/2691/1 2684/2692/1 +f 2685/2693/1 2686/2694/1 2687/2695/1 2688/2696/1 +f 2689/2697/1 2690/2698/1 2691/2699/1 2692/2700/1 +f 2693/2701/1 2694/2702/1 2695/2703/1 2696/2704/1 +f 2697/2705/1 2698/2706/1 2699/2707/1 2700/2708/1 +f 2701/2709/1 2702/2710/1 2703/2711/1 2704/2712/1 +f 2705/2713/1 2706/2714/1 2707/2715/1 2708/2716/1 +f 2709/2717/1 2710/2718/1 2711/2719/1 2712/2720/1 +f 2713/2721/1 2714/2722/1 2715/2723/1 2716/2724/1 +f 2717/2725/1 2718/2726/1 2719/2727/1 2720/2728/1 +f 2721/2729/1 2722/2730/1 2723/2731/1 2724/2732/1 +f 2725/2733/1 2726/2734/1 2727/2735/1 2728/2736/1 +f 2729/2737/1 2730/2738/1 2731/2739/1 2732/2740/1 +f 2733/2741/1 2734/2742/1 2735/2743/1 2736/2744/1 +f 2737/2745/1 2738/2746/1 2739/2747/1 2740/2748/1 +f 2741/2749/1 2742/2750/1 2743/2751/1 2744/2752/1 +f 2745/2753/1 2746/2754/1 2747/2755/1 2748/2756/1 +f 2749/2757/1 2750/2758/1 2751/2759/1 2752/2760/1 +f 2753/2761/1 2754/2762/1 2755/2763/1 2756/2764/1 +f 2757/2765/1 2758/2766/1 2759/2767/1 2760/2768/1 +f 2761/2769/1 2762/2770/1 2763/2771/1 2764/2772/1 +f 2765/2773/1 2766/2774/1 2767/2775/1 2768/2776/1 +f 2769/2777/1 2770/2778/1 2771/2779/1 2772/2780/1 +f 2773/2781/1 2774/2782/1 2775/2783/1 2776/2784/1 +f 2777/2785/1 2778/2786/1 2779/2787/1 2780/2788/1 +f 2781/2789/1 2782/2790/1 2783/2791/1 2784/2792/1 +f 2785/2793/1 2786/2794/1 2787/2795/1 2788/2796/1 +f 2789/2797/1 2790/2798/1 2791/2799/1 2792/2800/1 +f 2793/2801/1 2794/2802/1 2795/2803/1 2796/2804/1 +f 2797/2805/1 2798/2806/1 2799/2807/1 2800/2808/1 +f 2801/2809/1 2802/2810/1 2803/2811/1 2804/2812/1 +f 2805/2813/1 2806/2814/1 2807/2815/1 2808/2816/1 +f 2809/2817/1 2810/2818/1 2811/2819/1 2812/2820/1 +f 2813/2821/1 2814/2822/1 2815/2823/1 2816/2824/1 +f 2817/2825/1 2818/2826/1 2819/2827/1 2820/2828/1 +f 2821/2829/1 2822/2830/1 2823/2831/1 2824/2832/1 +f 2825/2833/1 2826/2834/1 2827/2835/1 2828/2836/1 +f 2829/2837/1 2830/2838/1 2831/2839/1 2832/2840/1 +f 2833/2841/1 2834/2842/1 2835/2843/1 2836/2844/1 +f 2837/2845/1 2838/2846/1 2839/2847/1 2840/2848/1 +f 2841/2849/1 2842/2850/1 2843/2851/1 2844/2852/1 +f 2845/2853/1 2846/2854/1 2847/2855/1 2848/2856/1 +f 2849/2857/1 2850/2858/1 2851/2859/1 2852/2860/1 +f 2853/2861/1 2854/2862/1 2855/2863/1 2856/2864/1 +f 2857/2865/1 2858/2866/1 2859/2867/1 2860/2868/1 +f 2861/2869/1 2862/2870/1 2863/2871/1 2864/2872/1 +f 2865/2873/1 2866/2874/1 2867/2875/1 2868/2876/1 +f 2869/2877/1 2870/2878/1 2871/2879/1 2872/2880/1 +f 2873/2881/1 2874/2882/1 2875/2883/1 2876/2884/1 +f 2877/2885/1 2878/2886/1 2879/2887/1 2880/2888/1 +f 2881/2889/1 2882/2890/1 2883/2891/1 2884/2892/1 +f 2885/2893/1 2886/2894/1 2887/2895/1 2888/2896/1 +f 2889/2897/1 2890/2898/1 2891/2899/1 2892/2900/1 +f 2893/2901/1 2894/2902/1 2895/2903/1 2896/2904/1 +f 2897/2905/1 2898/2906/1 2899/2907/1 2900/2908/1 +f 2901/2909/1 2902/2910/1 2903/2911/1 2904/2912/1 +f 2905/2913/1 2906/2914/1 2907/2915/1 2908/2916/1 +f 2909/2917/1 2910/2918/1 2911/2919/1 2912/2920/1 +f 2913/2921/1 2914/2922/1 2915/2923/1 2916/2924/1 +f 2917/2925/1 2918/2926/1 2919/2927/1 2920/2928/1 +f 2921/2929/1 2922/2930/1 2923/2931/1 2924/2932/1 +f 2925/2933/1 2926/2934/1 2927/2935/1 2928/2936/1 +f 2929/2937/1 2930/2938/1 2931/2939/1 2932/2940/1 +f 2933/2941/1 2934/2942/1 2935/2943/1 2936/2944/1 +f 2937/2945/1 2938/2946/1 2939/2947/1 2940/2948/1 +f 2941/2949/1 2942/2950/1 2943/2951/1 2944/2952/1 +f 2945/2953/1 2946/2954/1 2947/2955/1 2948/2956/1 +f 2949/2957/1 2950/2958/1 2951/2959/1 2952/2960/1 +f 2953/2961/1 2954/2962/1 2955/2963/1 2956/2964/1 +f 2957/2965/1 2958/2966/1 2959/2967/1 2960/2968/1 +f 2961/2969/1 2962/2970/1 2963/2971/1 2964/2972/1 +f 2965/2973/1 2966/2974/1 2967/2975/1 2968/2976/1 +f 2969/2977/1 2970/2978/1 2971/2979/1 2972/2980/1 +f 2973/2981/1 2974/2982/1 2975/2983/1 2976/2984/1 +f 2977/2985/1 2978/2986/1 2979/2987/1 2980/2988/1 +f 2981/2989/1 2982/2990/1 2983/2991/1 2984/2992/1 +f 2985/2993/1 2986/2994/1 2987/2995/1 2988/2996/1 +f 2989/2997/1 2990/2998/1 2991/2999/1 2992/3000/1 +f 2993/3001/1 2994/3002/1 2995/3003/1 2996/3004/1 +f 2997/3005/1 2998/3006/1 2999/3007/1 3000/3008/1 +f 3001/3009/1 3002/3010/1 3003/3011/1 3004/3012/1 +f 3005/3013/1 3006/3014/1 3007/3015/1 3008/3016/1 +f 3009/3017/1 3010/3018/1 3011/3019/1 3012/3020/1 +f 3013/3021/1 3014/3022/1 3015/3023/1 3016/3024/1 +f 3017/3025/1 3018/3026/1 3019/3027/1 3020/3028/1 +f 3021/3029/1 3022/3030/1 3023/3031/1 3024/3032/1 +f 3025/3033/1 3026/3034/1 3027/3035/1 3028/3036/1 +f 3029/3037/1 3030/3038/1 3031/3039/1 3032/3040/1 +f 3033/3041/1 3034/3042/1 3035/3043/1 3036/3044/1 +f 3037/3045/1 3038/3046/1 3039/3047/1 3040/3048/1 +f 3041/3049/1 3042/3050/1 3043/3051/1 3044/3052/1 +f 3045/3053/1 3046/3054/1 3047/3055/1 3048/3056/1 +f 3049/3057/1 3050/3058/1 3051/3059/1 3052/3060/1 +f 3053/3061/1 3054/3062/1 3055/3063/1 3056/3064/1 +f 3057/3065/1 3058/3066/1 3059/3067/1 3060/3068/1 +f 3061/3069/1 3062/3070/1 3063/3071/1 3064/3072/1 +f 3065/3073/1 3066/3074/1 3067/3075/1 3068/3076/1 +f 3069/3077/1 3070/3078/1 3071/3079/1 3072/3080/1 +f 3073/3081/1 3074/3082/1 3075/3083/1 3076/3084/1 +f 3077/3085/1 3078/3086/1 3079/3087/1 3080/3088/1 +f 3081/3089/1 3082/3090/1 3083/3091/1 3084/3092/1 +f 3085/3093/1 3086/3094/1 3087/3095/1 3088/3096/1 +f 3089/3097/1 3090/3098/1 3091/3099/1 3092/3100/1 +f 3093/3101/1 3094/3102/1 3095/3103/1 3096/3104/1 +f 3097/3105/1 3098/3106/1 3099/3107/1 3100/3108/1 +f 3101/3109/1 3102/3110/1 3103/3111/1 3104/3112/1 +f 3105/3113/1 3106/3114/1 3107/3115/1 3108/3116/1 +f 3109/3117/1 3110/3118/1 3111/3119/1 3112/3120/1 +f 3113/3121/1 3114/3122/1 3115/3123/1 3116/3124/1 +f 3117/3125/1 3118/3126/1 3119/3127/1 3120/3128/1 +f 3121/3129/1 3122/3130/1 3123/3131/1 3124/3132/1 +f 3125/3133/1 3126/3134/1 3127/3135/1 3128/3136/1 +f 3129/3137/1 3130/3138/1 3131/3139/1 3132/3140/1 +f 3133/3141/1 3134/3142/1 3135/3143/1 3136/3144/1 +f 3137/3145/1 3138/3146/1 3139/3147/1 3140/3148/1 +f 3141/3149/1 3142/3150/1 3143/3151/1 3144/3152/1 +f 3145/3153/1 3146/3154/1 3147/3155/1 3148/3156/1 +f 3149/3157/1 3150/3158/1 3151/3159/1 3152/3160/1 +f 3153/3161/1 3154/3162/1 3155/3163/1 3156/3164/1 +f 3157/3165/1 3158/3166/1 3159/3167/1 3160/3168/1 +f 3161/3169/1 3162/3170/1 3163/3171/1 3164/3172/1 +f 3165/3173/1 3166/3174/1 3167/3175/1 3168/3176/1 +f 3169/3177/1 3170/3178/1 3171/3179/1 3172/3180/1 +f 3173/3181/1 3174/3182/1 3175/3183/1 3176/3184/1 +f 3177/3185/1 3178/3186/1 3179/3187/1 3180/3188/1 +f 3181/3189/1 3182/3190/1 3183/3191/1 3184/3192/1 +f 3185/3193/1 3186/3194/1 3187/3195/1 3188/3196/1 +f 3189/3197/1 3190/3198/1 3191/3199/1 3192/3200/1 +f 3193/3201/1 3194/3202/1 3195/3203/1 3196/3204/1 +f 3197/3205/1 3198/3206/1 3199/3207/1 3200/3208/1 +f 3201/3209/1 3202/3210/1 3203/3211/1 3204/3212/1 +f 3205/3213/1 3206/3214/1 3207/3215/1 3208/3216/1 +f 3209/3217/1 3210/3218/1 3211/3219/1 3212/3220/1 +f 3213/3221/1 3214/3222/1 3215/3223/1 3216/3224/1 +f 3217/3225/1 3218/3226/1 3219/3227/1 3220/3228/1 +f 3221/3229/1 3222/3230/1 3223/3231/1 3224/3232/1 +f 3225/3233/1 3226/3234/1 3227/3235/1 3228/3236/1 +f 3229/3237/1 3230/3238/1 3231/3239/1 3232/3240/1 +f 3233/3241/1 3234/3242/1 3235/3243/1 3236/3244/1 +f 3237/3245/1 3238/3246/1 3239/3247/1 3240/3248/1 +f 3241/3249/1 3242/3250/1 3243/3251/1 3244/3252/1 +f 3245/3253/1 3246/3254/1 3247/3255/1 3248/3256/1 +f 3249/3257/1 3250/3258/1 3251/3259/1 3252/3260/1 +f 3253/3261/1 3254/3262/1 3255/3263/1 3256/3264/1 +f 3257/3265/1 3258/3266/1 3259/3267/1 3260/3268/1 +f 3261/3269/1 3262/3270/1 3263/3271/1 3264/3272/1 +f 3265/3273/1 3266/3274/1 3267/3275/1 3268/3276/1 +f 3269/3277/1 3270/3278/1 3271/3279/1 3272/3280/1 +f 3273/3281/1 3274/3282/1 3275/3283/1 3276/3284/1 +f 3277/3285/1 3278/3286/1 3279/3287/1 3280/3288/1 +f 3281/3289/1 3282/3290/1 3283/3291/1 3284/3292/1 +f 3285/3293/1 3286/3294/1 3287/3295/1 3288/3296/1 +f 3289/3297/1 3290/3298/1 3291/3299/1 3292/3300/1 +f 3293/3301/1 3294/3302/1 3295/3303/1 3296/3304/1 +f 3297/3305/1 3298/3306/1 3299/3307/1 3300/3308/1 +f 3301/3309/1 3302/3310/1 3303/3311/1 3304/3312/1 +f 3305/3313/1 3306/3314/1 3307/3315/1 3308/3316/1 +f 3309/3317/1 3310/3318/1 3311/3319/1 3312/3320/1 +f 3313/3321/1 3314/3322/1 3315/3323/1 3316/3324/1 +f 3317/3325/1 3318/3326/1 3319/3327/1 3320/3328/1 +f 3321/3329/1 3322/3330/1 3323/3331/1 3324/3332/1 +f 3325/3333/1 3326/3334/1 3327/3335/1 3328/3336/1 +f 3329/3337/1 3330/3338/1 3331/3339/1 3332/3340/1 +f 3333/3341/1 3334/3342/1 3335/3343/1 3336/3344/1 +f 3337/3345/1 3338/3346/1 3339/3347/1 3340/3348/1 +f 3341/3349/1 3342/3350/1 3343/3351/1 3344/3352/1 +f 3345/3353/1 3346/3354/1 3347/3355/1 3348/3356/1 +f 3349/3357/1 3350/3358/1 3351/3359/1 3352/3360/1 +f 3353/3361/1 3354/3362/1 3355/3363/1 3356/3364/1 +f 3357/3365/1 3358/3366/1 3359/3367/1 3360/3368/1 +f 3361/3369/1 3362/3370/1 3363/3371/1 3364/3372/1 +f 3365/3373/1 3366/3374/1 3367/3375/1 3368/3376/1 +f 3369/3377/1 3370/3378/1 3371/3379/1 3372/3380/1 +f 3373/3381/1 3374/3382/1 3375/3383/1 3376/3384/1 +f 3377/3385/1 3378/3386/1 3379/3387/1 3380/3388/1 +f 3381/3389/1 3382/3390/1 3383/3391/1 3384/3392/1 +f 3385/3393/1 3386/3394/1 3387/3395/1 3388/3396/1 +f 3389/3397/1 3390/3398/1 3391/3399/1 3392/3400/1 +f 3393/3401/1 3394/3402/1 3395/3403/1 3396/3404/1 +f 3397/3405/1 3398/3406/1 3399/3407/1 3400/3408/1 +f 3401/3409/1 3402/3410/1 3403/3411/1 3404/3412/1 +f 3405/3413/1 3406/3414/1 3407/3415/1 3408/3416/1 +f 3409/3417/1 3410/3418/1 3411/3419/1 3412/3420/1 +f 3413/3421/1 3414/3422/1 3415/3423/1 3416/3424/1 +f 3417/3425/1 3418/3426/1 3419/3427/1 3420/3428/1 +f 3421/3429/1 3422/3430/1 3423/3431/1 3424/3432/1 +f 3425/3433/1 3426/3434/1 3427/3435/1 3428/3436/1 +f 3429/3437/1 3430/3438/1 3431/3439/1 3432/3440/1 +f 3433/3441/1 3434/3442/1 3435/3443/1 3436/3444/1 +f 3437/3445/1 3438/3446/1 3439/3447/1 3440/3448/1 +f 3441/3449/1 3442/3450/1 3443/3451/1 3444/3452/1 +f 3445/3453/1 3446/3454/1 3447/3455/1 3448/3456/1 +f 3449/3457/1 3450/3458/1 3451/3459/1 3452/3460/1 +f 3453/3461/1 3454/3462/1 3455/3463/1 3456/3464/1 +f 3457/3465/1 3458/3466/1 3459/3467/1 3460/3468/1 +f 3461/3469/1 3462/3470/1 3463/3471/1 3464/3472/1 +f 3465/3473/1 3466/3474/1 3467/3475/1 3468/3476/1 +f 3469/3477/1 3470/3478/1 3471/3479/1 3472/3480/1 +f 3473/3481/1 3474/3482/1 3475/3483/1 3476/3484/1 +f 3477/3485/1 3478/3486/1 3479/3487/1 3480/3488/1 +f 3481/3489/1 3482/3490/1 3483/3491/1 3484/3492/1 +f 3485/3493/1 3486/3494/1 3487/3495/1 3488/3496/1 +f 3489/3497/1 3490/3498/1 3491/3499/1 3492/3500/1 +f 3493/3501/1 3494/3502/1 3495/3503/1 3496/3504/1 +f 3497/3505/1 3498/3506/1 3499/3507/1 3500/3508/1 +f 3501/3509/1 3502/3510/1 3503/3511/1 3504/3512/1 +f 3505/3513/1 3506/3514/1 3507/3515/1 3508/3516/1 +f 3509/3517/1 3510/3518/1 3511/3519/1 3512/3520/1 +f 3513/3521/1 3514/3522/1 3515/3523/1 3516/3524/1 +f 3517/3525/1 3518/3526/1 3519/3527/1 3520/3528/1 +f 3521/3529/1 3522/3530/1 3523/3531/1 3524/3532/1 +f 3525/3533/1 3526/3534/1 3527/3535/1 3528/3536/1 +f 3529/3537/1 3530/3538/1 3531/3539/1 3532/3540/1 +f 3533/3541/1 3534/3542/1 3535/3543/1 3536/3544/1 +f 3537/3545/1 3538/3546/1 3539/3547/1 3540/3548/1 +f 3541/3549/1 3542/3550/1 3543/3551/1 3544/3552/1 +f 3545/3553/1 3546/3554/1 3547/3555/1 3548/3556/1 +f 3549/3557/1 3550/3558/1 3551/3559/1 3552/3560/1 +f 3553/3561/1 3554/3562/1 3555/3563/1 3556/3564/1 +f 3557/3565/1 3558/3566/1 3559/3567/1 3560/3568/1 +f 3561/3569/1 3562/3570/1 3563/3571/1 3564/3572/1 +f 3565/3573/1 3566/3574/1 3567/3575/1 3568/3576/1 +f 3569/3577/1 3570/3578/1 3571/3579/1 3572/3580/1 +f 3573/3581/1 3574/3582/1 3575/3583/1 3576/3584/1 +f 3577/3585/1 3578/3586/1 3579/3587/1 3580/3588/1 +f 3581/3589/1 3582/3590/1 3583/3591/1 3584/3592/1 +f 3585/3593/1 3586/3594/1 3587/3595/1 3588/3596/1 +f 3589/3597/1 3590/3598/1 3591/3599/1 3592/3600/1 +f 3593/3601/1 3594/3602/1 3595/3603/1 3596/3604/1 +f 3597/3605/1 3598/3606/1 3599/3607/1 3600/3608/1 +f 3601/3609/1 3602/3610/1 3603/3611/1 3604/3612/1 +f 3605/3613/1 3606/3614/1 3607/3615/1 3608/3616/1 +f 3609/3617/1 3610/3618/1 3611/3619/1 3612/3620/1 +f 3613/3621/1 3614/3622/1 3615/3623/1 3616/3624/1 +f 3617/3625/1 3618/3626/1 3619/3627/1 3620/3628/1 +f 3621/3629/1 3622/3630/1 3623/3631/1 3624/3632/1 +f 3625/3633/1 3626/3634/1 3627/3635/1 3628/3636/1 +f 3629/3637/1 3630/3638/1 3631/3639/1 3632/3640/1 +f 3633/3641/1 3634/3642/1 3635/3643/1 3636/3644/1 +f 3637/3645/1 3638/3646/1 3639/3647/1 3640/3648/1 +f 3641/3649/1 3642/3650/1 3643/3651/1 3644/3652/1 +f 3645/3653/1 3646/3654/1 3647/3655/1 3648/3656/1 +f 3649/3657/1 3650/3658/1 3651/3659/1 3652/3660/1 +f 3653/3661/1 3654/3662/1 3655/3663/1 3656/3664/1 +f 3657/3665/1 3658/3666/1 3659/3667/1 3660/3668/1 +f 3661/3669/1 3662/3670/1 3663/3671/1 3664/3672/1 +f 3665/3673/1 3666/3674/1 3667/3675/1 3668/3676/1 +f 3669/3677/1 3670/3678/1 3671/3679/1 3672/3680/1 +f 3673/3681/1 3674/3682/1 3675/3683/1 3676/3684/1 +f 3677/3685/1 3678/3686/1 3679/3687/1 3680/3688/1 +f 3681/3689/1 3682/3690/1 3683/3691/1 3684/3692/1 +f 3685/3693/1 3686/3694/1 3687/3695/1 3688/3696/1 +f 3689/3697/1 3690/3698/1 3691/3699/1 3692/3700/1 +f 3693/3701/1 3694/3702/1 3695/3703/1 3696/3704/1 +f 3697/3705/1 3698/3706/1 3699/3707/1 3700/3708/1 +f 3701/3709/1 3702/3710/1 3703/3711/1 3704/3712/1 +f 3705/3713/1 3706/3714/1 3707/3715/1 3708/3716/1 +f 3709/3717/1 3710/3718/1 3711/3719/1 3712/3720/1 +f 3713/3721/1 3714/3722/1 3715/3723/1 3716/3724/1 +f 3717/3725/1 3718/3726/1 3719/3727/1 3720/3728/1 +f 3721/3729/1 3722/3730/1 3723/3731/1 3724/3732/1 +f 3725/3733/1 3726/3734/1 3727/3735/1 3728/3736/1 +f 3729/3737/1 3730/3738/1 3731/3739/1 3732/3740/1 +f 3733/3741/1 3734/3742/1 3735/3743/1 3736/3744/1 +f 3737/3745/1 3738/3746/1 3739/3747/1 3740/3748/1 +f 3741/3749/1 3742/3750/1 3743/3751/1 3744/3752/1 +f 3745/3753/1 3746/3754/1 3747/3755/1 3748/3756/1 +f 3749/3757/1 3750/3758/1 3751/3759/1 3752/3760/1 +f 3753/3761/1 3754/3762/1 3755/3763/1 3756/3764/1 +f 3757/3765/1 3758/3766/1 3759/3767/1 3760/3768/1 +f 3761/3769/1 3762/3770/1 3763/3771/1 3764/3772/1 +f 3765/3773/1 3766/3774/1 3767/3775/1 3768/3776/1 +f 3769/3777/1 3770/3778/1 3771/3779/1 3772/3780/1 +f 3773/3781/1 3774/3782/1 3775/3783/1 3776/3784/1 +f 3777/3785/1 3778/3786/1 3779/3787/1 3780/3788/1 +f 3781/3789/1 3782/3790/1 3783/3791/1 3784/3792/1 +f 3785/3793/1 3786/3794/1 3787/3795/1 3788/3796/1 +f 3789/3797/1 3790/3798/1 3791/3799/1 3792/3800/1 +f 3793/3801/1 3794/3802/1 3795/3803/1 3796/3804/1 +f 3797/3805/1 3798/3806/1 3799/3807/1 3800/3808/1 +f 3801/3809/1 3802/3810/1 3803/3811/1 3804/3812/1 +f 3805/3813/1 3806/3814/1 3807/3815/1 3808/3816/1 +f 3809/3817/1 3810/3818/1 3811/3819/1 3812/3820/1 +f 3813/3821/1 3814/3822/1 3815/3823/1 3816/3824/1 +f 3817/3825/1 3818/3826/1 3819/3827/1 3820/3828/1 +f 3821/3829/1 3822/3830/1 3823/3831/1 3824/3832/1 +f 3825/3833/1 3826/3834/1 3827/3835/1 3828/3836/1 +f 3829/3837/1 3830/3838/1 3831/3839/1 3832/3840/1 +f 3833/3841/1 3834/3842/1 3835/3843/1 3836/3844/1 +f 3837/3845/1 3838/3846/1 3839/3847/1 3840/3848/1 +f 3841/3849/1 3842/3850/1 3843/3851/1 3844/3852/1 +f 3845/3853/1 3846/3854/1 3847/3855/1 3848/3856/1 +f 3849/3857/1 3850/3858/1 3851/3859/1 3852/3860/1 +f 3853/3861/1 3854/3862/1 3855/3863/1 3856/3864/1 +f 3857/3865/1 3858/3866/1 3859/3867/1 3860/3868/1 +f 3861/3869/1 3862/3870/1 3863/3871/1 3864/3872/1 +f 3865/3873/1 3866/3874/1 3867/3875/1 3868/3876/1 +f 3869/3877/1 3870/3878/1 3871/3879/1 3872/3880/1 +f 3873/3881/1 3874/3882/1 3875/3883/1 3876/3884/1 +f 3877/3885/1 3878/3886/1 3879/3887/1 3880/3888/1 +f 3881/3889/1 3882/3890/1 3883/3891/1 3884/3892/1 +f 3885/3893/1 3886/3894/1 3887/3895/1 3888/3896/1 +f 3889/3897/1 3890/3898/1 3891/3899/1 3892/3900/1 +f 3893/3901/1 3894/3902/1 3895/3903/1 3896/3904/1 +f 3897/3905/1 3898/3906/1 3899/3907/1 3900/3908/1 +f 3901/3909/1 3902/3910/1 3903/3911/1 3904/3912/1 +f 3905/3913/1 3906/3914/1 3907/3915/1 3908/3916/1 +f 3909/3917/1 3910/3918/1 3911/3919/1 3912/3920/1 +f 3913/3921/1 3914/3922/1 3915/3923/1 3916/3924/1 +f 3917/3925/1 3918/3926/1 3919/3927/1 3920/3928/1 +f 3921/3929/1 3922/3930/1 3923/3931/1 3924/3932/1 +f 3925/3933/1 3926/3934/1 3927/3935/1 3928/3936/1 +f 3929/3937/1 3930/3938/1 3931/3939/1 3932/3940/1 +f 3933/3941/1 3934/3942/1 3935/3943/1 3936/3944/1 +f 3937/3945/1 3938/3946/1 3939/3947/1 3940/3948/1 +f 3941/3949/1 3942/3950/1 3943/3951/1 3944/3952/1 +f 3945/3953/1 3946/3954/1 3947/3955/1 3948/3956/1 +f 3949/3957/1 3950/3958/1 3951/3959/1 3952/3960/1 +f 3953/3961/1 3954/3962/1 3955/3963/1 3956/3964/1 +f 3957/3965/1 3958/3966/1 3959/3967/1 3960/3968/1 +f 3961/3969/1 3962/3970/1 3963/3971/1 3964/3972/1 +f 3965/3973/1 3966/3974/1 3967/3975/1 3968/3976/1 +f 3969/3977/1 3970/3978/1 3971/3979/1 3972/3980/1 +f 3973/3981/1 3974/3982/1 3975/3983/1 3976/3984/1 +f 3977/3985/1 3978/3986/1 3979/3987/1 3980/3988/1 +f 3981/3989/1 3982/3990/1 3983/3991/1 3984/3992/1 +f 3985/3993/1 3986/3994/1 3987/3995/1 3988/3996/1 +f 3989/3997/1 3990/3998/1 3991/3999/1 3992/4000/1 +f 3993/4001/1 3994/4002/1 3995/4003/1 3996/4004/1 +f 3997/4005/1 3998/4006/1 3999/4007/1 4000/4008/1 +f 4001/4009/1 4002/4010/1 4003/4011/1 4004/4012/1 +f 4005/4013/1 4006/4014/1 4007/4015/1 4008/4016/1 +f 4009/4017/1 4010/4018/1 4011/4019/1 4012/4020/1 +f 4013/4021/1 4014/4022/1 4015/4023/1 4016/4024/1 +f 4017/4025/1 4018/4026/1 4019/4027/1 4020/4028/1 +f 4021/4029/1 4022/4030/1 4023/4031/1 4024/4032/1 +f 4025/4033/1 4026/4034/1 4027/4035/1 4028/4036/1 +f 4029/4037/1 4030/4038/1 4031/4039/1 4032/4040/1 +f 4033/4041/1 4034/4042/1 4035/4043/1 4036/4044/1 +f 4037/4045/1 4038/4046/1 4039/4047/1 4040/4048/1 +f 4041/4049/1 4042/4050/1 4043/4051/1 4044/4052/1 +f 4045/4053/1 4046/4054/1 4047/4055/1 4048/4056/1 +f 4049/4057/1 4050/4058/1 4051/4059/1 4052/4060/1 +f 4053/4061/1 4054/4062/1 4055/4063/1 4056/4064/1 +f 4057/4065/1 4058/4066/1 4059/4067/1 4060/4068/1 +f 4061/4069/1 4062/4070/1 4063/4071/1 4064/4072/1 +f 4065/4073/1 4066/4074/1 4067/4075/1 4068/4076/1 +f 4069/4077/1 4070/4078/1 4071/4079/1 4072/4080/1 +f 4073/4081/1 4074/4082/1 4075/4083/1 4076/4084/1 +f 4077/4085/1 4078/4086/1 4079/4087/1 4080/4088/1 +f 4081/4089/1 4082/4090/1 4083/4091/1 4084/4092/1 +f 4085/4093/1 4086/4094/1 4087/4095/1 4088/4096/1 +f 4089/4097/1 4090/4098/1 4091/4099/1 4092/4100/1 +f 4093/4101/1 4094/4102/1 4095/4103/1 4096/4104/1 +f 4097/4105/1 4098/4106/1 4099/4107/1 4100/4108/1 +f 4101/4109/1 4102/4110/1 4103/4111/1 4104/4112/1 +f 4105/4113/1 4106/4114/1 4107/4115/1 4108/4116/1 +f 4109/4117/1 4110/4118/1 4111/4119/1 4112/4120/1 +f 4113/4121/1 4114/4122/1 4115/4123/1 4116/4124/1 +f 4117/4125/1 4118/4126/1 4119/4127/1 4120/4128/1 +f 4121/4129/1 4122/4130/1 4123/4131/1 4124/4132/1 +f 4125/4133/1 4126/4134/1 4127/4135/1 4128/4136/1 +f 4129/4137/1 4130/4138/1 4131/4139/1 4132/4140/1 +f 4133/4141/1 4134/4142/1 4135/4143/1 4136/4144/1 +f 4137/4145/1 4138/4146/1 4139/4147/1 4140/4148/1 +f 4141/4149/1 4142/4150/1 4143/4151/1 4144/4152/1 +f 4145/4153/1 4146/4154/1 4147/4155/1 4148/4156/1 +f 4149/4157/1 4150/4158/1 4151/4159/1 4152/4160/1 +f 4153/4161/1 4154/4162/1 4155/4163/1 4156/4164/1 +f 4157/4165/1 4158/4166/1 4159/4167/1 4160/4168/1 +f 4161/4169/1 4162/4170/1 4163/4171/1 4164/4172/1 +f 4165/4173/1 4166/4174/1 4167/4175/1 4168/4176/1 +f 4169/4177/1 4170/4178/1 4171/4179/1 4172/4180/1 +f 4173/4181/1 4174/4182/1 4175/4183/1 4176/4184/1 +f 4177/4185/1 4178/4186/1 4179/4187/1 4180/4188/1 +f 4181/4189/1 4182/4190/1 4183/4191/1 4184/4192/1 +f 4185/4193/1 4186/4194/1 4187/4195/1 4188/4196/1 +f 4189/4197/1 4190/4198/1 4191/4199/1 4192/4200/1 +f 4193/4201/1 4194/4202/1 4195/4203/1 4196/4204/1 +f 4197/4205/1 4198/4206/1 4199/4207/1 4200/4208/1 +f 4201/4209/1 4202/4210/1 4203/4211/1 4204/4212/1 +f 4205/4213/1 4206/4214/1 4207/4215/1 4208/4216/1 +f 4209/4217/1 4210/4218/1 4211/4219/1 4212/4220/1 +f 4213/4221/1 4214/4222/1 4215/4223/1 4216/4224/1 +f 4217/4225/1 4218/4226/1 4219/4227/1 4220/4228/1 +f 4221/4229/1 4222/4230/1 4223/4231/1 4224/4232/1 +f 4225/4233/1 4226/4234/1 4227/4235/1 4228/4236/1 +f 4229/4237/1 4230/4238/1 4231/4239/1 4232/4240/1 +f 4233/4241/1 4234/4242/1 4235/4243/1 4236/4244/1 +f 4237/4245/1 4238/4246/1 4239/4247/1 4240/4248/1 +f 4241/4249/1 4242/4250/1 4243/4251/1 4244/4252/1 +f 4245/4253/1 4246/4254/1 4247/4255/1 4248/4256/1 +f 4249/4257/1 4250/4258/1 4251/4259/1 4252/4260/1 +f 4253/4261/1 4254/4262/1 4255/4263/1 4256/4264/1 +f 4257/4265/1 4258/4266/1 4259/4267/1 4260/4268/1 +f 4261/4269/1 4262/4270/1 4263/4271/1 4264/4272/1 +f 4265/4273/1 4266/4274/1 4267/4275/1 4268/4276/1 +f 4269/4277/1 4270/4278/1 4271/4279/1 4272/4280/1 +f 4273/4281/1 4274/4282/1 4275/4283/1 4276/4284/1 +f 4277/4285/1 4278/4286/1 4279/4287/1 4280/4288/1 +f 4281/4289/1 4282/4290/1 4283/4291/1 4284/4292/1 +f 4285/4293/1 4286/4294/1 4287/4295/1 4288/4296/1 +f 4289/4297/1 4290/4298/1 4291/4299/1 4292/4300/1 +f 4293/4301/1 4294/4302/1 4295/4303/1 4296/4304/1 +f 4297/4305/1 4298/4306/1 4299/4307/1 4300/4308/1 +f 4301/4309/1 4302/4310/1 4303/4311/1 4304/4312/1 +f 4305/4313/1 4306/4314/1 4307/4315/1 4308/4316/1 +f 4309/4317/1 4310/4318/1 4311/4319/1 4312/4320/1 +f 4313/4321/1 4314/4322/1 4315/4323/1 4316/4324/1 +f 4317/4325/1 4318/4326/1 4319/4327/1 4320/4328/1 +f 4321/4329/1 4322/4330/1 4323/4331/1 4324/4332/1 +f 4325/4333/1 4326/4334/1 4327/4335/1 4328/4336/1 +f 4329/4337/1 4330/4338/1 4331/4339/1 4332/4340/1 +f 4333/4341/1 4334/4342/1 4335/4343/1 4336/4344/1 +f 4337/4345/1 4338/4346/1 4339/4347/1 4340/4348/1 +f 4341/4349/1 4342/4350/1 4343/4351/1 4344/4352/1 +f 4345/4353/1 4346/4354/1 4347/4355/1 4348/4356/1 +f 4349/4357/1 4350/4358/1 4351/4359/1 4352/4360/1 +f 4353/4361/1 4354/4362/1 4355/4363/1 4356/4364/1 +f 4357/4365/1 4358/4366/1 4359/4367/1 4360/4368/1 +f 4361/4369/1 4362/4370/1 4363/4371/1 4364/4372/1 +f 4365/4373/1 4366/4374/1 4367/4375/1 4368/4376/1 +f 4369/4377/1 4370/4378/1 4371/4379/1 4372/4380/1 +f 4373/4381/1 4374/4382/1 4375/4383/1 4376/4384/1 +f 4377/4385/1 4378/4386/1 4379/4387/1 4380/4388/1 +f 4381/4389/1 4382/4390/1 4383/4391/1 4384/4392/1 +f 4385/4393/1 4386/4394/1 4387/4395/1 4388/4396/1 +f 4389/4397/1 4390/4398/1 4391/4399/1 4392/4400/1 +f 4393/4401/1 4394/4402/1 4395/4403/1 4396/4404/1 +f 4397/4405/1 4398/4406/1 4399/4407/1 4400/4408/1 +f 4401/4409/1 4402/4410/1 4403/4411/1 4404/4412/1 +f 4405/4413/1 4406/4414/1 4407/4415/1 4408/4416/1 +f 4409/4417/1 4410/4418/1 4411/4419/1 4412/4420/1 +f 4413/4421/1 4414/4422/1 4415/4423/1 4416/4424/1 +f 4417/4425/1 4418/4426/1 4419/4427/1 4420/4428/1 +f 4421/4429/1 4422/4430/1 4423/4431/1 4424/4432/1 +f 4425/4433/1 4426/4434/1 4427/4435/1 4428/4436/1 +f 4429/4437/1 4430/4438/1 4431/4439/1 4432/4440/1 +f 4433/4441/1 4434/4442/1 4435/4443/1 4436/4444/1 +f 4437/4445/1 4438/4446/1 4439/4447/1 4440/4448/1 +f 4441/4449/1 4442/4450/1 4443/4451/1 4444/4452/1 +f 4445/4453/1 4446/4454/1 4447/4455/1 4448/4456/1 +f 4449/4457/1 4450/4458/1 4451/4459/1 4452/4460/1 +f 4453/4461/1 4454/4462/1 4455/4463/1 4456/4464/1 +f 4457/4465/1 4458/4466/1 4459/4467/1 4460/4468/1 +f 4461/4469/1 4462/4470/1 4463/4471/1 4464/4472/1 +f 4465/4473/1 4466/4474/1 4467/4475/1 4468/4476/1 +f 4469/4477/1 4470/4478/1 4471/4479/1 4472/4480/1 +f 4473/4481/1 4474/4482/1 4475/4483/1 4476/4484/1 +f 4477/4485/1 4478/4486/1 4479/4487/1 4480/4488/1 +f 4481/4489/1 4482/4490/1 4483/4491/1 4484/4492/1 +f 4485/4493/1 4486/4494/1 4487/4495/1 4488/4496/1 +f 4489/4497/1 4490/4498/1 4491/4499/1 4492/4500/1 +f 4493/4501/1 4494/4502/1 4495/4503/1 4496/4504/1 +f 4497/4505/1 4498/4506/1 4499/4507/1 4500/4508/1 +f 4501/4509/1 4502/4510/1 4503/4511/1 4504/4512/1 +f 4505/4513/1 4506/4514/1 4507/4515/1 4508/4516/1 +f 4509/4517/1 4510/4518/1 4511/4519/1 4512/4520/1 +f 4513/4521/1 4514/4522/1 4515/4523/1 4516/4524/1 +f 4517/4525/1 4518/4526/1 4519/4527/1 4520/4528/1 +f 4521/4529/1 4522/4530/1 4523/4531/1 4524/4532/1 +f 4525/4533/1 4526/4534/1 4527/4535/1 4528/4536/1 +f 4529/4537/1 4530/4538/1 4531/4539/1 4532/4540/1 +f 4533/4541/1 4534/4542/1 4535/4543/1 4536/4544/1 +f 4537/4545/1 4538/4546/1 4539/4547/1 4540/4548/1 +f 4541/4549/1 4542/4550/1 4543/4551/1 4544/4552/1 +f 4545/4553/1 4546/4554/1 4547/4555/1 4548/4556/1 +f 4549/4557/1 4550/4558/1 4551/4559/1 4552/4560/1 +f 4553/4561/1 4554/4562/1 4555/4563/1 4556/4564/1 +f 4557/4565/1 4558/4566/1 4559/4567/1 4560/4568/1 +f 4561/4569/1 4562/4570/1 4563/4571/1 4564/4572/1 +f 4565/4573/1 4566/4574/1 4567/4575/1 4568/4576/1 +f 4569/4577/1 4570/4578/1 4571/4579/1 4572/4580/1 +f 4573/4581/1 4574/4582/1 4575/4583/1 4576/4584/1 +f 4577/4585/1 4578/4586/1 4579/4587/1 4580/4588/1 +f 4581/4589/1 4582/4590/1 4583/4591/1 4584/4592/1 +f 4585/4593/1 4586/4594/1 4587/4595/1 4588/4596/1 +f 4589/4597/1 4590/4598/1 4591/4599/1 4592/4600/1 +f 4593/4601/1 4594/4602/1 4595/4603/1 4596/4604/1 +f 4597/4605/1 4598/4606/1 4599/4607/1 4600/4608/1 +f 4601/4609/1 4602/4610/1 4603/4611/1 4604/4612/1 +f 4605/4613/1 4606/4614/1 4607/4615/1 4608/4616/1 +f 4609/4617/1 4610/4618/1 4611/4619/1 4612/4620/1 +f 4613/4621/1 4614/4622/1 4615/4623/1 4616/4624/1 +f 4617/4625/1 4618/4626/1 4619/4627/1 4620/4628/1 +f 4621/4629/1 4622/4630/1 4623/4631/1 4624/4632/1 +f 4625/4633/1 4626/4634/1 4627/4635/1 4628/4636/1 +f 4629/4637/1 4630/4638/1 4631/4639/1 4632/4640/1 +f 4633/4641/1 4634/4642/1 4635/4643/1 4636/4644/1 +f 4637/4645/1 4638/4646/1 4639/4647/1 4640/4648/1 +f 4641/4649/1 4642/4650/1 4643/4651/1 4644/4652/1 +f 4645/4653/1 4646/4654/1 4647/4655/1 4648/4656/1 +f 4649/4657/1 4650/4658/1 4651/4659/1 4652/4660/1 +f 4653/4661/1 4654/4662/1 4655/4663/1 4656/4664/1 +f 4657/4665/1 4658/4666/1 4659/4667/1 4660/4668/1 +f 4661/4669/1 4662/4670/1 4663/4671/1 4664/4672/1 +f 4665/4673/1 4666/4674/1 4667/4675/1 4668/4676/1 +f 4669/4677/1 4670/4678/1 4671/4679/1 4672/4680/1 +f 4673/4681/1 4674/4682/1 4675/4683/1 4676/4684/1 +f 4677/4685/1 4678/4686/1 4679/4687/1 4680/4688/1 +f 4681/4689/1 4682/4690/1 4683/4691/1 4684/4692/1 +f 4685/4693/1 4686/4694/1 4687/4695/1 4688/4696/1 +f 4689/4697/1 4690/4698/1 4691/4699/1 4692/4700/1 +f 4693/4701/1 4694/4702/1 4695/4703/1 4696/4704/1 +f 4697/4705/1 4698/4706/1 4699/4707/1 4700/4708/1 +f 4701/4709/1 4702/4710/1 4703/4711/1 4704/4712/1 +f 4705/4713/1 4706/4714/1 4707/4715/1 4708/4716/1 +f 4709/4717/1 4710/4718/1 4711/4719/1 4712/4720/1 +f 4713/4721/1 4714/4722/1 4715/4723/1 4716/4724/1 +f 4717/4725/1 4718/4726/1 4719/4727/1 4720/4728/1 +f 4721/4729/1 4722/4730/1 4723/4731/1 4724/4732/1 +f 4725/4733/1 4726/4734/1 4727/4735/1 4728/4736/1 +f 4729/4737/1 4730/4738/1 4731/4739/1 4732/4740/1 +f 4733/4741/1 4734/4742/1 4735/4743/1 4736/4744/1 +f 4737/4745/1 4738/4746/1 4739/4747/1 4740/4748/1 +f 4741/4749/1 4742/4750/1 4743/4751/1 4744/4752/1 +f 4745/4753/1 4746/4754/1 4747/4755/1 4748/4756/1 +f 4749/4757/1 4750/4758/1 4751/4759/1 4752/4760/1 +f 4753/4761/1 4754/4762/1 4755/4763/1 4756/4764/1 +f 4757/4765/1 4758/4766/1 4759/4767/1 4760/4768/1 +f 4761/4769/1 4762/4770/1 4763/4771/1 4764/4772/1 +f 4765/4773/1 4766/4774/1 4767/4775/1 4768/4776/1 +f 4769/4777/1 4770/4778/1 4771/4779/1 4772/4780/1 +f 4773/4781/1 4774/4782/1 4775/4783/1 4776/4784/1 +f 4777/4785/1 4778/4786/1 4779/4787/1 4780/4788/1 +f 4781/4789/1 4782/4790/1 4783/4791/1 4784/4792/1 +f 4785/4793/1 4786/4794/1 4787/4795/1 4788/4796/1 +f 4789/4797/1 4790/4798/1 4791/4799/1 4792/4800/1 +f 4793/4801/1 4794/4802/1 4795/4803/1 4796/4804/1 +f 4797/4805/1 4798/4806/1 4799/4807/1 4800/4808/1 +f 4801/4809/1 4802/4810/1 4803/4811/1 4804/4812/1 +f 4805/4813/1 4806/4814/1 4807/4815/1 4808/4816/1 +f 4809/4817/1 4810/4818/1 4811/4819/1 4812/4820/1 +f 4813/4821/1 4814/4822/1 4815/4823/1 4816/4824/1 +f 4817/4825/1 4818/4826/1 4819/4827/1 4820/4828/1 +f 4821/4829/1 4822/4830/1 4823/4831/1 4824/4832/1 +f 4825/4833/1 4826/4834/1 4827/4835/1 4828/4836/1 +f 4829/4837/1 4830/4838/1 4831/4839/1 4832/4840/1 +f 4833/4841/1 4834/4842/1 4835/4843/1 4836/4844/1 +f 4837/4845/1 4838/4846/1 4839/4847/1 4840/4848/1 +f 4841/4849/1 4842/4850/1 4843/4851/1 4844/4852/1 +f 4845/4853/1 4846/4854/1 4847/4855/1 4848/4856/1 +f 4849/4857/1 4850/4858/1 4851/4859/1 4852/4860/1 +f 4853/4861/1 4854/4862/1 4855/4863/1 4856/4864/1 +f 4857/4865/1 4858/4866/1 4859/4867/1 4860/4868/1 +f 4861/4869/1 4862/4870/1 4863/4871/1 4864/4872/1 +f 4865/4873/1 4866/4874/1 4867/4875/1 4868/4876/1 +f 4869/4877/1 4870/4878/1 4871/4879/1 4872/4880/1 +f 4873/4881/1 4874/4882/1 4875/4883/1 4876/4884/1 +f 4877/4885/1 4878/4886/1 4879/4887/1 4880/4888/1 +f 4881/4889/1 4882/4890/1 4883/4891/1 4884/4892/1 +f 4885/4893/1 4886/4894/1 4887/4895/1 4888/4896/1 +f 4889/4897/1 4890/4898/1 4891/4899/1 4892/4900/1 +f 4893/4901/1 4894/4902/1 4895/4903/1 4896/4904/1 +f 4897/4905/1 4898/4906/1 4899/4907/1 4900/4908/1 +f 4901/4909/1 4902/4910/1 4903/4911/1 4904/4912/1 +f 4905/4913/1 4906/4914/1 4907/4915/1 4908/4916/1 +f 4909/4917/1 4910/4918/1 4911/4919/1 4912/4920/1 +f 4913/4921/1 4914/4922/1 4915/4923/1 4916/4924/1 +f 4917/4925/1 4918/4926/1 4919/4927/1 4920/4928/1 +f 4921/4929/1 4922/4930/1 4923/4931/1 4924/4932/1 +f 4925/4933/1 4926/4934/1 4927/4935/1 4928/4936/1 +f 4929/4937/1 4930/4938/1 4931/4939/1 4932/4940/1 +f 4933/4941/1 4934/4942/1 4935/4943/1 4936/4944/1 +f 4937/4945/1 4938/4946/1 4939/4947/1 4940/4948/1 +f 4941/4949/1 4942/4950/1 4943/4951/1 4944/4952/1 +f 4945/4953/1 4946/4954/1 4947/4955/1 4948/4956/1 +f 4949/4957/1 4950/4958/1 4951/4959/1 4952/4960/1 +f 4953/4961/1 4954/4962/1 4955/4963/1 4956/4964/1 +f 4957/4965/1 4958/4966/1 4959/4967/1 4960/4968/1 +f 4961/4969/1 4962/4970/1 4963/4971/1 4964/4972/1 +f 4965/4973/1 4966/4974/1 4967/4975/1 4968/4976/1 +f 4969/4977/1 4970/4978/1 4971/4979/1 4972/4980/1 +f 4973/4981/1 4974/4982/1 4975/4983/1 4976/4984/1 +f 4977/4985/1 4978/4986/1 4979/4987/1 4980/4988/1 +f 4981/4989/1 4982/4990/1 4983/4991/1 4984/4992/1 +f 4985/4993/1 4986/4994/1 4987/4995/1 4988/4996/1 +f 4989/4997/1 4990/4998/1 4991/4999/1 4992/5000/1 +f 4993/5001/1 4994/5002/1 4995/5003/1 4996/5004/1 +f 4997/5005/1 4998/5006/1 4999/5007/1 5000/5008/1 +f 5001/5009/1 5002/5010/1 5003/5011/1 5004/5012/1 +f 5005/5013/1 5006/5014/1 5007/5015/1 5008/5016/1 +f 5009/5017/1 5010/5018/1 5011/5019/1 5012/5020/1 +f 5013/5021/1 5014/5022/1 5015/5023/1 5016/5024/1 +f 5017/5025/1 5018/5026/1 5019/5027/1 5020/5028/1 +f 5021/5029/1 5022/5030/1 5023/5031/1 5024/5032/1 +f 5025/5033/1 5026/5034/1 5027/5035/1 5028/5036/1 +f 5029/5037/1 5030/5038/1 5031/5039/1 5032/5040/1 +f 5033/5041/1 5034/5042/1 5035/5043/1 5036/5044/1 +f 5037/5045/1 5038/5046/1 5039/5047/1 5040/5048/1 +f 5041/5049/1 5042/5050/1 5043/5051/1 5044/5052/1 +f 5045/5053/1 5046/5054/1 5047/5055/1 5048/5056/1 +f 5049/5057/1 5050/5058/1 5051/5059/1 5052/5060/1 +f 5053/5061/1 5054/5062/1 5055/5063/1 5056/5064/1 +f 5057/5065/1 5058/5066/1 5059/5067/1 5060/5068/1 +f 5061/5069/1 5062/5070/1 5063/5071/1 5064/5072/1 +f 5065/5073/1 5066/5074/1 5067/5075/1 5068/5076/1 +f 5069/5077/1 5070/5078/1 5071/5079/1 5072/5080/1 +f 5073/5081/1 5074/5082/1 5075/5083/1 5076/5084/1 +f 5077/5085/1 5078/5086/1 5079/5087/1 5080/5088/1 +f 5081/5089/1 5082/5090/1 5083/5091/1 5084/5092/1 +f 5085/5093/1 5086/5094/1 5087/5095/1 5088/5096/1 +f 5089/5097/1 5090/5098/1 5091/5099/1 5092/5100/1 +f 5093/5101/1 5094/5102/1 5095/5103/1 5096/5104/1 +f 5097/5105/1 5098/5106/1 5099/5107/1 5100/5108/1 +f 5101/5109/1 5102/5110/1 5103/5111/1 5104/5112/1 +f 5105/5113/1 5106/5114/1 5107/5115/1 5108/5116/1 +f 5109/5117/1 5110/5118/1 5111/5119/1 5112/5120/1 +f 5113/5121/1 5114/5122/1 5115/5123/1 5116/5124/1 +f 5117/5125/1 5118/5126/1 5119/5127/1 5120/5128/1 +f 5121/5129/1 5122/5130/1 5123/5131/1 5124/5132/1 +f 5125/5133/1 5126/5134/1 5127/5135/1 5128/5136/1 +f 5129/5137/1 5130/5138/1 5131/5139/1 5132/5140/1 +f 5133/5141/1 5134/5142/1 5135/5143/1 5136/5144/1 +f 5137/5145/1 5138/5146/1 5139/5147/1 5140/5148/1 +f 5141/5149/1 5142/5150/1 5143/5151/1 5144/5152/1 +f 5145/5153/1 5146/5154/1 5147/5155/1 5148/5156/1 +f 5149/5157/1 5150/5158/1 5151/5159/1 5152/5160/1 +f 5153/5161/1 5154/5162/1 5155/5163/1 5156/5164/1 +f 5157/5165/1 5158/5166/1 5159/5167/1 5160/5168/1 +f 5161/5169/1 5162/5170/1 5163/5171/1 5164/5172/1 +f 5165/5173/1 5166/5174/1 5167/5175/1 5168/5176/1 +f 5169/5177/1 5170/5178/1 5171/5179/1 5172/5180/1 +f 5173/5181/1 5174/5182/1 5175/5183/1 5176/5184/1 +f 5177/5185/1 5178/5186/1 5179/5187/1 5180/5188/1 +f 5181/5189/1 5182/5190/1 5183/5191/1 5184/5192/1 +f 5185/5193/1 5186/5194/1 5187/5195/1 5188/5196/1 +f 5189/5197/1 5190/5198/1 5191/5199/1 5192/5200/1 +f 5193/5201/1 5194/5202/1 5195/5203/1 5196/5204/1 +f 5197/5205/1 5198/5206/1 5199/5207/1 5200/5208/1 +f 5201/5209/1 5202/5210/1 5203/5211/1 5204/5212/1 +f 5205/5213/1 5206/5214/1 5207/5215/1 5208/5216/1 +f 5209/5217/1 5210/5218/1 5211/5219/1 5212/5220/1 +f 5213/5221/1 5214/5222/1 5215/5223/1 5216/5224/1 +f 5217/5225/1 5218/5226/1 5219/5227/1 5220/5228/1 +f 5221/5229/1 5222/5230/1 5223/5231/1 5224/5232/1 +f 5225/5233/1 5226/5234/1 5227/5235/1 5228/5236/1 +f 5229/5237/1 5230/5238/1 5231/5239/1 5232/5240/1 +f 5233/5241/1 5234/5242/1 5235/5243/1 5236/5244/1 +f 5237/5245/1 5238/5246/1 5239/5247/1 5240/5248/1 +f 5241/5249/1 5242/5250/1 5243/5251/1 5244/5252/1 +f 5245/5253/1 5246/5254/1 5247/5255/1 5248/5256/1 +f 5249/5257/1 5250/5258/1 5251/5259/1 5252/5260/1 +f 5253/5261/1 5254/5262/1 5255/5263/1 5256/5264/1 +f 5257/5265/1 5258/5266/1 5259/5267/1 5260/5268/1 +f 5261/5269/1 5262/5270/1 5263/5271/1 5264/5272/1 +f 5265/5273/1 5266/5274/1 5267/5275/1 5268/5276/1 +f 5269/5277/1 5270/5278/1 5271/5279/1 5272/5280/1 +f 5273/5281/1 5274/5282/1 5275/5283/1 5276/5284/1 +f 5277/5285/1 5278/5286/1 5279/5287/1 5280/5288/1 +f 5281/5289/1 5282/5290/1 5283/5291/1 5284/5292/1 +f 5285/5293/1 5286/5294/1 5287/5295/1 5288/5296/1 +f 5289/5297/1 5290/5298/1 5291/5299/1 5292/5300/1 +f 5293/5301/1 5294/5302/1 5295/5303/1 5296/5304/1 +f 5297/5305/1 5298/5306/1 5299/5307/1 5300/5308/1 +f 5301/5309/1 5302/5310/1 5303/5311/1 5304/5312/1 +f 5305/5313/1 5306/5314/1 5307/5315/1 5308/5316/1 +f 5309/5317/1 5310/5318/1 5311/5319/1 5312/5320/1 +f 5313/5321/1 5314/5322/1 5315/5323/1 5316/5324/1 +f 5317/5325/1 5318/5326/1 5319/5327/1 5320/5328/1 +f 5321/5329/1 5322/5330/1 5323/5331/1 5324/5332/1 +f 5325/5333/1 5326/5334/1 5327/5335/1 5328/5336/1 +f 5329/5337/1 5330/5338/1 5331/5339/1 5332/5340/1 +f 5333/5341/1 5334/5342/1 5335/5343/1 5336/5344/1 +f 5337/5345/1 5338/5346/1 5339/5347/1 5340/5348/1 +f 5341/5349/1 5342/5350/1 5343/5351/1 5344/5352/1 +f 5345/5353/1 5346/5354/1 5347/5355/1 5348/5356/1 +f 5349/5357/1 5350/5358/1 5351/5359/1 5352/5360/1 +f 5353/5361/1 5354/5362/1 5355/5363/1 5356/5364/1 +f 5357/5365/1 5358/5366/1 5359/5367/1 5360/5368/1 +f 5361/5369/1 5362/5370/1 5363/5371/1 5364/5372/1 +f 5365/5373/1 5366/5374/1 5367/5375/1 5368/5376/1 +f 5369/5377/1 5370/5378/1 5371/5379/1 5372/5380/1 +f 5373/5381/1 5374/5382/1 5375/5383/1 5376/5384/1 +f 5377/5385/1 5378/5386/1 5379/5387/1 5380/5388/1 +f 5381/5389/1 5382/5390/1 5383/5391/1 5384/5392/1 +f 5385/5393/1 5386/5394/1 5387/5395/1 5388/5396/1 +f 5389/5397/1 5390/5398/1 5391/5399/1 5392/5400/1 +f 5393/5401/1 5394/5402/1 5395/5403/1 5396/5404/1 +f 5397/5405/1 5398/5406/1 5399/5407/1 5400/5408/1 +f 5401/5409/1 5402/5410/1 5403/5411/1 5404/5412/1 +f 5405/5413/1 5406/5414/1 5407/5415/1 5408/5416/1 +f 5409/5417/1 5410/5418/1 5411/5419/1 5412/5420/1 +f 5413/5421/1 5414/5422/1 5415/5423/1 5416/5424/1 +f 5417/5425/1 5418/5426/1 5419/5427/1 5420/5428/1 +f 5421/5429/1 5422/5430/1 5423/5431/1 5424/5432/1 +f 5425/5433/1 5426/5434/1 5427/5435/1 5428/5436/1 +f 5429/5437/1 5430/5438/1 5431/5439/1 5432/5440/1 +f 5433/5441/1 5434/5442/1 5435/5443/1 5436/5444/1 +f 5437/5445/1 5438/5446/1 5439/5447/1 5440/5448/1 +f 5441/5449/1 5442/5450/1 5443/5451/1 5444/5452/1 +f 5445/5453/1 5446/5454/1 5447/5455/1 5448/5456/1 +f 5449/5457/1 5450/5458/1 5451/5459/1 5452/5460/1 +f 5453/5461/1 5454/5462/1 5455/5463/1 5456/5464/1 +f 5457/5465/1 5458/5466/1 5459/5467/1 5460/5468/1 +f 5461/5469/1 5462/5470/1 5463/5471/1 5464/5472/1 +f 5465/5473/1 5466/5474/1 5467/5475/1 5468/5476/1 +f 5469/5477/1 5470/5478/1 5471/5479/1 5472/5480/1 +f 5473/5481/1 5474/5482/1 5475/5483/1 5476/5484/1 +f 5477/5485/1 5478/5486/1 5479/5487/1 5480/5488/1 +f 5481/5489/1 5482/5490/1 5483/5491/1 5484/5492/1 +f 5485/5493/1 5486/5494/1 5487/5495/1 5488/5496/1 +f 5489/5497/1 5490/5498/1 5491/5499/1 5492/5500/1 +f 5493/5501/1 5494/5502/1 5495/5503/1 5496/5504/1 +f 5497/5505/1 5498/5506/1 5499/5507/1 5500/5508/1 +f 5501/5509/1 5502/5510/1 5503/5511/1 5504/5512/1 +f 5505/5513/1 5506/5514/1 5507/5515/1 5508/5516/1 +f 5509/5517/1 5510/5518/1 5511/5519/1 5512/5520/1 +f 5513/5521/1 5514/5522/1 5515/5523/1 5516/5524/1 +f 5517/5525/1 5518/5526/1 5519/5527/1 5520/5528/1 +f 5521/5529/1 5522/5530/1 5523/5531/1 5524/5532/1 +f 5525/5533/1 5526/5534/1 5527/5535/1 5528/5536/1 +f 5529/5537/1 5530/5538/1 5531/5539/1 5532/5540/1 +f 5533/5541/1 5534/5542/1 5535/5543/1 5536/5544/1 +f 5537/5545/1 5538/5546/1 5539/5547/1 5540/5548/1 +f 5541/5549/1 5542/5550/1 5543/5551/1 5544/5552/1 +f 5545/5553/1 5546/5554/1 5547/5555/1 5548/5556/1 +f 5549/5557/1 5550/5558/1 5551/5559/1 5552/5560/1 +f 5553/5561/1 5554/5562/1 5555/5563/1 5556/5564/1 +f 5557/5565/1 5558/5566/1 5559/5567/1 5560/5568/1 +f 5561/5569/1 5562/5570/1 5563/5571/1 5564/5572/1 +f 5565/5573/1 5566/5574/1 5567/5575/1 5568/5576/1 +f 5569/5577/1 5570/5578/1 5571/5579/1 5572/5580/1 +f 5573/5581/1 5574/5582/1 5575/5583/1 5576/5584/1 +f 5577/5585/1 5578/5586/1 5579/5587/1 5580/5588/1 +f 5581/5589/1 5582/5590/1 5583/5591/1 5584/5592/1 +f 5585/5593/1 5586/5594/1 5587/5595/1 5588/5596/1 +f 5589/5597/1 5590/5598/1 5591/5599/1 5592/5600/1 +f 5593/5601/1 5594/5602/1 5595/5603/1 5596/5604/1 +f 5597/5605/1 5598/5606/1 5599/5607/1 5600/5608/1 +f 5601/5609/1 5602/5610/1 5603/5611/1 5604/5612/1 +f 5605/5613/1 5606/5614/1 5607/5615/1 5608/5616/1 +f 5609/5617/1 5610/5618/1 5611/5619/1 5612/5620/1 +f 5613/5621/1 5614/5622/1 5615/5623/1 5616/5624/1 +f 5617/5625/1 5618/5626/1 5619/5627/1 5620/5628/1 +f 5621/5629/1 5622/5630/1 5623/5631/1 5624/5632/1 +f 5625/5633/1 5626/5634/1 5627/5635/1 5628/5636/1 +f 5629/5637/1 5630/5638/1 5631/5639/1 5632/5640/1 +f 5633/5641/1 5634/5642/1 5635/5643/1 5636/5644/1 +f 5637/5645/1 5638/5646/1 5639/5647/1 5640/5648/1 +f 5641/5649/1 5642/5650/1 5643/5651/1 5644/5652/1 +f 5645/5653/1 5646/5654/1 5647/5655/1 5648/5656/1 +f 5649/5657/1 5650/5658/1 5651/5659/1 5652/5660/1 +f 5653/5661/1 5654/5662/1 5655/5663/1 5656/5664/1 +f 5657/5665/1 5658/5666/1 5659/5667/1 5660/5668/1 +f 5661/5669/1 5662/5670/1 5663/5671/1 5664/5672/1 +f 5665/5673/1 5666/5674/1 5667/5675/1 5668/5676/1 +f 5669/5677/1 5670/5678/1 5671/5679/1 5672/5680/1 +f 5673/5681/1 5674/5682/1 5675/5683/1 5676/5684/1 +f 5677/5685/1 5678/5686/1 5679/5687/1 5680/5688/1 +f 5681/5689/1 5682/5690/1 5683/5691/1 5684/5692/1 +f 5685/5693/1 5686/5694/1 5687/5695/1 5688/5696/1 +f 5689/5697/1 5690/5698/1 5691/5699/1 5692/5700/1 +f 5693/5701/1 5694/5702/1 5695/5703/1 5696/5704/1 +f 5697/5705/1 5698/5706/1 5699/5707/1 5700/5708/1 +f 5701/5709/1 5702/5710/1 5703/5711/1 5704/5712/1 +f 5705/5713/1 5706/5714/1 5707/5715/1 5708/5716/1 +f 5709/5717/1 5710/5718/1 5711/5719/1 5712/5720/1 +f 5713/5721/1 5714/5722/1 5715/5723/1 5716/5724/1 +f 5717/5725/1 5718/5726/1 5719/5727/1 5720/5728/1 +f 5721/5729/1 5722/5730/1 5723/5731/1 5724/5732/1 +f 5725/5733/1 5726/5734/1 5727/5735/1 5728/5736/1 +f 5729/5737/1 5730/5738/1 5731/5739/1 5732/5740/1 +f 5733/5741/1 5734/5742/1 5735/5743/1 5736/5744/1 +f 5737/5745/1 5738/5746/1 5739/5747/1 5740/5748/1 +f 5741/5749/1 5742/5750/1 5743/5751/1 5744/5752/1 +f 5745/5753/1 5746/5754/1 5747/5755/1 5748/5756/1 +f 5749/5757/1 5750/5758/1 5751/5759/1 5752/5760/1 +f 5753/5761/1 5754/5762/1 5755/5763/1 5756/5764/1 +f 5757/5765/1 5758/5766/1 5759/5767/1 5760/5768/1 +f 5761/5769/1 5762/5770/1 5763/5771/1 5764/5772/1 +f 5765/5773/1 5766/5774/1 5767/5775/1 5768/5776/1 +f 5769/5777/1 5770/5778/1 5771/5779/1 5772/5780/1 +f 5773/5781/1 5774/5782/1 5775/5783/1 5776/5784/1 +f 5777/5785/1 5778/5786/1 5779/5787/1 5780/5788/1 +f 5781/5789/1 5782/5790/1 5783/5791/1 5784/5792/1 +f 5785/5793/1 5786/5794/1 5787/5795/1 5788/5796/1 +f 5789/5797/1 5790/5798/1 5791/5799/1 5792/5800/1 +f 5793/5801/1 5794/5802/1 5795/5803/1 5796/5804/1 +f 5797/5805/1 5798/5806/1 5799/5807/1 5800/5808/1 +f 5801/5809/1 5802/5810/1 5803/5811/1 5804/5812/1 +f 5805/5813/1 5806/5814/1 5807/5815/1 5808/5816/1 +f 5809/5817/1 5810/5818/1 5811/5819/1 5812/5820/1 +f 5813/5821/1 5814/5822/1 5815/5823/1 5816/5824/1 +f 5817/5825/1 5818/5826/1 5819/5827/1 5820/5828/1 +f 5821/5829/1 5822/5830/1 5823/5831/1 5824/5832/1 +f 5825/5833/1 5826/5834/1 5827/5835/1 5828/5836/1 +f 5829/5837/1 5830/5838/1 5831/5839/1 5832/5840/1 +f 5833/5841/1 5834/5842/1 5835/5843/1 5836/5844/1 +f 5837/5845/1 5838/5846/1 5839/5847/1 5840/5848/1 +f 5841/5849/1 5842/5850/1 5843/5851/1 5844/5852/1 +f 5845/5853/1 5846/5854/1 5847/5855/1 5848/5856/1 +f 5849/5857/1 5850/5858/1 5851/5859/1 5852/5860/1 +f 5853/5861/1 5854/5862/1 5855/5863/1 5856/5864/1 +f 5857/5865/1 5858/5866/1 5859/5867/1 5860/5868/1 +f 5861/5869/1 5862/5870/1 5863/5871/1 5864/5872/1 +f 5865/5873/1 5866/5874/1 5867/5875/1 5868/5876/1 +f 5869/5877/1 5870/5878/1 5871/5879/1 5872/5880/1 +f 5873/5881/1 5874/5882/1 5875/5883/1 5876/5884/1 +f 5877/5885/1 5878/5886/1 5879/5887/1 5880/5888/1 +f 5881/5889/1 5882/5890/1 5883/5891/1 5884/5892/1 +f 5885/5893/1 5886/5894/1 5887/5895/1 5888/5896/1 +f 5889/5897/1 5890/5898/1 5891/5899/1 5892/5900/1 +f 5893/5901/1 5894/5902/1 5895/5903/1 5896/5904/1 +f 5897/5905/1 5898/5906/1 5899/5907/1 5900/5908/1 +f 5901/5909/1 5902/5910/1 5903/5911/1 5904/5912/1 +f 5905/5913/1 5906/5914/1 5907/5915/1 5908/5916/1 +f 5909/5917/1 5910/5918/1 5911/5919/1 5912/5920/1 +f 5913/5921/1 5914/5922/1 5915/5923/1 5916/5924/1 +f 5917/5925/1 5918/5926/1 5919/5927/1 5920/5928/1 +f 5921/5929/1 5922/5930/1 5923/5931/1 5924/5932/1 +f 5925/5933/1 5926/5934/1 5927/5935/1 5928/5936/1 +f 5929/5937/1 5930/5938/1 5931/5939/1 5932/5940/1 +f 5933/5941/1 5934/5942/1 5935/5943/1 5936/5944/1 +f 5937/5945/1 5938/5946/1 5939/5947/1 5940/5948/1 +f 5941/5949/1 5942/5950/1 5943/5951/1 5944/5952/1 +f 5945/5953/1 5946/5954/1 5947/5955/1 5948/5956/1 +f 5949/5957/1 5950/5958/1 5951/5959/1 5952/5960/1 +f 5953/5961/1 5954/5962/1 5955/5963/1 5956/5964/1 +f 5957/5965/1 5958/5966/1 5959/5967/1 5960/5968/1 +f 5961/5969/1 5962/5970/1 5963/5971/1 5964/5972/1 +f 5965/5973/1 5966/5974/1 5967/5975/1 5968/5976/1 +f 5969/5977/1 5970/5978/1 5971/5979/1 5972/5980/1 +f 5973/5981/1 5974/5982/1 5975/5983/1 5976/5984/1 +f 5977/5985/1 5978/5986/1 5979/5987/1 5980/5988/1 +f 5981/5989/1 5982/5990/1 5983/5991/1 5984/5992/1 +f 5985/5993/1 5986/5994/1 5987/5995/1 5988/5996/1 +f 5989/5997/1 5990/5998/1 5991/5999/1 5992/6000/1 +f 5993/6001/1 5994/6002/1 5995/6003/1 5996/6004/1 +f 5997/6005/1 5998/6006/1 5999/6007/1 6000/6008/1 +f 6001/6009/1 6002/6010/1 6003/6011/1 6004/6012/1 +f 6005/6013/1 6006/6014/1 6007/6015/1 6008/6016/1 +f 6009/6017/1 6010/6018/1 6011/6019/1 6012/6020/1 +f 6013/6021/1 6014/6022/1 6015/6023/1 6016/6024/1 +f 6017/6025/1 6018/6026/1 6019/6027/1 6020/6028/1 +f 6021/6029/1 6022/6030/1 6023/6031/1 6024/6032/1 +f 6025/6033/1 6026/6034/1 6027/6035/1 6028/6036/1 +f 6029/6037/1 6030/6038/1 6031/6039/1 6032/6040/1 +f 6033/6041/1 6034/6042/1 6035/6043/1 6036/6044/1 +f 6037/6045/1 6038/6046/1 6039/6047/1 6040/6048/1 +f 6041/6049/1 6042/6050/1 6043/6051/1 6044/6052/1 +f 6045/6053/1 6046/6054/1 6047/6055/1 6048/6056/1 +f 6049/6057/1 6050/6058/1 6051/6059/1 6052/6060/1 +f 6053/6061/1 6054/6062/1 6055/6063/1 6056/6064/1 +f 6057/6065/1 6058/6066/1 6059/6067/1 6060/6068/1 +f 6061/6069/1 6062/6070/1 6063/6071/1 6064/6072/1 +f 6065/6073/1 6066/6074/1 6067/6075/1 6068/6076/1 +f 6069/6077/1 6070/6078/1 6071/6079/1 6072/6080/1 +f 6073/6081/1 6074/6082/1 6075/6083/1 6076/6084/1 +f 6077/6085/1 6078/6086/1 6079/6087/1 6080/6088/1 +f 6081/6089/1 6082/6090/1 6083/6091/1 6084/6092/1 +f 6085/6093/1 6086/6094/1 6087/6095/1 6088/6096/1 +f 6089/6097/1 6090/6098/1 6091/6099/1 6092/6100/1 +f 6093/6101/1 6094/6102/1 6095/6103/1 6096/6104/1 +f 6097/6105/1 6098/6106/1 6099/6107/1 6100/6108/1 +f 6101/6109/1 6102/6110/1 6103/6111/1 6104/6112/1 +f 6105/6113/1 6106/6114/1 6107/6115/1 6108/6116/1 +f 6109/6117/1 6110/6118/1 6111/6119/1 6112/6120/1 +f 6113/6121/1 6114/6122/1 6115/6123/1 6116/6124/1 +f 6117/6125/1 6118/6126/1 6119/6127/1 6120/6128/1 +f 6121/6129/1 6122/6130/1 6123/6131/1 6124/6132/1 +f 6125/6133/1 6126/6134/1 6127/6135/1 6128/6136/1 +f 6129/6137/1 6130/6138/1 6131/6139/1 6132/6140/1 +f 6133/6141/1 6134/6142/1 6135/6143/1 6136/6144/1 +f 6137/6145/1 6138/6146/1 6139/6147/1 6140/6148/1 +f 6141/6149/1 6142/6150/1 6143/6151/1 6144/6152/1 +f 6145/6153/1 6146/6154/1 6147/6155/1 6148/6156/1 +f 6149/6157/1 6150/6158/1 6151/6159/1 6152/6160/1 +f 6153/6161/1 6154/6162/1 6155/6163/1 6156/6164/1 +f 6157/6165/1 6158/6166/1 6159/6167/1 6160/6168/1 +f 6161/6169/1 6162/6170/1 6163/6171/1 6164/6172/1 +f 6165/6173/1 6166/6174/1 6167/6175/1 6168/6176/1 +f 6169/6177/1 6170/6178/1 6171/6179/1 6172/6180/1 +f 6173/6181/1 6174/6182/1 6175/6183/1 6176/6184/1 +f 6177/6185/1 6178/6186/1 6179/6187/1 6180/6188/1 +f 6181/6189/1 6182/6190/1 6183/6191/1 6184/6192/1 +f 6185/6193/1 6186/6194/1 6187/6195/1 6188/6196/1 +f 6189/6197/1 6190/6198/1 6191/6199/1 6192/6200/1 +f 6193/6201/1 6194/6202/1 6195/6203/1 6196/6204/1 +f 6197/6205/1 6198/6206/1 6199/6207/1 6200/6208/1 +f 6201/6209/1 6202/6210/1 6203/6211/1 6204/6212/1 +f 6205/6213/1 6206/6214/1 6207/6215/1 6208/6216/1 +f 6209/6217/1 6210/6218/1 6211/6219/1 6212/6220/1 +f 6213/6221/1 6214/6222/1 6215/6223/1 6216/6224/1 +f 6217/6225/1 6218/6226/1 6219/6227/1 6220/6228/1 +f 6221/6229/1 6222/6230/1 6223/6231/1 6224/6232/1 +f 6225/6233/1 6226/6234/1 6227/6235/1 6228/6236/1 +f 6229/6237/1 6230/6238/1 6231/6239/1 6232/6240/1 +f 6233/6241/1 6234/6242/1 6235/6243/1 6236/6244/1 +f 6237/6245/1 6238/6246/1 6239/6247/1 6240/6248/1 +f 6241/6249/1 6242/6250/1 6243/6251/1 6244/6252/1 +f 6245/6253/1 6246/6254/1 6247/6255/1 6248/6256/1 +f 6249/6257/1 6250/6258/1 6251/6259/1 6252/6260/1 +f 6253/6261/1 6254/6262/1 6255/6263/1 6256/6264/1 +f 6257/6265/1 6258/6266/1 6259/6267/1 6260/6268/1 +f 6261/6269/1 6262/6270/1 6263/6271/1 6264/6272/1 +f 6265/6273/1 6266/6274/1 6267/6275/1 6268/6276/1 +f 6269/6277/1 6270/6278/1 6271/6279/1 6272/6280/1 +f 6273/6281/1 6274/6282/1 6275/6283/1 6276/6284/1 +f 6277/6285/1 6278/6286/1 6279/6287/1 6280/6288/1 +f 6281/6289/1 6282/6290/1 6283/6291/1 6284/6292/1 +f 6285/6293/1 6286/6294/1 6287/6295/1 6288/6296/1 +f 6289/6297/1 6290/6298/1 6291/6299/1 6292/6300/1 +f 6293/6301/1 6294/6302/1 6295/6303/1 6296/6304/1 +f 6297/6305/1 6298/6306/1 6299/6307/1 6300/6308/1 +f 6301/6309/1 6302/6310/1 6303/6311/1 6304/6312/1 +f 6305/6313/1 6306/6314/1 6307/6315/1 6308/6316/1 +f 6309/6317/1 6310/6318/1 6311/6319/1 6312/6320/1 +f 6313/6321/1 6314/6322/1 6315/6323/1 6316/6324/1 +f 6317/6325/1 6318/6326/1 6319/6327/1 6320/6328/1 +f 6321/6329/1 6322/6330/1 6323/6331/1 6324/6332/1 +f 6325/6333/1 6326/6334/1 6327/6335/1 6328/6336/1 +f 6329/6337/1 6330/6338/1 6331/6339/1 6332/6340/1 +f 6333/6341/1 6334/6342/1 6335/6343/1 6336/6344/1 +f 6337/6345/1 6338/6346/1 6339/6347/1 6340/6348/1 +f 6341/6349/1 6342/6350/1 6343/6351/1 6344/6352/1 +f 6345/6353/1 6346/6354/1 6347/6355/1 6348/6356/1 +f 6349/6357/1 6350/6358/1 6351/6359/1 6352/6360/1 +f 6353/6361/1 6354/6362/1 6355/6363/1 6356/6364/1 +f 6357/6365/1 6358/6366/1 6359/6367/1 6360/6368/1 +f 6361/6369/1 6362/6370/1 6363/6371/1 6364/6372/1 +f 6365/6373/1 6366/6374/1 6367/6375/1 6368/6376/1 +f 6369/6377/1 6370/6378/1 6371/6379/1 6372/6380/1 +f 6373/6381/1 6374/6382/1 6375/6383/1 6376/6384/1 +f 6377/6385/1 6378/6386/1 6379/6387/1 6380/6388/1 +f 6381/6389/1 6382/6390/1 6383/6391/1 6384/6392/1 +f 6385/6393/1 6386/6394/1 6387/6395/1 6388/6396/1 +f 6389/6397/1 6390/6398/1 6391/6399/1 6392/6400/1 +f 6393/6401/1 6394/6402/1 6395/6403/1 6396/6404/1 +f 6397/6405/1 6398/6406/1 6399/6407/1 6400/6408/1 +f 6401/6409/1 6402/6410/1 6403/6411/1 6404/6412/1 +f 6405/6413/1 6406/6414/1 6407/6415/1 6408/6416/1 +f 6409/6417/1 6410/6418/1 6411/6419/1 6412/6420/1 +f 6413/6421/1 6414/6422/1 6415/6423/1 6416/6424/1 +f 6417/6425/1 6418/6426/1 6419/6427/1 6420/6428/1 +f 6421/6429/1 6422/6430/1 6423/6431/1 6424/6432/1 +f 6425/6433/1 6426/6434/1 6427/6435/1 6428/6436/1 +f 6429/6437/1 6430/6438/1 6431/6439/1 6432/6440/1 +f 6433/6441/1 6434/6442/1 6435/6443/1 6436/6444/1 +f 6437/6445/1 6438/6446/1 6439/6447/1 6440/6448/1 +f 6441/6449/1 6442/6450/1 6443/6451/1 6444/6452/1 +f 6445/6453/1 6446/6454/1 6447/6455/1 6448/6456/1 +f 6449/6457/1 6450/6458/1 6451/6459/1 6452/6460/1 +f 6453/6461/1 6454/6462/1 6455/6463/1 6456/6464/1 +f 6457/6465/1 6458/6466/1 6459/6467/1 6460/6468/1 +f 6461/6469/1 6462/6470/1 6463/6471/1 6464/6472/1 +f 6465/6473/1 6466/6474/1 6467/6475/1 6468/6476/1 +f 6469/6477/1 6470/6478/1 6471/6479/1 6472/6480/1 +f 6473/6481/1 6474/6482/1 6475/6483/1 6476/6484/1 +f 6477/6485/1 6478/6486/1 6479/6487/1 6480/6488/1 +f 6481/6489/1 6482/6490/1 6483/6491/1 6484/6492/1 +f 6485/6493/1 6486/6494/1 6487/6495/1 6488/6496/1 +f 6489/6497/1 6490/6498/1 6491/6499/1 6492/6500/1 +f 6493/6501/1 6494/6502/1 6495/6503/1 6496/6504/1 +f 6497/6505/1 6498/6506/1 6499/6507/1 6500/6508/1 +f 6501/6509/1 6502/6510/1 6503/6511/1 6504/6512/1 +f 6505/6513/1 6506/6514/1 6507/6515/1 6508/6516/1 +f 6509/6517/1 6510/6518/1 6511/6519/1 6512/6520/1 +f 6513/6521/1 6514/6522/1 6515/6523/1 6516/6524/1 +f 6517/6525/1 6518/6526/1 6519/6527/1 6520/6528/1 +f 6521/6529/1 6522/6530/1 6523/6531/1 6524/6532/1 +f 6525/6533/1 6526/6534/1 6527/6535/1 6528/6536/1 +f 6529/6537/1 6530/6538/1 6531/6539/1 6532/6540/1 +f 6533/6541/1 6534/6542/1 6535/6543/1 6536/6544/1 +f 6537/6545/1 6538/6546/1 6539/6547/1 6540/6548/1 +f 6541/6549/1 6542/6550/1 6543/6551/1 6544/6552/1 +f 6545/6553/1 6546/6554/1 6547/6555/1 6548/6556/1 +f 6549/6557/1 6550/6558/1 6551/6559/1 6552/6560/1 +f 6553/6561/1 6554/6562/1 6555/6563/1 6556/6564/1 +f 6557/6565/1 6558/6566/1 6559/6567/1 6560/6568/1 +f 6561/6569/1 6562/6570/1 6563/6571/1 6564/6572/1 +f 6565/6573/1 6566/6574/1 6567/6575/1 6568/6576/1 +f 6569/6577/1 6570/6578/1 6571/6579/1 6572/6580/1 +f 6573/6581/1 6574/6582/1 6575/6583/1 6576/6584/1 +f 6577/6585/1 6578/6586/1 6579/6587/1 6580/6588/1 +f 6581/6589/1 6582/6590/1 6583/6591/1 6584/6592/1 +f 6585/6593/1 6586/6594/1 6587/6595/1 6588/6596/1 +f 6589/6597/1 6590/6598/1 6591/6599/1 6592/6600/1 +f 6593/6601/1 6594/6602/1 6595/6603/1 6596/6604/1 +f 6597/6605/1 6598/6606/1 6599/6607/1 6600/6608/1 +f 6601/6609/1 6602/6610/1 6603/6611/1 6604/6612/1 +f 6605/6613/1 6606/6614/1 6607/6615/1 6608/6616/1 +f 6609/6617/1 6610/6618/1 6611/6619/1 6612/6620/1 +f 6613/6621/1 6614/6622/1 6615/6623/1 6616/6624/1 +f 6617/6625/1 6618/6626/1 6619/6627/1 6620/6628/1 +f 6621/6629/1 6622/6630/1 6623/6631/1 6624/6632/1 +f 6625/6633/1 6626/6634/1 6627/6635/1 6628/6636/1 +f 6629/6637/1 6630/6638/1 6631/6639/1 6632/6640/1 +f 6633/6641/1 6634/6642/1 6635/6643/1 6636/6644/1 +f 6637/6645/1 6638/6646/1 6639/6647/1 6640/6648/1 +f 6641/6649/1 6642/6650/1 6643/6651/1 6644/6652/1 +f 6645/6653/1 6646/6654/1 6647/6655/1 6648/6656/1 +f 6649/6657/1 6650/6658/1 6651/6659/1 6652/6660/1 +f 6653/6661/1 6654/6662/1 6655/6663/1 6656/6664/1 +f 6657/6665/1 6658/6666/1 6659/6667/1 6660/6668/1 +f 6661/6669/1 6662/6670/1 6663/6671/1 6664/6672/1 +f 6665/6673/1 6666/6674/1 6667/6675/1 6668/6676/1 +f 6669/6677/1 6670/6678/1 6671/6679/1 6672/6680/1 +f 6673/6681/1 6674/6682/1 6675/6683/1 6676/6684/1 +f 6677/6685/1 6678/6686/1 6679/6687/1 6680/6688/1 +f 6681/6689/1 6682/6690/1 6683/6691/1 6684/6692/1 +f 6685/6693/1 6686/6694/1 6687/6695/1 6688/6696/1 +f 6689/6697/1 6690/6698/1 6691/6699/1 6692/6700/1 +f 6693/6701/1 6694/6702/1 6695/6703/1 6696/6704/1 +f 6697/6705/1 6698/6706/1 6699/6707/1 6700/6708/1 +f 6701/6709/1 6702/6710/1 6703/6711/1 6704/6712/1 +f 6705/6713/1 6706/6714/1 6707/6715/1 6708/6716/1 +f 6709/6717/1 6710/6718/1 6711/6719/1 6712/6720/1 +f 6713/6721/1 6714/6722/1 6715/6723/1 6716/6724/1 +f 6717/6725/1 6718/6726/1 6719/6727/1 6720/6728/1 +f 6721/6729/1 6722/6730/1 6723/6731/1 6724/6732/1 +f 6725/6733/1 6726/6734/1 6727/6735/1 6728/6736/1 +f 6729/6737/1 6730/6738/1 6731/6739/1 6732/6740/1 +f 6733/6741/1 6734/6742/1 6735/6743/1 6736/6744/1 +f 6737/6745/1 6738/6746/1 6739/6747/1 6740/6748/1 +f 6741/6749/1 6742/6750/1 6743/6751/1 6744/6752/1 +f 6745/6753/1 6746/6754/1 6747/6755/1 6748/6756/1 +f 6749/6757/1 6750/6758/1 6751/6759/1 6752/6760/1 +f 6753/6761/1 6754/6762/1 6755/6763/1 6756/6764/1 +f 6757/6765/1 6758/6766/1 6759/6767/1 6760/6768/1 +f 6761/6769/1 6762/6770/1 6763/6771/1 6764/6772/1 +f 6765/6773/1 6766/6774/1 6767/6775/1 6768/6776/1 +f 6769/6777/1 6770/6778/1 6771/6779/1 6772/6780/1 +f 6773/6781/1 6774/6782/1 6775/6783/1 6776/6784/1 +f 6777/6785/1 6778/6786/1 6779/6787/1 6780/6788/1 +f 6781/6789/1 6782/6790/1 6783/6791/1 6784/6792/1 +f 6785/6793/1 6786/6794/1 6787/6795/1 6788/6796/1 +f 6789/6797/1 6790/6798/1 6791/6799/1 6792/6800/1 +f 6793/6801/1 6794/6802/1 6795/6803/1 6796/6804/1 +f 6797/6805/1 6798/6806/1 6799/6807/1 6800/6808/1 +f 6801/6809/1 6802/6810/1 6803/6811/1 6804/6812/1 +f 6805/6813/1 6806/6814/1 6807/6815/1 6808/6816/1 +f 6809/6817/1 6810/6818/1 6811/6819/1 6812/6820/1 +f 6813/6821/1 6814/6822/1 6815/6823/1 6816/6824/1 +f 6817/6825/1 6818/6826/1 6819/6827/1 6820/6828/1 +f 6821/6829/1 6822/6830/1 6823/6831/1 6824/6832/1 +f 6825/6833/1 6826/6834/1 6827/6835/1 6828/6836/1 +f 6829/6837/1 6830/6838/1 6831/6839/1 6832/6840/1 +f 6833/6841/1 6834/6842/1 6835/6843/1 6836/6844/1 +f 6837/6845/1 6838/6846/1 6839/6847/1 6840/6848/1 +f 6841/6849/1 6842/6850/1 6843/6851/1 6844/6852/1 +f 6845/6853/1 6846/6854/1 6847/6855/1 6848/6856/1 +f 6849/6857/1 6850/6858/1 6851/6859/1 6852/6860/1 +f 6853/6861/1 6854/6862/1 6855/6863/1 6856/6864/1 +f 6857/6865/1 6858/6866/1 6859/6867/1 6860/6868/1 +f 6861/6869/1 6862/6870/1 6863/6871/1 6864/6872/1 +f 6865/6873/1 6866/6874/1 6867/6875/1 6868/6876/1 +f 6869/6877/1 6870/6878/1 6871/6879/1 6872/6880/1 +f 6873/6881/1 6874/6882/1 6875/6883/1 6876/6884/1 +f 6877/6885/1 6878/6886/1 6879/6887/1 6880/6888/1 +f 6881/6889/1 6882/6890/1 6883/6891/1 6884/6892/1 +f 6885/6893/1 6886/6894/1 6887/6895/1 6888/6896/1 +f 6889/6897/1 6890/6898/1 6891/6899/1 6892/6900/1 +f 6893/6901/1 6894/6902/1 6895/6903/1 6896/6904/1 +f 6897/6905/1 6898/6906/1 6899/6907/1 6900/6908/1 +f 6901/6909/1 6902/6910/1 6903/6911/1 6904/6912/1 +f 6905/6913/1 6906/6914/1 6907/6915/1 6908/6916/1 +f 6909/6917/1 6910/6918/1 6911/6919/1 6912/6920/1 +f 6913/6921/1 6914/6922/1 6915/6923/1 6916/6924/1 +f 6917/6925/1 6918/6926/1 6919/6927/1 6920/6928/1 +f 6921/6929/1 6922/6930/1 6923/6931/1 6924/6932/1 +f 6925/6933/1 6926/6934/1 6927/6935/1 6928/6936/1 +f 6929/6937/1 6930/6938/1 6931/6939/1 6932/6940/1 +f 6933/6941/1 6934/6942/1 6935/6943/1 6936/6944/1 +f 6937/6945/1 6938/6946/1 6939/6947/1 6940/6948/1 +f 6941/6949/1 6942/6950/1 6943/6951/1 6944/6952/1 +f 6945/6953/1 6946/6954/1 6947/6955/1 6948/6956/1 +f 6949/6957/1 6950/6958/1 6951/6959/1 6952/6960/1 +f 6953/6961/1 6954/6962/1 6955/6963/1 6956/6964/1 +f 6957/6965/1 6958/6966/1 6959/6967/1 6960/6968/1 +f 6961/6969/1 6962/6970/1 6963/6971/1 6964/6972/1 +f 6965/6973/1 6966/6974/1 6967/6975/1 6968/6976/1 +f 6969/6977/1 6970/6978/1 6971/6979/1 6972/6980/1 +f 6973/6981/1 6974/6982/1 6975/6983/1 6976/6984/1 +f 6977/6985/1 6978/6986/1 6979/6987/1 6980/6988/1 +f 6981/6989/1 6982/6990/1 6983/6991/1 6984/6992/1 +f 6985/6993/1 6986/6994/1 6987/6995/1 6988/6996/1 +f 6989/6997/1 6990/6998/1 6991/6999/1 6992/7000/1 +f 6993/7001/1 6994/7002/1 6995/7003/1 6996/7004/1 +f 6997/7005/1 6998/7006/1 6999/7007/1 7000/7008/1 +f 7001/7009/1 7002/7010/1 7003/7011/1 7004/7012/1 +f 7005/7013/1 7006/7014/1 7007/7015/1 7008/7016/1 +f 7009/7017/1 7010/7018/1 7011/7019/1 7012/7020/1 +f 7013/7021/1 7014/7022/1 7015/7023/1 7016/7024/1 +f 7017/7025/1 7018/7026/1 7019/7027/1 7020/7028/1 +f 7021/7029/1 7022/7030/1 7023/7031/1 7024/7032/1 +f 7025/7033/1 7026/7034/1 7027/7035/1 7028/7036/1 +f 7029/7037/1 7030/7038/1 7031/7039/1 7032/7040/1 +f 7033/7041/1 7034/7042/1 7035/7043/1 7036/7044/1 +f 7037/7045/1 7038/7046/1 7039/7047/1 7040/7048/1 +f 7041/7049/1 7042/7050/1 7043/7051/1 7044/7052/1 +f 7045/7053/1 7046/7054/1 7047/7055/1 7048/7056/1 +f 7049/7057/1 7050/7058/1 7051/7059/1 7052/7060/1 +f 7053/7061/1 7054/7062/1 7055/7063/1 7056/7064/1 +f 7057/7065/1 7058/7066/1 7059/7067/1 7060/7068/1 +f 7061/7069/1 7062/7070/1 7063/7071/1 7064/7072/1 +f 7065/7073/1 7066/7074/1 7067/7075/1 7068/7076/1 +f 7069/7077/1 7070/7078/1 7071/7079/1 7072/7080/1 +f 7073/7081/1 7074/7082/1 7075/7083/1 7076/7084/1 +f 7077/7085/1 7078/7086/1 7079/7087/1 7080/7088/1 +f 7081/7089/1 7082/7090/1 7083/7091/1 7084/7092/1 +f 7085/7093/1 7086/7094/1 7087/7095/1 7088/7096/1 +f 7089/7097/1 7090/7098/1 7091/7099/1 7092/7100/1 +f 7093/7101/1 7094/7102/1 7095/7103/1 7096/7104/1 +f 7097/7105/1 7098/7106/1 7099/7107/1 7100/7108/1 +f 7101/7109/1 7102/7110/1 7103/7111/1 7104/7112/1 +f 7105/7113/1 7106/7114/1 7107/7115/1 7108/7116/1 +f 7109/7117/1 7110/7118/1 7111/7119/1 7112/7120/1 +f 7113/7121/1 7114/7122/1 7115/7123/1 7116/7124/1 +f 7117/7125/1 7118/7126/1 7119/7127/1 7120/7128/1 +f 7121/7129/1 7122/7130/1 7123/7131/1 7124/7132/1 +f 7125/7133/1 7126/7134/1 7127/7135/1 7128/7136/1 +f 7129/7137/1 7130/7138/1 7131/7139/1 7132/7140/1 +f 7133/7141/1 7134/7142/1 7135/7143/1 7136/7144/1 +f 7137/7145/1 7138/7146/1 7139/7147/1 7140/7148/1 +f 7141/7149/1 7142/7150/1 7143/7151/1 7144/7152/1 +f 7145/7153/1 7146/7154/1 7147/7155/1 7148/7156/1 +f 7149/7157/1 7150/7158/1 7151/7159/1 7152/7160/1 +f 7153/7161/1 7154/7162/1 7155/7163/1 7156/7164/1 +f 7157/7165/1 7158/7166/1 7159/7167/1 7160/7168/1 +f 7161/7169/1 7162/7170/1 7163/7171/1 7164/7172/1 +f 7165/7173/1 7166/7174/1 7167/7175/1 7168/7176/1 +f 7169/7177/1 7170/7178/1 7171/7179/1 7172/7180/1 +f 7173/7181/1 7174/7182/1 7175/7183/1 7176/7184/1 +f 7177/7185/1 7178/7186/1 7179/7187/1 7180/7188/1 +f 7181/7189/1 7182/7190/1 7183/7191/1 7184/7192/1 +f 7185/7193/1 7186/7194/1 7187/7195/1 7188/7196/1 +f 7189/7197/1 7190/7198/1 7191/7199/1 7192/7200/1 +f 7193/7201/1 7194/7202/1 7195/7203/1 7196/7204/1 +f 7197/7205/1 7198/7206/1 7199/7207/1 7200/7208/1 +f 7201/7209/1 7202/7210/1 7203/7211/1 7204/7212/1 +f 7205/7213/1 7206/7214/1 7207/7215/1 7208/7216/1 +f 7209/7217/1 7210/7218/1 7211/7219/1 7212/7220/1 +f 7213/7221/1 7214/7222/1 7215/7223/1 7216/7224/1 +f 7217/7225/1 7218/7226/1 7219/7227/1 7220/7228/1 +f 7221/7229/1 7222/7230/1 7223/7231/1 7224/7232/1 +f 7225/7233/1 7226/7234/1 7227/7235/1 7228/7236/1 +f 7229/7237/1 7230/7238/1 7231/7239/1 7232/7240/1 +f 7233/7241/1 7234/7242/1 7235/7243/1 7236/7244/1 +f 7237/7245/1 7238/7246/1 7239/7247/1 7240/7248/1 +f 7241/7249/1 7242/7250/1 7243/7251/1 7244/7252/1 +f 7245/7253/1 7246/7254/1 7247/7255/1 7248/7256/1 +f 7249/7257/1 7250/7258/1 7251/7259/1 7252/7260/1 +f 7253/7261/1 7254/7262/1 7255/7263/1 7256/7264/1 +f 7257/7265/1 7258/7266/1 7259/7267/1 7260/7268/1 +f 7261/7269/1 7262/7270/1 7263/7271/1 7264/7272/1 +f 7265/7273/1 7266/7274/1 7267/7275/1 7268/7276/1 +f 7269/7277/1 7270/7278/1 7271/7279/1 7272/7280/1 +f 7273/7281/1 7274/7282/1 7275/7283/1 7276/7284/1 +f 7277/7285/1 7278/7286/1 7279/7287/1 7280/7288/1 +f 7281/7289/1 7282/7290/1 7283/7291/1 7284/7292/1 +f 7285/7293/1 7286/7294/1 7287/7295/1 7288/7296/1 +f 7289/7297/1 7290/7298/1 7291/7299/1 7292/7300/1 +f 7293/7301/1 7294/7302/1 7295/7303/1 7296/7304/1 +f 7297/7305/1 7298/7306/1 7299/7307/1 7300/7308/1 +f 7301/7309/1 7302/7310/1 7303/7311/1 7304/7312/1 +f 7305/7313/1 7306/7314/1 7307/7315/1 7308/7316/1 +f 7309/7317/1 7310/7318/1 7311/7319/1 7312/7320/1 +f 7313/7321/1 7314/7322/1 7315/7323/1 7316/7324/1 +f 7317/7325/1 7318/7326/1 7319/7327/1 7320/7328/1 +f 7321/7329/1 7322/7330/1 7323/7331/1 7324/7332/1 +f 7325/7333/1 7326/7334/1 7327/7335/1 7328/7336/1 +f 7329/7337/1 7330/7338/1 7331/7339/1 7332/7340/1 +f 7333/7341/1 7334/7342/1 7335/7343/1 7336/7344/1 +f 7337/7345/1 7338/7346/1 7339/7347/1 7340/7348/1 +f 7341/7349/1 7342/7350/1 7343/7351/1 7344/7352/1 +f 7345/7353/1 7346/7354/1 7347/7355/1 7348/7356/1 +f 7349/7357/1 7350/7358/1 7351/7359/1 7352/7360/1 +f 7353/7361/1 7354/7362/1 7355/7363/1 7356/7364/1 +f 7357/7365/1 7358/7366/1 7359/7367/1 7360/7368/1 +f 7361/7369/1 7362/7370/1 7363/7371/1 7364/7372/1 +f 7365/7373/1 7366/7374/1 7367/7375/1 7368/7376/1 +f 7369/7377/1 7370/7378/1 7371/7379/1 7372/7380/1 +f 7373/7381/1 7374/7382/1 7375/7383/1 7376/7384/1 +f 7377/7385/1 7378/7386/1 7379/7387/1 7380/7388/1 +f 7381/7389/1 7382/7390/1 7383/7391/1 7384/7392/1 +f 7385/7393/1 7386/7394/1 7387/7395/1 7388/7396/1 +f 7389/7397/1 7390/7398/1 7391/7399/1 7392/7400/1 +f 7393/7401/1 7394/7402/1 7395/7403/1 7396/7404/1 +f 7397/7405/1 7398/7406/1 7399/7407/1 7400/7408/1 +f 7401/7409/1 7402/7410/1 7403/7411/1 7404/7412/1 +f 7405/7413/1 7406/7414/1 7407/7415/1 7408/7416/1 +f 7409/7417/1 7410/7418/1 7411/7419/1 7412/7420/1 +f 7413/7421/1 7414/7422/1 7415/7423/1 7416/7424/1 +f 7417/7425/1 7418/7426/1 7419/7427/1 7420/7428/1 +f 7421/7429/1 7422/7430/1 7423/7431/1 7424/7432/1 +f 7425/7433/1 7426/7434/1 7427/7435/1 7428/7436/1 +f 7429/7437/1 7430/7438/1 7431/7439/1 7432/7440/1 +f 7433/7441/1 7434/7442/1 7435/7443/1 7436/7444/1 +f 7437/7445/1 7438/7446/1 7439/7447/1 7440/7448/1 +f 7441/7449/1 7442/7450/1 7443/7451/1 7444/7452/1 +f 7445/7453/1 7446/7454/1 7447/7455/1 7448/7456/1 +f 7449/7457/1 7450/7458/1 7451/7459/1 7452/7460/1 +f 7453/7461/1 7454/7462/1 7455/7463/1 7456/7464/1 +f 7457/7465/1 7458/7466/1 7459/7467/1 7460/7468/1 +f 7461/7469/1 7462/7470/1 7463/7471/1 7464/7472/1 +f 7465/7473/1 7466/7474/1 7467/7475/1 7468/7476/1 +f 7469/7477/1 7470/7478/1 7471/7479/1 7472/7480/1 +f 7473/7481/1 7474/7482/1 7475/7483/1 7476/7484/1 +f 7477/7485/1 7478/7486/1 7479/7487/1 7480/7488/1 +f 7481/7489/1 7482/7490/1 7483/7491/1 7484/7492/1 +f 7485/7493/1 7486/7494/1 7487/7495/1 7488/7496/1 +f 7489/7497/1 7490/7498/1 7491/7499/1 7492/7500/1 +f 7493/7501/1 7494/7502/1 7495/7503/1 7496/7504/1 +f 7497/7505/1 7498/7506/1 7499/7507/1 7500/7508/1 +f 7501/7509/1 7502/7510/1 7503/7511/1 7504/7512/1 +f 7505/7513/1 7506/7514/1 7507/7515/1 7508/7516/1 +f 7509/7517/1 7510/7518/1 7511/7519/1 7512/7520/1 +f 7513/7521/1 7514/7522/1 7515/7523/1 7516/7524/1 +f 7517/7525/1 7518/7526/1 7519/7527/1 7520/7528/1 +f 7521/7529/1 7522/7530/1 7523/7531/1 7524/7532/1 +f 7525/7533/1 7526/7534/1 7527/7535/1 7528/7536/1 +f 7529/7537/1 7530/7538/1 7531/7539/1 7532/7540/1 +f 7533/7541/1 7534/7542/1 7535/7543/1 7536/7544/1 +f 7537/7545/1 7538/7546/1 7539/7547/1 7540/7548/1 +f 7541/7549/1 7542/7550/1 7543/7551/1 7544/7552/1 +f 7545/7553/1 7546/7554/1 7547/7555/1 7548/7556/1 +f 7549/7557/1 7550/7558/1 7551/7559/1 7552/7560/1 +f 7553/7561/1 7554/7562/1 7555/7563/1 7556/7564/1 +f 7557/7565/1 7558/7566/1 7559/7567/1 7560/7568/1 +f 7561/7569/1 7562/7570/1 7563/7571/1 7564/7572/1 +f 7565/7573/1 7566/7574/1 7567/7575/1 7568/7576/1 +f 7569/7577/1 7570/7578/1 7571/7579/1 7572/7580/1 +f 7573/7581/1 7574/7582/1 7575/7583/1 7576/7584/1 +f 7577/7585/1 7578/7586/1 7579/7587/1 7580/7588/1 +f 7581/7589/1 7582/7590/1 7583/7591/1 7584/7592/1 +f 7585/7593/1 7586/7594/1 7587/7595/1 7588/7596/1 +f 7589/7597/1 7590/7598/1 7591/7599/1 7592/7600/1 +f 7593/7601/1 7594/7602/1 7595/7603/1 7596/7604/1 +f 7597/7605/1 7598/7606/1 7599/7607/1 7600/7608/1 +f 7601/7609/1 7602/7610/1 7603/7611/1 7604/7612/1 +f 7605/7613/1 7606/7614/1 7607/7615/1 7608/7616/1 +f 7609/7617/1 7610/7618/1 7611/7619/1 7612/7620/1 +f 7613/7621/1 7614/7622/1 7615/7623/1 7616/7624/1 +f 7617/7625/1 7618/7626/1 7619/7627/1 7620/7628/1 +f 7621/7629/1 7622/7630/1 7623/7631/1 7624/7632/1 +f 7625/7633/1 7626/7634/1 7627/7635/1 7628/7636/1 +f 7629/7637/1 7630/7638/1 7631/7639/1 7632/7640/1 +f 7633/7641/1 7634/7642/1 7635/7643/1 7636/7644/1 +f 7637/7645/1 7638/7646/1 7639/7647/1 7640/7648/1 +f 7641/7649/1 7642/7650/1 7643/7651/1 7644/7652/1 +f 7645/7653/1 7646/7654/1 7647/7655/1 7648/7656/1 +f 7649/7657/1 7650/7658/1 7651/7659/1 7652/7660/1 +f 7653/7661/1 7654/7662/1 7655/7663/1 7656/7664/1 +f 7657/7665/1 7658/7666/1 7659/7667/1 7660/7668/1 +f 7661/7669/1 7662/7670/1 7663/7671/1 7664/7672/1 +f 7665/7673/1 7666/7674/1 7667/7675/1 7668/7676/1 +f 7669/7677/1 7670/7678/1 7671/7679/1 7672/7680/1 +f 7673/7681/1 7674/7682/1 7675/7683/1 7676/7684/1 +f 7677/7685/1 7678/7686/1 7679/7687/1 7680/7688/1 +f 7681/7689/1 7682/7690/1 7683/7691/1 7684/7692/1 +f 7685/7693/1 7686/7694/1 7687/7695/1 7688/7696/1 +f 7689/7697/1 7690/7698/1 7691/7699/1 7692/7700/1 +f 7693/7701/1 7694/7702/1 7695/7703/1 7696/7704/1 +f 7697/7705/1 7698/7706/1 7699/7707/1 7700/7708/1 +f 7701/7709/1 7702/7710/1 7703/7711/1 7704/7712/1 +f 7705/7713/1 7706/7714/1 7707/7715/1 7708/7716/1 +f 7709/7717/1 7710/7718/1 7711/7719/1 7712/7720/1 +f 7713/7721/1 7714/7722/1 7715/7723/1 7716/7724/1 +f 7717/7725/1 7718/7726/1 7719/7727/1 7720/7728/1 +f 7721/7729/1 7722/7730/1 7723/7731/1 7724/7732/1 +f 7725/7733/1 7726/7734/1 7727/7735/1 7728/7736/1 +f 7729/7737/1 7730/7738/1 7731/7739/1 7732/7740/1 +f 7733/7741/1 7734/7742/1 7735/7743/1 7736/7744/1 +f 7737/7745/1 7738/7746/1 7739/7747/1 7740/7748/1 +f 7741/7749/1 7742/7750/1 7743/7751/1 7744/7752/1 +f 7745/7753/1 7746/7754/1 7747/7755/1 7748/7756/1 +f 7749/7757/1 7750/7758/1 7751/7759/1 7752/7760/1 +f 7753/7761/1 7754/7762/1 7755/7763/1 7756/7764/1 +f 7757/7765/1 7758/7766/1 7759/7767/1 7760/7768/1 +f 7761/7769/1 7762/7770/1 7763/7771/1 7764/7772/1 +f 7765/7773/1 7766/7774/1 7767/7775/1 7768/7776/1 +f 7769/7777/1 7770/7778/1 7771/7779/1 7772/7780/1 +f 7773/7781/1 7774/7782/1 7775/7783/1 7776/7784/1 +f 7777/7785/1 7778/7786/1 7779/7787/1 7780/7788/1 +f 7781/7789/1 7782/7790/1 7783/7791/1 7784/7792/1 +f 7785/7793/1 7786/7794/1 7787/7795/1 7788/7796/1 +f 7789/7797/1 7790/7798/1 7791/7799/1 7792/7800/1 +f 7793/7801/1 7794/7802/1 7795/7803/1 7796/7804/1 +f 7797/7805/1 7798/7806/1 7799/7807/1 7800/7808/1 +f 7801/7809/1 7802/7810/1 7803/7811/1 7804/7812/1 +f 7805/7813/1 7806/7814/1 7807/7815/1 7808/7816/1 +f 7809/7817/1 7810/7818/1 7811/7819/1 7812/7820/1 +f 7813/7821/1 7814/7822/1 7815/7823/1 7816/7824/1 +f 7817/7825/1 7818/7826/1 7819/7827/1 7820/7828/1 +f 7821/7829/1 7822/7830/1 7823/7831/1 7824/7832/1 +f 7825/7833/1 7826/7834/1 7827/7835/1 7828/7836/1 +f 7829/7837/1 7830/7838/1 7831/7839/1 7832/7840/1 +f 7833/7841/1 7834/7842/1 7835/7843/1 7836/7844/1 +f 7837/7845/1 7838/7846/1 7839/7847/1 7840/7848/1 +f 7841/7849/1 7842/7850/1 7843/7851/1 7844/7852/1 +f 7845/7853/1 7846/7854/1 7847/7855/1 7848/7856/1 +f 7849/7857/1 7850/7858/1 7851/7859/1 7852/7860/1 +f 7853/7861/1 7854/7862/1 7855/7863/1 7856/7864/1 +f 7857/7865/1 7858/7866/1 7859/7867/1 7860/7868/1 +f 7861/7869/1 7862/7870/1 7863/7871/1 7864/7872/1 +f 7865/7873/1 7866/7874/1 7867/7875/1 7868/7876/1 +f 7869/7877/1 7870/7878/1 7871/7879/1 7872/7880/1 +f 7873/7881/1 7874/7882/1 7875/7883/1 7876/7884/1 +f 7877/7885/1 7878/7886/1 7879/7887/1 7880/7888/1 +f 7881/7889/1 7882/7890/1 7883/7891/1 7884/7892/1 +f 7885/7893/1 7886/7894/1 7887/7895/1 7888/7896/1 +f 7889/7897/1 7890/7898/1 7891/7899/1 7892/7900/1 +f 7893/7901/1 7894/7902/1 7895/7903/1 7896/7904/1 +f 7897/7905/1 7898/7906/1 7899/7907/1 7900/7908/1 +f 7901/7909/1 7902/7910/1 7903/7911/1 7904/7912/1 +f 7905/7913/1 7906/7914/1 7907/7915/1 7908/7916/1 +f 7909/7917/1 7910/7918/1 7911/7919/1 7912/7920/1 +f 7913/7921/1 7914/7922/1 7915/7923/1 7916/7924/1 +f 7917/7925/1 7918/7926/1 7919/7927/1 7920/7928/1 +f 7921/7929/1 7922/7930/1 7923/7931/1 7924/7932/1 +f 7925/7933/1 7926/7934/1 7927/7935/1 7928/7936/1 +f 7929/7937/1 7930/7938/1 7931/7939/1 7932/7940/1 +f 7933/7941/1 7934/7942/1 7935/7943/1 7936/7944/1 +f 7937/7945/1 7938/7946/1 7939/7947/1 7940/7948/1 +f 7941/7949/1 7942/7950/1 7943/7951/1 7944/7952/1 +f 7945/7953/1 7946/7954/1 7947/7955/1 7948/7956/1 +f 7949/7957/1 7950/7958/1 7951/7959/1 7952/7960/1 +f 7953/7961/1 7954/7962/1 7955/7963/1 7956/7964/1 +f 7957/7965/1 7958/7966/1 7959/7967/1 7960/7968/1 +f 7961/7969/1 7962/7970/1 7963/7971/1 7964/7972/1 +f 7965/7973/1 7966/7974/1 7967/7975/1 7968/7976/1 +f 7969/7977/1 7970/7978/1 7971/7979/1 7972/7980/1 +f 7973/7981/1 7974/7982/1 7975/7983/1 7976/7984/1 +f 7977/7985/1 7978/7986/1 7979/7987/1 7980/7988/1 +f 7981/7989/1 7982/7990/1 7983/7991/1 7984/7992/1 +f 7985/7993/1 7986/7994/1 7987/7995/1 7988/7996/1 +f 7989/7997/1 7990/7998/1 7991/7999/1 7992/8000/1 +f 7993/8001/1 7994/8002/1 7995/8003/1 7996/8004/1 +f 7997/8005/1 7998/8006/1 7999/8007/1 8000/8008/1 +f 8001/8009/1 8002/8010/1 8003/8011/1 8004/8012/1 +f 8005/8013/1 8006/8014/1 8007/8015/1 8008/8016/1 +f 8009/8017/1 8010/8018/1 8011/8019/1 8012/8020/1 +f 8013/8021/1 8014/8022/1 8015/8023/1 8016/8024/1 +f 8017/8025/1 8018/8026/1 8019/8027/1 8020/8028/1 +f 8021/8029/1 8022/8030/1 8023/8031/1 8024/8032/1 +f 8025/8033/1 8026/8034/1 8027/8035/1 8028/8036/1 +f 8029/8037/1 8030/8038/1 8031/8039/1 8032/8040/1 +f 8033/8041/1 8034/8042/1 8035/8043/1 8036/8044/1 +f 8037/8045/1 8038/8046/1 8039/8047/1 8040/8048/1 +f 8041/8049/1 8042/8050/1 8043/8051/1 8044/8052/1 +f 8045/8053/1 8046/8054/1 8047/8055/1 8048/8056/1 +f 8049/8057/1 8050/8058/1 8051/8059/1 8052/8060/1 +f 8053/8061/1 8054/8062/1 8055/8063/1 8056/8064/1 +f 8057/8065/1 8058/8066/1 8059/8067/1 8060/8068/1 +f 8061/8069/1 8062/8070/1 8063/8071/1 8064/8072/1 +f 8065/8073/1 8066/8074/1 8067/8075/1 8068/8076/1 +f 8069/8077/1 8070/8078/1 8071/8079/1 8072/8080/1 +f 8073/8081/1 8074/8082/1 8075/8083/1 8076/8084/1 +f 8077/8085/1 8078/8086/1 8079/8087/1 8080/8088/1 +f 8081/8089/1 8082/8090/1 8083/8091/1 8084/8092/1 +f 8085/8093/1 8086/8094/1 8087/8095/1 8088/8096/1 +f 8089/8097/1 8090/8098/1 8091/8099/1 8092/8100/1 +f 8093/8101/1 8094/8102/1 8095/8103/1 8096/8104/1 +f 8097/8105/1 8098/8106/1 8099/8107/1 8100/8108/1 +f 8101/8109/1 8102/8110/1 8103/8111/1 8104/8112/1 +f 8105/8113/1 8106/8114/1 8107/8115/1 8108/8116/1 +f 8109/8117/1 8110/8118/1 8111/8119/1 8112/8120/1 +f 8113/8121/1 8114/8122/1 8115/8123/1 8116/8124/1 +f 8117/8125/1 8118/8126/1 8119/8127/1 8120/8128/1 +f 8121/8129/1 8122/8130/1 8123/8131/1 8124/8132/1 +f 8125/8133/1 8126/8134/1 8127/8135/1 8128/8136/1 +f 8129/8137/1 8130/8138/1 8131/8139/1 8132/8140/1 +f 8133/8141/1 8134/8142/1 8135/8143/1 8136/8144/1 +f 8137/8145/1 8138/8146/1 8139/8147/1 8140/8148/1 +f 8141/8149/1 8142/8150/1 8143/8151/1 8144/8152/1 +f 8145/8153/1 8146/8154/1 8147/8155/1 8148/8156/1 +f 8149/8157/1 8150/8158/1 8151/8159/1 8152/8160/1 +f 8153/8161/1 8154/8162/1 8155/8163/1 8156/8164/1 +f 8157/8165/1 8158/8166/1 8159/8167/1 8160/8168/1 +f 8161/8169/1 8162/8170/1 8163/8171/1 8164/8172/1 +f 8165/8173/1 8166/8174/1 8167/8175/1 8168/8176/1 +f 8169/8177/1 8170/8178/1 8171/8179/1 8172/8180/1 +f 8173/8181/1 8174/8182/1 8175/8183/1 8176/8184/1 +f 8177/8185/1 8178/8186/1 8179/8187/1 8180/8188/1 +f 8181/8189/1 8182/8190/1 8183/8191/1 8184/8192/1 +f 8185/8193/1 8186/8194/1 8187/8195/1 8188/8196/1 +f 8189/8197/1 8190/8198/1 8191/8199/1 8192/8200/1 +f 8193/8201/1 8194/8202/1 8195/8203/1 8196/8204/1 +f 8197/8205/1 8198/8206/1 8199/8207/1 8200/8208/1 +f 8201/8209/1 8202/8210/1 8203/8211/1 8204/8212/1 +f 8205/8213/1 8206/8214/1 8207/8215/1 8208/8216/1 +f 8209/8217/1 8210/8218/1 8211/8219/1 8212/8220/1 +f 8213/8221/1 8214/8222/1 8215/8223/1 8216/8224/1 +f 8217/8225/1 8218/8226/1 8219/8227/1 8220/8228/1 +f 8221/8229/1 8222/8230/1 8223/8231/1 8224/8232/1 +f 8225/8233/1 8226/8234/1 8227/8235/1 8228/8236/1 +f 8229/8237/1 8230/8238/1 8231/8239/1 8232/8240/1 +f 8233/8241/1 8234/8242/1 8235/8243/1 8236/8244/1 +f 8237/8245/1 8238/8246/1 8239/8247/1 8240/8248/1 +f 8241/8249/1 8242/8250/1 8243/8251/1 8244/8252/1 +f 8245/8253/1 8246/8254/1 8247/8255/1 8248/8256/1 +f 8249/8257/1 8250/8258/1 8251/8259/1 8252/8260/1 +f 8253/8261/1 8254/8262/1 8255/8263/1 8256/8264/1 +f 8257/8265/1 8258/8266/1 8259/8267/1 8260/8268/1 +f 8261/8269/1 8262/8270/1 8263/8271/1 8264/8272/1 +f 8265/8273/1 8266/8274/1 8267/8275/1 8268/8276/1 +f 8269/8277/1 8270/8278/1 8271/8279/1 8272/8280/1 +f 8273/8281/1 8274/8282/1 8275/8283/1 8276/8284/1 +f 8277/8285/1 8278/8286/1 8279/8287/1 8280/8288/1 +f 8281/8289/1 8282/8290/1 8283/8291/1 8284/8292/1 +f 8285/8293/1 8286/8294/1 8287/8295/1 8288/8296/1 +f 8289/8297/1 8290/8298/1 8291/8299/1 8292/8300/1 +f 8293/8301/1 8294/8302/1 8295/8303/1 8296/8304/1 +f 8297/8305/1 8298/8306/1 8299/8307/1 8300/8308/1 +f 8301/8309/1 8302/8310/1 8303/8311/1 8304/8312/1 +f 8305/8313/1 8306/8314/1 8307/8315/1 8308/8316/1 +f 8309/8317/1 8310/8318/1 8311/8319/1 8312/8320/1 +f 8313/8321/1 8314/8322/1 8315/8323/1 8316/8324/1 +f 8317/8325/1 8318/8326/1 8319/8327/1 8320/8328/1 +f 8321/8329/1 8322/8330/1 8323/8331/1 8324/8332/1 +f 8325/8333/1 8326/8334/1 8327/8335/1 8328/8336/1 +f 8329/8337/1 8330/8338/1 8331/8339/1 8332/8340/1 +f 8333/8341/1 8334/8342/1 8335/8343/1 8336/8344/1 +f 8337/8345/1 8338/8346/1 8339/8347/1 8340/8348/1 +f 8341/8349/1 8342/8350/1 8343/8351/1 8344/8352/1 +f 8345/8353/1 8346/8354/1 8347/8355/1 8348/8356/1 +f 8349/8357/1 8350/8358/1 8351/8359/1 8352/8360/1 +f 8353/8361/1 8354/8362/1 8355/8363/1 8356/8364/1 +f 8357/8365/1 8358/8366/1 8359/8367/1 8360/8368/1 +f 8361/8369/1 8362/8370/1 8363/8371/1 8364/8372/1 +f 8365/8373/1 8366/8374/1 8367/8375/1 8368/8376/1 +f 8369/8377/1 8370/8378/1 8371/8379/1 8372/8380/1 +f 8373/8381/1 8374/8382/1 8375/8383/1 8376/8384/1 +f 8377/8385/1 8378/8386/1 8379/8387/1 8380/8388/1 +f 8381/8389/1 8382/8390/1 8383/8391/1 8384/8392/1 +f 8385/8393/1 8386/8394/1 8387/8395/1 8388/8396/1 +f 8389/8397/1 8390/8398/1 8391/8399/1 8392/8400/1 +f 8393/8401/1 8394/8402/1 8395/8403/1 8396/8404/1 +f 8397/8405/1 8398/8406/1 8399/8407/1 8400/8408/1 +f 8401/8409/1 8402/8410/1 8403/8411/1 8404/8412/1 +f 8405/8413/1 8406/8414/1 8407/8415/1 8408/8416/1 +f 8409/8417/1 8410/8418/1 8411/8419/1 8412/8420/1 +f 8413/8421/1 8414/8422/1 8415/8423/1 8416/8424/1 +f 8417/8425/1 8418/8426/1 8419/8427/1 8420/8428/1 +f 8421/8429/1 8422/8430/1 8423/8431/1 8424/8432/1 +f 8425/8433/1 8426/8434/1 8427/8435/1 8428/8436/1 +f 8429/8437/1 8430/8438/1 8431/8439/1 8432/8440/1 +f 8433/8441/1 8434/8442/1 8435/8443/1 8436/8444/1 +f 8437/8445/1 8438/8446/1 8439/8447/1 8440/8448/1 +f 8441/8449/1 8442/8450/1 8443/8451/1 8444/8452/1 +f 8445/8453/1 8446/8454/1 8447/8455/1 8448/8456/1 +f 8449/8457/1 8450/8458/1 8451/8459/1 8452/8460/1 +f 8453/8461/1 8454/8462/1 8455/8463/1 8456/8464/1 +f 8457/8465/1 8458/8466/1 8459/8467/1 8460/8468/1 +f 8461/8469/1 8462/8470/1 8463/8471/1 8464/8472/1 +f 8465/8473/1 8466/8474/1 8467/8475/1 8468/8476/1 +f 8469/8477/1 8470/8478/1 8471/8479/1 8472/8480/1 +f 8473/8481/1 8474/8482/1 8475/8483/1 8476/8484/1 +f 8477/8485/1 8478/8486/1 8479/8487/1 8480/8488/1 +f 8481/8489/1 8482/8490/1 8483/8491/1 8484/8492/1 +f 8485/8493/1 8486/8494/1 8487/8495/1 8488/8496/1 +f 8489/8497/1 8490/8498/1 8491/8499/1 8492/8500/1 +f 8493/8501/1 8494/8502/1 8495/8503/1 8496/8504/1 +f 8497/8505/1 8498/8506/1 8499/8507/1 8500/8508/1 +f 8501/8509/1 8502/8510/1 8503/8511/1 8504/8512/1 +f 8505/8513/1 8506/8514/1 8507/8515/1 8508/8516/1 +f 8509/8517/1 8510/8518/1 8511/8519/1 8512/8520/1 +f 8513/8521/1 8514/8522/1 8515/8523/1 8516/8524/1 +f 8517/8525/1 8518/8526/1 8519/8527/1 8520/8528/1 +f 8521/8529/1 8522/8530/1 8523/8531/1 8524/8532/1 +f 8525/8533/1 8526/8534/1 8527/8535/1 8528/8536/1 +f 8529/8537/1 8530/8538/1 8531/8539/1 8532/8540/1 +f 8533/8541/1 8534/8542/1 8535/8543/1 8536/8544/1 +f 8537/8545/1 8538/8546/1 8539/8547/1 8540/8548/1 +f 8541/8549/1 8542/8550/1 8543/8551/1 8544/8552/1 +f 8545/8553/1 8546/8554/1 8547/8555/1 8548/8556/1 +f 8549/8557/1 8550/8558/1 8551/8559/1 8552/8560/1 +f 8553/8561/1 8554/8562/1 8555/8563/1 8556/8564/1 +f 8557/8565/1 8558/8566/1 8559/8567/1 8560/8568/1 +f 8561/8569/1 8562/8570/1 8563/8571/1 8564/8572/1 +f 8565/8573/1 8566/8574/1 8567/8575/1 8568/8576/1 +f 8569/8577/1 8570/8578/1 8571/8579/1 8572/8580/1 +f 8573/8581/1 8574/8582/1 8575/8583/1 8576/8584/1 +f 8577/8585/1 8578/8586/1 8579/8587/1 8580/8588/1 +f 8581/8589/1 8582/8590/1 8583/8591/1 8584/8592/1 +f 8585/8593/1 8586/8594/1 8587/8595/1 8588/8596/1 +f 8589/8597/1 8590/8598/1 8591/8599/1 8592/8600/1 +f 8593/8601/1 8594/8602/1 8595/8603/1 8596/8604/1 +f 8597/8605/1 8598/8606/1 8599/8607/1 8600/8608/1 +f 8601/8609/1 8602/8610/1 8603/8611/1 8604/8612/1 +f 8605/8613/1 8606/8614/1 8607/8615/1 8608/8616/1 +f 8609/8617/1 8610/8618/1 8611/8619/1 8612/8620/1 +f 8613/8621/1 8614/8622/1 8615/8623/1 8616/8624/1 +f 8617/8625/1 8618/8626/1 8619/8627/1 8620/8628/1 +f 8621/8629/1 8622/8630/1 8623/8631/1 8624/8632/1 +f 8625/8633/1 8626/8634/1 8627/8635/1 8628/8636/1 +f 8629/8637/1 8630/8638/1 8631/8639/1 8632/8640/1 +f 8633/8641/1 8634/8642/1 8635/8643/1 8636/8644/1 +f 8637/8645/1 8638/8646/1 8639/8647/1 8640/8648/1 +f 8641/8649/1 8642/8650/1 8643/8651/1 8644/8652/1 +f 8645/8653/1 8646/8654/1 8647/8655/1 8648/8656/1 +f 8649/8657/1 8650/8658/1 8651/8659/1 8652/8660/1 +f 8653/8661/1 8654/8662/1 8655/8663/1 8656/8664/1 +f 8657/8665/1 8658/8666/1 8659/8667/1 8660/8668/1 +f 8661/8669/1 8662/8670/1 8663/8671/1 8664/8672/1 +f 8665/8673/1 8666/8674/1 8667/8675/1 8668/8676/1 +f 8669/8677/1 8670/8678/1 8671/8679/1 8672/8680/1 +f 8673/8681/1 8674/8682/1 8675/8683/1 8676/8684/1 +f 8677/8685/1 8678/8686/1 8679/8687/1 8680/8688/1 +f 8681/8689/1 8682/8690/1 8683/8691/1 8684/8692/1 +f 8685/8693/1 8686/8694/1 8687/8695/1 8688/8696/1 +f 8689/8697/1 8690/8698/1 8691/8699/1 8692/8700/1 +f 8693/8701/1 8694/8702/1 8695/8703/1 8696/8704/1 +f 8697/8705/1 8698/8706/1 8699/8707/1 8700/8708/1 +f 8701/8709/1 8702/8710/1 8703/8711/1 8704/8712/1 +f 8705/8713/1 8706/8714/1 8707/8715/1 8708/8716/1 +f 8709/8717/1 8710/8718/1 8711/8719/1 8712/8720/1 +f 8713/8721/1 8714/8722/1 8715/8723/1 8716/8724/1 +f 8717/8725/1 8718/8726/1 8719/8727/1 8720/8728/1 +f 8721/8729/1 8722/8730/1 8723/8731/1 8724/8732/1 +f 8725/8733/1 8726/8734/1 8727/8735/1 8728/8736/1 +f 8729/8737/1 8730/8738/1 8731/8739/1 8732/8740/1 +f 8733/8741/1 8734/8742/1 8735/8743/1 8736/8744/1 +f 8737/8745/1 8738/8746/1 8739/8747/1 8740/8748/1 +f 8741/8749/1 8742/8750/1 8743/8751/1 8744/8752/1 +f 8745/8753/1 8746/8754/1 8747/8755/1 8748/8756/1 +f 8749/8757/1 8750/8758/1 8751/8759/1 8752/8760/1 +f 8753/8761/1 8754/8762/1 8755/8763/1 8756/8764/1 +f 8757/8765/1 8758/8766/1 8759/8767/1 8760/8768/1 +f 8761/8769/1 8762/8770/1 8763/8771/1 8764/8772/1 +f 8765/8773/1 8766/8774/1 8767/8775/1 8768/8776/1 +f 8769/8777/1 8770/8778/1 8771/8779/1 8772/8780/1 +f 8773/8781/1 8774/8782/1 8775/8783/1 8776/8784/1 +f 8777/8785/1 8778/8786/1 8779/8787/1 8780/8788/1 +f 8781/8789/1 8782/8790/1 8783/8791/1 8784/8792/1 +f 8785/8793/1 8786/8794/1 8787/8795/1 8788/8796/1 +f 8789/8797/1 8790/8798/1 8791/8799/1 8792/8800/1 +f 8793/8801/1 8794/8802/1 8795/8803/1 8796/8804/1 +f 8797/8805/1 8798/8806/1 8799/8807/1 8800/8808/1 +f 8801/8809/1 8802/8810/1 8803/8811/1 8804/8812/1 +f 8805/8813/1 8806/8814/1 8807/8815/1 8808/8816/1 +f 8809/8817/1 8810/8818/1 8811/8819/1 8812/8820/1 +f 8813/8821/1 8814/8822/1 8815/8823/1 8816/8824/1 +f 8817/8825/1 8818/8826/1 8819/8827/1 8820/8828/1 +f 8821/8829/1 8822/8830/1 8823/8831/1 8824/8832/1 +f 8825/8833/1 8826/8834/1 8827/8835/1 8828/8836/1 +f 8829/8837/1 8830/8838/1 8831/8839/1 8832/8840/1 +f 8833/8841/1 8834/8842/1 8835/8843/1 8836/8844/1 +f 8837/8845/1 8838/8846/1 8839/8847/1 8840/8848/1 +f 8841/8849/1 8842/8850/1 8843/8851/1 8844/8852/1 +f 8845/8853/1 8846/8854/1 8847/8855/1 8848/8856/1 +f 8849/8857/1 8850/8858/1 8851/8859/1 8852/8860/1 +f 8853/8861/1 8854/8862/1 8855/8863/1 8856/8864/1 +f 8857/8865/1 8858/8866/1 8859/8867/1 8860/8868/1 +f 8861/8869/1 8862/8870/1 8863/8871/1 8864/8872/1 +f 8865/8873/1 8866/8874/1 8867/8875/1 8868/8876/1 +f 8869/8877/1 8870/8878/1 8871/8879/1 8872/8880/1 +f 8873/8881/1 8874/8882/1 8875/8883/1 8876/8884/1 +f 8877/8885/1 8878/8886/1 8879/8887/1 8880/8888/1 +f 8881/8889/1 8882/8890/1 8883/8891/1 8884/8892/1 +f 8885/8893/1 8886/8894/1 8887/8895/1 8888/8896/1 +f 8889/8897/1 8890/8898/1 8891/8899/1 8892/8900/1 +f 8893/8901/1 8894/8902/1 8895/8903/1 8896/8904/1 +f 8897/8905/1 8898/8906/1 8899/8907/1 8900/8908/1 +f 8901/8909/1 8902/8910/1 8903/8911/1 8904/8912/1 +f 8905/8913/1 8906/8914/1 8907/8915/1 8908/8916/1 +f 8909/8917/1 8910/8918/1 8911/8919/1 8912/8920/1 +f 8913/8921/1 8914/8922/1 8915/8923/1 8916/8924/1 +f 8917/8925/1 8918/8926/1 8919/8927/1 8920/8928/1 +f 8921/8929/1 8922/8930/1 8923/8931/1 8924/8932/1 +f 8925/8933/1 8926/8934/1 8927/8935/1 8928/8936/1 +f 8929/8937/1 8930/8938/1 8931/8939/1 8932/8940/1 +f 8933/8941/1 8934/8942/1 8935/8943/1 8936/8944/1 +f 8937/8945/1 8938/8946/1 8939/8947/1 8940/8948/1 +f 8941/8949/1 8942/8950/1 8943/8951/1 8944/8952/1 +f 8945/8953/1 8946/8954/1 8947/8955/1 8948/8956/1 +f 8949/8957/1 8950/8958/1 8951/8959/1 8952/8960/1 +f 8953/8961/1 8954/8962/1 8955/8963/1 8956/8964/1 +f 8957/8965/1 8958/8966/1 8959/8967/1 8960/8968/1 +f 8961/8969/1 8962/8970/1 8963/8971/1 8964/8972/1 +f 8965/8973/1 8966/8974/1 8967/8975/1 8968/8976/1 +f 8969/8977/1 8970/8978/1 8971/8979/1 8972/8980/1 +f 8973/8981/1 8974/8982/1 8975/8983/1 8976/8984/1 +f 8977/8985/1 8978/8986/1 8979/8987/1 8980/8988/1 +f 8981/8989/1 8982/8990/1 8983/8991/1 8984/8992/1 +f 8985/8993/1 8986/8994/1 8987/8995/1 8988/8996/1 +f 8989/8997/1 8990/8998/1 8991/8999/1 8992/9000/1 +f 8993/9001/1 8994/9002/1 8995/9003/1 8996/9004/1 +f 8997/9005/1 8998/9006/1 8999/9007/1 9000/9008/1 +f 9001/9009/1 9002/9010/1 9003/9011/1 9004/9012/1 +f 9005/9013/1 9006/9014/1 9007/9015/1 9008/9016/1 +f 9009/9017/1 9010/9018/1 9011/9019/1 9012/9020/1 +f 9013/9021/1 9014/9022/1 9015/9023/1 9016/9024/1 +f 9017/9025/1 9018/9026/1 9019/9027/1 9020/9028/1 +f 9021/9029/1 9022/9030/1 9023/9031/1 9024/9032/1 +f 9025/9033/1 9026/9034/1 9027/9035/1 9028/9036/1 +f 9029/9037/1 9030/9038/1 9031/9039/1 9032/9040/1 +f 9033/9041/1 9034/9042/1 9035/9043/1 9036/9044/1 +f 9037/9045/1 9038/9046/1 9039/9047/1 9040/9048/1 +f 9041/9049/1 9042/9050/1 9043/9051/1 9044/9052/1 +f 9045/9053/1 9046/9054/1 9047/9055/1 9048/9056/1 +f 9049/9057/1 9050/9058/1 9051/9059/1 9052/9060/1 +f 9053/9061/1 9054/9062/1 9055/9063/1 9056/9064/1 +f 9057/9065/1 9058/9066/1 9059/9067/1 9060/9068/1 +f 9061/9069/1 9062/9070/1 9063/9071/1 9064/9072/1 +f 9065/9073/1 9066/9074/1 9067/9075/1 9068/9076/1 +f 9069/9077/1 9070/9078/1 9071/9079/1 9072/9080/1 +f 9073/9081/1 9074/9082/1 9075/9083/1 9076/9084/1 +f 9077/9085/1 9078/9086/1 9079/9087/1 9080/9088/1 +f 9081/9089/1 9082/9090/1 9083/9091/1 9084/9092/1 +f 9085/9093/1 9086/9094/1 9087/9095/1 9088/9096/1 +f 9089/9097/1 9090/9098/1 9091/9099/1 9092/9100/1 +f 9093/9101/1 9094/9102/1 9095/9103/1 9096/9104/1 +f 9097/9105/1 9098/9106/1 9099/9107/1 9100/9108/1 +f 9101/9109/1 9102/9110/1 9103/9111/1 9104/9112/1 +f 9105/9113/1 9106/9114/1 9107/9115/1 9108/9116/1 +f 9109/9117/1 9110/9118/1 9111/9119/1 9112/9120/1 +f 9113/9121/1 9114/9122/1 9115/9123/1 9116/9124/1 +f 9117/9125/1 9118/9126/1 9119/9127/1 9120/9128/1 +f 9121/9129/1 9122/9130/1 9123/9131/1 9124/9132/1 +f 9125/9133/1 9126/9134/1 9127/9135/1 9128/9136/1 +f 9129/9137/1 9130/9138/1 9131/9139/1 9132/9140/1 +f 9133/9141/1 9134/9142/1 9135/9143/1 9136/9144/1 +f 9137/9145/1 9138/9146/1 9139/9147/1 9140/9148/1 +f 9141/9149/1 9142/9150/1 9143/9151/1 9144/9152/1 +f 9145/9153/1 9146/9154/1 9147/9155/1 9148/9156/1 +f 9149/9157/1 9150/9158/1 9151/9159/1 9152/9160/1 +f 9153/9161/1 9154/9162/1 9155/9163/1 9156/9164/1 +f 9157/9165/1 9158/9166/1 9159/9167/1 9160/9168/1 +f 9161/9169/1 9162/9170/1 9163/9171/1 9164/9172/1 +f 9165/9173/1 9166/9174/1 9167/9175/1 9168/9176/1 +f 9169/9177/1 9170/9178/1 9171/9179/1 9172/9180/1 +f 9173/9181/1 9174/9182/1 9175/9183/1 9176/9184/1 +f 9177/9185/1 9178/9186/1 9179/9187/1 9180/9188/1 +f 9181/9189/1 9182/9190/1 9183/9191/1 9184/9192/1 +f 9185/9193/1 9186/9194/1 9187/9195/1 9188/9196/1 +f 9189/9197/1 9190/9198/1 9191/9199/1 9192/9200/1 +f 9193/9201/1 9194/9202/1 9195/9203/1 9196/9204/1 +f 9197/9205/1 9198/9206/1 9199/9207/1 9200/9208/1 +f 9201/9209/1 9202/9210/1 9203/9211/1 9204/9212/1 +f 9205/9213/1 9206/9214/1 9207/9215/1 9208/9216/1 +f 9209/9217/1 9210/9218/1 9211/9219/1 9212/9220/1 +f 9213/9221/1 9214/9222/1 9215/9223/1 9216/9224/1 +f 9217/9225/1 9218/9226/1 9219/9227/1 9220/9228/1 +f 9221/9229/1 9222/9230/1 9223/9231/1 9224/9232/1 +f 9225/9233/1 9226/9234/1 9227/9235/1 9228/9236/1 +f 9229/9237/1 9230/9238/1 9231/9239/1 9232/9240/1 +f 9233/9241/1 9234/9242/1 9235/9243/1 9236/9244/1 +f 9237/9245/1 9238/9246/1 9239/9247/1 9240/9248/1 +f 9241/9249/1 9242/9250/1 9243/9251/1 9244/9252/1 +f 9245/9253/1 9246/9254/1 9247/9255/1 9248/9256/1 +f 9249/9257/1 9250/9258/1 9251/9259/1 9252/9260/1 +f 9253/9261/1 9254/9262/1 9255/9263/1 9256/9264/1 +f 9257/9265/1 9258/9266/1 9259/9267/1 9260/9268/1 +f 9261/9269/1 9262/9270/1 9263/9271/1 9264/9272/1 +f 9265/9273/1 9266/9274/1 9267/9275/1 9268/9276/1 +f 9269/9277/1 9270/9278/1 9271/9279/1 9272/9280/1 +f 9273/9281/1 9274/9282/1 9275/9283/1 9276/9284/1 +f 9277/9285/1 9278/9286/1 9279/9287/1 9280/9288/1 +f 9281/9289/1 9282/9290/1 9283/9291/1 9284/9292/1 +f 9285/9293/1 9286/9294/1 9287/9295/1 9288/9296/1 +f 9289/9297/1 9290/9298/1 9291/9299/1 9292/9300/1 +f 9293/9301/1 9294/9302/1 9295/9303/1 9296/9304/1 +f 9297/9305/1 9298/9306/1 9299/9307/1 9300/9308/1 +f 9301/9309/1 9302/9310/1 9303/9311/1 9304/9312/1 +f 9305/9313/1 9306/9314/1 9307/9315/1 9308/9316/1 +f 9309/9317/1 9310/9318/1 9311/9319/1 9312/9320/1 +f 9313/9321/1 9314/9322/1 9315/9323/1 9316/9324/1 +f 9317/9325/1 9318/9326/1 9319/9327/1 9320/9328/1 +f 9321/9329/1 9322/9330/1 9323/9331/1 9324/9332/1 +f 9325/9333/1 9326/9334/1 9327/9335/1 9328/9336/1 +f 9329/9337/1 9330/9338/1 9331/9339/1 9332/9340/1 +f 9333/9341/1 9334/9342/1 9335/9343/1 9336/9344/1 +f 9337/9345/1 9338/9346/1 9339/9347/1 9340/9348/1 +f 9341/9349/1 9342/9350/1 9343/9351/1 9344/9352/1 +f 9345/9353/1 9346/9354/1 9347/9355/1 9348/9356/1 +f 9349/9357/1 9350/9358/1 9351/9359/1 9352/9360/1 +f 9353/9361/1 9354/9362/1 9355/9363/1 9356/9364/1 +f 9357/9365/1 9358/9366/1 9359/9367/1 9360/9368/1 +f 9361/9369/1 9362/9370/1 9363/9371/1 9364/9372/1 +f 9365/9373/1 9366/9374/1 9367/9375/1 9368/9376/1 +f 9369/9377/1 9370/9378/1 9371/9379/1 9372/9380/1 +f 9373/9381/1 9374/9382/1 9375/9383/1 9376/9384/1 +f 9377/9385/1 9378/9386/1 9379/9387/1 9380/9388/1 +f 9381/9389/1 9382/9390/1 9383/9391/1 9384/9392/1 +f 9385/9393/1 9386/9394/1 9387/9395/1 9388/9396/1 +f 9389/9397/1 9390/9398/1 9391/9399/1 9392/9400/1 +f 9393/9401/1 9394/9402/1 9395/9403/1 9396/9404/1 +f 9397/9405/1 9398/9406/1 9399/9407/1 9400/9408/1 +f 9401/9409/1 9402/9410/1 9403/9411/1 9404/9412/1 +f 9405/9413/1 9406/9414/1 9407/9415/1 9408/9416/1 +f 9409/9417/1 9410/9418/1 9411/9419/1 9412/9420/1 +f 9413/9421/1 9414/9422/1 9415/9423/1 9416/9424/1 +f 9417/9425/1 9418/9426/1 9419/9427/1 9420/9428/1 +f 9421/9429/1 9422/9430/1 9423/9431/1 9424/9432/1 +f 9425/9433/1 9426/9434/1 9427/9435/1 9428/9436/1 +f 9429/9437/1 9430/9438/1 9431/9439/1 9432/9440/1 +f 9433/9441/1 9434/9442/1 9435/9443/1 9436/9444/1 +f 9437/9445/1 9438/9446/1 9439/9447/1 9440/9448/1 +f 9441/9449/1 9442/9450/1 9443/9451/1 9444/9452/1 +f 9445/9453/1 9446/9454/1 9447/9455/1 9448/9456/1 +f 9449/9457/1 9450/9458/1 9451/9459/1 9452/9460/1 +f 9453/9461/1 9454/9462/1 9455/9463/1 9456/9464/1 +f 9457/9465/1 9458/9466/1 9459/9467/1 9460/9468/1 +f 9461/9469/1 9462/9470/1 9463/9471/1 9464/9472/1 +f 9465/9473/1 9466/9474/1 9467/9475/1 9468/9476/1 +f 9469/9477/1 9470/9478/1 9471/9479/1 9472/9480/1 +f 9473/9481/1 9474/9482/1 9475/9483/1 9476/9484/1 +f 9477/9485/1 9478/9486/1 9479/9487/1 9480/9488/1 +f 9481/9489/1 9482/9490/1 9483/9491/1 9484/9492/1 +f 9485/9493/1 9486/9494/1 9487/9495/1 9488/9496/1 +f 9489/9497/1 9490/9498/1 9491/9499/1 9492/9500/1 +f 9493/9501/1 9494/9502/1 9495/9503/1 9496/9504/1 +f 9497/9505/1 9498/9506/1 9499/9507/1 9500/9508/1 +f 9501/9509/1 9502/9510/1 9503/9511/1 9504/9512/1 +f 9505/9513/1 9506/9514/1 9507/9515/1 9508/9516/1 +f 9509/9517/1 9510/9518/1 9511/9519/1 9512/9520/1 +f 9513/9521/1 9514/9522/1 9515/9523/1 9516/9524/1 +f 9517/9525/1 9518/9526/1 9519/9527/1 9520/9528/1 +f 9521/9529/1 9522/9530/1 9523/9531/1 9524/9532/1 +f 9525/9533/1 9526/9534/1 9527/9535/1 9528/9536/1 +f 9529/9537/1 9530/9538/1 9531/9539/1 9532/9540/1 +f 9533/9541/1 9534/9542/1 9535/9543/1 9536/9544/1 +f 9537/9545/1 9538/9546/1 9539/9547/1 9540/9548/1 +f 9541/9549/1 9542/9550/1 9543/9551/1 9544/9552/1 +f 9545/9553/1 9546/9554/1 9547/9555/1 9548/9556/1 +f 9549/9557/1 9550/9558/1 9551/9559/1 9552/9560/1 +f 9553/9561/1 9554/9562/1 9555/9563/1 9556/9564/1 +f 9557/9565/1 9558/9566/1 9559/9567/1 9560/9568/1 +f 9561/9569/1 9562/9570/1 9563/9571/1 9564/9572/1 +f 9565/9573/1 9566/9574/1 9567/9575/1 9568/9576/1 +f 9569/9577/1 9570/9578/1 9571/9579/1 9572/9580/1 +f 9573/9581/1 9574/9582/1 9575/9583/1 9576/9584/1 +f 9577/9585/1 9578/9586/1 9579/9587/1 9580/9588/1 +f 9581/9589/1 9582/9590/1 9583/9591/1 9584/9592/1 +f 9585/9593/1 9586/9594/1 9587/9595/1 9588/9596/1 +f 9589/9597/1 9590/9598/1 9591/9599/1 9592/9600/1 +f 9593/9601/1 9594/9602/1 9595/9603/1 9596/9604/1 +f 9597/9605/1 9598/9606/1 9599/9607/1 9600/9608/1 +f 9601/9609/1 9602/9610/1 9603/9611/1 9604/9612/1 +f 9605/9613/1 9606/9614/1 9607/9615/1 9608/9616/1 +f 9609/9617/1 9610/9618/1 9611/9619/1 9612/9620/1 +f 9613/9621/1 9614/9622/1 9615/9623/1 9616/9624/1 +f 9617/9625/1 9618/9626/1 9619/9627/1 9620/9628/1 +f 9621/9629/1 9622/9630/1 9623/9631/1 9624/9632/1 +f 9625/9633/1 9626/9634/1 9627/9635/1 9628/9636/1 +f 9629/9637/1 9630/9638/1 9631/9639/1 9632/9640/1 +f 9633/9641/1 9634/9642/1 9635/9643/1 9636/9644/1 +f 9637/9645/1 9638/9646/1 9639/9647/1 9640/9648/1 +f 9641/9649/1 9642/9650/1 9643/9651/1 9644/9652/1 +f 9645/9653/1 9646/9654/1 9647/9655/1 9648/9656/1 +f 9649/9657/1 9650/9658/1 9651/9659/1 9652/9660/1 +f 9653/9661/1 9654/9662/1 9655/9663/1 9656/9664/1 +f 9657/9665/1 9658/9666/1 9659/9667/1 9660/9668/1 +f 9661/9669/1 9662/9670/1 9663/9671/1 9664/9672/1 +f 9665/9673/1 9666/9674/1 9667/9675/1 9668/9676/1 +f 9669/9677/1 9670/9678/1 9671/9679/1 9672/9680/1 +f 9673/9681/1 9674/9682/1 9675/9683/1 9676/9684/1 +f 9677/9685/1 9678/9686/1 9679/9687/1 9680/9688/1 +f 9681/9689/1 9682/9690/1 9683/9691/1 9684/9692/1 +f 9685/9693/1 9686/9694/1 9687/9695/1 9688/9696/1 +f 9689/9697/1 9690/9698/1 9691/9699/1 9692/9700/1 +f 9693/9701/1 9694/9702/1 9695/9703/1 9696/9704/1 +f 9697/9705/1 9698/9706/1 9699/9707/1 9700/9708/1 +f 9701/9709/1 9702/9710/1 9703/9711/1 9704/9712/1 +f 9705/9713/1 9706/9714/1 9707/9715/1 9708/9716/1 +f 9709/9717/1 9710/9718/1 9711/9719/1 9712/9720/1 +f 9713/9721/1 9714/9722/1 9715/9723/1 9716/9724/1 +f 9717/9725/1 9718/9726/1 9719/9727/1 9720/9728/1 +f 9721/9729/1 9722/9730/1 9723/9731/1 9724/9732/1 +f 9725/9733/1 9726/9734/1 9727/9735/1 9728/9736/1 +f 9729/9737/1 9730/9738/1 9731/9739/1 9732/9740/1 +f 9733/9741/1 9734/9742/1 9735/9743/1 9736/9744/1 +f 9737/9745/1 9738/9746/1 9739/9747/1 9740/9748/1 +f 9741/9749/1 9742/9750/1 9743/9751/1 9744/9752/1 +f 9745/9753/1 9746/9754/1 9747/9755/1 9748/9756/1 +f 9749/9757/1 9750/9758/1 9751/9759/1 9752/9760/1 +f 9753/9761/1 9754/9762/1 9755/9763/1 9756/9764/1 +f 9757/9765/1 9758/9766/1 9759/9767/1 9760/9768/1 +f 9761/9769/1 9762/9770/1 9763/9771/1 9764/9772/1 +f 9765/9773/1 9766/9774/1 9767/9775/1 9768/9776/1 +f 9769/9777/1 9770/9778/1 9771/9779/1 9772/9780/1 +f 9773/9781/1 9774/9782/1 9775/9783/1 9776/9784/1 +f 9777/9785/1 9778/9786/1 9779/9787/1 9780/9788/1 +f 9781/9789/1 9782/9790/1 9783/9791/1 9784/9792/1 +f 9785/9793/1 9786/9794/1 9787/9795/1 9788/9796/1 +f 9789/9797/1 9790/9798/1 9791/9799/1 9792/9800/1 +f 9793/9801/1 9794/9802/1 9795/9803/1 9796/9804/1 +f 9797/9805/1 9798/9806/1 9799/9807/1 9800/9808/1 +f 9801/9809/1 9802/9810/1 9803/9811/1 9804/9812/1 +f 9805/9813/1 9806/9814/1 9807/9815/1 9808/9816/1 +f 9809/9817/1 9810/9818/1 9811/9819/1 9812/9820/1 +f 9813/9821/1 9814/9822/1 9815/9823/1 9816/9824/1 +f 9817/9825/1 9818/9826/1 9819/9827/1 9820/9828/1 +f 9821/9829/1 9822/9830/1 9823/9831/1 9824/9832/1 +f 9825/9833/1 9826/9834/1 9827/9835/1 9828/9836/1 +f 9829/9837/1 9830/9838/1 9831/9839/1 9832/9840/1 +f 9833/9841/1 9834/9842/1 9835/9843/1 9836/9844/1 +f 9837/9845/1 9838/9846/1 9839/9847/1 9840/9848/1 +f 9841/9849/1 9842/9850/1 9843/9851/1 9844/9852/1 +f 9845/9853/1 9846/9854/1 9847/9855/1 9848/9856/1 +f 9849/9857/1 9850/9858/1 9851/9859/1 9852/9860/1 +f 9853/9861/1 9854/9862/1 9855/9863/1 9856/9864/1 +f 9857/9865/1 9858/9866/1 9859/9867/1 9860/9868/1 +f 9861/9869/1 9862/9870/1 9863/9871/1 9864/9872/1 +f 9865/9873/1 9866/9874/1 9867/9875/1 9868/9876/1 +f 9869/9877/1 9870/9878/1 9871/9879/1 9872/9880/1 +f 9873/9881/1 9874/9882/1 9875/9883/1 9876/9884/1 +f 9877/9885/1 9878/9886/1 9879/9887/1 9880/9888/1 +f 9881/9889/1 9882/9890/1 9883/9891/1 9884/9892/1 +f 9885/9893/1 9886/9894/1 9887/9895/1 9888/9896/1 +f 9889/9897/1 9890/9898/1 9891/9899/1 9892/9900/1 +f 9893/9901/1 9894/9902/1 9895/9903/1 9896/9904/1 +f 9897/9905/1 9898/9906/1 9899/9907/1 9900/9908/1 +f 9901/9909/1 9902/9910/1 9903/9911/1 9904/9912/1 +f 9905/9913/1 9906/9914/1 9907/9915/1 9908/9916/1 +f 9909/9917/1 9910/9918/1 9911/9919/1 9912/9920/1 +f 9913/9921/1 9914/9922/1 9915/9923/1 9916/9924/1 +f 9917/9925/1 9918/9926/1 9919/9927/1 9920/9928/1 +f 9921/9929/1 9922/9930/1 9923/9931/1 9924/9932/1 +f 9925/9933/1 9926/9934/1 9927/9935/1 9928/9936/1 +f 9929/9937/1 9930/9938/1 9931/9939/1 9932/9940/1 +f 9933/9941/1 9934/9942/1 9935/9943/1 9936/9944/1 +f 9937/9945/1 9938/9946/1 9939/9947/1 9940/9948/1 +f 9941/9949/1 9942/9950/1 9943/9951/1 9944/9952/1 +f 9945/9953/1 9946/9954/1 9947/9955/1 9948/9956/1 +f 9949/9957/1 9950/9958/1 9951/9959/1 9952/9960/1 +f 9953/9961/1 9954/9962/1 9955/9963/1 9956/9964/1 +f 9957/9965/1 9958/9966/1 9959/9967/1 9960/9968/1 +f 9961/9969/1 9962/9970/1 9963/9971/1 9964/9972/1 +f 9965/9973/1 9966/9974/1 9967/9975/1 9968/9976/1 +f 9969/9977/1 9970/9978/1 9971/9979/1 9972/9980/1 +f 9973/9981/1 9974/9982/1 9975/9983/1 9976/9984/1 +f 9977/9985/1 9978/9986/1 9979/9987/1 9980/9988/1 +f 9981/9989/1 9982/9990/1 9983/9991/1 9984/9992/1 +f 9985/9993/1 9986/9994/1 9987/9995/1 9988/9996/1 +f 9989/9997/1 9990/9998/1 9991/9999/1 9992/10000/1 +f 9993/10001/1 9994/10002/1 9995/10003/1 9996/10004/1 +f 9997/10005/1 9998/10006/1 9999/10007/1 10000/10008/1 +f 10001/10009/1 10002/10010/1 10003/10011/1 10004/10012/1 +f 10005/10013/1 10006/10014/1 10007/10015/1 10008/10016/1 +f 10009/10017/1 10010/10018/1 10011/10019/1 10012/10020/1 +f 10013/10021/1 10014/10022/1 10015/10023/1 10016/10024/1 +f 10017/10025/1 10018/10026/1 10019/10027/1 10020/10028/1 +f 10021/10029/1 10022/10030/1 10023/10031/1 10024/10032/1 +f 10025/10033/1 10026/10034/1 10027/10035/1 10028/10036/1 +f 10029/10037/1 10030/10038/1 10031/10039/1 10032/10040/1 +f 10033/10041/1 10034/10042/1 10035/10043/1 10036/10044/1 +f 10037/10045/1 10038/10046/1 10039/10047/1 10040/10048/1 +f 10041/10049/1 10042/10050/1 10043/10051/1 10044/10052/1 +f 10045/10053/1 10046/10054/1 10047/10055/1 10048/10056/1 +f 10049/10057/1 10050/10058/1 10051/10059/1 10052/10060/1 +f 10053/10061/1 10054/10062/1 10055/10063/1 10056/10064/1 +f 10057/10065/1 10058/10066/1 10059/10067/1 10060/10068/1 +f 10061/10069/1 10062/10070/1 10063/10071/1 10064/10072/1 +f 10065/10073/1 10066/10074/1 10067/10075/1 10068/10076/1 +f 10069/10077/1 10070/10078/1 10071/10079/1 10072/10080/1 +f 10073/10081/1 10074/10082/1 10075/10083/1 10076/10084/1 +f 10077/10085/1 10078/10086/1 10079/10087/1 10080/10088/1 +f 10081/10089/1 10082/10090/1 10083/10091/1 10084/10092/1 +f 10085/10093/1 10086/10094/1 10087/10095/1 10088/10096/1 +f 10089/10097/1 10090/10098/1 10091/10099/1 10092/10100/1 +f 10093/10101/1 10094/10102/1 10095/10103/1 10096/10104/1 +f 10097/10105/1 10098/10106/1 10099/10107/1 10100/10108/1 +f 10101/10109/1 10102/10110/1 10103/10111/1 10104/10112/1 +f 10105/10113/1 10106/10114/1 10107/10115/1 10108/10116/1 +f 10109/10117/1 10110/10118/1 10111/10119/1 10112/10120/1 +f 10113/10121/1 10114/10122/1 10115/10123/1 10116/10124/1 +f 10117/10125/1 10118/10126/1 10119/10127/1 10120/10128/1 +f 10121/10129/1 10122/10130/1 10123/10131/1 10124/10132/1 +f 10125/10133/1 10126/10134/1 10127/10135/1 10128/10136/1 +f 10129/10137/1 10130/10138/1 10131/10139/1 10132/10140/1 +f 10133/10141/1 10134/10142/1 10135/10143/1 10136/10144/1 +f 10137/10145/1 10138/10146/1 10139/10147/1 10140/10148/1 +f 10141/10149/1 10142/10150/1 10143/10151/1 10144/10152/1 +f 10145/10153/1 10146/10154/1 10147/10155/1 10148/10156/1 +f 10149/10157/1 10150/10158/1 10151/10159/1 10152/10160/1 +f 10153/10161/1 10154/10162/1 10155/10163/1 10156/10164/1 +f 10157/10165/1 10158/10166/1 10159/10167/1 10160/10168/1 +f 10161/10169/1 10162/10170/1 10163/10171/1 10164/10172/1 +f 10165/10173/1 10166/10174/1 10167/10175/1 10168/10176/1 +f 10169/10177/1 10170/10178/1 10171/10179/1 10172/10180/1 +f 10173/10181/1 10174/10182/1 10175/10183/1 10176/10184/1 +f 10177/10185/1 10178/10186/1 10179/10187/1 10180/10188/1 +f 10181/10189/1 10182/10190/1 10183/10191/1 10184/10192/1 +f 10185/10193/1 10186/10194/1 10187/10195/1 10188/10196/1 +f 10189/10197/1 10190/10198/1 10191/10199/1 10192/10200/1 +f 10193/10201/1 10194/10202/1 10195/10203/1 10196/10204/1 +f 10197/10205/1 10198/10206/1 10199/10207/1 10200/10208/1 +f 10201/10209/1 10202/10210/1 10203/10211/1 10204/10212/1 +f 10205/10213/1 10206/10214/1 10207/10215/1 10208/10216/1 +f 10209/10217/1 10210/10218/1 10211/10219/1 10212/10220/1 +f 10213/10221/1 10214/10222/1 10215/10223/1 10216/10224/1 +f 10217/10225/1 10218/10226/1 10219/10227/1 10220/10228/1 +f 10221/10229/1 10222/10230/1 10223/10231/1 10224/10232/1 +f 10225/10233/1 10226/10234/1 10227/10235/1 10228/10236/1 +f 10229/10237/1 10230/10238/1 10231/10239/1 10232/10240/1 +f 10233/10241/1 10234/10242/1 10235/10243/1 10236/10244/1 +f 10237/10245/1 10238/10246/1 10239/10247/1 10240/10248/1 +f 10241/10249/1 10242/10250/1 10243/10251/1 10244/10252/1 +f 10245/10253/1 10246/10254/1 10247/10255/1 10248/10256/1 +f 10249/10257/1 10250/10258/1 10251/10259/1 10252/10260/1 +f 10253/10261/1 10254/10262/1 10255/10263/1 10256/10264/1 +f 10257/10265/1 10258/10266/1 10259/10267/1 10260/10268/1 +f 10261/10269/1 10262/10270/1 10263/10271/1 10264/10272/1 +f 10265/10273/1 10266/10274/1 10267/10275/1 10268/10276/1 +f 10269/10277/1 10270/10278/1 10271/10279/1 10272/10280/1 +f 10273/10281/1 10274/10282/1 10275/10283/1 10276/10284/1 +f 10277/10285/1 10278/10286/1 10279/10287/1 10280/10288/1 +f 10281/10289/1 10282/10290/1 10283/10291/1 10284/10292/1 +f 10285/10293/1 10286/10294/1 10287/10295/1 10288/10296/1 +f 10289/10297/1 10290/10298/1 10291/10299/1 10292/10300/1 +f 10293/10301/1 10294/10302/1 10295/10303/1 10296/10304/1 +f 10297/10305/1 10298/10306/1 10299/10307/1 10300/10308/1 +f 10301/10309/1 10302/10310/1 10303/10311/1 10304/10312/1 +f 10305/10313/1 10306/10314/1 10307/10315/1 10308/10316/1 +f 10309/10317/1 10310/10318/1 10311/10319/1 10312/10320/1 +f 10313/10321/1 10314/10322/1 10315/10323/1 10316/10324/1 +f 10317/10325/1 10318/10326/1 10319/10327/1 10320/10328/1 +f 10321/10329/1 10322/10330/1 10323/10331/1 10324/10332/1 +f 10325/10333/1 10326/10334/1 10327/10335/1 10328/10336/1 +f 10329/10337/1 10330/10338/1 10331/10339/1 10332/10340/1 +f 10333/10341/1 10334/10342/1 10335/10343/1 10336/10344/1 +f 10337/10345/1 10338/10346/1 10339/10347/1 10340/10348/1 +f 10341/10349/1 10342/10350/1 10343/10351/1 10344/10352/1 +f 10345/10353/1 10346/10354/1 10347/10355/1 10348/10356/1 +f 10349/10357/1 10350/10358/1 10351/10359/1 10352/10360/1 +f 10353/10361/1 10354/10362/1 10355/10363/1 10356/10364/1 +f 10357/10365/1 10358/10366/1 10359/10367/1 10360/10368/1 +f 10361/10369/1 10362/10370/1 10363/10371/1 10364/10372/1 +f 10365/10373/1 10366/10374/1 10367/10375/1 10368/10376/1 +f 10369/10377/1 10370/10378/1 10371/10379/1 10372/10380/1 +f 10373/10381/1 10374/10382/1 10375/10383/1 10376/10384/1 +f 10377/10385/1 10378/10386/1 10379/10387/1 10380/10388/1 +f 10381/10389/1 10382/10390/1 10383/10391/1 10384/10392/1 +f 10385/10393/1 10386/10394/1 10387/10395/1 10388/10396/1 +f 10389/10397/1 10390/10398/1 10391/10399/1 10392/10400/1 +f 10393/10401/1 10394/10402/1 10395/10403/1 10396/10404/1 +f 10397/10405/1 10398/10406/1 10399/10407/1 10400/10408/1 +f 10401/10409/1 10402/10410/1 10403/10411/1 10404/10412/1 +f 10405/10413/1 10406/10414/1 10407/10415/1 10408/10416/1 +f 10409/10417/1 10410/10418/1 10411/10419/1 10412/10420/1 +f 10413/10421/1 10414/10422/1 10415/10423/1 10416/10424/1 +f 10417/10425/1 10418/10426/1 10419/10427/1 10420/10428/1 +f 10421/10429/1 10422/10430/1 10423/10431/1 10424/10432/1 +f 10425/10433/1 10426/10434/1 10427/10435/1 10428/10436/1 +f 10429/10437/1 10430/10438/1 10431/10439/1 10432/10440/1 +f 10433/10441/1 10434/10442/1 10435/10443/1 10436/10444/1 +f 10437/10445/1 10438/10446/1 10439/10447/1 10440/10448/1 +f 10441/10449/1 10442/10450/1 10443/10451/1 10444/10452/1 +f 10445/10453/1 10446/10454/1 10447/10455/1 10448/10456/1 +f 10449/10457/1 10450/10458/1 10451/10459/1 10452/10460/1 +f 10453/10461/1 10454/10462/1 10455/10463/1 10456/10464/1 +f 10457/10465/1 10458/10466/1 10459/10467/1 10460/10468/1 +f 10461/10469/1 10462/10470/1 10463/10471/1 10464/10472/1 +f 10465/10473/1 10466/10474/1 10467/10475/1 10468/10476/1 +f 10469/10477/1 10470/10478/1 10471/10479/1 10472/10480/1 +f 10473/10481/1 10474/10482/1 10475/10483/1 10476/10484/1 +f 10477/10485/1 10478/10486/1 10479/10487/1 10480/10488/1 +f 10481/10489/1 10482/10490/1 10483/10491/1 10484/10492/1 +f 10485/10493/1 10486/10494/1 10487/10495/1 10488/10496/1 +f 10489/10497/1 10490/10498/1 10491/10499/1 10492/10500/1 +f 10493/10501/1 10494/10502/1 10495/10503/1 10496/10504/1 +f 10497/10505/1 10498/10506/1 10499/10507/1 10500/10508/1 +f 10501/10509/1 10502/10510/1 10503/10511/1 10504/10512/1 +f 10505/10513/1 10506/10514/1 10507/10515/1 10508/10516/1 +f 10509/10517/1 10510/10518/1 10511/10519/1 10512/10520/1 +f 10513/10521/1 10514/10522/1 10515/10523/1 10516/10524/1 +f 10517/10525/1 10518/10526/1 10519/10527/1 10520/10528/1 +f 10521/10529/1 10522/10530/1 10523/10531/1 10524/10532/1 +f 10525/10533/1 10526/10534/1 10527/10535/1 10528/10536/1 +f 10529/10537/1 10530/10538/1 10531/10539/1 10532/10540/1 +f 10533/10541/1 10534/10542/1 10535/10543/1 10536/10544/1 +f 10537/10545/1 10538/10546/1 10539/10547/1 10540/10548/1 +f 10541/10549/1 10542/10550/1 10543/10551/1 10544/10552/1 +f 10545/10553/1 10546/10554/1 10547/10555/1 10548/10556/1 +f 10549/10557/1 10550/10558/1 10551/10559/1 10552/10560/1 +f 10553/10561/1 10554/10562/1 10555/10563/1 10556/10564/1 +f 10557/10565/1 10558/10566/1 10559/10567/1 10560/10568/1 +f 10561/10569/1 10562/10570/1 10563/10571/1 10564/10572/1 +f 10565/10573/1 10566/10574/1 10567/10575/1 10568/10576/1 +f 10569/10577/1 10570/10578/1 10571/10579/1 10572/10580/1 +f 10573/10581/1 10574/10582/1 10575/10583/1 10576/10584/1 +f 10577/10585/1 10578/10586/1 10579/10587/1 10580/10588/1 +f 10581/10589/1 10582/10590/1 10583/10591/1 10584/10592/1 +f 10585/10593/1 10586/10594/1 10587/10595/1 10588/10596/1 +f 10589/10597/1 10590/10598/1 10591/10599/1 10592/10600/1 +f 10593/10601/1 10594/10602/1 10595/10603/1 10596/10604/1 +f 10597/10605/1 10598/10606/1 10599/10607/1 10600/10608/1 +f 10601/10609/1 10602/10610/1 10603/10611/1 10604/10612/1 +f 10605/10613/1 10606/10614/1 10607/10615/1 10608/10616/1 +f 10609/10617/1 10610/10618/1 10611/10619/1 10612/10620/1 +f 10613/10621/1 10614/10622/1 10615/10623/1 10616/10624/1 +f 10617/10625/1 10618/10626/1 10619/10627/1 10620/10628/1 +f 10621/10629/1 10622/10630/1 10623/10631/1 10624/10632/1 +f 10625/10633/1 10626/10634/1 10627/10635/1 10628/10636/1 +f 10629/10637/1 10630/10638/1 10631/10639/1 10632/10640/1 +f 10633/10641/1 10634/10642/1 10635/10643/1 10636/10644/1 +f 10637/10645/1 10638/10646/1 10639/10647/1 10640/10648/1 +f 10641/10649/1 10642/10650/1 10643/10651/1 10644/10652/1 +f 10645/10653/1 10646/10654/1 10647/10655/1 10648/10656/1 +f 10649/10657/1 10650/10658/1 10651/10659/1 10652/10660/1 +f 10653/10661/1 10654/10662/1 10655/10663/1 10656/10664/1 +f 10657/10665/1 10658/10666/1 10659/10667/1 10660/10668/1 +f 10661/10669/1 10662/10670/1 10663/10671/1 10664/10672/1 +f 10665/10673/1 10666/10674/1 10667/10675/1 10668/10676/1 +f 10669/10677/1 10670/10678/1 10671/10679/1 10672/10680/1 +f 10673/10681/1 10674/10682/1 10675/10683/1 10676/10684/1 +f 10677/10685/1 10678/10686/1 10679/10687/1 10680/10688/1 +f 10681/10689/1 10682/10690/1 10683/10691/1 10684/10692/1 +f 10685/10693/1 10686/10694/1 10687/10695/1 10688/10696/1 +f 10689/10697/1 10690/10698/1 10691/10699/1 10692/10700/1 +f 10693/10701/1 10694/10702/1 10695/10703/1 10696/10704/1 +f 10697/10705/1 10698/10706/1 10699/10707/1 10700/10708/1 +f 10701/10709/1 10702/10710/1 10703/10711/1 10704/10712/1 +f 10705/10713/1 10706/10714/1 10707/10715/1 10708/10716/1 +f 10709/10717/1 10710/10718/1 10711/10719/1 10712/10720/1 +f 10713/10721/1 10714/10722/1 10715/10723/1 10716/10724/1 +f 10717/10725/1 10718/10726/1 10719/10727/1 10720/10728/1 +f 10721/10729/1 10722/10730/1 10723/10731/1 10724/10732/1 +f 10725/10733/1 10726/10734/1 10727/10735/1 10728/10736/1 +f 10729/10737/1 10730/10738/1 10731/10739/1 10732/10740/1 +f 10733/10741/1 10734/10742/1 10735/10743/1 10736/10744/1 +f 10737/10745/1 10738/10746/1 10739/10747/1 10740/10748/1 +f 10741/10749/1 10742/10750/1 10743/10751/1 10744/10752/1 +f 10745/10753/1 10746/10754/1 10747/10755/1 10748/10756/1 +f 10749/10757/1 10750/10758/1 10751/10759/1 10752/10760/1 +f 10753/10761/1 10754/10762/1 10755/10763/1 10756/10764/1 +f 10757/10765/1 10758/10766/1 10759/10767/1 10760/10768/1 +f 10761/10769/1 10762/10770/1 10763/10771/1 10764/10772/1 +f 10765/10773/1 10766/10774/1 10767/10775/1 10768/10776/1 +f 10769/10777/1 10770/10778/1 10771/10779/1 10772/10780/1 +f 10773/10781/1 10774/10782/1 10775/10783/1 10776/10784/1 +f 10777/10785/1 10778/10786/1 10779/10787/1 10780/10788/1 +f 10781/10789/1 10782/10790/1 10783/10791/1 10784/10792/1 +f 10785/10793/1 10786/10794/1 10787/10795/1 10788/10796/1 +f 10789/10797/1 10790/10798/1 10791/10799/1 10792/10800/1 +f 10793/10801/1 10794/10802/1 10795/10803/1 10796/10804/1 +f 10797/10805/1 10798/10806/1 10799/10807/1 10800/10808/1 +f 10801/10809/1 10802/10810/1 10803/10811/1 10804/10812/1 +f 10805/10813/1 10806/10814/1 10807/10815/1 10808/10816/1 +f 10809/10817/1 10810/10818/1 10811/10819/1 10812/10820/1 +f 10813/10821/1 10814/10822/1 10815/10823/1 10816/10824/1 +f 10817/10825/1 10818/10826/1 10819/10827/1 10820/10828/1 +f 10821/10829/1 10822/10830/1 10823/10831/1 10824/10832/1 +f 10825/10833/1 10826/10834/1 10827/10835/1 10828/10836/1 +f 10829/10837/1 10830/10838/1 10831/10839/1 10832/10840/1 +f 10833/10841/1 10834/10842/1 10835/10843/1 10836/10844/1 +f 10837/10845/1 10838/10846/1 10839/10847/1 10840/10848/1 +f 10841/10849/1 10842/10850/1 10843/10851/1 10844/10852/1 +f 10845/10853/1 10846/10854/1 10847/10855/1 10848/10856/1 +f 10849/10857/1 10850/10858/1 10851/10859/1 10852/10860/1 +f 10853/10861/1 10854/10862/1 10855/10863/1 10856/10864/1 +f 10857/10865/1 10858/10866/1 10859/10867/1 10860/10868/1 +f 10861/10869/1 10862/10870/1 10863/10871/1 10864/10872/1 +f 10865/10873/1 10866/10874/1 10867/10875/1 10868/10876/1 +f 10869/10877/1 10870/10878/1 10871/10879/1 10872/10880/1 +f 10873/10881/1 10874/10882/1 10875/10883/1 10876/10884/1 +f 10877/10885/1 10878/10886/1 10879/10887/1 10880/10888/1 +f 10881/10889/1 10882/10890/1 10883/10891/1 10884/10892/1 +f 10885/10893/1 10886/10894/1 10887/10895/1 10888/10896/1 +f 10889/10897/1 10890/10898/1 10891/10899/1 10892/10900/1 +f 10893/10901/1 10894/10902/1 10895/10903/1 10896/10904/1 +f 10897/10905/1 10898/10906/1 10899/10907/1 10900/10908/1 +f 10901/10909/1 10902/10910/1 10903/10911/1 10904/10912/1 +f 10905/10913/1 10906/10914/1 10907/10915/1 10908/10916/1 +f 10909/10917/1 10910/10918/1 10911/10919/1 10912/10920/1 +f 10913/10921/1 10914/10922/1 10915/10923/1 10916/10924/1 +f 10917/10925/1 10918/10926/1 10919/10927/1 10920/10928/1 +f 10921/10929/1 10922/10930/1 10923/10931/1 10924/10932/1 +f 10925/10933/1 10926/10934/1 10927/10935/1 10928/10936/1 +f 10929/10937/1 10930/10938/1 10931/10939/1 10932/10940/1 +f 10933/10941/1 10934/10942/1 10935/10943/1 10936/10944/1 +f 10937/10945/1 10938/10946/1 10939/10947/1 10940/10948/1 +f 10941/10949/1 10942/10950/1 10943/10951/1 10944/10952/1 +f 10945/10953/1 10946/10954/1 10947/10955/1 10948/10956/1 +f 10949/10957/1 10950/10958/1 10951/10959/1 10952/10960/1 +f 10953/10961/1 10954/10962/1 10955/10963/1 10956/10964/1 +f 10957/10965/1 10958/10966/1 10959/10967/1 10960/10968/1 +f 10961/10969/1 10962/10970/1 10963/10971/1 10964/10972/1 +f 10965/10973/1 10966/10974/1 10967/10975/1 10968/10976/1 +f 10969/10977/1 10970/10978/1 10971/10979/1 10972/10980/1 +f 10973/10981/1 10974/10982/1 10975/10983/1 10976/10984/1 +f 10977/10985/1 10978/10986/1 10979/10987/1 10980/10988/1 +f 10981/10989/1 10982/10990/1 10983/10991/1 10984/10992/1 +f 10985/10993/1 10986/10994/1 10987/10995/1 10988/10996/1 +f 10989/10997/1 10990/10998/1 10991/10999/1 10992/11000/1 +f 10993/11001/1 10994/11002/1 10995/11003/1 10996/11004/1 +f 10997/11005/1 10998/11006/1 10999/11007/1 11000/11008/1 +f 11001/11009/1 11002/11010/1 11003/11011/1 11004/11012/1 +f 11005/11013/1 11006/11014/1 11007/11015/1 11008/11016/1 +f 11009/11017/1 11010/11018/1 11011/11019/1 11012/11020/1 +f 11013/11021/1 11014/11022/1 11015/11023/1 11016/11024/1 +f 11017/11025/1 11018/11026/1 11019/11027/1 11020/11028/1 +f 11021/11029/1 11022/11030/1 11023/11031/1 11024/11032/1 +f 11025/11033/1 11026/11034/1 11027/11035/1 11028/11036/1 +f 11029/11037/1 11030/11038/1 11031/11039/1 11032/11040/1 +f 11033/11041/1 11034/11042/1 11035/11043/1 11036/11044/1 +f 11037/11045/1 11038/11046/1 11039/11047/1 11040/11048/1 +f 11041/11049/1 11042/11050/1 11043/11051/1 11044/11052/1 +f 11045/11053/1 11046/11054/1 11047/11055/1 11048/11056/1 +f 11049/11057/1 11050/11058/1 11051/11059/1 11052/11060/1 +f 11053/11061/1 11054/11062/1 11055/11063/1 11056/11064/1 +f 11057/11065/1 11058/11066/1 11059/11067/1 11060/11068/1 +f 11061/11069/1 11062/11070/1 11063/11071/1 11064/11072/1 +f 11065/11073/1 11066/11074/1 11067/11075/1 11068/11076/1 +f 11069/11077/1 11070/11078/1 11071/11079/1 11072/11080/1 +f 11073/11081/1 11074/11082/1 11075/11083/1 11076/11084/1 +f 11077/11085/1 11078/11086/1 11079/11087/1 11080/11088/1 +f 11081/11089/1 11082/11090/1 11083/11091/1 11084/11092/1 +f 11085/11093/1 11086/11094/1 11087/11095/1 11088/11096/1 +f 11089/11097/1 11090/11098/1 11091/11099/1 11092/11100/1 +f 11093/11101/1 11094/11102/1 11095/11103/1 11096/11104/1 +f 11097/11105/1 11098/11106/1 11099/11107/1 11100/11108/1 +f 11101/11109/1 11102/11110/1 11103/11111/1 11104/11112/1 +f 11105/11113/1 11106/11114/1 11107/11115/1 11108/11116/1 +f 11109/11117/1 11110/11118/1 11111/11119/1 11112/11120/1 +f 11113/11121/1 11114/11122/1 11115/11123/1 11116/11124/1 +f 11117/11125/1 11118/11126/1 11119/11127/1 11120/11128/1 +f 11121/11129/1 11122/11130/1 11123/11131/1 11124/11132/1 +f 11125/11133/1 11126/11134/1 11127/11135/1 11128/11136/1 +f 11129/11137/1 11130/11138/1 11131/11139/1 11132/11140/1 +f 11133/11141/1 11134/11142/1 11135/11143/1 11136/11144/1 +f 11137/11145/1 11138/11146/1 11139/11147/1 11140/11148/1 +f 11141/11149/1 11142/11150/1 11143/11151/1 11144/11152/1 +f 11145/11153/1 11146/11154/1 11147/11155/1 11148/11156/1 +f 11149/11157/1 11150/11158/1 11151/11159/1 11152/11160/1 +f 11153/11161/1 11154/11162/1 11155/11163/1 11156/11164/1 +f 11157/11165/1 11158/11166/1 11159/11167/1 11160/11168/1 +f 11161/11169/1 11162/11170/1 11163/11171/1 11164/11172/1 +f 11165/11173/1 11166/11174/1 11167/11175/1 11168/11176/1 +f 11169/11177/1 11170/11178/1 11171/11179/1 11172/11180/1 +f 11173/11181/1 11174/11182/1 11175/11183/1 11176/11184/1 +f 11177/11185/1 11178/11186/1 11179/11187/1 11180/11188/1 +f 11181/11189/1 11182/11190/1 11183/11191/1 11184/11192/1 +f 11185/11193/1 11186/11194/1 11187/11195/1 11188/11196/1 +f 11189/11197/1 11190/11198/1 11191/11199/1 11192/11200/1 +f 11193/11201/1 11194/11202/1 11195/11203/1 11196/11204/1 +f 11197/11205/1 11198/11206/1 11199/11207/1 11200/11208/1 +f 11201/11209/1 11202/11210/1 11203/11211/1 11204/11212/1 +f 11205/11213/1 11206/11214/1 11207/11215/1 11208/11216/1 +f 11209/11217/1 11210/11218/1 11211/11219/1 11212/11220/1 +f 11213/11221/1 11214/11222/1 11215/11223/1 11216/11224/1 +f 11217/11225/1 11218/11226/1 11219/11227/1 11220/11228/1 +f 11221/11229/1 11222/11230/1 11223/11231/1 11224/11232/1 +f 11225/11233/1 11226/11234/1 11227/11235/1 11228/11236/1 +f 11229/11237/1 11230/11238/1 11231/11239/1 11232/11240/1 +f 11233/11241/1 11234/11242/1 11235/11243/1 11236/11244/1 +f 11237/11245/1 11238/11246/1 11239/11247/1 11240/11248/1 +f 11241/11249/1 11242/11250/1 11243/11251/1 11244/11252/1 +f 11245/11253/1 11246/11254/1 11247/11255/1 11248/11256/1 +f 11249/11257/1 11250/11258/1 11251/11259/1 11252/11260/1 +f 11253/11261/1 11254/11262/1 11255/11263/1 11256/11264/1 +f 11257/11265/1 11258/11266/1 11259/11267/1 11260/11268/1 +f 11261/11269/1 11262/11270/1 11263/11271/1 11264/11272/1 +f 11265/11273/1 11266/11274/1 11267/11275/1 11268/11276/1 +f 11269/11277/1 11270/11278/1 11271/11279/1 11272/11280/1 +f 11273/11281/1 11274/11282/1 11275/11283/1 11276/11284/1 +f 11277/11285/1 11278/11286/1 11279/11287/1 11280/11288/1 +f 11281/11289/1 11282/11290/1 11283/11291/1 11284/11292/1 +f 11285/11293/1 11286/11294/1 11287/11295/1 11288/11296/1 +f 11289/11297/1 11290/11298/1 11291/11299/1 11292/11300/1 +f 11293/11301/1 11294/11302/1 11295/11303/1 11296/11304/1 +f 11297/11305/1 11298/11306/1 11299/11307/1 11300/11308/1 +f 11301/11309/1 11302/11310/1 11303/11311/1 11304/11312/1 +f 11305/11313/1 11306/11314/1 11307/11315/1 11308/11316/1 +f 11309/11317/1 11310/11318/1 11311/11319/1 11312/11320/1 +f 11313/11321/1 11314/11322/1 11315/11323/1 11316/11324/1 +f 11317/11325/1 11318/11326/1 11319/11327/1 11320/11328/1 +f 11321/11329/1 11322/11330/1 11323/11331/1 11324/11332/1 +f 11325/11333/1 11326/11334/1 11327/11335/1 11328/11336/1 +f 11329/11337/1 11330/11338/1 11331/11339/1 11332/11340/1 +f 11333/11341/1 11334/11342/1 11335/11343/1 11336/11344/1 +f 11337/11345/1 11338/11346/1 11339/11347/1 11340/11348/1 +f 11341/11349/1 11342/11350/1 11343/11351/1 11344/11352/1 +f 11345/11353/1 11346/11354/1 11347/11355/1 11348/11356/1 +f 11349/11357/1 11350/11358/1 11351/11359/1 11352/11360/1 +f 11353/11361/1 11354/11362/1 11355/11363/1 11356/11364/1 +f 11357/11365/1 11358/11366/1 11359/11367/1 11360/11368/1 +f 11361/11369/1 11362/11370/1 11363/11371/1 11364/11372/1 +f 11365/11373/1 11366/11374/1 11367/11375/1 11368/11376/1 +f 11369/11377/1 11370/11378/1 11371/11379/1 11372/11380/1 +f 11373/11381/1 11374/11382/1 11375/11383/1 11376/11384/1 +f 11377/11385/1 11378/11386/1 11379/11387/1 11380/11388/1 +f 11381/11389/1 11382/11390/1 11383/11391/1 11384/11392/1 +f 11385/11393/1 11386/11394/1 11387/11395/1 11388/11396/1 +f 11389/11397/1 11390/11398/1 11391/11399/1 11392/11400/1 +f 11393/11401/1 11394/11402/1 11395/11403/1 11396/11404/1 +f 11397/11405/1 11398/11406/1 11399/11407/1 11400/11408/1 +f 11401/11409/1 11402/11410/1 11403/11411/1 11404/11412/1 +f 11405/11413/1 11406/11414/1 11407/11415/1 11408/11416/1 +f 11409/11417/1 11410/11418/1 11411/11419/1 11412/11420/1 +f 11413/11421/1 11414/11422/1 11415/11423/1 11416/11424/1 +f 11417/11425/1 11418/11426/1 11419/11427/1 11420/11428/1 +f 11421/11429/1 11422/11430/1 11423/11431/1 11424/11432/1 +f 11425/11433/1 11426/11434/1 11427/11435/1 11428/11436/1 +f 11429/11437/1 11430/11438/1 11431/11439/1 11432/11440/1 +f 11433/11441/1 11434/11442/1 11435/11443/1 11436/11444/1 +f 11437/11445/1 11438/11446/1 11439/11447/1 11440/11448/1 +f 11441/11449/1 11442/11450/1 11443/11451/1 11444/11452/1 +f 11445/11453/1 11446/11454/1 11447/11455/1 11448/11456/1 +f 11449/11457/1 11450/11458/1 11451/11459/1 11452/11460/1 +f 11453/11461/1 11454/11462/1 11455/11463/1 11456/11464/1 +f 11457/11465/1 11458/11466/1 11459/11467/1 11460/11468/1 +f 11461/11469/1 11462/11470/1 11463/11471/1 11464/11472/1 +f 11465/11473/1 11466/11474/1 11467/11475/1 11468/11476/1 +f 11469/11477/1 11470/11478/1 11471/11479/1 11472/11480/1 +f 11473/11481/1 11474/11482/1 11475/11483/1 11476/11484/1 +f 11477/11485/1 11478/11486/1 11479/11487/1 11480/11488/1 +f 11481/11489/1 11482/11490/1 11483/11491/1 11484/11492/1 +f 11485/11493/1 11486/11494/1 11487/11495/1 11488/11496/1 +f 11489/11497/1 11490/11498/1 11491/11499/1 11492/11500/1 +f 11493/11501/1 11494/11502/1 11495/11503/1 11496/11504/1 +f 11497/11505/1 11498/11506/1 11499/11507/1 11500/11508/1 +f 11501/11509/1 11502/11510/1 11503/11511/1 11504/11512/1 +f 11505/11513/1 11506/11514/1 11507/11515/1 11508/11516/1 +f 11509/11517/1 11510/11518/1 11511/11519/1 11512/11520/1 +f 11513/11521/1 11514/11522/1 11515/11523/1 11516/11524/1 +f 11517/11525/1 11518/11526/1 11519/11527/1 11520/11528/1 +f 11521/11529/1 11522/11530/1 11523/11531/1 11524/11532/1 +f 11525/11533/1 11526/11534/1 11527/11535/1 11528/11536/1 +f 11529/11537/1 11530/11538/1 11531/11539/1 11532/11540/1 +f 11533/11541/1 11534/11542/1 11535/11543/1 11536/11544/1 +f 11537/11545/1 11538/11546/1 11539/11547/1 11540/11548/1 +f 11541/11549/1 11542/11550/1 11543/11551/1 11544/11552/1 +f 11545/11553/1 11546/11554/1 11547/11555/1 11548/11556/1 +f 11549/11557/1 11550/11558/1 11551/11559/1 11552/11560/1 +f 11553/11561/1 11554/11562/1 11555/11563/1 11556/11564/1 +f 11557/11565/1 11558/11566/1 11559/11567/1 11560/11568/1 +f 11561/11569/1 11562/11570/1 11563/11571/1 11564/11572/1 +f 11565/11573/1 11566/11574/1 11567/11575/1 11568/11576/1 +f 11569/11577/1 11570/11578/1 11571/11579/1 11572/11580/1 +f 11573/11581/1 11574/11582/1 11575/11583/1 11576/11584/1 +f 11577/11585/1 11578/11586/1 11579/11587/1 11580/11588/1 +f 11581/11589/1 11582/11590/1 11583/11591/1 11584/11592/1 +f 11585/11593/1 11586/11594/1 11587/11595/1 11588/11596/1 +f 11589/11597/1 11590/11598/1 11591/11599/1 11592/11600/1 +f 11593/11601/1 11594/11602/1 11595/11603/1 11596/11604/1 +f 11597/11605/1 11598/11606/1 11599/11607/1 11600/11608/1 +f 11601/11609/1 11602/11610/1 11603/11611/1 11604/11612/1 +f 11605/11613/1 11606/11614/1 11607/11615/1 11608/11616/1 +f 11609/11617/1 11610/11618/1 11611/11619/1 11612/11620/1 +f 11613/11621/1 11614/11622/1 11615/11623/1 11616/11624/1 +f 11617/11625/1 11618/11626/1 11619/11627/1 11620/11628/1 +f 11621/11629/1 11622/11630/1 11623/11631/1 11624/11632/1 +f 11625/11633/1 11626/11634/1 11627/11635/1 11628/11636/1 +f 11629/11637/1 11630/11638/1 11631/11639/1 11632/11640/1 +f 11633/11641/1 11634/11642/1 11635/11643/1 11636/11644/1 +f 11637/11645/1 11638/11646/1 11639/11647/1 11640/11648/1 +f 11641/11649/1 11642/11650/1 11643/11651/1 11644/11652/1 +f 11645/11653/1 11646/11654/1 11647/11655/1 11648/11656/1 +f 11649/11657/1 11650/11658/1 11651/11659/1 11652/11660/1 +f 11653/11661/1 11654/11662/1 11655/11663/1 11656/11664/1 +f 11657/11665/1 11658/11666/1 11659/11667/1 11660/11668/1 +f 11661/11669/1 11662/11670/1 11663/11671/1 11664/11672/1 +f 11665/11673/1 11666/11674/1 11667/11675/1 11668/11676/1 +f 11669/11677/1 11670/11678/1 11671/11679/1 11672/11680/1 +f 11673/11681/1 11674/11682/1 11675/11683/1 11676/11684/1 +f 11677/11685/1 11678/11686/1 11679/11687/1 11680/11688/1 +f 11681/11689/1 11682/11690/1 11683/11691/1 11684/11692/1 +f 11685/11693/1 11686/11694/1 11687/11695/1 11688/11696/1 +f 11689/11697/1 11690/11698/1 11691/11699/1 11692/11700/1 +f 11693/11701/1 11694/11702/1 11695/11703/1 11696/11704/1 +f 11697/11705/1 11698/11706/1 11699/11707/1 11700/11708/1 +f 11701/11709/1 11702/11710/1 11703/11711/1 11704/11712/1 +f 11705/11713/1 11706/11714/1 11707/11715/1 11708/11716/1 +f 11709/11717/1 11710/11718/1 11711/11719/1 11712/11720/1 +f 11713/11721/1 11714/11722/1 11715/11723/1 11716/11724/1 +f 11717/11725/1 11718/11726/1 11719/11727/1 11720/11728/1 +f 11721/11729/1 11722/11730/1 11723/11731/1 11724/11732/1 +f 11725/11733/1 11726/11734/1 11727/11735/1 11728/11736/1 +f 11729/11737/1 11730/11738/1 11731/11739/1 11732/11740/1 +f 11733/11741/1 11734/11742/1 11735/11743/1 11736/11744/1 +f 11737/11745/1 11738/11746/1 11739/11747/1 11740/11748/1 +f 11741/11749/1 11742/11750/1 11743/11751/1 11744/11752/1 +f 11745/11753/1 11746/11754/1 11747/11755/1 11748/11756/1 +f 11749/11757/1 11750/11758/1 11751/11759/1 11752/11760/1 +f 11753/11761/1 11754/11762/1 11755/11763/1 11756/11764/1 +f 11757/11765/1 11758/11766/1 11759/11767/1 11760/11768/1 +f 11761/11769/1 11762/11770/1 11763/11771/1 11764/11772/1 +f 11765/11773/1 11766/11774/1 11767/11775/1 11768/11776/1 +f 11769/11777/1 11770/11778/1 11771/11779/1 11772/11780/1 +f 11773/11781/1 11774/11782/1 11775/11783/1 11776/11784/1 +f 11777/11785/1 11778/11786/1 11779/11787/1 11780/11788/1 +f 11781/11789/1 11782/11790/1 11783/11791/1 11784/11792/1 +f 11785/11793/1 11786/11794/1 11787/11795/1 11788/11796/1 +f 11789/11797/1 11790/11798/1 11791/11799/1 11792/11800/1 +f 11793/11801/1 11794/11802/1 11795/11803/1 11796/11804/1 +f 11797/11805/1 11798/11806/1 11799/11807/1 11800/11808/1 +f 11801/11809/1 11802/11810/1 11803/11811/1 11804/11812/1 +f 11805/11813/1 11806/11814/1 11807/11815/1 11808/11816/1 +f 11809/11817/1 11810/11818/1 11811/11819/1 11812/11820/1 +f 11813/11821/1 11814/11822/1 11815/11823/1 11816/11824/1 +f 11817/11825/1 11818/11826/1 11819/11827/1 11820/11828/1 +f 11821/11829/1 11822/11830/1 11823/11831/1 11824/11832/1 +f 11825/11833/1 11826/11834/1 11827/11835/1 11828/11836/1 +f 11829/11837/1 11830/11838/1 11831/11839/1 11832/11840/1 +f 11833/11841/1 11834/11842/1 11835/11843/1 11836/11844/1 +f 11837/11845/1 11838/11846/1 11839/11847/1 11840/11848/1 +f 11841/11849/1 11842/11850/1 11843/11851/1 11844/11852/1 +f 11845/11853/1 11846/11854/1 11847/11855/1 11848/11856/1 +f 11849/11857/1 11850/11858/1 11851/11859/1 11852/11860/1 +f 11853/11861/1 11854/11862/1 11855/11863/1 11856/11864/1 +f 11857/11865/1 11858/11866/1 11859/11867/1 11860/11868/1 +f 11861/11869/1 11862/11870/1 11863/11871/1 11864/11872/1 +f 11865/11873/1 11866/11874/1 11867/11875/1 11868/11876/1 +f 11869/11877/1 11870/11878/1 11871/11879/1 11872/11880/1 +f 11873/11881/1 11874/11882/1 11875/11883/1 11876/11884/1 +f 11877/11885/1 11878/11886/1 11879/11887/1 11880/11888/1 +f 11881/11889/1 11882/11890/1 11883/11891/1 11884/11892/1 +f 11885/11893/1 11886/11894/1 11887/11895/1 11888/11896/1 +f 11889/11897/1 11890/11898/1 11891/11899/1 11892/11900/1 +f 11893/11901/1 11894/11902/1 11895/11903/1 11896/11904/1 +f 11897/11905/1 11898/11906/1 11899/11907/1 11900/11908/1 +f 11901/11909/1 11902/11910/1 11903/11911/1 11904/11912/1 +f 11905/11913/1 11906/11914/1 11907/11915/1 11908/11916/1 +f 11909/11917/1 11910/11918/1 11911/11919/1 11912/11920/1 +f 11913/11921/1 11914/11922/1 11915/11923/1 11916/11924/1 +f 11917/11925/1 11918/11926/1 11919/11927/1 11920/11928/1 +f 11921/11929/1 11922/11930/1 11923/11931/1 11924/11932/1 +f 11925/11933/1 11926/11934/1 11927/11935/1 11928/11936/1 +f 11929/11937/1 11930/11938/1 11931/11939/1 11932/11940/1 +f 11933/11941/1 11934/11942/1 11935/11943/1 11936/11944/1 +f 11937/11945/1 11938/11946/1 11939/11947/1 11940/11948/1 +f 11941/11949/1 11942/11950/1 11943/11951/1 11944/11952/1 +f 11945/11953/1 11946/11954/1 11947/11955/1 11948/11956/1 +f 11949/11957/1 11950/11958/1 11951/11959/1 11952/11960/1 +f 11953/11961/1 11954/11962/1 11955/11963/1 11956/11964/1 +f 11957/11965/1 11958/11966/1 11959/11967/1 11960/11968/1 +f 11961/11969/1 11962/11970/1 11963/11971/1 11964/11972/1 +f 11965/11973/1 11966/11974/1 11967/11975/1 11968/11976/1 +f 11969/11977/1 11970/11978/1 11971/11979/1 11972/11980/1 +f 11973/11981/1 11974/11982/1 11975/11983/1 11976/11984/1 +f 11977/11985/1 11978/11986/1 11979/11987/1 11980/11988/1 +f 11981/11989/1 11982/11990/1 11983/11991/1 11984/11992/1 +f 11985/11993/1 11986/11994/1 11987/11995/1 11988/11996/1 +f 11989/11997/1 11990/11998/1 11991/11999/1 11992/12000/1 +f 11993/12001/1 11994/12002/1 11995/12003/1 11996/12004/1 +f 11997/12005/1 11998/12006/1 11999/12007/1 12000/12008/1 +f 12001/12009/1 12002/12010/1 12003/12011/1 12004/12012/1 +f 12005/12013/1 12006/12014/1 12007/12015/1 12008/12016/1 +f 12009/12017/1 12010/12018/1 12011/12019/1 12012/12020/1 +f 12013/12021/1 12014/12022/1 12015/12023/1 12016/12024/1 +f 12017/12025/1 12018/12026/1 12019/12027/1 12020/12028/1 +f 12021/12029/1 12022/12030/1 12023/12031/1 12024/12032/1 +f 12025/12033/1 12026/12034/1 12027/12035/1 12028/12036/1 +f 12029/12037/1 12030/12038/1 12031/12039/1 12032/12040/1 +f 12033/12041/1 12034/12042/1 12035/12043/1 12036/12044/1 +f 12037/12045/1 12038/12046/1 12039/12047/1 12040/12048/1 +f 12041/12049/1 12042/12050/1 12043/12051/1 12044/12052/1 +f 12045/12053/1 12046/12054/1 12047/12055/1 12048/12056/1 +f 12049/12057/1 12050/12058/1 12051/12059/1 12052/12060/1 +f 12053/12061/1 12054/12062/1 12055/12063/1 12056/12064/1 +f 12057/12065/1 12058/12066/1 12059/12067/1 12060/12068/1 +f 12061/12069/1 12062/12070/1 12063/12071/1 12064/12072/1 +f 12065/12073/1 12066/12074/1 12067/12075/1 12068/12076/1 +f 12069/12077/1 12070/12078/1 12071/12079/1 12072/12080/1 +f 12073/12081/1 12074/12082/1 12075/12083/1 12076/12084/1 +f 12077/12085/1 12078/12086/1 12079/12087/1 12080/12088/1 +f 12081/12089/1 12082/12090/1 12083/12091/1 12084/12092/1 +f 12085/12093/1 12086/12094/1 12087/12095/1 12088/12096/1 +f 12089/12097/1 12090/12098/1 12091/12099/1 12092/12100/1 +f 12093/12101/1 12094/12102/1 12095/12103/1 12096/12104/1 +f 12097/12105/1 12098/12106/1 12099/12107/1 12100/12108/1 +f 12101/12109/1 12102/12110/1 12103/12111/1 12104/12112/1 +f 12105/12113/1 12106/12114/1 12107/12115/1 12108/12116/1 +f 12109/12117/1 12110/12118/1 12111/12119/1 12112/12120/1 +f 12113/12121/1 12114/12122/1 12115/12123/1 12116/12124/1 +f 12117/12125/1 12118/12126/1 12119/12127/1 12120/12128/1 +f 12121/12129/1 12122/12130/1 12123/12131/1 12124/12132/1 +f 12125/12133/1 12126/12134/1 12127/12135/1 12128/12136/1 +f 12129/12137/1 12130/12138/1 12131/12139/1 12132/12140/1 +f 12133/12141/1 12134/12142/1 12135/12143/1 12136/12144/1 +f 12137/12145/1 12138/12146/1 12139/12147/1 12140/12148/1 +f 12141/12149/1 12142/12150/1 12143/12151/1 12144/12152/1 +f 12145/12153/1 12146/12154/1 12147/12155/1 12148/12156/1 +f 12149/12157/1 12150/12158/1 12151/12159/1 12152/12160/1 +f 12153/12161/1 12154/12162/1 12155/12163/1 12156/12164/1 +f 12157/12165/1 12158/12166/1 12159/12167/1 12160/12168/1 +f 12161/12169/1 12162/12170/1 12163/12171/1 12164/12172/1 +f 12165/12173/1 12166/12174/1 12167/12175/1 12168/12176/1 +f 12169/12177/1 12170/12178/1 12171/12179/1 12172/12180/1 +f 12173/12181/1 12174/12182/1 12175/12183/1 12176/12184/1 +f 12177/12185/1 12178/12186/1 12179/12187/1 12180/12188/1 +f 12181/12189/1 12182/12190/1 12183/12191/1 12184/12192/1 +f 12185/12193/1 12186/12194/1 12187/12195/1 12188/12196/1 +f 12189/12197/1 12190/12198/1 12191/12199/1 12192/12200/1 +f 12193/12201/1 12194/12202/1 12195/12203/1 12196/12204/1 +f 12197/12205/1 12198/12206/1 12199/12207/1 12200/12208/1 +f 12201/12209/1 12202/12210/1 12203/12211/1 12204/12212/1 +f 12205/12213/1 12206/12214/1 12207/12215/1 12208/12216/1 +f 12209/12217/1 12210/12218/1 12211/12219/1 12212/12220/1 +f 12213/12221/1 12214/12222/1 12215/12223/1 12216/12224/1 +f 12217/12225/1 12218/12226/1 12219/12227/1 12220/12228/1 +f 12221/12229/1 12222/12230/1 12223/12231/1 12224/12232/1 +f 12225/12233/1 12226/12234/1 12227/12235/1 12228/12236/1 +f 12229/12237/1 12230/12238/1 12231/12239/1 12232/12240/1 +f 12233/12241/1 12234/12242/1 12235/12243/1 12236/12244/1 +f 12237/12245/1 12238/12246/1 12239/12247/1 12240/12248/1 +f 12241/12249/1 12242/12250/1 12243/12251/1 12244/12252/1 +f 12245/12253/1 12246/12254/1 12247/12255/1 12248/12256/1 +f 12249/12257/1 12250/12258/1 12251/12259/1 12252/12260/1 +f 12253/12261/1 12254/12262/1 12255/12263/1 12256/12264/1 +f 12257/12265/1 12258/12266/1 12259/12267/1 12260/12268/1 +f 12261/12269/1 12262/12270/1 12263/12271/1 12264/12272/1 +f 12265/12273/1 12266/12274/1 12267/12275/1 12268/12276/1 +f 12269/12277/1 12270/12278/1 12271/12279/1 12272/12280/1 +f 12273/12281/1 12274/12282/1 12275/12283/1 12276/12284/1 +f 12277/12285/1 12278/12286/1 12279/12287/1 12280/12288/1 +f 12281/12289/1 12282/12290/1 12283/12291/1 12284/12292/1 +f 12285/12293/1 12286/12294/1 12287/12295/1 12288/12296/1 +f 12289/12297/1 12290/12298/1 12291/12299/1 12292/12300/1 +f 12293/12301/1 12294/12302/1 12295/12303/1 12296/12304/1 +f 12297/12305/1 12298/12306/1 12299/12307/1 12300/12308/1 +f 12301/12309/1 12302/12310/1 12303/12311/1 12304/12312/1 +f 12305/12313/1 12306/12314/1 12307/12315/1 12308/12316/1 +f 12309/12317/1 12310/12318/1 12311/12319/1 12312/12320/1 +f 12313/12321/1 12314/12322/1 12315/12323/1 12316/12324/1 +f 12317/12325/1 12318/12326/1 12319/12327/1 12320/12328/1 +f 12321/12329/1 12322/12330/1 12323/12331/1 12324/12332/1 +f 12325/12333/1 12326/12334/1 12327/12335/1 12328/12336/1 +f 12329/12337/1 12330/12338/1 12331/12339/1 12332/12340/1 +f 12333/12341/1 12334/12342/1 12335/12343/1 12336/12344/1 +f 12337/12345/1 12338/12346/1 12339/12347/1 12340/12348/1 +f 12341/12349/1 12342/12350/1 12343/12351/1 12344/12352/1 +f 12345/12353/1 12346/12354/1 12347/12355/1 12348/12356/1 +f 12349/12357/1 12350/12358/1 12351/12359/1 12352/12360/1 +f 12353/12361/1 12354/12362/1 12355/12363/1 12356/12364/1 +f 12357/12365/1 12358/12366/1 12359/12367/1 12360/12368/1 +f 12361/12369/1 12362/12370/1 12363/12371/1 12364/12372/1 +f 12365/12373/1 12366/12374/1 12367/12375/1 12368/12376/1 +f 12369/12377/1 12370/12378/1 12371/12379/1 12372/12380/1 +f 12373/12381/1 12374/12382/1 12375/12383/1 12376/12384/1 +f 12377/12385/1 12378/12386/1 12379/12387/1 12380/12388/1 +f 12381/12389/1 12382/12390/1 12383/12391/1 12384/12392/1 +f 12385/12393/1 12386/12394/1 12387/12395/1 12388/12396/1 +f 12389/12397/1 12390/12398/1 12391/12399/1 12392/12400/1 +f 12393/12401/1 12394/12402/1 12395/12403/1 12396/12404/1 +f 12397/12405/1 12398/12406/1 12399/12407/1 12400/12408/1 +f 12401/12409/1 12402/12410/1 12403/12411/1 12404/12412/1 +f 12405/12413/1 12406/12414/1 12407/12415/1 12408/12416/1 +f 12409/12417/1 12410/12418/1 12411/12419/1 12412/12420/1 +f 12413/12421/1 12414/12422/1 12415/12423/1 12416/12424/1 +f 12417/12425/1 12418/12426/1 12419/12427/1 12420/12428/1 +f 12421/12429/1 12422/12430/1 12423/12431/1 12424/12432/1 +f 12425/12433/1 12426/12434/1 12427/12435/1 12428/12436/1 +f 12429/12437/1 12430/12438/1 12431/12439/1 12432/12440/1 +f 12433/12441/1 12434/12442/1 12435/12443/1 12436/12444/1 +f 12437/12445/1 12438/12446/1 12439/12447/1 12440/12448/1 +f 12441/12449/1 12442/12450/1 12443/12451/1 12444/12452/1 +f 12445/12453/1 12446/12454/1 12447/12455/1 12448/12456/1 +f 12449/12457/1 12450/12458/1 12451/12459/1 12452/12460/1 +f 12453/12461/1 12454/12462/1 12455/12463/1 12456/12464/1 +f 12457/12465/1 12458/12466/1 12459/12467/1 12460/12468/1 +f 12461/12469/1 12462/12470/1 12463/12471/1 12464/12472/1 +f 12465/12473/1 12466/12474/1 12467/12475/1 12468/12476/1 +f 12469/12477/1 12470/12478/1 12471/12479/1 12472/12480/1 +f 12473/12481/1 12474/12482/1 12475/12483/1 12476/12484/1 +f 12477/12485/1 12478/12486/1 12479/12487/1 12480/12488/1 +f 12481/12489/1 12482/12490/1 12483/12491/1 12484/12492/1 +f 12485/12493/1 12486/12494/1 12487/12495/1 12488/12496/1 +f 12489/12497/1 12490/12498/1 12491/12499/1 12492/12500/1 +f 12493/12501/1 12494/12502/1 12495/12503/1 12496/12504/1 +f 12497/12505/1 12498/12506/1 12499/12507/1 12500/12508/1 +f 12501/12509/1 12502/12510/1 12503/12511/1 12504/12512/1 +f 12505/12513/1 12506/12514/1 12507/12515/1 12508/12516/1 +f 12509/12517/1 12510/12518/1 12511/12519/1 12512/12520/1 +f 12513/12521/1 12514/12522/1 12515/12523/1 12516/12524/1 +f 12517/12525/1 12518/12526/1 12519/12527/1 12520/12528/1 +f 12521/12529/1 12522/12530/1 12523/12531/1 12524/12532/1 +f 12525/12533/1 12526/12534/1 12527/12535/1 12528/12536/1 +f 12529/12537/1 12530/12538/1 12531/12539/1 12532/12540/1 +f 12533/12541/1 12534/12542/1 12535/12543/1 12536/12544/1 +f 12537/12545/1 12538/12546/1 12539/12547/1 12540/12548/1 +f 12541/12549/1 12542/12550/1 12543/12551/1 12544/12552/1 +f 12545/12553/1 12546/12554/1 12547/12555/1 12548/12556/1 +f 12549/12557/1 12550/12558/1 12551/12559/1 12552/12560/1 +f 12553/12561/1 12554/12562/1 12555/12563/1 12556/12564/1 +f 12557/12565/1 12558/12566/1 12559/12567/1 12560/12568/1 +f 12561/12569/1 12562/12570/1 12563/12571/1 12564/12572/1 +f 12565/12573/1 12566/12574/1 12567/12575/1 12568/12576/1 +f 12569/12577/1 12570/12578/1 12571/12579/1 12572/12580/1 +f 12573/12581/1 12574/12582/1 12575/12583/1 12576/12584/1 +f 12577/12585/1 12578/12586/1 12579/12587/1 12580/12588/1 +f 12581/12589/1 12582/12590/1 12583/12591/1 12584/12592/1 +f 12585/12593/1 12586/12594/1 12587/12595/1 12588/12596/1 +f 12589/12597/1 12590/12598/1 12591/12599/1 12592/12600/1 +f 12593/12601/1 12594/12602/1 12595/12603/1 12596/12604/1 +f 12597/12605/1 12598/12606/1 12599/12607/1 12600/12608/1 +f 12601/12609/1 12602/12610/1 12603/12611/1 12604/12612/1 +f 12605/12613/1 12606/12614/1 12607/12615/1 12608/12616/1 +f 12609/12617/1 12610/12618/1 12611/12619/1 12612/12620/1 +f 12613/12621/1 12614/12622/1 12615/12623/1 12616/12624/1 +f 12617/12625/1 12618/12626/1 12619/12627/1 12620/12628/1 +f 12621/12629/1 12622/12630/1 12623/12631/1 12624/12632/1 +f 12625/12633/1 12626/12634/1 12627/12635/1 12628/12636/1 +f 12629/12637/1 12630/12638/1 12631/12639/1 12632/12640/1 +f 12633/12641/1 12634/12642/1 12635/12643/1 12636/12644/1 +f 12637/12645/1 12638/12646/1 12639/12647/1 12640/12648/1 +f 12641/12649/1 12642/12650/1 12643/12651/1 12644/12652/1 +f 12645/12653/1 12646/12654/1 12647/12655/1 12648/12656/1 +f 12649/12657/1 12650/12658/1 12651/12659/1 12652/12660/1 +f 12653/12661/1 12654/12662/1 12655/12663/1 12656/12664/1 +f 12657/12665/1 12658/12666/1 12659/12667/1 12660/12668/1 +f 12661/12669/1 12662/12670/1 12663/12671/1 12664/12672/1 +f 12665/12673/1 12666/12674/1 12667/12675/1 12668/12676/1 +f 12669/12677/1 12670/12678/1 12671/12679/1 12672/12680/1 +f 12673/12681/1 12674/12682/1 12675/12683/1 12676/12684/1 +f 12677/12685/1 12678/12686/1 12679/12687/1 12680/12688/1 +f 12681/12689/1 12682/12690/1 12683/12691/1 12684/12692/1 +f 12685/12693/1 12686/12694/1 12687/12695/1 12688/12696/1 +f 12689/12697/1 12690/12698/1 12691/12699/1 12692/12700/1 +f 12693/12701/1 12694/12702/1 12695/12703/1 12696/12704/1 +f 12697/12705/1 12698/12706/1 12699/12707/1 12700/12708/1 +f 12701/12709/1 12702/12710/1 12703/12711/1 12704/12712/1 +f 12705/12713/1 12706/12714/1 12707/12715/1 12708/12716/1 +f 12709/12717/1 12710/12718/1 12711/12719/1 12712/12720/1 +f 12713/12721/1 12714/12722/1 12715/12723/1 12716/12724/1 +f 12717/12725/1 12718/12726/1 12719/12727/1 12720/12728/1 +f 12721/12729/1 12722/12730/1 12723/12731/1 12724/12732/1 +f 12725/12733/1 12726/12734/1 12727/12735/1 12728/12736/1 +f 12729/12737/1 12730/12738/1 12731/12739/1 12732/12740/1 +f 12733/12741/1 12734/12742/1 12735/12743/1 12736/12744/1 +f 12737/12745/1 12738/12746/1 12739/12747/1 12740/12748/1 +f 12741/12749/1 12742/12750/1 12743/12751/1 12744/12752/1 +f 12745/12753/1 12746/12754/1 12747/12755/1 12748/12756/1 +f 12749/12757/1 12750/12758/1 12751/12759/1 12752/12760/1 +f 12753/12761/1 12754/12762/1 12755/12763/1 12756/12764/1 +f 12757/12765/1 12758/12766/1 12759/12767/1 12760/12768/1 +f 12761/12769/1 12762/12770/1 12763/12771/1 12764/12772/1 +f 12765/12773/1 12766/12774/1 12767/12775/1 12768/12776/1 +f 12769/12777/1 12770/12778/1 12771/12779/1 12772/12780/1 +f 12773/12781/1 12774/12782/1 12775/12783/1 12776/12784/1 +f 12777/12785/1 12778/12786/1 12779/12787/1 12780/12788/1 +f 12781/12789/1 12782/12790/1 12783/12791/1 12784/12792/1 +f 12785/12793/1 12786/12794/1 12787/12795/1 12788/12796/1 +f 12789/12797/1 12790/12798/1 12791/12799/1 12792/12800/1 +f 12793/12801/1 12794/12802/1 12795/12803/1 12796/12804/1 +f 12797/12805/1 12798/12806/1 12799/12807/1 12800/12808/1 +f 12801/12809/1 12802/12810/1 12803/12811/1 12804/12812/1 +f 12805/12813/1 12806/12814/1 12807/12815/1 12808/12816/1 +f 12809/12817/1 12810/12818/1 12811/12819/1 12812/12820/1 +f 12813/12821/1 12814/12822/1 12815/12823/1 12816/12824/1 +f 12817/12825/1 12818/12826/1 12819/12827/1 12820/12828/1 +f 12821/12829/1 12822/12830/1 12823/12831/1 12824/12832/1 +f 12825/12833/1 12826/12834/1 12827/12835/1 12828/12836/1 +f 12829/12837/1 12830/12838/1 12831/12839/1 12832/12840/1 +f 12833/12841/1 12834/12842/1 12835/12843/1 12836/12844/1 +f 12837/12845/1 12838/12846/1 12839/12847/1 12840/12848/1 +f 12841/12849/1 12842/12850/1 12843/12851/1 12844/12852/1 +f 12845/12853/1 12846/12854/1 12847/12855/1 12848/12856/1 +f 12849/12857/1 12850/12858/1 12851/12859/1 12852/12860/1 +f 12853/12861/1 12854/12862/1 12855/12863/1 12856/12864/1 +f 12857/12865/1 12858/12866/1 12859/12867/1 12860/12868/1 +f 12861/12869/1 12862/12870/1 12863/12871/1 12864/12872/1 +f 12865/12873/1 12866/12874/1 12867/12875/1 12868/12876/1 +f 12869/12877/1 12870/12878/1 12871/12879/1 12872/12880/1 +f 12873/12881/1 12874/12882/1 12875/12883/1 12876/12884/1 +f 12877/12885/1 12878/12886/1 12879/12887/1 12880/12888/1 +f 12881/12889/1 12882/12890/1 12883/12891/1 12884/12892/1 +f 12885/12893/1 12886/12894/1 12887/12895/1 12888/12896/1 +f 12889/12897/1 12890/12898/1 12891/12899/1 12892/12900/1 +f 12893/12901/1 12894/12902/1 12895/12903/1 12896/12904/1 +f 12897/12905/1 12898/12906/1 12899/12907/1 12900/12908/1 +f 12901/12909/1 12902/12910/1 12903/12911/1 12904/12912/1 +f 12905/12913/1 12906/12914/1 12907/12915/1 12908/12916/1 +f 12909/12917/1 12910/12918/1 12911/12919/1 12912/12920/1 +f 12913/12921/1 12914/12922/1 12915/12923/1 12916/12924/1 +f 12917/12925/1 12918/12926/1 12919/12927/1 12920/12928/1 +f 12921/12929/1 12922/12930/1 12923/12931/1 12924/12932/1 +f 12925/12933/1 12926/12934/1 12927/12935/1 12928/12936/1 +f 12929/12937/1 12930/12938/1 12931/12939/1 12932/12940/1 +f 12933/12941/1 12934/12942/1 12935/12943/1 12936/12944/1 +f 12937/12945/1 12938/12946/1 12939/12947/1 12940/12948/1 +f 12941/12949/1 12942/12950/1 12943/12951/1 12944/12952/1 +f 12945/12953/1 12946/12954/1 12947/12955/1 12948/12956/1 +f 12949/12957/1 12950/12958/1 12951/12959/1 12952/12960/1 +f 12953/12961/1 12954/12962/1 12955/12963/1 12956/12964/1 +f 12957/12965/1 12958/12966/1 12959/12967/1 12960/12968/1 +f 12961/12969/1 12962/12970/1 12963/12971/1 12964/12972/1 +f 12965/12973/1 12966/12974/1 12967/12975/1 12968/12976/1 +f 12969/12977/1 12970/12978/1 12971/12979/1 12972/12980/1 +f 12973/12981/1 12974/12982/1 12975/12983/1 12976/12984/1 +f 12977/12985/1 12978/12986/1 12979/12987/1 12980/12988/1 +f 12981/12989/1 12982/12990/1 12983/12991/1 12984/12992/1 +f 12985/12993/1 12986/12994/1 12987/12995/1 12988/12996/1 +f 12989/12997/1 12990/12998/1 12991/12999/1 12992/13000/1 +f 12993/13001/1 12994/13002/1 12995/13003/1 12996/13004/1 +f 12997/13005/1 12998/13006/1 12999/13007/1 13000/13008/1 +f 13001/13009/1 13002/13010/1 13003/13011/1 13004/13012/1 +f 13005/13013/1 13006/13014/1 13007/13015/1 13008/13016/1 +f 13009/13017/1 13010/13018/1 13011/13019/1 13012/13020/1 +f 13013/13021/1 13014/13022/1 13015/13023/1 13016/13024/1 +f 13017/13025/1 13018/13026/1 13019/13027/1 13020/13028/1 +f 13021/13029/1 13022/13030/1 13023/13031/1 13024/13032/1 +f 13025/13033/1 13026/13034/1 13027/13035/1 13028/13036/1 +f 13029/13037/1 13030/13038/1 13031/13039/1 13032/13040/1 +f 13033/13041/1 13034/13042/1 13035/13043/1 13036/13044/1 +f 13037/13045/1 13038/13046/1 13039/13047/1 13040/13048/1 +f 13041/13049/1 13042/13050/1 13043/13051/1 13044/13052/1 +f 13045/13053/1 13046/13054/1 13047/13055/1 13048/13056/1 +f 13049/13057/1 13050/13058/1 13051/13059/1 13052/13060/1 +f 13053/13061/1 13054/13062/1 13055/13063/1 13056/13064/1 +f 13057/13065/1 13058/13066/1 13059/13067/1 13060/13068/1 +f 13061/13069/1 13062/13070/1 13063/13071/1 13064/13072/1 +f 13065/13073/1 13066/13074/1 13067/13075/1 13068/13076/1 +f 13069/13077/1 13070/13078/1 13071/13079/1 13072/13080/1 +f 13073/13081/1 13074/13082/1 13075/13083/1 13076/13084/1 +f 13077/13085/1 13078/13086/1 13079/13087/1 13080/13088/1 +f 13081/13089/1 13082/13090/1 13083/13091/1 13084/13092/1 +f 13085/13093/1 13086/13094/1 13087/13095/1 13088/13096/1 +f 13089/13097/1 13090/13098/1 13091/13099/1 13092/13100/1 +f 13093/13101/1 13094/13102/1 13095/13103/1 13096/13104/1 +f 13097/13105/1 13098/13106/1 13099/13107/1 13100/13108/1 +f 13101/13109/1 13102/13110/1 13103/13111/1 13104/13112/1 +f 13105/13113/1 13106/13114/1 13107/13115/1 13108/13116/1 +f 13109/13117/1 13110/13118/1 13111/13119/1 13112/13120/1 +f 13113/13121/1 13114/13122/1 13115/13123/1 13116/13124/1 +f 13117/13125/1 13118/13126/1 13119/13127/1 13120/13128/1 +f 13121/13129/1 13122/13130/1 13123/13131/1 13124/13132/1 +f 13125/13133/1 13126/13134/1 13127/13135/1 13128/13136/1 +f 13129/13137/1 13130/13138/1 13131/13139/1 13132/13140/1 +f 13133/13141/1 13134/13142/1 13135/13143/1 13136/13144/1 +f 13137/13145/1 13138/13146/1 13139/13147/1 13140/13148/1 +f 13141/13149/1 13142/13150/1 13143/13151/1 13144/13152/1 +f 13145/13153/1 13146/13154/1 13147/13155/1 13148/13156/1 +f 13149/13157/1 13150/13158/1 13151/13159/1 13152/13160/1 +f 13153/13161/1 13154/13162/1 13155/13163/1 13156/13164/1 +f 13157/13165/1 13158/13166/1 13159/13167/1 13160/13168/1 +f 13161/13169/1 13162/13170/1 13163/13171/1 13164/13172/1 +f 13165/13173/1 13166/13174/1 13167/13175/1 13168/13176/1 +f 13169/13177/1 13170/13178/1 13171/13179/1 13172/13180/1 +f 13173/13181/1 13174/13182/1 13175/13183/1 13176/13184/1 +f 13177/13185/1 13178/13186/1 13179/13187/1 13180/13188/1 +f 13181/13189/1 13182/13190/1 13183/13191/1 13184/13192/1 +f 13185/13193/1 13186/13194/1 13187/13195/1 13188/13196/1 +f 13189/13197/1 13190/13198/1 13191/13199/1 13192/13200/1 +f 13193/13201/1 13194/13202/1 13195/13203/1 13196/13204/1 +f 13197/13205/1 13198/13206/1 13199/13207/1 13200/13208/1 +f 13201/13209/1 13202/13210/1 13203/13211/1 13204/13212/1 +f 13205/13213/1 13206/13214/1 13207/13215/1 13208/13216/1 +f 13209/13217/1 13210/13218/1 13211/13219/1 13212/13220/1 +f 13213/13221/1 13214/13222/1 13215/13223/1 13216/13224/1 +f 13217/13225/1 13218/13226/1 13219/13227/1 13220/13228/1 +f 13221/13229/1 13222/13230/1 13223/13231/1 13224/13232/1 +f 13225/13233/1 13226/13234/1 13227/13235/1 13228/13236/1 +f 13229/13237/1 13230/13238/1 13231/13239/1 13232/13240/1 +f 13233/13241/1 13234/13242/1 13235/13243/1 13236/13244/1 +f 13237/13245/1 13238/13246/1 13239/13247/1 13240/13248/1 +f 13241/13249/1 13242/13250/1 13243/13251/1 13244/13252/1 +f 13245/13253/1 13246/13254/1 13247/13255/1 13248/13256/1 +f 13249/13257/1 13250/13258/1 13251/13259/1 13252/13260/1 +f 13253/13261/1 13254/13262/1 13255/13263/1 13256/13264/1 +f 13257/13265/1 13258/13266/1 13259/13267/1 13260/13268/1 +f 13261/13269/1 13262/13270/1 13263/13271/1 13264/13272/1 +f 13265/13273/1 13266/13274/1 13267/13275/1 13268/13276/1 +f 13269/13277/1 13270/13278/1 13271/13279/1 13272/13280/1 +f 13273/13281/1 13274/13282/1 13275/13283/1 13276/13284/1 +f 13277/13285/1 13278/13286/1 13279/13287/1 13280/13288/1 +f 13281/13289/1 13282/13290/1 13283/13291/1 13284/13292/1 +f 13285/13293/1 13286/13294/1 13287/13295/1 13288/13296/1 +f 13289/13297/1 13290/13298/1 13291/13299/1 13292/13300/1 +f 13293/13301/1 13294/13302/1 13295/13303/1 13296/13304/1 +f 13297/13305/1 13298/13306/1 13299/13307/1 13300/13308/1 +f 13301/13309/1 13302/13310/1 13303/13311/1 13304/13312/1 +f 13305/13313/1 13306/13314/1 13307/13315/1 13308/13316/1 +f 13309/13317/1 13310/13318/1 13311/13319/1 13312/13320/1 +f 13313/13321/1 13314/13322/1 13315/13323/1 13316/13324/1 +f 13317/13325/1 13318/13326/1 13319/13327/1 13320/13328/1 +f 13321/13329/1 13322/13330/1 13323/13331/1 13324/13332/1 +f 13325/13333/1 13326/13334/1 13327/13335/1 13328/13336/1 +f 13329/13337/1 13330/13338/1 13331/13339/1 13332/13340/1 +f 13333/13341/1 13334/13342/1 13335/13343/1 13336/13344/1 +f 13337/13345/1 13338/13346/1 13339/13347/1 13340/13348/1 +f 13341/13349/1 13342/13350/1 13343/13351/1 13344/13352/1 +f 13345/13353/1 13346/13354/1 13347/13355/1 13348/13356/1 +f 13349/13357/1 13350/13358/1 13351/13359/1 13352/13360/1 +f 13353/13361/1 13354/13362/1 13355/13363/1 13356/13364/1 +f 13357/13365/1 13358/13366/1 13359/13367/1 13360/13368/1 +f 13361/13369/1 13362/13370/1 13363/13371/1 13364/13372/1 +f 13365/13373/1 13366/13374/1 13367/13375/1 13368/13376/1 +f 13369/13377/1 13370/13378/1 13371/13379/1 13372/13380/1 +f 13373/13381/1 13374/13382/1 13375/13383/1 13376/13384/1 +f 13377/13385/1 13378/13386/1 13379/13387/1 13380/13388/1 +f 13381/13389/1 13382/13390/1 13383/13391/1 13384/13392/1 +f 13385/13393/1 13386/13394/1 13387/13395/1 13388/13396/1 +f 13389/13397/1 13390/13398/1 13391/13399/1 13392/13400/1 +f 13393/13401/1 13394/13402/1 13395/13403/1 13396/13404/1 +f 13397/13405/1 13398/13406/1 13399/13407/1 13400/13408/1 +f 13401/13409/1 13402/13410/1 13403/13411/1 13404/13412/1 +f 13405/13413/1 13406/13414/1 13407/13415/1 13408/13416/1 +f 13409/13417/1 13410/13418/1 13411/13419/1 13412/13420/1 +f 13413/13421/1 13414/13422/1 13415/13423/1 13416/13424/1 +f 13417/13425/1 13418/13426/1 13419/13427/1 13420/13428/1 +f 13421/13429/1 13422/13430/1 13423/13431/1 13424/13432/1 +f 13425/13433/1 13426/13434/1 13427/13435/1 13428/13436/1 +f 13429/13437/1 13430/13438/1 13431/13439/1 13432/13440/1 +f 13433/13441/1 13434/13442/1 13435/13443/1 13436/13444/1 +f 13437/13445/1 13438/13446/1 13439/13447/1 13440/13448/1 +f 13441/13449/1 13442/13450/1 13443/13451/1 13444/13452/1 +f 13445/13453/1 13446/13454/1 13447/13455/1 13448/13456/1 +f 13449/13457/1 13450/13458/1 13451/13459/1 13452/13460/1 +f 13453/13461/1 13454/13462/1 13455/13463/1 13456/13464/1 +f 13457/13465/1 13458/13466/1 13459/13467/1 13460/13468/1 +f 13461/13469/1 13462/13470/1 13463/13471/1 13464/13472/1 +f 13465/13473/1 13466/13474/1 13467/13475/1 13468/13476/1 +f 13469/13477/1 13470/13478/1 13471/13479/1 13472/13480/1 +f 13473/13481/1 13474/13482/1 13475/13483/1 13476/13484/1 +f 13477/13485/1 13478/13486/1 13479/13487/1 13480/13488/1 +f 13481/13489/1 13482/13490/1 13483/13491/1 13484/13492/1 +f 13485/13493/1 13486/13494/1 13487/13495/1 13488/13496/1 +f 13489/13497/1 13490/13498/1 13491/13499/1 13492/13500/1 +f 13493/13501/1 13494/13502/1 13495/13503/1 13496/13504/1 +f 13497/13505/1 13498/13506/1 13499/13507/1 13500/13508/1 +f 13501/13509/1 13502/13510/1 13503/13511/1 13504/13512/1 +f 13505/13513/1 13506/13514/1 13507/13515/1 13508/13516/1 +f 13509/13517/1 13510/13518/1 13511/13519/1 13512/13520/1 +f 13513/13521/1 13514/13522/1 13515/13523/1 13516/13524/1 +f 13517/13525/1 13518/13526/1 13519/13527/1 13520/13528/1 +f 13521/13529/1 13522/13530/1 13523/13531/1 13524/13532/1 +f 13525/13533/1 13526/13534/1 13527/13535/1 13528/13536/1 +f 13529/13537/1 13530/13538/1 13531/13539/1 13532/13540/1 +f 13533/13541/1 13534/13542/1 13535/13543/1 13536/13544/1 +f 13537/13545/1 13538/13546/1 13539/13547/1 13540/13548/1 +f 13541/13549/1 13542/13550/1 13543/13551/1 13544/13552/1 +f 13545/13553/1 13546/13554/1 13547/13555/1 13548/13556/1 +f 13549/13557/1 13550/13558/1 13551/13559/1 13552/13560/1 +f 13553/13561/1 13554/13562/1 13555/13563/1 13556/13564/1 +f 13557/13565/1 13558/13566/1 13559/13567/1 13560/13568/1 +f 13561/13569/1 13562/13570/1 13563/13571/1 13564/13572/1 +f 13565/13573/1 13566/13574/1 13567/13575/1 13568/13576/1 +f 13569/13577/1 13570/13578/1 13571/13579/1 13572/13580/1 +f 13573/13581/1 13574/13582/1 13575/13583/1 13576/13584/1 +f 13577/13585/1 13578/13586/1 13579/13587/1 13580/13588/1 +f 13581/13589/1 13582/13590/1 13583/13591/1 13584/13592/1 +f 13585/13593/1 13586/13594/1 13587/13595/1 13588/13596/1 +f 13589/13597/1 13590/13598/1 13591/13599/1 13592/13600/1 +f 13593/13601/1 13594/13602/1 13595/13603/1 13596/13604/1 +f 13597/13605/1 13598/13606/1 13599/13607/1 13600/13608/1 +f 13601/13609/1 13602/13610/1 13603/13611/1 13604/13612/1 +f 13605/13613/1 13606/13614/1 13607/13615/1 13608/13616/1 +f 13609/13617/1 13610/13618/1 13611/13619/1 13612/13620/1 +f 13613/13621/1 13614/13622/1 13615/13623/1 13616/13624/1 +f 13617/13625/1 13618/13626/1 13619/13627/1 13620/13628/1 +f 13621/13629/1 13622/13630/1 13623/13631/1 13624/13632/1 +f 13625/13633/1 13626/13634/1 13627/13635/1 13628/13636/1 +f 13629/13637/1 13630/13638/1 13631/13639/1 13632/13640/1 +f 13633/13641/1 13634/13642/1 13635/13643/1 13636/13644/1 +f 13637/13645/1 13638/13646/1 13639/13647/1 13640/13648/1 +f 13641/13649/1 13642/13650/1 13643/13651/1 13644/13652/1 +f 13645/13653/1 13646/13654/1 13647/13655/1 13648/13656/1 +f 13649/13657/1 13650/13658/1 13651/13659/1 13652/13660/1 +f 13653/13661/1 13654/13662/1 13655/13663/1 13656/13664/1 +f 13657/13665/1 13658/13666/1 13659/13667/1 13660/13668/1 +f 13661/13669/1 13662/13670/1 13663/13671/1 13664/13672/1 +f 13665/13673/1 13666/13674/1 13667/13675/1 13668/13676/1 +f 13669/13677/1 13670/13678/1 13671/13679/1 13672/13680/1 +f 13673/13681/1 13674/13682/1 13675/13683/1 13676/13684/1 +f 13677/13685/1 13678/13686/1 13679/13687/1 13680/13688/1 +f 13681/13689/1 13682/13690/1 13683/13691/1 13684/13692/1 +f 13685/13693/1 13686/13694/1 13687/13695/1 13688/13696/1 +f 13689/13697/1 13690/13698/1 13691/13699/1 13692/13700/1 +f 13693/13701/1 13694/13702/1 13695/13703/1 13696/13704/1 +f 13697/13705/1 13698/13706/1 13699/13707/1 13700/13708/1 +f 13701/13709/1 13702/13710/1 13703/13711/1 13704/13712/1 +f 13705/13713/1 13706/13714/1 13707/13715/1 13708/13716/1 +f 13709/13717/1 13710/13718/1 13711/13719/1 13712/13720/1 +f 13713/13721/1 13714/13722/1 13715/13723/1 13716/13724/1 +f 13717/13725/1 13718/13726/1 13719/13727/1 13720/13728/1 +f 13721/13729/1 13722/13730/1 13723/13731/1 13724/13732/1 +f 13725/13733/1 13726/13734/1 13727/13735/1 13728/13736/1 +f 13729/13737/1 13730/13738/1 13731/13739/1 13732/13740/1 +f 13733/13741/1 13734/13742/1 13735/13743/1 13736/13744/1 +f 13737/13745/1 13738/13746/1 13739/13747/1 13740/13748/1 +f 13741/13749/1 13742/13750/1 13743/13751/1 13744/13752/1 +f 13745/13753/1 13746/13754/1 13747/13755/1 13748/13756/1 +f 13749/13757/1 13750/13758/1 13751/13759/1 13752/13760/1 +f 13753/13761/1 13754/13762/1 13755/13763/1 13756/13764/1 +f 13757/13765/1 13758/13766/1 13759/13767/1 13760/13768/1 +f 13761/13769/1 13762/13770/1 13763/13771/1 13764/13772/1 +f 13765/13773/1 13766/13774/1 13767/13775/1 13768/13776/1 +f 13769/13777/1 13770/13778/1 13771/13779/1 13772/13780/1 +f 13773/13781/1 13774/13782/1 13775/13783/1 13776/13784/1 +f 13777/13785/1 13778/13786/1 13779/13787/1 13780/13788/1 +f 13781/13789/1 13782/13790/1 13783/13791/1 13784/13792/1 +f 13785/13793/1 13786/13794/1 13787/13795/1 13788/13796/1 +f 13789/13797/1 13790/13798/1 13791/13799/1 13792/13800/1 +f 13793/13801/1 13794/13802/1 13795/13803/1 13796/13804/1 +f 13797/13805/1 13798/13806/1 13799/13807/1 13800/13808/1 +f 13801/13809/1 13802/13810/1 13803/13811/1 13804/13812/1 +f 13805/13813/1 13806/13814/1 13807/13815/1 13808/13816/1 +f 13809/13817/1 13810/13818/1 13811/13819/1 13812/13820/1 +f 13813/13821/1 13814/13822/1 13815/13823/1 13816/13824/1 +f 13817/13825/1 13818/13826/1 13819/13827/1 13820/13828/1 +f 13821/13829/1 13822/13830/1 13823/13831/1 13824/13832/1 +f 13825/13833/1 13826/13834/1 13827/13835/1 13828/13836/1 +f 13829/13837/1 13830/13838/1 13831/13839/1 13832/13840/1 +f 13833/13841/1 13834/13842/1 13835/13843/1 13836/13844/1 +f 13837/13845/1 13838/13846/1 13839/13847/1 13840/13848/1 +f 13841/13849/1 13842/13850/1 13843/13851/1 13844/13852/1 +f 13845/13853/1 13846/13854/1 13847/13855/1 13848/13856/1 +f 13849/13857/1 13850/13858/1 13851/13859/1 13852/13860/1 +f 13853/13861/1 13854/13862/1 13855/13863/1 13856/13864/1 +f 13857/13865/1 13858/13866/1 13859/13867/1 13860/13868/1 +f 13861/13869/1 13862/13870/1 13863/13871/1 13864/13872/1 +f 13865/13873/1 13866/13874/1 13867/13875/1 13868/13876/1 +f 13869/13877/1 13870/13878/1 13871/13879/1 13872/13880/1 +f 13873/13881/1 13874/13882/1 13875/13883/1 13876/13884/1 +f 13877/13885/1 13878/13886/1 13879/13887/1 13880/13888/1 +f 13881/13889/1 13882/13890/1 13883/13891/1 13884/13892/1 +f 13885/13893/1 13886/13894/1 13887/13895/1 13888/13896/1 +f 13889/13897/1 13890/13898/1 13891/13899/1 13892/13900/1 +f 13893/13901/1 13894/13902/1 13895/13903/1 13896/13904/1 +f 13897/13905/1 13898/13906/1 13899/13907/1 13900/13908/1 +f 13901/13909/1 13902/13910/1 13903/13911/1 13904/13912/1 +f 13905/13913/1 13906/13914/1 13907/13915/1 13908/13916/1 +f 13909/13917/1 13910/13918/1 13911/13919/1 13912/13920/1 +f 13913/13921/1 13914/13922/1 13915/13923/1 13916/13924/1 +f 13917/13925/1 13918/13926/1 13919/13927/1 13920/13928/1 +f 13921/13929/1 13922/13930/1 13923/13931/1 13924/13932/1 +f 13925/13933/1 13926/13934/1 13927/13935/1 13928/13936/1 +f 13929/13937/1 13930/13938/1 13931/13939/1 13932/13940/1 +f 13933/13941/1 13934/13942/1 13935/13943/1 13936/13944/1 +f 13937/13945/1 13938/13946/1 13939/13947/1 13940/13948/1 +f 13941/13949/1 13942/13950/1 13943/13951/1 13944/13952/1 +f 13945/13953/1 13946/13954/1 13947/13955/1 13948/13956/1 +f 13949/13957/1 13950/13958/1 13951/13959/1 13952/13960/1 +f 13953/13961/1 13954/13962/1 13955/13963/1 13956/13964/1 +f 13957/13965/1 13958/13966/1 13959/13967/1 13960/13968/1 +f 13961/13969/1 13962/13970/1 13963/13971/1 13964/13972/1 +f 13965/13973/1 13966/13974/1 13967/13975/1 13968/13976/1 +f 13969/13977/1 13970/13978/1 13971/13979/1 13972/13980/1 +f 13973/13981/1 13974/13982/1 13975/13983/1 13976/13984/1 +f 13977/13985/1 13978/13986/1 13979/13987/1 13980/13988/1 +f 13981/13989/1 13982/13990/1 13983/13991/1 13984/13992/1 +f 13985/13993/1 13986/13994/1 13987/13995/1 13988/13996/1 +f 13989/13997/1 13990/13998/1 13991/13999/1 13992/14000/1 +f 13993/14001/1 13994/14002/1 13995/14003/1 13996/14004/1 +f 13997/14005/1 13998/14006/1 13999/14007/1 14000/14008/1 +f 14001/14009/1 14002/14010/1 14003/14011/1 14004/14012/1 +f 14005/14013/1 14006/14014/1 14007/14015/1 14008/14016/1 +f 14009/14017/1 14010/14018/1 14011/14019/1 14012/14020/1 +f 14013/14021/1 14014/14022/1 14015/14023/1 14016/14024/1 +f 14017/14025/1 14018/14026/1 14019/14027/1 14020/14028/1 +f 14021/14029/1 14022/14030/1 14023/14031/1 14024/14032/1 +f 14025/14033/1 14026/14034/1 14027/14035/1 14028/14036/1 +f 14029/14037/1 14030/14038/1 14031/14039/1 14032/14040/1 +f 14033/14041/1 14034/14042/1 14035/14043/1 14036/14044/1 +f 14037/14045/1 14038/14046/1 14039/14047/1 14040/14048/1 +f 14041/14049/1 14042/14050/1 14043/14051/1 14044/14052/1 +f 14045/14053/1 14046/14054/1 14047/14055/1 14048/14056/1 +f 14049/14057/1 14050/14058/1 14051/14059/1 14052/14060/1 +f 14053/14061/1 14054/14062/1 14055/14063/1 14056/14064/1 +f 14057/14065/1 14058/14066/1 14059/14067/1 14060/14068/1 +f 14061/14069/1 14062/14070/1 14063/14071/1 14064/14072/1 +f 14065/14073/1 14066/14074/1 14067/14075/1 14068/14076/1 +f 14069/14077/1 14070/14078/1 14071/14079/1 14072/14080/1 +f 14073/14081/1 14074/14082/1 14075/14083/1 14076/14084/1 +f 14077/14085/1 14078/14086/1 14079/14087/1 14080/14088/1 +f 14081/14089/1 14082/14090/1 14083/14091/1 14084/14092/1 +f 14085/14093/1 14086/14094/1 14087/14095/1 14088/14096/1 +f 14089/14097/1 14090/14098/1 14091/14099/1 14092/14100/1 +f 14093/14101/1 14094/14102/1 14095/14103/1 14096/14104/1 +f 14097/14105/1 14098/14106/1 14099/14107/1 14100/14108/1 +f 14101/14109/1 14102/14110/1 14103/14111/1 14104/14112/1 +f 14105/14113/1 14106/14114/1 14107/14115/1 14108/14116/1 +f 14109/14117/1 14110/14118/1 14111/14119/1 14112/14120/1 +f 14113/14121/1 14114/14122/1 14115/14123/1 14116/14124/1 +f 14117/14125/1 14118/14126/1 14119/14127/1 14120/14128/1 +f 14121/14129/1 14122/14130/1 14123/14131/1 14124/14132/1 +f 14125/14133/1 14126/14134/1 14127/14135/1 14128/14136/1 +f 14129/14137/1 14130/14138/1 14131/14139/1 14132/14140/1 +f 14133/14141/1 14134/14142/1 14135/14143/1 14136/14144/1 +f 14137/14145/1 14138/14146/1 14139/14147/1 14140/14148/1 +f 14141/14149/1 14142/14150/1 14143/14151/1 14144/14152/1 +f 14145/14153/1 14146/14154/1 14147/14155/1 14148/14156/1 +f 14149/14157/1 14150/14158/1 14151/14159/1 14152/14160/1 +f 14153/14161/1 14154/14162/1 14155/14163/1 14156/14164/1 +f 14157/14165/1 14158/14166/1 14159/14167/1 14160/14168/1 +f 14161/14169/1 14162/14170/1 14163/14171/1 14164/14172/1 +f 14165/14173/1 14166/14174/1 14167/14175/1 14168/14176/1 +f 14169/14177/1 14170/14178/1 14171/14179/1 14172/14180/1 +f 14173/14181/1 14174/14182/1 14175/14183/1 14176/14184/1 +f 14177/14185/1 14178/14186/1 14179/14187/1 14180/14188/1 +f 14181/14189/1 14182/14190/1 14183/14191/1 14184/14192/1 +f 14185/14193/1 14186/14194/1 14187/14195/1 14188/14196/1 +f 14189/14197/1 14190/14198/1 14191/14199/1 14192/14200/1 +f 14193/14201/1 14194/14202/1 14195/14203/1 14196/14204/1 +f 14197/14205/1 14198/14206/1 14199/14207/1 14200/14208/1 +f 14201/14209/1 14202/14210/1 14203/14211/1 14204/14212/1 +f 14205/14213/1 14206/14214/1 14207/14215/1 14208/14216/1 +f 14209/14217/1 14210/14218/1 14211/14219/1 14212/14220/1 +f 14213/14221/1 14214/14222/1 14215/14223/1 14216/14224/1 +f 14217/14225/1 14218/14226/1 14219/14227/1 14220/14228/1 +f 14221/14229/1 14222/14230/1 14223/14231/1 14224/14232/1 +f 14225/14233/1 14226/14234/1 14227/14235/1 14228/14236/1 +f 14229/14237/1 14230/14238/1 14231/14239/1 14232/14240/1 +f 14233/14241/1 14234/14242/1 14235/14243/1 14236/14244/1 +f 14237/14245/1 14238/14246/1 14239/14247/1 14240/14248/1 +f 14241/14249/1 14242/14250/1 14243/14251/1 14244/14252/1 +f 14245/14253/1 14246/14254/1 14247/14255/1 14248/14256/1 +f 14249/14257/1 14250/14258/1 14251/14259/1 14252/14260/1 +f 14253/14261/1 14254/14262/1 14255/14263/1 14256/14264/1 +f 14257/14265/1 14258/14266/1 14259/14267/1 14260/14268/1 +f 14261/14269/1 14262/14270/1 14263/14271/1 14264/14272/1 +f 14265/14273/1 14266/14274/1 14267/14275/1 14268/14276/1 +f 14269/14277/1 14270/14278/1 14271/14279/1 14272/14280/1 +f 14273/14281/1 14274/14282/1 14275/14283/1 14276/14284/1 +f 14277/14285/1 14278/14286/1 14279/14287/1 14280/14288/1 +f 14281/14289/1 14282/14290/1 14283/14291/1 14284/14292/1 +f 14285/14293/1 14286/14294/1 14287/14295/1 14288/14296/1 +f 14289/14297/1 14290/14298/1 14291/14299/1 14292/14300/1 +f 14293/14301/1 14294/14302/1 14295/14303/1 14296/14304/1 +f 14297/14305/1 14298/14306/1 14299/14307/1 14300/14308/1 +f 14301/14309/1 14302/14310/1 14303/14311/1 14304/14312/1 +f 14305/14313/1 14306/14314/1 14307/14315/1 14308/14316/1 +f 14309/14317/1 14310/14318/1 14311/14319/1 14312/14320/1 +f 14313/14321/1 14314/14322/1 14315/14323/1 14316/14324/1 +f 14317/14325/1 14318/14326/1 14319/14327/1 14320/14328/1 +f 14321/14329/1 14322/14330/1 14323/14331/1 14324/14332/1 +f 14325/14333/1 14326/14334/1 14327/14335/1 14328/14336/1 +f 14329/14337/1 14330/14338/1 14331/14339/1 14332/14340/1 +f 14333/14341/1 14334/14342/1 14335/14343/1 14336/14344/1 +f 14337/14345/1 14338/14346/1 14339/14347/1 14340/14348/1 +f 14341/14349/1 14342/14350/1 14343/14351/1 14344/14352/1 +f 14345/14353/1 14346/14354/1 14347/14355/1 14348/14356/1 +f 14349/14357/1 14350/14358/1 14351/14359/1 14352/14360/1 +f 14353/14361/1 14354/14362/1 14355/14363/1 14356/14364/1 +f 14357/14365/1 14358/14366/1 14359/14367/1 14360/14368/1 +f 14361/14369/1 14362/14370/1 14363/14371/1 14364/14372/1 +f 14365/14373/1 14366/14374/1 14367/14375/1 14368/14376/1 +f 14369/14377/1 14370/14378/1 14371/14379/1 14372/14380/1 +f 14373/14381/1 14374/14382/1 14375/14383/1 14376/14384/1 +f 14377/14385/1 14378/14386/1 14379/14387/1 14380/14388/1 +f 14381/14389/1 14382/14390/1 14383/14391/1 14384/14392/1 +f 14385/14393/1 14386/14394/1 14387/14395/1 14388/14396/1 +f 14389/14397/1 14390/14398/1 14391/14399/1 14392/14400/1 +f 14393/14401/1 14394/14402/1 14395/14403/1 14396/14404/1 +f 14397/14405/1 14398/14406/1 14399/14407/1 14400/14408/1 +f 14401/14409/1 14402/14410/1 14403/14411/1 14404/14412/1 +f 14405/14413/1 14406/14414/1 14407/14415/1 14408/14416/1 +f 14409/14417/1 14410/14418/1 14411/14419/1 14412/14420/1 +f 14413/14421/1 14414/14422/1 14415/14423/1 14416/14424/1 +f 14417/14425/1 14418/14426/1 14419/14427/1 14420/14428/1 +f 14421/14429/1 14422/14430/1 14423/14431/1 14424/14432/1 +f 14425/14433/1 14426/14434/1 14427/14435/1 14428/14436/1 +f 14429/14437/1 14430/14438/1 14431/14439/1 14432/14440/1 +f 14433/14441/1 14434/14442/1 14435/14443/1 14436/14444/1 +f 14437/14445/1 14438/14446/1 14439/14447/1 14440/14448/1 +f 14441/14449/1 14442/14450/1 14443/14451/1 14444/14452/1 +f 14445/14453/1 14446/14454/1 14447/14455/1 14448/14456/1 +f 14449/14457/1 14450/14458/1 14451/14459/1 14452/14460/1 +f 14453/14461/1 14454/14462/1 14455/14463/1 14456/14464/1 +f 14457/14465/1 14458/14466/1 14459/14467/1 14460/14468/1 +f 14461/14469/1 14462/14470/1 14463/14471/1 14464/14472/1 +f 14465/14473/1 14466/14474/1 14467/14475/1 14468/14476/1 +f 14469/14477/1 14470/14478/1 14471/14479/1 14472/14480/1 +f 14473/14481/1 14474/14482/1 14475/14483/1 14476/14484/1 +f 14477/14485/1 14478/14486/1 14479/14487/1 14480/14488/1 +f 14481/14489/1 14482/14490/1 14483/14491/1 14484/14492/1 +f 14485/14493/1 14486/14494/1 14487/14495/1 14488/14496/1 +f 14489/14497/1 14490/14498/1 14491/14499/1 14492/14500/1 +f 14493/14501/1 14494/14502/1 14495/14503/1 14496/14504/1 +f 14497/14505/1 14498/14506/1 14499/14507/1 14500/14508/1 +f 14501/14509/1 14502/14510/1 14503/14511/1 14504/14512/1 +f 14505/14513/1 14506/14514/1 14507/14515/1 14508/14516/1 +f 14509/14517/1 14510/14518/1 14511/14519/1 14512/14520/1 +f 14513/14521/1 14514/14522/1 14515/14523/1 14516/14524/1 +f 14517/14525/1 14518/14526/1 14519/14527/1 14520/14528/1 +f 14521/14529/1 14522/14530/1 14523/14531/1 14524/14532/1 +f 14525/14533/1 14526/14534/1 14527/14535/1 14528/14536/1 +f 14529/14537/1 14530/14538/1 14531/14539/1 14532/14540/1 +f 14533/14541/1 14534/14542/1 14535/14543/1 14536/14544/1 +f 14537/14545/1 14538/14546/1 14539/14547/1 14540/14548/1 +f 14541/14549/1 14542/14550/1 14543/14551/1 14544/14552/1 +f 14545/14553/1 14546/14554/1 14547/14555/1 14548/14556/1 +f 14549/14557/1 14550/14558/1 14551/14559/1 14552/14560/1 +f 14553/14561/1 14554/14562/1 14555/14563/1 14556/14564/1 +f 14557/14565/1 14558/14566/1 14559/14567/1 14560/14568/1 +f 14561/14569/1 14562/14570/1 14563/14571/1 14564/14572/1 +f 14565/14573/1 14566/14574/1 14567/14575/1 14568/14576/1 +f 14569/14577/1 14570/14578/1 14571/14579/1 14572/14580/1 +f 14573/14581/1 14574/14582/1 14575/14583/1 14576/14584/1 +f 14577/14585/1 14578/14586/1 14579/14587/1 14580/14588/1 +f 14581/14589/1 14582/14590/1 14583/14591/1 14584/14592/1 +f 14585/14593/1 14586/14594/1 14587/14595/1 14588/14596/1 +f 14589/14597/1 14590/14598/1 14591/14599/1 14592/14600/1 +f 14593/14601/1 14594/14602/1 14595/14603/1 14596/14604/1 +f 14597/14605/1 14598/14606/1 14599/14607/1 14600/14608/1 +f 14601/14609/1 14602/14610/1 14603/14611/1 14604/14612/1 +f 14605/14613/1 14606/14614/1 14607/14615/1 14608/14616/1 +f 14609/14617/1 14610/14618/1 14611/14619/1 14612/14620/1 +f 14613/14621/1 14614/14622/1 14615/14623/1 14616/14624/1 +f 14617/14625/1 14618/14626/1 14619/14627/1 14620/14628/1 +f 14621/14629/1 14622/14630/1 14623/14631/1 14624/14632/1 +f 14625/14633/1 14626/14634/1 14627/14635/1 14628/14636/1 +f 14629/14637/1 14630/14638/1 14631/14639/1 14632/14640/1 +f 14633/14641/1 14634/14642/1 14635/14643/1 14636/14644/1 +f 14637/14645/1 14638/14646/1 14639/14647/1 14640/14648/1 +f 14641/14649/1 14642/14650/1 14643/14651/1 14644/14652/1 +f 14645/14653/1 14646/14654/1 14647/14655/1 14648/14656/1 +f 14649/14657/1 14650/14658/1 14651/14659/1 14652/14660/1 +f 14653/14661/1 14654/14662/1 14655/14663/1 14656/14664/1 +f 14657/14665/1 14658/14666/1 14659/14667/1 14660/14668/1 +f 14661/14669/1 14662/14670/1 14663/14671/1 14664/14672/1 +f 14665/14673/1 14666/14674/1 14667/14675/1 14668/14676/1 +f 14669/14677/1 14670/14678/1 14671/14679/1 14672/14680/1 +f 14673/14681/1 14674/14682/1 14675/14683/1 14676/14684/1 +f 14677/14685/1 14678/14686/1 14679/14687/1 14680/14688/1 +f 14681/14689/1 14682/14690/1 14683/14691/1 14684/14692/1 +f 14685/14693/1 14686/14694/1 14687/14695/1 14688/14696/1 +f 14689/14697/1 14690/14698/1 14691/14699/1 14692/14700/1 +f 14693/14701/1 14694/14702/1 14695/14703/1 14696/14704/1 +f 14697/14705/1 14698/14706/1 14699/14707/1 14700/14708/1 +f 14701/14709/1 14702/14710/1 14703/14711/1 14704/14712/1 +f 14705/14713/1 14706/14714/1 14707/14715/1 14708/14716/1 +f 14709/14717/1 14710/14718/1 14711/14719/1 14712/14720/1 +f 14713/14721/1 14714/14722/1 14715/14723/1 14716/14724/1 +f 14717/14725/1 14718/14726/1 14719/14727/1 14720/14728/1 +f 14721/14729/1 14722/14730/1 14723/14731/1 14724/14732/1 +f 14725/14733/1 14726/14734/1 14727/14735/1 14728/14736/1 +f 14729/14737/1 14730/14738/1 14731/14739/1 14732/14740/1 +f 14733/14741/1 14734/14742/1 14735/14743/1 14736/14744/1 +f 14737/14745/1 14738/14746/1 14739/14747/1 14740/14748/1 +f 14741/14749/1 14742/14750/1 14743/14751/1 14744/14752/1 +f 14745/14753/1 14746/14754/1 14747/14755/1 14748/14756/1 +f 14749/14757/1 14750/14758/1 14751/14759/1 14752/14760/1 +f 14753/14761/1 14754/14762/1 14755/14763/1 14756/14764/1 +f 14757/14765/1 14758/14766/1 14759/14767/1 14760/14768/1 +f 14761/14769/1 14762/14770/1 14763/14771/1 14764/14772/1 +f 14765/14773/1 14766/14774/1 14767/14775/1 14768/14776/1 +f 14769/14777/1 14770/14778/1 14771/14779/1 14772/14780/1 +f 14773/14781/1 14774/14782/1 14775/14783/1 14776/14784/1 +f 14777/14785/1 14778/14786/1 14779/14787/1 14780/14788/1 +f 14781/14789/1 14782/14790/1 14783/14791/1 14784/14792/1 +f 14785/14793/1 14786/14794/1 14787/14795/1 14788/14796/1 +f 14789/14797/1 14790/14798/1 14791/14799/1 14792/14800/1 +f 14793/14801/1 14794/14802/1 14795/14803/1 14796/14804/1 +f 14797/14805/1 14798/14806/1 14799/14807/1 14800/14808/1 +f 14801/14809/1 14802/14810/1 14803/14811/1 14804/14812/1 +f 14805/14813/1 14806/14814/1 14807/14815/1 14808/14816/1 +f 14809/14817/1 14810/14818/1 14811/14819/1 14812/14820/1 +f 14813/14821/1 14814/14822/1 14815/14823/1 14816/14824/1 +f 14817/14825/1 14818/14826/1 14819/14827/1 14820/14828/1 +f 14821/14829/1 14822/14830/1 14823/14831/1 14824/14832/1 +f 14825/14833/1 14826/14834/1 14827/14835/1 14828/14836/1 +f 14829/14837/1 14830/14838/1 14831/14839/1 14832/14840/1 +f 14833/14841/1 14834/14842/1 14835/14843/1 14836/14844/1 +f 14837/14845/1 14838/14846/1 14839/14847/1 14840/14848/1 +f 14841/14849/1 14842/14850/1 14843/14851/1 14844/14852/1 +f 14845/14853/1 14846/14854/1 14847/14855/1 14848/14856/1 +f 14849/14857/1 14850/14858/1 14851/14859/1 14852/14860/1 +f 14853/14861/1 14854/14862/1 14855/14863/1 14856/14864/1 +f 14857/14865/1 14858/14866/1 14859/14867/1 14860/14868/1 +f 14861/14869/1 14862/14870/1 14863/14871/1 14864/14872/1 +f 14865/14873/1 14866/14874/1 14867/14875/1 14868/14876/1 +f 14869/14877/1 14870/14878/1 14871/14879/1 14872/14880/1 +f 14873/14881/1 14874/14882/1 14875/14883/1 14876/14884/1 +f 14877/14885/1 14878/14886/1 14879/14887/1 14880/14888/1 +f 14881/14889/1 14882/14890/1 14883/14891/1 14884/14892/1 +f 14885/14893/1 14886/14894/1 14887/14895/1 14888/14896/1 +f 14889/14897/1 14890/14898/1 14891/14899/1 14892/14900/1 +f 14893/14901/1 14894/14902/1 14895/14903/1 14896/14904/1 +f 14897/14905/1 14898/14906/1 14899/14907/1 14900/14908/1 +f 14901/14909/1 14902/14910/1 14903/14911/1 14904/14912/1 +f 14905/14913/1 14906/14914/1 14907/14915/1 14908/14916/1 +f 14909/14917/1 14910/14918/1 14911/14919/1 14912/14920/1 +f 14913/14921/1 14914/14922/1 14915/14923/1 14916/14924/1 +f 14917/14925/1 14918/14926/1 14919/14927/1 14920/14928/1 +f 14921/14929/1 14922/14930/1 14923/14931/1 14924/14932/1 +f 14925/14933/1 14926/14934/1 14927/14935/1 14928/14936/1 +f 14929/14937/1 14930/14938/1 14931/14939/1 14932/14940/1 +f 14933/14941/1 14934/14942/1 14935/14943/1 14936/14944/1 +f 14937/14945/1 14938/14946/1 14939/14947/1 14940/14948/1 +f 14941/14949/1 14942/14950/1 14943/14951/1 14944/14952/1 +f 14945/14953/1 14946/14954/1 14947/14955/1 14948/14956/1 +f 14949/14957/1 14950/14958/1 14951/14959/1 14952/14960/1 +f 14953/14961/1 14954/14962/1 14955/14963/1 14956/14964/1 +f 14957/14965/1 14958/14966/1 14959/14967/1 14960/14968/1 +f 14961/14969/1 14962/14970/1 14963/14971/1 14964/14972/1 +f 14965/14973/1 14966/14974/1 14967/14975/1 14968/14976/1 +f 14969/14977/1 14970/14978/1 14971/14979/1 14972/14980/1 +f 14973/14981/1 14974/14982/1 14975/14983/1 14976/14984/1 +f 14977/14985/1 14978/14986/1 14979/14987/1 14980/14988/1 +f 14981/14989/1 14982/14990/1 14983/14991/1 14984/14992/1 +f 14985/14993/1 14986/14994/1 14987/14995/1 14988/14996/1 +f 14989/14997/1 14990/14998/1 14991/14999/1 14992/15000/1 +f 14993/15001/1 14994/15002/1 14995/15003/1 14996/15004/1 +f 14997/15005/1 14998/15006/1 14999/15007/1 15000/15008/1 +f 15001/15009/1 15002/15010/1 15003/15011/1 15004/15012/1 +f 15005/15013/1 15006/15014/1 15007/15015/1 15008/15016/1 +f 15009/15017/1 15010/15018/1 15011/15019/1 15012/15020/1 +f 15013/15021/1 15014/15022/1 15015/15023/1 15016/15024/1 +f 15017/15025/1 15018/15026/1 15019/15027/1 15020/15028/1 +f 15021/15029/1 15022/15030/1 15023/15031/1 15024/15032/1 +f 15025/15033/1 15026/15034/1 15027/15035/1 15028/15036/1 +f 15029/15037/1 15030/15038/1 15031/15039/1 15032/15040/1 +f 15033/15041/1 15034/15042/1 15035/15043/1 15036/15044/1 +f 15037/15045/1 15038/15046/1 15039/15047/1 15040/15048/1 +f 15041/15049/1 15042/15050/1 15043/15051/1 15044/15052/1 +f 15045/15053/1 15046/15054/1 15047/15055/1 15048/15056/1 +f 15049/15057/1 15050/15058/1 15051/15059/1 15052/15060/1 +f 15053/15061/1 15054/15062/1 15055/15063/1 15056/15064/1 +f 15057/15065/1 15058/15066/1 15059/15067/1 15060/15068/1 +f 15061/15069/1 15062/15070/1 15063/15071/1 15064/15072/1 +f 15065/15073/1 15066/15074/1 15067/15075/1 15068/15076/1 +f 15069/15077/1 15070/15078/1 15071/15079/1 15072/15080/1 +f 15073/15081/1 15074/15082/1 15075/15083/1 15076/15084/1 +f 15077/15085/1 15078/15086/1 15079/15087/1 15080/15088/1 +f 15081/15089/1 15082/15090/1 15083/15091/1 15084/15092/1 +f 15085/15093/1 15086/15094/1 15087/15095/1 15088/15096/1 +f 15089/15097/1 15090/15098/1 15091/15099/1 15092/15100/1 +f 15093/15101/1 15094/15102/1 15095/15103/1 15096/15104/1 +f 15097/15105/1 15098/15106/1 15099/15107/1 15100/15108/1 +f 15101/15109/1 15102/15110/1 15103/15111/1 15104/15112/1 +f 15105/15113/1 15106/15114/1 15107/15115/1 15108/15116/1 +f 15109/15117/1 15110/15118/1 15111/15119/1 15112/15120/1 +f 15113/15121/1 15114/15122/1 15115/15123/1 15116/15124/1 +f 15117/15125/1 15118/15126/1 15119/15127/1 15120/15128/1 +f 15121/15129/1 15122/15130/1 15123/15131/1 15124/15132/1 +f 15125/15133/1 15126/15134/1 15127/15135/1 15128/15136/1 +f 15129/15137/1 15130/15138/1 15131/15139/1 15132/15140/1 +f 15133/15141/1 15134/15142/1 15135/15143/1 15136/15144/1 +f 15137/15145/1 15138/15146/1 15139/15147/1 15140/15148/1 +f 15141/15149/1 15142/15150/1 15143/15151/1 15144/15152/1 +f 15145/15153/1 15146/15154/1 15147/15155/1 15148/15156/1 +f 15149/15157/1 15150/15158/1 15151/15159/1 15152/15160/1 +f 15153/15161/1 15154/15162/1 15155/15163/1 15156/15164/1 +f 15157/15165/1 15158/15166/1 15159/15167/1 15160/15168/1 +f 15161/15169/1 15162/15170/1 15163/15171/1 15164/15172/1 +f 15165/15173/1 15166/15174/1 15167/15175/1 15168/15176/1 +f 15169/15177/1 15170/15178/1 15171/15179/1 15172/15180/1 +f 15173/15181/1 15174/15182/1 15175/15183/1 15176/15184/1 +f 15177/15185/1 15178/15186/1 15179/15187/1 15180/15188/1 +f 15181/15189/1 15182/15190/1 15183/15191/1 15184/15192/1 +f 15185/15193/1 15186/15194/1 15187/15195/1 15188/15196/1 +f 15189/15197/1 15190/15198/1 15191/15199/1 15192/15200/1 +f 15193/15201/1 15194/15202/1 15195/15203/1 15196/15204/1 +f 15197/15205/1 15198/15206/1 15199/15207/1 15200/15208/1 +f 15201/15209/1 15202/15210/1 15203/15211/1 15204/15212/1 +f 15205/15213/1 15206/15214/1 15207/15215/1 15208/15216/1 +f 15209/15217/1 15210/15218/1 15211/15219/1 15212/15220/1 +f 15213/15221/1 15214/15222/1 15215/15223/1 15216/15224/1 +f 15217/15225/1 15218/15226/1 15219/15227/1 15220/15228/1 +f 15221/15229/1 15222/15230/1 15223/15231/1 15224/15232/1 +f 15225/15233/1 15226/15234/1 15227/15235/1 15228/15236/1 +f 15229/15237/1 15230/15238/1 15231/15239/1 15232/15240/1 +f 15233/15241/1 15234/15242/1 15235/15243/1 15236/15244/1 +f 15237/15245/1 15238/15246/1 15239/15247/1 15240/15248/1 +f 15241/15249/1 15242/15250/1 15243/15251/1 15244/15252/1 +f 15245/15253/1 15246/15254/1 15247/15255/1 15248/15256/1 +f 15249/15257/1 15250/15258/1 15251/15259/1 15252/15260/1 +f 15253/15261/1 15254/15262/1 15255/15263/1 15256/15264/1 +f 15257/15265/1 15258/15266/1 15259/15267/1 15260/15268/1 +f 15261/15269/1 15262/15270/1 15263/15271/1 15264/15272/1 +f 15265/15273/1 15266/15274/1 15267/15275/1 15268/15276/1 +f 15269/15277/1 15270/15278/1 15271/15279/1 15272/15280/1 +f 15273/15281/1 15274/15282/1 15275/15283/1 15276/15284/1 +f 15277/15285/1 15278/15286/1 15279/15287/1 15280/15288/1 +f 15281/15289/1 15282/15290/1 15283/15291/1 15284/15292/1 +f 15285/15293/1 15286/15294/1 15287/15295/1 15288/15296/1 +f 15289/15297/1 15290/15298/1 15291/15299/1 15292/15300/1 +f 15293/15301/1 15294/15302/1 15295/15303/1 15296/15304/1 +f 15297/15305/1 15298/15306/1 15299/15307/1 15300/15308/1 +f 15301/15309/1 15302/15310/1 15303/15311/1 15304/15312/1 +f 15305/15313/1 15306/15314/1 15307/15315/1 15308/15316/1 +f 15309/15317/1 15310/15318/1 15311/15319/1 15312/15320/1 +f 15313/15321/1 15314/15322/1 15315/15323/1 15316/15324/1 +f 15317/15325/1 15318/15326/1 15319/15327/1 15320/15328/1 +f 15321/15329/1 15322/15330/1 15323/15331/1 15324/15332/1 +f 15325/15333/1 15326/15334/1 15327/15335/1 15328/15336/1 +f 15329/15337/1 15330/15338/1 15331/15339/1 15332/15340/1 +f 15333/15341/1 15334/15342/1 15335/15343/1 15336/15344/1 +f 15337/15345/1 15338/15346/1 15339/15347/1 15340/15348/1 +f 15341/15349/1 15342/15350/1 15343/15351/1 15344/15352/1 +f 15345/15353/1 15346/15354/1 15347/15355/1 15348/15356/1 +f 15349/15357/1 15350/15358/1 15351/15359/1 15352/15360/1 +f 15353/15361/1 15354/15362/1 15355/15363/1 15356/15364/1 +f 15357/15365/1 15358/15366/1 15359/15367/1 15360/15368/1 +f 15361/15369/1 15362/15370/1 15363/15371/1 15364/15372/1 +f 15365/15373/1 15366/15374/1 15367/15375/1 15368/15376/1 +f 15369/15377/1 15370/15378/1 15371/15379/1 15372/15380/1 +f 15373/15381/1 15374/15382/1 15375/15383/1 15376/15384/1 +f 15377/15385/1 15378/15386/1 15379/15387/1 15380/15388/1 +f 15381/15389/1 15382/15390/1 15383/15391/1 15384/15392/1 +f 15385/15393/1 15386/15394/1 15387/15395/1 15388/15396/1 +f 15389/15397/1 15390/15398/1 15391/15399/1 15392/15400/1 +f 15393/15401/1 15394/15402/1 15395/15403/1 15396/15404/1 +f 15397/15405/1 15398/15406/1 15399/15407/1 15400/15408/1 +f 15401/15409/1 15402/15410/1 15403/15411/1 15404/15412/1 +f 15405/15413/1 15406/15414/1 15407/15415/1 15408/15416/1 +f 15409/15417/1 15410/15418/1 15411/15419/1 15412/15420/1 +f 15413/15421/1 15414/15422/1 15415/15423/1 15416/15424/1 +f 15417/15425/1 15418/15426/1 15419/15427/1 15420/15428/1 +f 15421/15429/1 15422/15430/1 15423/15431/1 15424/15432/1 +f 15425/15433/1 15426/15434/1 15427/15435/1 15428/15436/1 +f 15429/15437/1 15430/15438/1 15431/15439/1 15432/15440/1 +f 15433/15441/1 15434/15442/1 15435/15443/1 15436/15444/1 +f 15437/15445/1 15438/15446/1 15439/15447/1 15440/15448/1 +f 15441/15449/1 15442/15450/1 15443/15451/1 15444/15452/1 +f 15445/15453/1 15446/15454/1 15447/15455/1 15448/15456/1 +f 15449/15457/1 15450/15458/1 15451/15459/1 15452/15460/1 +f 15453/15461/1 15454/15462/1 15455/15463/1 15456/15464/1 +f 15457/15465/1 15458/15466/1 15459/15467/1 15460/15468/1 +f 15461/15469/1 15462/15470/1 15463/15471/1 15464/15472/1 +f 15465/15473/1 15466/15474/1 15467/15475/1 15468/15476/1 +f 15469/15477/1 15470/15478/1 15471/15479/1 15472/15480/1 +f 15473/15481/1 15474/15482/1 15475/15483/1 15476/15484/1 +f 15477/15485/1 15478/15486/1 15479/15487/1 15480/15488/1 +f 15481/15489/1 15482/15490/1 15483/15491/1 15484/15492/1 +f 15485/15493/1 15486/15494/1 15487/15495/1 15488/15496/1 +f 15489/15497/1 15490/15498/1 15491/15499/1 15492/15500/1 +f 15493/15501/1 15494/15502/1 15495/15503/1 15496/15504/1 +f 15497/15505/1 15498/15506/1 15499/15507/1 15500/15508/1 +f 15501/15509/1 15502/15510/1 15503/15511/1 15504/15512/1 +f 15505/15513/1 15506/15514/1 15507/15515/1 15508/15516/1 +f 15509/15517/1 15510/15518/1 15511/15519/1 15512/15520/1 +f 15513/15521/1 15514/15522/1 15515/15523/1 15516/15524/1 +f 15517/15525/1 15518/15526/1 15519/15527/1 15520/15528/1 +f 15521/15529/1 15522/15530/1 15523/15531/1 15524/15532/1 +f 15525/15533/1 15526/15534/1 15527/15535/1 15528/15536/1 +f 15529/15537/1 15530/15538/1 15531/15539/1 15532/15540/1 +f 15533/15541/1 15534/15542/1 15535/15543/1 15536/15544/1 +f 15537/15545/1 15538/15546/1 15539/15547/1 15540/15548/1 +f 15541/15549/1 15542/15550/1 15543/15551/1 15544/15552/1 +f 15545/15553/1 15546/15554/1 15547/15555/1 15548/15556/1 +f 15549/15557/1 15550/15558/1 15551/15559/1 15552/15560/1 +f 15553/15561/1 15554/15562/1 15555/15563/1 15556/15564/1 +f 15557/15565/1 15558/15566/1 15559/15567/1 15560/15568/1 +f 15561/15569/1 15562/15570/1 15563/15571/1 15564/15572/1 +f 15565/15573/1 15566/15574/1 15567/15575/1 15568/15576/1 +f 15569/15577/1 15570/15578/1 15571/15579/1 15572/15580/1 +f 15573/15581/1 15574/15582/1 15575/15583/1 15576/15584/1 +f 15577/15585/1 15578/15586/1 15579/15587/1 15580/15588/1 +f 15581/15589/1 15582/15590/1 15583/15591/1 15584/15592/1 +f 15585/15593/1 15586/15594/1 15587/15595/1 15588/15596/1 +f 15589/15597/1 15590/15598/1 15591/15599/1 15592/15600/1 +f 15593/15601/1 15594/15602/1 15595/15603/1 15596/15604/1 +f 15597/15605/1 15598/15606/1 15599/15607/1 15600/15608/1 +f 15601/15609/1 15602/15610/1 15603/15611/1 15604/15612/1 +f 15605/15613/1 15606/15614/1 15607/15615/1 15608/15616/1 +f 15609/15617/1 15610/15618/1 15611/15619/1 15612/15620/1 +f 15613/15621/1 15614/15622/1 15615/15623/1 15616/15624/1 +f 15617/15625/1 15618/15626/1 15619/15627/1 15620/15628/1 +f 15621/15629/1 15622/15630/1 15623/15631/1 15624/15632/1 +f 15625/15633/1 15626/15634/1 15627/15635/1 15628/15636/1 +f 15629/15637/1 15630/15638/1 15631/15639/1 15632/15640/1 +f 15633/15641/1 15634/15642/1 15635/15643/1 15636/15644/1 +f 15637/15645/1 15638/15646/1 15639/15647/1 15640/15648/1 +f 15641/15649/1 15642/15650/1 15643/15651/1 15644/15652/1 +f 15645/15653/1 15646/15654/1 15647/15655/1 15648/15656/1 +f 15649/15657/1 15650/15658/1 15651/15659/1 15652/15660/1 +f 15653/15661/1 15654/15662/1 15655/15663/1 15656/15664/1 +f 15657/15665/1 15658/15666/1 15659/15667/1 15660/15668/1 +f 15661/15669/1 15662/15670/1 15663/15671/1 15664/15672/1 +f 15665/15673/1 15666/15674/1 15667/15675/1 15668/15676/1 +f 15669/15677/1 15670/15678/1 15671/15679/1 15672/15680/1 +f 15673/15681/1 15674/15682/1 15675/15683/1 15676/15684/1 +f 15677/15685/1 15678/15686/1 15679/15687/1 15680/15688/1 +f 15681/15689/1 15682/15690/1 15683/15691/1 15684/15692/1 +f 15685/15693/1 15686/15694/1 15687/15695/1 15688/15696/1 +f 15689/15697/1 15690/15698/1 15691/15699/1 15692/15700/1 +f 15693/15701/1 15694/15702/1 15695/15703/1 15696/15704/1 +f 15697/15705/1 15698/15706/1 15699/15707/1 15700/15708/1 +f 15701/15709/1 15702/15710/1 15703/15711/1 15704/15712/1 +f 15705/15713/1 15706/15714/1 15707/15715/1 15708/15716/1 +f 15709/15717/1 15710/15718/1 15711/15719/1 15712/15720/1 +f 15713/15721/1 15714/15722/1 15715/15723/1 15716/15724/1 +f 15717/15725/1 15718/15726/1 15719/15727/1 15720/15728/1 +f 15721/15729/1 15722/15730/1 15723/15731/1 15724/15732/1 +f 15725/15733/1 15726/15734/1 15727/15735/1 15728/15736/1 +f 15729/15737/1 15730/15738/1 15731/15739/1 15732/15740/1 +f 15733/15741/1 15734/15742/1 15735/15743/1 15736/15744/1 +f 15737/15745/1 15738/15746/1 15739/15747/1 15740/15748/1 +f 15741/15749/1 15742/15750/1 15743/15751/1 15744/15752/1 +f 15745/15753/1 15746/15754/1 15747/15755/1 15748/15756/1 +f 15749/15757/1 15750/15758/1 15751/15759/1 15752/15760/1 +f 15753/15761/1 15754/15762/1 15755/15763/1 15756/15764/1 +f 15757/15765/1 15758/15766/1 15759/15767/1 15760/15768/1 +f 15761/15769/1 15762/15770/1 15763/15771/1 15764/15772/1 +f 15765/15773/1 15766/15774/1 15767/15775/1 15768/15776/1 +f 15769/15777/1 15770/15778/1 15771/15779/1 15772/15780/1 +f 15773/15781/1 15774/15782/1 15775/15783/1 15776/15784/1 +f 15777/15785/1 15778/15786/1 15779/15787/1 15780/15788/1 +f 15781/15789/1 15782/15790/1 15783/15791/1 15784/15792/1 +f 15785/15793/1 15786/15794/1 15787/15795/1 15788/15796/1 +f 15789/15797/1 15790/15798/1 15791/15799/1 15792/15800/1 +f 15793/15801/1 15794/15802/1 15795/15803/1 15796/15804/1 +f 15797/15805/1 15798/15806/1 15799/15807/1 15800/15808/1 +f 15801/15809/1 15802/15810/1 15803/15811/1 15804/15812/1 +f 15805/15813/1 15806/15814/1 15807/15815/1 15808/15816/1 +f 15809/15817/1 15810/15818/1 15811/15819/1 15812/15820/1 +f 15813/15821/1 15814/15822/1 15815/15823/1 15816/15824/1 +f 15817/15825/1 15818/15826/1 15819/15827/1 15820/15828/1 +f 15821/15829/1 15822/15830/1 15823/15831/1 15824/15832/1 +f 15825/15833/1 15826/15834/1 15827/15835/1 15828/15836/1 +f 15829/15837/1 15830/15838/1 15831/15839/1 15832/15840/1 +f 15833/15841/1 15834/15842/1 15835/15843/1 15836/15844/1 +f 15837/15845/1 15838/15846/1 15839/15847/1 15840/15848/1 +f 15841/15849/1 15842/15850/1 15843/15851/1 15844/15852/1 +f 15845/15853/1 15846/15854/1 15847/15855/1 15848/15856/1 +f 15849/15857/1 15850/15858/1 15851/15859/1 15852/15860/1 +f 15853/15861/1 15854/15862/1 15855/15863/1 15856/15864/1 +f 15857/15865/1 15858/15866/1 15859/15867/1 15860/15868/1 +f 15861/15869/1 15862/15870/1 15863/15871/1 15864/15872/1 +f 15865/15873/1 15866/15874/1 15867/15875/1 15868/15876/1 +f 15869/15877/1 15870/15878/1 15871/15879/1 15872/15880/1 +f 15873/15881/1 15874/15882/1 15875/15883/1 15876/15884/1 +f 15877/15885/1 15878/15886/1 15879/15887/1 15880/15888/1 +f 15881/15889/1 15882/15890/1 15883/15891/1 15884/15892/1 +f 15885/15893/1 15886/15894/1 15887/15895/1 15888/15896/1 +f 15889/15897/1 15890/15898/1 15891/15899/1 15892/15900/1 +f 15893/15901/1 15894/15902/1 15895/15903/1 15896/15904/1 +f 15897/15905/1 15898/15906/1 15899/15907/1 15900/15908/1 +f 15901/15909/1 15902/15910/1 15903/15911/1 15904/15912/1 +f 15905/15913/1 15906/15914/1 15907/15915/1 15908/15916/1 +f 15909/15917/1 15910/15918/1 15911/15919/1 15912/15920/1 +f 15913/15921/1 15914/15922/1 15915/15923/1 15916/15924/1 +f 15917/15925/1 15918/15926/1 15919/15927/1 15920/15928/1 +f 15921/15929/1 15922/15930/1 15923/15931/1 15924/15932/1 +f 15925/15933/1 15926/15934/1 15927/15935/1 15928/15936/1 +f 15929/15937/1 15930/15938/1 15931/15939/1 15932/15940/1 +f 15933/15941/1 15934/15942/1 15935/15943/1 15936/15944/1 +f 15937/15945/1 15938/15946/1 15939/15947/1 15940/15948/1 +f 15941/15949/1 15942/15950/1 15943/15951/1 15944/15952/1 +f 15945/15953/1 15946/15954/1 15947/15955/1 15948/15956/1 +f 15949/15957/1 15950/15958/1 15951/15959/1 15952/15960/1 +f 15953/15961/1 15954/15962/1 15955/15963/1 15956/15964/1 +f 15957/15965/1 15958/15966/1 15959/15967/1 15960/15968/1 +f 15961/15969/1 15962/15970/1 15963/15971/1 15964/15972/1 +f 15965/15973/1 15966/15974/1 15967/15975/1 15968/15976/1 +f 15969/15977/1 15970/15978/1 15971/15979/1 15972/15980/1 +f 15973/15981/1 15974/15982/1 15975/15983/1 15976/15984/1 +f 15977/15985/1 15978/15986/1 15979/15987/1 15980/15988/1 +f 15981/15989/1 15982/15990/1 15983/15991/1 15984/15992/1 +f 15985/15993/1 15986/15994/1 15987/15995/1 15988/15996/1 +f 15989/15997/1 15990/15998/1 15991/15999/1 15992/16000/1 +f 15993/16001/1 15994/16002/1 15995/16003/1 15996/16004/1 +f 15997/16005/1 15998/16006/1 15999/16007/1 16000/16008/1 +f 16001/16009/1 16002/16010/1 16003/16011/1 16004/16012/1 +f 16005/16013/1 16006/16014/1 16007/16015/1 16008/16016/1 +f 16009/16017/1 16010/16018/1 16011/16019/1 16012/16020/1 +f 16013/16021/1 16014/16022/1 16015/16023/1 16016/16024/1 +f 16017/16025/1 16018/16026/1 16019/16027/1 16020/16028/1 +f 16021/16029/1 16022/16030/1 16023/16031/1 16024/16032/1 +f 16025/16033/1 16026/16034/1 16027/16035/1 16028/16036/1 +f 16029/16037/1 16030/16038/1 16031/16039/1 16032/16040/1 +f 16033/16041/1 16034/16042/1 16035/16043/1 16036/16044/1 +f 16037/16045/1 16038/16046/1 16039/16047/1 16040/16048/1 +f 16041/16049/1 16042/16050/1 16043/16051/1 16044/16052/1 +f 16045/16053/1 16046/16054/1 16047/16055/1 16048/16056/1 +f 16049/16057/1 16050/16058/1 16051/16059/1 16052/16060/1 +f 16053/16061/1 16054/16062/1 16055/16063/1 16056/16064/1 +f 16057/16065/1 16058/16066/1 16059/16067/1 16060/16068/1 +f 16061/16069/1 16062/16070/1 16063/16071/1 16064/16072/1 +f 16065/16073/1 16066/16074/1 16067/16075/1 16068/16076/1 +f 16069/16077/1 16070/16078/1 16071/16079/1 16072/16080/1 +f 16073/16081/1 16074/16082/1 16075/16083/1 16076/16084/1 +f 16077/16085/1 16078/16086/1 16079/16087/1 16080/16088/1 +f 16081/16089/1 16082/16090/1 16083/16091/1 16084/16092/1 +f 16085/16093/1 16086/16094/1 16087/16095/1 16088/16096/1 +f 16089/16097/1 16090/16098/1 16091/16099/1 16092/16100/1 +f 16093/16101/1 16094/16102/1 16095/16103/1 16096/16104/1 +f 16097/16105/1 16098/16106/1 16099/16107/1 16100/16108/1 +f 16101/16109/1 16102/16110/1 16103/16111/1 16104/16112/1 +f 16105/16113/1 16106/16114/1 16107/16115/1 16108/16116/1 +f 16109/16117/1 16110/16118/1 16111/16119/1 16112/16120/1 +f 16113/16121/1 16114/16122/1 16115/16123/1 16116/16124/1 +f 16117/16125/1 16118/16126/1 16119/16127/1 16120/16128/1 +f 16121/16129/1 16122/16130/1 16123/16131/1 16124/16132/1 +f 16125/16133/1 16126/16134/1 16127/16135/1 16128/16136/1 +f 16129/16137/1 16130/16138/1 16131/16139/1 16132/16140/1 +f 16133/16141/1 16134/16142/1 16135/16143/1 16136/16144/1 +f 16137/16145/1 16138/16146/1 16139/16147/1 16140/16148/1 +f 16141/16149/1 16142/16150/1 16143/16151/1 16144/16152/1 +f 16145/16153/1 16146/16154/1 16147/16155/1 16148/16156/1 +f 16149/16157/1 16150/16158/1 16151/16159/1 16152/16160/1 +f 16153/16161/1 16154/16162/1 16155/16163/1 16156/16164/1 +f 16157/16165/1 16158/16166/1 16159/16167/1 16160/16168/1 +f 16161/16169/1 16162/16170/1 16163/16171/1 16164/16172/1 +f 16165/16173/1 16166/16174/1 16167/16175/1 16168/16176/1 +f 16169/16177/1 16170/16178/1 16171/16179/1 16172/16180/1 +f 16173/16181/1 16174/16182/1 16175/16183/1 16176/16184/1 +f 16177/16185/1 16178/16186/1 16179/16187/1 16180/16188/1 +f 16181/16189/1 16182/16190/1 16183/16191/1 16184/16192/1 +f 16185/16193/1 16186/16194/1 16187/16195/1 16188/16196/1 +f 16189/16197/1 16190/16198/1 16191/16199/1 16192/16200/1 +f 16193/16201/1 16194/16202/1 16195/16203/1 16196/16204/1 +f 16197/16205/1 16198/16206/1 16199/16207/1 16200/16208/1 +f 16201/16209/1 16202/16210/1 16203/16211/1 16204/16212/1 +f 16205/16213/1 16206/16214/1 16207/16215/1 16208/16216/1 +f 16209/16217/1 16210/16218/1 16211/16219/1 16212/16220/1 +f 16213/16221/1 16214/16222/1 16215/16223/1 16216/16224/1 +f 16217/16225/1 16218/16226/1 16219/16227/1 16220/16228/1 +f 16221/16229/1 16222/16230/1 16223/16231/1 16224/16232/1 +f 16225/16233/1 16226/16234/1 16227/16235/1 16228/16236/1 +f 16229/16237/1 16230/16238/1 16231/16239/1 16232/16240/1 +f 16233/16241/1 16234/16242/1 16235/16243/1 16236/16244/1 +f 16237/16245/1 16238/16246/1 16239/16247/1 16240/16248/1 +f 16241/16249/1 16242/16250/1 16243/16251/1 16244/16252/1 +f 16245/16253/1 16246/16254/1 16247/16255/1 16248/16256/1 +f 16249/16257/1 16250/16258/1 16251/16259/1 16252/16260/1 +f 16253/16261/1 16254/16262/1 16255/16263/1 16256/16264/1 +f 16257/16265/1 16258/16266/1 16259/16267/1 16260/16268/1 +f 16261/16269/1 16262/16270/1 16263/16271/1 16264/16272/1 +f 16265/16273/1 16266/16274/1 16267/16275/1 16268/16276/1 +f 16269/16277/1 16270/16278/1 16271/16279/1 16272/16280/1 +f 16273/16281/1 16274/16282/1 16275/16283/1 16276/16284/1 +f 16277/16285/1 16278/16286/1 16279/16287/1 16280/16288/1 +f 16281/16289/1 16282/16290/1 16283/16291/1 16284/16292/1 +f 16285/16293/1 16286/16294/1 16287/16295/1 16288/16296/1 +f 16289/16297/1 16290/16298/1 16291/16299/1 16292/16300/1 +f 16293/16301/1 16294/16302/1 16295/16303/1 16296/16304/1 +f 16297/16305/1 16298/16306/1 16299/16307/1 16300/16308/1 +f 16301/16309/1 16302/16310/1 16303/16311/1 16304/16312/1 +f 16305/16313/1 16306/16314/1 16307/16315/1 16308/16316/1 +f 16309/16317/1 16310/16318/1 16311/16319/1 16312/16320/1 +f 16313/16321/1 16314/16322/1 16315/16323/1 16316/16324/1 +f 16317/16325/1 16318/16326/1 16319/16327/1 16320/16328/1 +f 16321/16329/1 16322/16330/1 16323/16331/1 16324/16332/1 +f 16325/16333/1 16326/16334/1 16327/16335/1 16328/16336/1 +f 16329/16337/1 16330/16338/1 16331/16339/1 16332/16340/1 +f 16333/16341/1 16334/16342/1 16335/16343/1 16336/16344/1 +f 16337/16345/1 16338/16346/1 16339/16347/1 16340/16348/1 +f 16341/16349/1 16342/16350/1 16343/16351/1 16344/16352/1 +f 16345/16353/1 16346/16354/1 16347/16355/1 16348/16356/1 +f 16349/16357/1 16350/16358/1 16351/16359/1 16352/16360/1 +f 16353/16361/1 16354/16362/1 16355/16363/1 16356/16364/1 +f 16357/16365/1 16358/16366/1 16359/16367/1 16360/16368/1 +f 16361/16369/1 16362/16370/1 16363/16371/1 16364/16372/1 +f 16365/16373/1 16366/16374/1 16367/16375/1 16368/16376/1 +f 16369/16377/1 16370/16378/1 16371/16379/1 16372/16380/1 +f 16373/16381/1 16374/16382/1 16375/16383/1 16376/16384/1 +f 16377/16385/1 16378/16386/1 16379/16387/1 16380/16388/1 +f 16381/16389/1 16382/16390/1 16383/16391/1 16384/16392/1 +f 16385/16393/1 16386/16394/1 16387/16395/1 16388/16396/1 +f 16389/16397/1 16390/16398/1 16391/16399/1 16392/16400/1 +f 16393/16401/1 16394/16402/1 16395/16403/1 16396/16404/1 +f 16397/16405/1 16398/16406/1 16399/16407/1 16400/16408/1 +f 16401/16409/1 16402/16410/1 16403/16411/1 16404/16412/1 +f 16405/16413/1 16406/16414/1 16407/16415/1 16408/16416/1 +f 16409/16417/1 16410/16418/1 16411/16419/1 16412/16420/1 +f 16413/16421/1 16414/16422/1 16415/16423/1 16416/16424/1 +f 16417/16425/1 16418/16426/1 16419/16427/1 16420/16428/1 +f 16421/16429/1 16422/16430/1 16423/16431/1 16424/16432/1 +f 16425/16433/1 16426/16434/1 16427/16435/1 16428/16436/1 +f 16429/16437/1 16430/16438/1 16431/16439/1 16432/16440/1 +f 16433/16441/1 16434/16442/1 16435/16443/1 16436/16444/1 +f 16437/16445/1 16438/16446/1 16439/16447/1 16440/16448/1 +f 16441/16449/1 16442/16450/1 16443/16451/1 16444/16452/1 +f 16445/16453/1 16446/16454/1 16447/16455/1 16448/16456/1 +f 16449/16457/1 16450/16458/1 16451/16459/1 16452/16460/1 +f 16453/16461/1 16454/16462/1 16455/16463/1 16456/16464/1 +f 16457/16465/1 16458/16466/1 16459/16467/1 16460/16468/1 +f 16461/16469/1 16462/16470/1 16463/16471/1 16464/16472/1 +f 16465/16473/1 16466/16474/1 16467/16475/1 16468/16476/1 +f 16469/16477/1 16470/16478/1 16471/16479/1 16472/16480/1 +f 16473/16481/1 16474/16482/1 16475/16483/1 16476/16484/1 +f 16477/16485/1 16478/16486/1 16479/16487/1 16480/16488/1 +f 16481/16489/1 16482/16490/1 16483/16491/1 16484/16492/1 +f 16485/16493/1 16486/16494/1 16487/16495/1 16488/16496/1 +f 16489/16497/1 16490/16498/1 16491/16499/1 16492/16500/1 +f 16493/16501/1 16494/16502/1 16495/16503/1 16496/16504/1 +f 16497/16505/1 16498/16506/1 16499/16507/1 16500/16508/1 +f 16501/16509/1 16502/16510/1 16503/16511/1 16504/16512/1 +f 16505/16513/1 16506/16514/1 16507/16515/1 16508/16516/1 +f 16509/16517/1 16510/16518/1 16511/16519/1 16512/16520/1 +f 16513/16521/1 16514/16522/1 16515/16523/1 16516/16524/1 +f 16517/16525/1 16518/16526/1 16519/16527/1 16520/16528/1 +f 16521/16529/1 16522/16530/1 16523/16531/1 16524/16532/1 +f 16525/16533/1 16526/16534/1 16527/16535/1 16528/16536/1 +f 16529/16537/1 16530/16538/1 16531/16539/1 16532/16540/1 +f 16533/16541/1 16534/16542/1 16535/16543/1 16536/16544/1 +f 16537/16545/1 16538/16546/1 16539/16547/1 16540/16548/1 +f 16541/16549/1 16542/16550/1 16543/16551/1 16544/16552/1 +f 16545/16553/1 16546/16554/1 16547/16555/1 16548/16556/1 +f 16549/16557/1 16550/16558/1 16551/16559/1 16552/16560/1 +f 16553/16561/1 16554/16562/1 16555/16563/1 16556/16564/1 +f 16557/16565/1 16558/16566/1 16559/16567/1 16560/16568/1 +f 16561/16569/1 16562/16570/1 16563/16571/1 16564/16572/1 +f 16565/16573/1 16566/16574/1 16567/16575/1 16568/16576/1 +f 16569/16577/1 16570/16578/1 16571/16579/1 16572/16580/1 +f 16573/16581/1 16574/16582/1 16575/16583/1 16576/16584/1 +f 16577/16585/1 16578/16586/1 16579/16587/1 16580/16588/1 +f 16581/16589/1 16582/16590/1 16583/16591/1 16584/16592/1 +f 16585/16593/1 16586/16594/1 16587/16595/1 16588/16596/1 +f 16589/16597/1 16590/16598/1 16591/16599/1 16592/16600/1 +f 16593/16601/1 16594/16602/1 16595/16603/1 16596/16604/1 +f 16597/16605/1 16598/16606/1 16599/16607/1 16600/16608/1 +f 16601/16609/1 16602/16610/1 16603/16611/1 16604/16612/1 +f 16605/16613/1 16606/16614/1 16607/16615/1 16608/16616/1 +f 16609/16617/1 16610/16618/1 16611/16619/1 16612/16620/1 +f 16613/16621/1 16614/16622/1 16615/16623/1 16616/16624/1 +f 16617/16625/1 16618/16626/1 16619/16627/1 16620/16628/1 +f 16621/16629/1 16622/16630/1 16623/16631/1 16624/16632/1 +f 16625/16633/1 16626/16634/1 16627/16635/1 16628/16636/1 +f 16629/16637/1 16630/16638/1 16631/16639/1 16632/16640/1 +f 16633/16641/1 16634/16642/1 16635/16643/1 16636/16644/1 +f 16637/16645/1 16638/16646/1 16639/16647/1 16640/16648/1 +f 16641/16649/1 16642/16650/1 16643/16651/1 16644/16652/1 +f 16645/16653/1 16646/16654/1 16647/16655/1 16648/16656/1 +f 16649/16657/1 16650/16658/1 16651/16659/1 16652/16660/1 +f 16653/16661/1 16654/16662/1 16655/16663/1 16656/16664/1 +f 16657/16665/1 16658/16666/1 16659/16667/1 16660/16668/1 +f 16661/16669/1 16662/16670/1 16663/16671/1 16664/16672/1 +f 16665/16673/1 16666/16674/1 16667/16675/1 16668/16676/1 +f 16669/16677/1 16670/16678/1 16671/16679/1 16672/16680/1 +f 16673/16681/1 16674/16682/1 16675/16683/1 16676/16684/1 +f 16677/16685/1 16678/16686/1 16679/16687/1 16680/16688/1 +f 16681/16689/1 16682/16690/1 16683/16691/1 16684/16692/1 +f 16685/16693/1 16686/16694/1 16687/16695/1 16688/16696/1 +f 16689/16697/1 16690/16698/1 16691/16699/1 16692/16700/1 +f 16693/16701/1 16694/16702/1 16695/16703/1 16696/16704/1 +f 16697/16705/1 16698/16706/1 16699/16707/1 16700/16708/1 +f 16701/16709/1 16702/16710/1 16703/16711/1 16704/16712/1 +f 16705/16713/1 16706/16714/1 16707/16715/1 16708/16716/1 +f 16709/16717/1 16710/16718/1 16711/16719/1 16712/16720/1 +f 16713/16721/1 16714/16722/1 16715/16723/1 16716/16724/1 +f 16717/16725/1 16718/16726/1 16719/16727/1 16720/16728/1 +f 16721/16729/1 16722/16730/1 16723/16731/1 16724/16732/1 +f 16725/16733/1 16726/16734/1 16727/16735/1 16728/16736/1 +f 16729/16737/1 16730/16738/1 16731/16739/1 16732/16740/1 +f 16733/16741/1 16734/16742/1 16735/16743/1 16736/16744/1 +f 16737/16745/1 16738/16746/1 16739/16747/1 16740/16748/1 +f 16741/16749/1 16742/16750/1 16743/16751/1 16744/16752/1 +f 16745/16753/1 16746/16754/1 16747/16755/1 16748/16756/1 +f 16749/16757/1 16750/16758/1 16751/16759/1 16752/16760/1 +f 16753/16761/1 16754/16762/1 16755/16763/1 16756/16764/1 +f 16757/16765/1 16758/16766/1 16759/16767/1 16760/16768/1 +f 16761/16769/1 16762/16770/1 16763/16771/1 16764/16772/1 +f 16765/16773/1 16766/16774/1 16767/16775/1 16768/16776/1 +f 16769/16777/1 16770/16778/1 16771/16779/1 16772/16780/1 +f 16773/16781/1 16774/16782/1 16775/16783/1 16776/16784/1 +f 16777/16785/1 16778/16786/1 16779/16787/1 16780/16788/1 +f 16781/16789/1 16782/16790/1 16783/16791/1 16784/16792/1 +f 16785/16793/1 16786/16794/1 16787/16795/1 16788/16796/1 +f 16789/16797/1 16790/16798/1 16791/16799/1 16792/16800/1 +f 16793/16801/1 16794/16802/1 16795/16803/1 16796/16804/1 +f 16797/16805/1 16798/16806/1 16799/16807/1 16800/16808/1 +f 16801/16809/1 16802/16810/1 16803/16811/1 16804/16812/1 +f 16805/16813/1 16806/16814/1 16807/16815/1 16808/16816/1 +f 16809/16817/1 16810/16818/1 16811/16819/1 16812/16820/1 +f 16813/16821/1 16814/16822/1 16815/16823/1 16816/16824/1 +f 16817/16825/1 16818/16826/1 16819/16827/1 16820/16828/1 +f 16821/16829/1 16822/16830/1 16823/16831/1 16824/16832/1 +f 16825/16833/1 16826/16834/1 16827/16835/1 16828/16836/1 +f 16829/16837/1 16830/16838/1 16831/16839/1 16832/16840/1 +f 16833/16841/1 16834/16842/1 16835/16843/1 16836/16844/1 +f 16837/16845/1 16838/16846/1 16839/16847/1 16840/16848/1 +f 16841/16849/1 16842/16850/1 16843/16851/1 16844/16852/1 +f 16845/16853/1 16846/16854/1 16847/16855/1 16848/16856/1 +f 16849/16857/1 16850/16858/1 16851/16859/1 16852/16860/1 +f 16853/16861/1 16854/16862/1 16855/16863/1 16856/16864/1 +f 16857/16865/1 16858/16866/1 16859/16867/1 16860/16868/1 +f 16861/16869/1 16862/16870/1 16863/16871/1 16864/16872/1 +f 16865/16873/1 16866/16874/1 16867/16875/1 16868/16876/1 +f 16869/16877/1 16870/16878/1 16871/16879/1 16872/16880/1 +f 16873/16881/1 16874/16882/1 16875/16883/1 16876/16884/1 +f 16877/16885/1 16878/16886/1 16879/16887/1 16880/16888/1 +f 16881/16889/1 16882/16890/1 16883/16891/1 16884/16892/1 +f 16885/16893/1 16886/16894/1 16887/16895/1 16888/16896/1 +f 16889/16897/1 16890/16898/1 16891/16899/1 16892/16900/1 +f 16893/16901/1 16894/16902/1 16895/16903/1 16896/16904/1 +f 16897/16905/1 16898/16906/1 16899/16907/1 16900/16908/1 +f 16901/16909/1 16902/16910/1 16903/16911/1 16904/16912/1 +f 16905/16913/1 16906/16914/1 16907/16915/1 16908/16916/1 +f 16909/16917/1 16910/16918/1 16911/16919/1 16912/16920/1 +f 16913/16921/1 16914/16922/1 16915/16923/1 16916/16924/1 +f 16917/16925/1 16918/16926/1 16919/16927/1 16920/16928/1 +f 16921/16929/1 16922/16930/1 16923/16931/1 16924/16932/1 +f 16925/16933/1 16926/16934/1 16927/16935/1 16928/16936/1 +f 16929/16937/1 16930/16938/1 16931/16939/1 16932/16940/1 +f 16933/16941/1 16934/16942/1 16935/16943/1 16936/16944/1 +f 16937/16945/1 16938/16946/1 16939/16947/1 16940/16948/1 +f 16941/16949/1 16942/16950/1 16943/16951/1 16944/16952/1 +f 16945/16953/1 16946/16954/1 16947/16955/1 16948/16956/1 +f 16949/16957/1 16950/16958/1 16951/16959/1 16952/16960/1 +f 16953/16961/1 16954/16962/1 16955/16963/1 16956/16964/1 +f 16957/16965/1 16958/16966/1 16959/16967/1 16960/16968/1 +f 16961/16969/1 16962/16970/1 16963/16971/1 16964/16972/1 +f 16965/16973/1 16966/16974/1 16967/16975/1 16968/16976/1 +f 16969/16977/1 16970/16978/1 16971/16979/1 16972/16980/1 +f 16973/16981/1 16974/16982/1 16975/16983/1 16976/16984/1 +f 16977/16985/1 16978/16986/1 16979/16987/1 16980/16988/1 +f 16981/16989/1 16982/16990/1 16983/16991/1 16984/16992/1 +f 16985/16993/1 16986/16994/1 16987/16995/1 16988/16996/1 +f 16989/16997/1 16990/16998/1 16991/16999/1 16992/17000/1 +f 16993/17001/1 16994/17002/1 16995/17003/1 16996/17004/1 +f 16997/17005/1 16998/17006/1 16999/17007/1 17000/17008/1 +f 17001/17009/1 17002/17010/1 17003/17011/1 17004/17012/1 +f 17005/17013/1 17006/17014/1 17007/17015/1 17008/17016/1 +f 17009/17017/1 17010/17018/1 17011/17019/1 17012/17020/1 +f 17013/17021/1 17014/17022/1 17015/17023/1 17016/17024/1 +f 17017/17025/1 17018/17026/1 17019/17027/1 17020/17028/1 +f 17021/17029/1 17022/17030/1 17023/17031/1 17024/17032/1 +f 17025/17033/1 17026/17034/1 17027/17035/1 17028/17036/1 +f 17029/17037/1 17030/17038/1 17031/17039/1 17032/17040/1 +f 17033/17041/1 17034/17042/1 17035/17043/1 17036/17044/1 +f 17037/17045/1 17038/17046/1 17039/17047/1 17040/17048/1 +f 17041/17049/1 17042/17050/1 17043/17051/1 17044/17052/1 +f 17045/17053/1 17046/17054/1 17047/17055/1 17048/17056/1 +f 17049/17057/1 17050/17058/1 17051/17059/1 17052/17060/1 +f 17053/17061/1 17054/17062/1 17055/17063/1 17056/17064/1 +f 17057/17065/1 17058/17066/1 17059/17067/1 17060/17068/1 +f 17061/17069/1 17062/17070/1 17063/17071/1 17064/17072/1 +f 17065/17073/1 17066/17074/1 17067/17075/1 17068/17076/1 +f 17069/17077/1 17070/17078/1 17071/17079/1 17072/17080/1 +f 17073/17081/1 17074/17082/1 17075/17083/1 17076/17084/1 +f 17077/17085/1 17078/17086/1 17079/17087/1 17080/17088/1 +f 17081/17089/1 17082/17090/1 17083/17091/1 17084/17092/1 +f 17085/17093/1 17086/17094/1 17087/17095/1 17088/17096/1 +f 17089/17097/1 17090/17098/1 17091/17099/1 17092/17100/1 +f 17093/17101/1 17094/17102/1 17095/17103/1 17096/17104/1 +f 17097/17105/1 17098/17106/1 17099/17107/1 17100/17108/1 +f 17101/17109/1 17102/17110/1 17103/17111/1 17104/17112/1 +f 17105/17113/1 17106/17114/1 17107/17115/1 17108/17116/1 +f 17109/17117/1 17110/17118/1 17111/17119/1 17112/17120/1 +f 17113/17121/1 17114/17122/1 17115/17123/1 17116/17124/1 +f 17117/17125/1 17118/17126/1 17119/17127/1 17120/17128/1 +f 17121/17129/1 17122/17130/1 17123/17131/1 17124/17132/1 +f 17125/17133/1 17126/17134/1 17127/17135/1 17128/17136/1 +f 17129/17137/1 17130/17138/1 17131/17139/1 17132/17140/1 +f 17133/17141/1 17134/17142/1 17135/17143/1 17136/17144/1 +f 17137/17145/1 17138/17146/1 17139/17147/1 17140/17148/1 +f 17141/17149/1 17142/17150/1 17143/17151/1 17144/17152/1 +f 17145/17153/1 17146/17154/1 17147/17155/1 17148/17156/1 +f 17149/17157/1 17150/17158/1 17151/17159/1 17152/17160/1 +f 17153/17161/1 17154/17162/1 17155/17163/1 17156/17164/1 +f 17157/17165/1 17158/17166/1 17159/17167/1 17160/17168/1 +f 17161/17169/1 17162/17170/1 17163/17171/1 17164/17172/1 +f 17165/17173/1 17166/17174/1 17167/17175/1 17168/17176/1 +f 17169/17177/1 17170/17178/1 17171/17179/1 17172/17180/1 +f 17173/17181/1 17174/17182/1 17175/17183/1 17176/17184/1 +f 17177/17185/1 17178/17186/1 17179/17187/1 17180/17188/1 +f 17181/17189/1 17182/17190/1 17183/17191/1 17184/17192/1 +f 17185/17193/1 17186/17194/1 17187/17195/1 17188/17196/1 +f 17189/17197/1 17190/17198/1 17191/17199/1 17192/17200/1 +f 17193/17201/1 17194/17202/1 17195/17203/1 17196/17204/1 +f 17197/17205/1 17198/17206/1 17199/17207/1 17200/17208/1 +f 17201/17209/1 17202/17210/1 17203/17211/1 17204/17212/1 +f 17205/17213/1 17206/17214/1 17207/17215/1 17208/17216/1 +f 17209/17217/1 17210/17218/1 17211/17219/1 17212/17220/1 +f 17213/17221/1 17214/17222/1 17215/17223/1 17216/17224/1 +f 17217/17225/1 17218/17226/1 17219/17227/1 17220/17228/1 +f 17221/17229/1 17222/17230/1 17223/17231/1 17224/17232/1 +f 17225/17233/1 17226/17234/1 17227/17235/1 17228/17236/1 +f 17229/17237/1 17230/17238/1 17231/17239/1 17232/17240/1 +f 17233/17241/1 17234/17242/1 17235/17243/1 17236/17244/1 +f 17237/17245/1 17238/17246/1 17239/17247/1 17240/17248/1 +f 17241/17249/1 17242/17250/1 17243/17251/1 17244/17252/1 +f 17245/17253/1 17246/17254/1 17247/17255/1 17248/17256/1 +f 17249/17257/1 17250/17258/1 17251/17259/1 17252/17260/1 +f 17253/17261/1 17254/17262/1 17255/17263/1 17256/17264/1 +f 17257/17265/1 17258/17266/1 17259/17267/1 17260/17268/1 +f 17261/17269/1 17262/17270/1 17263/17271/1 17264/17272/1 +f 17265/17273/1 17266/17274/1 17267/17275/1 17268/17276/1 +f 17269/17277/1 17270/17278/1 17271/17279/1 17272/17280/1 +f 17273/17281/1 17274/17282/1 17275/17283/1 17276/17284/1 +f 17277/17285/1 17278/17286/1 17279/17287/1 17280/17288/1 +f 17281/17289/1 17282/17290/1 17283/17291/1 17284/17292/1 +f 17285/17293/1 17286/17294/1 17287/17295/1 17288/17296/1 +f 17289/17297/1 17290/17298/1 17291/17299/1 17292/17300/1 +f 17293/17301/1 17294/17302/1 17295/17303/1 17296/17304/1 +f 17297/17305/1 17298/17306/1 17299/17307/1 17300/17308/1 +f 17301/17309/1 17302/17310/1 17303/17311/1 17304/17312/1 +f 17305/17313/1 17306/17314/1 17307/17315/1 17308/17316/1 +f 17309/17317/1 17310/17318/1 17311/17319/1 17312/17320/1 +f 17313/17321/1 17314/17322/1 17315/17323/1 17316/17324/1 +f 17317/17325/1 17318/17326/1 17319/17327/1 17320/17328/1 +f 17321/17329/1 17322/17330/1 17323/17331/1 17324/17332/1 +f 17325/17333/1 17326/17334/1 17327/17335/1 17328/17336/1 +f 17329/17337/1 17330/17338/1 17331/17339/1 17332/17340/1 +f 17333/17341/1 17334/17342/1 17335/17343/1 17336/17344/1 +f 17337/17345/1 17338/17346/1 17339/17347/1 17340/17348/1 +f 17341/17349/1 17342/17350/1 17343/17351/1 17344/17352/1 +f 17345/17353/1 17346/17354/1 17347/17355/1 17348/17356/1 +f 17349/17357/1 17350/17358/1 17351/17359/1 17352/17360/1 +f 17353/17361/1 17354/17362/1 17355/17363/1 17356/17364/1 +f 17357/17365/1 17358/17366/1 17359/17367/1 17360/17368/1 +f 17361/17369/1 17362/17370/1 17363/17371/1 17364/17372/1 +f 17365/17373/1 17366/17374/1 17367/17375/1 17368/17376/1 +f 17369/17377/1 17370/17378/1 17371/17379/1 17372/17380/1 +f 17373/17381/1 17374/17382/1 17375/17383/1 17376/17384/1 +f 17377/17385/1 17378/17386/1 17379/17387/1 17380/17388/1 +f 17381/17389/1 17382/17390/1 17383/17391/1 17384/17392/1 +f 17385/17393/1 17386/17394/1 17387/17395/1 17388/17396/1 +f 17389/17397/1 17390/17398/1 17391/17399/1 17392/17400/1 +f 17393/17401/1 17394/17402/1 17395/17403/1 17396/17404/1 +f 17397/17405/1 17398/17406/1 17399/17407/1 17400/17408/1 +f 17401/17409/1 17402/17410/1 17403/17411/1 17404/17412/1 +f 17405/17413/1 17406/17414/1 17407/17415/1 17408/17416/1 +f 17409/17417/1 17410/17418/1 17411/17419/1 17412/17420/1 +f 17406/17414/1 17409/17417/1 17412/17420/1 17407/17415/1 +f 5127/5135/1 5124/5132/1 17409/17417/1 17406/17414/1 +f 5124/5132/1 5123/5131/1 17410/17418/1 17409/17417/1 +f 5158/5166/1 17405/17413/1 17408/17416/1 5159/5167/1 +f 5119/5127/1 5128/5136/1 17405/17413/1 5158/5166/1 +f 5128/5136/1 5127/5135/1 17406/17414/1 17405/17413/1 +f 5114/5122/1 17401/17409/1 17404/17412/1 5115/5123/1 +f 5159/5167/1 17408/17416/1 17401/17409/1 5114/5122/1 +f 17408/17416/1 17407/17415/1 17402/17410/1 17401/17409/1 +f 17394/17402/1 17397/17405/1 17400/17408/1 17395/17403/1 +f 5163/5171/1 5112/5120/1 17397/17405/1 17394/17402/1 +f 5112/5120/1 5111/5119/1 17398/17406/1 17397/17405/1 +f 5194/5202/1 17393/17401/1 17396/17404/1 5195/5203/1 +f 5107/5115/1 5164/5172/1 17393/17401/1 5194/5202/1 +f 5164/5172/1 5163/5171/1 17394/17402/1 17393/17401/1 +f 5102/5110/1 17389/17397/1 17392/17400/1 5103/5111/1 +f 5195/5203/1 17396/17404/1 17389/17397/1 5102/5110/1 +f 17396/17404/1 17395/17403/1 17390/17398/1 17389/17397/1 +f 17382/17390/1 17385/17393/1 17388/17396/1 17383/17391/1 +f 5199/5207/1 5100/5108/1 17385/17393/1 17382/17390/1 +f 5100/5108/1 5099/5107/1 17386/17394/1 17385/17393/1 +f 5230/5238/1 17381/17389/1 17384/17392/1 5231/5239/1 +f 5095/5103/1 5200/5208/1 17381/17389/1 5230/5238/1 +f 5200/5208/1 5199/5207/1 17382/17390/1 17381/17389/1 +f 5090/5098/1 17377/17385/1 17380/17388/1 5091/5099/1 +f 5231/5239/1 17384/17392/1 17377/17385/1 5090/5098/1 +f 17384/17392/1 17383/17391/1 17378/17386/1 17377/17385/1 +f 17370/17378/1 17373/17381/1 17376/17384/1 17371/17379/1 +f 5235/5243/1 5088/5096/1 17373/17381/1 17370/17378/1 +f 5088/5096/1 5087/5095/1 17374/17382/1 17373/17381/1 +f 5266/5274/1 17369/17377/1 17372/17380/1 5267/5275/1 +f 5083/5091/1 5236/5244/1 17369/17377/1 5266/5274/1 +f 5236/5244/1 5235/5243/1 17370/17378/1 17369/17377/1 +f 5078/5086/1 17365/17373/1 17368/17376/1 5079/5087/1 +f 5267/5275/1 17372/17380/1 17365/17373/1 5078/5086/1 +f 17372/17380/1 17371/17379/1 17366/17374/1 17365/17373/1 +f 17358/17366/1 17361/17369/1 17364/17372/1 17359/17367/1 +f 5271/5279/1 5076/5084/1 17361/17369/1 17358/17366/1 +f 5076/5084/1 5075/5083/1 17362/17370/1 17361/17369/1 +f 5302/5310/1 17357/17365/1 17360/17368/1 5303/5311/1 +f 5071/5079/1 5272/5280/1 17357/17365/1 5302/5310/1 +f 5272/5280/1 5271/5279/1 17358/17366/1 17357/17365/1 +f 5066/5074/1 17353/17361/1 17356/17364/1 5067/5075/1 +f 5303/5311/1 17360/17368/1 17353/17361/1 5066/5074/1 +f 17360/17368/1 17359/17367/1 17354/17362/1 17353/17361/1 +f 17346/17354/1 17349/17357/1 17352/17360/1 17347/17355/1 +f 5307/5315/1 5064/5072/1 17349/17357/1 17346/17354/1 +f 5064/5072/1 5063/5071/1 17350/17358/1 17349/17357/1 +f 5338/5346/1 17345/17353/1 17348/17356/1 5339/5347/1 +f 5059/5067/1 5308/5316/1 17345/17353/1 5338/5346/1 +f 5308/5316/1 5307/5315/1 17346/17354/1 17345/17353/1 +f 5054/5062/1 17341/17349/1 17344/17352/1 5055/5063/1 +f 5339/5347/1 17348/17356/1 17341/17349/1 5054/5062/1 +f 17348/17356/1 17347/17355/1 17342/17350/1 17341/17349/1 +f 17334/17342/1 17337/17345/1 17340/17348/1 17335/17343/1 +f 5343/5351/1 5052/5060/1 17337/17345/1 17334/17342/1 +f 5052/5060/1 5051/5059/1 17338/17346/1 17337/17345/1 +f 5374/5382/1 17333/17341/1 17336/17344/1 5375/5383/1 +f 5047/5055/1 5344/5352/1 17333/17341/1 5374/5382/1 +f 5344/5352/1 5343/5351/1 17334/17342/1 17333/17341/1 +f 5042/5050/1 17329/17337/1 17332/17340/1 5043/5051/1 +f 5375/5383/1 17336/17344/1 17329/17337/1 5042/5050/1 +f 17336/17344/1 17335/17343/1 17330/17338/1 17329/17337/1 +f 17322/17330/1 17325/17333/1 17328/17336/1 17323/17331/1 +f 5379/5387/1 5040/5048/1 17325/17333/1 17322/17330/1 +f 5040/5048/1 5039/5047/1 17326/17334/1 17325/17333/1 +f 5410/5418/1 17321/17329/1 17324/17332/1 5411/5419/1 +f 5035/5043/1 5380/5388/1 17321/17329/1 5410/5418/1 +f 5380/5388/1 5379/5387/1 17322/17330/1 17321/17329/1 +f 5030/5038/1 17317/17325/1 17320/17328/1 5031/5039/1 +f 5411/5419/1 17324/17332/1 17317/17325/1 5030/5038/1 +f 17324/17332/1 17323/17331/1 17318/17326/1 17317/17325/1 +f 17310/17318/1 17313/17321/1 17316/17324/1 17311/17319/1 +f 5415/5423/1 5028/5036/1 17313/17321/1 17310/17318/1 +f 5028/5036/1 5027/5035/1 17314/17322/1 17313/17321/1 +f 5446/5454/1 17309/17317/1 17312/17320/1 5447/5455/1 +f 5023/5031/1 5416/5424/1 17309/17317/1 5446/5454/1 +f 5416/5424/1 5415/5423/1 17310/17318/1 17309/17317/1 +f 5018/5026/1 17305/17313/1 17308/17316/1 5019/5027/1 +f 5447/5455/1 17312/17320/1 17305/17313/1 5018/5026/1 +f 17312/17320/1 17311/17319/1 17306/17314/1 17305/17313/1 +f 17298/17306/1 17301/17309/1 17304/17312/1 17299/17307/1 +f 5451/5459/1 5016/5024/1 17301/17309/1 17298/17306/1 +f 5016/5024/1 5015/5023/1 17302/17310/1 17301/17309/1 +f 5482/5490/1 17297/17305/1 17300/17308/1 5483/5491/1 +f 5011/5019/1 5452/5460/1 17297/17305/1 5482/5490/1 +f 5452/5460/1 5451/5459/1 17298/17306/1 17297/17305/1 +f 5006/5014/1 17293/17301/1 17296/17304/1 5007/5015/1 +f 5483/5491/1 17300/17308/1 17293/17301/1 5006/5014/1 +f 17300/17308/1 17299/17307/1 17294/17302/1 17293/17301/1 +f 17286/17294/1 17289/17297/1 17292/17300/1 17287/17295/1 +f 5487/5495/1 5004/5012/1 17289/17297/1 17286/17294/1 +f 5004/5012/1 5003/5011/1 17290/17298/1 17289/17297/1 +f 5518/5526/1 17285/17293/1 17288/17296/1 5519/5527/1 +f 4999/5007/1 5488/5496/1 17285/17293/1 5518/5526/1 +f 5488/5496/1 5487/5495/1 17286/17294/1 17285/17293/1 +f 4994/5002/1 17281/17289/1 17284/17292/1 4995/5003/1 +f 5519/5527/1 17288/17296/1 17281/17289/1 4994/5002/1 +f 17288/17296/1 17287/17295/1 17282/17290/1 17281/17289/1 +f 17274/17282/1 17277/17285/1 17280/17288/1 17275/17283/1 +f 5523/5531/1 4992/5000/1 17277/17285/1 17274/17282/1 +f 4992/5000/1 4991/4999/1 17278/17286/1 17277/17285/1 +f 5554/5562/1 17273/17281/1 17276/17284/1 5555/5563/1 +f 4987/4995/1 5524/5532/1 17273/17281/1 5554/5562/1 +f 5524/5532/1 5523/5531/1 17274/17282/1 17273/17281/1 +f 4982/4990/1 17269/17277/1 17272/17280/1 4983/4991/1 +f 5555/5563/1 17276/17284/1 17269/17277/1 4982/4990/1 +f 17276/17284/1 17275/17283/1 17270/17278/1 17269/17277/1 +f 17262/17270/1 17265/17273/1 17268/17276/1 17263/17271/1 +f 5559/5567/1 4980/4988/1 17265/17273/1 17262/17270/1 +f 4980/4988/1 4979/4987/1 17266/17274/1 17265/17273/1 +f 5590/5598/1 17261/17269/1 17264/17272/1 5591/5599/1 +f 4975/4983/1 5560/5568/1 17261/17269/1 5590/5598/1 +f 5560/5568/1 5559/5567/1 17262/17270/1 17261/17269/1 +f 4970/4978/1 17257/17265/1 17260/17268/1 4971/4979/1 +f 5591/5599/1 17264/17272/1 17257/17265/1 4970/4978/1 +f 17264/17272/1 17263/17271/1 17258/17266/1 17257/17265/1 +f 17250/17258/1 17253/17261/1 17256/17264/1 17251/17259/1 +f 5595/5603/1 4968/4976/1 17253/17261/1 17250/17258/1 +f 4968/4976/1 4967/4975/1 17254/17262/1 17253/17261/1 +f 5626/5634/1 17249/17257/1 17252/17260/1 5627/5635/1 +f 4963/4971/1 5596/5604/1 17249/17257/1 5626/5634/1 +f 5596/5604/1 5595/5603/1 17250/17258/1 17249/17257/1 +f 4958/4966/1 17245/17253/1 17248/17256/1 4959/4967/1 +f 5627/5635/1 17252/17260/1 17245/17253/1 4958/4966/1 +f 17252/17260/1 17251/17259/1 17246/17254/1 17245/17253/1 +f 17238/17246/1 17241/17249/1 17244/17252/1 17239/17247/1 +f 5631/5639/1 4956/4964/1 17241/17249/1 17238/17246/1 +f 4956/4964/1 4955/4963/1 17242/17250/1 17241/17249/1 +f 5662/5670/1 17237/17245/1 17240/17248/1 5663/5671/1 +f 4951/4959/1 5632/5640/1 17237/17245/1 5662/5670/1 +f 5632/5640/1 5631/5639/1 17238/17246/1 17237/17245/1 +f 4946/4954/1 17233/17241/1 17236/17244/1 4947/4955/1 +f 5663/5671/1 17240/17248/1 17233/17241/1 4946/4954/1 +f 17240/17248/1 17239/17247/1 17234/17242/1 17233/17241/1 +f 17226/17234/1 17229/17237/1 17232/17240/1 17227/17235/1 +f 5667/5675/1 4944/4952/1 17229/17237/1 17226/17234/1 +f 4944/4952/1 4943/4951/1 17230/17238/1 17229/17237/1 +f 5698/5706/1 17225/17233/1 17228/17236/1 5699/5707/1 +f 4939/4947/1 5668/5676/1 17225/17233/1 5698/5706/1 +f 5668/5676/1 5667/5675/1 17226/17234/1 17225/17233/1 +f 4934/4942/1 17221/17229/1 17224/17232/1 4935/4943/1 +f 5699/5707/1 17228/17236/1 17221/17229/1 4934/4942/1 +f 17228/17236/1 17227/17235/1 17222/17230/1 17221/17229/1 +f 17214/17222/1 17217/17225/1 17220/17228/1 17215/17223/1 +f 5703/5711/1 4932/4940/1 17217/17225/1 17214/17222/1 +f 4932/4940/1 4931/4939/1 17218/17226/1 17217/17225/1 +f 5734/5742/1 17213/17221/1 17216/17224/1 5735/5743/1 +f 4927/4935/1 5704/5712/1 17213/17221/1 5734/5742/1 +f 5704/5712/1 5703/5711/1 17214/17222/1 17213/17221/1 +f 4922/4930/1 17209/17217/1 17212/17220/1 4923/4931/1 +f 5735/5743/1 17216/17224/1 17209/17217/1 4922/4930/1 +f 17216/17224/1 17215/17223/1 17210/17218/1 17209/17217/1 +f 17202/17210/1 17205/17213/1 17208/17216/1 17203/17211/1 +f 5739/5747/1 4920/4928/1 17205/17213/1 17202/17210/1 +f 4920/4928/1 4919/4927/1 17206/17214/1 17205/17213/1 +f 5770/5778/1 17201/17209/1 17204/17212/1 5771/5779/1 +f 4915/4923/1 5740/5748/1 17201/17209/1 5770/5778/1 +f 5740/5748/1 5739/5747/1 17202/17210/1 17201/17209/1 +f 4910/4918/1 17197/17205/1 17200/17208/1 4911/4919/1 +f 5771/5779/1 17204/17212/1 17197/17205/1 4910/4918/1 +f 17204/17212/1 17203/17211/1 17198/17206/1 17197/17205/1 +f 17190/17198/1 17193/17201/1 17196/17204/1 17191/17199/1 +f 5775/5783/1 4908/4916/1 17193/17201/1 17190/17198/1 +f 4908/4916/1 4907/4915/1 17194/17202/1 17193/17201/1 +f 5806/5814/1 17189/17197/1 17192/17200/1 5807/5815/1 +f 4903/4911/1 5776/5784/1 17189/17197/1 5806/5814/1 +f 5776/5784/1 5775/5783/1 17190/17198/1 17189/17197/1 +f 4898/4906/1 17185/17193/1 17188/17196/1 4899/4907/1 +f 5807/5815/1 17192/17200/1 17185/17193/1 4898/4906/1 +f 17192/17200/1 17191/17199/1 17186/17194/1 17185/17193/1 +f 17178/17186/1 17181/17189/1 17184/17192/1 17179/17187/1 +f 5811/5819/1 4896/4904/1 17181/17189/1 17178/17186/1 +f 4896/4904/1 4895/4903/1 17182/17190/1 17181/17189/1 +f 5842/5850/1 17177/17185/1 17180/17188/1 5843/5851/1 +f 4891/4899/1 5812/5820/1 17177/17185/1 5842/5850/1 +f 5812/5820/1 5811/5819/1 17178/17186/1 17177/17185/1 +f 4886/4894/1 17173/17181/1 17176/17184/1 4887/4895/1 +f 5843/5851/1 17180/17188/1 17173/17181/1 4886/4894/1 +f 17180/17188/1 17179/17187/1 17174/17182/1 17173/17181/1 +f 17166/17174/1 17169/17177/1 17172/17180/1 17167/17175/1 +f 5847/5855/1 4884/4892/1 17169/17177/1 17166/17174/1 +f 4884/4892/1 4883/4891/1 17170/17178/1 17169/17177/1 +f 5878/5886/1 17165/17173/1 17168/17176/1 5879/5887/1 +f 4879/4887/1 5848/5856/1 17165/17173/1 5878/5886/1 +f 5848/5856/1 5847/5855/1 17166/17174/1 17165/17173/1 +f 4874/4882/1 17161/17169/1 17164/17172/1 4875/4883/1 +f 5879/5887/1 17168/17176/1 17161/17169/1 4874/4882/1 +f 17168/17176/1 17167/17175/1 17162/17170/1 17161/17169/1 +f 17154/17162/1 17157/17165/1 17160/17168/1 17155/17163/1 +f 5883/5891/1 4872/4880/1 17157/17165/1 17154/17162/1 +f 4872/4880/1 4871/4879/1 17158/17166/1 17157/17165/1 +f 5914/5922/1 17153/17161/1 17156/17164/1 5915/5923/1 +f 4867/4875/1 5884/5892/1 17153/17161/1 5914/5922/1 +f 5884/5892/1 5883/5891/1 17154/17162/1 17153/17161/1 +f 4862/4870/1 17149/17157/1 17152/17160/1 4863/4871/1 +f 5915/5923/1 17156/17164/1 17149/17157/1 4862/4870/1 +f 17156/17164/1 17155/17163/1 17150/17158/1 17149/17157/1 +f 17142/17150/1 17145/17153/1 17148/17156/1 17143/17151/1 +f 5919/5927/1 4860/4868/1 17145/17153/1 17142/17150/1 +f 4860/4868/1 4859/4867/1 17146/17154/1 17145/17153/1 +f 5950/5958/1 17141/17149/1 17144/17152/1 5951/5959/1 +f 4855/4863/1 5920/5928/1 17141/17149/1 5950/5958/1 +f 5920/5928/1 5919/5927/1 17142/17150/1 17141/17149/1 +f 4850/4858/1 17137/17145/1 17140/17148/1 4851/4859/1 +f 5951/5959/1 17144/17152/1 17137/17145/1 4850/4858/1 +f 17144/17152/1 17143/17151/1 17138/17146/1 17137/17145/1 +f 17130/17138/1 17133/17141/1 17136/17144/1 17131/17139/1 +f 5955/5963/1 4848/4856/1 17133/17141/1 17130/17138/1 +f 4848/4856/1 4847/4855/1 17134/17142/1 17133/17141/1 +f 5986/5994/1 17129/17137/1 17132/17140/1 5987/5995/1 +f 4843/4851/1 5956/5964/1 17129/17137/1 5986/5994/1 +f 5956/5964/1 5955/5963/1 17130/17138/1 17129/17137/1 +f 4838/4846/1 17125/17133/1 17128/17136/1 4839/4847/1 +f 5987/5995/1 17132/17140/1 17125/17133/1 4838/4846/1 +f 17132/17140/1 17131/17139/1 17126/17134/1 17125/17133/1 +f 17118/17126/1 17121/17129/1 17124/17132/1 17119/17127/1 +f 5991/5999/1 4836/4844/1 17121/17129/1 17118/17126/1 +f 4836/4844/1 4835/4843/1 17122/17130/1 17121/17129/1 +f 6022/6030/1 17117/17125/1 17120/17128/1 6023/6031/1 +f 4831/4839/1 5992/6000/1 17117/17125/1 6022/6030/1 +f 5992/6000/1 5991/5999/1 17118/17126/1 17117/17125/1 +f 4826/4834/1 17113/17121/1 17116/17124/1 4827/4835/1 +f 6023/6031/1 17120/17128/1 17113/17121/1 4826/4834/1 +f 17120/17128/1 17119/17127/1 17114/17122/1 17113/17121/1 +f 17106/17114/1 17109/17117/1 17112/17120/1 17107/17115/1 +f 6027/6035/1 4824/4832/1 17109/17117/1 17106/17114/1 +f 4824/4832/1 4823/4831/1 17110/17118/1 17109/17117/1 +f 6058/6066/1 17105/17113/1 17108/17116/1 6059/6067/1 +f 4819/4827/1 6028/6036/1 17105/17113/1 6058/6066/1 +f 6028/6036/1 6027/6035/1 17106/17114/1 17105/17113/1 +f 4814/4822/1 17101/17109/1 17104/17112/1 4815/4823/1 +f 6059/6067/1 17108/17116/1 17101/17109/1 4814/4822/1 +f 17108/17116/1 17107/17115/1 17102/17110/1 17101/17109/1 +f 17094/17102/1 17097/17105/1 17100/17108/1 17095/17103/1 +f 6063/6071/1 4812/4820/1 17097/17105/1 17094/17102/1 +f 4812/4820/1 4811/4819/1 17098/17106/1 17097/17105/1 +f 6094/6102/1 17093/17101/1 17096/17104/1 6095/6103/1 +f 4807/4815/1 6064/6072/1 17093/17101/1 6094/6102/1 +f 6064/6072/1 6063/6071/1 17094/17102/1 17093/17101/1 +f 4802/4810/1 17089/17097/1 17092/17100/1 4803/4811/1 +f 6095/6103/1 17096/17104/1 17089/17097/1 4802/4810/1 +f 17096/17104/1 17095/17103/1 17090/17098/1 17089/17097/1 +f 17082/17090/1 17085/17093/1 17088/17096/1 17083/17091/1 +f 6099/6107/1 4800/4808/1 17085/17093/1 17082/17090/1 +f 4800/4808/1 4799/4807/1 17086/17094/1 17085/17093/1 +f 6130/6138/1 17081/17089/1 17084/17092/1 6131/6139/1 +f 4795/4803/1 6100/6108/1 17081/17089/1 6130/6138/1 +f 6100/6108/1 6099/6107/1 17082/17090/1 17081/17089/1 +f 4790/4798/1 17077/17085/1 17080/17088/1 4791/4799/1 +f 6131/6139/1 17084/17092/1 17077/17085/1 4790/4798/1 +f 17084/17092/1 17083/17091/1 17078/17086/1 17077/17085/1 +f 17070/17078/1 17073/17081/1 17076/17084/1 17071/17079/1 +f 6135/6143/1 4788/4796/1 17073/17081/1 17070/17078/1 +f 4788/4796/1 4787/4795/1 17074/17082/1 17073/17081/1 +f 6166/6174/1 17069/17077/1 17072/17080/1 6167/6175/1 +f 4783/4791/1 6136/6144/1 17069/17077/1 6166/6174/1 +f 6136/6144/1 6135/6143/1 17070/17078/1 17069/17077/1 +f 4778/4786/1 17065/17073/1 17068/17076/1 4779/4787/1 +f 6167/6175/1 17072/17080/1 17065/17073/1 4778/4786/1 +f 17072/17080/1 17071/17079/1 17066/17074/1 17065/17073/1 +f 17058/17066/1 17061/17069/1 17064/17072/1 17059/17067/1 +f 6171/6179/1 4776/4784/1 17061/17069/1 17058/17066/1 +f 4776/4784/1 4775/4783/1 17062/17070/1 17061/17069/1 +f 6202/6210/1 17057/17065/1 17060/17068/1 6203/6211/1 +f 4771/4779/1 6172/6180/1 17057/17065/1 6202/6210/1 +f 6172/6180/1 6171/6179/1 17058/17066/1 17057/17065/1 +f 4766/4774/1 17053/17061/1 17056/17064/1 4767/4775/1 +f 6203/6211/1 17060/17068/1 17053/17061/1 4766/4774/1 +f 17060/17068/1 17059/17067/1 17054/17062/1 17053/17061/1 +f 17046/17054/1 17049/17057/1 17052/17060/1 17047/17055/1 +f 6207/6215/1 4764/4772/1 17049/17057/1 17046/17054/1 +f 4764/4772/1 4763/4771/1 17050/17058/1 17049/17057/1 +f 6238/6246/1 17045/17053/1 17048/17056/1 6239/6247/1 +f 4759/4767/1 6208/6216/1 17045/17053/1 6238/6246/1 +f 6208/6216/1 6207/6215/1 17046/17054/1 17045/17053/1 +f 4754/4762/1 17041/17049/1 17044/17052/1 4755/4763/1 +f 6239/6247/1 17048/17056/1 17041/17049/1 4754/4762/1 +f 17048/17056/1 17047/17055/1 17042/17050/1 17041/17049/1 +f 17034/17042/1 17037/17045/1 17040/17048/1 17035/17043/1 +f 6243/6251/1 4752/4760/1 17037/17045/1 17034/17042/1 +f 4752/4760/1 4751/4759/1 17038/17046/1 17037/17045/1 +f 6274/6282/1 17033/17041/1 17036/17044/1 6275/6283/1 +f 4747/4755/1 6244/6252/1 17033/17041/1 6274/6282/1 +f 6244/6252/1 6243/6251/1 17034/17042/1 17033/17041/1 +f 4742/4750/1 17029/17037/1 17032/17040/1 4743/4751/1 +f 6275/6283/1 17036/17044/1 17029/17037/1 4742/4750/1 +f 17036/17044/1 17035/17043/1 17030/17038/1 17029/17037/1 +f 17022/17030/1 17025/17033/1 17028/17036/1 17023/17031/1 +f 6279/6287/1 4740/4748/1 17025/17033/1 17022/17030/1 +f 4740/4748/1 4739/4747/1 17026/17034/1 17025/17033/1 +f 6310/6318/1 17021/17029/1 17024/17032/1 6311/6319/1 +f 4735/4743/1 6280/6288/1 17021/17029/1 6310/6318/1 +f 6280/6288/1 6279/6287/1 17022/17030/1 17021/17029/1 +f 4730/4738/1 17017/17025/1 17020/17028/1 4731/4739/1 +f 6311/6319/1 17024/17032/1 17017/17025/1 4730/4738/1 +f 17024/17032/1 17023/17031/1 17018/17026/1 17017/17025/1 +f 17010/17018/1 17013/17021/1 17016/17024/1 17011/17019/1 +f 6315/6323/1 4728/4736/1 17013/17021/1 17010/17018/1 +f 4728/4736/1 4727/4735/1 17014/17022/1 17013/17021/1 +f 6346/6354/1 17009/17017/1 17012/17020/1 6347/6355/1 +f 4723/4731/1 6316/6324/1 17009/17017/1 6346/6354/1 +f 6316/6324/1 6315/6323/1 17010/17018/1 17009/17017/1 +f 4718/4726/1 17005/17013/1 17008/17016/1 4719/4727/1 +f 6347/6355/1 17012/17020/1 17005/17013/1 4718/4726/1 +f 17012/17020/1 17011/17019/1 17006/17014/1 17005/17013/1 +f 16998/17006/1 17001/17009/1 17004/17012/1 16999/17007/1 +f 6351/6359/1 4716/4724/1 17001/17009/1 16998/17006/1 +f 4716/4724/1 4715/4723/1 17002/17010/1 17001/17009/1 +f 6382/6390/1 16997/17005/1 17000/17008/1 6383/6391/1 +f 4711/4719/1 6352/6360/1 16997/17005/1 6382/6390/1 +f 6352/6360/1 6351/6359/1 16998/17006/1 16997/17005/1 +f 4706/4714/1 16993/17001/1 16996/17004/1 4707/4715/1 +f 6383/6391/1 17000/17008/1 16993/17001/1 4706/4714/1 +f 17000/17008/1 16999/17007/1 16994/17002/1 16993/17001/1 +f 16986/16994/1 16989/16997/1 16992/17000/1 16987/16995/1 +f 6387/6395/1 4704/4712/1 16989/16997/1 16986/16994/1 +f 4704/4712/1 4703/4711/1 16990/16998/1 16989/16997/1 +f 6418/6426/1 16985/16993/1 16988/16996/1 6419/6427/1 +f 4699/4707/1 6388/6396/1 16985/16993/1 6418/6426/1 +f 6388/6396/1 6387/6395/1 16986/16994/1 16985/16993/1 +f 4694/4702/1 16981/16989/1 16984/16992/1 4695/4703/1 +f 6419/6427/1 16988/16996/1 16981/16989/1 4694/4702/1 +f 16988/16996/1 16987/16995/1 16982/16990/1 16981/16989/1 +f 16974/16982/1 16977/16985/1 16980/16988/1 16975/16983/1 +f 6423/6431/1 4692/4700/1 16977/16985/1 16974/16982/1 +f 4692/4700/1 4691/4699/1 16978/16986/1 16977/16985/1 +f 6454/6462/1 16973/16981/1 16976/16984/1 6455/6463/1 +f 4687/4695/1 6424/6432/1 16973/16981/1 6454/6462/1 +f 6424/6432/1 6423/6431/1 16974/16982/1 16973/16981/1 +f 4682/4690/1 16969/16977/1 16972/16980/1 4683/4691/1 +f 6455/6463/1 16976/16984/1 16969/16977/1 4682/4690/1 +f 16976/16984/1 16975/16983/1 16970/16978/1 16969/16977/1 +f 16962/16970/1 16965/16973/1 16968/16976/1 16963/16971/1 +f 6459/6467/1 4680/4688/1 16965/16973/1 16962/16970/1 +f 4680/4688/1 4679/4687/1 16966/16974/1 16965/16973/1 +f 6490/6498/1 16961/16969/1 16964/16972/1 6491/6499/1 +f 4675/4683/1 6460/6468/1 16961/16969/1 6490/6498/1 +f 6460/6468/1 6459/6467/1 16962/16970/1 16961/16969/1 +f 4670/4678/1 16957/16965/1 16960/16968/1 4671/4679/1 +f 6491/6499/1 16964/16972/1 16957/16965/1 4670/4678/1 +f 16964/16972/1 16963/16971/1 16958/16966/1 16957/16965/1 +f 16950/16958/1 16953/16961/1 16956/16964/1 16951/16959/1 +f 6495/6503/1 4668/4676/1 16953/16961/1 16950/16958/1 +f 4668/4676/1 4667/4675/1 16954/16962/1 16953/16961/1 +f 6526/6534/1 16949/16957/1 16952/16960/1 6527/6535/1 +f 4663/4671/1 6496/6504/1 16949/16957/1 6526/6534/1 +f 6496/6504/1 6495/6503/1 16950/16958/1 16949/16957/1 +f 4658/4666/1 16945/16953/1 16948/16956/1 4659/4667/1 +f 6527/6535/1 16952/16960/1 16945/16953/1 4658/4666/1 +f 16952/16960/1 16951/16959/1 16946/16954/1 16945/16953/1 +f 16938/16946/1 16941/16949/1 16944/16952/1 16939/16947/1 +f 6531/6539/1 4656/4664/1 16941/16949/1 16938/16946/1 +f 4656/4664/1 4655/4663/1 16942/16950/1 16941/16949/1 +f 6562/6570/1 16937/16945/1 16940/16948/1 6563/6571/1 +f 4651/4659/1 6532/6540/1 16937/16945/1 6562/6570/1 +f 6532/6540/1 6531/6539/1 16938/16946/1 16937/16945/1 +f 4646/4654/1 16933/16941/1 16936/16944/1 4647/4655/1 +f 6563/6571/1 16940/16948/1 16933/16941/1 4646/4654/1 +f 16940/16948/1 16939/16947/1 16934/16942/1 16933/16941/1 +f 16926/16934/1 16929/16937/1 16932/16940/1 16927/16935/1 +f 6567/6575/1 4644/4652/1 16929/16937/1 16926/16934/1 +f 4644/4652/1 4643/4651/1 16930/16938/1 16929/16937/1 +f 6598/6606/1 16925/16933/1 16928/16936/1 6599/6607/1 +f 4639/4647/1 6568/6576/1 16925/16933/1 6598/6606/1 +f 6568/6576/1 6567/6575/1 16926/16934/1 16925/16933/1 +f 4634/4642/1 16921/16929/1 16924/16932/1 4635/4643/1 +f 6599/6607/1 16928/16936/1 16921/16929/1 4634/4642/1 +f 16928/16936/1 16927/16935/1 16922/16930/1 16921/16929/1 +f 16914/16922/1 16917/16925/1 16920/16928/1 16915/16923/1 +f 6603/6611/1 4632/4640/1 16917/16925/1 16914/16922/1 +f 4632/4640/1 4631/4639/1 16918/16926/1 16917/16925/1 +f 6634/6642/1 16913/16921/1 16916/16924/1 6635/6643/1 +f 4627/4635/1 6604/6612/1 16913/16921/1 6634/6642/1 +f 6604/6612/1 6603/6611/1 16914/16922/1 16913/16921/1 +f 4622/4630/1 16909/16917/1 16912/16920/1 4623/4631/1 +f 6635/6643/1 16916/16924/1 16909/16917/1 4622/4630/1 +f 16916/16924/1 16915/16923/1 16910/16918/1 16909/16917/1 +f 16902/16910/1 16905/16913/1 16908/16916/1 16903/16911/1 +f 6639/6647/1 4620/4628/1 16905/16913/1 16902/16910/1 +f 4620/4628/1 4619/4627/1 16906/16914/1 16905/16913/1 +f 6670/6678/1 16901/16909/1 16904/16912/1 6671/6679/1 +f 4615/4623/1 6640/6648/1 16901/16909/1 6670/6678/1 +f 6640/6648/1 6639/6647/1 16902/16910/1 16901/16909/1 +f 4610/4618/1 16897/16905/1 16900/16908/1 4611/4619/1 +f 6671/6679/1 16904/16912/1 16897/16905/1 4610/4618/1 +f 16904/16912/1 16903/16911/1 16898/16906/1 16897/16905/1 +f 16890/16898/1 16893/16901/1 16896/16904/1 16891/16899/1 +f 6675/6683/1 4608/4616/1 16893/16901/1 16890/16898/1 +f 4608/4616/1 4607/4615/1 16894/16902/1 16893/16901/1 +f 6706/6714/1 16889/16897/1 16892/16900/1 6707/6715/1 +f 4603/4611/1 6676/6684/1 16889/16897/1 6706/6714/1 +f 6676/6684/1 6675/6683/1 16890/16898/1 16889/16897/1 +f 4598/4606/1 16885/16893/1 16888/16896/1 4599/4607/1 +f 6707/6715/1 16892/16900/1 16885/16893/1 4598/4606/1 +f 16892/16900/1 16891/16899/1 16886/16894/1 16885/16893/1 +f 16878/16886/1 16881/16889/1 16884/16892/1 16879/16887/1 +f 6711/6719/1 4596/4604/1 16881/16889/1 16878/16886/1 +f 4596/4604/1 4595/4603/1 16882/16890/1 16881/16889/1 +f 6742/6750/1 16877/16885/1 16880/16888/1 6743/6751/1 +f 4591/4599/1 6712/6720/1 16877/16885/1 6742/6750/1 +f 6712/6720/1 6711/6719/1 16878/16886/1 16877/16885/1 +f 4586/4594/1 16873/16881/1 16876/16884/1 4587/4595/1 +f 6743/6751/1 16880/16888/1 16873/16881/1 4586/4594/1 +f 16880/16888/1 16879/16887/1 16874/16882/1 16873/16881/1 +f 16866/16874/1 16869/16877/1 16872/16880/1 16867/16875/1 +f 6747/6755/1 4584/4592/1 16869/16877/1 16866/16874/1 +f 4584/4592/1 4583/4591/1 16870/16878/1 16869/16877/1 +f 6778/6786/1 16865/16873/1 16868/16876/1 6779/6787/1 +f 4579/4587/1 6748/6756/1 16865/16873/1 6778/6786/1 +f 6748/6756/1 6747/6755/1 16866/16874/1 16865/16873/1 +f 4574/4582/1 16861/16869/1 16864/16872/1 4575/4583/1 +f 6779/6787/1 16868/16876/1 16861/16869/1 4574/4582/1 +f 16868/16876/1 16867/16875/1 16862/16870/1 16861/16869/1 +f 16854/16862/1 16857/16865/1 16860/16868/1 16855/16863/1 +f 6783/6791/1 4572/4580/1 16857/16865/1 16854/16862/1 +f 4572/4580/1 4571/4579/1 16858/16866/1 16857/16865/1 +f 6814/6822/1 16853/16861/1 16856/16864/1 6815/6823/1 +f 4567/4575/1 6784/6792/1 16853/16861/1 6814/6822/1 +f 6784/6792/1 6783/6791/1 16854/16862/1 16853/16861/1 +f 4562/4570/1 16849/16857/1 16852/16860/1 4563/4571/1 +f 6815/6823/1 16856/16864/1 16849/16857/1 4562/4570/1 +f 16856/16864/1 16855/16863/1 16850/16858/1 16849/16857/1 +f 16842/16850/1 16845/16853/1 16848/16856/1 16843/16851/1 +f 6819/6827/1 4560/4568/1 16845/16853/1 16842/16850/1 +f 4560/4568/1 4559/4567/1 16846/16854/1 16845/16853/1 +f 6850/6858/1 16841/16849/1 16844/16852/1 6851/6859/1 +f 4555/4563/1 6820/6828/1 16841/16849/1 6850/6858/1 +f 6820/6828/1 6819/6827/1 16842/16850/1 16841/16849/1 +f 4550/4558/1 16837/16845/1 16840/16848/1 4551/4559/1 +f 6851/6859/1 16844/16852/1 16837/16845/1 4550/4558/1 +f 16844/16852/1 16843/16851/1 16838/16846/1 16837/16845/1 +f 16830/16838/1 16833/16841/1 16836/16844/1 16831/16839/1 +f 6855/6863/1 4548/4556/1 16833/16841/1 16830/16838/1 +f 4548/4556/1 4547/4555/1 16834/16842/1 16833/16841/1 +f 6886/6894/1 16829/16837/1 16832/16840/1 6887/6895/1 +f 4543/4551/1 6856/6864/1 16829/16837/1 6886/6894/1 +f 6856/6864/1 6855/6863/1 16830/16838/1 16829/16837/1 +f 4538/4546/1 16825/16833/1 16828/16836/1 4539/4547/1 +f 6887/6895/1 16832/16840/1 16825/16833/1 4538/4546/1 +f 16832/16840/1 16831/16839/1 16826/16834/1 16825/16833/1 +f 16818/16826/1 16821/16829/1 16824/16832/1 16819/16827/1 +f 6891/6899/1 4536/4544/1 16821/16829/1 16818/16826/1 +f 4536/4544/1 4535/4543/1 16822/16830/1 16821/16829/1 +f 6922/6930/1 16817/16825/1 16820/16828/1 6923/6931/1 +f 4531/4539/1 6892/6900/1 16817/16825/1 6922/6930/1 +f 6892/6900/1 6891/6899/1 16818/16826/1 16817/16825/1 +f 4526/4534/1 16813/16821/1 16816/16824/1 4527/4535/1 +f 6923/6931/1 16820/16828/1 16813/16821/1 4526/4534/1 +f 16820/16828/1 16819/16827/1 16814/16822/1 16813/16821/1 +f 16806/16814/1 16809/16817/1 16812/16820/1 16807/16815/1 +f 6927/6935/1 4524/4532/1 16809/16817/1 16806/16814/1 +f 4524/4532/1 4523/4531/1 16810/16818/1 16809/16817/1 +f 6958/6966/1 16805/16813/1 16808/16816/1 6959/6967/1 +f 4519/4527/1 6928/6936/1 16805/16813/1 6958/6966/1 +f 6928/6936/1 6927/6935/1 16806/16814/1 16805/16813/1 +f 4514/4522/1 16801/16809/1 16804/16812/1 4515/4523/1 +f 6959/6967/1 16808/16816/1 16801/16809/1 4514/4522/1 +f 16808/16816/1 16807/16815/1 16802/16810/1 16801/16809/1 +f 16794/16802/1 16797/16805/1 16800/16808/1 16795/16803/1 +f 6963/6971/1 4512/4520/1 16797/16805/1 16794/16802/1 +f 4512/4520/1 4511/4519/1 16798/16806/1 16797/16805/1 +f 6994/7002/1 16793/16801/1 16796/16804/1 6995/7003/1 +f 4507/4515/1 6964/6972/1 16793/16801/1 6994/7002/1 +f 6964/6972/1 6963/6971/1 16794/16802/1 16793/16801/1 +f 4502/4510/1 16789/16797/1 16792/16800/1 4503/4511/1 +f 6995/7003/1 16796/16804/1 16789/16797/1 4502/4510/1 +f 16796/16804/1 16795/16803/1 16790/16798/1 16789/16797/1 +f 16782/16790/1 16785/16793/1 16788/16796/1 16783/16791/1 +f 6999/7007/1 4500/4508/1 16785/16793/1 16782/16790/1 +f 4500/4508/1 4499/4507/1 16786/16794/1 16785/16793/1 +f 7030/7038/1 16781/16789/1 16784/16792/1 7031/7039/1 +f 4495/4503/1 7000/7008/1 16781/16789/1 7030/7038/1 +f 7000/7008/1 6999/7007/1 16782/16790/1 16781/16789/1 +f 4490/4498/1 16777/16785/1 16780/16788/1 4491/4499/1 +f 7031/7039/1 16784/16792/1 16777/16785/1 4490/4498/1 +f 16784/16792/1 16783/16791/1 16778/16786/1 16777/16785/1 +f 16770/16778/1 16773/16781/1 16776/16784/1 16771/16779/1 +f 7035/7043/1 4488/4496/1 16773/16781/1 16770/16778/1 +f 4488/4496/1 4487/4495/1 16774/16782/1 16773/16781/1 +f 7066/7074/1 16769/16777/1 16772/16780/1 7067/7075/1 +f 4483/4491/1 7036/7044/1 16769/16777/1 7066/7074/1 +f 7036/7044/1 7035/7043/1 16770/16778/1 16769/16777/1 +f 4478/4486/1 16765/16773/1 16768/16776/1 4479/4487/1 +f 7067/7075/1 16772/16780/1 16765/16773/1 4478/4486/1 +f 16772/16780/1 16771/16779/1 16766/16774/1 16765/16773/1 +f 16758/16766/1 16761/16769/1 16764/16772/1 16759/16767/1 +f 7071/7079/1 4476/4484/1 16761/16769/1 16758/16766/1 +f 4476/4484/1 4475/4483/1 16762/16770/1 16761/16769/1 +f 7102/7110/1 16757/16765/1 16760/16768/1 7103/7111/1 +f 4471/4479/1 7072/7080/1 16757/16765/1 7102/7110/1 +f 7072/7080/1 7071/7079/1 16758/16766/1 16757/16765/1 +f 4466/4474/1 16753/16761/1 16756/16764/1 4467/4475/1 +f 7103/7111/1 16760/16768/1 16753/16761/1 4466/4474/1 +f 16760/16768/1 16759/16767/1 16754/16762/1 16753/16761/1 +f 16746/16754/1 16749/16757/1 16752/16760/1 16747/16755/1 +f 7107/7115/1 4464/4472/1 16749/16757/1 16746/16754/1 +f 4464/4472/1 4463/4471/1 16750/16758/1 16749/16757/1 +f 7138/7146/1 16745/16753/1 16748/16756/1 7139/7147/1 +f 4459/4467/1 7108/7116/1 16745/16753/1 7138/7146/1 +f 7108/7116/1 7107/7115/1 16746/16754/1 16745/16753/1 +f 4454/4462/1 16741/16749/1 16744/16752/1 4455/4463/1 +f 7139/7147/1 16748/16756/1 16741/16749/1 4454/4462/1 +f 16748/16756/1 16747/16755/1 16742/16750/1 16741/16749/1 +f 16734/16742/1 16737/16745/1 16740/16748/1 16735/16743/1 +f 7143/7151/1 4452/4460/1 16737/16745/1 16734/16742/1 +f 4452/4460/1 4451/4459/1 16738/16746/1 16737/16745/1 +f 7174/7182/1 16733/16741/1 16736/16744/1 7175/7183/1 +f 4447/4455/1 7144/7152/1 16733/16741/1 7174/7182/1 +f 7144/7152/1 7143/7151/1 16734/16742/1 16733/16741/1 +f 4442/4450/1 16729/16737/1 16732/16740/1 4443/4451/1 +f 7175/7183/1 16736/16744/1 16729/16737/1 4442/4450/1 +f 16736/16744/1 16735/16743/1 16730/16738/1 16729/16737/1 +f 16722/16730/1 16725/16733/1 16728/16736/1 16723/16731/1 +f 7179/7187/1 4440/4448/1 16725/16733/1 16722/16730/1 +f 4440/4448/1 4439/4447/1 16726/16734/1 16725/16733/1 +f 7210/7218/1 16721/16729/1 16724/16732/1 7211/7219/1 +f 4435/4443/1 7180/7188/1 16721/16729/1 7210/7218/1 +f 7180/7188/1 7179/7187/1 16722/16730/1 16721/16729/1 +f 4430/4438/1 16717/16725/1 16720/16728/1 4431/4439/1 +f 7211/7219/1 16724/16732/1 16717/16725/1 4430/4438/1 +f 16724/16732/1 16723/16731/1 16718/16726/1 16717/16725/1 +f 16710/16718/1 16713/16721/1 16716/16724/1 16711/16719/1 +f 7215/7223/1 4428/4436/1 16713/16721/1 16710/16718/1 +f 4428/4436/1 4427/4435/1 16714/16722/1 16713/16721/1 +f 7246/7254/1 16709/16717/1 16712/16720/1 7247/7255/1 +f 4423/4431/1 7216/7224/1 16709/16717/1 7246/7254/1 +f 7216/7224/1 7215/7223/1 16710/16718/1 16709/16717/1 +f 4418/4426/1 16705/16713/1 16708/16716/1 4419/4427/1 +f 7247/7255/1 16712/16720/1 16705/16713/1 4418/4426/1 +f 16712/16720/1 16711/16719/1 16706/16714/1 16705/16713/1 +f 16698/16706/1 16701/16709/1 16704/16712/1 16699/16707/1 +f 7251/7259/1 4416/4424/1 16701/16709/1 16698/16706/1 +f 4416/4424/1 4415/4423/1 16702/16710/1 16701/16709/1 +f 7282/7290/1 16697/16705/1 16700/16708/1 7283/7291/1 +f 4411/4419/1 7252/7260/1 16697/16705/1 7282/7290/1 +f 7252/7260/1 7251/7259/1 16698/16706/1 16697/16705/1 +f 4406/4414/1 16693/16701/1 16696/16704/1 4407/4415/1 +f 7283/7291/1 16700/16708/1 16693/16701/1 4406/4414/1 +f 16700/16708/1 16699/16707/1 16694/16702/1 16693/16701/1 +f 16686/16694/1 16689/16697/1 16692/16700/1 16687/16695/1 +f 7287/7295/1 4404/4412/1 16689/16697/1 16686/16694/1 +f 4404/4412/1 4403/4411/1 16690/16698/1 16689/16697/1 +f 7318/7326/1 16685/16693/1 16688/16696/1 7319/7327/1 +f 4399/4407/1 7288/7296/1 16685/16693/1 7318/7326/1 +f 7288/7296/1 7287/7295/1 16686/16694/1 16685/16693/1 +f 4394/4402/1 16681/16689/1 16684/16692/1 4395/4403/1 +f 7319/7327/1 16688/16696/1 16681/16689/1 4394/4402/1 +f 16688/16696/1 16687/16695/1 16682/16690/1 16681/16689/1 +f 16674/16682/1 16677/16685/1 16680/16688/1 16675/16683/1 +f 7323/7331/1 4392/4400/1 16677/16685/1 16674/16682/1 +f 4392/4400/1 4391/4399/1 16678/16686/1 16677/16685/1 +f 7354/7362/1 16673/16681/1 16676/16684/1 7355/7363/1 +f 4387/4395/1 7324/7332/1 16673/16681/1 7354/7362/1 +f 7324/7332/1 7323/7331/1 16674/16682/1 16673/16681/1 +f 4382/4390/1 16669/16677/1 16672/16680/1 4383/4391/1 +f 7355/7363/1 16676/16684/1 16669/16677/1 4382/4390/1 +f 16676/16684/1 16675/16683/1 16670/16678/1 16669/16677/1 +f 16662/16670/1 16665/16673/1 16668/16676/1 16663/16671/1 +f 7359/7367/1 4380/4388/1 16665/16673/1 16662/16670/1 +f 4380/4388/1 4379/4387/1 16666/16674/1 16665/16673/1 +f 7390/7398/1 16661/16669/1 16664/16672/1 7391/7399/1 +f 4375/4383/1 7360/7368/1 16661/16669/1 7390/7398/1 +f 7360/7368/1 7359/7367/1 16662/16670/1 16661/16669/1 +f 4370/4378/1 16657/16665/1 16660/16668/1 4371/4379/1 +f 7391/7399/1 16664/16672/1 16657/16665/1 4370/4378/1 +f 16664/16672/1 16663/16671/1 16658/16666/1 16657/16665/1 +f 16650/16658/1 16653/16661/1 16656/16664/1 16651/16659/1 +f 7395/7403/1 4368/4376/1 16653/16661/1 16650/16658/1 +f 4368/4376/1 4367/4375/1 16654/16662/1 16653/16661/1 +f 7426/7434/1 16649/16657/1 16652/16660/1 7427/7435/1 +f 4363/4371/1 7396/7404/1 16649/16657/1 7426/7434/1 +f 7396/7404/1 7395/7403/1 16650/16658/1 16649/16657/1 +f 4358/4366/1 16645/16653/1 16648/16656/1 4359/4367/1 +f 7427/7435/1 16652/16660/1 16645/16653/1 4358/4366/1 +f 16652/16660/1 16651/16659/1 16646/16654/1 16645/16653/1 +f 16638/16646/1 16641/16649/1 16644/16652/1 16639/16647/1 +f 7431/7439/1 4356/4364/1 16641/16649/1 16638/16646/1 +f 4356/4364/1 4355/4363/1 16642/16650/1 16641/16649/1 +f 7462/7470/1 16637/16645/1 16640/16648/1 7463/7471/1 +f 4351/4359/1 7432/7440/1 16637/16645/1 7462/7470/1 +f 7432/7440/1 7431/7439/1 16638/16646/1 16637/16645/1 +f 4346/4354/1 16633/16641/1 16636/16644/1 4347/4355/1 +f 7463/7471/1 16640/16648/1 16633/16641/1 4346/4354/1 +f 16640/16648/1 16639/16647/1 16634/16642/1 16633/16641/1 +f 16626/16634/1 16629/16637/1 16632/16640/1 16627/16635/1 +f 7467/7475/1 4344/4352/1 16629/16637/1 16626/16634/1 +f 4344/4352/1 4343/4351/1 16630/16638/1 16629/16637/1 +f 7498/7506/1 16625/16633/1 16628/16636/1 7499/7507/1 +f 4339/4347/1 7468/7476/1 16625/16633/1 7498/7506/1 +f 7468/7476/1 7467/7475/1 16626/16634/1 16625/16633/1 +f 4334/4342/1 16621/16629/1 16624/16632/1 4335/4343/1 +f 7499/7507/1 16628/16636/1 16621/16629/1 4334/4342/1 +f 16628/16636/1 16627/16635/1 16622/16630/1 16621/16629/1 +f 16614/16622/1 16617/16625/1 16620/16628/1 16615/16623/1 +f 7503/7511/1 4332/4340/1 16617/16625/1 16614/16622/1 +f 4332/4340/1 4331/4339/1 16618/16626/1 16617/16625/1 +f 7534/7542/1 16613/16621/1 16616/16624/1 7535/7543/1 +f 4327/4335/1 7504/7512/1 16613/16621/1 7534/7542/1 +f 7504/7512/1 7503/7511/1 16614/16622/1 16613/16621/1 +f 4322/4330/1 16609/16617/1 16612/16620/1 4323/4331/1 +f 7535/7543/1 16616/16624/1 16609/16617/1 4322/4330/1 +f 16616/16624/1 16615/16623/1 16610/16618/1 16609/16617/1 +f 16602/16610/1 16605/16613/1 16608/16616/1 16603/16611/1 +f 7539/7547/1 4320/4328/1 16605/16613/1 16602/16610/1 +f 4320/4328/1 4319/4327/1 16606/16614/1 16605/16613/1 +f 7570/7578/1 16601/16609/1 16604/16612/1 7571/7579/1 +f 4315/4323/1 7540/7548/1 16601/16609/1 7570/7578/1 +f 7540/7548/1 7539/7547/1 16602/16610/1 16601/16609/1 +f 4310/4318/1 16597/16605/1 16600/16608/1 4311/4319/1 +f 7571/7579/1 16604/16612/1 16597/16605/1 4310/4318/1 +f 16604/16612/1 16603/16611/1 16598/16606/1 16597/16605/1 +f 16590/16598/1 16593/16601/1 16596/16604/1 16591/16599/1 +f 7575/7583/1 4308/4316/1 16593/16601/1 16590/16598/1 +f 4308/4316/1 4307/4315/1 16594/16602/1 16593/16601/1 +f 7606/7614/1 16589/16597/1 16592/16600/1 7607/7615/1 +f 4303/4311/1 7576/7584/1 16589/16597/1 7606/7614/1 +f 7576/7584/1 7575/7583/1 16590/16598/1 16589/16597/1 +f 4298/4306/1 16585/16593/1 16588/16596/1 4299/4307/1 +f 7607/7615/1 16592/16600/1 16585/16593/1 4298/4306/1 +f 16592/16600/1 16591/16599/1 16586/16594/1 16585/16593/1 +f 16578/16586/1 16581/16589/1 16584/16592/1 16579/16587/1 +f 7611/7619/1 4296/4304/1 16581/16589/1 16578/16586/1 +f 4296/4304/1 4295/4303/1 16582/16590/1 16581/16589/1 +f 7642/7650/1 16577/16585/1 16580/16588/1 7643/7651/1 +f 4291/4299/1 7612/7620/1 16577/16585/1 7642/7650/1 +f 7612/7620/1 7611/7619/1 16578/16586/1 16577/16585/1 +f 4286/4294/1 16573/16581/1 16576/16584/1 4287/4295/1 +f 7643/7651/1 16580/16588/1 16573/16581/1 4286/4294/1 +f 16580/16588/1 16579/16587/1 16574/16582/1 16573/16581/1 +f 16566/16574/1 16569/16577/1 16572/16580/1 16567/16575/1 +f 7647/7655/1 4284/4292/1 16569/16577/1 16566/16574/1 +f 4284/4292/1 4283/4291/1 16570/16578/1 16569/16577/1 +f 7678/7686/1 16565/16573/1 16568/16576/1 7679/7687/1 +f 4279/4287/1 7648/7656/1 16565/16573/1 7678/7686/1 +f 7648/7656/1 7647/7655/1 16566/16574/1 16565/16573/1 +f 4274/4282/1 16561/16569/1 16564/16572/1 4275/4283/1 +f 7679/7687/1 16568/16576/1 16561/16569/1 4274/4282/1 +f 16568/16576/1 16567/16575/1 16562/16570/1 16561/16569/1 +f 16554/16562/1 16557/16565/1 16560/16568/1 16555/16563/1 +f 7683/7691/1 4272/4280/1 16557/16565/1 16554/16562/1 +f 4272/4280/1 4271/4279/1 16558/16566/1 16557/16565/1 +f 7714/7722/1 16553/16561/1 16556/16564/1 7715/7723/1 +f 4267/4275/1 7684/7692/1 16553/16561/1 7714/7722/1 +f 7684/7692/1 7683/7691/1 16554/16562/1 16553/16561/1 +f 4262/4270/1 16549/16557/1 16552/16560/1 4263/4271/1 +f 7715/7723/1 16556/16564/1 16549/16557/1 4262/4270/1 +f 16556/16564/1 16555/16563/1 16550/16558/1 16549/16557/1 +f 16542/16550/1 16545/16553/1 16548/16556/1 16543/16551/1 +f 7719/7727/1 4260/4268/1 16545/16553/1 16542/16550/1 +f 4260/4268/1 4259/4267/1 16546/16554/1 16545/16553/1 +f 7750/7758/1 16541/16549/1 16544/16552/1 7751/7759/1 +f 4255/4263/1 7720/7728/1 16541/16549/1 7750/7758/1 +f 7720/7728/1 7719/7727/1 16542/16550/1 16541/16549/1 +f 4250/4258/1 16537/16545/1 16540/16548/1 4251/4259/1 +f 7751/7759/1 16544/16552/1 16537/16545/1 4250/4258/1 +f 16544/16552/1 16543/16551/1 16538/16546/1 16537/16545/1 +f 16530/16538/1 16533/16541/1 16536/16544/1 16531/16539/1 +f 7755/7763/1 4248/4256/1 16533/16541/1 16530/16538/1 +f 4248/4256/1 4247/4255/1 16534/16542/1 16533/16541/1 +f 7786/7794/1 16529/16537/1 16532/16540/1 7787/7795/1 +f 4243/4251/1 7756/7764/1 16529/16537/1 7786/7794/1 +f 7756/7764/1 7755/7763/1 16530/16538/1 16529/16537/1 +f 4238/4246/1 16525/16533/1 16528/16536/1 4239/4247/1 +f 7787/7795/1 16532/16540/1 16525/16533/1 4238/4246/1 +f 16532/16540/1 16531/16539/1 16526/16534/1 16525/16533/1 +f 16518/16526/1 16521/16529/1 16524/16532/1 16519/16527/1 +f 7791/7799/1 4236/4244/1 16521/16529/1 16518/16526/1 +f 4236/4244/1 4235/4243/1 16522/16530/1 16521/16529/1 +f 7822/7830/1 16517/16525/1 16520/16528/1 7823/7831/1 +f 4231/4239/1 7792/7800/1 16517/16525/1 7822/7830/1 +f 7792/7800/1 7791/7799/1 16518/16526/1 16517/16525/1 +f 4226/4234/1 16513/16521/1 16516/16524/1 4227/4235/1 +f 7823/7831/1 16520/16528/1 16513/16521/1 4226/4234/1 +f 16520/16528/1 16519/16527/1 16514/16522/1 16513/16521/1 +f 16506/16514/1 16509/16517/1 16512/16520/1 16507/16515/1 +f 7827/7835/1 4224/4232/1 16509/16517/1 16506/16514/1 +f 4224/4232/1 4223/4231/1 16510/16518/1 16509/16517/1 +f 7858/7866/1 16505/16513/1 16508/16516/1 7859/7867/1 +f 4219/4227/1 7828/7836/1 16505/16513/1 7858/7866/1 +f 7828/7836/1 7827/7835/1 16506/16514/1 16505/16513/1 +f 4214/4222/1 16501/16509/1 16504/16512/1 4215/4223/1 +f 7859/7867/1 16508/16516/1 16501/16509/1 4214/4222/1 +f 16508/16516/1 16507/16515/1 16502/16510/1 16501/16509/1 +f 16494/16502/1 16497/16505/1 16500/16508/1 16495/16503/1 +f 7863/7871/1 4212/4220/1 16497/16505/1 16494/16502/1 +f 4212/4220/1 4211/4219/1 16498/16506/1 16497/16505/1 +f 7894/7902/1 16493/16501/1 16496/16504/1 7895/7903/1 +f 4207/4215/1 7864/7872/1 16493/16501/1 7894/7902/1 +f 7864/7872/1 7863/7871/1 16494/16502/1 16493/16501/1 +f 4202/4210/1 16489/16497/1 16492/16500/1 4203/4211/1 +f 7895/7903/1 16496/16504/1 16489/16497/1 4202/4210/1 +f 16496/16504/1 16495/16503/1 16490/16498/1 16489/16497/1 +f 16482/16490/1 16485/16493/1 16488/16496/1 16483/16491/1 +f 7899/7907/1 4200/4208/1 16485/16493/1 16482/16490/1 +f 4200/4208/1 4199/4207/1 16486/16494/1 16485/16493/1 +f 7930/7938/1 16481/16489/1 16484/16492/1 7931/7939/1 +f 4195/4203/1 7900/7908/1 16481/16489/1 7930/7938/1 +f 7900/7908/1 7899/7907/1 16482/16490/1 16481/16489/1 +f 4190/4198/1 16477/16485/1 16480/16488/1 4191/4199/1 +f 7931/7939/1 16484/16492/1 16477/16485/1 4190/4198/1 +f 16484/16492/1 16483/16491/1 16478/16486/1 16477/16485/1 +f 16470/16478/1 16473/16481/1 16476/16484/1 16471/16479/1 +f 7935/7943/1 4188/4196/1 16473/16481/1 16470/16478/1 +f 4188/4196/1 4187/4195/1 16474/16482/1 16473/16481/1 +f 7966/7974/1 16469/16477/1 16472/16480/1 7967/7975/1 +f 4183/4191/1 7936/7944/1 16469/16477/1 7966/7974/1 +f 7936/7944/1 7935/7943/1 16470/16478/1 16469/16477/1 +f 4178/4186/1 16465/16473/1 16468/16476/1 4179/4187/1 +f 7967/7975/1 16472/16480/1 16465/16473/1 4178/4186/1 +f 16472/16480/1 16471/16479/1 16466/16474/1 16465/16473/1 +f 16458/16466/1 16461/16469/1 16464/16472/1 16459/16467/1 +f 7971/7979/1 4176/4184/1 16461/16469/1 16458/16466/1 +f 4176/4184/1 4175/4183/1 16462/16470/1 16461/16469/1 +f 8002/8010/1 16457/16465/1 16460/16468/1 8003/8011/1 +f 4171/4179/1 7972/7980/1 16457/16465/1 8002/8010/1 +f 7972/7980/1 7971/7979/1 16458/16466/1 16457/16465/1 +f 4166/4174/1 16453/16461/1 16456/16464/1 4167/4175/1 +f 8003/8011/1 16460/16468/1 16453/16461/1 4166/4174/1 +f 16460/16468/1 16459/16467/1 16454/16462/1 16453/16461/1 +f 16446/16454/1 16449/16457/1 16452/16460/1 16447/16455/1 +f 8007/8015/1 4164/4172/1 16449/16457/1 16446/16454/1 +f 4164/4172/1 4163/4171/1 16450/16458/1 16449/16457/1 +f 8038/8046/1 16445/16453/1 16448/16456/1 8039/8047/1 +f 4159/4167/1 8008/8016/1 16445/16453/1 8038/8046/1 +f 8008/8016/1 8007/8015/1 16446/16454/1 16445/16453/1 +f 4154/4162/1 16441/16449/1 16444/16452/1 4155/4163/1 +f 8039/8047/1 16448/16456/1 16441/16449/1 4154/4162/1 +f 16448/16456/1 16447/16455/1 16442/16450/1 16441/16449/1 +f 16434/16442/1 16437/16445/1 16440/16448/1 16435/16443/1 +f 8043/8051/1 4152/4160/1 16437/16445/1 16434/16442/1 +f 4152/4160/1 4151/4159/1 16438/16446/1 16437/16445/1 +f 8074/8082/1 16433/16441/1 16436/16444/1 8075/8083/1 +f 4147/4155/1 8044/8052/1 16433/16441/1 8074/8082/1 +f 8044/8052/1 8043/8051/1 16434/16442/1 16433/16441/1 +f 4142/4150/1 16429/16437/1 16432/16440/1 4143/4151/1 +f 8075/8083/1 16436/16444/1 16429/16437/1 4142/4150/1 +f 16436/16444/1 16435/16443/1 16430/16438/1 16429/16437/1 +f 16422/16430/1 16425/16433/1 16428/16436/1 16423/16431/1 +f 8079/8087/1 4140/4148/1 16425/16433/1 16422/16430/1 +f 4140/4148/1 4139/4147/1 16426/16434/1 16425/16433/1 +f 8110/8118/1 16421/16429/1 16424/16432/1 8111/8119/1 +f 4135/4143/1 8080/8088/1 16421/16429/1 8110/8118/1 +f 8080/8088/1 8079/8087/1 16422/16430/1 16421/16429/1 +f 4130/4138/1 16417/16425/1 16420/16428/1 4131/4139/1 +f 8111/8119/1 16424/16432/1 16417/16425/1 4130/4138/1 +f 16424/16432/1 16423/16431/1 16418/16426/1 16417/16425/1 +f 16410/16418/1 16413/16421/1 16416/16424/1 16411/16419/1 +f 8115/8123/1 4128/4136/1 16413/16421/1 16410/16418/1 +f 4128/4136/1 4127/4135/1 16414/16422/1 16413/16421/1 +f 8146/8154/1 16409/16417/1 16412/16420/1 8147/8155/1 +f 4123/4131/1 8116/8124/1 16409/16417/1 8146/8154/1 +f 8116/8124/1 8115/8123/1 16410/16418/1 16409/16417/1 +f 4118/4126/1 16405/16413/1 16408/16416/1 4119/4127/1 +f 8147/8155/1 16412/16420/1 16405/16413/1 4118/4126/1 +f 16412/16420/1 16411/16419/1 16406/16414/1 16405/16413/1 +f 16398/16406/1 16401/16409/1 16404/16412/1 16399/16407/1 +f 8151/8159/1 4116/4124/1 16401/16409/1 16398/16406/1 +f 4116/4124/1 4115/4123/1 16402/16410/1 16401/16409/1 +f 8182/8190/1 16397/16405/1 16400/16408/1 8183/8191/1 +f 4111/4119/1 8152/8160/1 16397/16405/1 8182/8190/1 +f 8152/8160/1 8151/8159/1 16398/16406/1 16397/16405/1 +f 4106/4114/1 16393/16401/1 16396/16404/1 4107/4115/1 +f 8183/8191/1 16400/16408/1 16393/16401/1 4106/4114/1 +f 16400/16408/1 16399/16407/1 16394/16402/1 16393/16401/1 +f 16386/16394/1 16389/16397/1 16392/16400/1 16387/16395/1 +f 8187/8195/1 4104/4112/1 16389/16397/1 16386/16394/1 +f 4104/4112/1 4103/4111/1 16390/16398/1 16389/16397/1 +f 8218/8226/1 16385/16393/1 16388/16396/1 8219/8227/1 +f 4099/4107/1 8188/8196/1 16385/16393/1 8218/8226/1 +f 8188/8196/1 8187/8195/1 16386/16394/1 16385/16393/1 +f 4094/4102/1 16381/16389/1 16384/16392/1 4095/4103/1 +f 8219/8227/1 16388/16396/1 16381/16389/1 4094/4102/1 +f 16388/16396/1 16387/16395/1 16382/16390/1 16381/16389/1 +f 16374/16382/1 16377/16385/1 16380/16388/1 16375/16383/1 +f 8223/8231/1 4092/4100/1 16377/16385/1 16374/16382/1 +f 4092/4100/1 4091/4099/1 16378/16386/1 16377/16385/1 +f 8254/8262/1 16373/16381/1 16376/16384/1 8255/8263/1 +f 4087/4095/1 8224/8232/1 16373/16381/1 8254/8262/1 +f 8224/8232/1 8223/8231/1 16374/16382/1 16373/16381/1 +f 4082/4090/1 16369/16377/1 16372/16380/1 4083/4091/1 +f 8255/8263/1 16376/16384/1 16369/16377/1 4082/4090/1 +f 16376/16384/1 16375/16383/1 16370/16378/1 16369/16377/1 +f 16362/16370/1 16365/16373/1 16368/16376/1 16363/16371/1 +f 8259/8267/1 4080/4088/1 16365/16373/1 16362/16370/1 +f 4080/4088/1 4079/4087/1 16366/16374/1 16365/16373/1 +f 8290/8298/1 16361/16369/1 16364/16372/1 8291/8299/1 +f 4075/4083/1 8260/8268/1 16361/16369/1 8290/8298/1 +f 8260/8268/1 8259/8267/1 16362/16370/1 16361/16369/1 +f 4070/4078/1 16357/16365/1 16360/16368/1 4071/4079/1 +f 8291/8299/1 16364/16372/1 16357/16365/1 4070/4078/1 +f 16364/16372/1 16363/16371/1 16358/16366/1 16357/16365/1 +f 16350/16358/1 16353/16361/1 16356/16364/1 16351/16359/1 +f 8295/8303/1 4068/4076/1 16353/16361/1 16350/16358/1 +f 4068/4076/1 4067/4075/1 16354/16362/1 16353/16361/1 +f 8326/8334/1 16349/16357/1 16352/16360/1 8327/8335/1 +f 4063/4071/1 8296/8304/1 16349/16357/1 8326/8334/1 +f 8296/8304/1 8295/8303/1 16350/16358/1 16349/16357/1 +f 4058/4066/1 16345/16353/1 16348/16356/1 4059/4067/1 +f 8327/8335/1 16352/16360/1 16345/16353/1 4058/4066/1 +f 16352/16360/1 16351/16359/1 16346/16354/1 16345/16353/1 +f 16338/16346/1 16341/16349/1 16344/16352/1 16339/16347/1 +f 8331/8339/1 4056/4064/1 16341/16349/1 16338/16346/1 +f 4056/4064/1 4055/4063/1 16342/16350/1 16341/16349/1 +f 8362/8370/1 16337/16345/1 16340/16348/1 8363/8371/1 +f 4051/4059/1 8332/8340/1 16337/16345/1 8362/8370/1 +f 8332/8340/1 8331/8339/1 16338/16346/1 16337/16345/1 +f 4046/4054/1 16333/16341/1 16336/16344/1 4047/4055/1 +f 8363/8371/1 16340/16348/1 16333/16341/1 4046/4054/1 +f 16340/16348/1 16339/16347/1 16334/16342/1 16333/16341/1 +f 16326/16334/1 16329/16337/1 16332/16340/1 16327/16335/1 +f 8367/8375/1 4044/4052/1 16329/16337/1 16326/16334/1 +f 4044/4052/1 4043/4051/1 16330/16338/1 16329/16337/1 +f 8398/8406/1 16325/16333/1 16328/16336/1 8399/8407/1 +f 4039/4047/1 8368/8376/1 16325/16333/1 8398/8406/1 +f 8368/8376/1 8367/8375/1 16326/16334/1 16325/16333/1 +f 4034/4042/1 16321/16329/1 16324/16332/1 4035/4043/1 +f 8399/8407/1 16328/16336/1 16321/16329/1 4034/4042/1 +f 16328/16336/1 16327/16335/1 16322/16330/1 16321/16329/1 +f 16314/16322/1 16317/16325/1 16320/16328/1 16315/16323/1 +f 8403/8411/1 4032/4040/1 16317/16325/1 16314/16322/1 +f 4032/4040/1 4031/4039/1 16318/16326/1 16317/16325/1 +f 8434/8442/1 16313/16321/1 16316/16324/1 8435/8443/1 +f 4027/4035/1 8404/8412/1 16313/16321/1 8434/8442/1 +f 8404/8412/1 8403/8411/1 16314/16322/1 16313/16321/1 +f 4022/4030/1 16309/16317/1 16312/16320/1 4023/4031/1 +f 8435/8443/1 16316/16324/1 16309/16317/1 4022/4030/1 +f 16316/16324/1 16315/16323/1 16310/16318/1 16309/16317/1 +f 16302/16310/1 16305/16313/1 16308/16316/1 16303/16311/1 +f 8439/8447/1 4020/4028/1 16305/16313/1 16302/16310/1 +f 4020/4028/1 4019/4027/1 16306/16314/1 16305/16313/1 +f 8470/8478/1 16301/16309/1 16304/16312/1 8471/8479/1 +f 4015/4023/1 8440/8448/1 16301/16309/1 8470/8478/1 +f 8440/8448/1 8439/8447/1 16302/16310/1 16301/16309/1 +f 4010/4018/1 16297/16305/1 16300/16308/1 4011/4019/1 +f 8471/8479/1 16304/16312/1 16297/16305/1 4010/4018/1 +f 16304/16312/1 16303/16311/1 16298/16306/1 16297/16305/1 +f 16290/16298/1 16293/16301/1 16296/16304/1 16291/16299/1 +f 8475/8483/1 4008/4016/1 16293/16301/1 16290/16298/1 +f 4008/4016/1 4007/4015/1 16294/16302/1 16293/16301/1 +f 8506/8514/1 16289/16297/1 16292/16300/1 8507/8515/1 +f 4003/4011/1 8476/8484/1 16289/16297/1 8506/8514/1 +f 8476/8484/1 8475/8483/1 16290/16298/1 16289/16297/1 +f 3998/4006/1 16285/16293/1 16288/16296/1 3999/4007/1 +f 8507/8515/1 16292/16300/1 16285/16293/1 3998/4006/1 +f 16292/16300/1 16291/16299/1 16286/16294/1 16285/16293/1 +f 16278/16286/1 16281/16289/1 16284/16292/1 16279/16287/1 +f 8511/8519/1 3996/4004/1 16281/16289/1 16278/16286/1 +f 3996/4004/1 3995/4003/1 16282/16290/1 16281/16289/1 +f 8542/8550/1 16277/16285/1 16280/16288/1 8543/8551/1 +f 3991/3999/1 8512/8520/1 16277/16285/1 8542/8550/1 +f 8512/8520/1 8511/8519/1 16278/16286/1 16277/16285/1 +f 3986/3994/1 16273/16281/1 16276/16284/1 3987/3995/1 +f 8543/8551/1 16280/16288/1 16273/16281/1 3986/3994/1 +f 16280/16288/1 16279/16287/1 16274/16282/1 16273/16281/1 +f 16266/16274/1 16269/16277/1 16272/16280/1 16267/16275/1 +f 8547/8555/1 3984/3992/1 16269/16277/1 16266/16274/1 +f 3984/3992/1 3983/3991/1 16270/16278/1 16269/16277/1 +f 8578/8586/1 16265/16273/1 16268/16276/1 8579/8587/1 +f 3979/3987/1 8548/8556/1 16265/16273/1 8578/8586/1 +f 8548/8556/1 8547/8555/1 16266/16274/1 16265/16273/1 +f 3974/3982/1 16261/16269/1 16264/16272/1 3975/3983/1 +f 8579/8587/1 16268/16276/1 16261/16269/1 3974/3982/1 +f 16268/16276/1 16267/16275/1 16262/16270/1 16261/16269/1 +f 16254/16262/1 16257/16265/1 16260/16268/1 16255/16263/1 +f 8583/8591/1 3972/3980/1 16257/16265/1 16254/16262/1 +f 3972/3980/1 3971/3979/1 16258/16266/1 16257/16265/1 +f 8614/8622/1 16253/16261/1 16256/16264/1 8615/8623/1 +f 3967/3975/1 8584/8592/1 16253/16261/1 8614/8622/1 +f 8584/8592/1 8583/8591/1 16254/16262/1 16253/16261/1 +f 3962/3970/1 16249/16257/1 16252/16260/1 3963/3971/1 +f 8615/8623/1 16256/16264/1 16249/16257/1 3962/3970/1 +f 16256/16264/1 16255/16263/1 16250/16258/1 16249/16257/1 +f 16242/16250/1 16245/16253/1 16248/16256/1 16243/16251/1 +f 8619/8627/1 3960/3968/1 16245/16253/1 16242/16250/1 +f 3960/3968/1 3959/3967/1 16246/16254/1 16245/16253/1 +f 8650/8658/1 16241/16249/1 16244/16252/1 8651/8659/1 +f 3955/3963/1 8620/8628/1 16241/16249/1 8650/8658/1 +f 8620/8628/1 8619/8627/1 16242/16250/1 16241/16249/1 +f 3950/3958/1 16237/16245/1 16240/16248/1 3951/3959/1 +f 8651/8659/1 16244/16252/1 16237/16245/1 3950/3958/1 +f 16244/16252/1 16243/16251/1 16238/16246/1 16237/16245/1 +f 16230/16238/1 16233/16241/1 16236/16244/1 16231/16239/1 +f 8655/8663/1 3948/3956/1 16233/16241/1 16230/16238/1 +f 3948/3956/1 3947/3955/1 16234/16242/1 16233/16241/1 +f 8686/8694/1 16229/16237/1 16232/16240/1 8687/8695/1 +f 3943/3951/1 8656/8664/1 16229/16237/1 8686/8694/1 +f 8656/8664/1 8655/8663/1 16230/16238/1 16229/16237/1 +f 3938/3946/1 16225/16233/1 16228/16236/1 3939/3947/1 +f 8687/8695/1 16232/16240/1 16225/16233/1 3938/3946/1 +f 16232/16240/1 16231/16239/1 16226/16234/1 16225/16233/1 +f 16218/16226/1 16221/16229/1 16224/16232/1 16219/16227/1 +f 8691/8699/1 3936/3944/1 16221/16229/1 16218/16226/1 +f 3936/3944/1 3935/3943/1 16222/16230/1 16221/16229/1 +f 8722/8730/1 16217/16225/1 16220/16228/1 8723/8731/1 +f 3931/3939/1 8692/8700/1 16217/16225/1 8722/8730/1 +f 8692/8700/1 8691/8699/1 16218/16226/1 16217/16225/1 +f 3926/3934/1 16213/16221/1 16216/16224/1 3927/3935/1 +f 8723/8731/1 16220/16228/1 16213/16221/1 3926/3934/1 +f 16220/16228/1 16219/16227/1 16214/16222/1 16213/16221/1 +f 16206/16214/1 16209/16217/1 16212/16220/1 16207/16215/1 +f 8727/8735/1 3924/3932/1 16209/16217/1 16206/16214/1 +f 3924/3932/1 3923/3931/1 16210/16218/1 16209/16217/1 +f 8758/8766/1 16205/16213/1 16208/16216/1 8759/8767/1 +f 3919/3927/1 8728/8736/1 16205/16213/1 8758/8766/1 +f 8728/8736/1 8727/8735/1 16206/16214/1 16205/16213/1 +f 3914/3922/1 16201/16209/1 16204/16212/1 3915/3923/1 +f 8759/8767/1 16208/16216/1 16201/16209/1 3914/3922/1 +f 16208/16216/1 16207/16215/1 16202/16210/1 16201/16209/1 +f 16194/16202/1 16197/16205/1 16200/16208/1 16195/16203/1 +f 8763/8771/1 3912/3920/1 16197/16205/1 16194/16202/1 +f 3912/3920/1 3911/3919/1 16198/16206/1 16197/16205/1 +f 8794/8802/1 16193/16201/1 16196/16204/1 8795/8803/1 +f 3907/3915/1 8764/8772/1 16193/16201/1 8794/8802/1 +f 8764/8772/1 8763/8771/1 16194/16202/1 16193/16201/1 +f 3902/3910/1 16189/16197/1 16192/16200/1 3903/3911/1 +f 8795/8803/1 16196/16204/1 16189/16197/1 3902/3910/1 +f 16196/16204/1 16195/16203/1 16190/16198/1 16189/16197/1 +f 16182/16190/1 16185/16193/1 16188/16196/1 16183/16191/1 +f 8799/8807/1 3900/3908/1 16185/16193/1 16182/16190/1 +f 3900/3908/1 3899/3907/1 16186/16194/1 16185/16193/1 +f 8830/8838/1 16181/16189/1 16184/16192/1 8831/8839/1 +f 3895/3903/1 8800/8808/1 16181/16189/1 8830/8838/1 +f 8800/8808/1 8799/8807/1 16182/16190/1 16181/16189/1 +f 3890/3898/1 16177/16185/1 16180/16188/1 3891/3899/1 +f 8831/8839/1 16184/16192/1 16177/16185/1 3890/3898/1 +f 16184/16192/1 16183/16191/1 16178/16186/1 16177/16185/1 +f 16170/16178/1 16173/16181/1 16176/16184/1 16171/16179/1 +f 8835/8843/1 3888/3896/1 16173/16181/1 16170/16178/1 +f 3888/3896/1 3887/3895/1 16174/16182/1 16173/16181/1 +f 8866/8874/1 16169/16177/1 16172/16180/1 8867/8875/1 +f 3883/3891/1 8836/8844/1 16169/16177/1 8866/8874/1 +f 8836/8844/1 8835/8843/1 16170/16178/1 16169/16177/1 +f 3878/3886/1 16165/16173/1 16168/16176/1 3879/3887/1 +f 8867/8875/1 16172/16180/1 16165/16173/1 3878/3886/1 +f 16172/16180/1 16171/16179/1 16166/16174/1 16165/16173/1 +f 16158/16166/1 16161/16169/1 16164/16172/1 16159/16167/1 +f 8871/8879/1 3876/3884/1 16161/16169/1 16158/16166/1 +f 3876/3884/1 3875/3883/1 16162/16170/1 16161/16169/1 +f 8902/8910/1 16157/16165/1 16160/16168/1 8903/8911/1 +f 3871/3879/1 8872/8880/1 16157/16165/1 8902/8910/1 +f 8872/8880/1 8871/8879/1 16158/16166/1 16157/16165/1 +f 3866/3874/1 16153/16161/1 16156/16164/1 3867/3875/1 +f 8903/8911/1 16160/16168/1 16153/16161/1 3866/3874/1 +f 16160/16168/1 16159/16167/1 16154/16162/1 16153/16161/1 +f 16146/16154/1 16149/16157/1 16152/16160/1 16147/16155/1 +f 8907/8915/1 3864/3872/1 16149/16157/1 16146/16154/1 +f 3864/3872/1 3863/3871/1 16150/16158/1 16149/16157/1 +f 8938/8946/1 16145/16153/1 16148/16156/1 8939/8947/1 +f 3859/3867/1 8908/8916/1 16145/16153/1 8938/8946/1 +f 8908/8916/1 8907/8915/1 16146/16154/1 16145/16153/1 +f 3854/3862/1 16141/16149/1 16144/16152/1 3855/3863/1 +f 8939/8947/1 16148/16156/1 16141/16149/1 3854/3862/1 +f 16148/16156/1 16147/16155/1 16142/16150/1 16141/16149/1 +f 16134/16142/1 16137/16145/1 16140/16148/1 16135/16143/1 +f 8943/8951/1 3852/3860/1 16137/16145/1 16134/16142/1 +f 3852/3860/1 3851/3859/1 16138/16146/1 16137/16145/1 +f 8974/8982/1 16133/16141/1 16136/16144/1 8975/8983/1 +f 3847/3855/1 8944/8952/1 16133/16141/1 8974/8982/1 +f 8944/8952/1 8943/8951/1 16134/16142/1 16133/16141/1 +f 3842/3850/1 16129/16137/1 16132/16140/1 3843/3851/1 +f 8975/8983/1 16136/16144/1 16129/16137/1 3842/3850/1 +f 16136/16144/1 16135/16143/1 16130/16138/1 16129/16137/1 +f 16122/16130/1 16125/16133/1 16128/16136/1 16123/16131/1 +f 8979/8987/1 3840/3848/1 16125/16133/1 16122/16130/1 +f 3840/3848/1 3839/3847/1 16126/16134/1 16125/16133/1 +f 9010/9018/1 16121/16129/1 16124/16132/1 9011/9019/1 +f 3835/3843/1 8980/8988/1 16121/16129/1 9010/9018/1 +f 8980/8988/1 8979/8987/1 16122/16130/1 16121/16129/1 +f 3830/3838/1 16117/16125/1 16120/16128/1 3831/3839/1 +f 9011/9019/1 16124/16132/1 16117/16125/1 3830/3838/1 +f 16124/16132/1 16123/16131/1 16118/16126/1 16117/16125/1 +f 16110/16118/1 16113/16121/1 16116/16124/1 16111/16119/1 +f 9015/9023/1 3828/3836/1 16113/16121/1 16110/16118/1 +f 3828/3836/1 3827/3835/1 16114/16122/1 16113/16121/1 +f 9046/9054/1 16109/16117/1 16112/16120/1 9047/9055/1 +f 3823/3831/1 9016/9024/1 16109/16117/1 9046/9054/1 +f 9016/9024/1 9015/9023/1 16110/16118/1 16109/16117/1 +f 3818/3826/1 16105/16113/1 16108/16116/1 3819/3827/1 +f 9047/9055/1 16112/16120/1 16105/16113/1 3818/3826/1 +f 16112/16120/1 16111/16119/1 16106/16114/1 16105/16113/1 +f 16098/16106/1 16101/16109/1 16104/16112/1 16099/16107/1 +f 9051/9059/1 3816/3824/1 16101/16109/1 16098/16106/1 +f 3816/3824/1 3815/3823/1 16102/16110/1 16101/16109/1 +f 9082/9090/1 16097/16105/1 16100/16108/1 9083/9091/1 +f 3811/3819/1 9052/9060/1 16097/16105/1 9082/9090/1 +f 9052/9060/1 9051/9059/1 16098/16106/1 16097/16105/1 +f 3806/3814/1 16093/16101/1 16096/16104/1 3807/3815/1 +f 9083/9091/1 16100/16108/1 16093/16101/1 3806/3814/1 +f 16100/16108/1 16099/16107/1 16094/16102/1 16093/16101/1 +f 16086/16094/1 16089/16097/1 16092/16100/1 16087/16095/1 +f 9087/9095/1 3804/3812/1 16089/16097/1 16086/16094/1 +f 3804/3812/1 3803/3811/1 16090/16098/1 16089/16097/1 +f 9118/9126/1 16085/16093/1 16088/16096/1 9119/9127/1 +f 3799/3807/1 9088/9096/1 16085/16093/1 9118/9126/1 +f 9088/9096/1 9087/9095/1 16086/16094/1 16085/16093/1 +f 3794/3802/1 16081/16089/1 16084/16092/1 3795/3803/1 +f 9119/9127/1 16088/16096/1 16081/16089/1 3794/3802/1 +f 16088/16096/1 16087/16095/1 16082/16090/1 16081/16089/1 +f 16074/16082/1 16077/16085/1 16080/16088/1 16075/16083/1 +f 9123/9131/1 3792/3800/1 16077/16085/1 16074/16082/1 +f 3792/3800/1 3791/3799/1 16078/16086/1 16077/16085/1 +f 9154/9162/1 16073/16081/1 16076/16084/1 9155/9163/1 +f 3787/3795/1 9124/9132/1 16073/16081/1 9154/9162/1 +f 9124/9132/1 9123/9131/1 16074/16082/1 16073/16081/1 +f 3782/3790/1 16069/16077/1 16072/16080/1 3783/3791/1 +f 9155/9163/1 16076/16084/1 16069/16077/1 3782/3790/1 +f 16076/16084/1 16075/16083/1 16070/16078/1 16069/16077/1 +f 16062/16070/1 16065/16073/1 16068/16076/1 16063/16071/1 +f 9159/9167/1 3780/3788/1 16065/16073/1 16062/16070/1 +f 3780/3788/1 3779/3787/1 16066/16074/1 16065/16073/1 +f 9190/9198/1 16061/16069/1 16064/16072/1 9191/9199/1 +f 3775/3783/1 9160/9168/1 16061/16069/1 9190/9198/1 +f 9160/9168/1 9159/9167/1 16062/16070/1 16061/16069/1 +f 3770/3778/1 16057/16065/1 16060/16068/1 3771/3779/1 +f 9191/9199/1 16064/16072/1 16057/16065/1 3770/3778/1 +f 16064/16072/1 16063/16071/1 16058/16066/1 16057/16065/1 +f 16050/16058/1 16053/16061/1 16056/16064/1 16051/16059/1 +f 9195/9203/1 3768/3776/1 16053/16061/1 16050/16058/1 +f 3768/3776/1 3767/3775/1 16054/16062/1 16053/16061/1 +f 9226/9234/1 16049/16057/1 16052/16060/1 9227/9235/1 +f 3763/3771/1 9196/9204/1 16049/16057/1 9226/9234/1 +f 9196/9204/1 9195/9203/1 16050/16058/1 16049/16057/1 +f 3758/3766/1 16045/16053/1 16048/16056/1 3759/3767/1 +f 9227/9235/1 16052/16060/1 16045/16053/1 3758/3766/1 +f 16052/16060/1 16051/16059/1 16046/16054/1 16045/16053/1 +f 16038/16046/1 16041/16049/1 16044/16052/1 16039/16047/1 +f 9231/9239/1 3756/3764/1 16041/16049/1 16038/16046/1 +f 3756/3764/1 3755/3763/1 16042/16050/1 16041/16049/1 +f 9262/9270/1 16037/16045/1 16040/16048/1 9263/9271/1 +f 3751/3759/1 9232/9240/1 16037/16045/1 9262/9270/1 +f 9232/9240/1 9231/9239/1 16038/16046/1 16037/16045/1 +f 3746/3754/1 16033/16041/1 16036/16044/1 3747/3755/1 +f 9263/9271/1 16040/16048/1 16033/16041/1 3746/3754/1 +f 16040/16048/1 16039/16047/1 16034/16042/1 16033/16041/1 +f 16026/16034/1 16029/16037/1 16032/16040/1 16027/16035/1 +f 9267/9275/1 3744/3752/1 16029/16037/1 16026/16034/1 +f 3744/3752/1 3743/3751/1 16030/16038/1 16029/16037/1 +f 9298/9306/1 16025/16033/1 16028/16036/1 9299/9307/1 +f 3739/3747/1 9268/9276/1 16025/16033/1 9298/9306/1 +f 9268/9276/1 9267/9275/1 16026/16034/1 16025/16033/1 +f 3734/3742/1 16021/16029/1 16024/16032/1 3735/3743/1 +f 9299/9307/1 16028/16036/1 16021/16029/1 3734/3742/1 +f 16028/16036/1 16027/16035/1 16022/16030/1 16021/16029/1 +f 16014/16022/1 16017/16025/1 16020/16028/1 16015/16023/1 +f 9303/9311/1 3732/3740/1 16017/16025/1 16014/16022/1 +f 3732/3740/1 3731/3739/1 16018/16026/1 16017/16025/1 +f 9334/9342/1 16013/16021/1 16016/16024/1 9335/9343/1 +f 3727/3735/1 9304/9312/1 16013/16021/1 9334/9342/1 +f 9304/9312/1 9303/9311/1 16014/16022/1 16013/16021/1 +f 3722/3730/1 16009/16017/1 16012/16020/1 3723/3731/1 +f 9335/9343/1 16016/16024/1 16009/16017/1 3722/3730/1 +f 16016/16024/1 16015/16023/1 16010/16018/1 16009/16017/1 +f 16002/16010/1 16005/16013/1 16008/16016/1 16003/16011/1 +f 9339/9347/1 3720/3728/1 16005/16013/1 16002/16010/1 +f 3720/3728/1 3719/3727/1 16006/16014/1 16005/16013/1 +f 9370/9378/1 16001/16009/1 16004/16012/1 9371/9379/1 +f 3715/3723/1 9340/9348/1 16001/16009/1 9370/9378/1 +f 9340/9348/1 9339/9347/1 16002/16010/1 16001/16009/1 +f 3710/3718/1 15997/16005/1 16000/16008/1 3711/3719/1 +f 9371/9379/1 16004/16012/1 15997/16005/1 3710/3718/1 +f 16004/16012/1 16003/16011/1 15998/16006/1 15997/16005/1 +f 15990/15998/1 15993/16001/1 15996/16004/1 15991/15999/1 +f 9375/9383/1 3708/3716/1 15993/16001/1 15990/15998/1 +f 3708/3716/1 3707/3715/1 15994/16002/1 15993/16001/1 +f 9406/9414/1 15989/15997/1 15992/16000/1 9407/9415/1 +f 3703/3711/1 9376/9384/1 15989/15997/1 9406/9414/1 +f 9376/9384/1 9375/9383/1 15990/15998/1 15989/15997/1 +f 3698/3706/1 15985/15993/1 15988/15996/1 3699/3707/1 +f 9407/9415/1 15992/16000/1 15985/15993/1 3698/3706/1 +f 15992/16000/1 15991/15999/1 15986/15994/1 15985/15993/1 +f 15978/15986/1 15981/15989/1 15984/15992/1 15979/15987/1 +f 9411/9419/1 3696/3704/1 15981/15989/1 15978/15986/1 +f 3696/3704/1 3695/3703/1 15982/15990/1 15981/15989/1 +f 9442/9450/1 15977/15985/1 15980/15988/1 9443/9451/1 +f 3691/3699/1 9412/9420/1 15977/15985/1 9442/9450/1 +f 9412/9420/1 9411/9419/1 15978/15986/1 15977/15985/1 +f 3686/3694/1 15973/15981/1 15976/15984/1 3687/3695/1 +f 9443/9451/1 15980/15988/1 15973/15981/1 3686/3694/1 +f 15980/15988/1 15979/15987/1 15974/15982/1 15973/15981/1 +f 15966/15974/1 15969/15977/1 15972/15980/1 15967/15975/1 +f 9447/9455/1 3684/3692/1 15969/15977/1 15966/15974/1 +f 3684/3692/1 3683/3691/1 15970/15978/1 15969/15977/1 +f 9478/9486/1 15965/15973/1 15968/15976/1 9479/9487/1 +f 3679/3687/1 9448/9456/1 15965/15973/1 9478/9486/1 +f 9448/9456/1 9447/9455/1 15966/15974/1 15965/15973/1 +f 3674/3682/1 15961/15969/1 15964/15972/1 3675/3683/1 +f 9479/9487/1 15968/15976/1 15961/15969/1 3674/3682/1 +f 15968/15976/1 15967/15975/1 15962/15970/1 15961/15969/1 +f 15954/15962/1 15957/15965/1 15960/15968/1 15955/15963/1 +f 9483/9491/1 3672/3680/1 15957/15965/1 15954/15962/1 +f 3672/3680/1 3671/3679/1 15958/15966/1 15957/15965/1 +f 9514/9522/1 15953/15961/1 15956/15964/1 9515/9523/1 +f 3667/3675/1 9484/9492/1 15953/15961/1 9514/9522/1 +f 9484/9492/1 9483/9491/1 15954/15962/1 15953/15961/1 +f 3662/3670/1 15949/15957/1 15952/15960/1 3663/3671/1 +f 9515/9523/1 15956/15964/1 15949/15957/1 3662/3670/1 +f 15956/15964/1 15955/15963/1 15950/15958/1 15949/15957/1 +f 15942/15950/1 15945/15953/1 15948/15956/1 15943/15951/1 +f 9519/9527/1 3660/3668/1 15945/15953/1 15942/15950/1 +f 3660/3668/1 3659/3667/1 15946/15954/1 15945/15953/1 +f 9550/9558/1 15941/15949/1 15944/15952/1 9551/9559/1 +f 3655/3663/1 9520/9528/1 15941/15949/1 9550/9558/1 +f 9520/9528/1 9519/9527/1 15942/15950/1 15941/15949/1 +f 3650/3658/1 15937/15945/1 15940/15948/1 3651/3659/1 +f 9551/9559/1 15944/15952/1 15937/15945/1 3650/3658/1 +f 15944/15952/1 15943/15951/1 15938/15946/1 15937/15945/1 +f 15930/15938/1 15933/15941/1 15936/15944/1 15931/15939/1 +f 9555/9563/1 3648/3656/1 15933/15941/1 15930/15938/1 +f 3648/3656/1 3647/3655/1 15934/15942/1 15933/15941/1 +f 9586/9594/1 15929/15937/1 15932/15940/1 9587/9595/1 +f 3643/3651/1 9556/9564/1 15929/15937/1 9586/9594/1 +f 9556/9564/1 9555/9563/1 15930/15938/1 15929/15937/1 +f 3638/3646/1 15925/15933/1 15928/15936/1 3639/3647/1 +f 9587/9595/1 15932/15940/1 15925/15933/1 3638/3646/1 +f 15932/15940/1 15931/15939/1 15926/15934/1 15925/15933/1 +f 15918/15926/1 15921/15929/1 15924/15932/1 15919/15927/1 +f 9591/9599/1 3636/3644/1 15921/15929/1 15918/15926/1 +f 3636/3644/1 3635/3643/1 15922/15930/1 15921/15929/1 +f 9622/9630/1 15917/15925/1 15920/15928/1 9623/9631/1 +f 3631/3639/1 9592/9600/1 15917/15925/1 9622/9630/1 +f 9592/9600/1 9591/9599/1 15918/15926/1 15917/15925/1 +f 3626/3634/1 15913/15921/1 15916/15924/1 3627/3635/1 +f 9623/9631/1 15920/15928/1 15913/15921/1 3626/3634/1 +f 15920/15928/1 15919/15927/1 15914/15922/1 15913/15921/1 +f 15906/15914/1 15909/15917/1 15912/15920/1 15907/15915/1 +f 9627/9635/1 3624/3632/1 15909/15917/1 15906/15914/1 +f 3624/3632/1 3623/3631/1 15910/15918/1 15909/15917/1 +f 9658/9666/1 15905/15913/1 15908/15916/1 9659/9667/1 +f 3619/3627/1 9628/9636/1 15905/15913/1 9658/9666/1 +f 9628/9636/1 9627/9635/1 15906/15914/1 15905/15913/1 +f 3614/3622/1 15901/15909/1 15904/15912/1 3615/3623/1 +f 9659/9667/1 15908/15916/1 15901/15909/1 3614/3622/1 +f 15908/15916/1 15907/15915/1 15902/15910/1 15901/15909/1 +f 15894/15902/1 15897/15905/1 15900/15908/1 15895/15903/1 +f 9663/9671/1 3612/3620/1 15897/15905/1 15894/15902/1 +f 3612/3620/1 3611/3619/1 15898/15906/1 15897/15905/1 +f 9694/9702/1 15893/15901/1 15896/15904/1 9695/9703/1 +f 3607/3615/1 9664/9672/1 15893/15901/1 9694/9702/1 +f 9664/9672/1 9663/9671/1 15894/15902/1 15893/15901/1 +f 3602/3610/1 15889/15897/1 15892/15900/1 3603/3611/1 +f 9695/9703/1 15896/15904/1 15889/15897/1 3602/3610/1 +f 15896/15904/1 15895/15903/1 15890/15898/1 15889/15897/1 +f 15882/15890/1 15885/15893/1 15888/15896/1 15883/15891/1 +f 9699/9707/1 3600/3608/1 15885/15893/1 15882/15890/1 +f 3600/3608/1 3599/3607/1 15886/15894/1 15885/15893/1 +f 9730/9738/1 15881/15889/1 15884/15892/1 9731/9739/1 +f 3595/3603/1 9700/9708/1 15881/15889/1 9730/9738/1 +f 9700/9708/1 9699/9707/1 15882/15890/1 15881/15889/1 +f 3590/3598/1 15877/15885/1 15880/15888/1 3591/3599/1 +f 9731/9739/1 15884/15892/1 15877/15885/1 3590/3598/1 +f 15884/15892/1 15883/15891/1 15878/15886/1 15877/15885/1 +f 15870/15878/1 15873/15881/1 15876/15884/1 15871/15879/1 +f 9735/9743/1 3588/3596/1 15873/15881/1 15870/15878/1 +f 3588/3596/1 3587/3595/1 15874/15882/1 15873/15881/1 +f 9766/9774/1 15869/15877/1 15872/15880/1 9767/9775/1 +f 3583/3591/1 9736/9744/1 15869/15877/1 9766/9774/1 +f 9736/9744/1 9735/9743/1 15870/15878/1 15869/15877/1 +f 3578/3586/1 15865/15873/1 15868/15876/1 3579/3587/1 +f 9767/9775/1 15872/15880/1 15865/15873/1 3578/3586/1 +f 15872/15880/1 15871/15879/1 15866/15874/1 15865/15873/1 +f 15858/15866/1 15861/15869/1 15864/15872/1 15859/15867/1 +f 9771/9779/1 3576/3584/1 15861/15869/1 15858/15866/1 +f 3576/3584/1 3575/3583/1 15862/15870/1 15861/15869/1 +f 9802/9810/1 15857/15865/1 15860/15868/1 9803/9811/1 +f 3571/3579/1 9772/9780/1 15857/15865/1 9802/9810/1 +f 9772/9780/1 9771/9779/1 15858/15866/1 15857/15865/1 +f 3566/3574/1 15853/15861/1 15856/15864/1 3567/3575/1 +f 9803/9811/1 15860/15868/1 15853/15861/1 3566/3574/1 +f 15860/15868/1 15859/15867/1 15854/15862/1 15853/15861/1 +f 15846/15854/1 15849/15857/1 15852/15860/1 15847/15855/1 +f 9807/9815/1 3564/3572/1 15849/15857/1 15846/15854/1 +f 3564/3572/1 3563/3571/1 15850/15858/1 15849/15857/1 +f 9838/9846/1 15845/15853/1 15848/15856/1 9839/9847/1 +f 3559/3567/1 9808/9816/1 15845/15853/1 9838/9846/1 +f 9808/9816/1 9807/9815/1 15846/15854/1 15845/15853/1 +f 3554/3562/1 15841/15849/1 15844/15852/1 3555/3563/1 +f 9839/9847/1 15848/15856/1 15841/15849/1 3554/3562/1 +f 15848/15856/1 15847/15855/1 15842/15850/1 15841/15849/1 +f 15834/15842/1 15837/15845/1 15840/15848/1 15835/15843/1 +f 9843/9851/1 3552/3560/1 15837/15845/1 15834/15842/1 +f 3552/3560/1 3551/3559/1 15838/15846/1 15837/15845/1 +f 9874/9882/1 15833/15841/1 15836/15844/1 9875/9883/1 +f 3547/3555/1 9844/9852/1 15833/15841/1 9874/9882/1 +f 9844/9852/1 9843/9851/1 15834/15842/1 15833/15841/1 +f 3542/3550/1 15829/15837/1 15832/15840/1 3543/3551/1 +f 9875/9883/1 15836/15844/1 15829/15837/1 3542/3550/1 +f 15836/15844/1 15835/15843/1 15830/15838/1 15829/15837/1 +f 15822/15830/1 15825/15833/1 15828/15836/1 15823/15831/1 +f 9879/9887/1 3540/3548/1 15825/15833/1 15822/15830/1 +f 3540/3548/1 3539/3547/1 15826/15834/1 15825/15833/1 +f 9910/9918/1 15821/15829/1 15824/15832/1 9911/9919/1 +f 3535/3543/1 9880/9888/1 15821/15829/1 9910/9918/1 +f 9880/9888/1 9879/9887/1 15822/15830/1 15821/15829/1 +f 3530/3538/1 15817/15825/1 15820/15828/1 3531/3539/1 +f 9911/9919/1 15824/15832/1 15817/15825/1 3530/3538/1 +f 15824/15832/1 15823/15831/1 15818/15826/1 15817/15825/1 +f 15810/15818/1 15813/15821/1 15816/15824/1 15811/15819/1 +f 9915/9923/1 3528/3536/1 15813/15821/1 15810/15818/1 +f 3528/3536/1 3527/3535/1 15814/15822/1 15813/15821/1 +f 9946/9954/1 15809/15817/1 15812/15820/1 9947/9955/1 +f 3523/3531/1 9916/9924/1 15809/15817/1 9946/9954/1 +f 9916/9924/1 9915/9923/1 15810/15818/1 15809/15817/1 +f 3518/3526/1 15805/15813/1 15808/15816/1 3519/3527/1 +f 9947/9955/1 15812/15820/1 15805/15813/1 3518/3526/1 +f 15812/15820/1 15811/15819/1 15806/15814/1 15805/15813/1 +f 15798/15806/1 15801/15809/1 15804/15812/1 15799/15807/1 +f 9951/9959/1 3516/3524/1 15801/15809/1 15798/15806/1 +f 3516/3524/1 3515/3523/1 15802/15810/1 15801/15809/1 +f 9982/9990/1 15797/15805/1 15800/15808/1 9983/9991/1 +f 3511/3519/1 9952/9960/1 15797/15805/1 9982/9990/1 +f 9952/9960/1 9951/9959/1 15798/15806/1 15797/15805/1 +f 3506/3514/1 15793/15801/1 15796/15804/1 3507/3515/1 +f 9983/9991/1 15800/15808/1 15793/15801/1 3506/3514/1 +f 15800/15808/1 15799/15807/1 15794/15802/1 15793/15801/1 +f 15786/15794/1 15789/15797/1 15792/15800/1 15787/15795/1 +f 9987/9995/1 3504/3512/1 15789/15797/1 15786/15794/1 +f 3504/3512/1 3503/3511/1 15790/15798/1 15789/15797/1 +f 10018/10026/1 15785/15793/1 15788/15796/1 10019/10027/1 +f 3499/3507/1 9988/9996/1 15785/15793/1 10018/10026/1 +f 9988/9996/1 9987/9995/1 15786/15794/1 15785/15793/1 +f 3494/3502/1 15781/15789/1 15784/15792/1 3495/3503/1 +f 10019/10027/1 15788/15796/1 15781/15789/1 3494/3502/1 +f 15788/15796/1 15787/15795/1 15782/15790/1 15781/15789/1 +f 15774/15782/1 15777/15785/1 15780/15788/1 15775/15783/1 +f 10023/10031/1 3492/3500/1 15777/15785/1 15774/15782/1 +f 3492/3500/1 3491/3499/1 15778/15786/1 15777/15785/1 +f 10054/10062/1 15773/15781/1 15776/15784/1 10055/10063/1 +f 3487/3495/1 10024/10032/1 15773/15781/1 10054/10062/1 +f 10024/10032/1 10023/10031/1 15774/15782/1 15773/15781/1 +f 3482/3490/1 15769/15777/1 15772/15780/1 3483/3491/1 +f 10055/10063/1 15776/15784/1 15769/15777/1 3482/3490/1 +f 15776/15784/1 15775/15783/1 15770/15778/1 15769/15777/1 +f 15762/15770/1 15765/15773/1 15768/15776/1 15763/15771/1 +f 10059/10067/1 3480/3488/1 15765/15773/1 15762/15770/1 +f 3480/3488/1 3479/3487/1 15766/15774/1 15765/15773/1 +f 10090/10098/1 15761/15769/1 15764/15772/1 10091/10099/1 +f 3475/3483/1 10060/10068/1 15761/15769/1 10090/10098/1 +f 10060/10068/1 10059/10067/1 15762/15770/1 15761/15769/1 +f 3470/3478/1 15757/15765/1 15760/15768/1 3471/3479/1 +f 10091/10099/1 15764/15772/1 15757/15765/1 3470/3478/1 +f 15764/15772/1 15763/15771/1 15758/15766/1 15757/15765/1 +f 15750/15758/1 15753/15761/1 15756/15764/1 15751/15759/1 +f 10095/10103/1 3468/3476/1 15753/15761/1 15750/15758/1 +f 3468/3476/1 3467/3475/1 15754/15762/1 15753/15761/1 +f 10126/10134/1 15749/15757/1 15752/15760/1 10127/10135/1 +f 3463/3471/1 10096/10104/1 15749/15757/1 10126/10134/1 +f 10096/10104/1 10095/10103/1 15750/15758/1 15749/15757/1 +f 3458/3466/1 15745/15753/1 15748/15756/1 3459/3467/1 +f 10127/10135/1 15752/15760/1 15745/15753/1 3458/3466/1 +f 15752/15760/1 15751/15759/1 15746/15754/1 15745/15753/1 +f 15738/15746/1 15741/15749/1 15744/15752/1 15739/15747/1 +f 10131/10139/1 3456/3464/1 15741/15749/1 15738/15746/1 +f 3456/3464/1 3455/3463/1 15742/15750/1 15741/15749/1 +f 10162/10170/1 15737/15745/1 15740/15748/1 10163/10171/1 +f 3451/3459/1 10132/10140/1 15737/15745/1 10162/10170/1 +f 10132/10140/1 10131/10139/1 15738/15746/1 15737/15745/1 +f 3446/3454/1 15733/15741/1 15736/15744/1 3447/3455/1 +f 10163/10171/1 15740/15748/1 15733/15741/1 3446/3454/1 +f 15740/15748/1 15739/15747/1 15734/15742/1 15733/15741/1 +f 15726/15734/1 15729/15737/1 15732/15740/1 15727/15735/1 +f 10167/10175/1 3444/3452/1 15729/15737/1 15726/15734/1 +f 3444/3452/1 3443/3451/1 15730/15738/1 15729/15737/1 +f 10198/10206/1 15725/15733/1 15728/15736/1 10199/10207/1 +f 3439/3447/1 10168/10176/1 15725/15733/1 10198/10206/1 +f 10168/10176/1 10167/10175/1 15726/15734/1 15725/15733/1 +f 3434/3442/1 15721/15729/1 15724/15732/1 3435/3443/1 +f 10199/10207/1 15728/15736/1 15721/15729/1 3434/3442/1 +f 15728/15736/1 15727/15735/1 15722/15730/1 15721/15729/1 +f 15714/15722/1 15717/15725/1 15720/15728/1 15715/15723/1 +f 10203/10211/1 3432/3440/1 15717/15725/1 15714/15722/1 +f 3432/3440/1 3431/3439/1 15718/15726/1 15717/15725/1 +f 10234/10242/1 15713/15721/1 15716/15724/1 10235/10243/1 +f 3427/3435/1 10204/10212/1 15713/15721/1 10234/10242/1 +f 10204/10212/1 10203/10211/1 15714/15722/1 15713/15721/1 +f 3422/3430/1 15709/15717/1 15712/15720/1 3423/3431/1 +f 10235/10243/1 15716/15724/1 15709/15717/1 3422/3430/1 +f 15716/15724/1 15715/15723/1 15710/15718/1 15709/15717/1 +f 15702/15710/1 15705/15713/1 15708/15716/1 15703/15711/1 +f 10239/10247/1 3420/3428/1 15705/15713/1 15702/15710/1 +f 3420/3428/1 3419/3427/1 15706/15714/1 15705/15713/1 +f 10270/10278/1 15701/15709/1 15704/15712/1 10271/10279/1 +f 3415/3423/1 10240/10248/1 15701/15709/1 10270/10278/1 +f 10240/10248/1 10239/10247/1 15702/15710/1 15701/15709/1 +f 3410/3418/1 15697/15705/1 15700/15708/1 3411/3419/1 +f 10271/10279/1 15704/15712/1 15697/15705/1 3410/3418/1 +f 15704/15712/1 15703/15711/1 15698/15706/1 15697/15705/1 +f 15690/15698/1 15693/15701/1 15696/15704/1 15691/15699/1 +f 10275/10283/1 3408/3416/1 15693/15701/1 15690/15698/1 +f 3408/3416/1 3407/3415/1 15694/15702/1 15693/15701/1 +f 10306/10314/1 15689/15697/1 15692/15700/1 10307/10315/1 +f 3403/3411/1 10276/10284/1 15689/15697/1 10306/10314/1 +f 10276/10284/1 10275/10283/1 15690/15698/1 15689/15697/1 +f 3398/3406/1 15685/15693/1 15688/15696/1 3399/3407/1 +f 10307/10315/1 15692/15700/1 15685/15693/1 3398/3406/1 +f 15692/15700/1 15691/15699/1 15686/15694/1 15685/15693/1 +f 15678/15686/1 15681/15689/1 15684/15692/1 15679/15687/1 +f 10311/10319/1 3396/3404/1 15681/15689/1 15678/15686/1 +f 3396/3404/1 3395/3403/1 15682/15690/1 15681/15689/1 +f 10342/10350/1 15677/15685/1 15680/15688/1 10343/10351/1 +f 3391/3399/1 10312/10320/1 15677/15685/1 10342/10350/1 +f 10312/10320/1 10311/10319/1 15678/15686/1 15677/15685/1 +f 3386/3394/1 15673/15681/1 15676/15684/1 3387/3395/1 +f 10343/10351/1 15680/15688/1 15673/15681/1 3386/3394/1 +f 15680/15688/1 15679/15687/1 15674/15682/1 15673/15681/1 +f 15666/15674/1 15669/15677/1 15672/15680/1 15667/15675/1 +f 10347/10355/1 3384/3392/1 15669/15677/1 15666/15674/1 +f 3384/3392/1 3383/3391/1 15670/15678/1 15669/15677/1 +f 10378/10386/1 15665/15673/1 15668/15676/1 10379/10387/1 +f 3379/3387/1 10348/10356/1 15665/15673/1 10378/10386/1 +f 10348/10356/1 10347/10355/1 15666/15674/1 15665/15673/1 +f 3374/3382/1 15661/15669/1 15664/15672/1 3375/3383/1 +f 10379/10387/1 15668/15676/1 15661/15669/1 3374/3382/1 +f 15668/15676/1 15667/15675/1 15662/15670/1 15661/15669/1 +f 15654/15662/1 15657/15665/1 15660/15668/1 15655/15663/1 +f 10383/10391/1 3372/3380/1 15657/15665/1 15654/15662/1 +f 3372/3380/1 3371/3379/1 15658/15666/1 15657/15665/1 +f 10414/10422/1 15653/15661/1 15656/15664/1 10415/10423/1 +f 3367/3375/1 10384/10392/1 15653/15661/1 10414/10422/1 +f 10384/10392/1 10383/10391/1 15654/15662/1 15653/15661/1 +f 3362/3370/1 15649/15657/1 15652/15660/1 3363/3371/1 +f 10415/10423/1 15656/15664/1 15649/15657/1 3362/3370/1 +f 15656/15664/1 15655/15663/1 15650/15658/1 15649/15657/1 +f 15642/15650/1 15645/15653/1 15648/15656/1 15643/15651/1 +f 10419/10427/1 3360/3368/1 15645/15653/1 15642/15650/1 +f 3360/3368/1 3359/3367/1 15646/15654/1 15645/15653/1 +f 10450/10458/1 15641/15649/1 15644/15652/1 10451/10459/1 +f 3355/3363/1 10420/10428/1 15641/15649/1 10450/10458/1 +f 10420/10428/1 10419/10427/1 15642/15650/1 15641/15649/1 +f 3350/3358/1 15637/15645/1 15640/15648/1 3351/3359/1 +f 10451/10459/1 15644/15652/1 15637/15645/1 3350/3358/1 +f 15644/15652/1 15643/15651/1 15638/15646/1 15637/15645/1 +f 15630/15638/1 15633/15641/1 15636/15644/1 15631/15639/1 +f 10455/10463/1 3348/3356/1 15633/15641/1 15630/15638/1 +f 3348/3356/1 3347/3355/1 15634/15642/1 15633/15641/1 +f 10486/10494/1 15629/15637/1 15632/15640/1 10487/10495/1 +f 3343/3351/1 10456/10464/1 15629/15637/1 10486/10494/1 +f 10456/10464/1 10455/10463/1 15630/15638/1 15629/15637/1 +f 3338/3346/1 15625/15633/1 15628/15636/1 3339/3347/1 +f 10487/10495/1 15632/15640/1 15625/15633/1 3338/3346/1 +f 15632/15640/1 15631/15639/1 15626/15634/1 15625/15633/1 +f 15618/15626/1 15621/15629/1 15624/15632/1 15619/15627/1 +f 10491/10499/1 3336/3344/1 15621/15629/1 15618/15626/1 +f 3336/3344/1 3335/3343/1 15622/15630/1 15621/15629/1 +f 10522/10530/1 15617/15625/1 15620/15628/1 10523/10531/1 +f 3331/3339/1 10492/10500/1 15617/15625/1 10522/10530/1 +f 10492/10500/1 10491/10499/1 15618/15626/1 15617/15625/1 +f 3326/3334/1 15613/15621/1 15616/15624/1 3327/3335/1 +f 10523/10531/1 15620/15628/1 15613/15621/1 3326/3334/1 +f 15620/15628/1 15619/15627/1 15614/15622/1 15613/15621/1 +f 15606/15614/1 15609/15617/1 15612/15620/1 15607/15615/1 +f 10527/10535/1 3324/3332/1 15609/15617/1 15606/15614/1 +f 3324/3332/1 3323/3331/1 15610/15618/1 15609/15617/1 +f 10558/10566/1 15605/15613/1 15608/15616/1 10559/10567/1 +f 3319/3327/1 10528/10536/1 15605/15613/1 10558/10566/1 +f 10528/10536/1 10527/10535/1 15606/15614/1 15605/15613/1 +f 3314/3322/1 15601/15609/1 15604/15612/1 3315/3323/1 +f 10559/10567/1 15608/15616/1 15601/15609/1 3314/3322/1 +f 15608/15616/1 15607/15615/1 15602/15610/1 15601/15609/1 +f 15594/15602/1 15597/15605/1 15600/15608/1 15595/15603/1 +f 10563/10571/1 3312/3320/1 15597/15605/1 15594/15602/1 +f 3312/3320/1 3311/3319/1 15598/15606/1 15597/15605/1 +f 10594/10602/1 15593/15601/1 15596/15604/1 10595/10603/1 +f 3307/3315/1 10564/10572/1 15593/15601/1 10594/10602/1 +f 10564/10572/1 10563/10571/1 15594/15602/1 15593/15601/1 +f 3302/3310/1 15589/15597/1 15592/15600/1 3303/3311/1 +f 10595/10603/1 15596/15604/1 15589/15597/1 3302/3310/1 +f 15596/15604/1 15595/15603/1 15590/15598/1 15589/15597/1 +f 15582/15590/1 15585/15593/1 15588/15596/1 15583/15591/1 +f 10599/10607/1 3300/3308/1 15585/15593/1 15582/15590/1 +f 3300/3308/1 3299/3307/1 15586/15594/1 15585/15593/1 +f 10630/10638/1 15581/15589/1 15584/15592/1 10631/10639/1 +f 3295/3303/1 10600/10608/1 15581/15589/1 10630/10638/1 +f 10600/10608/1 10599/10607/1 15582/15590/1 15581/15589/1 +f 3290/3298/1 15577/15585/1 15580/15588/1 3291/3299/1 +f 10631/10639/1 15584/15592/1 15577/15585/1 3290/3298/1 +f 15584/15592/1 15583/15591/1 15578/15586/1 15577/15585/1 +f 15570/15578/1 15573/15581/1 15576/15584/1 15571/15579/1 +f 10635/10643/1 3288/3296/1 15573/15581/1 15570/15578/1 +f 3288/3296/1 3287/3295/1 15574/15582/1 15573/15581/1 +f 10666/10674/1 15569/15577/1 15572/15580/1 10667/10675/1 +f 3283/3291/1 10636/10644/1 15569/15577/1 10666/10674/1 +f 10636/10644/1 10635/10643/1 15570/15578/1 15569/15577/1 +f 3278/3286/1 15565/15573/1 15568/15576/1 3279/3287/1 +f 10667/10675/1 15572/15580/1 15565/15573/1 3278/3286/1 +f 15572/15580/1 15571/15579/1 15566/15574/1 15565/15573/1 +f 15558/15566/1 15561/15569/1 15564/15572/1 15559/15567/1 +f 10671/10679/1 3276/3284/1 15561/15569/1 15558/15566/1 +f 3276/3284/1 3275/3283/1 15562/15570/1 15561/15569/1 +f 10702/10710/1 15557/15565/1 15560/15568/1 10703/10711/1 +f 3271/3279/1 10672/10680/1 15557/15565/1 10702/10710/1 +f 10672/10680/1 10671/10679/1 15558/15566/1 15557/15565/1 +f 3266/3274/1 15553/15561/1 15556/15564/1 3267/3275/1 +f 10703/10711/1 15560/15568/1 15553/15561/1 3266/3274/1 +f 15560/15568/1 15559/15567/1 15554/15562/1 15553/15561/1 +f 15546/15554/1 15549/15557/1 15552/15560/1 15547/15555/1 +f 10707/10715/1 3264/3272/1 15549/15557/1 15546/15554/1 +f 3264/3272/1 3263/3271/1 15550/15558/1 15549/15557/1 +f 10738/10746/1 15545/15553/1 15548/15556/1 10739/10747/1 +f 3259/3267/1 10708/10716/1 15545/15553/1 10738/10746/1 +f 10708/10716/1 10707/10715/1 15546/15554/1 15545/15553/1 +f 3254/3262/1 15541/15549/1 15544/15552/1 3255/3263/1 +f 10739/10747/1 15548/15556/1 15541/15549/1 3254/3262/1 +f 15548/15556/1 15547/15555/1 15542/15550/1 15541/15549/1 +f 15534/15542/1 15537/15545/1 15540/15548/1 15535/15543/1 +f 10743/10751/1 3252/3260/1 15537/15545/1 15534/15542/1 +f 3252/3260/1 3251/3259/1 15538/15546/1 15537/15545/1 +f 10774/10782/1 15533/15541/1 15536/15544/1 10775/10783/1 +f 3247/3255/1 10744/10752/1 15533/15541/1 10774/10782/1 +f 10744/10752/1 10743/10751/1 15534/15542/1 15533/15541/1 +f 3242/3250/1 15529/15537/1 15532/15540/1 3243/3251/1 +f 10775/10783/1 15536/15544/1 15529/15537/1 3242/3250/1 +f 15536/15544/1 15535/15543/1 15530/15538/1 15529/15537/1 +f 15522/15530/1 15525/15533/1 15528/15536/1 15523/15531/1 +f 10779/10787/1 3240/3248/1 15525/15533/1 15522/15530/1 +f 3240/3248/1 3239/3247/1 15526/15534/1 15525/15533/1 +f 10810/10818/1 15521/15529/1 15524/15532/1 10811/10819/1 +f 3235/3243/1 10780/10788/1 15521/15529/1 10810/10818/1 +f 10780/10788/1 10779/10787/1 15522/15530/1 15521/15529/1 +f 3230/3238/1 15517/15525/1 15520/15528/1 3231/3239/1 +f 10811/10819/1 15524/15532/1 15517/15525/1 3230/3238/1 +f 15524/15532/1 15523/15531/1 15518/15526/1 15517/15525/1 +f 15510/15518/1 15513/15521/1 15516/15524/1 15511/15519/1 +f 10815/10823/1 3228/3236/1 15513/15521/1 15510/15518/1 +f 3228/3236/1 3227/3235/1 15514/15522/1 15513/15521/1 +f 10846/10854/1 15509/15517/1 15512/15520/1 10847/10855/1 +f 3223/3231/1 10816/10824/1 15509/15517/1 10846/10854/1 +f 10816/10824/1 10815/10823/1 15510/15518/1 15509/15517/1 +f 3218/3226/1 15505/15513/1 15508/15516/1 3219/3227/1 +f 10847/10855/1 15512/15520/1 15505/15513/1 3218/3226/1 +f 15512/15520/1 15511/15519/1 15506/15514/1 15505/15513/1 +f 15498/15506/1 15501/15509/1 15504/15512/1 15499/15507/1 +f 10851/10859/1 3216/3224/1 15501/15509/1 15498/15506/1 +f 3216/3224/1 3215/3223/1 15502/15510/1 15501/15509/1 +f 10882/10890/1 15497/15505/1 15500/15508/1 10883/10891/1 +f 3211/3219/1 10852/10860/1 15497/15505/1 10882/10890/1 +f 10852/10860/1 10851/10859/1 15498/15506/1 15497/15505/1 +f 3206/3214/1 15493/15501/1 15496/15504/1 3207/3215/1 +f 10883/10891/1 15500/15508/1 15493/15501/1 3206/3214/1 +f 15500/15508/1 15499/15507/1 15494/15502/1 15493/15501/1 +f 15486/15494/1 15489/15497/1 15492/15500/1 15487/15495/1 +f 10887/10895/1 3204/3212/1 15489/15497/1 15486/15494/1 +f 3204/3212/1 3203/3211/1 15490/15498/1 15489/15497/1 +f 10918/10926/1 15485/15493/1 15488/15496/1 10919/10927/1 +f 3199/3207/1 10888/10896/1 15485/15493/1 10918/10926/1 +f 10888/10896/1 10887/10895/1 15486/15494/1 15485/15493/1 +f 3194/3202/1 15481/15489/1 15484/15492/1 3195/3203/1 +f 10919/10927/1 15488/15496/1 15481/15489/1 3194/3202/1 +f 15488/15496/1 15487/15495/1 15482/15490/1 15481/15489/1 +f 15474/15482/1 15477/15485/1 15480/15488/1 15475/15483/1 +f 10923/10931/1 3192/3200/1 15477/15485/1 15474/15482/1 +f 3192/3200/1 3191/3199/1 15478/15486/1 15477/15485/1 +f 10954/10962/1 15473/15481/1 15476/15484/1 10955/10963/1 +f 3187/3195/1 10924/10932/1 15473/15481/1 10954/10962/1 +f 10924/10932/1 10923/10931/1 15474/15482/1 15473/15481/1 +f 3182/3190/1 15469/15477/1 15472/15480/1 3183/3191/1 +f 10955/10963/1 15476/15484/1 15469/15477/1 3182/3190/1 +f 15476/15484/1 15475/15483/1 15470/15478/1 15469/15477/1 +f 15462/15470/1 15465/15473/1 15468/15476/1 15463/15471/1 +f 10959/10967/1 3180/3188/1 15465/15473/1 15462/15470/1 +f 3180/3188/1 3179/3187/1 15466/15474/1 15465/15473/1 +f 10990/10998/1 15461/15469/1 15464/15472/1 10991/10999/1 +f 3175/3183/1 10960/10968/1 15461/15469/1 10990/10998/1 +f 10960/10968/1 10959/10967/1 15462/15470/1 15461/15469/1 +f 3170/3178/1 15457/15465/1 15460/15468/1 3171/3179/1 +f 10991/10999/1 15464/15472/1 15457/15465/1 3170/3178/1 +f 15464/15472/1 15463/15471/1 15458/15466/1 15457/15465/1 +f 15450/15458/1 15453/15461/1 15456/15464/1 15451/15459/1 +f 10995/11003/1 3168/3176/1 15453/15461/1 15450/15458/1 +f 3168/3176/1 3167/3175/1 15454/15462/1 15453/15461/1 +f 11026/11034/1 15449/15457/1 15452/15460/1 11027/11035/1 +f 3163/3171/1 10996/11004/1 15449/15457/1 11026/11034/1 +f 10996/11004/1 10995/11003/1 15450/15458/1 15449/15457/1 +f 3158/3166/1 15445/15453/1 15448/15456/1 3159/3167/1 +f 11027/11035/1 15452/15460/1 15445/15453/1 3158/3166/1 +f 15452/15460/1 15451/15459/1 15446/15454/1 15445/15453/1 +f 15438/15446/1 15441/15449/1 15444/15452/1 15439/15447/1 +f 11031/11039/1 3156/3164/1 15441/15449/1 15438/15446/1 +f 3156/3164/1 3155/3163/1 15442/15450/1 15441/15449/1 +f 11062/11070/1 15437/15445/1 15440/15448/1 11063/11071/1 +f 3151/3159/1 11032/11040/1 15437/15445/1 11062/11070/1 +f 11032/11040/1 11031/11039/1 15438/15446/1 15437/15445/1 +f 3146/3154/1 15433/15441/1 15436/15444/1 3147/3155/1 +f 11063/11071/1 15440/15448/1 15433/15441/1 3146/3154/1 +f 15440/15448/1 15439/15447/1 15434/15442/1 15433/15441/1 +f 15426/15434/1 15429/15437/1 15432/15440/1 15427/15435/1 +f 11067/11075/1 3144/3152/1 15429/15437/1 15426/15434/1 +f 3144/3152/1 3143/3151/1 15430/15438/1 15429/15437/1 +f 11098/11106/1 15425/15433/1 15428/15436/1 11099/11107/1 +f 3139/3147/1 11068/11076/1 15425/15433/1 11098/11106/1 +f 11068/11076/1 11067/11075/1 15426/15434/1 15425/15433/1 +f 3134/3142/1 15421/15429/1 15424/15432/1 3135/3143/1 +f 11099/11107/1 15428/15436/1 15421/15429/1 3134/3142/1 +f 15428/15436/1 15427/15435/1 15422/15430/1 15421/15429/1 +f 15414/15422/1 15417/15425/1 15420/15428/1 15415/15423/1 +f 11103/11111/1 3132/3140/1 15417/15425/1 15414/15422/1 +f 3132/3140/1 3131/3139/1 15418/15426/1 15417/15425/1 +f 11134/11142/1 15413/15421/1 15416/15424/1 11135/11143/1 +f 3127/3135/1 11104/11112/1 15413/15421/1 11134/11142/1 +f 11104/11112/1 11103/11111/1 15414/15422/1 15413/15421/1 +f 3122/3130/1 15409/15417/1 15412/15420/1 3123/3131/1 +f 11135/11143/1 15416/15424/1 15409/15417/1 3122/3130/1 +f 15416/15424/1 15415/15423/1 15410/15418/1 15409/15417/1 +f 15402/15410/1 15405/15413/1 15408/15416/1 15403/15411/1 +f 11139/11147/1 3120/3128/1 15405/15413/1 15402/15410/1 +f 3120/3128/1 3119/3127/1 15406/15414/1 15405/15413/1 +f 11170/11178/1 15401/15409/1 15404/15412/1 11171/11179/1 +f 3115/3123/1 11140/11148/1 15401/15409/1 11170/11178/1 +f 11140/11148/1 11139/11147/1 15402/15410/1 15401/15409/1 +f 3110/3118/1 15397/15405/1 15400/15408/1 3111/3119/1 +f 11171/11179/1 15404/15412/1 15397/15405/1 3110/3118/1 +f 15404/15412/1 15403/15411/1 15398/15406/1 15397/15405/1 +f 15390/15398/1 15393/15401/1 15396/15404/1 15391/15399/1 +f 11175/11183/1 3108/3116/1 15393/15401/1 15390/15398/1 +f 3108/3116/1 3107/3115/1 15394/15402/1 15393/15401/1 +f 11206/11214/1 15389/15397/1 15392/15400/1 11207/11215/1 +f 3103/3111/1 11176/11184/1 15389/15397/1 11206/11214/1 +f 11176/11184/1 11175/11183/1 15390/15398/1 15389/15397/1 +f 3098/3106/1 15385/15393/1 15388/15396/1 3099/3107/1 +f 11207/11215/1 15392/15400/1 15385/15393/1 3098/3106/1 +f 15392/15400/1 15391/15399/1 15386/15394/1 15385/15393/1 +f 15378/15386/1 15381/15389/1 15384/15392/1 15379/15387/1 +f 11211/11219/1 3096/3104/1 15381/15389/1 15378/15386/1 +f 3096/3104/1 3095/3103/1 15382/15390/1 15381/15389/1 +f 11242/11250/1 15377/15385/1 15380/15388/1 11243/11251/1 +f 3091/3099/1 11212/11220/1 15377/15385/1 11242/11250/1 +f 11212/11220/1 11211/11219/1 15378/15386/1 15377/15385/1 +f 3086/3094/1 15373/15381/1 15376/15384/1 3087/3095/1 +f 11243/11251/1 15380/15388/1 15373/15381/1 3086/3094/1 +f 15380/15388/1 15379/15387/1 15374/15382/1 15373/15381/1 +f 15366/15374/1 15369/15377/1 15372/15380/1 15367/15375/1 +f 11247/11255/1 3084/3092/1 15369/15377/1 15366/15374/1 +f 3084/3092/1 3083/3091/1 15370/15378/1 15369/15377/1 +f 11278/11286/1 15365/15373/1 15368/15376/1 11279/11287/1 +f 3079/3087/1 11248/11256/1 15365/15373/1 11278/11286/1 +f 11248/11256/1 11247/11255/1 15366/15374/1 15365/15373/1 +f 3074/3082/1 15361/15369/1 15364/15372/1 3075/3083/1 +f 11279/11287/1 15368/15376/1 15361/15369/1 3074/3082/1 +f 15368/15376/1 15367/15375/1 15362/15370/1 15361/15369/1 +f 15354/15362/1 15357/15365/1 15360/15368/1 15355/15363/1 +f 11283/11291/1 3072/3080/1 15357/15365/1 15354/15362/1 +f 3072/3080/1 3071/3079/1 15358/15366/1 15357/15365/1 +f 11314/11322/1 15353/15361/1 15356/15364/1 11315/11323/1 +f 3067/3075/1 11284/11292/1 15353/15361/1 11314/11322/1 +f 11284/11292/1 11283/11291/1 15354/15362/1 15353/15361/1 +f 3062/3070/1 15349/15357/1 15352/15360/1 3063/3071/1 +f 11315/11323/1 15356/15364/1 15349/15357/1 3062/3070/1 +f 15356/15364/1 15355/15363/1 15350/15358/1 15349/15357/1 +f 15342/15350/1 15345/15353/1 15348/15356/1 15343/15351/1 +f 11319/11327/1 3060/3068/1 15345/15353/1 15342/15350/1 +f 3060/3068/1 3059/3067/1 15346/15354/1 15345/15353/1 +f 11350/11358/1 15341/15349/1 15344/15352/1 11351/11359/1 +f 3055/3063/1 11320/11328/1 15341/15349/1 11350/11358/1 +f 11320/11328/1 11319/11327/1 15342/15350/1 15341/15349/1 +f 3050/3058/1 15337/15345/1 15340/15348/1 3051/3059/1 +f 11351/11359/1 15344/15352/1 15337/15345/1 3050/3058/1 +f 15344/15352/1 15343/15351/1 15338/15346/1 15337/15345/1 +f 15330/15338/1 15333/15341/1 15336/15344/1 15331/15339/1 +f 11355/11363/1 3048/3056/1 15333/15341/1 15330/15338/1 +f 3048/3056/1 3047/3055/1 15334/15342/1 15333/15341/1 +f 11386/11394/1 15329/15337/1 15332/15340/1 11387/11395/1 +f 3043/3051/1 11356/11364/1 15329/15337/1 11386/11394/1 +f 11356/11364/1 11355/11363/1 15330/15338/1 15329/15337/1 +f 3038/3046/1 15325/15333/1 15328/15336/1 3039/3047/1 +f 11387/11395/1 15332/15340/1 15325/15333/1 3038/3046/1 +f 15332/15340/1 15331/15339/1 15326/15334/1 15325/15333/1 +f 15318/15326/1 15321/15329/1 15324/15332/1 15319/15327/1 +f 11391/11399/1 3036/3044/1 15321/15329/1 15318/15326/1 +f 3036/3044/1 3035/3043/1 15322/15330/1 15321/15329/1 +f 11422/11430/1 15317/15325/1 15320/15328/1 11423/11431/1 +f 3031/3039/1 11392/11400/1 15317/15325/1 11422/11430/1 +f 11392/11400/1 11391/11399/1 15318/15326/1 15317/15325/1 +f 3026/3034/1 15313/15321/1 15316/15324/1 3027/3035/1 +f 11423/11431/1 15320/15328/1 15313/15321/1 3026/3034/1 +f 15320/15328/1 15319/15327/1 15314/15322/1 15313/15321/1 +f 15306/15314/1 15309/15317/1 15312/15320/1 15307/15315/1 +f 11427/11435/1 3024/3032/1 15309/15317/1 15306/15314/1 +f 3024/3032/1 3023/3031/1 15310/15318/1 15309/15317/1 +f 11458/11466/1 15305/15313/1 15308/15316/1 11459/11467/1 +f 3019/3027/1 11428/11436/1 15305/15313/1 11458/11466/1 +f 11428/11436/1 11427/11435/1 15306/15314/1 15305/15313/1 +f 3014/3022/1 15301/15309/1 15304/15312/1 3015/3023/1 +f 11459/11467/1 15308/15316/1 15301/15309/1 3014/3022/1 +f 15308/15316/1 15307/15315/1 15302/15310/1 15301/15309/1 +f 15294/15302/1 15297/15305/1 15300/15308/1 15295/15303/1 +f 11463/11471/1 3012/3020/1 15297/15305/1 15294/15302/1 +f 3012/3020/1 3011/3019/1 15298/15306/1 15297/15305/1 +f 11494/11502/1 15293/15301/1 15296/15304/1 11495/11503/1 +f 3007/3015/1 11464/11472/1 15293/15301/1 11494/11502/1 +f 11464/11472/1 11463/11471/1 15294/15302/1 15293/15301/1 +f 3002/3010/1 15289/15297/1 15292/15300/1 3003/3011/1 +f 11495/11503/1 15296/15304/1 15289/15297/1 3002/3010/1 +f 15296/15304/1 15295/15303/1 15290/15298/1 15289/15297/1 +f 15282/15290/1 15285/15293/1 15288/15296/1 15283/15291/1 +f 11499/11507/1 3000/3008/1 15285/15293/1 15282/15290/1 +f 3000/3008/1 2999/3007/1 15286/15294/1 15285/15293/1 +f 11530/11538/1 15281/15289/1 15284/15292/1 11531/11539/1 +f 2995/3003/1 11500/11508/1 15281/15289/1 11530/11538/1 +f 11500/11508/1 11499/11507/1 15282/15290/1 15281/15289/1 +f 2990/2998/1 15277/15285/1 15280/15288/1 2991/2999/1 +f 11531/11539/1 15284/15292/1 15277/15285/1 2990/2998/1 +f 15284/15292/1 15283/15291/1 15278/15286/1 15277/15285/1 +f 15270/15278/1 15273/15281/1 15276/15284/1 15271/15279/1 +f 11535/11543/1 2988/2996/1 15273/15281/1 15270/15278/1 +f 2988/2996/1 2987/2995/1 15274/15282/1 15273/15281/1 +f 11566/11574/1 15269/15277/1 15272/15280/1 11567/11575/1 +f 2983/2991/1 11536/11544/1 15269/15277/1 11566/11574/1 +f 11536/11544/1 11535/11543/1 15270/15278/1 15269/15277/1 +f 2978/2986/1 15265/15273/1 15268/15276/1 2979/2987/1 +f 11567/11575/1 15272/15280/1 15265/15273/1 2978/2986/1 +f 15272/15280/1 15271/15279/1 15266/15274/1 15265/15273/1 +f 15258/15266/1 15261/15269/1 15264/15272/1 15259/15267/1 +f 11571/11579/1 2976/2984/1 15261/15269/1 15258/15266/1 +f 2976/2984/1 2975/2983/1 15262/15270/1 15261/15269/1 +f 11602/11610/1 15257/15265/1 15260/15268/1 11603/11611/1 +f 2971/2979/1 11572/11580/1 15257/15265/1 11602/11610/1 +f 11572/11580/1 11571/11579/1 15258/15266/1 15257/15265/1 +f 2966/2974/1 15253/15261/1 15256/15264/1 2967/2975/1 +f 11603/11611/1 15260/15268/1 15253/15261/1 2966/2974/1 +f 15260/15268/1 15259/15267/1 15254/15262/1 15253/15261/1 +f 15246/15254/1 15249/15257/1 15252/15260/1 15247/15255/1 +f 11607/11615/1 2964/2972/1 15249/15257/1 15246/15254/1 +f 2964/2972/1 2963/2971/1 15250/15258/1 15249/15257/1 +f 11638/11646/1 15245/15253/1 15248/15256/1 11639/11647/1 +f 2959/2967/1 11608/11616/1 15245/15253/1 11638/11646/1 +f 11608/11616/1 11607/11615/1 15246/15254/1 15245/15253/1 +f 2954/2962/1 15241/15249/1 15244/15252/1 2955/2963/1 +f 11639/11647/1 15248/15256/1 15241/15249/1 2954/2962/1 +f 15248/15256/1 15247/15255/1 15242/15250/1 15241/15249/1 +f 15234/15242/1 15237/15245/1 15240/15248/1 15235/15243/1 +f 11643/11651/1 2952/2960/1 15237/15245/1 15234/15242/1 +f 2952/2960/1 2951/2959/1 15238/15246/1 15237/15245/1 +f 11674/11682/1 15233/15241/1 15236/15244/1 11675/11683/1 +f 2947/2955/1 11644/11652/1 15233/15241/1 11674/11682/1 +f 11644/11652/1 11643/11651/1 15234/15242/1 15233/15241/1 +f 2942/2950/1 15229/15237/1 15232/15240/1 2943/2951/1 +f 11675/11683/1 15236/15244/1 15229/15237/1 2942/2950/1 +f 15236/15244/1 15235/15243/1 15230/15238/1 15229/15237/1 +f 15222/15230/1 15225/15233/1 15228/15236/1 15223/15231/1 +f 11679/11687/1 2940/2948/1 15225/15233/1 15222/15230/1 +f 2940/2948/1 2939/2947/1 15226/15234/1 15225/15233/1 +f 11710/11718/1 15221/15229/1 15224/15232/1 11711/11719/1 +f 2935/2943/1 11680/11688/1 15221/15229/1 11710/11718/1 +f 11680/11688/1 11679/11687/1 15222/15230/1 15221/15229/1 +f 2930/2938/1 15217/15225/1 15220/15228/1 2931/2939/1 +f 11711/11719/1 15224/15232/1 15217/15225/1 2930/2938/1 +f 15224/15232/1 15223/15231/1 15218/15226/1 15217/15225/1 +f 15210/15218/1 15213/15221/1 15216/15224/1 15211/15219/1 +f 11715/11723/1 2928/2936/1 15213/15221/1 15210/15218/1 +f 2928/2936/1 2927/2935/1 15214/15222/1 15213/15221/1 +f 11746/11754/1 15209/15217/1 15212/15220/1 11747/11755/1 +f 2923/2931/1 11716/11724/1 15209/15217/1 11746/11754/1 +f 11716/11724/1 11715/11723/1 15210/15218/1 15209/15217/1 +f 2918/2926/1 15205/15213/1 15208/15216/1 2919/2927/1 +f 11747/11755/1 15212/15220/1 15205/15213/1 2918/2926/1 +f 15212/15220/1 15211/15219/1 15206/15214/1 15205/15213/1 +f 15198/15206/1 15201/15209/1 15204/15212/1 15199/15207/1 +f 11751/11759/1 2916/2924/1 15201/15209/1 15198/15206/1 +f 2916/2924/1 2915/2923/1 15202/15210/1 15201/15209/1 +f 11782/11790/1 15197/15205/1 15200/15208/1 11783/11791/1 +f 2911/2919/1 11752/11760/1 15197/15205/1 11782/11790/1 +f 11752/11760/1 11751/11759/1 15198/15206/1 15197/15205/1 +f 2906/2914/1 15193/15201/1 15196/15204/1 2907/2915/1 +f 11783/11791/1 15200/15208/1 15193/15201/1 2906/2914/1 +f 15200/15208/1 15199/15207/1 15194/15202/1 15193/15201/1 +f 15186/15194/1 15189/15197/1 15192/15200/1 15187/15195/1 +f 11787/11795/1 2904/2912/1 15189/15197/1 15186/15194/1 +f 2904/2912/1 2903/2911/1 15190/15198/1 15189/15197/1 +f 11818/11826/1 15185/15193/1 15188/15196/1 11819/11827/1 +f 2899/2907/1 11788/11796/1 15185/15193/1 11818/11826/1 +f 11788/11796/1 11787/11795/1 15186/15194/1 15185/15193/1 +f 2894/2902/1 15181/15189/1 15184/15192/1 2895/2903/1 +f 11819/11827/1 15188/15196/1 15181/15189/1 2894/2902/1 +f 15188/15196/1 15187/15195/1 15182/15190/1 15181/15189/1 +f 15174/15182/1 15177/15185/1 15180/15188/1 15175/15183/1 +f 11823/11831/1 2892/2900/1 15177/15185/1 15174/15182/1 +f 2892/2900/1 2891/2899/1 15178/15186/1 15177/15185/1 +f 11854/11862/1 15173/15181/1 15176/15184/1 11855/11863/1 +f 2887/2895/1 11824/11832/1 15173/15181/1 11854/11862/1 +f 11824/11832/1 11823/11831/1 15174/15182/1 15173/15181/1 +f 2882/2890/1 15169/15177/1 15172/15180/1 2883/2891/1 +f 11855/11863/1 15176/15184/1 15169/15177/1 2882/2890/1 +f 15176/15184/1 15175/15183/1 15170/15178/1 15169/15177/1 +f 15162/15170/1 15165/15173/1 15168/15176/1 15163/15171/1 +f 11859/11867/1 2880/2888/1 15165/15173/1 15162/15170/1 +f 2880/2888/1 2879/2887/1 15166/15174/1 15165/15173/1 +f 11890/11898/1 15161/15169/1 15164/15172/1 11891/11899/1 +f 2875/2883/1 11860/11868/1 15161/15169/1 11890/11898/1 +f 11860/11868/1 11859/11867/1 15162/15170/1 15161/15169/1 +f 2870/2878/1 15157/15165/1 15160/15168/1 2871/2879/1 +f 11891/11899/1 15164/15172/1 15157/15165/1 2870/2878/1 +f 15164/15172/1 15163/15171/1 15158/15166/1 15157/15165/1 +f 15150/15158/1 15153/15161/1 15156/15164/1 15151/15159/1 +f 11895/11903/1 2868/2876/1 15153/15161/1 15150/15158/1 +f 2868/2876/1 2867/2875/1 15154/15162/1 15153/15161/1 +f 11926/11934/1 15149/15157/1 15152/15160/1 11927/11935/1 +f 2863/2871/1 11896/11904/1 15149/15157/1 11926/11934/1 +f 11896/11904/1 11895/11903/1 15150/15158/1 15149/15157/1 +f 2858/2866/1 15145/15153/1 15148/15156/1 2859/2867/1 +f 11927/11935/1 15152/15160/1 15145/15153/1 2858/2866/1 +f 15152/15160/1 15151/15159/1 15146/15154/1 15145/15153/1 +f 15138/15146/1 15141/15149/1 15144/15152/1 15139/15147/1 +f 11931/11939/1 2856/2864/1 15141/15149/1 15138/15146/1 +f 2856/2864/1 2855/2863/1 15142/15150/1 15141/15149/1 +f 11962/11970/1 15137/15145/1 15140/15148/1 11963/11971/1 +f 2851/2859/1 11932/11940/1 15137/15145/1 11962/11970/1 +f 11932/11940/1 11931/11939/1 15138/15146/1 15137/15145/1 +f 2846/2854/1 15133/15141/1 15136/15144/1 2847/2855/1 +f 11963/11971/1 15140/15148/1 15133/15141/1 2846/2854/1 +f 15140/15148/1 15139/15147/1 15134/15142/1 15133/15141/1 +f 15126/15134/1 15129/15137/1 15132/15140/1 15127/15135/1 +f 11967/11975/1 2844/2852/1 15129/15137/1 15126/15134/1 +f 2844/2852/1 2843/2851/1 15130/15138/1 15129/15137/1 +f 11998/12006/1 15125/15133/1 15128/15136/1 11999/12007/1 +f 2839/2847/1 11968/11976/1 15125/15133/1 11998/12006/1 +f 11968/11976/1 11967/11975/1 15126/15134/1 15125/15133/1 +f 2834/2842/1 15121/15129/1 15124/15132/1 2835/2843/1 +f 11999/12007/1 15128/15136/1 15121/15129/1 2834/2842/1 +f 15128/15136/1 15127/15135/1 15122/15130/1 15121/15129/1 +f 15114/15122/1 15117/15125/1 15120/15128/1 15115/15123/1 +f 12003/12011/1 2832/2840/1 15117/15125/1 15114/15122/1 +f 2832/2840/1 2831/2839/1 15118/15126/1 15117/15125/1 +f 12034/12042/1 15113/15121/1 15116/15124/1 12035/12043/1 +f 2827/2835/1 12004/12012/1 15113/15121/1 12034/12042/1 +f 12004/12012/1 12003/12011/1 15114/15122/1 15113/15121/1 +f 2822/2830/1 15109/15117/1 15112/15120/1 2823/2831/1 +f 12035/12043/1 15116/15124/1 15109/15117/1 2822/2830/1 +f 15116/15124/1 15115/15123/1 15110/15118/1 15109/15117/1 +f 15102/15110/1 15105/15113/1 15108/15116/1 15103/15111/1 +f 12039/12047/1 2820/2828/1 15105/15113/1 15102/15110/1 +f 2820/2828/1 2819/2827/1 15106/15114/1 15105/15113/1 +f 12070/12078/1 15101/15109/1 15104/15112/1 12071/12079/1 +f 2815/2823/1 12040/12048/1 15101/15109/1 12070/12078/1 +f 12040/12048/1 12039/12047/1 15102/15110/1 15101/15109/1 +f 2810/2818/1 15097/15105/1 15100/15108/1 2811/2819/1 +f 12071/12079/1 15104/15112/1 15097/15105/1 2810/2818/1 +f 15104/15112/1 15103/15111/1 15098/15106/1 15097/15105/1 +f 15090/15098/1 15093/15101/1 15096/15104/1 15091/15099/1 +f 12075/12083/1 2808/2816/1 15093/15101/1 15090/15098/1 +f 2808/2816/1 2807/2815/1 15094/15102/1 15093/15101/1 +f 12106/12114/1 15089/15097/1 15092/15100/1 12107/12115/1 +f 2803/2811/1 12076/12084/1 15089/15097/1 12106/12114/1 +f 12076/12084/1 12075/12083/1 15090/15098/1 15089/15097/1 +f 2798/2806/1 15085/15093/1 15088/15096/1 2799/2807/1 +f 12107/12115/1 15092/15100/1 15085/15093/1 2798/2806/1 +f 15092/15100/1 15091/15099/1 15086/15094/1 15085/15093/1 +f 15078/15086/1 15081/15089/1 15084/15092/1 15079/15087/1 +f 12111/12119/1 2796/2804/1 15081/15089/1 15078/15086/1 +f 2796/2804/1 2795/2803/1 15082/15090/1 15081/15089/1 +f 12142/12150/1 15077/15085/1 15080/15088/1 12143/12151/1 +f 2791/2799/1 12112/12120/1 15077/15085/1 12142/12150/1 +f 12112/12120/1 12111/12119/1 15078/15086/1 15077/15085/1 +f 2786/2794/1 15073/15081/1 15076/15084/1 2787/2795/1 +f 12143/12151/1 15080/15088/1 15073/15081/1 2786/2794/1 +f 15080/15088/1 15079/15087/1 15074/15082/1 15073/15081/1 +f 15066/15074/1 15069/15077/1 15072/15080/1 15067/15075/1 +f 12147/12155/1 2784/2792/1 15069/15077/1 15066/15074/1 +f 2784/2792/1 2783/2791/1 15070/15078/1 15069/15077/1 +f 12178/12186/1 15065/15073/1 15068/15076/1 12179/12187/1 +f 2779/2787/1 12148/12156/1 15065/15073/1 12178/12186/1 +f 12148/12156/1 12147/12155/1 15066/15074/1 15065/15073/1 +f 2774/2782/1 15061/15069/1 15064/15072/1 2775/2783/1 +f 12179/12187/1 15068/15076/1 15061/15069/1 2774/2782/1 +f 15068/15076/1 15067/15075/1 15062/15070/1 15061/15069/1 +f 15054/15062/1 15057/15065/1 15060/15068/1 15055/15063/1 +f 12183/12191/1 2772/2780/1 15057/15065/1 15054/15062/1 +f 2772/2780/1 2771/2779/1 15058/15066/1 15057/15065/1 +f 12214/12222/1 15053/15061/1 15056/15064/1 12215/12223/1 +f 2767/2775/1 12184/12192/1 15053/15061/1 12214/12222/1 +f 12184/12192/1 12183/12191/1 15054/15062/1 15053/15061/1 +f 2762/2770/1 15049/15057/1 15052/15060/1 2763/2771/1 +f 12215/12223/1 15056/15064/1 15049/15057/1 2762/2770/1 +f 15056/15064/1 15055/15063/1 15050/15058/1 15049/15057/1 +f 15042/15050/1 15045/15053/1 15048/15056/1 15043/15051/1 +f 12219/12227/1 2760/2768/1 15045/15053/1 15042/15050/1 +f 2760/2768/1 2759/2767/1 15046/15054/1 15045/15053/1 +f 12250/12258/1 15041/15049/1 15044/15052/1 12251/12259/1 +f 2755/2763/1 12220/12228/1 15041/15049/1 12250/12258/1 +f 12220/12228/1 12219/12227/1 15042/15050/1 15041/15049/1 +f 2750/2758/1 15037/15045/1 15040/15048/1 2751/2759/1 +f 12251/12259/1 15044/15052/1 15037/15045/1 2750/2758/1 +f 15044/15052/1 15043/15051/1 15038/15046/1 15037/15045/1 +f 15030/15038/1 15033/15041/1 15036/15044/1 15031/15039/1 +f 12255/12263/1 2748/2756/1 15033/15041/1 15030/15038/1 +f 2748/2756/1 2747/2755/1 15034/15042/1 15033/15041/1 +f 12286/12294/1 15029/15037/1 15032/15040/1 12287/12295/1 +f 2743/2751/1 12256/12264/1 15029/15037/1 12286/12294/1 +f 12256/12264/1 12255/12263/1 15030/15038/1 15029/15037/1 +f 2738/2746/1 15025/15033/1 15028/15036/1 2739/2747/1 +f 12287/12295/1 15032/15040/1 15025/15033/1 2738/2746/1 +f 15032/15040/1 15031/15039/1 15026/15034/1 15025/15033/1 +f 15018/15026/1 15021/15029/1 15024/15032/1 15019/15027/1 +f 12291/12299/1 2736/2744/1 15021/15029/1 15018/15026/1 +f 2736/2744/1 2735/2743/1 15022/15030/1 15021/15029/1 +f 12322/12330/1 15017/15025/1 15020/15028/1 12323/12331/1 +f 2731/2739/1 12292/12300/1 15017/15025/1 12322/12330/1 +f 12292/12300/1 12291/12299/1 15018/15026/1 15017/15025/1 +f 2726/2734/1 15013/15021/1 15016/15024/1 2727/2735/1 +f 12323/12331/1 15020/15028/1 15013/15021/1 2726/2734/1 +f 15020/15028/1 15019/15027/1 15014/15022/1 15013/15021/1 +f 15006/15014/1 15009/15017/1 15012/15020/1 15007/15015/1 +f 12327/12335/1 2724/2732/1 15009/15017/1 15006/15014/1 +f 2724/2732/1 2723/2731/1 15010/15018/1 15009/15017/1 +f 12358/12366/1 15005/15013/1 15008/15016/1 12359/12367/1 +f 2719/2727/1 12328/12336/1 15005/15013/1 12358/12366/1 +f 12328/12336/1 12327/12335/1 15006/15014/1 15005/15013/1 +f 2714/2722/1 15001/15009/1 15004/15012/1 2715/2723/1 +f 12359/12367/1 15008/15016/1 15001/15009/1 2714/2722/1 +f 15008/15016/1 15007/15015/1 15002/15010/1 15001/15009/1 +f 14994/15002/1 14997/15005/1 15000/15008/1 14995/15003/1 +f 12363/12371/1 2712/2720/1 14997/15005/1 14994/15002/1 +f 2712/2720/1 2711/2719/1 14998/15006/1 14997/15005/1 +f 12394/12402/1 14993/15001/1 14996/15004/1 12395/12403/1 +f 2707/2715/1 12364/12372/1 14993/15001/1 12394/12402/1 +f 12364/12372/1 12363/12371/1 14994/15002/1 14993/15001/1 +f 2702/2710/1 14989/14997/1 14992/15000/1 2703/2711/1 +f 12395/12403/1 14996/15004/1 14989/14997/1 2702/2710/1 +f 14996/15004/1 14995/15003/1 14990/14998/1 14989/14997/1 +f 14982/14990/1 14985/14993/1 14988/14996/1 14983/14991/1 +f 12399/12407/1 2700/2708/1 14985/14993/1 14982/14990/1 +f 2700/2708/1 2699/2707/1 14986/14994/1 14985/14993/1 +f 12430/12438/1 14981/14989/1 14984/14992/1 12431/12439/1 +f 2695/2703/1 12400/12408/1 14981/14989/1 12430/12438/1 +f 12400/12408/1 12399/12407/1 14982/14990/1 14981/14989/1 +f 2690/2698/1 14977/14985/1 14980/14988/1 2691/2699/1 +f 12431/12439/1 14984/14992/1 14977/14985/1 2690/2698/1 +f 14984/14992/1 14983/14991/1 14978/14986/1 14977/14985/1 +f 14970/14978/1 14973/14981/1 14976/14984/1 14971/14979/1 +f 12435/12443/1 2688/2696/1 14973/14981/1 14970/14978/1 +f 2688/2696/1 2687/2695/1 14974/14982/1 14973/14981/1 +f 12466/12474/1 14969/14977/1 14972/14980/1 12467/12475/1 +f 2683/2691/1 12436/12444/1 14969/14977/1 12466/12474/1 +f 12436/12444/1 12435/12443/1 14970/14978/1 14969/14977/1 +f 2678/2686/1 14965/14973/1 14968/14976/1 2679/2687/1 +f 12467/12475/1 14972/14980/1 14965/14973/1 2678/2686/1 +f 14972/14980/1 14971/14979/1 14966/14974/1 14965/14973/1 +f 14958/14966/1 14961/14969/1 14964/14972/1 14959/14967/1 +f 12471/12479/1 2676/2684/1 14961/14969/1 14958/14966/1 +f 2676/2684/1 2675/2683/1 14962/14970/1 14961/14969/1 +f 12502/12510/1 14957/14965/1 14960/14968/1 12503/12511/1 +f 2671/2679/1 12472/12480/1 14957/14965/1 12502/12510/1 +f 12472/12480/1 12471/12479/1 14958/14966/1 14957/14965/1 +f 2666/2674/1 14953/14961/1 14956/14964/1 2667/2675/1 +f 12503/12511/1 14960/14968/1 14953/14961/1 2666/2674/1 +f 14960/14968/1 14959/14967/1 14954/14962/1 14953/14961/1 +f 14946/14954/1 14949/14957/1 14952/14960/1 14947/14955/1 +f 12507/12515/1 2664/2672/1 14949/14957/1 14946/14954/1 +f 2664/2672/1 2663/2671/1 14950/14958/1 14949/14957/1 +f 12538/12546/1 14945/14953/1 14948/14956/1 12539/12547/1 +f 2659/2667/1 12508/12516/1 14945/14953/1 12538/12546/1 +f 12508/12516/1 12507/12515/1 14946/14954/1 14945/14953/1 +f 2654/2662/1 14941/14949/1 14944/14952/1 2655/2663/1 +f 12539/12547/1 14948/14956/1 14941/14949/1 2654/2662/1 +f 14948/14956/1 14947/14955/1 14942/14950/1 14941/14949/1 +f 14934/14942/1 14937/14945/1 14940/14948/1 14935/14943/1 +f 12543/12551/1 2652/2660/1 14937/14945/1 14934/14942/1 +f 2652/2660/1 2651/2659/1 14938/14946/1 14937/14945/1 +f 12574/12582/1 14933/14941/1 14936/14944/1 12575/12583/1 +f 2647/2655/1 12544/12552/1 14933/14941/1 12574/12582/1 +f 12544/12552/1 12543/12551/1 14934/14942/1 14933/14941/1 +f 2642/2650/1 14929/14937/1 14932/14940/1 2643/2651/1 +f 12575/12583/1 14936/14944/1 14929/14937/1 2642/2650/1 +f 14936/14944/1 14935/14943/1 14930/14938/1 14929/14937/1 +f 14922/14930/1 14925/14933/1 14928/14936/1 14923/14931/1 +f 12579/12587/1 2640/2648/1 14925/14933/1 14922/14930/1 +f 2640/2648/1 2639/2647/1 14926/14934/1 14925/14933/1 +f 12610/12618/1 14921/14929/1 14924/14932/1 12611/12619/1 +f 2635/2643/1 12580/12588/1 14921/14929/1 12610/12618/1 +f 12580/12588/1 12579/12587/1 14922/14930/1 14921/14929/1 +f 2630/2638/1 14917/14925/1 14920/14928/1 2631/2639/1 +f 12611/12619/1 14924/14932/1 14917/14925/1 2630/2638/1 +f 14924/14932/1 14923/14931/1 14918/14926/1 14917/14925/1 +f 14910/14918/1 14913/14921/1 14916/14924/1 14911/14919/1 +f 12615/12623/1 2628/2636/1 14913/14921/1 14910/14918/1 +f 2628/2636/1 2627/2635/1 14914/14922/1 14913/14921/1 +f 12646/12654/1 14909/14917/1 14912/14920/1 12647/12655/1 +f 2623/2631/1 12616/12624/1 14909/14917/1 12646/12654/1 +f 12616/12624/1 12615/12623/1 14910/14918/1 14909/14917/1 +f 2618/2626/1 14905/14913/1 14908/14916/1 2619/2627/1 +f 12647/12655/1 14912/14920/1 14905/14913/1 2618/2626/1 +f 14912/14920/1 14911/14919/1 14906/14914/1 14905/14913/1 +f 14898/14906/1 14901/14909/1 14904/14912/1 14899/14907/1 +f 12651/12659/1 2616/2624/1 14901/14909/1 14898/14906/1 +f 2616/2624/1 2615/2623/1 14902/14910/1 14901/14909/1 +f 12682/12690/1 14897/14905/1 14900/14908/1 12683/12691/1 +f 2611/2619/1 12652/12660/1 14897/14905/1 12682/12690/1 +f 12652/12660/1 12651/12659/1 14898/14906/1 14897/14905/1 +f 2606/2614/1 14893/14901/1 14896/14904/1 2607/2615/1 +f 12683/12691/1 14900/14908/1 14893/14901/1 2606/2614/1 +f 14900/14908/1 14899/14907/1 14894/14902/1 14893/14901/1 +f 14886/14894/1 14889/14897/1 14892/14900/1 14887/14895/1 +f 12687/12695/1 2604/2612/1 14889/14897/1 14886/14894/1 +f 2604/2612/1 2603/2611/1 14890/14898/1 14889/14897/1 +f 12718/12726/1 14885/14893/1 14888/14896/1 12719/12727/1 +f 2599/2607/1 12688/12696/1 14885/14893/1 12718/12726/1 +f 12688/12696/1 12687/12695/1 14886/14894/1 14885/14893/1 +f 2594/2602/1 14881/14889/1 14884/14892/1 2595/2603/1 +f 12719/12727/1 14888/14896/1 14881/14889/1 2594/2602/1 +f 14888/14896/1 14887/14895/1 14882/14890/1 14881/14889/1 +f 14874/14882/1 14877/14885/1 14880/14888/1 14875/14883/1 +f 12723/12731/1 2592/2600/1 14877/14885/1 14874/14882/1 +f 2592/2600/1 2591/2599/1 14878/14886/1 14877/14885/1 +f 12754/12762/1 14873/14881/1 14876/14884/1 12755/12763/1 +f 2587/2595/1 12724/12732/1 14873/14881/1 12754/12762/1 +f 12724/12732/1 12723/12731/1 14874/14882/1 14873/14881/1 +f 2582/2590/1 14869/14877/1 14872/14880/1 2583/2591/1 +f 12755/12763/1 14876/14884/1 14869/14877/1 2582/2590/1 +f 14876/14884/1 14875/14883/1 14870/14878/1 14869/14877/1 +f 14862/14870/1 14865/14873/1 14868/14876/1 14863/14871/1 +f 12759/12767/1 2580/2588/1 14865/14873/1 14862/14870/1 +f 2580/2588/1 2579/2587/1 14866/14874/1 14865/14873/1 +f 12790/12798/1 14861/14869/1 14864/14872/1 12791/12799/1 +f 2575/2583/1 12760/12768/1 14861/14869/1 12790/12798/1 +f 12760/12768/1 12759/12767/1 14862/14870/1 14861/14869/1 +f 2570/2578/1 14857/14865/1 14860/14868/1 2571/2579/1 +f 12791/12799/1 14864/14872/1 14857/14865/1 2570/2578/1 +f 14864/14872/1 14863/14871/1 14858/14866/1 14857/14865/1 +f 14850/14858/1 14853/14861/1 14856/14864/1 14851/14859/1 +f 12795/12803/1 2568/2576/1 14853/14861/1 14850/14858/1 +f 2568/2576/1 2567/2575/1 14854/14862/1 14853/14861/1 +f 12826/12834/1 14849/14857/1 14852/14860/1 12827/12835/1 +f 2563/2571/1 12796/12804/1 14849/14857/1 12826/12834/1 +f 12796/12804/1 12795/12803/1 14850/14858/1 14849/14857/1 +f 2558/2566/1 14845/14853/1 14848/14856/1 2559/2567/1 +f 12827/12835/1 14852/14860/1 14845/14853/1 2558/2566/1 +f 14852/14860/1 14851/14859/1 14846/14854/1 14845/14853/1 +f 14838/14846/1 14841/14849/1 14844/14852/1 14839/14847/1 +f 12831/12839/1 2556/2564/1 14841/14849/1 14838/14846/1 +f 2556/2564/1 2555/2563/1 14842/14850/1 14841/14849/1 +f 12862/12870/1 14837/14845/1 14840/14848/1 12863/12871/1 +f 2551/2559/1 12832/12840/1 14837/14845/1 12862/12870/1 +f 12832/12840/1 12831/12839/1 14838/14846/1 14837/14845/1 +f 2546/2554/1 14833/14841/1 14836/14844/1 2547/2555/1 +f 12863/12871/1 14840/14848/1 14833/14841/1 2546/2554/1 +f 14840/14848/1 14839/14847/1 14834/14842/1 14833/14841/1 +f 14826/14834/1 14829/14837/1 14832/14840/1 14827/14835/1 +f 12867/12875/1 2544/2552/1 14829/14837/1 14826/14834/1 +f 2544/2552/1 2543/2551/1 14830/14838/1 14829/14837/1 +f 12898/12906/1 14825/14833/1 14828/14836/1 12899/12907/1 +f 2539/2547/1 12868/12876/1 14825/14833/1 12898/12906/1 +f 12868/12876/1 12867/12875/1 14826/14834/1 14825/14833/1 +f 2534/2542/1 14821/14829/1 14824/14832/1 2535/2543/1 +f 12899/12907/1 14828/14836/1 14821/14829/1 2534/2542/1 +f 14828/14836/1 14827/14835/1 14822/14830/1 14821/14829/1 +f 14814/14822/1 14817/14825/1 14820/14828/1 14815/14823/1 +f 12903/12911/1 2532/2540/1 14817/14825/1 14814/14822/1 +f 2532/2540/1 2531/2539/1 14818/14826/1 14817/14825/1 +f 12934/12942/1 14813/14821/1 14816/14824/1 12935/12943/1 +f 2527/2535/1 12904/12912/1 14813/14821/1 12934/12942/1 +f 12904/12912/1 12903/12911/1 14814/14822/1 14813/14821/1 +f 2522/2530/1 14809/14817/1 14812/14820/1 2523/2531/1 +f 12935/12943/1 14816/14824/1 14809/14817/1 2522/2530/1 +f 14816/14824/1 14815/14823/1 14810/14818/1 14809/14817/1 +f 14802/14810/1 14805/14813/1 14808/14816/1 14803/14811/1 +f 12939/12947/1 2520/2528/1 14805/14813/1 14802/14810/1 +f 2520/2528/1 2519/2527/1 14806/14814/1 14805/14813/1 +f 12970/12978/1 14801/14809/1 14804/14812/1 12971/12979/1 +f 2515/2523/1 12940/12948/1 14801/14809/1 12970/12978/1 +f 12940/12948/1 12939/12947/1 14802/14810/1 14801/14809/1 +f 2510/2518/1 14797/14805/1 14800/14808/1 2511/2519/1 +f 12971/12979/1 14804/14812/1 14797/14805/1 2510/2518/1 +f 14804/14812/1 14803/14811/1 14798/14806/1 14797/14805/1 +f 14790/14798/1 14793/14801/1 14796/14804/1 14791/14799/1 +f 12975/12983/1 2508/2516/1 14793/14801/1 14790/14798/1 +f 2508/2516/1 2507/2515/1 14794/14802/1 14793/14801/1 +f 13006/13014/1 14789/14797/1 14792/14800/1 13007/13015/1 +f 2503/2511/1 12976/12984/1 14789/14797/1 13006/13014/1 +f 12976/12984/1 12975/12983/1 14790/14798/1 14789/14797/1 +f 2498/2506/1 14785/14793/1 14788/14796/1 2499/2507/1 +f 13007/13015/1 14792/14800/1 14785/14793/1 2498/2506/1 +f 14792/14800/1 14791/14799/1 14786/14794/1 14785/14793/1 +f 14778/14786/1 14781/14789/1 14784/14792/1 14779/14787/1 +f 13011/13019/1 2496/2504/1 14781/14789/1 14778/14786/1 +f 2496/2504/1 2495/2503/1 14782/14790/1 14781/14789/1 +f 13042/13050/1 14777/14785/1 14780/14788/1 13043/13051/1 +f 2491/2499/1 13012/13020/1 14777/14785/1 13042/13050/1 +f 13012/13020/1 13011/13019/1 14778/14786/1 14777/14785/1 +f 2486/2494/1 14773/14781/1 14776/14784/1 2487/2495/1 +f 13043/13051/1 14780/14788/1 14773/14781/1 2486/2494/1 +f 14780/14788/1 14779/14787/1 14774/14782/1 14773/14781/1 +f 14766/14774/1 14769/14777/1 14772/14780/1 14767/14775/1 +f 13047/13055/1 2484/2492/1 14769/14777/1 14766/14774/1 +f 2484/2492/1 2483/2491/1 14770/14778/1 14769/14777/1 +f 13078/13086/1 14765/14773/1 14768/14776/1 13079/13087/1 +f 2479/2487/1 13048/13056/1 14765/14773/1 13078/13086/1 +f 13048/13056/1 13047/13055/1 14766/14774/1 14765/14773/1 +f 2474/2482/1 14761/14769/1 14764/14772/1 2475/2483/1 +f 13079/13087/1 14768/14776/1 14761/14769/1 2474/2482/1 +f 14768/14776/1 14767/14775/1 14762/14770/1 14761/14769/1 +f 14754/14762/1 14757/14765/1 14760/14768/1 14755/14763/1 +f 13083/13091/1 2472/2480/1 14757/14765/1 14754/14762/1 +f 2472/2480/1 2471/2479/1 14758/14766/1 14757/14765/1 +f 13114/13122/1 14753/14761/1 14756/14764/1 13115/13123/1 +f 2467/2475/1 13084/13092/1 14753/14761/1 13114/13122/1 +f 13084/13092/1 13083/13091/1 14754/14762/1 14753/14761/1 +f 2462/2470/1 14749/14757/1 14752/14760/1 2463/2471/1 +f 13115/13123/1 14756/14764/1 14749/14757/1 2462/2470/1 +f 14756/14764/1 14755/14763/1 14750/14758/1 14749/14757/1 +f 14742/14750/1 14745/14753/1 14748/14756/1 14743/14751/1 +f 13119/13127/1 2460/2468/1 14745/14753/1 14742/14750/1 +f 2460/2468/1 2459/2467/1 14746/14754/1 14745/14753/1 +f 13150/13158/1 14741/14749/1 14744/14752/1 13151/13159/1 +f 2455/2463/1 13120/13128/1 14741/14749/1 13150/13158/1 +f 13120/13128/1 13119/13127/1 14742/14750/1 14741/14749/1 +f 2450/2458/1 14737/14745/1 14740/14748/1 2451/2459/1 +f 13151/13159/1 14744/14752/1 14737/14745/1 2450/2458/1 +f 14744/14752/1 14743/14751/1 14738/14746/1 14737/14745/1 +f 14730/14738/1 14733/14741/1 14736/14744/1 14731/14739/1 +f 13155/13163/1 2448/2456/1 14733/14741/1 14730/14738/1 +f 2448/2456/1 2447/2455/1 14734/14742/1 14733/14741/1 +f 13186/13194/1 14729/14737/1 14732/14740/1 13187/13195/1 +f 2443/2451/1 13156/13164/1 14729/14737/1 13186/13194/1 +f 13156/13164/1 13155/13163/1 14730/14738/1 14729/14737/1 +f 2438/2446/1 14725/14733/1 14728/14736/1 2439/2447/1 +f 13187/13195/1 14732/14740/1 14725/14733/1 2438/2446/1 +f 14732/14740/1 14731/14739/1 14726/14734/1 14725/14733/1 +f 14718/14726/1 14721/14729/1 14724/14732/1 14719/14727/1 +f 13191/13199/1 2436/2444/1 14721/14729/1 14718/14726/1 +f 2436/2444/1 2435/2443/1 14722/14730/1 14721/14729/1 +f 13222/13230/1 14717/14725/1 14720/14728/1 13223/13231/1 +f 2431/2439/1 13192/13200/1 14717/14725/1 13222/13230/1 +f 13192/13200/1 13191/13199/1 14718/14726/1 14717/14725/1 +f 2426/2434/1 14713/14721/1 14716/14724/1 2427/2435/1 +f 13223/13231/1 14720/14728/1 14713/14721/1 2426/2434/1 +f 14720/14728/1 14719/14727/1 14714/14722/1 14713/14721/1 +f 14706/14714/1 14709/14717/1 14712/14720/1 14707/14715/1 +f 13227/13235/1 2424/2432/1 14709/14717/1 14706/14714/1 +f 2424/2432/1 2423/2431/1 14710/14718/1 14709/14717/1 +f 13258/13266/1 14705/14713/1 14708/14716/1 13259/13267/1 +f 2419/2427/1 13228/13236/1 14705/14713/1 13258/13266/1 +f 13228/13236/1 13227/13235/1 14706/14714/1 14705/14713/1 +f 2414/2422/1 14701/14709/1 14704/14712/1 2415/2423/1 +f 13259/13267/1 14708/14716/1 14701/14709/1 2414/2422/1 +f 14708/14716/1 14707/14715/1 14702/14710/1 14701/14709/1 +f 14694/14702/1 14697/14705/1 14700/14708/1 14695/14703/1 +f 13263/13271/1 2412/2420/1 14697/14705/1 14694/14702/1 +f 2412/2420/1 2411/2419/1 14698/14706/1 14697/14705/1 +f 13294/13302/1 14693/14701/1 14696/14704/1 13295/13303/1 +f 2407/2415/1 13264/13272/1 14693/14701/1 13294/13302/1 +f 13264/13272/1 13263/13271/1 14694/14702/1 14693/14701/1 +f 2402/2410/1 14689/14697/1 14692/14700/1 2403/2411/1 +f 13295/13303/1 14696/14704/1 14689/14697/1 2402/2410/1 +f 14696/14704/1 14695/14703/1 14690/14698/1 14689/14697/1 +f 14682/14690/1 14685/14693/1 14688/14696/1 14683/14691/1 +f 13299/13307/1 2400/2408/1 14685/14693/1 14682/14690/1 +f 2400/2408/1 2399/2407/1 14686/14694/1 14685/14693/1 +f 13330/13338/1 14681/14689/1 14684/14692/1 13331/13339/1 +f 2395/2403/1 13300/13308/1 14681/14689/1 13330/13338/1 +f 13300/13308/1 13299/13307/1 14682/14690/1 14681/14689/1 +f 2390/2398/1 14677/14685/1 14680/14688/1 2391/2399/1 +f 13331/13339/1 14684/14692/1 14677/14685/1 2390/2398/1 +f 14684/14692/1 14683/14691/1 14678/14686/1 14677/14685/1 +f 14670/14678/1 14673/14681/1 14676/14684/1 14671/14679/1 +f 13335/13343/1 2388/2396/1 14673/14681/1 14670/14678/1 +f 2388/2396/1 2387/2395/1 14674/14682/1 14673/14681/1 +f 13366/13374/1 14669/14677/1 14672/14680/1 13367/13375/1 +f 2383/2391/1 13336/13344/1 14669/14677/1 13366/13374/1 +f 13336/13344/1 13335/13343/1 14670/14678/1 14669/14677/1 +f 2378/2386/1 14665/14673/1 14668/14676/1 2379/2387/1 +f 13367/13375/1 14672/14680/1 14665/14673/1 2378/2386/1 +f 14672/14680/1 14671/14679/1 14666/14674/1 14665/14673/1 +f 14658/14666/1 14661/14669/1 14664/14672/1 14659/14667/1 +f 13371/13379/1 2376/2384/1 14661/14669/1 14658/14666/1 +f 2376/2384/1 2375/2383/1 14662/14670/1 14661/14669/1 +f 13402/13410/1 14657/14665/1 14660/14668/1 13403/13411/1 +f 2371/2379/1 13372/13380/1 14657/14665/1 13402/13410/1 +f 13372/13380/1 13371/13379/1 14658/14666/1 14657/14665/1 +f 2366/2374/1 14653/14661/1 14656/14664/1 2367/2375/1 +f 13403/13411/1 14660/14668/1 14653/14661/1 2366/2374/1 +f 14660/14668/1 14659/14667/1 14654/14662/1 14653/14661/1 +f 14646/14654/1 14649/14657/1 14652/14660/1 14647/14655/1 +f 13407/13415/1 2364/2372/1 14649/14657/1 14646/14654/1 +f 2364/2372/1 2363/2371/1 14650/14658/1 14649/14657/1 +f 13438/13446/1 14645/14653/1 14648/14656/1 13439/13447/1 +f 2359/2367/1 13408/13416/1 14645/14653/1 13438/13446/1 +f 13408/13416/1 13407/13415/1 14646/14654/1 14645/14653/1 +f 2354/2362/1 14641/14649/1 14644/14652/1 2355/2363/1 +f 13439/13447/1 14648/14656/1 14641/14649/1 2354/2362/1 +f 14648/14656/1 14647/14655/1 14642/14650/1 14641/14649/1 +f 14634/14642/1 14637/14645/1 14640/14648/1 14635/14643/1 +f 13443/13451/1 2352/2360/1 14637/14645/1 14634/14642/1 +f 2352/2360/1 2351/2359/1 14638/14646/1 14637/14645/1 +f 13474/13482/1 14633/14641/1 14636/14644/1 13475/13483/1 +f 2347/2355/1 13444/13452/1 14633/14641/1 13474/13482/1 +f 13444/13452/1 13443/13451/1 14634/14642/1 14633/14641/1 +f 2342/2350/1 14629/14637/1 14632/14640/1 2343/2351/1 +f 13475/13483/1 14636/14644/1 14629/14637/1 2342/2350/1 +f 14636/14644/1 14635/14643/1 14630/14638/1 14629/14637/1 +f 14622/14630/1 14625/14633/1 14628/14636/1 14623/14631/1 +f 13479/13487/1 2340/2348/1 14625/14633/1 14622/14630/1 +f 2340/2348/1 2339/2347/1 14626/14634/1 14625/14633/1 +f 13510/13518/1 14621/14629/1 14624/14632/1 13511/13519/1 +f 2335/2343/1 13480/13488/1 14621/14629/1 13510/13518/1 +f 13480/13488/1 13479/13487/1 14622/14630/1 14621/14629/1 +f 2330/2338/1 14617/14625/1 14620/14628/1 2331/2339/1 +f 13511/13519/1 14624/14632/1 14617/14625/1 2330/2338/1 +f 14624/14632/1 14623/14631/1 14618/14626/1 14617/14625/1 +f 14610/14618/1 14613/14621/1 14616/14624/1 14611/14619/1 +f 13515/13523/1 2328/2336/1 14613/14621/1 14610/14618/1 +f 2328/2336/1 2327/2335/1 14614/14622/1 14613/14621/1 +f 13546/13554/1 14609/14617/1 14612/14620/1 13547/13555/1 +f 2323/2331/1 13516/13524/1 14609/14617/1 13546/13554/1 +f 13516/13524/1 13515/13523/1 14610/14618/1 14609/14617/1 +f 2318/2326/1 14605/14613/1 14608/14616/1 2319/2327/1 +f 13547/13555/1 14612/14620/1 14605/14613/1 2318/2326/1 +f 14612/14620/1 14611/14619/1 14606/14614/1 14605/14613/1 +f 14598/14606/1 14601/14609/1 14604/14612/1 14599/14607/1 +f 13551/13559/1 2316/2324/1 14601/14609/1 14598/14606/1 +f 2316/2324/1 2315/2323/1 14602/14610/1 14601/14609/1 +f 13582/13590/1 14597/14605/1 14600/14608/1 13583/13591/1 +f 2311/2319/1 13552/13560/1 14597/14605/1 13582/13590/1 +f 13552/13560/1 13551/13559/1 14598/14606/1 14597/14605/1 +f 2306/2314/1 14593/14601/1 14596/14604/1 2307/2315/1 +f 13583/13591/1 14600/14608/1 14593/14601/1 2306/2314/1 +f 14600/14608/1 14599/14607/1 14594/14602/1 14593/14601/1 +f 14586/14594/1 14589/14597/1 14592/14600/1 14587/14595/1 +f 13587/13595/1 2304/2312/1 14589/14597/1 14586/14594/1 +f 2304/2312/1 2303/2311/1 14590/14598/1 14589/14597/1 +f 13618/13626/1 14585/14593/1 14588/14596/1 13619/13627/1 +f 2299/2307/1 13588/13596/1 14585/14593/1 13618/13626/1 +f 13588/13596/1 13587/13595/1 14586/14594/1 14585/14593/1 +f 2294/2302/1 14581/14589/1 14584/14592/1 2295/2303/1 +f 13619/13627/1 14588/14596/1 14581/14589/1 2294/2302/1 +f 14588/14596/1 14587/14595/1 14582/14590/1 14581/14589/1 +f 14574/14582/1 14577/14585/1 14580/14588/1 14575/14583/1 +f 13623/13631/1 2292/2300/1 14577/14585/1 14574/14582/1 +f 2292/2300/1 2291/2299/1 14578/14586/1 14577/14585/1 +f 13654/13662/1 14573/14581/1 14576/14584/1 13655/13663/1 +f 2287/2295/1 13624/13632/1 14573/14581/1 13654/13662/1 +f 13624/13632/1 13623/13631/1 14574/14582/1 14573/14581/1 +f 2282/2290/1 14569/14577/1 14572/14580/1 2283/2291/1 +f 13655/13663/1 14576/14584/1 14569/14577/1 2282/2290/1 +f 14576/14584/1 14575/14583/1 14570/14578/1 14569/14577/1 +f 14562/14570/1 14565/14573/1 14568/14576/1 14563/14571/1 +f 13659/13667/1 2280/2288/1 14565/14573/1 14562/14570/1 +f 2280/2288/1 2279/2287/1 14566/14574/1 14565/14573/1 +f 13690/13698/1 14561/14569/1 14564/14572/1 13691/13699/1 +f 2275/2283/1 13660/13668/1 14561/14569/1 13690/13698/1 +f 13660/13668/1 13659/13667/1 14562/14570/1 14561/14569/1 +f 2270/2278/1 14557/14565/1 14560/14568/1 2271/2279/1 +f 13691/13699/1 14564/14572/1 14557/14565/1 2270/2278/1 +f 14564/14572/1 14563/14571/1 14558/14566/1 14557/14565/1 +f 14550/14558/1 14553/14561/1 14556/14564/1 14551/14559/1 +f 13695/13703/1 2268/2276/1 14553/14561/1 14550/14558/1 +f 2268/2276/1 2267/2275/1 14554/14562/1 14553/14561/1 +f 13726/13734/1 14549/14557/1 14552/14560/1 13727/13735/1 +f 2263/2271/1 13696/13704/1 14549/14557/1 13726/13734/1 +f 13696/13704/1 13695/13703/1 14550/14558/1 14549/14557/1 +f 2258/2266/1 14545/14553/1 14548/14556/1 2259/2267/1 +f 13727/13735/1 14552/14560/1 14545/14553/1 2258/2266/1 +f 14552/14560/1 14551/14559/1 14546/14554/1 14545/14553/1 +f 14538/14546/1 14541/14549/1 14544/14552/1 14539/14547/1 +f 13731/13739/1 2256/2264/1 14541/14549/1 14538/14546/1 +f 2256/2264/1 2255/2263/1 14542/14550/1 14541/14549/1 +f 13762/13770/1 14537/14545/1 14540/14548/1 13763/13771/1 +f 2251/2259/1 13732/13740/1 14537/14545/1 13762/13770/1 +f 13732/13740/1 13731/13739/1 14538/14546/1 14537/14545/1 +f 2246/2254/1 14533/14541/1 14536/14544/1 2247/2255/1 +f 13763/13771/1 14540/14548/1 14533/14541/1 2246/2254/1 +f 14540/14548/1 14539/14547/1 14534/14542/1 14533/14541/1 +f 14526/14534/1 14529/14537/1 14532/14540/1 14527/14535/1 +f 13767/13775/1 2244/2252/1 14529/14537/1 14526/14534/1 +f 2244/2252/1 2243/2251/1 14530/14538/1 14529/14537/1 +f 13798/13806/1 14525/14533/1 14528/14536/1 13799/13807/1 +f 2239/2247/1 13768/13776/1 14525/14533/1 13798/13806/1 +f 13768/13776/1 13767/13775/1 14526/14534/1 14525/14533/1 +f 2234/2242/1 14521/14529/1 14524/14532/1 2235/2243/1 +f 13799/13807/1 14528/14536/1 14521/14529/1 2234/2242/1 +f 14528/14536/1 14527/14535/1 14522/14530/1 14521/14529/1 +f 14514/14522/1 14517/14525/1 14520/14528/1 14515/14523/1 +f 13803/13811/1 2232/2240/1 14517/14525/1 14514/14522/1 +f 2232/2240/1 2231/2239/1 14518/14526/1 14517/14525/1 +f 13834/13842/1 14513/14521/1 14516/14524/1 13835/13843/1 +f 2227/2235/1 13804/13812/1 14513/14521/1 13834/13842/1 +f 13804/13812/1 13803/13811/1 14514/14522/1 14513/14521/1 +f 2222/2230/1 14509/14517/1 14512/14520/1 2223/2231/1 +f 13835/13843/1 14516/14524/1 14509/14517/1 2222/2230/1 +f 14516/14524/1 14515/14523/1 14510/14518/1 14509/14517/1 +f 14502/14510/1 14505/14513/1 14508/14516/1 14503/14511/1 +f 13839/13847/1 2220/2228/1 14505/14513/1 14502/14510/1 +f 2220/2228/1 2219/2227/1 14506/14514/1 14505/14513/1 +f 13870/13878/1 14501/14509/1 14504/14512/1 13871/13879/1 +f 2215/2223/1 13840/13848/1 14501/14509/1 13870/13878/1 +f 13840/13848/1 13839/13847/1 14502/14510/1 14501/14509/1 +f 2210/2218/1 14497/14505/1 14500/14508/1 2211/2219/1 +f 13871/13879/1 14504/14512/1 14497/14505/1 2210/2218/1 +f 14504/14512/1 14503/14511/1 14498/14506/1 14497/14505/1 +f 14490/14498/1 14493/14501/1 14496/14504/1 14491/14499/1 +f 13875/13883/1 2208/2216/1 14493/14501/1 14490/14498/1 +f 2208/2216/1 2207/2215/1 14494/14502/1 14493/14501/1 +f 13906/13914/1 14489/14497/1 14492/14500/1 13907/13915/1 +f 2203/2211/1 13876/13884/1 14489/14497/1 13906/13914/1 +f 13876/13884/1 13875/13883/1 14490/14498/1 14489/14497/1 +f 2198/2206/1 14485/14493/1 14488/14496/1 2199/2207/1 +f 13907/13915/1 14492/14500/1 14485/14493/1 2198/2206/1 +f 14492/14500/1 14491/14499/1 14486/14494/1 14485/14493/1 +f 14478/14486/1 14481/14489/1 14484/14492/1 14479/14487/1 +f 13911/13919/1 2196/2204/1 14481/14489/1 14478/14486/1 +f 2196/2204/1 2195/2203/1 14482/14490/1 14481/14489/1 +f 13942/13950/1 14477/14485/1 14480/14488/1 13943/13951/1 +f 2191/2199/1 13912/13920/1 14477/14485/1 13942/13950/1 +f 13912/13920/1 13911/13919/1 14478/14486/1 14477/14485/1 +f 2186/2194/1 14473/14481/1 14476/14484/1 2187/2195/1 +f 13943/13951/1 14480/14488/1 14473/14481/1 2186/2194/1 +f 14480/14488/1 14479/14487/1 14474/14482/1 14473/14481/1 +f 14466/14474/1 14469/14477/1 14472/14480/1 14467/14475/1 +f 13947/13955/1 2184/2192/1 14469/14477/1 14466/14474/1 +f 2184/2192/1 2183/2191/1 14470/14478/1 14469/14477/1 +f 13978/13986/1 14465/14473/1 14468/14476/1 13979/13987/1 +f 2179/2187/1 13948/13956/1 14465/14473/1 13978/13986/1 +f 13948/13956/1 13947/13955/1 14466/14474/1 14465/14473/1 +f 2174/2182/1 14461/14469/1 14464/14472/1 2175/2183/1 +f 13979/13987/1 14468/14476/1 14461/14469/1 2174/2182/1 +f 14468/14476/1 14467/14475/1 14462/14470/1 14461/14469/1 +f 14454/14462/1 14457/14465/1 14460/14468/1 14455/14463/1 +f 13983/13991/1 2172/2180/1 14457/14465/1 14454/14462/1 +f 2172/2180/1 2171/2179/1 14458/14466/1 14457/14465/1 +f 14014/14022/1 14453/14461/1 14456/14464/1 14015/14023/1 +f 2167/2175/1 13984/13992/1 14453/14461/1 14014/14022/1 +f 13984/13992/1 13983/13991/1 14454/14462/1 14453/14461/1 +f 2162/2170/1 14449/14457/1 14452/14460/1 2163/2171/1 +f 14015/14023/1 14456/14464/1 14449/14457/1 2162/2170/1 +f 14456/14464/1 14455/14463/1 14450/14458/1 14449/14457/1 +f 14442/14450/1 14445/14453/1 14448/14456/1 14443/14451/1 +f 14019/14027/1 2160/2168/1 14445/14453/1 14442/14450/1 +f 2160/2168/1 2159/2167/1 14446/14454/1 14445/14453/1 +f 14050/14058/1 14441/14449/1 14444/14452/1 14051/14059/1 +f 2155/2163/1 14020/14028/1 14441/14449/1 14050/14058/1 +f 14020/14028/1 14019/14027/1 14442/14450/1 14441/14449/1 +f 2150/2158/1 14437/14445/1 14440/14448/1 2151/2159/1 +f 14051/14059/1 14444/14452/1 14437/14445/1 2150/2158/1 +f 14444/14452/1 14443/14451/1 14438/14446/1 14437/14445/1 +f 14430/14438/1 14433/14441/1 14436/14444/1 14431/14439/1 +f 14055/14063/1 2148/2156/1 14433/14441/1 14430/14438/1 +f 2148/2156/1 2147/2155/1 14434/14442/1 14433/14441/1 +f 14086/14094/1 14429/14437/1 14432/14440/1 14087/14095/1 +f 2143/2151/1 14056/14064/1 14429/14437/1 14086/14094/1 +f 14056/14064/1 14055/14063/1 14430/14438/1 14429/14437/1 +f 2138/2146/1 14425/14433/1 14428/14436/1 2139/2147/1 +f 14087/14095/1 14432/14440/1 14425/14433/1 2138/2146/1 +f 14432/14440/1 14431/14439/1 14426/14434/1 14425/14433/1 +f 14418/14426/1 14421/14429/1 14424/14432/1 14419/14427/1 +f 14091/14099/1 2136/2144/1 14421/14429/1 14418/14426/1 +f 2136/2144/1 2135/2143/1 14422/14430/1 14421/14429/1 +f 14122/14130/1 14417/14425/1 14420/14428/1 14123/14131/1 +f 2131/2139/1 14092/14100/1 14417/14425/1 14122/14130/1 +f 14092/14100/1 14091/14099/1 14418/14426/1 14417/14425/1 +f 2126/2134/1 14413/14421/1 14416/14424/1 2127/2135/1 +f 14123/14131/1 14420/14428/1 14413/14421/1 2126/2134/1 +f 14420/14428/1 14419/14427/1 14414/14422/1 14413/14421/1 +f 14406/14414/1 14409/14417/1 14412/14420/1 14407/14415/1 +f 14127/14135/1 2124/2132/1 14409/14417/1 14406/14414/1 +f 2124/2132/1 2123/2131/1 14410/14418/1 14409/14417/1 +f 14158/14166/1 14405/14413/1 14408/14416/1 14159/14167/1 +f 2119/2127/1 14128/14136/1 14405/14413/1 14158/14166/1 +f 14128/14136/1 14127/14135/1 14406/14414/1 14405/14413/1 +f 2114/2122/1 14401/14409/1 14404/14412/1 2115/2123/1 +f 14159/14167/1 14408/14416/1 14401/14409/1 2114/2122/1 +f 14408/14416/1 14407/14415/1 14402/14410/1 14401/14409/1 +f 14394/14402/1 14397/14405/1 14400/14408/1 14395/14403/1 +f 14163/14171/1 2112/2120/1 14397/14405/1 14394/14402/1 +f 2112/2120/1 2111/2119/1 14398/14406/1 14397/14405/1 +f 14194/14202/1 14393/14401/1 14396/14404/1 14195/14203/1 +f 2107/2115/1 14164/14172/1 14393/14401/1 14194/14202/1 +f 14164/14172/1 14163/14171/1 14394/14402/1 14393/14401/1 +f 2102/2110/1 14389/14397/1 14392/14400/1 2103/2111/1 +f 14195/14203/1 14396/14404/1 14389/14397/1 2102/2110/1 +f 14396/14404/1 14395/14403/1 14390/14398/1 14389/14397/1 +f 14382/14390/1 14385/14393/1 14388/14396/1 14383/14391/1 +f 14199/14207/1 2100/2108/1 14385/14393/1 14382/14390/1 +f 2100/2108/1 2099/2107/1 14386/14394/1 14385/14393/1 +f 14230/14238/1 14381/14389/1 14384/14392/1 14231/14239/1 +f 2095/2103/1 14200/14208/1 14381/14389/1 14230/14238/1 +f 14200/14208/1 14199/14207/1 14382/14390/1 14381/14389/1 +f 2090/2098/1 14377/14385/1 14380/14388/1 2091/2099/1 +f 14231/14239/1 14384/14392/1 14377/14385/1 2090/2098/1 +f 14384/14392/1 14383/14391/1 14378/14386/1 14377/14385/1 +f 14370/14378/1 14373/14381/1 14376/14384/1 14371/14379/1 +f 14235/14243/1 2088/2096/1 14373/14381/1 14370/14378/1 +f 2088/2096/1 2087/2095/1 14374/14382/1 14373/14381/1 +f 14266/14274/1 14369/14377/1 14372/14380/1 14267/14275/1 +f 2083/2091/1 14236/14244/1 14369/14377/1 14266/14274/1 +f 14236/14244/1 14235/14243/1 14370/14378/1 14369/14377/1 +f 2078/2086/1 14365/14373/1 14368/14376/1 2079/2087/1 +f 14267/14275/1 14372/14380/1 14365/14373/1 2078/2086/1 +f 14372/14380/1 14371/14379/1 14366/14374/1 14365/14373/1 +f 14358/14366/1 14361/14369/1 14364/14372/1 14359/14367/1 +f 14271/14279/1 2076/2084/1 14361/14369/1 14358/14366/1 +f 2076/2084/1 2075/2083/1 14362/14370/1 14361/14369/1 +f 14302/14310/1 14357/14365/1 14360/14368/1 14303/14311/1 +f 2071/2079/1 14272/14280/1 14357/14365/1 14302/14310/1 +f 14272/14280/1 14271/14279/1 14358/14366/1 14357/14365/1 +f 2066/2074/1 14353/14361/1 14356/14364/1 2067/2075/1 +f 14303/14311/1 14360/14368/1 14353/14361/1 2066/2074/1 +f 14360/14368/1 14359/14367/1 14354/14362/1 14353/14361/1 +f 14346/14354/1 14349/14357/1 14352/14360/1 14347/14355/1 +f 14307/14315/1 2064/2072/1 14349/14357/1 14346/14354/1 +f 2064/2072/1 2063/2071/1 14350/14358/1 14349/14357/1 +f 14338/14346/1 14345/14353/1 14348/14356/1 14339/14347/1 +f 2059/2067/1 14308/14316/1 14345/14353/1 14338/14346/1 +f 14308/14316/1 14307/14315/1 14346/14354/1 14345/14353/1 +f 2054/2062/1 14341/14349/1 14344/14352/1 2055/2063/1 +f 14339/14347/1 14348/14356/1 14341/14349/1 2054/2062/1 +f 14348/14356/1 14347/14355/1 14342/14350/1 14341/14349/1 +f 14334/14342/1 14337/14345/1 14340/14348/1 14335/14343/1 +f 14319/14327/1 2060/2068/1 14337/14345/1 14334/14342/1 +f 2060/2068/1 2059/2067/1 14338/14346/1 14337/14345/1 +f 14362/14370/1 14333/14341/1 14336/14344/1 14363/14371/1 +f 2075/2083/1 14320/14328/1 14333/14341/1 14362/14370/1 +f 14320/14328/1 14319/14327/1 14334/14342/1 14333/14341/1 +f 2046/2054/1 14329/14337/1 14332/14340/1 2047/2055/1 +f 14363/14371/1 14336/14344/1 14329/14337/1 2046/2054/1 +f 14336/14344/1 14335/14343/1 14330/14338/1 14329/14337/1 +f 14322/14330/1 14325/14333/1 14328/14336/1 14323/14331/1 +f 7419/7427/1 4360/4368/1 14325/14333/1 14322/14330/1 +f 4360/4368/1 4359/4367/1 14326/14334/1 14325/14333/1 +f 14278/14286/1 14321/14329/1 14324/14332/1 14279/14287/1 +f 1287/1295/1 7420/7428/1 14321/14329/1 14278/14286/1 +f 7420/7428/1 7419/7427/1 14322/14330/1 14321/14329/1 +f 2074/2082/1 14317/14325/1 14320/14328/1 2075/2083/1 +f 14279/14287/1 14324/14332/1 14317/14325/1 2074/2082/1 +f 14324/14332/1 14323/14331/1 14318/14326/1 14317/14325/1 +f 14310/14318/1 14313/14321/1 14316/14324/1 14311/14319/1 +f 16647/16655/1 1284/1292/1 14313/14321/1 14310/14318/1 +f 1284/1292/1 1283/1291/1 14314/14322/1 14313/14321/1 +f 14326/14334/1 14309/14317/1 14312/14320/1 14327/14335/1 +f 4359/4367/1 16648/16656/1 14309/14317/1 14326/14334/1 +f 16648/16656/1 16647/16655/1 14310/14318/1 14309/14317/1 +f 2058/2066/1 14305/14313/1 14308/14316/1 2059/2067/1 +f 14327/14335/1 14312/14320/1 14305/14313/1 2058/2066/1 +f 14312/14320/1 14311/14319/1 14306/14314/1 14305/14313/1 +f 14298/14306/1 14301/14309/1 14304/14312/1 14299/14307/1 +f 14283/14291/1 2072/2080/1 14301/14309/1 14298/14306/1 +f 2072/2080/1 2071/2079/1 14302/14310/1 14301/14309/1 +f 16546/16554/1 14297/14305/1 14300/14308/1 16547/16555/1 +f 4259/4267/1 14284/14292/1 14297/14305/1 16546/16554/1 +f 14284/14292/1 14283/14291/1 14298/14306/1 14297/14305/1 +f 1318/1326/1 14293/14301/1 14296/14304/1 1319/1327/1 +f 16547/16555/1 14300/14308/1 14293/14301/1 1318/1326/1 +f 14300/14308/1 14299/14307/1 14294/14302/1 14293/14301/1 +f 14286/14294/1 14289/14297/1 14292/14300/1 14287/14295/1 +f 7455/7463/1 4348/4356/1 14289/14297/1 14286/14294/1 +f 4348/4356/1 4347/4355/1 14290/14298/1 14289/14297/1 +f 7726/7734/1 14285/14293/1 14288/14296/1 7727/7735/1 +f 1279/1287/1 7456/7464/1 14285/14293/1 7726/7734/1 +f 7456/7464/1 7455/7463/1 14286/14294/1 14285/14293/1 +f 4258/4266/1 14281/14289/1 14284/14292/1 4259/4267/1 +f 7727/7735/1 14288/14296/1 14281/14289/1 4258/4266/1 +f 14288/14296/1 14287/14295/1 14282/14290/1 14281/14289/1 +f 14274/14282/1 14277/14285/1 14280/14288/1 14275/14283/1 +f 16635/16643/1 1288/1296/1 14277/14285/1 14274/14282/1 +f 1288/1296/1 1287/1295/1 14278/14286/1 14277/14285/1 +f 14290/14298/1 14273/14281/1 14276/14284/1 14291/14299/1 +f 4347/4355/1 16636/16644/1 14273/14281/1 14290/14298/1 +f 16636/16644/1 16635/16643/1 14274/14282/1 14273/14281/1 +f 2070/2078/1 14269/14277/1 14272/14280/1 2071/2079/1 +f 14291/14299/1 14276/14284/1 14269/14277/1 2070/2078/1 +f 14276/14284/1 14275/14283/1 14270/14278/1 14269/14277/1 +f 14262/14270/1 14265/14273/1 14268/14276/1 14263/14271/1 +f 14247/14255/1 2084/2092/1 14265/14273/1 14262/14270/1 +f 2084/2092/1 2083/2091/1 14266/14274/1 14265/14273/1 +f 16678/16686/1 14261/14269/1 14264/14272/1 16679/16687/1 +f 4391/4399/1 14248/14256/1 14261/14269/1 16678/16686/1 +f 14248/14256/1 14247/14255/1 14262/14270/1 14261/14269/1 +f 1274/1282/1 14257/14265/1 14260/14268/1 1275/1283/1 +f 16679/16687/1 14264/14272/1 14257/14265/1 1274/1282/1 +f 14264/14272/1 14263/14271/1 14258/14266/1 14257/14265/1 +f 14250/14258/1 14253/14261/1 14256/14264/1 14251/14259/1 +f 14295/14303/1 2068/2076/1 14253/14261/1 14250/14258/1 +f 2068/2076/1 2067/2075/1 14254/14262/1 14253/14261/1 +f 7330/7338/1 14249/14257/1 14252/14260/1 7331/7339/1 +f 1319/1327/1 14296/14304/1 14249/14257/1 7330/7338/1 +f 14296/14304/1 14295/14303/1 14250/14258/1 14249/14257/1 +f 4390/4398/1 14245/14253/1 14248/14256/1 4391/4399/1 +f 7331/7339/1 14252/14260/1 14245/14253/1 4390/4398/1 +f 14252/14260/1 14251/14259/1 14246/14254/1 14245/14253/1 +f 14238/14246/1 14241/14249/1 14244/14252/1 14239/14247/1 +f 14355/14363/1 2048/2056/1 14241/14249/1 14238/14246/1 +f 2048/2056/1 2047/2055/1 14242/14250/1 14241/14249/1 +f 14254/14262/1 14237/14245/1 14240/14248/1 14255/14263/1 +f 2067/2075/1 14356/14364/1 14237/14245/1 14254/14262/1 +f 14356/14364/1 14355/14363/1 14238/14246/1 14237/14245/1 +f 2082/2090/1 14233/14241/1 14236/14244/1 2083/2091/1 +f 14255/14263/1 14240/14248/1 14233/14241/1 2082/2090/1 +f 14240/14248/1 14239/14247/1 14234/14242/1 14233/14241/1 +f 14226/14234/1 14229/14237/1 14232/14240/1 14227/14235/1 +f 14211/14219/1 2096/2104/1 14229/14237/1 14226/14234/1 +f 2096/2104/1 2095/2103/1 14230/14238/1 14229/14237/1 +f 14398/14406/1 14225/14233/1 14228/14236/1 14399/14407/1 +f 2111/2119/1 14212/14220/1 14225/14233/1 14398/14406/1 +f 14212/14220/1 14211/14219/1 14226/14234/1 14225/14233/1 +f 2034/2042/1 14221/14229/1 14224/14232/1 2035/2043/1 +f 14399/14407/1 14228/14236/1 14221/14229/1 2034/2042/1 +f 14228/14236/1 14227/14235/1 14222/14230/1 14221/14229/1 +f 14214/14222/1 14217/14225/1 14220/14228/1 14215/14223/1 +f 7311/7319/1 4396/4404/1 14217/14225/1 14214/14222/1 +f 4396/4404/1 4395/4403/1 14218/14226/1 14217/14225/1 +f 14170/14178/1 14213/14221/1 14216/14224/1 14171/14179/1 +f 1323/1331/1 7312/7320/1 14213/14221/1 14170/14178/1 +f 7312/7320/1 7311/7319/1 14214/14222/1 14213/14221/1 +f 2110/2118/1 14209/14217/1 14212/14220/1 2111/2119/1 +f 14171/14179/1 14216/14224/1 14209/14217/1 2110/2118/1 +f 14216/14224/1 14215/14223/1 14210/14218/1 14209/14217/1 +f 14202/14210/1 14205/14213/1 14208/14216/1 14203/14211/1 +f 16683/16691/1 1272/1280/1 14205/14213/1 14202/14210/1 +f 1272/1280/1 1271/1279/1 14206/14214/1 14205/14213/1 +f 14218/14226/1 14201/14209/1 14204/14212/1 14219/14227/1 +f 4395/4403/1 16684/16692/1 14201/14209/1 14218/14226/1 +f 16684/16692/1 16683/16691/1 14202/14210/1 14201/14209/1 +f 2094/2102/1 14197/14205/1 14200/14208/1 2095/2103/1 +f 14219/14227/1 14204/14212/1 14197/14205/1 2094/2102/1 +f 14204/14212/1 14203/14211/1 14198/14206/1 14197/14205/1 +f 14190/14198/1 14193/14201/1 14196/14204/1 14191/14199/1 +f 14175/14183/1 2108/2116/1 14193/14201/1 14190/14198/1 +f 2108/2116/1 2107/2115/1 14194/14202/1 14193/14201/1 +f 16438/16446/1 14189/14197/1 14192/14200/1 16439/16447/1 +f 4151/4159/1 14176/14184/1 14189/14197/1 16438/16446/1 +f 14176/14184/1 14175/14183/1 14190/14198/1 14189/14197/1 +f 1354/1362/1 14185/14193/1 14188/14196/1 1355/1363/1 +f 16439/16447/1 14192/14200/1 14185/14193/1 1354/1362/1 +f 14192/14200/1 14191/14199/1 14186/14194/1 14185/14193/1 +f 14178/14186/1 14181/14189/1 14184/14192/1 14179/14187/1 +f 7779/7787/1 4240/4248/1 14181/14189/1 14178/14186/1 +f 4240/4248/1 4239/4247/1 14182/14190/1 14181/14189/1 +f 8050/8058/1 14177/14185/1 14180/14188/1 8051/8059/1 +f 1267/1275/1 7780/7788/1 14177/14185/1 8050/8058/1 +f 7780/7788/1 7779/7787/1 14178/14186/1 14177/14185/1 +f 4150/4158/1 14173/14181/1 14176/14184/1 4151/4159/1 +f 8051/8059/1 14180/14188/1 14173/14181/1 4150/4158/1 +f 14180/14188/1 14179/14187/1 14174/14182/1 14173/14181/1 +f 14166/14174/1 14169/14177/1 14172/14180/1 14167/14175/1 +f 16527/16535/1 1324/1332/1 14169/14177/1 14166/14174/1 +f 1324/1332/1 1323/1331/1 14170/14178/1 14169/14177/1 +f 14182/14190/1 14165/14173/1 14168/14176/1 14183/14191/1 +f 4239/4247/1 16528/16536/1 14165/14173/1 14182/14190/1 +f 16528/16536/1 16527/16535/1 14166/14174/1 14165/14173/1 +f 2106/2114/1 14161/14169/1 14164/14172/1 2107/2115/1 +f 14183/14191/1 14168/14176/1 14161/14169/1 2106/2114/1 +f 14168/14176/1 14167/14175/1 14162/14170/1 14161/14169/1 +f 14154/14162/1 14157/14165/1 14160/14168/1 14155/14163/1 +f 14139/14147/1 2120/2128/1 14157/14165/1 14154/14162/1 +f 2120/2128/1 2119/2127/1 14158/14166/1 14157/14165/1 +f 16714/16722/1 14153/14161/1 14156/14164/1 16715/16723/1 +f 4427/4435/1 14140/14148/1 14153/14161/1 16714/16722/1 +f 14140/14148/1 14139/14147/1 14154/14162/1 14153/14161/1 +f 1262/1270/1 14149/14157/1 14152/14160/1 1263/1271/1 +f 16715/16723/1 14156/14164/1 14149/14157/1 1262/1270/1 +f 14156/14164/1 14155/14163/1 14150/14158/1 14149/14157/1 +f 14142/14150/1 14145/14153/1 14148/14156/1 14143/14151/1 +f 14187/14195/1 2104/2112/1 14145/14153/1 14142/14150/1 +f 2104/2112/1 2103/2111/1 14146/14154/1 14145/14153/1 +f 7222/7230/1 14141/14149/1 14144/14152/1 7223/7231/1 +f 1355/1363/1 14188/14196/1 14141/14149/1 7222/7230/1 +f 14188/14196/1 14187/14195/1 14142/14150/1 14141/14149/1 +f 4426/4434/1 14137/14145/1 14140/14148/1 4427/4435/1 +f 7223/7231/1 14144/14152/1 14137/14145/1 4426/4434/1 +f 14144/14152/1 14143/14151/1 14138/14146/1 14137/14145/1 +f 14130/14138/1 14133/14141/1 14136/14144/1 14131/14139/1 +f 14391/14399/1 2036/2044/1 14133/14141/1 14130/14138/1 +f 2036/2044/1 2035/2043/1 14134/14142/1 14133/14141/1 +f 14146/14154/1 14129/14137/1 14132/14140/1 14147/14155/1 +f 2103/2111/1 14392/14400/1 14129/14137/1 14146/14154/1 +f 14392/14400/1 14391/14399/1 14130/14138/1 14129/14137/1 +f 2118/2126/1 14125/14133/1 14128/14136/1 2119/2127/1 +f 14147/14155/1 14132/14140/1 14125/14133/1 2118/2126/1 +f 14132/14140/1 14131/14139/1 14126/14134/1 14125/14133/1 +f 14118/14126/1 14121/14129/1 14124/14132/1 14119/14127/1 +f 14103/14111/1 2132/2140/1 14121/14129/1 14118/14126/1 +f 2132/2140/1 2131/2139/1 14122/14130/1 14121/14129/1 +f 14434/14442/1 14117/14125/1 14120/14128/1 14435/14443/1 +f 2147/2155/1 14104/14112/1 14117/14125/1 14434/14442/1 +f 14104/14112/1 14103/14111/1 14118/14126/1 14117/14125/1 +f 2022/2030/1 14113/14121/1 14116/14124/1 2023/2031/1 +f 14435/14443/1 14120/14128/1 14113/14121/1 2022/2030/1 +f 14120/14128/1 14119/14127/1 14114/14122/1 14113/14121/1 +f 14106/14114/1 14109/14117/1 14112/14120/1 14107/14115/1 +f 7203/7211/1 4432/4440/1 14109/14117/1 14106/14114/1 +f 4432/4440/1 4431/4439/1 14110/14118/1 14109/14117/1 +f 14062/14070/1 14105/14113/1 14108/14116/1 14063/14071/1 +f 1359/1367/1 7204/7212/1 14105/14113/1 14062/14070/1 +f 7204/7212/1 7203/7211/1 14106/14114/1 14105/14113/1 +f 2146/2154/1 14101/14109/1 14104/14112/1 2147/2155/1 +f 14063/14071/1 14108/14116/1 14101/14109/1 2146/2154/1 +f 14108/14116/1 14107/14115/1 14102/14110/1 14101/14109/1 +f 14094/14102/1 14097/14105/1 14100/14108/1 14095/14103/1 +f 16719/16727/1 1260/1268/1 14097/14105/1 14094/14102/1 +f 1260/1268/1 1259/1267/1 14098/14106/1 14097/14105/1 +f 14110/14118/1 14093/14101/1 14096/14104/1 14111/14119/1 +f 4431/4439/1 16720/16728/1 14093/14101/1 14110/14118/1 +f 16720/16728/1 16719/16727/1 14094/14102/1 14093/14101/1 +f 2130/2138/1 14089/14097/1 14092/14100/1 2131/2139/1 +f 14111/14119/1 14096/14104/1 14089/14097/1 2130/2138/1 +f 14096/14104/1 14095/14103/1 14090/14098/1 14089/14097/1 +f 14082/14090/1 14085/14093/1 14088/14096/1 14083/14091/1 +f 14067/14075/1 2144/2152/1 14085/14093/1 14082/14090/1 +f 2144/2152/1 2143/2151/1 14086/14094/1 14085/14093/1 +f 16330/16338/1 14081/14089/1 14084/14092/1 16331/16339/1 +f 4043/4051/1 14068/14076/1 14081/14089/1 16330/16338/1 +f 14068/14076/1 14067/14075/1 14082/14090/1 14081/14089/1 +f 1390/1398/1 14077/14085/1 14080/14088/1 1391/1399/1 +f 16331/16339/1 14084/14092/1 14077/14085/1 1390/1398/1 +f 14084/14092/1 14083/14091/1 14078/14086/1 14077/14085/1 +f 14070/14078/1 14073/14081/1 14076/14084/1 14071/14079/1 +f 8103/8111/1 4132/4140/1 14073/14081/1 14070/14078/1 +f 4132/4140/1 4131/4139/1 14074/14082/1 14073/14081/1 +f 8374/8382/1 14069/14077/1 14072/14080/1 8375/8383/1 +f 1255/1263/1 8104/8112/1 14069/14077/1 8374/8382/1 +f 8104/8112/1 8103/8111/1 14070/14078/1 14069/14077/1 +f 4042/4050/1 14065/14073/1 14068/14076/1 4043/4051/1 +f 8375/8383/1 14072/14080/1 14065/14073/1 4042/4050/1 +f 14072/14080/1 14071/14079/1 14066/14074/1 14065/14073/1 +f 14058/14066/1 14061/14069/1 14064/14072/1 14059/14067/1 +f 16419/16427/1 1360/1368/1 14061/14069/1 14058/14066/1 +f 1360/1368/1 1359/1367/1 14062/14070/1 14061/14069/1 +f 14074/14082/1 14057/14065/1 14060/14068/1 14075/14083/1 +f 4131/4139/1 16420/16428/1 14057/14065/1 14074/14082/1 +f 16420/16428/1 16419/16427/1 14058/14066/1 14057/14065/1 +f 2142/2150/1 14053/14061/1 14056/14064/1 2143/2151/1 +f 14075/14083/1 14060/14068/1 14053/14061/1 2142/2150/1 +f 14060/14068/1 14059/14067/1 14054/14062/1 14053/14061/1 +f 14046/14054/1 14049/14057/1 14052/14060/1 14047/14055/1 +f 14031/14039/1 2156/2164/1 14049/14057/1 14046/14054/1 +f 2156/2164/1 2155/2163/1 14050/14058/1 14049/14057/1 +f 16750/16758/1 14045/14053/1 14048/14056/1 16751/16759/1 +f 4463/4471/1 14032/14040/1 14045/14053/1 16750/16758/1 +f 14032/14040/1 14031/14039/1 14046/14054/1 14045/14053/1 +f 1250/1258/1 14041/14049/1 14044/14052/1 1251/1259/1 +f 16751/16759/1 14048/14056/1 14041/14049/1 1250/1258/1 +f 14048/14056/1 14047/14055/1 14042/14050/1 14041/14049/1 +f 14034/14042/1 14037/14045/1 14040/14048/1 14035/14043/1 +f 14079/14087/1 2140/2148/1 14037/14045/1 14034/14042/1 +f 2140/2148/1 2139/2147/1 14038/14046/1 14037/14045/1 +f 7114/7122/1 14033/14041/1 14036/14044/1 7115/7123/1 +f 1391/1399/1 14080/14088/1 14033/14041/1 7114/7122/1 +f 14080/14088/1 14079/14087/1 14034/14042/1 14033/14041/1 +f 4462/4470/1 14029/14037/1 14032/14040/1 4463/4471/1 +f 7115/7123/1 14036/14044/1 14029/14037/1 4462/4470/1 +f 14036/14044/1 14035/14043/1 14030/14038/1 14029/14037/1 +f 14022/14030/1 14025/14033/1 14028/14036/1 14023/14031/1 +f 14427/14435/1 2024/2032/1 14025/14033/1 14022/14030/1 +f 2024/2032/1 2023/2031/1 14026/14034/1 14025/14033/1 +f 14038/14046/1 14021/14029/1 14024/14032/1 14039/14047/1 +f 2139/2147/1 14428/14436/1 14021/14029/1 14038/14046/1 +f 14428/14436/1 14427/14435/1 14022/14030/1 14021/14029/1 +f 2154/2162/1 14017/14025/1 14020/14028/1 2155/2163/1 +f 14039/14047/1 14024/14032/1 14017/14025/1 2154/2162/1 +f 14024/14032/1 14023/14031/1 14018/14026/1 14017/14025/1 +f 14010/14018/1 14013/14021/1 14016/14024/1 14011/14019/1 +f 13995/14003/1 2168/2176/1 14013/14021/1 14010/14018/1 +f 2168/2176/1 2167/2175/1 14014/14022/1 14013/14021/1 +f 14470/14478/1 14009/14017/1 14012/14020/1 14471/14479/1 +f 2183/2191/1 13996/14004/1 14009/14017/1 14470/14478/1 +f 13996/14004/1 13995/14003/1 14010/14018/1 14009/14017/1 +f 2010/2018/1 14005/14013/1 14008/14016/1 2011/2019/1 +f 14471/14479/1 14012/14020/1 14005/14013/1 2010/2018/1 +f 14012/14020/1 14011/14019/1 14006/14014/1 14005/14013/1 +f 13998/14006/1 14001/14009/1 14004/14012/1 13999/14007/1 +f 7095/7103/1 4468/4476/1 14001/14009/1 13998/14006/1 +f 4468/4476/1 4467/4475/1 14002/14010/1 14001/14009/1 +f 13954/13962/1 13997/14005/1 14000/14008/1 13955/13963/1 +f 1395/1403/1 7096/7104/1 13997/14005/1 13954/13962/1 +f 7096/7104/1 7095/7103/1 13998/14006/1 13997/14005/1 +f 2182/2190/1 13993/14001/1 13996/14004/1 2183/2191/1 +f 13955/13963/1 14000/14008/1 13993/14001/1 2182/2190/1 +f 14000/14008/1 13999/14007/1 13994/14002/1 13993/14001/1 +f 13986/13994/1 13989/13997/1 13992/14000/1 13987/13995/1 +f 16755/16763/1 1248/1256/1 13989/13997/1 13986/13994/1 +f 1248/1256/1 1247/1255/1 13990/13998/1 13989/13997/1 +f 14002/14010/1 13985/13993/1 13988/13996/1 14003/14011/1 +f 4467/4475/1 16756/16764/1 13985/13993/1 14002/14010/1 +f 16756/16764/1 16755/16763/1 13986/13994/1 13985/13993/1 +f 2166/2174/1 13981/13989/1 13984/13992/1 2167/2175/1 +f 14003/14011/1 13988/13996/1 13981/13989/1 2166/2174/1 +f 13988/13996/1 13987/13995/1 13982/13990/1 13981/13989/1 +f 13974/13982/1 13977/13985/1 13980/13988/1 13975/13983/1 +f 13959/13967/1 2180/2188/1 13977/13985/1 13974/13982/1 +f 2180/2188/1 2179/2187/1 13978/13986/1 13977/13985/1 +f 16222/16230/1 13973/13981/1 13976/13984/1 16223/16231/1 +f 3935/3943/1 13960/13968/1 13973/13981/1 16222/16230/1 +f 13960/13968/1 13959/13967/1 13974/13982/1 13973/13981/1 +f 1426/1434/1 13969/13977/1 13972/13980/1 1427/1435/1 +f 16223/16231/1 13976/13984/1 13969/13977/1 1426/1434/1 +f 13976/13984/1 13975/13983/1 13970/13978/1 13969/13977/1 +f 13962/13970/1 13965/13973/1 13968/13976/1 13963/13971/1 +f 8427/8435/1 4024/4032/1 13965/13973/1 13962/13970/1 +f 4024/4032/1 4023/4031/1 13966/13974/1 13965/13973/1 +f 8698/8706/1 13961/13969/1 13964/13972/1 8699/8707/1 +f 1243/1251/1 8428/8436/1 13961/13969/1 8698/8706/1 +f 8428/8436/1 8427/8435/1 13962/13970/1 13961/13969/1 +f 3934/3942/1 13957/13965/1 13960/13968/1 3935/3943/1 +f 8699/8707/1 13964/13972/1 13957/13965/1 3934/3942/1 +f 13964/13972/1 13963/13971/1 13958/13966/1 13957/13965/1 +f 13950/13958/1 13953/13961/1 13956/13964/1 13951/13959/1 +f 16311/16319/1 1396/1404/1 13953/13961/1 13950/13958/1 +f 1396/1404/1 1395/1403/1 13954/13962/1 13953/13961/1 +f 13966/13974/1 13949/13957/1 13952/13960/1 13967/13975/1 +f 4023/4031/1 16312/16320/1 13949/13957/1 13966/13974/1 +f 16312/16320/1 16311/16319/1 13950/13958/1 13949/13957/1 +f 2178/2186/1 13945/13953/1 13948/13956/1 2179/2187/1 +f 13967/13975/1 13952/13960/1 13945/13953/1 2178/2186/1 +f 13952/13960/1 13951/13959/1 13946/13954/1 13945/13953/1 +f 13938/13946/1 13941/13949/1 13944/13952/1 13939/13947/1 +f 13923/13931/1 2192/2200/1 13941/13949/1 13938/13946/1 +f 2192/2200/1 2191/2199/1 13942/13950/1 13941/13949/1 +f 16786/16794/1 13937/13945/1 13940/13948/1 16787/16795/1 +f 4499/4507/1 13924/13932/1 13937/13945/1 16786/16794/1 +f 13924/13932/1 13923/13931/1 13938/13946/1 13937/13945/1 +f 1238/1246/1 13933/13941/1 13936/13944/1 1239/1247/1 +f 16787/16795/1 13940/13948/1 13933/13941/1 1238/1246/1 +f 13940/13948/1 13939/13947/1 13934/13942/1 13933/13941/1 +f 13926/13934/1 13929/13937/1 13932/13940/1 13927/13935/1 +f 13971/13979/1 2176/2184/1 13929/13937/1 13926/13934/1 +f 2176/2184/1 2175/2183/1 13930/13938/1 13929/13937/1 +f 7006/7014/1 13925/13933/1 13928/13936/1 7007/7015/1 +f 1427/1435/1 13972/13980/1 13925/13933/1 7006/7014/1 +f 13972/13980/1 13971/13979/1 13926/13934/1 13925/13933/1 +f 4498/4506/1 13921/13929/1 13924/13932/1 4499/4507/1 +f 7007/7015/1 13928/13936/1 13921/13929/1 4498/4506/1 +f 13928/13936/1 13927/13935/1 13922/13930/1 13921/13929/1 +f 13914/13922/1 13917/13925/1 13920/13928/1 13915/13923/1 +f 14463/14471/1 2012/2020/1 13917/13925/1 13914/13922/1 +f 2012/2020/1 2011/2019/1 13918/13926/1 13917/13925/1 +f 13930/13938/1 13913/13921/1 13916/13924/1 13931/13939/1 +f 2175/2183/1 14464/14472/1 13913/13921/1 13930/13938/1 +f 14464/14472/1 14463/14471/1 13914/13922/1 13913/13921/1 +f 2190/2198/1 13909/13917/1 13912/13920/1 2191/2199/1 +f 13931/13939/1 13916/13924/1 13909/13917/1 2190/2198/1 +f 13916/13924/1 13915/13923/1 13910/13918/1 13909/13917/1 +f 13902/13910/1 13905/13913/1 13908/13916/1 13903/13911/1 +f 13887/13895/1 2204/2212/1 13905/13913/1 13902/13910/1 +f 2204/2212/1 2203/2211/1 13906/13914/1 13905/13913/1 +f 14506/14514/1 13901/13909/1 13904/13912/1 14507/14515/1 +f 2219/2227/1 13888/13896/1 13901/13909/1 14506/14514/1 +f 13888/13896/1 13887/13895/1 13902/13910/1 13901/13909/1 +f 1998/2006/1 13897/13905/1 13900/13908/1 1999/2007/1 +f 14507/14515/1 13904/13912/1 13897/13905/1 1998/2006/1 +f 13904/13912/1 13903/13911/1 13898/13906/1 13897/13905/1 +f 13890/13898/1 13893/13901/1 13896/13904/1 13891/13899/1 +f 6987/6995/1 4504/4512/1 13893/13901/1 13890/13898/1 +f 4504/4512/1 4503/4511/1 13894/13902/1 13893/13901/1 +f 13846/13854/1 13889/13897/1 13892/13900/1 13847/13855/1 +f 1431/1439/1 6988/6996/1 13889/13897/1 13846/13854/1 +f 6988/6996/1 6987/6995/1 13890/13898/1 13889/13897/1 +f 2218/2226/1 13885/13893/1 13888/13896/1 2219/2227/1 +f 13847/13855/1 13892/13900/1 13885/13893/1 2218/2226/1 +f 13892/13900/1 13891/13899/1 13886/13894/1 13885/13893/1 +f 13878/13886/1 13881/13889/1 13884/13892/1 13879/13887/1 +f 16791/16799/1 1236/1244/1 13881/13889/1 13878/13886/1 +f 1236/1244/1 1235/1243/1 13882/13890/1 13881/13889/1 +f 13894/13902/1 13877/13885/1 13880/13888/1 13895/13903/1 +f 4503/4511/1 16792/16800/1 13877/13885/1 13894/13902/1 +f 16792/16800/1 16791/16799/1 13878/13886/1 13877/13885/1 +f 2202/2210/1 13873/13881/1 13876/13884/1 2203/2211/1 +f 13895/13903/1 13880/13888/1 13873/13881/1 2202/2210/1 +f 13880/13888/1 13879/13887/1 13874/13882/1 13873/13881/1 +f 13866/13874/1 13869/13877/1 13872/13880/1 13867/13875/1 +f 13851/13859/1 2216/2224/1 13869/13877/1 13866/13874/1 +f 2216/2224/1 2215/2223/1 13870/13878/1 13869/13877/1 +f 16114/16122/1 13865/13873/1 13868/13876/1 16115/16123/1 +f 3827/3835/1 13852/13860/1 13865/13873/1 16114/16122/1 +f 13852/13860/1 13851/13859/1 13866/13874/1 13865/13873/1 +f 1462/1470/1 13861/13869/1 13864/13872/1 1463/1471/1 +f 16115/16123/1 13868/13876/1 13861/13869/1 1462/1470/1 +f 13868/13876/1 13867/13875/1 13862/13870/1 13861/13869/1 +f 13854/13862/1 13857/13865/1 13860/13868/1 13855/13863/1 +f 8751/8759/1 3916/3924/1 13857/13865/1 13854/13862/1 +f 3916/3924/1 3915/3923/1 13858/13866/1 13857/13865/1 +f 9022/9030/1 13853/13861/1 13856/13864/1 9023/9031/1 +f 1231/1239/1 8752/8760/1 13853/13861/1 9022/9030/1 +f 8752/8760/1 8751/8759/1 13854/13862/1 13853/13861/1 +f 3826/3834/1 13849/13857/1 13852/13860/1 3827/3835/1 +f 9023/9031/1 13856/13864/1 13849/13857/1 3826/3834/1 +f 13856/13864/1 13855/13863/1 13850/13858/1 13849/13857/1 +f 13842/13850/1 13845/13853/1 13848/13856/1 13843/13851/1 +f 16203/16211/1 1432/1440/1 13845/13853/1 13842/13850/1 +f 1432/1440/1 1431/1439/1 13846/13854/1 13845/13853/1 +f 13858/13866/1 13841/13849/1 13844/13852/1 13859/13867/1 +f 3915/3923/1 16204/16212/1 13841/13849/1 13858/13866/1 +f 16204/16212/1 16203/16211/1 13842/13850/1 13841/13849/1 +f 2214/2222/1 13837/13845/1 13840/13848/1 2215/2223/1 +f 13859/13867/1 13844/13852/1 13837/13845/1 2214/2222/1 +f 13844/13852/1 13843/13851/1 13838/13846/1 13837/13845/1 +f 13830/13838/1 13833/13841/1 13836/13844/1 13831/13839/1 +f 13815/13823/1 2228/2236/1 13833/13841/1 13830/13838/1 +f 2228/2236/1 2227/2235/1 13834/13842/1 13833/13841/1 +f 16822/16830/1 13829/13837/1 13832/13840/1 16823/16831/1 +f 4535/4543/1 13816/13824/1 13829/13837/1 16822/16830/1 +f 13816/13824/1 13815/13823/1 13830/13838/1 13829/13837/1 +f 1226/1234/1 13825/13833/1 13828/13836/1 1227/1235/1 +f 16823/16831/1 13832/13840/1 13825/13833/1 1226/1234/1 +f 13832/13840/1 13831/13839/1 13826/13834/1 13825/13833/1 +f 13818/13826/1 13821/13829/1 13824/13832/1 13819/13827/1 +f 13863/13871/1 2212/2220/1 13821/13829/1 13818/13826/1 +f 2212/2220/1 2211/2219/1 13822/13830/1 13821/13829/1 +f 6898/6906/1 13817/13825/1 13820/13828/1 6899/6907/1 +f 1463/1471/1 13864/13872/1 13817/13825/1 6898/6906/1 +f 13864/13872/1 13863/13871/1 13818/13826/1 13817/13825/1 +f 4534/4542/1 13813/13821/1 13816/13824/1 4535/4543/1 +f 6899/6907/1 13820/13828/1 13813/13821/1 4534/4542/1 +f 13820/13828/1 13819/13827/1 13814/13822/1 13813/13821/1 +f 13806/13814/1 13809/13817/1 13812/13820/1 13807/13815/1 +f 14499/14507/1 2000/2008/1 13809/13817/1 13806/13814/1 +f 2000/2008/1 1999/2007/1 13810/13818/1 13809/13817/1 +f 13822/13830/1 13805/13813/1 13808/13816/1 13823/13831/1 +f 2211/2219/1 14500/14508/1 13805/13813/1 13822/13830/1 +f 14500/14508/1 14499/14507/1 13806/13814/1 13805/13813/1 +f 2226/2234/1 13801/13809/1 13804/13812/1 2227/2235/1 +f 13823/13831/1 13808/13816/1 13801/13809/1 2226/2234/1 +f 13808/13816/1 13807/13815/1 13802/13810/1 13801/13809/1 +f 13794/13802/1 13797/13805/1 13800/13808/1 13795/13803/1 +f 13779/13787/1 2240/2248/1 13797/13805/1 13794/13802/1 +f 2240/2248/1 2239/2247/1 13798/13806/1 13797/13805/1 +f 14542/14550/1 13793/13801/1 13796/13804/1 14543/14551/1 +f 2255/2263/1 13780/13788/1 13793/13801/1 14542/14550/1 +f 13780/13788/1 13779/13787/1 13794/13802/1 13793/13801/1 +f 1986/1994/1 13789/13797/1 13792/13800/1 1987/1995/1 +f 14543/14551/1 13796/13804/1 13789/13797/1 1986/1994/1 +f 13796/13804/1 13795/13803/1 13790/13798/1 13789/13797/1 +f 13782/13790/1 13785/13793/1 13788/13796/1 13783/13791/1 +f 6879/6887/1 4540/4548/1 13785/13793/1 13782/13790/1 +f 4540/4548/1 4539/4547/1 13786/13794/1 13785/13793/1 +f 13738/13746/1 13781/13789/1 13784/13792/1 13739/13747/1 +f 1467/1475/1 6880/6888/1 13781/13789/1 13738/13746/1 +f 6880/6888/1 6879/6887/1 13782/13790/1 13781/13789/1 +f 2254/2262/1 13777/13785/1 13780/13788/1 2255/2263/1 +f 13739/13747/1 13784/13792/1 13777/13785/1 2254/2262/1 +f 13784/13792/1 13783/13791/1 13778/13786/1 13777/13785/1 +f 13770/13778/1 13773/13781/1 13776/13784/1 13771/13779/1 +f 16827/16835/1 1224/1232/1 13773/13781/1 13770/13778/1 +f 1224/1232/1 1223/1231/1 13774/13782/1 13773/13781/1 +f 13786/13794/1 13769/13777/1 13772/13780/1 13787/13795/1 +f 4539/4547/1 16828/16836/1 13769/13777/1 13786/13794/1 +f 16828/16836/1 16827/16835/1 13770/13778/1 13769/13777/1 +f 2238/2246/1 13765/13773/1 13768/13776/1 2239/2247/1 +f 13787/13795/1 13772/13780/1 13765/13773/1 2238/2246/1 +f 13772/13780/1 13771/13779/1 13766/13774/1 13765/13773/1 +f 13758/13766/1 13761/13769/1 13764/13772/1 13759/13767/1 +f 13743/13751/1 2252/2260/1 13761/13769/1 13758/13766/1 +f 2252/2260/1 2251/2259/1 13762/13770/1 13761/13769/1 +f 16006/16014/1 13757/13765/1 13760/13768/1 16007/16015/1 +f 3719/3727/1 13744/13752/1 13757/13765/1 16006/16014/1 +f 13744/13752/1 13743/13751/1 13758/13766/1 13757/13765/1 +f 1498/1506/1 13753/13761/1 13756/13764/1 1499/1507/1 +f 16007/16015/1 13760/13768/1 13753/13761/1 1498/1506/1 +f 13760/13768/1 13759/13767/1 13754/13762/1 13753/13761/1 +f 13746/13754/1 13749/13757/1 13752/13760/1 13747/13755/1 +f 9075/9083/1 3808/3816/1 13749/13757/1 13746/13754/1 +f 3808/3816/1 3807/3815/1 13750/13758/1 13749/13757/1 +f 9346/9354/1 13745/13753/1 13748/13756/1 9347/9355/1 +f 1219/1227/1 9076/9084/1 13745/13753/1 9346/9354/1 +f 9076/9084/1 9075/9083/1 13746/13754/1 13745/13753/1 +f 3718/3726/1 13741/13749/1 13744/13752/1 3719/3727/1 +f 9347/9355/1 13748/13756/1 13741/13749/1 3718/3726/1 +f 13748/13756/1 13747/13755/1 13742/13750/1 13741/13749/1 +f 13734/13742/1 13737/13745/1 13740/13748/1 13735/13743/1 +f 16095/16103/1 1468/1476/1 13737/13745/1 13734/13742/1 +f 1468/1476/1 1467/1475/1 13738/13746/1 13737/13745/1 +f 13750/13758/1 13733/13741/1 13736/13744/1 13751/13759/1 +f 3807/3815/1 16096/16104/1 13733/13741/1 13750/13758/1 +f 16096/16104/1 16095/16103/1 13734/13742/1 13733/13741/1 +f 2250/2258/1 13729/13737/1 13732/13740/1 2251/2259/1 +f 13751/13759/1 13736/13744/1 13729/13737/1 2250/2258/1 +f 13736/13744/1 13735/13743/1 13730/13738/1 13729/13737/1 +f 13722/13730/1 13725/13733/1 13728/13736/1 13723/13731/1 +f 13707/13715/1 2264/2272/1 13725/13733/1 13722/13730/1 +f 2264/2272/1 2263/2271/1 13726/13734/1 13725/13733/1 +f 16858/16866/1 13721/13729/1 13724/13732/1 16859/16867/1 +f 4571/4579/1 13708/13716/1 13721/13729/1 16858/16866/1 +f 13708/13716/1 13707/13715/1 13722/13730/1 13721/13729/1 +f 1214/1222/1 13717/13725/1 13720/13728/1 1215/1223/1 +f 16859/16867/1 13724/13732/1 13717/13725/1 1214/1222/1 +f 13724/13732/1 13723/13731/1 13718/13726/1 13717/13725/1 +f 13710/13718/1 13713/13721/1 13716/13724/1 13711/13719/1 +f 13755/13763/1 2248/2256/1 13713/13721/1 13710/13718/1 +f 2248/2256/1 2247/2255/1 13714/13722/1 13713/13721/1 +f 6790/6798/1 13709/13717/1 13712/13720/1 6791/6799/1 +f 1499/1507/1 13756/13764/1 13709/13717/1 6790/6798/1 +f 13756/13764/1 13755/13763/1 13710/13718/1 13709/13717/1 +f 4570/4578/1 13705/13713/1 13708/13716/1 4571/4579/1 +f 6791/6799/1 13712/13720/1 13705/13713/1 4570/4578/1 +f 13712/13720/1 13711/13719/1 13706/13714/1 13705/13713/1 +f 13698/13706/1 13701/13709/1 13704/13712/1 13699/13707/1 +f 14535/14543/1 1988/1996/1 13701/13709/1 13698/13706/1 +f 1988/1996/1 1987/1995/1 13702/13710/1 13701/13709/1 +f 13714/13722/1 13697/13705/1 13700/13708/1 13715/13723/1 +f 2247/2255/1 14536/14544/1 13697/13705/1 13714/13722/1 +f 14536/14544/1 14535/14543/1 13698/13706/1 13697/13705/1 +f 2262/2270/1 13693/13701/1 13696/13704/1 2263/2271/1 +f 13715/13723/1 13700/13708/1 13693/13701/1 2262/2270/1 +f 13700/13708/1 13699/13707/1 13694/13702/1 13693/13701/1 +f 13686/13694/1 13689/13697/1 13692/13700/1 13687/13695/1 +f 13671/13679/1 2276/2284/1 13689/13697/1 13686/13694/1 +f 2276/2284/1 2275/2283/1 13690/13698/1 13689/13697/1 +f 14578/14586/1 13685/13693/1 13688/13696/1 14579/14587/1 +f 2291/2299/1 13672/13680/1 13685/13693/1 14578/14586/1 +f 13672/13680/1 13671/13679/1 13686/13694/1 13685/13693/1 +f 1974/1982/1 13681/13689/1 13684/13692/1 1975/1983/1 +f 14579/14587/1 13688/13696/1 13681/13689/1 1974/1982/1 +f 13688/13696/1 13687/13695/1 13682/13690/1 13681/13689/1 +f 13674/13682/1 13677/13685/1 13680/13688/1 13675/13683/1 +f 6771/6779/1 4576/4584/1 13677/13685/1 13674/13682/1 +f 4576/4584/1 4575/4583/1 13678/13686/1 13677/13685/1 +f 13630/13638/1 13673/13681/1 13676/13684/1 13631/13639/1 +f 1503/1511/1 6772/6780/1 13673/13681/1 13630/13638/1 +f 6772/6780/1 6771/6779/1 13674/13682/1 13673/13681/1 +f 2290/2298/1 13669/13677/1 13672/13680/1 2291/2299/1 +f 13631/13639/1 13676/13684/1 13669/13677/1 2290/2298/1 +f 13676/13684/1 13675/13683/1 13670/13678/1 13669/13677/1 +f 13662/13670/1 13665/13673/1 13668/13676/1 13663/13671/1 +f 16863/16871/1 1212/1220/1 13665/13673/1 13662/13670/1 +f 1212/1220/1 1211/1219/1 13666/13674/1 13665/13673/1 +f 13678/13686/1 13661/13669/1 13664/13672/1 13679/13687/1 +f 4575/4583/1 16864/16872/1 13661/13669/1 13678/13686/1 +f 16864/16872/1 16863/16871/1 13662/13670/1 13661/13669/1 +f 2274/2282/1 13657/13665/1 13660/13668/1 2275/2283/1 +f 13679/13687/1 13664/13672/1 13657/13665/1 2274/2282/1 +f 13664/13672/1 13663/13671/1 13658/13666/1 13657/13665/1 +f 13650/13658/1 13653/13661/1 13656/13664/1 13651/13659/1 +f 13635/13643/1 2288/2296/1 13653/13661/1 13650/13658/1 +f 2288/2296/1 2287/2295/1 13654/13662/1 13653/13661/1 +f 15898/15906/1 13649/13657/1 13652/13660/1 15899/15907/1 +f 3611/3619/1 13636/13644/1 13649/13657/1 15898/15906/1 +f 13636/13644/1 13635/13643/1 13650/13658/1 13649/13657/1 +f 1534/1542/1 13645/13653/1 13648/13656/1 1535/1543/1 +f 15899/15907/1 13652/13660/1 13645/13653/1 1534/1542/1 +f 13652/13660/1 13651/13659/1 13646/13654/1 13645/13653/1 +f 13638/13646/1 13641/13649/1 13644/13652/1 13639/13647/1 +f 9399/9407/1 3700/3708/1 13641/13649/1 13638/13646/1 +f 3700/3708/1 3699/3707/1 13642/13650/1 13641/13649/1 +f 9670/9678/1 13637/13645/1 13640/13648/1 9671/9679/1 +f 1207/1215/1 9400/9408/1 13637/13645/1 9670/9678/1 +f 9400/9408/1 9399/9407/1 13638/13646/1 13637/13645/1 +f 3610/3618/1 13633/13641/1 13636/13644/1 3611/3619/1 +f 9671/9679/1 13640/13648/1 13633/13641/1 3610/3618/1 +f 13640/13648/1 13639/13647/1 13634/13642/1 13633/13641/1 +f 13626/13634/1 13629/13637/1 13632/13640/1 13627/13635/1 +f 15987/15995/1 1504/1512/1 13629/13637/1 13626/13634/1 +f 1504/1512/1 1503/1511/1 13630/13638/1 13629/13637/1 +f 13642/13650/1 13625/13633/1 13628/13636/1 13643/13651/1 +f 3699/3707/1 15988/15996/1 13625/13633/1 13642/13650/1 +f 15988/15996/1 15987/15995/1 13626/13634/1 13625/13633/1 +f 2286/2294/1 13621/13629/1 13624/13632/1 2287/2295/1 +f 13643/13651/1 13628/13636/1 13621/13629/1 2286/2294/1 +f 13628/13636/1 13627/13635/1 13622/13630/1 13621/13629/1 +f 13614/13622/1 13617/13625/1 13620/13628/1 13615/13623/1 +f 13599/13607/1 2300/2308/1 13617/13625/1 13614/13622/1 +f 2300/2308/1 2299/2307/1 13618/13626/1 13617/13625/1 +f 16894/16902/1 13613/13621/1 13616/13624/1 16895/16903/1 +f 4607/4615/1 13600/13608/1 13613/13621/1 16894/16902/1 +f 13600/13608/1 13599/13607/1 13614/13622/1 13613/13621/1 +f 1202/1210/1 13609/13617/1 13612/13620/1 1203/1211/1 +f 16895/16903/1 13616/13624/1 13609/13617/1 1202/1210/1 +f 13616/13624/1 13615/13623/1 13610/13618/1 13609/13617/1 +f 13602/13610/1 13605/13613/1 13608/13616/1 13603/13611/1 +f 13647/13655/1 2284/2292/1 13605/13613/1 13602/13610/1 +f 2284/2292/1 2283/2291/1 13606/13614/1 13605/13613/1 +f 6682/6690/1 13601/13609/1 13604/13612/1 6683/6691/1 +f 1535/1543/1 13648/13656/1 13601/13609/1 6682/6690/1 +f 13648/13656/1 13647/13655/1 13602/13610/1 13601/13609/1 +f 4606/4614/1 13597/13605/1 13600/13608/1 4607/4615/1 +f 6683/6691/1 13604/13612/1 13597/13605/1 4606/4614/1 +f 13604/13612/1 13603/13611/1 13598/13606/1 13597/13605/1 +f 13590/13598/1 13593/13601/1 13596/13604/1 13591/13599/1 +f 14571/14579/1 1976/1984/1 13593/13601/1 13590/13598/1 +f 1976/1984/1 1975/1983/1 13594/13602/1 13593/13601/1 +f 13606/13614/1 13589/13597/1 13592/13600/1 13607/13615/1 +f 2283/2291/1 14572/14580/1 13589/13597/1 13606/13614/1 +f 14572/14580/1 14571/14579/1 13590/13598/1 13589/13597/1 +f 2298/2306/1 13585/13593/1 13588/13596/1 2299/2307/1 +f 13607/13615/1 13592/13600/1 13585/13593/1 2298/2306/1 +f 13592/13600/1 13591/13599/1 13586/13594/1 13585/13593/1 +f 13578/13586/1 13581/13589/1 13584/13592/1 13579/13587/1 +f 13563/13571/1 2312/2320/1 13581/13589/1 13578/13586/1 +f 2312/2320/1 2311/2319/1 13582/13590/1 13581/13589/1 +f 14614/14622/1 13577/13585/1 13580/13588/1 14615/14623/1 +f 2327/2335/1 13564/13572/1 13577/13585/1 14614/14622/1 +f 13564/13572/1 13563/13571/1 13578/13586/1 13577/13585/1 +f 1962/1970/1 13573/13581/1 13576/13584/1 1963/1971/1 +f 14615/14623/1 13580/13588/1 13573/13581/1 1962/1970/1 +f 13580/13588/1 13579/13587/1 13574/13582/1 13573/13581/1 +f 13566/13574/1 13569/13577/1 13572/13580/1 13567/13575/1 +f 6663/6671/1 4612/4620/1 13569/13577/1 13566/13574/1 +f 4612/4620/1 4611/4619/1 13570/13578/1 13569/13577/1 +f 13522/13530/1 13565/13573/1 13568/13576/1 13523/13531/1 +f 1539/1547/1 6664/6672/1 13565/13573/1 13522/13530/1 +f 6664/6672/1 6663/6671/1 13566/13574/1 13565/13573/1 +f 2326/2334/1 13561/13569/1 13564/13572/1 2327/2335/1 +f 13523/13531/1 13568/13576/1 13561/13569/1 2326/2334/1 +f 13568/13576/1 13567/13575/1 13562/13570/1 13561/13569/1 +f 13554/13562/1 13557/13565/1 13560/13568/1 13555/13563/1 +f 16899/16907/1 1200/1208/1 13557/13565/1 13554/13562/1 +f 1200/1208/1 1199/1207/1 13558/13566/1 13557/13565/1 +f 13570/13578/1 13553/13561/1 13556/13564/1 13571/13579/1 +f 4611/4619/1 16900/16908/1 13553/13561/1 13570/13578/1 +f 16900/16908/1 16899/16907/1 13554/13562/1 13553/13561/1 +f 2310/2318/1 13549/13557/1 13552/13560/1 2311/2319/1 +f 13571/13579/1 13556/13564/1 13549/13557/1 2310/2318/1 +f 13556/13564/1 13555/13563/1 13550/13558/1 13549/13557/1 +f 13542/13550/1 13545/13553/1 13548/13556/1 13543/13551/1 +f 13527/13535/1 2324/2332/1 13545/13553/1 13542/13550/1 +f 2324/2332/1 2323/2331/1 13546/13554/1 13545/13553/1 +f 15790/15798/1 13541/13549/1 13544/13552/1 15791/15799/1 +f 3503/3511/1 13528/13536/1 13541/13549/1 15790/15798/1 +f 13528/13536/1 13527/13535/1 13542/13550/1 13541/13549/1 +f 1570/1578/1 13537/13545/1 13540/13548/1 1571/1579/1 +f 15791/15799/1 13544/13552/1 13537/13545/1 1570/1578/1 +f 13544/13552/1 13543/13551/1 13538/13546/1 13537/13545/1 +f 13530/13538/1 13533/13541/1 13536/13544/1 13531/13539/1 +f 9723/9731/1 3592/3600/1 13533/13541/1 13530/13538/1 +f 3592/3600/1 3591/3599/1 13534/13542/1 13533/13541/1 +f 9994/10002/1 13529/13537/1 13532/13540/1 9995/10003/1 +f 1195/1203/1 9724/9732/1 13529/13537/1 9994/10002/1 +f 9724/9732/1 9723/9731/1 13530/13538/1 13529/13537/1 +f 3502/3510/1 13525/13533/1 13528/13536/1 3503/3511/1 +f 9995/10003/1 13532/13540/1 13525/13533/1 3502/3510/1 +f 13532/13540/1 13531/13539/1 13526/13534/1 13525/13533/1 +f 13518/13526/1 13521/13529/1 13524/13532/1 13519/13527/1 +f 15879/15887/1 1540/1548/1 13521/13529/1 13518/13526/1 +f 1540/1548/1 1539/1547/1 13522/13530/1 13521/13529/1 +f 13534/13542/1 13517/13525/1 13520/13528/1 13535/13543/1 +f 3591/3599/1 15880/15888/1 13517/13525/1 13534/13542/1 +f 15880/15888/1 15879/15887/1 13518/13526/1 13517/13525/1 +f 2322/2330/1 13513/13521/1 13516/13524/1 2323/2331/1 +f 13535/13543/1 13520/13528/1 13513/13521/1 2322/2330/1 +f 13520/13528/1 13519/13527/1 13514/13522/1 13513/13521/1 +f 13506/13514/1 13509/13517/1 13512/13520/1 13507/13515/1 +f 13491/13499/1 2336/2344/1 13509/13517/1 13506/13514/1 +f 2336/2344/1 2335/2343/1 13510/13518/1 13509/13517/1 +f 16930/16938/1 13505/13513/1 13508/13516/1 16931/16939/1 +f 4643/4651/1 13492/13500/1 13505/13513/1 16930/16938/1 +f 13492/13500/1 13491/13499/1 13506/13514/1 13505/13513/1 +f 1190/1198/1 13501/13509/1 13504/13512/1 1191/1199/1 +f 16931/16939/1 13508/13516/1 13501/13509/1 1190/1198/1 +f 13508/13516/1 13507/13515/1 13502/13510/1 13501/13509/1 +f 13494/13502/1 13497/13505/1 13500/13508/1 13495/13503/1 +f 13539/13547/1 2320/2328/1 13497/13505/1 13494/13502/1 +f 2320/2328/1 2319/2327/1 13498/13506/1 13497/13505/1 +f 6574/6582/1 13493/13501/1 13496/13504/1 6575/6583/1 +f 1571/1579/1 13540/13548/1 13493/13501/1 6574/6582/1 +f 13540/13548/1 13539/13547/1 13494/13502/1 13493/13501/1 +f 4642/4650/1 13489/13497/1 13492/13500/1 4643/4651/1 +f 6575/6583/1 13496/13504/1 13489/13497/1 4642/4650/1 +f 13496/13504/1 13495/13503/1 13490/13498/1 13489/13497/1 +f 13482/13490/1 13485/13493/1 13488/13496/1 13483/13491/1 +f 14607/14615/1 1964/1972/1 13485/13493/1 13482/13490/1 +f 1964/1972/1 1963/1971/1 13486/13494/1 13485/13493/1 +f 13498/13506/1 13481/13489/1 13484/13492/1 13499/13507/1 +f 2319/2327/1 14608/14616/1 13481/13489/1 13498/13506/1 +f 14608/14616/1 14607/14615/1 13482/13490/1 13481/13489/1 +f 2334/2342/1 13477/13485/1 13480/13488/1 2335/2343/1 +f 13499/13507/1 13484/13492/1 13477/13485/1 2334/2342/1 +f 13484/13492/1 13483/13491/1 13478/13486/1 13477/13485/1 +f 13470/13478/1 13473/13481/1 13476/13484/1 13471/13479/1 +f 13455/13463/1 2348/2356/1 13473/13481/1 13470/13478/1 +f 2348/2356/1 2347/2355/1 13474/13482/1 13473/13481/1 +f 14650/14658/1 13469/13477/1 13472/13480/1 14651/14659/1 +f 2363/2371/1 13456/13464/1 13469/13477/1 14650/14658/1 +f 13456/13464/1 13455/13463/1 13470/13478/1 13469/13477/1 +f 1950/1958/1 13465/13473/1 13468/13476/1 1951/1959/1 +f 14651/14659/1 13472/13480/1 13465/13473/1 1950/1958/1 +f 13472/13480/1 13471/13479/1 13466/13474/1 13465/13473/1 +f 13458/13466/1 13461/13469/1 13464/13472/1 13459/13467/1 +f 6555/6563/1 4648/4656/1 13461/13469/1 13458/13466/1 +f 4648/4656/1 4647/4655/1 13462/13470/1 13461/13469/1 +f 13414/13422/1 13457/13465/1 13460/13468/1 13415/13423/1 +f 1575/1583/1 6556/6564/1 13457/13465/1 13414/13422/1 +f 6556/6564/1 6555/6563/1 13458/13466/1 13457/13465/1 +f 2362/2370/1 13453/13461/1 13456/13464/1 2363/2371/1 +f 13415/13423/1 13460/13468/1 13453/13461/1 2362/2370/1 +f 13460/13468/1 13459/13467/1 13454/13462/1 13453/13461/1 +f 13446/13454/1 13449/13457/1 13452/13460/1 13447/13455/1 +f 16935/16943/1 1188/1196/1 13449/13457/1 13446/13454/1 +f 1188/1196/1 1187/1195/1 13450/13458/1 13449/13457/1 +f 13462/13470/1 13445/13453/1 13448/13456/1 13463/13471/1 +f 4647/4655/1 16936/16944/1 13445/13453/1 13462/13470/1 +f 16936/16944/1 16935/16943/1 13446/13454/1 13445/13453/1 +f 2346/2354/1 13441/13449/1 13444/13452/1 2347/2355/1 +f 13463/13471/1 13448/13456/1 13441/13449/1 2346/2354/1 +f 13448/13456/1 13447/13455/1 13442/13450/1 13441/13449/1 +f 13434/13442/1 13437/13445/1 13440/13448/1 13435/13443/1 +f 13419/13427/1 2360/2368/1 13437/13445/1 13434/13442/1 +f 2360/2368/1 2359/2367/1 13438/13446/1 13437/13445/1 +f 15682/15690/1 13433/13441/1 13436/13444/1 15683/15691/1 +f 3395/3403/1 13420/13428/1 13433/13441/1 15682/15690/1 +f 13420/13428/1 13419/13427/1 13434/13442/1 13433/13441/1 +f 1606/1614/1 13429/13437/1 13432/13440/1 1607/1615/1 +f 15683/15691/1 13436/13444/1 13429/13437/1 1606/1614/1 +f 13436/13444/1 13435/13443/1 13430/13438/1 13429/13437/1 +f 13422/13430/1 13425/13433/1 13428/13436/1 13423/13431/1 +f 10047/10055/1 3484/3492/1 13425/13433/1 13422/13430/1 +f 3484/3492/1 3483/3491/1 13426/13434/1 13425/13433/1 +f 10318/10326/1 13421/13429/1 13424/13432/1 10319/10327/1 +f 1183/1191/1 10048/10056/1 13421/13429/1 10318/10326/1 +f 10048/10056/1 10047/10055/1 13422/13430/1 13421/13429/1 +f 3394/3402/1 13417/13425/1 13420/13428/1 3395/3403/1 +f 10319/10327/1 13424/13432/1 13417/13425/1 3394/3402/1 +f 13424/13432/1 13423/13431/1 13418/13426/1 13417/13425/1 +f 13410/13418/1 13413/13421/1 13416/13424/1 13411/13419/1 +f 15771/15779/1 1576/1584/1 13413/13421/1 13410/13418/1 +f 1576/1584/1 1575/1583/1 13414/13422/1 13413/13421/1 +f 13426/13434/1 13409/13417/1 13412/13420/1 13427/13435/1 +f 3483/3491/1 15772/15780/1 13409/13417/1 13426/13434/1 +f 15772/15780/1 15771/15779/1 13410/13418/1 13409/13417/1 +f 2358/2366/1 13405/13413/1 13408/13416/1 2359/2367/1 +f 13427/13435/1 13412/13420/1 13405/13413/1 2358/2366/1 +f 13412/13420/1 13411/13419/1 13406/13414/1 13405/13413/1 +f 13398/13406/1 13401/13409/1 13404/13412/1 13399/13407/1 +f 13383/13391/1 2372/2380/1 13401/13409/1 13398/13406/1 +f 2372/2380/1 2371/2379/1 13402/13410/1 13401/13409/1 +f 16966/16974/1 13397/13405/1 13400/13408/1 16967/16975/1 +f 4679/4687/1 13384/13392/1 13397/13405/1 16966/16974/1 +f 13384/13392/1 13383/13391/1 13398/13406/1 13397/13405/1 +f 1178/1186/1 13393/13401/1 13396/13404/1 1179/1187/1 +f 16967/16975/1 13400/13408/1 13393/13401/1 1178/1186/1 +f 13400/13408/1 13399/13407/1 13394/13402/1 13393/13401/1 +f 13386/13394/1 13389/13397/1 13392/13400/1 13387/13395/1 +f 13431/13439/1 2356/2364/1 13389/13397/1 13386/13394/1 +f 2356/2364/1 2355/2363/1 13390/13398/1 13389/13397/1 +f 6466/6474/1 13385/13393/1 13388/13396/1 6467/6475/1 +f 1607/1615/1 13432/13440/1 13385/13393/1 6466/6474/1 +f 13432/13440/1 13431/13439/1 13386/13394/1 13385/13393/1 +f 4678/4686/1 13381/13389/1 13384/13392/1 4679/4687/1 +f 6467/6475/1 13388/13396/1 13381/13389/1 4678/4686/1 +f 13388/13396/1 13387/13395/1 13382/13390/1 13381/13389/1 +f 13374/13382/1 13377/13385/1 13380/13388/1 13375/13383/1 +f 14643/14651/1 1952/1960/1 13377/13385/1 13374/13382/1 +f 1952/1960/1 1951/1959/1 13378/13386/1 13377/13385/1 +f 13390/13398/1 13373/13381/1 13376/13384/1 13391/13399/1 +f 2355/2363/1 14644/14652/1 13373/13381/1 13390/13398/1 +f 14644/14652/1 14643/14651/1 13374/13382/1 13373/13381/1 +f 2370/2378/1 13369/13377/1 13372/13380/1 2371/2379/1 +f 13391/13399/1 13376/13384/1 13369/13377/1 2370/2378/1 +f 13376/13384/1 13375/13383/1 13370/13378/1 13369/13377/1 +f 13362/13370/1 13365/13373/1 13368/13376/1 13363/13371/1 +f 13347/13355/1 2384/2392/1 13365/13373/1 13362/13370/1 +f 2384/2392/1 2383/2391/1 13366/13374/1 13365/13373/1 +f 14686/14694/1 13361/13369/1 13364/13372/1 14687/14695/1 +f 2399/2407/1 13348/13356/1 13361/13369/1 14686/14694/1 +f 13348/13356/1 13347/13355/1 13362/13370/1 13361/13369/1 +f 1938/1946/1 13357/13365/1 13360/13368/1 1939/1947/1 +f 14687/14695/1 13364/13372/1 13357/13365/1 1938/1946/1 +f 13364/13372/1 13363/13371/1 13358/13366/1 13357/13365/1 +f 13350/13358/1 13353/13361/1 13356/13364/1 13351/13359/1 +f 6447/6455/1 4684/4692/1 13353/13361/1 13350/13358/1 +f 4684/4692/1 4683/4691/1 13354/13362/1 13353/13361/1 +f 13306/13314/1 13349/13357/1 13352/13360/1 13307/13315/1 +f 1611/1619/1 6448/6456/1 13349/13357/1 13306/13314/1 +f 6448/6456/1 6447/6455/1 13350/13358/1 13349/13357/1 +f 2398/2406/1 13345/13353/1 13348/13356/1 2399/2407/1 +f 13307/13315/1 13352/13360/1 13345/13353/1 2398/2406/1 +f 13352/13360/1 13351/13359/1 13346/13354/1 13345/13353/1 +f 13338/13346/1 13341/13349/1 13344/13352/1 13339/13347/1 +f 16971/16979/1 1176/1184/1 13341/13349/1 13338/13346/1 +f 1176/1184/1 1175/1183/1 13342/13350/1 13341/13349/1 +f 13354/13362/1 13337/13345/1 13340/13348/1 13355/13363/1 +f 4683/4691/1 16972/16980/1 13337/13345/1 13354/13362/1 +f 16972/16980/1 16971/16979/1 13338/13346/1 13337/13345/1 +f 2382/2390/1 13333/13341/1 13336/13344/1 2383/2391/1 +f 13355/13363/1 13340/13348/1 13333/13341/1 2382/2390/1 +f 13340/13348/1 13339/13347/1 13334/13342/1 13333/13341/1 +f 13326/13334/1 13329/13337/1 13332/13340/1 13327/13335/1 +f 13311/13319/1 2396/2404/1 13329/13337/1 13326/13334/1 +f 2396/2404/1 2395/2403/1 13330/13338/1 13329/13337/1 +f 15574/15582/1 13325/13333/1 13328/13336/1 15575/15583/1 +f 3287/3295/1 13312/13320/1 13325/13333/1 15574/15582/1 +f 13312/13320/1 13311/13319/1 13326/13334/1 13325/13333/1 +f 1642/1650/1 13321/13329/1 13324/13332/1 1643/1651/1 +f 15575/15583/1 13328/13336/1 13321/13329/1 1642/1650/1 +f 13328/13336/1 13327/13335/1 13322/13330/1 13321/13329/1 +f 13314/13322/1 13317/13325/1 13320/13328/1 13315/13323/1 +f 10371/10379/1 3376/3384/1 13317/13325/1 13314/13322/1 +f 3376/3384/1 3375/3383/1 13318/13326/1 13317/13325/1 +f 10642/10650/1 13313/13321/1 13316/13324/1 10643/10651/1 +f 1171/1179/1 10372/10380/1 13313/13321/1 10642/10650/1 +f 10372/10380/1 10371/10379/1 13314/13322/1 13313/13321/1 +f 3286/3294/1 13309/13317/1 13312/13320/1 3287/3295/1 +f 10643/10651/1 13316/13324/1 13309/13317/1 3286/3294/1 +f 13316/13324/1 13315/13323/1 13310/13318/1 13309/13317/1 +f 13302/13310/1 13305/13313/1 13308/13316/1 13303/13311/1 +f 15663/15671/1 1612/1620/1 13305/13313/1 13302/13310/1 +f 1612/1620/1 1611/1619/1 13306/13314/1 13305/13313/1 +f 13318/13326/1 13301/13309/1 13304/13312/1 13319/13327/1 +f 3375/3383/1 15664/15672/1 13301/13309/1 13318/13326/1 +f 15664/15672/1 15663/15671/1 13302/13310/1 13301/13309/1 +f 2394/2402/1 13297/13305/1 13300/13308/1 2395/2403/1 +f 13319/13327/1 13304/13312/1 13297/13305/1 2394/2402/1 +f 13304/13312/1 13303/13311/1 13298/13306/1 13297/13305/1 +f 13290/13298/1 13293/13301/1 13296/13304/1 13291/13299/1 +f 13275/13283/1 2408/2416/1 13293/13301/1 13290/13298/1 +f 2408/2416/1 2407/2415/1 13294/13302/1 13293/13301/1 +f 17002/17010/1 13289/13297/1 13292/13300/1 17003/17011/1 +f 4715/4723/1 13276/13284/1 13289/13297/1 17002/17010/1 +f 13276/13284/1 13275/13283/1 13290/13298/1 13289/13297/1 +f 1166/1174/1 13285/13293/1 13288/13296/1 1167/1175/1 +f 17003/17011/1 13292/13300/1 13285/13293/1 1166/1174/1 +f 13292/13300/1 13291/13299/1 13286/13294/1 13285/13293/1 +f 13278/13286/1 13281/13289/1 13284/13292/1 13279/13287/1 +f 13323/13331/1 2392/2400/1 13281/13289/1 13278/13286/1 +f 2392/2400/1 2391/2399/1 13282/13290/1 13281/13289/1 +f 6358/6366/1 13277/13285/1 13280/13288/1 6359/6367/1 +f 1643/1651/1 13324/13332/1 13277/13285/1 6358/6366/1 +f 13324/13332/1 13323/13331/1 13278/13286/1 13277/13285/1 +f 4714/4722/1 13273/13281/1 13276/13284/1 4715/4723/1 +f 6359/6367/1 13280/13288/1 13273/13281/1 4714/4722/1 +f 13280/13288/1 13279/13287/1 13274/13282/1 13273/13281/1 +f 13266/13274/1 13269/13277/1 13272/13280/1 13267/13275/1 +f 14679/14687/1 1940/1948/1 13269/13277/1 13266/13274/1 +f 1940/1948/1 1939/1947/1 13270/13278/1 13269/13277/1 +f 13282/13290/1 13265/13273/1 13268/13276/1 13283/13291/1 +f 2391/2399/1 14680/14688/1 13265/13273/1 13282/13290/1 +f 14680/14688/1 14679/14687/1 13266/13274/1 13265/13273/1 +f 2406/2414/1 13261/13269/1 13264/13272/1 2407/2415/1 +f 13283/13291/1 13268/13276/1 13261/13269/1 2406/2414/1 +f 13268/13276/1 13267/13275/1 13262/13270/1 13261/13269/1 +f 13254/13262/1 13257/13265/1 13260/13268/1 13255/13263/1 +f 13239/13247/1 2420/2428/1 13257/13265/1 13254/13262/1 +f 2420/2428/1 2419/2427/1 13258/13266/1 13257/13265/1 +f 14722/14730/1 13253/13261/1 13256/13264/1 14723/14731/1 +f 2435/2443/1 13240/13248/1 13253/13261/1 14722/14730/1 +f 13240/13248/1 13239/13247/1 13254/13262/1 13253/13261/1 +f 1926/1934/1 13249/13257/1 13252/13260/1 1927/1935/1 +f 14723/14731/1 13256/13264/1 13249/13257/1 1926/1934/1 +f 13256/13264/1 13255/13263/1 13250/13258/1 13249/13257/1 +f 13242/13250/1 13245/13253/1 13248/13256/1 13243/13251/1 +f 6339/6347/1 4720/4728/1 13245/13253/1 13242/13250/1 +f 4720/4728/1 4719/4727/1 13246/13254/1 13245/13253/1 +f 13198/13206/1 13241/13249/1 13244/13252/1 13199/13207/1 +f 1647/1655/1 6340/6348/1 13241/13249/1 13198/13206/1 +f 6340/6348/1 6339/6347/1 13242/13250/1 13241/13249/1 +f 2434/2442/1 13237/13245/1 13240/13248/1 2435/2443/1 +f 13199/13207/1 13244/13252/1 13237/13245/1 2434/2442/1 +f 13244/13252/1 13243/13251/1 13238/13246/1 13237/13245/1 +f 13230/13238/1 13233/13241/1 13236/13244/1 13231/13239/1 +f 17007/17015/1 1164/1172/1 13233/13241/1 13230/13238/1 +f 1164/1172/1 1163/1171/1 13234/13242/1 13233/13241/1 +f 13246/13254/1 13229/13237/1 13232/13240/1 13247/13255/1 +f 4719/4727/1 17008/17016/1 13229/13237/1 13246/13254/1 +f 17008/17016/1 17007/17015/1 13230/13238/1 13229/13237/1 +f 2418/2426/1 13225/13233/1 13228/13236/1 2419/2427/1 +f 13247/13255/1 13232/13240/1 13225/13233/1 2418/2426/1 +f 13232/13240/1 13231/13239/1 13226/13234/1 13225/13233/1 +f 13218/13226/1 13221/13229/1 13224/13232/1 13219/13227/1 +f 13203/13211/1 2432/2440/1 13221/13229/1 13218/13226/1 +f 2432/2440/1 2431/2439/1 13222/13230/1 13221/13229/1 +f 15466/15474/1 13217/13225/1 13220/13228/1 15467/15475/1 +f 3179/3187/1 13204/13212/1 13217/13225/1 15466/15474/1 +f 13204/13212/1 13203/13211/1 13218/13226/1 13217/13225/1 +f 1678/1686/1 13213/13221/1 13216/13224/1 1679/1687/1 +f 15467/15475/1 13220/13228/1 13213/13221/1 1678/1686/1 +f 13220/13228/1 13219/13227/1 13214/13222/1 13213/13221/1 +f 13206/13214/1 13209/13217/1 13212/13220/1 13207/13215/1 +f 10695/10703/1 3268/3276/1 13209/13217/1 13206/13214/1 +f 3268/3276/1 3267/3275/1 13210/13218/1 13209/13217/1 +f 10966/10974/1 13205/13213/1 13208/13216/1 10967/10975/1 +f 1159/1167/1 10696/10704/1 13205/13213/1 10966/10974/1 +f 10696/10704/1 10695/10703/1 13206/13214/1 13205/13213/1 +f 3178/3186/1 13201/13209/1 13204/13212/1 3179/3187/1 +f 10967/10975/1 13208/13216/1 13201/13209/1 3178/3186/1 +f 13208/13216/1 13207/13215/1 13202/13210/1 13201/13209/1 +f 13194/13202/1 13197/13205/1 13200/13208/1 13195/13203/1 +f 15555/15563/1 1648/1656/1 13197/13205/1 13194/13202/1 +f 1648/1656/1 1647/1655/1 13198/13206/1 13197/13205/1 +f 13210/13218/1 13193/13201/1 13196/13204/1 13211/13219/1 +f 3267/3275/1 15556/15564/1 13193/13201/1 13210/13218/1 +f 15556/15564/1 15555/15563/1 13194/13202/1 13193/13201/1 +f 2430/2438/1 13189/13197/1 13192/13200/1 2431/2439/1 +f 13211/13219/1 13196/13204/1 13189/13197/1 2430/2438/1 +f 13196/13204/1 13195/13203/1 13190/13198/1 13189/13197/1 +f 13182/13190/1 13185/13193/1 13188/13196/1 13183/13191/1 +f 13167/13175/1 2444/2452/1 13185/13193/1 13182/13190/1 +f 2444/2452/1 2443/2451/1 13186/13194/1 13185/13193/1 +f 17038/17046/1 13181/13189/1 13184/13192/1 17039/17047/1 +f 4751/4759/1 13168/13176/1 13181/13189/1 17038/17046/1 +f 13168/13176/1 13167/13175/1 13182/13190/1 13181/13189/1 +f 1154/1162/1 13177/13185/1 13180/13188/1 1155/1163/1 +f 17039/17047/1 13184/13192/1 13177/13185/1 1154/1162/1 +f 13184/13192/1 13183/13191/1 13178/13186/1 13177/13185/1 +f 13170/13178/1 13173/13181/1 13176/13184/1 13171/13179/1 +f 13215/13223/1 2428/2436/1 13173/13181/1 13170/13178/1 +f 2428/2436/1 2427/2435/1 13174/13182/1 13173/13181/1 +f 6250/6258/1 13169/13177/1 13172/13180/1 6251/6259/1 +f 1679/1687/1 13216/13224/1 13169/13177/1 6250/6258/1 +f 13216/13224/1 13215/13223/1 13170/13178/1 13169/13177/1 +f 4750/4758/1 13165/13173/1 13168/13176/1 4751/4759/1 +f 6251/6259/1 13172/13180/1 13165/13173/1 4750/4758/1 +f 13172/13180/1 13171/13179/1 13166/13174/1 13165/13173/1 +f 13158/13166/1 13161/13169/1 13164/13172/1 13159/13167/1 +f 14715/14723/1 1928/1936/1 13161/13169/1 13158/13166/1 +f 1928/1936/1 1927/1935/1 13162/13170/1 13161/13169/1 +f 13174/13182/1 13157/13165/1 13160/13168/1 13175/13183/1 +f 2427/2435/1 14716/14724/1 13157/13165/1 13174/13182/1 +f 14716/14724/1 14715/14723/1 13158/13166/1 13157/13165/1 +f 2442/2450/1 13153/13161/1 13156/13164/1 2443/2451/1 +f 13175/13183/1 13160/13168/1 13153/13161/1 2442/2450/1 +f 13160/13168/1 13159/13167/1 13154/13162/1 13153/13161/1 +f 13146/13154/1 13149/13157/1 13152/13160/1 13147/13155/1 +f 13131/13139/1 2456/2464/1 13149/13157/1 13146/13154/1 +f 2456/2464/1 2455/2463/1 13150/13158/1 13149/13157/1 +f 14758/14766/1 13145/13153/1 13148/13156/1 14759/14767/1 +f 2471/2479/1 13132/13140/1 13145/13153/1 14758/14766/1 +f 13132/13140/1 13131/13139/1 13146/13154/1 13145/13153/1 +f 1914/1922/1 13141/13149/1 13144/13152/1 1915/1923/1 +f 14759/14767/1 13148/13156/1 13141/13149/1 1914/1922/1 +f 13148/13156/1 13147/13155/1 13142/13150/1 13141/13149/1 +f 13134/13142/1 13137/13145/1 13140/13148/1 13135/13143/1 +f 6231/6239/1 4756/4764/1 13137/13145/1 13134/13142/1 +f 4756/4764/1 4755/4763/1 13138/13146/1 13137/13145/1 +f 13090/13098/1 13133/13141/1 13136/13144/1 13091/13099/1 +f 1683/1691/1 6232/6240/1 13133/13141/1 13090/13098/1 +f 6232/6240/1 6231/6239/1 13134/13142/1 13133/13141/1 +f 2470/2478/1 13129/13137/1 13132/13140/1 2471/2479/1 +f 13091/13099/1 13136/13144/1 13129/13137/1 2470/2478/1 +f 13136/13144/1 13135/13143/1 13130/13138/1 13129/13137/1 +f 13122/13130/1 13125/13133/1 13128/13136/1 13123/13131/1 +f 17043/17051/1 1152/1160/1 13125/13133/1 13122/13130/1 +f 1152/1160/1 1151/1159/1 13126/13134/1 13125/13133/1 +f 13138/13146/1 13121/13129/1 13124/13132/1 13139/13147/1 +f 4755/4763/1 17044/17052/1 13121/13129/1 13138/13146/1 +f 17044/17052/1 17043/17051/1 13122/13130/1 13121/13129/1 +f 2454/2462/1 13117/13125/1 13120/13128/1 2455/2463/1 +f 13139/13147/1 13124/13132/1 13117/13125/1 2454/2462/1 +f 13124/13132/1 13123/13131/1 13118/13126/1 13117/13125/1 +f 13110/13118/1 13113/13121/1 13116/13124/1 13111/13119/1 +f 13095/13103/1 2468/2476/1 13113/13121/1 13110/13118/1 +f 2468/2476/1 2467/2475/1 13114/13122/1 13113/13121/1 +f 15358/15366/1 13109/13117/1 13112/13120/1 15359/15367/1 +f 3071/3079/1 13096/13104/1 13109/13117/1 15358/15366/1 +f 13096/13104/1 13095/13103/1 13110/13118/1 13109/13117/1 +f 1714/1722/1 13105/13113/1 13108/13116/1 1715/1723/1 +f 15359/15367/1 13112/13120/1 13105/13113/1 1714/1722/1 +f 13112/13120/1 13111/13119/1 13106/13114/1 13105/13113/1 +f 13098/13106/1 13101/13109/1 13104/13112/1 13099/13107/1 +f 11019/11027/1 3160/3168/1 13101/13109/1 13098/13106/1 +f 3160/3168/1 3159/3167/1 13102/13110/1 13101/13109/1 +f 11290/11298/1 13097/13105/1 13100/13108/1 11291/11299/1 +f 1147/1155/1 11020/11028/1 13097/13105/1 11290/11298/1 +f 11020/11028/1 11019/11027/1 13098/13106/1 13097/13105/1 +f 3070/3078/1 13093/13101/1 13096/13104/1 3071/3079/1 +f 11291/11299/1 13100/13108/1 13093/13101/1 3070/3078/1 +f 13100/13108/1 13099/13107/1 13094/13102/1 13093/13101/1 +f 13086/13094/1 13089/13097/1 13092/13100/1 13087/13095/1 +f 15447/15455/1 1684/1692/1 13089/13097/1 13086/13094/1 +f 1684/1692/1 1683/1691/1 13090/13098/1 13089/13097/1 +f 13102/13110/1 13085/13093/1 13088/13096/1 13103/13111/1 +f 3159/3167/1 15448/15456/1 13085/13093/1 13102/13110/1 +f 15448/15456/1 15447/15455/1 13086/13094/1 13085/13093/1 +f 2466/2474/1 13081/13089/1 13084/13092/1 2467/2475/1 +f 13103/13111/1 13088/13096/1 13081/13089/1 2466/2474/1 +f 13088/13096/1 13087/13095/1 13082/13090/1 13081/13089/1 +f 13074/13082/1 13077/13085/1 13080/13088/1 13075/13083/1 +f 13059/13067/1 2480/2488/1 13077/13085/1 13074/13082/1 +f 2480/2488/1 2479/2487/1 13078/13086/1 13077/13085/1 +f 17074/17082/1 13073/13081/1 13076/13084/1 17075/17083/1 +f 4787/4795/1 13060/13068/1 13073/13081/1 17074/17082/1 +f 13060/13068/1 13059/13067/1 13074/13082/1 13073/13081/1 +f 1142/1150/1 13069/13077/1 13072/13080/1 1143/1151/1 +f 17075/17083/1 13076/13084/1 13069/13077/1 1142/1150/1 +f 13076/13084/1 13075/13083/1 13070/13078/1 13069/13077/1 +f 13062/13070/1 13065/13073/1 13068/13076/1 13063/13071/1 +f 13107/13115/1 2464/2472/1 13065/13073/1 13062/13070/1 +f 2464/2472/1 2463/2471/1 13066/13074/1 13065/13073/1 +f 6142/6150/1 13061/13069/1 13064/13072/1 6143/6151/1 +f 1715/1723/1 13108/13116/1 13061/13069/1 6142/6150/1 +f 13108/13116/1 13107/13115/1 13062/13070/1 13061/13069/1 +f 4786/4794/1 13057/13065/1 13060/13068/1 4787/4795/1 +f 6143/6151/1 13064/13072/1 13057/13065/1 4786/4794/1 +f 13064/13072/1 13063/13071/1 13058/13066/1 13057/13065/1 +f 13050/13058/1 13053/13061/1 13056/13064/1 13051/13059/1 +f 14751/14759/1 1916/1924/1 13053/13061/1 13050/13058/1 +f 1916/1924/1 1915/1923/1 13054/13062/1 13053/13061/1 +f 13066/13074/1 13049/13057/1 13052/13060/1 13067/13075/1 +f 2463/2471/1 14752/14760/1 13049/13057/1 13066/13074/1 +f 14752/14760/1 14751/14759/1 13050/13058/1 13049/13057/1 +f 2478/2486/1 13045/13053/1 13048/13056/1 2479/2487/1 +f 13067/13075/1 13052/13060/1 13045/13053/1 2478/2486/1 +f 13052/13060/1 13051/13059/1 13046/13054/1 13045/13053/1 +f 13038/13046/1 13041/13049/1 13044/13052/1 13039/13047/1 +f 13023/13031/1 2492/2500/1 13041/13049/1 13038/13046/1 +f 2492/2500/1 2491/2499/1 13042/13050/1 13041/13049/1 +f 14794/14802/1 13037/13045/1 13040/13048/1 14795/14803/1 +f 2507/2515/1 13024/13032/1 13037/13045/1 14794/14802/1 +f 13024/13032/1 13023/13031/1 13038/13046/1 13037/13045/1 +f 1902/1910/1 13033/13041/1 13036/13044/1 1903/1911/1 +f 14795/14803/1 13040/13048/1 13033/13041/1 1902/1910/1 +f 13040/13048/1 13039/13047/1 13034/13042/1 13033/13041/1 +f 13026/13034/1 13029/13037/1 13032/13040/1 13027/13035/1 +f 6123/6131/1 4792/4800/1 13029/13037/1 13026/13034/1 +f 4792/4800/1 4791/4799/1 13030/13038/1 13029/13037/1 +f 12982/12990/1 13025/13033/1 13028/13036/1 12983/12991/1 +f 1719/1727/1 6124/6132/1 13025/13033/1 12982/12990/1 +f 6124/6132/1 6123/6131/1 13026/13034/1 13025/13033/1 +f 2506/2514/1 13021/13029/1 13024/13032/1 2507/2515/1 +f 12983/12991/1 13028/13036/1 13021/13029/1 2506/2514/1 +f 13028/13036/1 13027/13035/1 13022/13030/1 13021/13029/1 +f 13014/13022/1 13017/13025/1 13020/13028/1 13015/13023/1 +f 17079/17087/1 1140/1148/1 13017/13025/1 13014/13022/1 +f 1140/1148/1 1139/1147/1 13018/13026/1 13017/13025/1 +f 13030/13038/1 13013/13021/1 13016/13024/1 13031/13039/1 +f 4791/4799/1 17080/17088/1 13013/13021/1 13030/13038/1 +f 17080/17088/1 17079/17087/1 13014/13022/1 13013/13021/1 +f 2490/2498/1 13009/13017/1 13012/13020/1 2491/2499/1 +f 13031/13039/1 13016/13024/1 13009/13017/1 2490/2498/1 +f 13016/13024/1 13015/13023/1 13010/13018/1 13009/13017/1 +f 13002/13010/1 13005/13013/1 13008/13016/1 13003/13011/1 +f 12987/12995/1 2504/2512/1 13005/13013/1 13002/13010/1 +f 2504/2512/1 2503/2511/1 13006/13014/1 13005/13013/1 +f 15250/15258/1 13001/13009/1 13004/13012/1 15251/15259/1 +f 2963/2971/1 12988/12996/1 13001/13009/1 15250/15258/1 +f 12988/12996/1 12987/12995/1 13002/13010/1 13001/13009/1 +f 1750/1758/1 12997/13005/1 13000/13008/1 1751/1759/1 +f 15251/15259/1 13004/13012/1 12997/13005/1 1750/1758/1 +f 13004/13012/1 13003/13011/1 12998/13006/1 12997/13005/1 +f 12990/12998/1 12993/13001/1 12996/13004/1 12991/12999/1 +f 11343/11351/1 3052/3060/1 12993/13001/1 12990/12998/1 +f 3052/3060/1 3051/3059/1 12994/13002/1 12993/13001/1 +f 11614/11622/1 12989/12997/1 12992/13000/1 11615/11623/1 +f 1135/1143/1 11344/11352/1 12989/12997/1 11614/11622/1 +f 11344/11352/1 11343/11351/1 12990/12998/1 12989/12997/1 +f 2962/2970/1 12985/12993/1 12988/12996/1 2963/2971/1 +f 11615/11623/1 12992/13000/1 12985/12993/1 2962/2970/1 +f 12992/13000/1 12991/12999/1 12986/12994/1 12985/12993/1 +f 12978/12986/1 12981/12989/1 12984/12992/1 12979/12987/1 +f 15339/15347/1 1720/1728/1 12981/12989/1 12978/12986/1 +f 1720/1728/1 1719/1727/1 12982/12990/1 12981/12989/1 +f 12994/13002/1 12977/12985/1 12980/12988/1 12995/13003/1 +f 3051/3059/1 15340/15348/1 12977/12985/1 12994/13002/1 +f 15340/15348/1 15339/15347/1 12978/12986/1 12977/12985/1 +f 2502/2510/1 12973/12981/1 12976/12984/1 2503/2511/1 +f 12995/13003/1 12980/12988/1 12973/12981/1 2502/2510/1 +f 12980/12988/1 12979/12987/1 12974/12982/1 12973/12981/1 +f 12966/12974/1 12969/12977/1 12972/12980/1 12967/12975/1 +f 12951/12959/1 2516/2524/1 12969/12977/1 12966/12974/1 +f 2516/2524/1 2515/2523/1 12970/12978/1 12969/12977/1 +f 17110/17118/1 12965/12973/1 12968/12976/1 17111/17119/1 +f 4823/4831/1 12952/12960/1 12965/12973/1 17110/17118/1 +f 12952/12960/1 12951/12959/1 12966/12974/1 12965/12973/1 +f 1130/1138/1 12961/12969/1 12964/12972/1 1131/1139/1 +f 17111/17119/1 12968/12976/1 12961/12969/1 1130/1138/1 +f 12968/12976/1 12967/12975/1 12962/12970/1 12961/12969/1 +f 12954/12962/1 12957/12965/1 12960/12968/1 12955/12963/1 +f 12999/13007/1 2500/2508/1 12957/12965/1 12954/12962/1 +f 2500/2508/1 2499/2507/1 12958/12966/1 12957/12965/1 +f 6034/6042/1 12953/12961/1 12956/12964/1 6035/6043/1 +f 1751/1759/1 13000/13008/1 12953/12961/1 6034/6042/1 +f 13000/13008/1 12999/13007/1 12954/12962/1 12953/12961/1 +f 4822/4830/1 12949/12957/1 12952/12960/1 4823/4831/1 +f 6035/6043/1 12956/12964/1 12949/12957/1 4822/4830/1 +f 12956/12964/1 12955/12963/1 12950/12958/1 12949/12957/1 +f 12942/12950/1 12945/12953/1 12948/12956/1 12943/12951/1 +f 14787/14795/1 1904/1912/1 12945/12953/1 12942/12950/1 +f 1904/1912/1 1903/1911/1 12946/12954/1 12945/12953/1 +f 12958/12966/1 12941/12949/1 12944/12952/1 12959/12967/1 +f 2499/2507/1 14788/14796/1 12941/12949/1 12958/12966/1 +f 14788/14796/1 14787/14795/1 12942/12950/1 12941/12949/1 +f 2514/2522/1 12937/12945/1 12940/12948/1 2515/2523/1 +f 12959/12967/1 12944/12952/1 12937/12945/1 2514/2522/1 +f 12944/12952/1 12943/12951/1 12938/12946/1 12937/12945/1 +f 12930/12938/1 12933/12941/1 12936/12944/1 12931/12939/1 +f 12915/12923/1 2528/2536/1 12933/12941/1 12930/12938/1 +f 2528/2536/1 2527/2535/1 12934/12942/1 12933/12941/1 +f 14830/14838/1 12929/12937/1 12932/12940/1 14831/14839/1 +f 2543/2551/1 12916/12924/1 12929/12937/1 14830/14838/1 +f 12916/12924/1 12915/12923/1 12930/12938/1 12929/12937/1 +f 1890/1898/1 12925/12933/1 12928/12936/1 1891/1899/1 +f 14831/14839/1 12932/12940/1 12925/12933/1 1890/1898/1 +f 12932/12940/1 12931/12939/1 12926/12934/1 12925/12933/1 +f 12918/12926/1 12921/12929/1 12924/12932/1 12919/12927/1 +f 6015/6023/1 4828/4836/1 12921/12929/1 12918/12926/1 +f 4828/4836/1 4827/4835/1 12922/12930/1 12921/12929/1 +f 12874/12882/1 12917/12925/1 12920/12928/1 12875/12883/1 +f 1755/1763/1 6016/6024/1 12917/12925/1 12874/12882/1 +f 6016/6024/1 6015/6023/1 12918/12926/1 12917/12925/1 +f 2542/2550/1 12913/12921/1 12916/12924/1 2543/2551/1 +f 12875/12883/1 12920/12928/1 12913/12921/1 2542/2550/1 +f 12920/12928/1 12919/12927/1 12914/12922/1 12913/12921/1 +f 12906/12914/1 12909/12917/1 12912/12920/1 12907/12915/1 +f 17115/17123/1 1128/1136/1 12909/12917/1 12906/12914/1 +f 1128/1136/1 1127/1135/1 12910/12918/1 12909/12917/1 +f 12922/12930/1 12905/12913/1 12908/12916/1 12923/12931/1 +f 4827/4835/1 17116/17124/1 12905/12913/1 12922/12930/1 +f 17116/17124/1 17115/17123/1 12906/12914/1 12905/12913/1 +f 2526/2534/1 12901/12909/1 12904/12912/1 2527/2535/1 +f 12923/12931/1 12908/12916/1 12901/12909/1 2526/2534/1 +f 12908/12916/1 12907/12915/1 12902/12910/1 12901/12909/1 +f 12894/12902/1 12897/12905/1 12900/12908/1 12895/12903/1 +f 12879/12887/1 2540/2548/1 12897/12905/1 12894/12902/1 +f 2540/2548/1 2539/2547/1 12898/12906/1 12897/12905/1 +f 15142/15150/1 12893/12901/1 12896/12904/1 15143/15151/1 +f 2855/2863/1 12880/12888/1 12893/12901/1 15142/15150/1 +f 12880/12888/1 12879/12887/1 12894/12902/1 12893/12901/1 +f 1786/1794/1 12889/12897/1 12892/12900/1 1787/1795/1 +f 15143/15151/1 12896/12904/1 12889/12897/1 1786/1794/1 +f 12896/12904/1 12895/12903/1 12890/12898/1 12889/12897/1 +f 12882/12890/1 12885/12893/1 12888/12896/1 12883/12891/1 +f 11667/11675/1 2944/2952/1 12885/12893/1 12882/12890/1 +f 2944/2952/1 2943/2951/1 12886/12894/1 12885/12893/1 +f 11938/11946/1 12881/12889/1 12884/12892/1 11939/11947/1 +f 1123/1131/1 11668/11676/1 12881/12889/1 11938/11946/1 +f 11668/11676/1 11667/11675/1 12882/12890/1 12881/12889/1 +f 2854/2862/1 12877/12885/1 12880/12888/1 2855/2863/1 +f 11939/11947/1 12884/12892/1 12877/12885/1 2854/2862/1 +f 12884/12892/1 12883/12891/1 12878/12886/1 12877/12885/1 +f 12870/12878/1 12873/12881/1 12876/12884/1 12871/12879/1 +f 15231/15239/1 1756/1764/1 12873/12881/1 12870/12878/1 +f 1756/1764/1 1755/1763/1 12874/12882/1 12873/12881/1 +f 12886/12894/1 12869/12877/1 12872/12880/1 12887/12895/1 +f 2943/2951/1 15232/15240/1 12869/12877/1 12886/12894/1 +f 15232/15240/1 15231/15239/1 12870/12878/1 12869/12877/1 +f 2538/2546/1 12865/12873/1 12868/12876/1 2539/2547/1 +f 12887/12895/1 12872/12880/1 12865/12873/1 2538/2546/1 +f 12872/12880/1 12871/12879/1 12866/12874/1 12865/12873/1 +f 12858/12866/1 12861/12869/1 12864/12872/1 12859/12867/1 +f 12843/12851/1 2552/2560/1 12861/12869/1 12858/12866/1 +f 2552/2560/1 2551/2559/1 12862/12870/1 12861/12869/1 +f 17146/17154/1 12857/12865/1 12860/12868/1 17147/17155/1 +f 4859/4867/1 12844/12852/1 12857/12865/1 17146/17154/1 +f 12844/12852/1 12843/12851/1 12858/12866/1 12857/12865/1 +f 1118/1126/1 12853/12861/1 12856/12864/1 1119/1127/1 +f 17147/17155/1 12860/12868/1 12853/12861/1 1118/1126/1 +f 12860/12868/1 12859/12867/1 12854/12862/1 12853/12861/1 +f 12846/12854/1 12849/12857/1 12852/12860/1 12847/12855/1 +f 12891/12899/1 2536/2544/1 12849/12857/1 12846/12854/1 +f 2536/2544/1 2535/2543/1 12850/12858/1 12849/12857/1 +f 5926/5934/1 12845/12853/1 12848/12856/1 5927/5935/1 +f 1787/1795/1 12892/12900/1 12845/12853/1 5926/5934/1 +f 12892/12900/1 12891/12899/1 12846/12854/1 12845/12853/1 +f 4858/4866/1 12841/12849/1 12844/12852/1 4859/4867/1 +f 5927/5935/1 12848/12856/1 12841/12849/1 4858/4866/1 +f 12848/12856/1 12847/12855/1 12842/12850/1 12841/12849/1 +f 12834/12842/1 12837/12845/1 12840/12848/1 12835/12843/1 +f 14823/14831/1 1892/1900/1 12837/12845/1 12834/12842/1 +f 1892/1900/1 1891/1899/1 12838/12846/1 12837/12845/1 +f 12850/12858/1 12833/12841/1 12836/12844/1 12851/12859/1 +f 2535/2543/1 14824/14832/1 12833/12841/1 12850/12858/1 +f 14824/14832/1 14823/14831/1 12834/12842/1 12833/12841/1 +f 2550/2558/1 12829/12837/1 12832/12840/1 2551/2559/1 +f 12851/12859/1 12836/12844/1 12829/12837/1 2550/2558/1 +f 12836/12844/1 12835/12843/1 12830/12838/1 12829/12837/1 +f 12822/12830/1 12825/12833/1 12828/12836/1 12823/12831/1 +f 12807/12815/1 2564/2572/1 12825/12833/1 12822/12830/1 +f 2564/2572/1 2563/2571/1 12826/12834/1 12825/12833/1 +f 14866/14874/1 12821/12829/1 12824/12832/1 14867/14875/1 +f 2579/2587/1 12808/12816/1 12821/12829/1 14866/14874/1 +f 12808/12816/1 12807/12815/1 12822/12830/1 12821/12829/1 +f 1878/1886/1 12817/12825/1 12820/12828/1 1879/1887/1 +f 14867/14875/1 12824/12832/1 12817/12825/1 1878/1886/1 +f 12824/12832/1 12823/12831/1 12818/12826/1 12817/12825/1 +f 12810/12818/1 12813/12821/1 12816/12824/1 12811/12819/1 +f 5907/5915/1 4864/4872/1 12813/12821/1 12810/12818/1 +f 4864/4872/1 4863/4871/1 12814/12822/1 12813/12821/1 +f 12766/12774/1 12809/12817/1 12812/12820/1 12767/12775/1 +f 1791/1799/1 5908/5916/1 12809/12817/1 12766/12774/1 +f 5908/5916/1 5907/5915/1 12810/12818/1 12809/12817/1 +f 2578/2586/1 12805/12813/1 12808/12816/1 2579/2587/1 +f 12767/12775/1 12812/12820/1 12805/12813/1 2578/2586/1 +f 12812/12820/1 12811/12819/1 12806/12814/1 12805/12813/1 +f 12798/12806/1 12801/12809/1 12804/12812/1 12799/12807/1 +f 17151/17159/1 1116/1124/1 12801/12809/1 12798/12806/1 +f 1116/1124/1 1115/1123/1 12802/12810/1 12801/12809/1 +f 12814/12822/1 12797/12805/1 12800/12808/1 12815/12823/1 +f 4863/4871/1 17152/17160/1 12797/12805/1 12814/12822/1 +f 17152/17160/1 17151/17159/1 12798/12806/1 12797/12805/1 +f 2562/2570/1 12793/12801/1 12796/12804/1 2563/2571/1 +f 12815/12823/1 12800/12808/1 12793/12801/1 2562/2570/1 +f 12800/12808/1 12799/12807/1 12794/12802/1 12793/12801/1 +f 12786/12794/1 12789/12797/1 12792/12800/1 12787/12795/1 +f 12771/12779/1 2576/2584/1 12789/12797/1 12786/12794/1 +f 2576/2584/1 2575/2583/1 12790/12798/1 12789/12797/1 +f 15034/15042/1 12785/12793/1 12788/12796/1 15035/15043/1 +f 2747/2755/1 12772/12780/1 12785/12793/1 15034/15042/1 +f 12772/12780/1 12771/12779/1 12786/12794/1 12785/12793/1 +f 1822/1830/1 12781/12789/1 12784/12792/1 1823/1831/1 +f 15035/15043/1 12788/12796/1 12781/12789/1 1822/1830/1 +f 12788/12796/1 12787/12795/1 12782/12790/1 12781/12789/1 +f 12774/12782/1 12777/12785/1 12780/12788/1 12775/12783/1 +f 11991/11999/1 2836/2844/1 12777/12785/1 12774/12782/1 +f 2836/2844/1 2835/2843/1 12778/12786/1 12777/12785/1 +f 12262/12270/1 12773/12781/1 12776/12784/1 12263/12271/1 +f 1111/1119/1 11992/12000/1 12773/12781/1 12262/12270/1 +f 11992/12000/1 11991/11999/1 12774/12782/1 12773/12781/1 +f 2746/2754/1 12769/12777/1 12772/12780/1 2747/2755/1 +f 12263/12271/1 12776/12784/1 12769/12777/1 2746/2754/1 +f 12776/12784/1 12775/12783/1 12770/12778/1 12769/12777/1 +f 12762/12770/1 12765/12773/1 12768/12776/1 12763/12771/1 +f 15123/15131/1 1792/1800/1 12765/12773/1 12762/12770/1 +f 1792/1800/1 1791/1799/1 12766/12774/1 12765/12773/1 +f 12778/12786/1 12761/12769/1 12764/12772/1 12779/12787/1 +f 2835/2843/1 15124/15132/1 12761/12769/1 12778/12786/1 +f 15124/15132/1 15123/15131/1 12762/12770/1 12761/12769/1 +f 2574/2582/1 12757/12765/1 12760/12768/1 2575/2583/1 +f 12779/12787/1 12764/12772/1 12757/12765/1 2574/2582/1 +f 12764/12772/1 12763/12771/1 12758/12766/1 12757/12765/1 +f 12750/12758/1 12753/12761/1 12756/12764/1 12751/12759/1 +f 12735/12743/1 2588/2596/1 12753/12761/1 12750/12758/1 +f 2588/2596/1 2587/2595/1 12754/12762/1 12753/12761/1 +f 17182/17190/1 12749/12757/1 12752/12760/1 17183/17191/1 +f 4895/4903/1 12736/12744/1 12749/12757/1 17182/17190/1 +f 12736/12744/1 12735/12743/1 12750/12758/1 12749/12757/1 +f 1106/1114/1 12745/12753/1 12748/12756/1 1107/1115/1 +f 17183/17191/1 12752/12760/1 12745/12753/1 1106/1114/1 +f 12752/12760/1 12751/12759/1 12746/12754/1 12745/12753/1 +f 12738/12746/1 12741/12749/1 12744/12752/1 12739/12747/1 +f 12783/12791/1 2572/2580/1 12741/12749/1 12738/12746/1 +f 2572/2580/1 2571/2579/1 12742/12750/1 12741/12749/1 +f 5818/5826/1 12737/12745/1 12740/12748/1 5819/5827/1 +f 1823/1831/1 12784/12792/1 12737/12745/1 5818/5826/1 +f 12784/12792/1 12783/12791/1 12738/12746/1 12737/12745/1 +f 4894/4902/1 12733/12741/1 12736/12744/1 4895/4903/1 +f 5819/5827/1 12740/12748/1 12733/12741/1 4894/4902/1 +f 12740/12748/1 12739/12747/1 12734/12742/1 12733/12741/1 +f 12726/12734/1 12729/12737/1 12732/12740/1 12727/12735/1 +f 14859/14867/1 1880/1888/1 12729/12737/1 12726/12734/1 +f 1880/1888/1 1879/1887/1 12730/12738/1 12729/12737/1 +f 12742/12750/1 12725/12733/1 12728/12736/1 12743/12751/1 +f 2571/2579/1 14860/14868/1 12725/12733/1 12742/12750/1 +f 14860/14868/1 14859/14867/1 12726/12734/1 12725/12733/1 +f 2586/2594/1 12721/12729/1 12724/12732/1 2587/2595/1 +f 12743/12751/1 12728/12736/1 12721/12729/1 2586/2594/1 +f 12728/12736/1 12727/12735/1 12722/12730/1 12721/12729/1 +f 12714/12722/1 12717/12725/1 12720/12728/1 12715/12723/1 +f 12699/12707/1 2600/2608/1 12717/12725/1 12714/12722/1 +f 2600/2608/1 2599/2607/1 12718/12726/1 12717/12725/1 +f 14902/14910/1 12713/12721/1 12716/12724/1 14903/14911/1 +f 2615/2623/1 12700/12708/1 12713/12721/1 14902/14910/1 +f 12700/12708/1 12699/12707/1 12714/12722/1 12713/12721/1 +f 1866/1874/1 12709/12717/1 12712/12720/1 1867/1875/1 +f 14903/14911/1 12716/12724/1 12709/12717/1 1866/1874/1 +f 12716/12724/1 12715/12723/1 12710/12718/1 12709/12717/1 +f 12702/12710/1 12705/12713/1 12708/12716/1 12703/12711/1 +f 5799/5807/1 4900/4908/1 12705/12713/1 12702/12710/1 +f 4900/4908/1 4899/4907/1 12706/12714/1 12705/12713/1 +f 12658/12666/1 12701/12709/1 12704/12712/1 12659/12667/1 +f 1827/1835/1 5800/5808/1 12701/12709/1 12658/12666/1 +f 5800/5808/1 5799/5807/1 12702/12710/1 12701/12709/1 +f 2614/2622/1 12697/12705/1 12700/12708/1 2615/2623/1 +f 12659/12667/1 12704/12712/1 12697/12705/1 2614/2622/1 +f 12704/12712/1 12703/12711/1 12698/12706/1 12697/12705/1 +f 12690/12698/1 12693/12701/1 12696/12704/1 12691/12699/1 +f 17187/17195/1 1104/1112/1 12693/12701/1 12690/12698/1 +f 1104/1112/1 1103/1111/1 12694/12702/1 12693/12701/1 +f 12706/12714/1 12689/12697/1 12692/12700/1 12707/12715/1 +f 4899/4907/1 17188/17196/1 12689/12697/1 12706/12714/1 +f 17188/17196/1 17187/17195/1 12690/12698/1 12689/12697/1 +f 2598/2606/1 12685/12693/1 12688/12696/1 2599/2607/1 +f 12707/12715/1 12692/12700/1 12685/12693/1 2598/2606/1 +f 12692/12700/1 12691/12699/1 12686/12694/1 12685/12693/1 +f 12678/12686/1 12681/12689/1 12684/12692/1 12679/12687/1 +f 12663/12671/1 2612/2620/1 12681/12689/1 12678/12686/1 +f 2612/2620/1 2611/2619/1 12682/12690/1 12681/12689/1 +f 14926/14934/1 12677/12685/1 12680/12688/1 14927/14935/1 +f 2639/2647/1 12664/12672/1 12677/12685/1 14926/14934/1 +f 12664/12672/1 12663/12671/1 12678/12686/1 12677/12685/1 +f 1858/1866/1 12673/12681/1 12676/12684/1 1859/1867/1 +f 14927/14935/1 12680/12688/1 12673/12681/1 1858/1866/1 +f 12680/12688/1 12679/12687/1 12674/12682/1 12673/12681/1 +f 12666/12674/1 12669/12677/1 12672/12680/1 12667/12675/1 +f 12315/12323/1 2728/2736/1 12669/12677/1 12666/12674/1 +f 2728/2736/1 2727/2735/1 12670/12678/1 12669/12677/1 +f 12586/12594/1 12665/12673/1 12668/12676/1 12587/12595/1 +f 1099/1107/1 12316/12324/1 12665/12673/1 12586/12594/1 +f 12316/12324/1 12315/12323/1 12666/12674/1 12665/12673/1 +f 2638/2646/1 12661/12669/1 12664/12672/1 2639/2647/1 +f 12587/12595/1 12668/12676/1 12661/12669/1 2638/2646/1 +f 12668/12676/1 12667/12675/1 12662/12670/1 12661/12669/1 +f 12654/12662/1 12657/12665/1 12660/12668/1 12655/12663/1 +f 15015/15023/1 1828/1836/1 12657/12665/1 12654/12662/1 +f 1828/1836/1 1827/1835/1 12658/12666/1 12657/12665/1 +f 12670/12678/1 12653/12661/1 12656/12664/1 12671/12679/1 +f 2727/2735/1 15016/15024/1 12653/12661/1 12670/12678/1 +f 15016/15024/1 15015/15023/1 12654/12662/1 12653/12661/1 +f 2610/2618/1 12649/12657/1 12652/12660/1 2611/2619/1 +f 12671/12679/1 12656/12664/1 12649/12657/1 2610/2618/1 +f 12656/12664/1 12655/12663/1 12650/12658/1 12649/12657/1 +f 12642/12650/1 12645/12653/1 12648/12656/1 12643/12651/1 +f 12627/12635/1 2624/2632/1 12645/12653/1 12642/12650/1 +f 2624/2632/1 2623/2631/1 12646/12654/1 12645/12653/1 +f 17218/17226/1 12641/12649/1 12644/12652/1 17219/17227/1 +f 4931/4939/1 12628/12636/1 12641/12649/1 17218/17226/1 +f 12628/12636/1 12627/12635/1 12642/12650/1 12641/12649/1 +f 1094/1102/1 12637/12645/1 12640/12648/1 1095/1103/1 +f 17219/17227/1 12644/12652/1 12637/12645/1 1094/1102/1 +f 12644/12652/1 12643/12651/1 12638/12646/1 12637/12645/1 +f 12630/12638/1 12633/12641/1 12636/12644/1 12631/12639/1 +f 12675/12683/1 2608/2616/1 12633/12641/1 12630/12638/1 +f 2608/2616/1 2607/2615/1 12634/12642/1 12633/12641/1 +f 5710/5718/1 12629/12637/1 12632/12640/1 5711/5719/1 +f 1859/1867/1 12676/12684/1 12629/12637/1 5710/5718/1 +f 12676/12684/1 12675/12683/1 12630/12638/1 12629/12637/1 +f 4930/4938/1 12625/12633/1 12628/12636/1 4931/4939/1 +f 5711/5719/1 12632/12640/1 12625/12633/1 4930/4938/1 +f 12632/12640/1 12631/12639/1 12626/12634/1 12625/12633/1 +f 12618/12626/1 12621/12629/1 12624/12632/1 12619/12627/1 +f 14895/14903/1 1868/1876/1 12621/12629/1 12618/12626/1 +f 1868/1876/1 1867/1875/1 12622/12630/1 12621/12629/1 +f 12634/12642/1 12617/12625/1 12620/12628/1 12635/12643/1 +f 2607/2615/1 14896/14904/1 12617/12625/1 12634/12642/1 +f 14896/14904/1 14895/14903/1 12618/12626/1 12617/12625/1 +f 2622/2630/1 12613/12621/1 12616/12624/1 2623/2631/1 +f 12635/12643/1 12620/12628/1 12613/12621/1 2622/2630/1 +f 12620/12628/1 12619/12627/1 12614/12622/1 12613/12621/1 +f 12606/12614/1 12609/12617/1 12612/12620/1 12607/12615/1 +f 12591/12599/1 2636/2644/1 12609/12617/1 12606/12614/1 +f 2636/2644/1 2635/2643/1 12610/12618/1 12609/12617/1 +f 14938/14946/1 12605/12613/1 12608/12616/1 14939/14947/1 +f 2651/2659/1 12592/12600/1 12605/12613/1 14938/14946/1 +f 12592/12600/1 12591/12599/1 12606/12614/1 12605/12613/1 +f 1854/1862/1 12601/12609/1 12604/12612/1 1855/1863/1 +f 14939/14947/1 12608/12616/1 12601/12609/1 1854/1862/1 +f 12608/12616/1 12607/12615/1 12602/12610/1 12601/12609/1 +f 12594/12602/1 12597/12605/1 12600/12608/1 12595/12603/1 +f 5763/5771/1 4912/4920/1 12597/12605/1 12594/12602/1 +f 4912/4920/1 4911/4919/1 12598/12606/1 12597/12605/1 +f 12550/12558/1 12593/12601/1 12596/12604/1 12551/12559/1 +f 1839/1847/1 5764/5772/1 12593/12601/1 12550/12558/1 +f 5764/5772/1 5763/5771/1 12594/12602/1 12593/12601/1 +f 2650/2658/1 12589/12597/1 12592/12600/1 2651/2659/1 +f 12551/12559/1 12596/12604/1 12589/12597/1 2650/2658/1 +f 12596/12604/1 12595/12603/1 12590/12598/1 12589/12597/1 +f 12582/12590/1 12585/12593/1 12588/12596/1 12583/12591/1 +f 17199/17207/1 1100/1108/1 12585/12593/1 12582/12590/1 +f 1100/1108/1 1099/1107/1 12586/12594/1 12585/12593/1 +f 12598/12606/1 12581/12589/1 12584/12592/1 12599/12607/1 +f 4911/4919/1 17200/17208/1 12581/12589/1 12598/12606/1 +f 17200/17208/1 17199/17207/1 12582/12590/1 12581/12589/1 +f 2634/2642/1 12577/12585/1 12580/12588/1 2635/2643/1 +f 12599/12607/1 12584/12592/1 12577/12585/1 2634/2642/1 +f 12584/12592/1 12583/12591/1 12578/12586/1 12577/12585/1 +f 12570/12578/1 12573/12581/1 12576/12584/1 12571/12579/1 +f 12555/12563/1 2648/2656/1 12573/12581/1 12570/12578/1 +f 2648/2656/1 2647/2655/1 12574/12582/1 12573/12581/1 +f 14854/14862/1 12569/12577/1 12572/12580/1 14855/14863/1 +f 2567/2575/1 12556/12564/1 12569/12577/1 14854/14862/1 +f 12556/12564/1 12555/12563/1 12570/12578/1 12569/12577/1 +f 1882/1890/1 12565/12573/1 12568/12576/1 1883/1891/1 +f 14855/14863/1 12572/12580/1 12565/12573/1 1882/1890/1 +f 12572/12580/1 12571/12579/1 12566/12574/1 12565/12573/1 +f 12558/12566/1 12561/12569/1 12564/12572/1 12559/12567/1 +f 12423/12431/1 2692/2700/1 12561/12569/1 12558/12566/1 +f 2692/2700/1 2691/2699/1 12562/12570/1 12561/12569/1 +f 12802/12810/1 12557/12565/1 12560/12568/1 12803/12811/1 +f 1115/1123/1 12424/12432/1 12557/12565/1 12802/12810/1 +f 12424/12432/1 12423/12431/1 12558/12566/1 12557/12565/1 +f 2566/2574/1 12553/12561/1 12556/12564/1 2567/2575/1 +f 12803/12811/1 12560/12568/1 12553/12561/1 2566/2574/1 +f 12560/12568/1 12559/12567/1 12554/12562/1 12553/12561/1 +f 12546/12554/1 12549/12557/1 12552/12560/1 12547/12555/1 +f 14979/14987/1 1840/1848/1 12549/12557/1 12546/12554/1 +f 1840/1848/1 1839/1847/1 12550/12558/1 12549/12557/1 +f 12562/12570/1 12545/12553/1 12548/12556/1 12563/12571/1 +f 2691/2699/1 14980/14988/1 12545/12553/1 12562/12570/1 +f 14980/14988/1 14979/14987/1 12546/12554/1 12545/12553/1 +f 2646/2654/1 12541/12549/1 12544/12552/1 2647/2655/1 +f 12563/12571/1 12548/12556/1 12541/12549/1 2646/2654/1 +f 12548/12556/1 12547/12555/1 12542/12550/1 12541/12549/1 +f 12534/12542/1 12537/12545/1 12540/12548/1 12535/12543/1 +f 12519/12527/1 2660/2668/1 12537/12545/1 12534/12542/1 +f 2660/2668/1 2659/2667/1 12538/12546/1 12537/12545/1 +f 17242/17250/1 12533/12541/1 12536/12544/1 17243/17251/1 +f 4955/4963/1 12520/12528/1 12533/12541/1 17242/17250/1 +f 12520/12528/1 12519/12527/1 12534/12542/1 12533/12541/1 +f 1086/1094/1 12529/12537/1 12532/12540/1 1087/1095/1 +f 17243/17251/1 12536/12544/1 12529/12537/1 1086/1094/1 +f 12536/12544/1 12535/12543/1 12530/12538/1 12529/12537/1 +f 12522/12530/1 12525/12533/1 12528/12536/1 12523/12531/1 +f 12567/12575/1 2644/2652/1 12525/12533/1 12522/12530/1 +f 2644/2652/1 2643/2651/1 12526/12534/1 12525/12533/1 +f 5638/5646/1 12521/12529/1 12524/12532/1 5639/5647/1 +f 1883/1891/1 12568/12576/1 12521/12529/1 5638/5646/1 +f 12568/12576/1 12567/12575/1 12522/12530/1 12521/12529/1 +f 4954/4962/1 12517/12525/1 12520/12528/1 4955/4963/1 +f 5639/5647/1 12524/12532/1 12517/12525/1 4954/4962/1 +f 12524/12532/1 12523/12531/1 12518/12526/1 12517/12525/1 +f 12510/12518/1 12513/12521/1 12516/12524/1 12511/12519/1 +f 14931/14939/1 1856/1864/1 12513/12521/1 12510/12518/1 +f 1856/1864/1 1855/1863/1 12514/12522/1 12513/12521/1 +f 12526/12534/1 12509/12517/1 12512/12520/1 12527/12535/1 +f 2643/2651/1 14932/14940/1 12509/12517/1 12526/12534/1 +f 14932/14940/1 14931/14939/1 12510/12518/1 12509/12517/1 +f 2658/2666/1 12505/12513/1 12508/12516/1 2659/2667/1 +f 12527/12535/1 12512/12520/1 12505/12513/1 2658/2666/1 +f 12512/12520/1 12511/12519/1 12506/12514/1 12505/12513/1 +f 12498/12506/1 12501/12509/1 12504/12512/1 12499/12507/1 +f 12483/12491/1 2672/2680/1 12501/12509/1 12498/12506/1 +f 2672/2680/1 2671/2679/1 12502/12510/1 12501/12509/1 +f 14974/14982/1 12497/12505/1 12500/12508/1 14975/14983/1 +f 2687/2695/1 12484/12492/1 12497/12505/1 14974/14982/1 +f 12484/12492/1 12483/12491/1 12498/12506/1 12497/12505/1 +f 1842/1850/1 12493/12501/1 12496/12504/1 1843/1851/1 +f 14975/14983/1 12500/12508/1 12493/12501/1 1842/1850/1 +f 12500/12508/1 12499/12507/1 12494/12502/1 12493/12501/1 +f 12486/12494/1 12489/12497/1 12492/12500/1 12487/12495/1 +f 7023/7031/1 4492/4500/1 12489/12497/1 12486/12494/1 +f 4492/4500/1 4491/4499/1 12490/12498/1 12489/12497/1 +f 12442/12450/1 12485/12493/1 12488/12496/1 12443/12451/1 +f 1419/1427/1 7024/7032/1 12485/12493/1 12442/12450/1 +f 7024/7032/1 7023/7031/1 12486/12494/1 12485/12493/1 +f 2686/2694/1 12481/12489/1 12484/12492/1 2687/2695/1 +f 12443/12451/1 12488/12496/1 12481/12489/1 2686/2694/1 +f 12488/12496/1 12487/12495/1 12482/12490/1 12481/12489/1 +f 12474/12482/1 12477/12485/1 12480/12488/1 12475/12483/1 +f 16779/16787/1 1240/1248/1 12477/12485/1 12474/12482/1 +f 1240/1248/1 1239/1247/1 12478/12486/1 12477/12485/1 +f 12490/12498/1 12473/12481/1 12476/12484/1 12491/12499/1 +f 4491/4499/1 16780/16788/1 12473/12481/1 12490/12498/1 +f 16780/16788/1 16779/16787/1 12474/12482/1 12473/12481/1 +f 2670/2678/1 12469/12477/1 12472/12480/1 2671/2679/1 +f 12491/12499/1 12476/12484/1 12469/12477/1 2670/2678/1 +f 12476/12484/1 12475/12483/1 12470/12478/1 12469/12477/1 +f 12462/12470/1 12465/12473/1 12468/12476/1 12463/12471/1 +f 12447/12455/1 2684/2692/1 12465/12473/1 12462/12470/1 +f 2684/2692/1 2683/2691/1 12466/12474/1 12465/12473/1 +f 15106/15114/1 12461/12469/1 12464/12472/1 15107/15115/1 +f 2819/2827/1 12448/12456/1 12461/12469/1 15106/15114/1 +f 12448/12456/1 12447/12455/1 12462/12470/1 12461/12469/1 +f 1798/1806/1 12457/12465/1 12460/12468/1 1799/1807/1 +f 15107/15115/1 12464/12472/1 12457/12465/1 1798/1806/1 +f 12464/12472/1 12463/12471/1 12458/12466/1 12457/12465/1 +f 12450/12458/1 12453/12461/1 12456/12464/1 12451/12459/1 +f 8643/8651/1 3952/3960/1 12453/12461/1 12450/12458/1 +f 3952/3960/1 3951/3959/1 12454/12462/1 12453/12461/1 +f 12046/12054/1 12449/12457/1 12452/12460/1 12047/12055/1 +f 1047/1055/1 8644/8652/1 12449/12457/1 12046/12054/1 +f 8644/8652/1 8643/8651/1 12450/12458/1 12449/12457/1 +f 2818/2826/1 12445/12453/1 12448/12456/1 2819/2827/1 +f 12047/12055/1 12452/12460/1 12445/12453/1 2818/2826/1 +f 12452/12460/1 12451/12459/1 12446/12454/1 12445/12453/1 +f 12438/12446/1 12441/12449/1 12444/12452/1 12439/12447/1 +f 16239/16247/1 1420/1428/1 12441/12449/1 12438/12446/1 +f 1420/1428/1 1419/1427/1 12442/12450/1 12441/12449/1 +f 12454/12462/1 12437/12445/1 12440/12448/1 12455/12463/1 +f 3951/3959/1 16240/16248/1 12437/12445/1 12454/12462/1 +f 16240/16248/1 16239/16247/1 12438/12446/1 12437/12445/1 +f 2682/2690/1 12433/12441/1 12436/12444/1 2683/2691/1 +f 12455/12463/1 12440/12448/1 12433/12441/1 2682/2690/1 +f 12440/12448/1 12439/12447/1 12434/12442/1 12433/12441/1 +f 12426/12434/1 12429/12437/1 12432/12440/1 12427/12435/1 +f 12411/12419/1 2696/2704/1 12429/12437/1 12426/12434/1 +f 2696/2704/1 2695/2703/1 12430/12438/1 12429/12437/1 +f 17158/17166/1 12425/12433/1 12428/12436/1 17159/17167/1 +f 4871/4879/1 12412/12420/1 12425/12433/1 17158/17166/1 +f 12412/12420/1 12411/12419/1 12426/12434/1 12425/12433/1 +f 1114/1122/1 12421/12429/1 12424/12432/1 1115/1123/1 +f 17159/17167/1 12428/12436/1 12421/12429/1 1114/1122/1 +f 12428/12436/1 12427/12435/1 12422/12430/1 12421/12429/1 +f 12414/12422/1 12417/12425/1 12420/12428/1 12415/12423/1 +f 12459/12467/1 2680/2688/1 12417/12425/1 12414/12422/1 +f 2680/2688/1 2679/2687/1 12418/12426/1 12417/12425/1 +f 5890/5898/1 12413/12421/1 12416/12424/1 5891/5899/1 +f 1799/1807/1 12460/12468/1 12413/12421/1 5890/5898/1 +f 12460/12468/1 12459/12467/1 12414/12422/1 12413/12421/1 +f 4870/4878/1 12409/12417/1 12412/12420/1 4871/4879/1 +f 5891/5899/1 12416/12424/1 12409/12417/1 4870/4878/1 +f 12416/12424/1 12415/12423/1 12410/12418/1 12409/12417/1 +f 12402/12410/1 12405/12413/1 12408/12416/1 12403/12411/1 +f 14967/14975/1 1844/1852/1 12405/12413/1 12402/12410/1 +f 1844/1852/1 1843/1851/1 12406/12414/1 12405/12413/1 +f 12418/12426/1 12401/12409/1 12404/12412/1 12419/12427/1 +f 2679/2687/1 14968/14976/1 12401/12409/1 12418/12426/1 +f 14968/14976/1 14967/14975/1 12402/12410/1 12401/12409/1 +f 2694/2702/1 12397/12405/1 12400/12408/1 2695/2703/1 +f 12419/12427/1 12404/12412/1 12397/12405/1 2694/2702/1 +f 12404/12412/1 12403/12411/1 12398/12406/1 12397/12405/1 +f 12390/12398/1 12393/12401/1 12396/12404/1 12391/12399/1 +f 12375/12383/1 2708/2716/1 12393/12401/1 12390/12398/1 +f 2708/2716/1 2707/2715/1 12394/12402/1 12393/12401/1 +f 15010/15018/1 12389/12397/1 12392/12400/1 15011/15019/1 +f 2723/2731/1 12376/12384/1 12389/12397/1 15010/15018/1 +f 12376/12384/1 12375/12383/1 12390/12398/1 12389/12397/1 +f 1830/1838/1 12385/12393/1 12388/12396/1 1831/1839/1 +f 15011/15019/1 12392/12400/1 12385/12393/1 1830/1838/1 +f 12392/12400/1 12391/12399/1 12386/12394/1 12385/12393/1 +f 12378/12386/1 12381/12389/1 12384/12392/1 12379/12387/1 +f 5259/5267/1 5080/5088/1 12381/12389/1 12378/12386/1 +f 5080/5088/1 5079/5087/1 12382/12390/1 12381/12389/1 +f 12334/12342/1 12377/12385/1 12380/12388/1 12335/12343/1 +f 2007/2015/1 5260/5268/1 12377/12385/1 12334/12342/1 +f 5260/5268/1 5259/5267/1 12378/12386/1 12377/12385/1 +f 2722/2730/1 12373/12381/1 12376/12384/1 2723/2731/1 +f 12335/12343/1 12380/12388/1 12373/12381/1 2722/2730/1 +f 12380/12388/1 12379/12387/1 12374/12382/1 12373/12381/1 +f 12366/12374/1 12369/12377/1 12372/12380/1 12367/12375/1 +f 17367/17375/1 1044/1052/1 12369/12377/1 12366/12374/1 +f 1044/1052/1 1043/1051/1 12370/12378/1 12369/12377/1 +f 12382/12390/1 12365/12373/1 12368/12376/1 12383/12391/1 +f 5079/5087/1 17368/17376/1 12365/12373/1 12382/12390/1 +f 17368/17376/1 17367/17375/1 12366/12374/1 12365/12373/1 +f 2706/2714/1 12361/12369/1 12364/12372/1 2707/2715/1 +f 12383/12391/1 12368/12376/1 12361/12369/1 2706/2714/1 +f 12368/12376/1 12367/12375/1 12362/12370/1 12361/12369/1 +f 12354/12362/1 12357/12365/1 12360/12368/1 12355/12363/1 +f 12339/12347/1 2720/2728/1 12357/12365/1 12354/12362/1 +f 2720/2728/1 2719/2727/1 12358/12366/1 12357/12365/1 +f 14962/14970/1 12353/12361/1 12356/12364/1 14963/14971/1 +f 2675/2683/1 12340/12348/1 12353/12361/1 14962/14970/1 +f 12340/12348/1 12339/12347/1 12354/12362/1 12353/12361/1 +f 1846/1854/1 12349/12357/1 12352/12360/1 1847/1855/1 +f 14963/14971/1 12356/12364/1 12349/12357/1 1846/1854/1 +f 12356/12364/1 12355/12363/1 12350/12358/1 12349/12357/1 +f 12342/12350/1 12345/12353/1 12348/12356/1 12343/12351/1 +f 13935/13943/1 2188/2196/1 12345/12353/1 12342/12350/1 +f 2188/2196/1 2187/2195/1 12346/12354/1 12345/12353/1 +f 12478/12486/1 12341/12349/1 12344/12352/1 12479/12487/1 +f 1239/1247/1 13936/13944/1 12341/12349/1 12478/12486/1 +f 13936/13944/1 13935/13943/1 12342/12350/1 12341/12349/1 +f 2674/2682/1 12337/12345/1 12340/12348/1 2675/2683/1 +f 12479/12487/1 12344/12352/1 12337/12345/1 2674/2682/1 +f 12344/12352/1 12343/12351/1 12338/12346/1 12337/12345/1 +f 12330/12338/1 12333/12341/1 12336/12344/1 12331/12339/1 +f 14475/14483/1 2008/2016/1 12333/12341/1 12330/12338/1 +f 2008/2016/1 2007/2015/1 12334/12342/1 12333/12341/1 +f 12346/12354/1 12329/12337/1 12332/12340/1 12347/12355/1 +f 2187/2195/1 14476/14484/1 12329/12337/1 12346/12354/1 +f 14476/14484/1 14475/14483/1 12330/12338/1 12329/12337/1 +f 2718/2726/1 12325/12333/1 12328/12336/1 2719/2727/1 +f 12347/12355/1 12332/12340/1 12325/12333/1 2718/2726/1 +f 12332/12340/1 12331/12339/1 12326/12334/1 12325/12333/1 +f 12318/12326/1 12321/12329/1 12324/12332/1 12319/12327/1 +f 12303/12311/1 2732/2740/1 12321/12329/1 12318/12326/1 +f 2732/2740/1 2731/2739/1 12322/12330/1 12321/12329/1 +f 17206/17214/1 12317/12325/1 12320/12328/1 17207/17215/1 +f 4919/4927/1 12304/12312/1 12317/12325/1 17206/17214/1 +f 12304/12312/1 12303/12311/1 12318/12326/1 12317/12325/1 +f 1098/1106/1 12313/12321/1 12316/12324/1 1099/1107/1 +f 17207/17215/1 12320/12328/1 12313/12321/1 1098/1106/1 +f 12320/12328/1 12319/12327/1 12314/12322/1 12313/12321/1 +f 12306/12314/1 12309/12317/1 12312/12320/1 12307/12315/1 +f 12351/12359/1 2716/2724/1 12309/12317/1 12306/12314/1 +f 2716/2724/1 2715/2723/1 12310/12318/1 12309/12317/1 +f 5746/5754/1 12305/12313/1 12308/12316/1 5747/5755/1 +f 1847/1855/1 12352/12360/1 12305/12313/1 5746/5754/1 +f 12352/12360/1 12351/12359/1 12306/12314/1 12305/12313/1 +f 4918/4926/1 12301/12309/1 12304/12312/1 4919/4927/1 +f 5747/5755/1 12308/12316/1 12301/12309/1 4918/4926/1 +f 12308/12316/1 12307/12315/1 12302/12310/1 12301/12309/1 +f 12294/12302/1 12297/12305/1 12300/12308/1 12295/12303/1 +f 15003/15011/1 1832/1840/1 12297/12305/1 12294/12302/1 +f 1832/1840/1 1831/1839/1 12298/12306/1 12297/12305/1 +f 12310/12318/1 12293/12301/1 12296/12304/1 12311/12319/1 +f 2715/2723/1 15004/15012/1 12293/12301/1 12310/12318/1 +f 15004/15012/1 15003/15011/1 12294/12302/1 12293/12301/1 +f 2730/2738/1 12289/12297/1 12292/12300/1 2731/2739/1 +f 12311/12319/1 12296/12304/1 12289/12297/1 2730/2738/1 +f 12296/12304/1 12295/12303/1 12290/12298/1 12289/12297/1 +f 12282/12290/1 12285/12293/1 12288/12296/1 12283/12291/1 +f 12267/12275/1 2744/2752/1 12285/12293/1 12282/12290/1 +f 2744/2752/1 2743/2751/1 12286/12294/1 12285/12293/1 +f 15046/15054/1 12281/12289/1 12284/12292/1 15047/15055/1 +f 2759/2767/1 12268/12276/1 12281/12289/1 15046/15054/1 +f 12268/12276/1 12267/12275/1 12282/12290/1 12281/12289/1 +f 1818/1826/1 12277/12285/1 12280/12288/1 1819/1827/1 +f 15047/15055/1 12284/12292/1 12277/12285/1 1818/1826/1 +f 12284/12292/1 12283/12291/1 12278/12286/1 12277/12285/1 +f 12270/12278/1 12273/12281/1 12276/12284/1 12271/12279/1 +f 5871/5879/1 4876/4884/1 12273/12281/1 12270/12278/1 +f 4876/4884/1 4875/4883/1 12274/12282/1 12273/12281/1 +f 12226/12234/1 12269/12277/1 12272/12280/1 12227/12235/1 +f 1803/1811/1 5872/5880/1 12269/12277/1 12226/12234/1 +f 5872/5880/1 5871/5879/1 12270/12278/1 12269/12277/1 +f 2758/2766/1 12265/12273/1 12268/12276/1 2759/2767/1 +f 12227/12235/1 12272/12280/1 12265/12273/1 2758/2766/1 +f 12272/12280/1 12271/12279/1 12266/12274/1 12265/12273/1 +f 12258/12266/1 12261/12269/1 12264/12272/1 12259/12267/1 +f 17163/17171/1 1112/1120/1 12261/12269/1 12258/12266/1 +f 1112/1120/1 1111/1119/1 12262/12270/1 12261/12269/1 +f 12274/12282/1 12257/12265/1 12260/12268/1 12275/12283/1 +f 4875/4883/1 17164/17172/1 12257/12265/1 12274/12282/1 +f 17164/17172/1 17163/17171/1 12258/12266/1 12257/12265/1 +f 2742/2750/1 12253/12261/1 12256/12264/1 2743/2751/1 +f 12275/12283/1 12260/12268/1 12253/12261/1 2742/2750/1 +f 12260/12268/1 12259/12267/1 12254/12262/1 12253/12261/1 +f 12246/12254/1 12249/12257/1 12252/12260/1 12247/12255/1 +f 12231/12239/1 2756/2764/1 12249/12257/1 12246/12254/1 +f 2756/2764/1 2755/2763/1 12250/12258/1 12249/12257/1 +f 14782/14790/1 12245/12253/1 12248/12256/1 14783/14791/1 +f 2495/2503/1 12232/12240/1 12245/12253/1 14782/14790/1 +f 12232/12240/1 12231/12239/1 12246/12254/1 12245/12253/1 +f 1906/1914/1 12241/12249/1 12244/12252/1 1907/1915/1 +f 14783/14791/1 12248/12256/1 12241/12249/1 1906/1914/1 +f 12248/12256/1 12247/12255/1 12242/12250/1 12241/12249/1 +f 12234/12242/1 12237/12245/1 12240/12248/1 12235/12243/1 +f 12099/12107/1 2800/2808/1 12237/12245/1 12234/12242/1 +f 2800/2808/1 2799/2807/1 12238/12246/1 12237/12245/1 +f 13018/13026/1 12233/12241/1 12236/12244/1 13019/13027/1 +f 1139/1147/1 12100/12108/1 12233/12241/1 13018/13026/1 +f 12100/12108/1 12099/12107/1 12234/12242/1 12233/12241/1 +f 2494/2502/1 12229/12237/1 12232/12240/1 2495/2503/1 +f 13019/13027/1 12236/12244/1 12229/12237/1 2494/2502/1 +f 12236/12244/1 12235/12243/1 12230/12238/1 12229/12237/1 +f 12222/12230/1 12225/12233/1 12228/12236/1 12223/12231/1 +f 15087/15095/1 1804/1812/1 12225/12233/1 12222/12230/1 +f 1804/1812/1 1803/1811/1 12226/12234/1 12225/12233/1 +f 12238/12246/1 12221/12229/1 12224/12232/1 12239/12247/1 +f 2799/2807/1 15088/15096/1 12221/12229/1 12238/12246/1 +f 15088/15096/1 15087/15095/1 12222/12230/1 12221/12229/1 +f 2754/2762/1 12217/12225/1 12220/12228/1 2755/2763/1 +f 12239/12247/1 12224/12232/1 12217/12225/1 2754/2762/1 +f 12224/12232/1 12223/12231/1 12218/12226/1 12217/12225/1 +f 12210/12218/1 12213/12221/1 12216/12224/1 12211/12219/1 +f 12195/12203/1 2768/2776/1 12213/12221/1 12210/12218/1 +f 2768/2776/1 2767/2775/1 12214/12222/1 12213/12221/1 +f 17266/17274/1 12209/12217/1 12212/12220/1 17267/17275/1 +f 4979/4987/1 12196/12204/1 12209/12217/1 17266/17274/1 +f 12196/12204/1 12195/12203/1 12210/12218/1 12209/12217/1 +f 1078/1086/1 12205/12213/1 12208/12216/1 1079/1087/1 +f 17267/17275/1 12212/12220/1 12205/12213/1 1078/1086/1 +f 12212/12220/1 12211/12219/1 12206/12214/1 12205/12213/1 +f 12198/12206/1 12201/12209/1 12204/12212/1 12199/12207/1 +f 12243/12251/1 2752/2760/1 12201/12209/1 12198/12206/1 +f 2752/2760/1 2751/2759/1 12202/12210/1 12201/12209/1 +f 5566/5574/1 12197/12205/1 12200/12208/1 5567/5575/1 +f 1907/1915/1 12244/12252/1 12197/12205/1 5566/5574/1 +f 12244/12252/1 12243/12251/1 12198/12206/1 12197/12205/1 +f 4978/4986/1 12193/12201/1 12196/12204/1 4979/4987/1 +f 5567/5575/1 12200/12208/1 12193/12201/1 4978/4986/1 +f 12200/12208/1 12199/12207/1 12194/12202/1 12193/12201/1 +f 12186/12194/1 12189/12197/1 12192/12200/1 12187/12195/1 +f 15039/15047/1 1820/1828/1 12189/12197/1 12186/12194/1 +f 1820/1828/1 1819/1827/1 12190/12198/1 12189/12197/1 +f 12202/12210/1 12185/12193/1 12188/12196/1 12203/12211/1 +f 2751/2759/1 15040/15048/1 12185/12193/1 12202/12210/1 +f 15040/15048/1 15039/15047/1 12186/12194/1 12185/12193/1 +f 2766/2774/1 12181/12189/1 12184/12192/1 2767/2775/1 +f 12203/12211/1 12188/12196/1 12181/12189/1 2766/2774/1 +f 12188/12196/1 12187/12195/1 12182/12190/1 12181/12189/1 +f 12174/12182/1 12177/12185/1 12180/12188/1 12175/12183/1 +f 12159/12167/1 2780/2788/1 12177/12185/1 12174/12182/1 +f 2780/2788/1 2779/2787/1 12178/12186/1 12177/12185/1 +f 15082/15090/1 12173/12181/1 12176/12184/1 15083/15091/1 +f 2795/2803/1 12160/12168/1 12173/12181/1 15082/15090/1 +f 12160/12168/1 12159/12167/1 12174/12182/1 12173/12181/1 +f 1806/1814/1 12169/12177/1 12172/12180/1 1807/1815/1 +f 15083/15091/1 12176/12184/1 12169/12177/1 1806/1814/1 +f 12176/12184/1 12175/12183/1 12170/12178/1 12169/12177/1 +f 12162/12170/1 12165/12173/1 12168/12176/1 12163/12171/1 +f 6915/6923/1 4528/4536/1 12165/12173/1 12162/12170/1 +f 4528/4536/1 4527/4535/1 12166/12174/1 12165/12173/1 +f 12118/12126/1 12161/12169/1 12164/12172/1 12119/12127/1 +f 1455/1463/1 6916/6924/1 12161/12169/1 12118/12126/1 +f 6916/6924/1 6915/6923/1 12162/12170/1 12161/12169/1 +f 2794/2802/1 12157/12165/1 12160/12168/1 2795/2803/1 +f 12119/12127/1 12164/12172/1 12157/12165/1 2794/2802/1 +f 12164/12172/1 12163/12171/1 12158/12166/1 12157/12165/1 +f 12150/12158/1 12153/12161/1 12156/12164/1 12151/12159/1 +f 16815/16823/1 1228/1236/1 12153/12161/1 12150/12158/1 +f 1228/1236/1 1227/1235/1 12154/12162/1 12153/12161/1 +f 12166/12174/1 12149/12157/1 12152/12160/1 12167/12175/1 +f 4527/4535/1 16816/16824/1 12149/12157/1 12166/12174/1 +f 16816/16824/1 16815/16823/1 12150/12158/1 12149/12157/1 +f 2778/2786/1 12145/12153/1 12148/12156/1 2779/2787/1 +f 12167/12175/1 12152/12160/1 12145/12153/1 2778/2786/1 +f 12152/12160/1 12151/12159/1 12146/12154/1 12145/12153/1 +f 12138/12146/1 12141/12149/1 12144/12152/1 12139/12147/1 +f 12123/12131/1 2792/2800/1 12141/12149/1 12138/12146/1 +f 2792/2800/1 2791/2799/1 12142/12150/1 12141/12149/1 +f 15322/15330/1 12137/12145/1 12140/12148/1 15323/15331/1 +f 3035/3043/1 12124/12132/1 12137/12145/1 15322/15330/1 +f 12124/12132/1 12123/12131/1 12138/12146/1 12137/12145/1 +f 1726/1734/1 12133/12141/1 12136/12144/1 1727/1735/1 +f 15323/15331/1 12140/12148/1 12133/12141/1 1726/1734/1 +f 12140/12148/1 12139/12147/1 12134/12142/1 12133/12141/1 +f 12126/12134/1 12129/12137/1 12132/12140/1 12127/12135/1 +f 8967/8975/1 3844/3852/1 12129/12137/1 12126/12134/1 +f 3844/3852/1 3843/3851/1 12130/12138/1 12129/12137/1 +f 11398/11406/1 12125/12133/1 12128/12136/1 11399/11407/1 +f 1039/1047/1 8968/8976/1 12125/12133/1 11398/11406/1 +f 8968/8976/1 8967/8975/1 12126/12134/1 12125/12133/1 +f 3034/3042/1 12121/12129/1 12124/12132/1 3035/3043/1 +f 11399/11407/1 12128/12136/1 12121/12129/1 3034/3042/1 +f 12128/12136/1 12127/12135/1 12122/12130/1 12121/12129/1 +f 12114/12122/1 12117/12125/1 12120/12128/1 12115/12123/1 +f 16131/16139/1 1456/1464/1 12117/12125/1 12114/12122/1 +f 1456/1464/1 1455/1463/1 12118/12126/1 12117/12125/1 +f 12130/12138/1 12113/12121/1 12116/12124/1 12131/12139/1 +f 3843/3851/1 16132/16140/1 12113/12121/1 12130/12138/1 +f 16132/16140/1 16131/16139/1 12114/12122/1 12113/12121/1 +f 2790/2798/1 12109/12117/1 12112/12120/1 2791/2799/1 +f 12131/12139/1 12116/12124/1 12109/12117/1 2790/2798/1 +f 12116/12124/1 12115/12123/1 12110/12118/1 12109/12117/1 +f 12102/12110/1 12105/12113/1 12108/12116/1 12103/12111/1 +f 12087/12095/1 2804/2812/1 12105/12113/1 12102/12110/1 +f 2804/2812/1 2803/2811/1 12106/12114/1 12105/12113/1 +f 17086/17094/1 12101/12109/1 12104/12112/1 17087/17095/1 +f 4799/4807/1 12088/12096/1 12101/12109/1 17086/17094/1 +f 12088/12096/1 12087/12095/1 12102/12110/1 12101/12109/1 +f 1138/1146/1 12097/12105/1 12100/12108/1 1139/1147/1 +f 17087/17095/1 12104/12112/1 12097/12105/1 1138/1146/1 +f 12104/12112/1 12103/12111/1 12098/12106/1 12097/12105/1 +f 12090/12098/1 12093/12101/1 12096/12104/1 12091/12099/1 +f 12135/12143/1 2788/2796/1 12093/12101/1 12090/12098/1 +f 2788/2796/1 2787/2795/1 12094/12102/1 12093/12101/1 +f 6106/6114/1 12089/12097/1 12092/12100/1 6107/6115/1 +f 1727/1735/1 12136/12144/1 12089/12097/1 6106/6114/1 +f 12136/12144/1 12135/12143/1 12090/12098/1 12089/12097/1 +f 4798/4806/1 12085/12093/1 12088/12096/1 4799/4807/1 +f 6107/6115/1 12092/12100/1 12085/12093/1 4798/4806/1 +f 12092/12100/1 12091/12099/1 12086/12094/1 12085/12093/1 +f 12078/12086/1 12081/12089/1 12084/12092/1 12079/12087/1 +f 15075/15083/1 1808/1816/1 12081/12089/1 12078/12086/1 +f 1808/1816/1 1807/1815/1 12082/12090/1 12081/12089/1 +f 12094/12102/1 12077/12085/1 12080/12088/1 12095/12103/1 +f 2787/2795/1 15076/15084/1 12077/12085/1 12094/12102/1 +f 15076/15084/1 15075/15083/1 12078/12086/1 12077/12085/1 +f 2802/2810/1 12073/12081/1 12076/12084/1 2803/2811/1 +f 12095/12103/1 12080/12088/1 12073/12081/1 2802/2810/1 +f 12080/12088/1 12079/12087/1 12074/12082/1 12073/12081/1 +f 12066/12074/1 12069/12077/1 12072/12080/1 12067/12075/1 +f 12051/12059/1 2816/2824/1 12069/12077/1 12066/12074/1 +f 2816/2824/1 2815/2823/1 12070/12078/1 12069/12077/1 +f 15118/15126/1 12065/12073/1 12068/12076/1 15119/15127/1 +f 2831/2839/1 12052/12060/1 12065/12073/1 15118/15126/1 +f 12052/12060/1 12051/12059/1 12066/12074/1 12065/12073/1 +f 1794/1802/1 12061/12069/1 12064/12072/1 1795/1803/1 +f 15119/15127/1 12068/12076/1 12061/12069/1 1794/1802/1 +f 12068/12076/1 12067/12075/1 12062/12070/1 12061/12069/1 +f 12054/12062/1 12057/12065/1 12060/12068/1 12055/12063/1 +f 5295/5303/1 5068/5076/1 12057/12065/1 12054/12062/1 +f 5068/5076/1 5067/5075/1 12058/12066/1 12057/12065/1 +f 12010/12018/1 12053/12061/1 12056/12064/1 12011/12019/1 +f 1995/2003/1 5296/5304/1 12053/12061/1 12010/12018/1 +f 5296/5304/1 5295/5303/1 12054/12062/1 12053/12061/1 +f 2830/2838/1 12049/12057/1 12052/12060/1 2831/2839/1 +f 12011/12019/1 12056/12064/1 12049/12057/1 2830/2838/1 +f 12056/12064/1 12055/12063/1 12050/12058/1 12049/12057/1 +f 12042/12050/1 12045/12053/1 12048/12056/1 12043/12051/1 +f 17355/17363/1 1048/1056/1 12045/12053/1 12042/12050/1 +f 1048/1056/1 1047/1055/1 12046/12054/1 12045/12053/1 +f 12058/12066/1 12041/12049/1 12044/12052/1 12059/12067/1 +f 5067/5075/1 17356/17364/1 12041/12049/1 12058/12066/1 +f 17356/17364/1 17355/17363/1 12042/12050/1 12041/12049/1 +f 2814/2822/1 12037/12045/1 12040/12048/1 2815/2823/1 +f 12059/12067/1 12044/12052/1 12037/12045/1 2814/2822/1 +f 12044/12052/1 12043/12051/1 12038/12046/1 12037/12045/1 +f 12030/12038/1 12033/12041/1 12036/12044/1 12031/12039/1 +f 12015/12023/1 2828/2836/1 12033/12041/1 12030/12038/1 +f 2828/2836/1 2827/2835/1 12034/12042/1 12033/12041/1 +f 15070/15078/1 12029/12037/1 12032/12040/1 15071/15079/1 +f 2783/2791/1 12016/12024/1 12029/12037/1 15070/15078/1 +f 12016/12024/1 12015/12023/1 12030/12038/1 12029/12037/1 +f 1810/1818/1 12025/12033/1 12028/12036/1 1811/1819/1 +f 15071/15079/1 12032/12040/1 12025/12033/1 1810/1818/1 +f 12032/12040/1 12031/12039/1 12026/12034/1 12025/12033/1 +f 12018/12026/1 12021/12029/1 12024/12032/1 12019/12027/1 +f 13827/13835/1 2224/2232/1 12021/12029/1 12018/12026/1 +f 2224/2232/1 2223/2231/1 12022/12030/1 12021/12029/1 +f 12154/12162/1 12017/12025/1 12020/12028/1 12155/12163/1 +f 1227/1235/1 13828/13836/1 12017/12025/1 12154/12162/1 +f 13828/13836/1 13827/13835/1 12018/12026/1 12017/12025/1 +f 2782/2790/1 12013/12021/1 12016/12024/1 2783/2791/1 +f 12155/12163/1 12020/12028/1 12013/12021/1 2782/2790/1 +f 12020/12028/1 12019/12027/1 12014/12022/1 12013/12021/1 +f 12006/12014/1 12009/12017/1 12012/12020/1 12007/12015/1 +f 14511/14519/1 1996/2004/1 12009/12017/1 12006/12014/1 +f 1996/2004/1 1995/2003/1 12010/12018/1 12009/12017/1 +f 12022/12030/1 12005/12013/1 12008/12016/1 12023/12031/1 +f 2223/2231/1 14512/14520/1 12005/12013/1 12022/12030/1 +f 14512/14520/1 14511/14519/1 12006/12014/1 12005/12013/1 +f 2826/2834/1 12001/12009/1 12004/12012/1 2827/2835/1 +f 12023/12031/1 12008/12016/1 12001/12009/1 2826/2834/1 +f 12008/12016/1 12007/12015/1 12002/12010/1 12001/12009/1 +f 11994/12002/1 11997/12005/1 12000/12008/1 11995/12003/1 +f 11979/11987/1 2840/2848/1 11997/12005/1 11994/12002/1 +f 2840/2848/1 2839/2847/1 11998/12006/1 11997/12005/1 +f 17170/17178/1 11993/12001/1 11996/12004/1 17171/17179/1 +f 4883/4891/1 11980/11988/1 11993/12001/1 17170/17178/1 +f 11980/11988/1 11979/11987/1 11994/12002/1 11993/12001/1 +f 1110/1118/1 11989/11997/1 11992/12000/1 1111/1119/1 +f 17171/17179/1 11996/12004/1 11989/11997/1 1110/1118/1 +f 11996/12004/1 11995/12003/1 11990/11998/1 11989/11997/1 +f 11982/11990/1 11985/11993/1 11988/11996/1 11983/11991/1 +f 12027/12035/1 2824/2832/1 11985/11993/1 11982/11990/1 +f 2824/2832/1 2823/2831/1 11986/11994/1 11985/11993/1 +f 5854/5862/1 11981/11989/1 11984/11992/1 5855/5863/1 +f 1811/1819/1 12028/12036/1 11981/11989/1 5854/5862/1 +f 12028/12036/1 12027/12035/1 11982/11990/1 11981/11989/1 +f 4882/4890/1 11977/11985/1 11980/11988/1 4883/4891/1 +f 5855/5863/1 11984/11992/1 11977/11985/1 4882/4890/1 +f 11984/11992/1 11983/11991/1 11978/11986/1 11977/11985/1 +f 11970/11978/1 11973/11981/1 11976/11984/1 11971/11979/1 +f 15111/15119/1 1796/1804/1 11973/11981/1 11970/11978/1 +f 1796/1804/1 1795/1803/1 11974/11982/1 11973/11981/1 +f 11986/11994/1 11969/11977/1 11972/11980/1 11987/11995/1 +f 2823/2831/1 15112/15120/1 11969/11977/1 11986/11994/1 +f 15112/15120/1 15111/15119/1 11970/11978/1 11969/11977/1 +f 2838/2846/1 11965/11973/1 11968/11976/1 2839/2847/1 +f 11987/11995/1 11972/11980/1 11965/11973/1 2838/2846/1 +f 11972/11980/1 11971/11979/1 11966/11974/1 11965/11973/1 +f 11958/11966/1 11961/11969/1 11964/11972/1 11959/11967/1 +f 11943/11951/1 2852/2860/1 11961/11969/1 11958/11966/1 +f 2852/2860/1 2851/2859/1 11962/11970/1 11961/11969/1 +f 15154/15162/1 11957/11965/1 11960/11968/1 15155/15163/1 +f 2867/2875/1 11944/11952/1 11957/11965/1 15154/15162/1 +f 11944/11952/1 11943/11951/1 11958/11966/1 11957/11965/1 +f 1782/1790/1 11953/11961/1 11956/11964/1 1783/1791/1 +f 15155/15163/1 11960/11968/1 11953/11961/1 1782/1790/1 +f 11960/11968/1 11959/11967/1 11954/11962/1 11953/11961/1 +f 11946/11954/1 11949/11957/1 11952/11960/1 11947/11955/1 +f 5979/5987/1 4840/4848/1 11949/11957/1 11946/11954/1 +f 4840/4848/1 4839/4847/1 11950/11958/1 11949/11957/1 +f 11902/11910/1 11945/11953/1 11948/11956/1 11903/11911/1 +f 1767/1775/1 5980/5988/1 11945/11953/1 11902/11910/1 +f 5980/5988/1 5979/5987/1 11946/11954/1 11945/11953/1 +f 2866/2874/1 11941/11949/1 11944/11952/1 2867/2875/1 +f 11903/11911/1 11948/11956/1 11941/11949/1 2866/2874/1 +f 11948/11956/1 11947/11955/1 11942/11950/1 11941/11949/1 +f 11934/11942/1 11937/11945/1 11940/11948/1 11935/11943/1 +f 17127/17135/1 1124/1132/1 11937/11945/1 11934/11942/1 +f 1124/1132/1 1123/1131/1 11938/11946/1 11937/11945/1 +f 11950/11958/1 11933/11941/1 11936/11944/1 11951/11959/1 +f 4839/4847/1 17128/17136/1 11933/11941/1 11950/11958/1 +f 17128/17136/1 17127/17135/1 11934/11942/1 11933/11941/1 +f 2850/2858/1 11929/11937/1 11932/11940/1 2851/2859/1 +f 11951/11959/1 11936/11944/1 11929/11937/1 2850/2858/1 +f 11936/11944/1 11935/11943/1 11930/11938/1 11929/11937/1 +f 11922/11930/1 11925/11933/1 11928/11936/1 11923/11931/1 +f 11907/11915/1 2864/2872/1 11925/11933/1 11922/11930/1 +f 2864/2872/1 2863/2871/1 11926/11934/1 11925/11933/1 +f 14386/14394/1 11921/11929/1 11924/11932/1 14387/14395/1 +f 2099/2107/1 11908/11916/1 11921/11929/1 14386/14394/1 +f 11908/11916/1 11907/11915/1 11922/11930/1 11921/11929/1 +f 2038/2046/1 11917/11925/1 11920/11928/1 2039/2047/1 +f 14387/14395/1 11924/11932/1 11917/11925/1 2038/2046/1 +f 11924/11932/1 11923/11931/1 11918/11926/1 11917/11925/1 +f 11910/11918/1 11913/11921/1 11916/11924/1 11911/11919/1 +f 11775/11783/1 2908/2916/1 11913/11921/1 11910/11918/1 +f 2908/2916/1 2907/2915/1 11914/11922/1 11913/11921/1 +f 14206/14214/1 11909/11917/1 11912/11920/1 14207/14215/1 +f 1271/1279/1 11776/11784/1 11909/11917/1 14206/14214/1 +f 11776/11784/1 11775/11783/1 11910/11918/1 11909/11917/1 +f 2098/2106/1 11905/11913/1 11908/11916/1 2099/2107/1 +f 14207/14215/1 11912/11920/1 11905/11913/1 2098/2106/1 +f 11912/11920/1 11911/11919/1 11906/11914/1 11905/11913/1 +f 11898/11906/1 11901/11909/1 11904/11912/1 11899/11907/1 +f 15195/15203/1 1768/1776/1 11901/11909/1 11898/11906/1 +f 1768/1776/1 1767/1775/1 11902/11910/1 11901/11909/1 +f 11914/11922/1 11897/11905/1 11900/11908/1 11915/11923/1 +f 2907/2915/1 15196/15204/1 11897/11905/1 11914/11922/1 +f 15196/15204/1 15195/15203/1 11898/11906/1 11897/11905/1 +f 2862/2870/1 11893/11901/1 11896/11904/1 2863/2871/1 +f 11915/11923/1 11900/11908/1 11893/11901/1 2862/2870/1 +f 11900/11908/1 11899/11907/1 11894/11902/1 11893/11901/1 +f 11886/11894/1 11889/11897/1 11892/11900/1 11887/11895/1 +f 11871/11879/1 2876/2884/1 11889/11897/1 11886/11894/1 +f 2876/2884/1 2875/2883/1 11890/11898/1 11889/11897/1 +f 17398/17406/1 11885/11893/1 11888/11896/1 17399/17407/1 +f 5111/5119/1 11872/11880/1 11885/11893/1 17398/17406/1 +f 11872/11880/1 11871/11879/1 11886/11894/1 11885/11893/1 +f 1034/1042/1 11881/11889/1 11884/11892/1 1035/1043/1 +f 17399/17407/1 11888/11896/1 11881/11889/1 1034/1042/1 +f 11888/11896/1 11887/11895/1 11882/11890/1 11881/11889/1 +f 11874/11882/1 11877/11885/1 11880/11888/1 11875/11883/1 +f 11919/11927/1 2860/2868/1 11877/11885/1 11874/11882/1 +f 2860/2868/1 2859/2867/1 11878/11886/1 11877/11885/1 +f 5170/5178/1 11873/11881/1 11876/11884/1 5171/5179/1 +f 2039/2047/1 11920/11928/1 11873/11881/1 5170/5178/1 +f 11920/11928/1 11919/11927/1 11874/11882/1 11873/11881/1 +f 5110/5118/1 11869/11877/1 11872/11880/1 5111/5119/1 +f 5171/5179/1 11876/11884/1 11869/11877/1 5110/5118/1 +f 11876/11884/1 11875/11883/1 11870/11878/1 11869/11877/1 +f 11862/11870/1 11865/11873/1 11868/11876/1 11863/11871/1 +f 15147/15155/1 1784/1792/1 11865/11873/1 11862/11870/1 +f 1784/1792/1 1783/1791/1 11866/11874/1 11865/11873/1 +f 11878/11886/1 11861/11869/1 11864/11872/1 11879/11887/1 +f 2859/2867/1 15148/15156/1 11861/11869/1 11878/11886/1 +f 15148/15156/1 15147/15155/1 11862/11870/1 11861/11869/1 +f 2874/2882/1 11857/11865/1 11860/11868/1 2875/2883/1 +f 11879/11887/1 11864/11872/1 11857/11865/1 2874/2882/1 +f 11864/11872/1 11863/11871/1 11858/11866/1 11857/11865/1 +f 11850/11858/1 11853/11861/1 11856/11864/1 11851/11859/1 +f 11835/11843/1 2888/2896/1 11853/11861/1 11850/11858/1 +f 2888/2896/1 2887/2895/1 11854/11862/1 11853/11861/1 +f 15190/15198/1 11849/11857/1 11852/11860/1 15191/15199/1 +f 2903/2911/1 11836/11844/1 11849/11857/1 15190/15198/1 +f 11836/11844/1 11835/11843/1 11850/11858/1 11849/11857/1 +f 1770/1778/1 11845/11853/1 11848/11856/1 1771/1779/1 +f 15191/15199/1 11852/11860/1 11845/11853/1 1770/1778/1 +f 11852/11860/1 11851/11859/1 11846/11854/1 11845/11853/1 +f 11838/11846/1 11841/11849/1 11844/11852/1 11839/11847/1 +f 5835/5843/1 4888/4896/1 11841/11849/1 11838/11846/1 +f 4888/4896/1 4887/4895/1 11842/11850/1 11841/11849/1 +f 11794/11802/1 11837/11845/1 11840/11848/1 11795/11803/1 +f 1815/1823/1 5836/5844/1 11837/11845/1 11794/11802/1 +f 5836/5844/1 5835/5843/1 11838/11846/1 11837/11845/1 +f 2902/2910/1 11833/11841/1 11836/11844/1 2903/2911/1 +f 11795/11803/1 11840/11848/1 11833/11841/1 2902/2910/1 +f 11840/11848/1 11839/11847/1 11834/11842/1 11833/11841/1 +f 11826/11834/1 11829/11837/1 11832/11840/1 11827/11835/1 +f 17175/17183/1 1108/1116/1 11829/11837/1 11826/11834/1 +f 1108/1116/1 1107/1115/1 11830/11838/1 11829/11837/1 +f 11842/11850/1 11825/11833/1 11828/11836/1 11843/11851/1 +f 4887/4895/1 17176/17184/1 11825/11833/1 11842/11850/1 +f 17176/17184/1 17175/17183/1 11826/11834/1 11825/11833/1 +f 2886/2894/1 11821/11829/1 11824/11832/1 2887/2895/1 +f 11843/11851/1 11828/11836/1 11821/11829/1 2886/2894/1 +f 11828/11836/1 11827/11835/1 11822/11830/1 11821/11829/1 +f 11814/11822/1 11817/11825/1 11820/11828/1 11815/11823/1 +f 11799/11807/1 2900/2908/1 11817/11825/1 11814/11822/1 +f 2900/2908/1 2899/2907/1 11818/11826/1 11817/11825/1 +f 16510/16518/1 11813/11821/1 11816/11824/1 16511/16519/1 +f 4223/4231/1 11800/11808/1 11813/11821/1 16510/16518/1 +f 11800/11808/1 11799/11807/1 11814/11822/1 11813/11821/1 +f 1330/1338/1 11809/11817/1 11812/11820/1 1331/1339/1 +f 16511/16519/1 11816/11824/1 11809/11817/1 1330/1338/1 +f 11816/11824/1 11815/11823/1 11810/11818/1 11809/11817/1 +f 11802/11810/1 11805/11813/1 11808/11816/1 11803/11811/1 +f 12207/12215/1 2764/2772/1 11805/11813/1 11802/11810/1 +f 2764/2772/1 2763/2771/1 11806/11814/1 11805/11813/1 +f 7834/7842/1 11801/11809/1 11804/11812/1 7835/7843/1 +f 1079/1087/1 12208/12216/1 11801/11809/1 7834/7842/1 +f 12208/12216/1 12207/12215/1 11802/11810/1 11801/11809/1 +f 4222/4230/1 11797/11805/1 11800/11808/1 4223/4231/1 +f 7835/7843/1 11804/11812/1 11797/11805/1 4222/4230/1 +f 11804/11812/1 11803/11811/1 11798/11806/1 11797/11805/1 +f 11790/11798/1 11793/11801/1 11796/11804/1 11791/11799/1 +f 15051/15059/1 1816/1824/1 11793/11801/1 11790/11798/1 +f 1816/1824/1 1815/1823/1 11794/11802/1 11793/11801/1 +f 11806/11814/1 11789/11797/1 11792/11800/1 11807/11815/1 +f 2763/2771/1 15052/15060/1 11789/11797/1 11806/11814/1 +f 15052/15060/1 15051/15059/1 11790/11798/1 11789/11797/1 +f 2898/2906/1 11785/11793/1 11788/11796/1 2899/2907/1 +f 11807/11815/1 11792/11800/1 11785/11793/1 2898/2906/1 +f 11792/11800/1 11791/11799/1 11786/11794/1 11785/11793/1 +f 11778/11786/1 11781/11789/1 11784/11792/1 11779/11787/1 +f 11763/11771/1 2912/2920/1 11781/11789/1 11778/11786/1 +f 2912/2920/1 2911/2919/1 11782/11790/1 11781/11789/1 +f 16690/16698/1 11777/11785/1 11780/11788/1 16691/16699/1 +f 4403/4411/1 11764/11772/1 11777/11785/1 16690/16698/1 +f 11764/11772/1 11763/11771/1 11778/11786/1 11777/11785/1 +f 1270/1278/1 11773/11781/1 11776/11784/1 1271/1279/1 +f 16691/16699/1 11780/11788/1 11773/11781/1 1270/1278/1 +f 11780/11788/1 11779/11787/1 11774/11782/1 11773/11781/1 +f 11766/11774/1 11769/11777/1 11772/11780/1 11767/11775/1 +f 11811/11819/1 2896/2904/1 11769/11777/1 11766/11774/1 +f 2896/2904/1 2895/2903/1 11770/11778/1 11769/11777/1 +f 7294/7302/1 11765/11773/1 11768/11776/1 7295/7303/1 +f 1331/1339/1 11812/11820/1 11765/11773/1 7294/7302/1 +f 11812/11820/1 11811/11819/1 11766/11774/1 11765/11773/1 +f 4402/4410/1 11761/11769/1 11764/11772/1 4403/4411/1 +f 7295/7303/1 11768/11776/1 11761/11769/1 4402/4410/1 +f 11768/11776/1 11767/11775/1 11762/11770/1 11761/11769/1 +f 11754/11762/1 11757/11765/1 11760/11768/1 11755/11763/1 +f 15183/15191/1 1772/1780/1 11757/11765/1 11754/11762/1 +f 1772/1780/1 1771/1779/1 11758/11766/1 11757/11765/1 +f 11770/11778/1 11753/11761/1 11756/11764/1 11771/11779/1 +f 2895/2903/1 15184/15192/1 11753/11761/1 11770/11778/1 +f 15184/15192/1 15183/15191/1 11754/11762/1 11753/11761/1 +f 2910/2918/1 11749/11757/1 11752/11760/1 2911/2919/1 +f 11771/11779/1 11756/11764/1 11749/11757/1 2910/2918/1 +f 11756/11764/1 11755/11763/1 11750/11758/1 11749/11757/1 +f 11742/11750/1 11745/11753/1 11748/11756/1 11743/11751/1 +f 11727/11735/1 2924/2932/1 11745/11753/1 11742/11750/1 +f 2924/2932/1 2923/2931/1 11746/11754/1 11745/11753/1 +f 15226/15234/1 11741/11749/1 11744/11752/1 15227/15235/1 +f 2939/2947/1 11728/11736/1 11741/11749/1 15226/15234/1 +f 11728/11736/1 11727/11735/1 11742/11750/1 11741/11749/1 +f 1758/1766/1 11737/11745/1 11740/11748/1 1759/1767/1 +f 15227/15235/1 11744/11752/1 11737/11745/1 1758/1766/1 +f 11744/11752/1 11743/11751/1 11738/11746/1 11737/11745/1 +f 11730/11738/1 11733/11741/1 11736/11744/1 11731/11739/1 +f 5655/5663/1 4948/4956/1 11733/11741/1 11730/11738/1 +f 4948/4956/1 4947/4955/1 11734/11742/1 11733/11741/1 +f 11686/11694/1 11729/11737/1 11732/11740/1 11687/11695/1 +f 1875/1883/1 5656/5664/1 11729/11737/1 11686/11694/1 +f 5656/5664/1 5655/5663/1 11730/11738/1 11729/11737/1 +f 2938/2946/1 11725/11733/1 11728/11736/1 2939/2947/1 +f 11687/11695/1 11732/11740/1 11725/11733/1 2938/2946/1 +f 11732/11740/1 11731/11739/1 11726/11734/1 11725/11733/1 +f 11718/11726/1 11721/11729/1 11724/11732/1 11719/11727/1 +f 17235/17243/1 1088/1096/1 11721/11729/1 11718/11726/1 +f 1088/1096/1 1087/1095/1 11722/11730/1 11721/11729/1 +f 11734/11742/1 11717/11725/1 11720/11728/1 11735/11743/1 +f 4947/4955/1 17236/17244/1 11717/11725/1 11734/11742/1 +f 17236/17244/1 17235/17243/1 11718/11726/1 11717/11725/1 +f 2922/2930/1 11713/11721/1 11716/11724/1 2923/2931/1 +f 11735/11743/1 11720/11728/1 11713/11721/1 2922/2930/1 +f 11720/11728/1 11719/11727/1 11714/11722/1 11713/11721/1 +f 11706/11714/1 11709/11717/1 11712/11720/1 11707/11715/1 +f 11691/11699/1 2936/2944/1 11709/11717/1 11706/11714/1 +f 2936/2944/1 2935/2943/1 11710/11718/1 11709/11717/1 +f 15178/15186/1 11705/11713/1 11708/11716/1 15179/15187/1 +f 2891/2899/1 11692/11700/1 11705/11713/1 15178/15186/1 +f 11692/11700/1 11691/11699/1 11706/11714/1 11705/11713/1 +f 1774/1782/1 11701/11709/1 11704/11712/1 1775/1783/1 +f 15179/15187/1 11708/11716/1 11701/11709/1 1774/1782/1 +f 11708/11716/1 11707/11715/1 11702/11710/1 11701/11709/1 +f 11694/11702/1 11697/11705/1 11700/11708/1 11695/11703/1 +f 12747/12755/1 2584/2592/1 11697/11705/1 11694/11702/1 +f 2584/2592/1 2583/2591/1 11698/11706/1 11697/11705/1 +f 11830/11838/1 11693/11701/1 11696/11704/1 11831/11839/1 +f 1107/1115/1 12748/12756/1 11693/11701/1 11830/11838/1 +f 12748/12756/1 12747/12755/1 11694/11702/1 11693/11701/1 +f 2890/2898/1 11689/11697/1 11692/11700/1 2891/2899/1 +f 11831/11839/1 11696/11704/1 11689/11697/1 2890/2898/1 +f 11696/11704/1 11695/11703/1 11690/11698/1 11689/11697/1 +f 11682/11690/1 11685/11693/1 11688/11696/1 11683/11691/1 +f 14871/14879/1 1876/1884/1 11685/11693/1 11682/11690/1 +f 1876/1884/1 1875/1883/1 11686/11694/1 11685/11693/1 +f 11698/11706/1 11681/11689/1 11684/11692/1 11699/11707/1 +f 2583/2591/1 14872/14880/1 11681/11689/1 11698/11706/1 +f 14872/14880/1 14871/14879/1 11682/11690/1 11681/11689/1 +f 2934/2942/1 11677/11685/1 11680/11688/1 2935/2943/1 +f 11699/11707/1 11684/11692/1 11677/11685/1 2934/2942/1 +f 11684/11692/1 11683/11691/1 11678/11686/1 11677/11685/1 +f 11670/11678/1 11673/11681/1 11676/11684/1 11671/11679/1 +f 11655/11663/1 2948/2956/1 11673/11681/1 11670/11678/1 +f 2948/2956/1 2947/2955/1 11674/11682/1 11673/11681/1 +f 17134/17142/1 11669/11677/1 11672/11680/1 17135/17143/1 +f 4847/4855/1 11656/11664/1 11669/11677/1 17134/17142/1 +f 11656/11664/1 11655/11663/1 11670/11678/1 11669/11677/1 +f 1122/1130/1 11665/11673/1 11668/11676/1 1123/1131/1 +f 17135/17143/1 11672/11680/1 11665/11673/1 1122/1130/1 +f 11672/11680/1 11671/11679/1 11666/11674/1 11665/11673/1 +f 11658/11666/1 11661/11669/1 11664/11672/1 11659/11667/1 +f 11703/11711/1 2932/2940/1 11661/11669/1 11658/11666/1 +f 2932/2940/1 2931/2939/1 11662/11670/1 11661/11669/1 +f 5962/5970/1 11657/11665/1 11660/11668/1 5963/5971/1 +f 1775/1783/1 11704/11712/1 11657/11665/1 5962/5970/1 +f 11704/11712/1 11703/11711/1 11658/11666/1 11657/11665/1 +f 4846/4854/1 11653/11661/1 11656/11664/1 4847/4855/1 +f 5963/5971/1 11660/11668/1 11653/11661/1 4846/4854/1 +f 11660/11668/1 11659/11667/1 11654/11662/1 11653/11661/1 +f 11646/11654/1 11649/11657/1 11652/11660/1 11647/11655/1 +f 15219/15227/1 1760/1768/1 11649/11657/1 11646/11654/1 +f 1760/1768/1 1759/1767/1 11650/11658/1 11649/11657/1 +f 11662/11670/1 11645/11653/1 11648/11656/1 11663/11671/1 +f 2931/2939/1 15220/15228/1 11645/11653/1 11662/11670/1 +f 15220/15228/1 15219/15227/1 11646/11654/1 11645/11653/1 +f 2946/2954/1 11641/11649/1 11644/11652/1 2947/2955/1 +f 11663/11671/1 11648/11656/1 11641/11649/1 2946/2954/1 +f 11648/11656/1 11647/11655/1 11642/11650/1 11641/11649/1 +f 11634/11642/1 11637/11645/1 11640/11648/1 11635/11643/1 +f 11619/11627/1 2960/2968/1 11637/11645/1 11634/11642/1 +f 2960/2968/1 2959/2967/1 11638/11646/1 11637/11645/1 +f 15262/15270/1 11633/11641/1 11636/11644/1 15263/15271/1 +f 2975/2983/1 11620/11628/1 11633/11641/1 15262/15270/1 +f 11620/11628/1 11619/11627/1 11634/11642/1 11633/11641/1 +f 1746/1754/1 11629/11637/1 11632/11640/1 1747/1755/1 +f 15263/15271/1 11636/11644/1 11629/11637/1 1746/1754/1 +f 11636/11644/1 11635/11643/1 11630/11638/1 11629/11637/1 +f 11622/11630/1 11625/11633/1 11628/11636/1 11623/11631/1 +f 6087/6095/1 4804/4812/1 11625/11633/1 11622/11630/1 +f 4804/4812/1 4803/4811/1 11626/11634/1 11625/11633/1 +f 11578/11586/1 11621/11629/1 11624/11632/1 11579/11587/1 +f 1731/1739/1 6088/6096/1 11621/11629/1 11578/11586/1 +f 6088/6096/1 6087/6095/1 11622/11630/1 11621/11629/1 +f 2974/2982/1 11617/11625/1 11620/11628/1 2975/2983/1 +f 11579/11587/1 11624/11632/1 11617/11625/1 2974/2982/1 +f 11624/11632/1 11623/11631/1 11618/11626/1 11617/11625/1 +f 11610/11618/1 11613/11621/1 11616/11624/1 11611/11619/1 +f 17091/17099/1 1136/1144/1 11613/11621/1 11610/11618/1 +f 1136/1144/1 1135/1143/1 11614/11622/1 11613/11621/1 +f 11626/11634/1 11609/11617/1 11612/11620/1 11627/11635/1 +f 4803/4811/1 17092/17100/1 11609/11617/1 11626/11634/1 +f 17092/17100/1 17091/17099/1 11610/11618/1 11609/11617/1 +f 2958/2966/1 11605/11613/1 11608/11616/1 2959/2967/1 +f 11627/11635/1 11612/11620/1 11605/11613/1 2958/2966/1 +f 11612/11620/1 11611/11619/1 11606/11614/1 11605/11613/1 +f 11598/11606/1 11601/11609/1 11604/11612/1 11599/11607/1 +f 11583/11591/1 2972/2980/1 11601/11609/1 11598/11606/1 +f 2972/2980/1 2971/2979/1 11602/11610/1 11601/11609/1 +f 14746/14754/1 11597/11605/1 11600/11608/1 14747/14755/1 +f 2459/2467/1 11584/11592/1 11597/11605/1 14746/14754/1 +f 11584/11592/1 11583/11591/1 11598/11606/1 11597/11605/1 +f 1918/1926/1 11593/11601/1 11596/11604/1 1919/1927/1 +f 14747/14755/1 11600/11608/1 11593/11601/1 1918/1926/1 +f 11600/11608/1 11599/11607/1 11594/11602/1 11593/11601/1 +f 11586/11594/1 11589/11597/1 11592/11600/1 11587/11595/1 +f 11451/11459/1 3016/3024/1 11589/11597/1 11586/11594/1 +f 3016/3024/1 3015/3023/1 11590/11598/1 11589/11597/1 +f 13126/13134/1 11585/11593/1 11588/11596/1 13127/13135/1 +f 1151/1159/1 11452/11460/1 11585/11593/1 13126/13134/1 +f 11452/11460/1 11451/11459/1 11586/11594/1 11585/11593/1 +f 2458/2466/1 11581/11589/1 11584/11592/1 2459/2467/1 +f 13127/13135/1 11588/11596/1 11581/11589/1 2458/2466/1 +f 11588/11596/1 11587/11595/1 11582/11590/1 11581/11589/1 +f 11574/11582/1 11577/11585/1 11580/11588/1 11575/11583/1 +f 15303/15311/1 1732/1740/1 11577/11585/1 11574/11582/1 +f 1732/1740/1 1731/1739/1 11578/11586/1 11577/11585/1 +f 11590/11598/1 11573/11581/1 11576/11584/1 11591/11599/1 +f 3015/3023/1 15304/15312/1 11573/11581/1 11590/11598/1 +f 15304/15312/1 15303/15311/1 11574/11582/1 11573/11581/1 +f 2970/2978/1 11569/11577/1 11572/11580/1 2971/2979/1 +f 11591/11599/1 11576/11584/1 11569/11577/1 2970/2978/1 +f 11576/11584/1 11575/11583/1 11570/11578/1 11569/11577/1 +f 11562/11570/1 11565/11573/1 11568/11576/1 11563/11571/1 +f 11547/11555/1 2984/2992/1 11565/11573/1 11562/11570/1 +f 2984/2992/1 2983/2991/1 11566/11574/1 11565/11573/1 +f 17278/17286/1 11561/11569/1 11564/11572/1 17279/17287/1 +f 4991/4999/1 11548/11556/1 11561/11569/1 17278/17286/1 +f 11548/11556/1 11547/11555/1 11562/11570/1 11561/11569/1 +f 1074/1082/1 11557/11565/1 11560/11568/1 1075/1083/1 +f 17279/17287/1 11564/11572/1 11557/11565/1 1074/1082/1 +f 11564/11572/1 11563/11571/1 11558/11566/1 11557/11565/1 +f 11550/11558/1 11553/11561/1 11556/11564/1 11551/11559/1 +f 11595/11603/1 2968/2976/1 11553/11561/1 11550/11558/1 +f 2968/2976/1 2967/2975/1 11554/11562/1 11553/11561/1 +f 5530/5538/1 11549/11557/1 11552/11560/1 5531/5539/1 +f 1919/1927/1 11596/11604/1 11549/11557/1 5530/5538/1 +f 11596/11604/1 11595/11603/1 11550/11558/1 11549/11557/1 +f 4990/4998/1 11545/11553/1 11548/11556/1 4991/4999/1 +f 5531/5539/1 11552/11560/1 11545/11553/1 4990/4998/1 +f 11552/11560/1 11551/11559/1 11546/11554/1 11545/11553/1 +f 11538/11546/1 11541/11549/1 11544/11552/1 11539/11547/1 +f 15255/15263/1 1748/1756/1 11541/11549/1 11538/11546/1 +f 1748/1756/1 1747/1755/1 11542/11550/1 11541/11549/1 +f 11554/11562/1 11537/11545/1 11540/11548/1 11555/11563/1 +f 2967/2975/1 15256/15264/1 11537/11545/1 11554/11562/1 +f 15256/15264/1 15255/15263/1 11538/11546/1 11537/11545/1 +f 2982/2990/1 11533/11541/1 11536/11544/1 2983/2991/1 +f 11555/11563/1 11540/11548/1 11533/11541/1 2982/2990/1 +f 11540/11548/1 11539/11547/1 11534/11542/1 11533/11541/1 +f 11526/11534/1 11529/11537/1 11532/11540/1 11527/11535/1 +f 11511/11519/1 2996/3004/1 11529/11537/1 11526/11534/1 +f 2996/3004/1 2995/3003/1 11530/11538/1 11529/11537/1 +f 15298/15306/1 11525/11533/1 11528/11536/1 15299/15307/1 +f 3011/3019/1 11512/11520/1 11525/11533/1 15298/15306/1 +f 11512/11520/1 11511/11519/1 11526/11534/1 11525/11533/1 +f 1734/1742/1 11521/11529/1 11524/11532/1 1735/1743/1 +f 15299/15307/1 11528/11536/1 11521/11529/1 1734/1742/1 +f 11528/11536/1 11527/11535/1 11522/11530/1 11521/11529/1 +f 11514/11522/1 11517/11525/1 11520/11528/1 11515/11523/1 +f 7131/7139/1 4456/4464/1 11517/11525/1 11514/11522/1 +f 4456/4464/1 4455/4463/1 11518/11526/1 11517/11525/1 +f 11470/11478/1 11513/11521/1 11516/11524/1 11471/11479/1 +f 1383/1391/1 7132/7140/1 11513/11521/1 11470/11478/1 +f 7132/7140/1 7131/7139/1 11514/11522/1 11513/11521/1 +f 3010/3018/1 11509/11517/1 11512/11520/1 3011/3019/1 +f 11471/11479/1 11516/11524/1 11509/11517/1 3010/3018/1 +f 11516/11524/1 11515/11523/1 11510/11518/1 11509/11517/1 +f 11502/11510/1 11505/11513/1 11508/11516/1 11503/11511/1 +f 16743/16751/1 1252/1260/1 11505/11513/1 11502/11510/1 +f 1252/1260/1 1251/1259/1 11506/11514/1 11505/11513/1 +f 11518/11526/1 11501/11509/1 11504/11512/1 11519/11527/1 +f 4455/4463/1 16744/16752/1 11501/11509/1 11518/11526/1 +f 16744/16752/1 16743/16751/1 11502/11510/1 11501/11509/1 +f 2994/3002/1 11497/11505/1 11500/11508/1 2995/3003/1 +f 11519/11527/1 11504/11512/1 11497/11505/1 2994/3002/1 +f 11504/11512/1 11503/11511/1 11498/11506/1 11497/11505/1 +f 11490/11498/1 11493/11501/1 11496/11504/1 11491/11499/1 +f 11475/11483/1 3008/3016/1 11493/11501/1 11490/11498/1 +f 3008/3016/1 3007/3015/1 11494/11502/1 11493/11501/1 +f 15430/15438/1 11489/11497/1 11492/11500/1 15431/15439/1 +f 3143/3151/1 11476/11484/1 11489/11497/1 15430/15438/1 +f 11476/11484/1 11475/11483/1 11490/11498/1 11489/11497/1 +f 1690/1698/1 11485/11493/1 11488/11496/1 1691/1699/1 +f 15431/15439/1 11492/11500/1 11485/11493/1 1690/1698/1 +f 11492/11500/1 11491/11499/1 11486/11494/1 11485/11493/1 +f 11478/11486/1 11481/11489/1 11484/11492/1 11479/11487/1 +f 8319/8327/1 4060/4068/1 11481/11489/1 11478/11486/1 +f 4060/4068/1 4059/4067/1 11482/11490/1 11481/11489/1 +f 11074/11082/1 11477/11485/1 11480/11488/1 11075/11083/1 +f 1059/1067/1 8320/8328/1 11477/11485/1 11074/11082/1 +f 8320/8328/1 8319/8327/1 11478/11486/1 11477/11485/1 +f 3142/3150/1 11473/11481/1 11476/11484/1 3143/3151/1 +f 11075/11083/1 11480/11488/1 11473/11481/1 3142/3150/1 +f 11480/11488/1 11479/11487/1 11474/11482/1 11473/11481/1 +f 11466/11474/1 11469/11477/1 11472/11480/1 11467/11475/1 +f 16347/16355/1 1384/1392/1 11469/11477/1 11466/11474/1 +f 1384/1392/1 1383/1391/1 11470/11478/1 11469/11477/1 +f 11482/11490/1 11465/11473/1 11468/11476/1 11483/11491/1 +f 4059/4067/1 16348/16356/1 11465/11473/1 11482/11490/1 +f 16348/16356/1 16347/16355/1 11466/11474/1 11465/11473/1 +f 3006/3014/1 11461/11469/1 11464/11472/1 3007/3015/1 +f 11483/11491/1 11468/11476/1 11461/11469/1 3006/3014/1 +f 11468/11476/1 11467/11475/1 11462/11470/1 11461/11469/1 +f 11454/11462/1 11457/11465/1 11460/11468/1 11455/11463/1 +f 11439/11447/1 3020/3028/1 11457/11465/1 11454/11462/1 +f 3020/3028/1 3019/3027/1 11458/11466/1 11457/11465/1 +f 17050/17058/1 11453/11461/1 11456/11464/1 17051/17059/1 +f 4763/4771/1 11440/11448/1 11453/11461/1 17050/17058/1 +f 11440/11448/1 11439/11447/1 11454/11462/1 11453/11461/1 +f 1150/1158/1 11449/11457/1 11452/11460/1 1151/1159/1 +f 17051/17059/1 11456/11464/1 11449/11457/1 1150/1158/1 +f 11456/11464/1 11455/11463/1 11450/11458/1 11449/11457/1 +f 11442/11450/1 11445/11453/1 11448/11456/1 11443/11451/1 +f 11487/11495/1 3004/3012/1 11445/11453/1 11442/11450/1 +f 3004/3012/1 3003/3011/1 11446/11454/1 11445/11453/1 +f 6214/6222/1 11441/11449/1 11444/11452/1 6215/6223/1 +f 1691/1699/1 11488/11496/1 11441/11449/1 6214/6222/1 +f 11488/11496/1 11487/11495/1 11442/11450/1 11441/11449/1 +f 4762/4770/1 11437/11445/1 11440/11448/1 4763/4771/1 +f 6215/6223/1 11444/11452/1 11437/11445/1 4762/4770/1 +f 11444/11452/1 11443/11451/1 11438/11446/1 11437/11445/1 +f 11430/11438/1 11433/11441/1 11436/11444/1 11431/11439/1 +f 15291/15299/1 1736/1744/1 11433/11441/1 11430/11438/1 +f 1736/1744/1 1735/1743/1 11434/11442/1 11433/11441/1 +f 11446/11454/1 11429/11437/1 11432/11440/1 11447/11455/1 +f 3003/3011/1 15292/15300/1 11429/11437/1 11446/11454/1 +f 15292/15300/1 15291/15299/1 11430/11438/1 11429/11437/1 +f 3018/3026/1 11425/11433/1 11428/11436/1 3019/3027/1 +f 11447/11455/1 11432/11440/1 11425/11433/1 3018/3026/1 +f 11432/11440/1 11431/11439/1 11426/11434/1 11425/11433/1 +f 11418/11426/1 11421/11429/1 11424/11432/1 11419/11427/1 +f 11403/11411/1 3032/3040/1 11421/11429/1 11418/11426/1 +f 3032/3040/1 3031/3039/1 11422/11430/1 11421/11429/1 +f 15334/15342/1 11417/11425/1 11420/11428/1 15335/15343/1 +f 3047/3055/1 11404/11412/1 11417/11425/1 15334/15342/1 +f 11404/11412/1 11403/11411/1 11418/11426/1 11417/11425/1 +f 1722/1730/1 11413/11421/1 11416/11424/1 1723/1731/1 +f 15335/15343/1 11420/11428/1 11413/11421/1 1722/1730/1 +f 11420/11428/1 11419/11427/1 11414/11422/1 11413/11421/1 +f 11406/11414/1 11409/11417/1 11412/11420/1 11407/11415/1 +f 5223/5231/1 5092/5100/1 11409/11417/1 11406/11414/1 +f 5092/5100/1 5091/5099/1 11410/11418/1 11409/11417/1 +f 11362/11370/1 11405/11413/1 11408/11416/1 11363/11371/1 +f 2019/2027/1 5224/5232/1 11405/11413/1 11362/11370/1 +f 5224/5232/1 5223/5231/1 11406/11414/1 11405/11413/1 +f 3046/3054/1 11401/11409/1 11404/11412/1 3047/3055/1 +f 11363/11371/1 11408/11416/1 11401/11409/1 3046/3054/1 +f 11408/11416/1 11407/11415/1 11402/11410/1 11401/11409/1 +f 11394/11402/1 11397/11405/1 11400/11408/1 11395/11403/1 +f 17379/17387/1 1040/1048/1 11397/11405/1 11394/11402/1 +f 1040/1048/1 1039/1047/1 11398/11406/1 11397/11405/1 +f 11410/11418/1 11393/11401/1 11396/11404/1 11411/11419/1 +f 5091/5099/1 17380/17388/1 11393/11401/1 11410/11418/1 +f 17380/17388/1 17379/17387/1 11394/11402/1 11393/11401/1 +f 3030/3038/1 11389/11397/1 11392/11400/1 3031/3039/1 +f 11411/11419/1 11396/11404/1 11389/11397/1 3030/3038/1 +f 11396/11404/1 11395/11403/1 11390/11398/1 11389/11397/1 +f 11382/11390/1 11385/11393/1 11388/11396/1 11383/11391/1 +f 11367/11375/1 3044/3052/1 11385/11393/1 11382/11390/1 +f 3044/3052/1 3043/3051/1 11386/11394/1 11385/11393/1 +f 15286/15294/1 11381/11389/1 11384/11392/1 15287/15295/1 +f 2999/3007/1 11368/11376/1 11381/11389/1 15286/15294/1 +f 11368/11376/1 11367/11375/1 11382/11390/1 11381/11389/1 +f 1738/1746/1 11377/11385/1 11380/11388/1 1739/1747/1 +f 15287/15295/1 11384/11392/1 11377/11385/1 1738/1746/1 +f 11384/11392/1 11383/11391/1 11378/11386/1 11377/11385/1 +f 11370/11378/1 11373/11381/1 11376/11384/1 11371/11379/1 +f 14043/14051/1 2152/2160/1 11373/11381/1 11370/11378/1 +f 2152/2160/1 2151/2159/1 11374/11382/1 11373/11381/1 +f 11506/11514/1 11369/11377/1 11372/11380/1 11507/11515/1 +f 1251/1259/1 14044/14052/1 11369/11377/1 11506/11514/1 +f 14044/14052/1 14043/14051/1 11370/11378/1 11369/11377/1 +f 2998/3006/1 11365/11373/1 11368/11376/1 2999/3007/1 +f 11507/11515/1 11372/11380/1 11365/11373/1 2998/3006/1 +f 11372/11380/1 11371/11379/1 11366/11374/1 11365/11373/1 +f 11358/11366/1 11361/11369/1 11364/11372/1 11359/11367/1 +f 14439/14447/1 2020/2028/1 11361/11369/1 11358/11366/1 +f 2020/2028/1 2019/2027/1 11362/11370/1 11361/11369/1 +f 11374/11382/1 11357/11365/1 11360/11368/1 11375/11383/1 +f 2151/2159/1 14440/14448/1 11357/11365/1 11374/11382/1 +f 14440/14448/1 14439/14447/1 11358/11366/1 11357/11365/1 +f 3042/3050/1 11353/11361/1 11356/11364/1 3043/3051/1 +f 11375/11383/1 11360/11368/1 11353/11361/1 3042/3050/1 +f 11360/11368/1 11359/11367/1 11354/11362/1 11353/11361/1 +f 11346/11354/1 11349/11357/1 11352/11360/1 11347/11355/1 +f 11331/11339/1 3056/3064/1 11349/11357/1 11346/11354/1 +f 3056/3064/1 3055/3063/1 11350/11358/1 11349/11357/1 +f 17098/17106/1 11345/11353/1 11348/11356/1 17099/17107/1 +f 4811/4819/1 11332/11340/1 11345/11353/1 17098/17106/1 +f 11332/11340/1 11331/11339/1 11346/11354/1 11345/11353/1 +f 1134/1142/1 11341/11349/1 11344/11352/1 1135/1143/1 +f 17099/17107/1 11348/11356/1 11341/11349/1 1134/1142/1 +f 11348/11356/1 11347/11355/1 11342/11350/1 11341/11349/1 +f 11334/11342/1 11337/11345/1 11340/11348/1 11335/11343/1 +f 11379/11387/1 3040/3048/1 11337/11345/1 11334/11342/1 +f 3040/3048/1 3039/3047/1 11338/11346/1 11337/11345/1 +f 6070/6078/1 11333/11341/1 11336/11344/1 6071/6079/1 +f 1739/1747/1 11380/11388/1 11333/11341/1 6070/6078/1 +f 11380/11388/1 11379/11387/1 11334/11342/1 11333/11341/1 +f 4810/4818/1 11329/11337/1 11332/11340/1 4811/4819/1 +f 6071/6079/1 11336/11344/1 11329/11337/1 4810/4818/1 +f 11336/11344/1 11335/11343/1 11330/11338/1 11329/11337/1 +f 11322/11330/1 11325/11333/1 11328/11336/1 11323/11331/1 +f 15327/15335/1 1724/1732/1 11325/11333/1 11322/11330/1 +f 1724/1732/1 1723/1731/1 11326/11334/1 11325/11333/1 +f 11338/11346/1 11321/11329/1 11324/11332/1 11339/11347/1 +f 3039/3047/1 15328/15336/1 11321/11329/1 11338/11346/1 +f 15328/15336/1 15327/15335/1 11322/11330/1 11321/11329/1 +f 3054/3062/1 11317/11325/1 11320/11328/1 3055/3063/1 +f 11339/11347/1 11324/11332/1 11317/11325/1 3054/3062/1 +f 11324/11332/1 11323/11331/1 11318/11326/1 11317/11325/1 +f 11310/11318/1 11313/11321/1 11316/11324/1 11311/11319/1 +f 11295/11303/1 3068/3076/1 11313/11321/1 11310/11318/1 +f 3068/3076/1 3067/3075/1 11314/11322/1 11313/11321/1 +f 15370/15378/1 11309/11317/1 11312/11320/1 15371/15379/1 +f 3083/3091/1 11296/11304/1 11309/11317/1 15370/15378/1 +f 11296/11304/1 11295/11303/1 11310/11318/1 11309/11317/1 +f 1710/1718/1 11305/11313/1 11308/11316/1 1711/1719/1 +f 15371/15379/1 11312/11320/1 11305/11313/1 1710/1718/1 +f 11312/11320/1 11311/11319/1 11306/11314/1 11305/11313/1 +f 11298/11306/1 11301/11309/1 11304/11312/1 11299/11307/1 +f 6195/6203/1 4768/4776/1 11301/11309/1 11298/11306/1 +f 4768/4776/1 4767/4775/1 11302/11310/1 11301/11309/1 +f 11254/11262/1 11297/11305/1 11300/11308/1 11255/11263/1 +f 1695/1703/1 6196/6204/1 11297/11305/1 11254/11262/1 +f 6196/6204/1 6195/6203/1 11298/11306/1 11297/11305/1 +f 3082/3090/1 11293/11301/1 11296/11304/1 3083/3091/1 +f 11255/11263/1 11300/11308/1 11293/11301/1 3082/3090/1 +f 11300/11308/1 11299/11307/1 11294/11302/1 11293/11301/1 +f 11286/11294/1 11289/11297/1 11292/11300/1 11287/11295/1 +f 17055/17063/1 1148/1156/1 11289/11297/1 11286/11294/1 +f 1148/1156/1 1147/1155/1 11290/11298/1 11289/11297/1 +f 11302/11310/1 11285/11293/1 11288/11296/1 11303/11311/1 +f 4767/4775/1 17056/17064/1 11285/11293/1 11302/11310/1 +f 17056/17064/1 17055/17063/1 11286/11294/1 11285/11293/1 +f 3066/3074/1 11281/11289/1 11284/11292/1 3067/3075/1 +f 11303/11311/1 11288/11296/1 11281/11289/1 3066/3074/1 +f 11288/11296/1 11287/11295/1 11282/11290/1 11281/11289/1 +f 11274/11282/1 11277/11285/1 11280/11288/1 11275/11283/1 +f 11259/11267/1 3080/3088/1 11277/11285/1 11274/11282/1 +f 3080/3088/1 3079/3087/1 11278/11286/1 11277/11285/1 +f 17413/17421/1 11273/11281/1 11276/11284/1 17414/17422/1 +f 17415/17423/1 11260/11268/1 11273/11281/1 17413/17421/1 +f 11260/11268/1 11259/11267/1 11274/11282/1 11273/11281/1 +f 17416/17424/1 11269/11277/1 11272/11280/1 17417/17425/1 +f 17414/17422/1 11276/11284/1 11269/11277/1 17416/17424/1 +f 11276/11284/1 11275/11283/1 11270/11278/1 11269/11277/1 +f 11262/11270/1 11265/11273/1 11268/11276/1 11263/11271/1 +f 11127/11135/1 3124/3132/1 11265/11273/1 11262/11270/1 +f 3124/3132/1 3123/3131/1 11266/11274/1 11265/11273/1 +f 17418/17426/1 11261/11269/1 11264/11272/1 17419/17427/1 +f 17420/17428/1 11128/11136/1 11261/11269/1 17418/17426/1 +f 11128/11136/1 11127/11135/1 11262/11270/1 11261/11269/1 +f 17421/17429/1 11257/11265/1 11260/11268/1 17415/17423/1 +f 17419/17427/1 11264/11272/1 11257/11265/1 17421/17429/1 +f 11264/11272/1 11263/11271/1 11258/11266/1 11257/11265/1 +f 11250/11258/1 11253/11261/1 11256/11264/1 11251/11259/1 +f 15411/15419/1 1696/1704/1 11253/11261/1 11250/11258/1 +f 1696/1704/1 1695/1703/1 11254/11262/1 11253/11261/1 +f 11266/11274/1 11249/11257/1 11252/11260/1 11267/11275/1 +f 3123/3131/1 15412/15420/1 11249/11257/1 11266/11274/1 +f 15412/15420/1 15411/15419/1 11250/11258/1 11249/11257/1 +f 3078/3086/1 11245/11253/1 11248/11256/1 3079/3087/1 +f 11267/11275/1 11252/11260/1 11245/11253/1 3078/3086/1 +f 11252/11260/1 11251/11259/1 11246/11254/1 11245/11253/1 +f 11238/11246/1 11241/11249/1 11244/11252/1 11239/11247/1 +f 11223/11231/1 3092/3100/1 11241/11249/1 11238/11246/1 +f 3092/3100/1 3091/3099/1 11242/11250/1 11241/11249/1 +f 17422/17430/1 11237/11245/1 11240/11248/1 17423/17431/1 +f 17424/17432/1 11224/11232/1 11237/11245/1 17422/17430/1 +f 11224/11232/1 11223/11231/1 11238/11246/1 11237/11245/1 +f 17425/17433/1 11233/11241/1 11236/11244/1 17426/17434/1 +f 17423/17431/1 11240/11248/1 11233/11241/1 17425/17433/1 +f 11240/11248/1 11239/11247/1 11234/11242/1 11233/11241/1 +f 11226/11234/1 11229/11237/1 11232/11240/1 11227/11235/1 +f 11271/11279/1 3076/3084/1 11229/11237/1 11226/11234/1 +f 3076/3084/1 3075/3083/1 11230/11238/1 11229/11237/1 +f 17427/17435/1 11225/11233/1 11228/11236/1 17428/17436/1 +f 17417/17425/1 11272/11280/1 11225/11233/1 17427/17435/1 +f 11272/11280/1 11271/11279/1 11226/11234/1 11225/11233/1 +f 17429/17437/1 11221/11229/1 11224/11232/1 17424/17432/1 +f 17428/17436/1 11228/11236/1 11221/11229/1 17429/17437/1 +f 11228/11236/1 11227/11235/1 11222/11230/1 11221/11229/1 +f 11214/11222/1 11217/11225/1 11220/11228/1 11215/11223/1 +f 15363/15371/1 1712/1720/1 11217/11225/1 11214/11222/1 +f 1712/1720/1 1711/1719/1 11218/11226/1 11217/11225/1 +f 11230/11238/1 11213/11221/1 11216/11224/1 11231/11239/1 +f 3075/3083/1 15364/15372/1 11213/11221/1 11230/11238/1 +f 15364/15372/1 15363/15371/1 11214/11222/1 11213/11221/1 +f 3090/3098/1 11209/11217/1 11212/11220/1 3091/3099/1 +f 11231/11239/1 11216/11224/1 11209/11217/1 3090/3098/1 +f 11216/11224/1 11215/11223/1 11210/11218/1 11209/11217/1 +f 11202/11210/1 11205/11213/1 11208/11216/1 11203/11211/1 +f 11187/11195/1 3104/3112/1 11205/11213/1 11202/11210/1 +f 3104/3112/1 3103/3111/1 11206/11214/1 11205/11213/1 +f 15406/15414/1 11201/11209/1 11204/11212/1 15407/15415/1 +f 3119/3127/1 11188/11196/1 11201/11209/1 15406/15414/1 +f 11188/11196/1 11187/11195/1 11202/11210/1 11201/11209/1 +f 1698/1706/1 11197/11205/1 11200/11208/1 1699/1707/1 +f 15407/15415/1 11204/11212/1 11197/11205/1 1698/1706/1 +f 11204/11212/1 11203/11211/1 11198/11206/1 11197/11205/1 +f 11190/11198/1 11193/11201/1 11196/11204/1 11191/11199/1 +f 6591/6599/1 4636/4644/1 11193/11201/1 11190/11198/1 +f 4636/4644/1 4635/4643/1 11194/11202/1 11193/11201/1 +f 11146/11154/1 11189/11197/1 11192/11200/1 11147/11155/1 +f 1563/1571/1 6592/6600/1 11189/11197/1 11146/11154/1 +f 6592/6600/1 6591/6599/1 11190/11198/1 11189/11197/1 +f 3118/3126/1 11185/11193/1 11188/11196/1 3119/3127/1 +f 11147/11155/1 11192/11200/1 11185/11193/1 3118/3126/1 +f 11192/11200/1 11191/11199/1 11186/11194/1 11185/11193/1 +f 11178/11186/1 11181/11189/1 11184/11192/1 11179/11187/1 +f 16923/16931/1 1192/1200/1 11181/11189/1 11178/11186/1 +f 1192/1200/1 1191/1199/1 11182/11190/1 11181/11189/1 +f 11194/11202/1 11177/11185/1 11180/11188/1 11195/11203/1 +f 4635/4643/1 16924/16932/1 11177/11185/1 11194/11202/1 +f 16924/16932/1 16923/16931/1 11178/11186/1 11177/11185/1 +f 3102/3110/1 11173/11181/1 11176/11184/1 3103/3111/1 +f 11195/11203/1 11180/11188/1 11173/11181/1 3102/3110/1 +f 11180/11188/1 11179/11187/1 11174/11182/1 11173/11181/1 +f 11166/11174/1 11169/11177/1 11172/11180/1 11167/11175/1 +f 11151/11159/1 3116/3124/1 11169/11177/1 11166/11174/1 +f 3116/3124/1 3115/3123/1 11170/11178/1 11169/11177/1 +f 17430/17438/1 11165/11173/1 11168/11176/1 17431/17439/1 +f 17432/17440/1 11152/11160/1 11165/11173/1 17430/17438/1 +f 11152/11160/1 11151/11159/1 11166/11174/1 11165/11173/1 +f 17433/17441/1 11161/11169/1 11164/11172/1 17434/17442/1 +f 17431/17439/1 11168/11176/1 11161/11169/1 17433/17441/1 +f 11168/11176/1 11167/11175/1 11162/11170/1 11161/11169/1 +f 11154/11162/1 11157/11165/1 11160/11168/1 11155/11163/1 +f 9939/9947/1 3520/3528/1 11157/11165/1 11154/11162/1 +f 3520/3528/1 3519/3527/1 11158/11166/1 11157/11165/1 +f 17435/17443/1 11153/11161/1 11156/11164/1 17436/17444/1 +f 17437/17445/1 9940/9948/1 11153/11161/1 17435/17443/1 +f 9940/9948/1 9939/9947/1 11154/11162/1 11153/11161/1 +f 17438/17446/1 11149/11157/1 11152/11160/1 17432/17440/1 +f 17436/17444/1 11156/11164/1 11149/11157/1 17438/17446/1 +f 11156/11164/1 11155/11163/1 11150/11158/1 11149/11157/1 +f 11142/11150/1 11145/11153/1 11148/11156/1 11143/11151/1 +f 15807/15815/1 1564/1572/1 11145/11153/1 11142/11150/1 +f 1564/1572/1 1563/1571/1 11146/11154/1 11145/11153/1 +f 11158/11166/1 11141/11149/1 11144/11152/1 11159/11167/1 +f 3519/3527/1 15808/15816/1 11141/11149/1 11158/11166/1 +f 15808/15816/1 15807/15815/1 11142/11150/1 11141/11149/1 +f 3114/3122/1 11137/11145/1 11140/11148/1 3115/3123/1 +f 11159/11167/1 11144/11152/1 11137/11145/1 3114/3122/1 +f 11144/11152/1 11143/11151/1 11138/11146/1 11137/11145/1 +f 11130/11138/1 11133/11141/1 11136/11144/1 11131/11139/1 +f 11115/11123/1 3128/3136/1 11133/11141/1 11130/11138/1 +f 3128/3136/1 3127/3135/1 11134/11142/1 11133/11141/1 +f 17439/17447/1 11129/11137/1 11132/11140/1 17440/17448/1 +f 17441/17449/1 11116/11124/1 11129/11137/1 17439/17447/1 +f 11116/11124/1 11115/11123/1 11130/11138/1 11129/11137/1 +f 17442/17450/1 11125/11133/1 11128/11136/1 17420/17428/1 +f 17440/17448/1 11132/11140/1 11125/11133/1 17442/17450/1 +f 11132/11140/1 11131/11139/1 11126/11134/1 11125/11133/1 +f 11118/11126/1 11121/11129/1 11124/11132/1 11119/11127/1 +f 11163/11171/1 3112/3120/1 11121/11129/1 11118/11126/1 +f 3112/3120/1 3111/3119/1 11122/11130/1 11121/11129/1 +f 17443/17451/1 11117/11125/1 11120/11128/1 17444/17452/1 +f 17434/17442/1 11164/11172/1 11117/11125/1 17443/17451/1 +f 11164/11172/1 11163/11171/1 11118/11126/1 11117/11125/1 +f 17445/17453/1 11113/11121/1 11116/11124/1 17441/17449/1 +f 17444/17452/1 11120/11128/1 11113/11121/1 17445/17453/1 +f 11120/11128/1 11119/11127/1 11114/11122/1 11113/11121/1 +f 11106/11114/1 11109/11117/1 11112/11120/1 11107/11115/1 +f 15399/15407/1 1700/1708/1 11109/11117/1 11106/11114/1 +f 1700/1708/1 1699/1707/1 11110/11118/1 11109/11117/1 +f 11122/11130/1 11105/11113/1 11108/11116/1 11123/11131/1 +f 3111/3119/1 15400/15408/1 11105/11113/1 11122/11130/1 +f 15400/15408/1 15399/15407/1 11106/11114/1 11105/11113/1 +f 3126/3134/1 11101/11109/1 11104/11112/1 3127/3135/1 +f 11123/11131/1 11108/11116/1 11101/11109/1 3126/3134/1 +f 11108/11116/1 11107/11115/1 11102/11110/1 11101/11109/1 +f 11094/11102/1 11097/11105/1 11100/11108/1 11095/11103/1 +f 11079/11087/1 3140/3148/1 11097/11105/1 11094/11102/1 +f 3140/3148/1 3139/3147/1 11098/11106/1 11097/11105/1 +f 15442/15450/1 11093/11101/1 11096/11104/1 15443/15451/1 +f 3155/3163/1 11080/11088/1 11093/11101/1 15442/15450/1 +f 11080/11088/1 11079/11087/1 11094/11102/1 11093/11101/1 +f 1686/1694/1 11089/11097/1 11092/11100/1 1687/1695/1 +f 15443/15451/1 11096/11104/1 11089/11097/1 1686/1694/1 +f 11096/11104/1 11095/11103/1 11090/11098/1 11089/11097/1 +f 11082/11090/1 11085/11093/1 11088/11096/1 11083/11091/1 +f 5403/5411/1 5032/5040/1 11085/11093/1 11082/11090/1 +f 5032/5040/1 5031/5039/1 11086/11094/1 11085/11093/1 +f 11038/11046/1 11081/11089/1 11084/11092/1 11039/11047/1 +f 1959/1967/1 5404/5412/1 11081/11089/1 11038/11046/1 +f 5404/5412/1 5403/5411/1 11082/11090/1 11081/11089/1 +f 3154/3162/1 11077/11085/1 11080/11088/1 3155/3163/1 +f 11039/11047/1 11084/11092/1 11077/11085/1 3154/3162/1 +f 11084/11092/1 11083/11091/1 11078/11086/1 11077/11085/1 +f 11070/11078/1 11073/11081/1 11076/11084/1 11071/11079/1 +f 17319/17327/1 1060/1068/1 11073/11081/1 11070/11078/1 +f 1060/1068/1 1059/1067/1 11074/11082/1 11073/11081/1 +f 11086/11094/1 11069/11077/1 11072/11080/1 11087/11095/1 +f 5031/5039/1 17320/17328/1 11069/11077/1 11086/11094/1 +f 17320/17328/1 17319/17327/1 11070/11078/1 11069/11077/1 +f 3138/3146/1 11065/11073/1 11068/11076/1 3139/3147/1 +f 11087/11095/1 11072/11080/1 11065/11073/1 3138/3146/1 +f 11072/11080/1 11071/11079/1 11066/11074/1 11065/11073/1 +f 11058/11066/1 11061/11069/1 11064/11072/1 11059/11067/1 +f 11043/11051/1 3152/3160/1 11061/11069/1 11058/11066/1 +f 3152/3160/1 3151/3159/1 11062/11070/1 11061/11069/1 +f 15394/15402/1 11057/11065/1 11060/11068/1 15395/15403/1 +f 3107/3115/1 11044/11052/1 11057/11065/1 15394/15402/1 +f 11044/11052/1 11043/11051/1 11058/11066/1 11057/11065/1 +f 1702/1710/1 11053/11061/1 11056/11064/1 1703/1711/1 +f 15395/15403/1 11060/11068/1 11053/11061/1 1702/1710/1 +f 11060/11068/1 11059/11067/1 11054/11062/1 11053/11061/1 +f 11046/11054/1 11049/11057/1 11052/11060/1 11047/11055/1 +f 13503/13511/1 2332/2340/1 11049/11057/1 11046/11054/1 +f 2332/2340/1 2331/2339/1 11050/11058/1 11049/11057/1 +f 11182/11190/1 11045/11053/1 11048/11056/1 11183/11191/1 +f 1191/1199/1 13504/13512/1 11045/11053/1 11182/11190/1 +f 13504/13512/1 13503/13511/1 11046/11054/1 11045/11053/1 +f 3106/3114/1 11041/11049/1 11044/11052/1 3107/3115/1 +f 11183/11191/1 11048/11056/1 11041/11049/1 3106/3114/1 +f 11048/11056/1 11047/11055/1 11042/11050/1 11041/11049/1 +f 11034/11042/1 11037/11045/1 11040/11048/1 11035/11043/1 +f 14619/14627/1 1960/1968/1 11037/11045/1 11034/11042/1 +f 1960/1968/1 1959/1967/1 11038/11046/1 11037/11045/1 +f 11050/11058/1 11033/11041/1 11036/11044/1 11051/11059/1 +f 2331/2339/1 14620/14628/1 11033/11041/1 11050/11058/1 +f 14620/14628/1 14619/14627/1 11034/11042/1 11033/11041/1 +f 3150/3158/1 11029/11037/1 11032/11040/1 3151/3159/1 +f 11051/11059/1 11036/11044/1 11029/11037/1 3150/3158/1 +f 11036/11044/1 11035/11043/1 11030/11038/1 11029/11037/1 +f 11022/11030/1 11025/11033/1 11028/11036/1 11023/11031/1 +f 11007/11015/1 3164/3172/1 11025/11033/1 11022/11030/1 +f 3164/3172/1 3163/3171/1 11026/11034/1 11025/11033/1 +f 17062/17070/1 11021/11029/1 11024/11032/1 17063/17071/1 +f 4775/4783/1 11008/11016/1 11021/11029/1 17062/17070/1 +f 11008/11016/1 11007/11015/1 11022/11030/1 11021/11029/1 +f 1146/1154/1 11017/11025/1 11020/11028/1 1147/1155/1 +f 17063/17071/1 11024/11032/1 11017/11025/1 1146/1154/1 +f 11024/11032/1 11023/11031/1 11018/11026/1 11017/11025/1 +f 11010/11018/1 11013/11021/1 11016/11024/1 11011/11019/1 +f 11055/11063/1 3148/3156/1 11013/11021/1 11010/11018/1 +f 3148/3156/1 3147/3155/1 11014/11022/1 11013/11021/1 +f 6178/6186/1 11009/11017/1 11012/11020/1 6179/6187/1 +f 1703/1711/1 11056/11064/1 11009/11017/1 6178/6186/1 +f 11056/11064/1 11055/11063/1 11010/11018/1 11009/11017/1 +f 4774/4782/1 11005/11013/1 11008/11016/1 4775/4783/1 +f 6179/6187/1 11012/11020/1 11005/11013/1 4774/4782/1 +f 11012/11020/1 11011/11019/1 11006/11014/1 11005/11013/1 +f 10998/11006/1 11001/11009/1 11004/11012/1 10999/11007/1 +f 15435/15443/1 1688/1696/1 11001/11009/1 10998/11006/1 +f 1688/1696/1 1687/1695/1 11002/11010/1 11001/11009/1 +f 11014/11022/1 10997/11005/1 11000/11008/1 11015/11023/1 +f 3147/3155/1 15436/15444/1 10997/11005/1 11014/11022/1 +f 15436/15444/1 15435/15443/1 10998/11006/1 10997/11005/1 +f 3162/3170/1 10993/11001/1 10996/11004/1 3163/3171/1 +f 11015/11023/1 11000/11008/1 10993/11001/1 3162/3170/1 +f 11000/11008/1 10999/11007/1 10994/11002/1 10993/11001/1 +f 10986/10994/1 10989/10997/1 10992/11000/1 10987/10995/1 +f 10971/10979/1 3176/3184/1 10989/10997/1 10986/10994/1 +f 3176/3184/1 3175/3183/1 10990/10998/1 10989/10997/1 +f 15478/15486/1 10985/10993/1 10988/10996/1 15479/15487/1 +f 3191/3199/1 10972/10980/1 10985/10993/1 15478/15486/1 +f 10972/10980/1 10971/10979/1 10986/10994/1 10985/10993/1 +f 1674/1682/1 10981/10989/1 10984/10992/1 1675/1683/1 +f 15479/15487/1 10988/10996/1 10981/10989/1 1674/1682/1 +f 10988/10996/1 10987/10995/1 10982/10990/1 10981/10989/1 +f 10974/10982/1 10977/10985/1 10980/10988/1 10975/10983/1 +f 6303/6311/1 4732/4740/1 10977/10985/1 10974/10982/1 +f 4732/4740/1 4731/4739/1 10978/10986/1 10977/10985/1 +f 10930/10938/1 10973/10981/1 10976/10984/1 10931/10939/1 +f 1659/1667/1 6304/6312/1 10973/10981/1 10930/10938/1 +f 6304/6312/1 6303/6311/1 10974/10982/1 10973/10981/1 +f 3190/3198/1 10969/10977/1 10972/10980/1 3191/3199/1 +f 10931/10939/1 10976/10984/1 10969/10977/1 3190/3198/1 +f 10976/10984/1 10975/10983/1 10970/10978/1 10969/10977/1 +f 10962/10970/1 10965/10973/1 10968/10976/1 10963/10971/1 +f 17019/17027/1 1160/1168/1 10965/10973/1 10962/10970/1 +f 1160/1168/1 1159/1167/1 10966/10974/1 10965/10973/1 +f 10978/10986/1 10961/10969/1 10964/10972/1 10979/10987/1 +f 4731/4739/1 17020/17028/1 10961/10969/1 10978/10986/1 +f 17020/17028/1 17019/17027/1 10962/10970/1 10961/10969/1 +f 3174/3182/1 10957/10965/1 10960/10968/1 3175/3183/1 +f 10979/10987/1 10964/10972/1 10957/10965/1 3174/3182/1 +f 10964/10972/1 10963/10971/1 10958/10966/1 10957/10965/1 +f 10950/10958/1 10953/10961/1 10956/10964/1 10951/10959/1 +f 10935/10943/1 3188/3196/1 10953/10961/1 10950/10958/1 +f 3188/3196/1 3187/3195/1 10954/10962/1 10953/10961/1 +f 17446/17454/1 10949/10957/1 10952/10960/1 17447/17455/1 +f 17448/17456/1 10936/10944/1 10949/10957/1 17446/17454/1 +f 10936/10944/1 10935/10943/1 10950/10958/1 10949/10957/1 +f 17449/17457/1 10945/10953/1 10948/10956/1 17450/17458/1 +f 17447/17455/1 10952/10960/1 10945/10953/1 17449/17457/1 +f 10952/10960/1 10951/10959/1 10946/10954/1 10945/10953/1 +f 10938/10946/1 10941/10949/1 10944/10952/1 10939/10947/1 +f 10803/10811/1 3232/3240/1 10941/10949/1 10938/10946/1 +f 3232/3240/1 3231/3239/1 10942/10950/1 10941/10949/1 +f 17451/17459/1 10937/10945/1 10940/10948/1 17452/17460/1 +f 17453/17461/1 10804/10812/1 10937/10945/1 17451/17459/1 +f 10804/10812/1 10803/10811/1 10938/10946/1 10937/10945/1 +f 17454/17462/1 10933/10941/1 10936/10944/1 17448/17456/1 +f 17452/17460/1 10940/10948/1 10933/10941/1 17454/17462/1 +f 10940/10948/1 10939/10947/1 10934/10942/1 10933/10941/1 +f 10926/10934/1 10929/10937/1 10932/10940/1 10927/10935/1 +f 15519/15527/1 1660/1668/1 10929/10937/1 10926/10934/1 +f 1660/1668/1 1659/1667/1 10930/10938/1 10929/10937/1 +f 10942/10950/1 10925/10933/1 10928/10936/1 10943/10951/1 +f 3231/3239/1 15520/15528/1 10925/10933/1 10942/10950/1 +f 15520/15528/1 15519/15527/1 10926/10934/1 10925/10933/1 +f 3186/3194/1 10921/10929/1 10924/10932/1 3187/3195/1 +f 10943/10951/1 10928/10936/1 10921/10929/1 3186/3194/1 +f 10928/10936/1 10927/10935/1 10922/10930/1 10921/10929/1 +f 10914/10922/1 10917/10925/1 10920/10928/1 10915/10923/1 +f 10899/10907/1 3200/3208/1 10917/10925/1 10914/10922/1 +f 3200/3208/1 3199/3207/1 10918/10926/1 10917/10925/1 +f 17455/17463/1 10913/10921/1 10916/10924/1 17456/17464/1 +f 17457/17465/1 10900/10908/1 10913/10921/1 17455/17463/1 +f 10900/10908/1 10899/10907/1 10914/10922/1 10913/10921/1 +f 17458/17466/1 10909/10917/1 10912/10920/1 17459/17467/1 +f 17456/17464/1 10916/10924/1 10909/10917/1 17458/17466/1 +f 10916/10924/1 10915/10923/1 10910/10918/1 10909/10917/1 +f 10902/10910/1 10905/10913/1 10908/10916/1 10903/10911/1 +f 10947/10955/1 3184/3192/1 10905/10913/1 10902/10910/1 +f 3184/3192/1 3183/3191/1 10906/10914/1 10905/10913/1 +f 17460/17468/1 10901/10909/1 10904/10912/1 17461/17469/1 +f 17450/17458/1 10948/10956/1 10901/10909/1 17460/17468/1 +f 10948/10956/1 10947/10955/1 10902/10910/1 10901/10909/1 +f 17462/17470/1 10897/10905/1 10900/10908/1 17457/17465/1 +f 17461/17469/1 10904/10912/1 10897/10905/1 17462/17470/1 +f 10904/10912/1 10903/10911/1 10898/10906/1 10897/10905/1 +f 10890/10898/1 10893/10901/1 10896/10904/1 10891/10899/1 +f 15471/15479/1 1676/1684/1 10893/10901/1 10890/10898/1 +f 1676/1684/1 1675/1683/1 10894/10902/1 10893/10901/1 +f 10906/10914/1 10889/10897/1 10892/10900/1 10907/10915/1 +f 3183/3191/1 15472/15480/1 10889/10897/1 10906/10914/1 +f 15472/15480/1 15471/15479/1 10890/10898/1 10889/10897/1 +f 3198/3206/1 10885/10893/1 10888/10896/1 3199/3207/1 +f 10907/10915/1 10892/10900/1 10885/10893/1 3198/3206/1 +f 10892/10900/1 10891/10899/1 10886/10894/1 10885/10893/1 +f 10878/10886/1 10881/10889/1 10884/10892/1 10879/10887/1 +f 10863/10871/1 3212/3220/1 10881/10889/1 10878/10886/1 +f 3212/3220/1 3211/3219/1 10882/10890/1 10881/10889/1 +f 15514/15522/1 10877/10885/1 10880/10888/1 15515/15523/1 +f 3227/3235/1 10864/10872/1 10877/10885/1 15514/15522/1 +f 10864/10872/1 10863/10871/1 10878/10886/1 10877/10885/1 +f 1662/1670/1 10873/10881/1 10876/10884/1 1663/1671/1 +f 15515/15523/1 10880/10888/1 10873/10881/1 1662/1670/1 +f 10880/10888/1 10879/10887/1 10874/10882/1 10873/10881/1 +f 10866/10874/1 10869/10877/1 10872/10880/1 10867/10875/1 +f 6159/6167/1 4780/4788/1 10869/10877/1 10866/10874/1 +f 4780/4788/1 4779/4787/1 10870/10878/1 10869/10877/1 +f 10822/10830/1 10865/10873/1 10868/10876/1 10823/10831/1 +f 1707/1715/1 6160/6168/1 10865/10873/1 10822/10830/1 +f 6160/6168/1 6159/6167/1 10866/10874/1 10865/10873/1 +f 3226/3234/1 10861/10869/1 10864/10872/1 3227/3235/1 +f 10823/10831/1 10868/10876/1 10861/10869/1 3226/3234/1 +f 10868/10876/1 10867/10875/1 10862/10870/1 10861/10869/1 +f 10854/10862/1 10857/10865/1 10860/10868/1 10855/10863/1 +f 17067/17075/1 1144/1152/1 10857/10865/1 10854/10862/1 +f 1144/1152/1 1143/1151/1 10858/10866/1 10857/10865/1 +f 10870/10878/1 10853/10861/1 10856/10864/1 10871/10879/1 +f 4779/4787/1 17068/17076/1 10853/10861/1 10870/10878/1 +f 17068/17076/1 17067/17075/1 10854/10862/1 10853/10861/1 +f 3210/3218/1 10849/10857/1 10852/10860/1 3211/3219/1 +f 10871/10879/1 10856/10864/1 10849/10857/1 3210/3218/1 +f 10856/10864/1 10855/10863/1 10850/10858/1 10849/10857/1 +f 10842/10850/1 10845/10853/1 10848/10856/1 10843/10851/1 +f 10827/10835/1 3224/3232/1 10845/10853/1 10842/10850/1 +f 3224/3232/1 3223/3231/1 10846/10854/1 10845/10853/1 +f 17463/17471/1 10841/10849/1 10844/10852/1 17464/17472/1 +f 17465/17473/1 10828/10836/1 10841/10849/1 17463/17471/1 +f 10828/10836/1 10827/10835/1 10842/10850/1 10841/10849/1 +f 17466/17474/1 10837/10845/1 10840/10848/1 17467/17475/1 +f 17464/17472/1 10844/10852/1 10837/10845/1 17466/17474/1 +f 10844/10852/1 10843/10851/1 10838/10846/1 10837/10845/1 +f 10830/10838/1 10833/10841/1 10836/10844/1 10831/10839/1 +f 11235/11243/1 3088/3096/1 10833/10841/1 10830/10838/1 +f 3088/3096/1 3087/3095/1 10834/10842/1 10833/10841/1 +f 17468/17476/1 10829/10837/1 10832/10840/1 17469/17477/1 +f 17426/17434/1 11236/11244/1 10829/10837/1 17468/17476/1 +f 11236/11244/1 11235/11243/1 10830/10838/1 10829/10837/1 +f 17470/17478/1 10825/10833/1 10828/10836/1 17465/17473/1 +f 17469/17477/1 10832/10840/1 10825/10833/1 17470/17478/1 +f 10832/10840/1 10831/10839/1 10826/10834/1 10825/10833/1 +f 10818/10826/1 10821/10829/1 10824/10832/1 10819/10827/1 +f 15375/15383/1 1708/1716/1 10821/10829/1 10818/10826/1 +f 1708/1716/1 1707/1715/1 10822/10830/1 10821/10829/1 +f 10834/10842/1 10817/10825/1 10820/10828/1 10835/10843/1 +f 3087/3095/1 15376/15384/1 10817/10825/1 10834/10842/1 +f 15376/15384/1 15375/15383/1 10818/10826/1 10817/10825/1 +f 3222/3230/1 10813/10821/1 10816/10824/1 3223/3231/1 +f 10835/10843/1 10820/10828/1 10813/10821/1 3222/3230/1 +f 10820/10828/1 10819/10827/1 10814/10822/1 10813/10821/1 +f 10806/10814/1 10809/10817/1 10812/10820/1 10807/10815/1 +f 10791/10799/1 3236/3244/1 10809/10817/1 10806/10814/1 +f 3236/3244/1 3235/3243/1 10810/10818/1 10809/10817/1 +f 17471/17479/1 10805/10813/1 10808/10816/1 17472/17480/1 +f 17473/17481/1 10792/10800/1 10805/10813/1 17471/17479/1 +f 10792/10800/1 10791/10799/1 10806/10814/1 10805/10813/1 +f 17474/17482/1 10801/10809/1 10804/10812/1 17453/17461/1 +f 17472/17480/1 10808/10816/1 10801/10809/1 17474/17482/1 +f 10808/10816/1 10807/10815/1 10802/10810/1 10801/10809/1 +f 10794/10802/1 10797/10805/1 10800/10808/1 10795/10803/1 +f 10839/10847/1 3220/3228/1 10797/10805/1 10794/10802/1 +f 3220/3228/1 3219/3227/1 10798/10806/1 10797/10805/1 +f 17475/17483/1 10793/10801/1 10796/10804/1 17476/17484/1 +f 17467/17475/1 10840/10848/1 10793/10801/1 17475/17483/1 +f 10840/10848/1 10839/10847/1 10794/10802/1 10793/10801/1 +f 17477/17485/1 10789/10797/1 10792/10800/1 17473/17481/1 +f 17476/17484/1 10796/10804/1 10789/10797/1 17477/17485/1 +f 10796/10804/1 10795/10803/1 10790/10798/1 10789/10797/1 +f 10782/10790/1 10785/10793/1 10788/10796/1 10783/10791/1 +f 15507/15515/1 1664/1672/1 10785/10793/1 10782/10790/1 +f 1664/1672/1 1663/1671/1 10786/10794/1 10785/10793/1 +f 10798/10806/1 10781/10789/1 10784/10792/1 10799/10807/1 +f 3219/3227/1 15508/15516/1 10781/10789/1 10798/10806/1 +f 15508/15516/1 15507/15515/1 10782/10790/1 10781/10789/1 +f 3234/3242/1 10777/10785/1 10780/10788/1 3235/3243/1 +f 10799/10807/1 10784/10792/1 10777/10785/1 3234/3242/1 +f 10784/10792/1 10783/10791/1 10778/10786/1 10777/10785/1 +f 10770/10778/1 10773/10781/1 10776/10784/1 10771/10779/1 +f 10755/10763/1 3248/3256/1 10773/10781/1 10770/10778/1 +f 3248/3256/1 3247/3255/1 10774/10782/1 10773/10781/1 +f 15550/15558/1 10769/10777/1 10772/10780/1 15551/15559/1 +f 3263/3271/1 10756/10764/1 10769/10777/1 15550/15558/1 +f 10756/10764/1 10755/10763/1 10770/10778/1 10769/10777/1 +f 1650/1658/1 10765/10773/1 10768/10776/1 1651/1659/1 +f 15551/15559/1 10772/10780/1 10765/10773/1 1650/1658/1 +f 10772/10780/1 10771/10779/1 10766/10774/1 10765/10773/1 +f 10758/10766/1 10761/10769/1 10764/10772/1 10759/10767/1 +f 5547/5555/1 4984/4992/1 10761/10769/1 10758/10766/1 +f 4984/4992/1 4983/4991/1 10762/10770/1 10761/10769/1 +f 10714/10722/1 10757/10765/1 10760/10768/1 10715/10723/1 +f 1911/1919/1 5548/5556/1 10757/10765/1 10714/10722/1 +f 5548/5556/1 5547/5555/1 10758/10766/1 10757/10765/1 +f 3262/3270/1 10753/10761/1 10756/10764/1 3263/3271/1 +f 10715/10723/1 10760/10768/1 10753/10761/1 3262/3270/1 +f 10760/10768/1 10759/10767/1 10754/10762/1 10753/10761/1 +f 10746/10754/1 10749/10757/1 10752/10760/1 10747/10755/1 +f 17271/17279/1 1076/1084/1 10749/10757/1 10746/10754/1 +f 1076/1084/1 1075/1083/1 10750/10758/1 10749/10757/1 +f 10762/10770/1 10745/10753/1 10748/10756/1 10763/10771/1 +f 4983/4991/1 17272/17280/1 10745/10753/1 10762/10770/1 +f 17272/17280/1 17271/17279/1 10746/10754/1 10745/10753/1 +f 3246/3254/1 10741/10749/1 10744/10752/1 3247/3255/1 +f 10763/10771/1 10748/10756/1 10741/10749/1 3246/3254/1 +f 10748/10756/1 10747/10755/1 10742/10750/1 10741/10749/1 +f 10734/10742/1 10737/10745/1 10740/10748/1 10735/10743/1 +f 10719/10727/1 3260/3268/1 10737/10745/1 10734/10742/1 +f 3260/3268/1 3259/3267/1 10738/10746/1 10737/10745/1 +f 15502/15510/1 10733/10741/1 10736/10744/1 15503/15511/1 +f 3215/3223/1 10720/10728/1 10733/10741/1 15502/15510/1 +f 10720/10728/1 10719/10727/1 10734/10742/1 10733/10741/1 +f 1666/1674/1 10729/10737/1 10732/10740/1 1667/1675/1 +f 15503/15511/1 10736/10744/1 10729/10737/1 1666/1674/1 +f 10736/10744/1 10735/10743/1 10730/10738/1 10729/10737/1 +f 10722/10730/1 10725/10733/1 10728/10736/1 10723/10731/1 +f 13071/13079/1 2476/2484/1 10725/10733/1 10722/10730/1 +f 2476/2484/1 2475/2483/1 10726/10734/1 10725/10733/1 +f 10858/10866/1 10721/10729/1 10724/10732/1 10859/10867/1 +f 1143/1151/1 13072/13080/1 10721/10729/1 10858/10866/1 +f 13072/13080/1 13071/13079/1 10722/10730/1 10721/10729/1 +f 3214/3222/1 10717/10725/1 10720/10728/1 3215/3223/1 +f 10859/10867/1 10724/10732/1 10717/10725/1 3214/3222/1 +f 10724/10732/1 10723/10731/1 10718/10726/1 10717/10725/1 +f 10710/10718/1 10713/10721/1 10716/10724/1 10711/10719/1 +f 14763/14771/1 1912/1920/1 10713/10721/1 10710/10718/1 +f 1912/1920/1 1911/1919/1 10714/10722/1 10713/10721/1 +f 10726/10734/1 10709/10717/1 10712/10720/1 10727/10735/1 +f 2475/2483/1 14764/14772/1 10709/10717/1 10726/10734/1 +f 14764/14772/1 14763/14771/1 10710/10718/1 10709/10717/1 +f 3258/3266/1 10705/10713/1 10708/10716/1 3259/3267/1 +f 10727/10735/1 10712/10720/1 10705/10713/1 3258/3266/1 +f 10712/10720/1 10711/10719/1 10706/10714/1 10705/10713/1 +f 10698/10706/1 10701/10709/1 10704/10712/1 10699/10707/1 +f 10683/10691/1 3272/3280/1 10701/10709/1 10698/10706/1 +f 3272/3280/1 3271/3279/1 10702/10710/1 10701/10709/1 +f 17026/17034/1 10697/10705/1 10700/10708/1 17027/17035/1 +f 4739/4747/1 10684/10692/1 10697/10705/1 17026/17034/1 +f 10684/10692/1 10683/10691/1 10698/10706/1 10697/10705/1 +f 1158/1166/1 10693/10701/1 10696/10704/1 1159/1167/1 +f 17027/17035/1 10700/10708/1 10693/10701/1 1158/1166/1 +f 10700/10708/1 10699/10707/1 10694/10702/1 10693/10701/1 +f 10686/10694/1 10689/10697/1 10692/10700/1 10687/10695/1 +f 10731/10739/1 3256/3264/1 10689/10697/1 10686/10694/1 +f 3256/3264/1 3255/3263/1 10690/10698/1 10689/10697/1 +f 6286/6294/1 10685/10693/1 10688/10696/1 6287/6295/1 +f 1667/1675/1 10732/10740/1 10685/10693/1 6286/6294/1 +f 10732/10740/1 10731/10739/1 10686/10694/1 10685/10693/1 +f 4738/4746/1 10681/10689/1 10684/10692/1 4739/4747/1 +f 6287/6295/1 10688/10696/1 10681/10689/1 4738/4746/1 +f 10688/10696/1 10687/10695/1 10682/10690/1 10681/10689/1 +f 10674/10682/1 10677/10685/1 10680/10688/1 10675/10683/1 +f 15543/15551/1 1652/1660/1 10677/10685/1 10674/10682/1 +f 1652/1660/1 1651/1659/1 10678/10686/1 10677/10685/1 +f 10690/10698/1 10673/10681/1 10676/10684/1 10691/10699/1 +f 3255/3263/1 15544/15552/1 10673/10681/1 10690/10698/1 +f 15544/15552/1 15543/15551/1 10674/10682/1 10673/10681/1 +f 3270/3278/1 10669/10677/1 10672/10680/1 3271/3279/1 +f 10691/10699/1 10676/10684/1 10669/10677/1 3270/3278/1 +f 10676/10684/1 10675/10683/1 10670/10678/1 10669/10677/1 +f 10662/10670/1 10665/10673/1 10668/10676/1 10663/10671/1 +f 10647/10655/1 3284/3292/1 10665/10673/1 10662/10670/1 +f 3284/3292/1 3283/3291/1 10666/10674/1 10665/10673/1 +f 15586/15594/1 10661/10669/1 10664/10672/1 15587/15595/1 +f 3299/3307/1 10648/10656/1 10661/10669/1 15586/15594/1 +f 10648/10656/1 10647/10655/1 10662/10670/1 10661/10669/1 +f 1638/1646/1 10657/10665/1 10660/10668/1 1639/1647/1 +f 15587/15595/1 10664/10672/1 10657/10665/1 1638/1646/1 +f 10664/10672/1 10663/10671/1 10658/10666/1 10657/10665/1 +f 10650/10658/1 10653/10661/1 10656/10664/1 10651/10659/1 +f 6411/6419/1 4696/4704/1 10653/10661/1 10650/10658/1 +f 4696/4704/1 4695/4703/1 10654/10662/1 10653/10661/1 +f 10606/10614/1 10649/10657/1 10652/10660/1 10607/10615/1 +f 1623/1631/1 6412/6420/1 10649/10657/1 10606/10614/1 +f 6412/6420/1 6411/6419/1 10650/10658/1 10649/10657/1 +f 3298/3306/1 10645/10653/1 10648/10656/1 3299/3307/1 +f 10607/10615/1 10652/10660/1 10645/10653/1 3298/3306/1 +f 10652/10660/1 10651/10659/1 10646/10654/1 10645/10653/1 +f 10638/10646/1 10641/10649/1 10644/10652/1 10639/10647/1 +f 16983/16991/1 1172/1180/1 10641/10649/1 10638/10646/1 +f 1172/1180/1 1171/1179/1 10642/10650/1 10641/10649/1 +f 10654/10662/1 10637/10645/1 10640/10648/1 10655/10663/1 +f 4695/4703/1 16984/16992/1 10637/10645/1 10654/10662/1 +f 16984/16992/1 16983/16991/1 10638/10646/1 10637/10645/1 +f 3282/3290/1 10633/10641/1 10636/10644/1 3283/3291/1 +f 10655/10663/1 10640/10648/1 10633/10641/1 3282/3290/1 +f 10640/10648/1 10639/10647/1 10634/10642/1 10633/10641/1 +f 10626/10634/1 10629/10637/1 10632/10640/1 10627/10635/1 +f 10611/10619/1 3296/3304/1 10629/10637/1 10626/10634/1 +f 3296/3304/1 3295/3303/1 10630/10638/1 10629/10637/1 +f 14638/14646/1 10625/10633/1 10628/10636/1 14639/14647/1 +f 2351/2359/1 10612/10620/1 10625/10633/1 14638/14646/1 +f 10612/10620/1 10611/10619/1 10626/10634/1 10625/10633/1 +f 1954/1962/1 10621/10629/1 10624/10632/1 1955/1963/1 +f 14639/14647/1 10628/10636/1 10621/10629/1 1954/1962/1 +f 10628/10636/1 10627/10635/1 10622/10630/1 10621/10629/1 +f 10614/10622/1 10617/10625/1 10620/10628/1 10615/10623/1 +f 10479/10487/1 3340/3348/1 10617/10625/1 10614/10622/1 +f 3340/3348/1 3339/3347/1 10618/10626/1 10617/10625/1 +f 13450/13458/1 10613/10621/1 10616/10624/1 13451/13459/1 +f 1187/1195/1 10480/10488/1 10613/10621/1 13450/13458/1 +f 10480/10488/1 10479/10487/1 10614/10622/1 10613/10621/1 +f 2350/2358/1 10609/10617/1 10612/10620/1 2351/2359/1 +f 13451/13459/1 10616/10624/1 10609/10617/1 2350/2358/1 +f 10616/10624/1 10615/10623/1 10610/10618/1 10609/10617/1 +f 10602/10610/1 10605/10613/1 10608/10616/1 10603/10611/1 +f 15627/15635/1 1624/1632/1 10605/10613/1 10602/10610/1 +f 1624/1632/1 1623/1631/1 10606/10614/1 10605/10613/1 +f 10618/10626/1 10601/10609/1 10604/10612/1 10619/10627/1 +f 3339/3347/1 15628/15636/1 10601/10609/1 10618/10626/1 +f 15628/15636/1 15627/15635/1 10602/10610/1 10601/10609/1 +f 3294/3302/1 10597/10605/1 10600/10608/1 3295/3303/1 +f 10619/10627/1 10604/10612/1 10597/10605/1 3294/3302/1 +f 10604/10612/1 10603/10611/1 10598/10606/1 10597/10605/1 +f 10590/10598/1 10593/10601/1 10596/10604/1 10591/10599/1 +f 10575/10583/1 3308/3316/1 10593/10601/1 10590/10598/1 +f 3308/3316/1 3307/3315/1 10594/10602/1 10593/10601/1 +f 17314/17322/1 10589/10597/1 10592/10600/1 17315/17323/1 +f 5027/5035/1 10576/10584/1 10589/10597/1 17314/17322/1 +f 10576/10584/1 10575/10583/1 10590/10598/1 10589/10597/1 +f 1062/1070/1 10585/10593/1 10588/10596/1 1063/1071/1 +f 17315/17323/1 10592/10600/1 10585/10593/1 1062/1070/1 +f 10592/10600/1 10591/10599/1 10586/10594/1 10585/10593/1 +f 10578/10586/1 10581/10589/1 10584/10592/1 10579/10587/1 +f 10623/10631/1 3292/3300/1 10581/10589/1 10578/10586/1 +f 3292/3300/1 3291/3299/1 10582/10590/1 10581/10589/1 +f 5422/5430/1 10577/10585/1 10580/10588/1 5423/5431/1 +f 1955/1963/1 10624/10632/1 10577/10585/1 5422/5430/1 +f 10624/10632/1 10623/10631/1 10578/10586/1 10577/10585/1 +f 5026/5034/1 10573/10581/1 10576/10584/1 5027/5035/1 +f 5423/5431/1 10580/10588/1 10573/10581/1 5026/5034/1 +f 10580/10588/1 10579/10587/1 10574/10582/1 10573/10581/1 +f 10566/10574/1 10569/10577/1 10572/10580/1 10567/10575/1 +f 15579/15587/1 1640/1648/1 10569/10577/1 10566/10574/1 +f 1640/1648/1 1639/1647/1 10570/10578/1 10569/10577/1 +f 10582/10590/1 10565/10573/1 10568/10576/1 10583/10591/1 +f 3291/3299/1 15580/15588/1 10565/10573/1 10582/10590/1 +f 15580/15588/1 15579/15587/1 10566/10574/1 10565/10573/1 +f 3306/3314/1 10561/10569/1 10564/10572/1 3307/3315/1 +f 10583/10591/1 10568/10576/1 10561/10569/1 3306/3314/1 +f 10568/10576/1 10567/10575/1 10562/10570/1 10561/10569/1 +f 10554/10562/1 10557/10565/1 10560/10568/1 10555/10563/1 +f 10539/10547/1 3320/3328/1 10557/10565/1 10554/10562/1 +f 3320/3328/1 3319/3327/1 10558/10566/1 10557/10565/1 +f 15622/15630/1 10553/10561/1 10556/10564/1 15623/15631/1 +f 3335/3343/1 10540/10548/1 10553/10561/1 15622/15630/1 +f 10540/10548/1 10539/10547/1 10554/10562/1 10553/10561/1 +f 1626/1634/1 10549/10557/1 10552/10560/1 1627/1635/1 +f 15623/15631/1 10556/10564/1 10549/10557/1 1626/1634/1 +f 10556/10564/1 10555/10563/1 10550/10558/1 10549/10557/1 +f 10542/10550/1 10545/10553/1 10548/10556/1 10543/10551/1 +f 17478/17486/1 17479/17487/1 10545/10553/1 10542/10550/1 +f 17479/17487/1 17480/17488/1 10546/10554/1 10545/10553/1 +f 10498/10506/1 10541/10549/1 10544/10552/1 10499/10507/1 +f 17481/17489/1 17482/17490/1 10541/10549/1 10498/10506/1 +f 17482/17490/1 17478/17486/1 10542/10550/1 10541/10549/1 +f 3334/3342/1 10537/10545/1 10540/10548/1 3335/3343/1 +f 10499/10507/1 10544/10552/1 10537/10545/1 3334/3342/1 +f 10544/10552/1 10543/10551/1 10538/10546/1 10537/10545/1 +f 10530/10538/1 10533/10541/1 10536/10544/1 10531/10539/1 +f 17483/17491/1 17484/17492/1 10533/10541/1 10530/10538/1 +f 17484/17492/1 17485/17493/1 10534/10542/1 10533/10541/1 +f 10546/10554/1 10529/10537/1 10532/10540/1 10547/10555/1 +f 17480/17488/1 17486/17494/1 10529/10537/1 10546/10554/1 +f 17486/17494/1 17483/17491/1 10530/10538/1 10529/10537/1 +f 3318/3326/1 10525/10533/1 10528/10536/1 3319/3327/1 +f 10547/10555/1 10532/10540/1 10525/10533/1 3318/3326/1 +f 10532/10540/1 10531/10539/1 10526/10534/1 10525/10533/1 +f 10518/10526/1 10521/10529/1 10524/10532/1 10519/10527/1 +f 10503/10511/1 3332/3340/1 10521/10529/1 10518/10526/1 +f 3332/3340/1 3331/3339/1 10522/10530/1 10521/10529/1 +f 15754/15762/1 10517/10525/1 10520/10528/1 15755/15763/1 +f 3467/3475/1 10504/10512/1 10517/10525/1 15754/15762/1 +f 10504/10512/1 10503/10511/1 10518/10526/1 10517/10525/1 +f 1582/1590/1 10513/10521/1 10516/10524/1 1583/1591/1 +f 15755/15763/1 10520/10528/1 10513/10521/1 1582/1590/1 +f 10520/10528/1 10519/10527/1 10514/10522/1 10513/10521/1 +f 10506/10514/1 10509/10517/1 10512/10520/1 10507/10515/1 +f 17487/17495/1 17488/17496/1 10509/10517/1 10506/10514/1 +f 17488/17496/1 17489/17497/1 10510/10518/1 10509/10517/1 +f 10102/10110/1 10505/10513/1 10508/10516/1 10103/10111/1 +f 17490/17498/1 17491/17499/1 10505/10513/1 10102/10110/1 +f 17491/17499/1 17487/17495/1 10506/10514/1 10505/10513/1 +f 3466/3474/1 10501/10509/1 10504/10512/1 3467/3475/1 +f 10103/10111/1 10508/10516/1 10501/10509/1 3466/3474/1 +f 10508/10516/1 10507/10515/1 10502/10510/1 10501/10509/1 +f 10494/10502/1 10497/10505/1 10500/10508/1 10495/10503/1 +f 17492/17500/1 17493/17501/1 10497/10505/1 10494/10502/1 +f 17493/17501/1 17481/17489/1 10498/10506/1 10497/10505/1 +f 10510/10518/1 10493/10501/1 10496/10504/1 10511/10519/1 +f 17489/17497/1 17494/17502/1 10493/10501/1 10510/10518/1 +f 17494/17502/1 17492/17500/1 10494/10502/1 10493/10501/1 +f 3330/3338/1 10489/10497/1 10492/10500/1 3331/3339/1 +f 10511/10519/1 10496/10504/1 10489/10497/1 3330/3338/1 +f 10496/10504/1 10495/10503/1 10490/10498/1 10489/10497/1 +f 10482/10490/1 10485/10493/1 10488/10496/1 10483/10491/1 +f 10467/10475/1 3344/3352/1 10485/10493/1 10482/10490/1 +f 3344/3352/1 3343/3351/1 10486/10494/1 10485/10493/1 +f 16942/16950/1 10481/10489/1 10484/10492/1 16943/16951/1 +f 4655/4663/1 10468/10476/1 10481/10489/1 16942/16950/1 +f 10468/10476/1 10467/10475/1 10482/10490/1 10481/10489/1 +f 1186/1194/1 10477/10485/1 10480/10488/1 1187/1195/1 +f 16943/16951/1 10484/10492/1 10477/10485/1 1186/1194/1 +f 10484/10492/1 10483/10491/1 10478/10486/1 10477/10485/1 +f 10470/10478/1 10473/10481/1 10476/10484/1 10471/10479/1 +f 10515/10523/1 3328/3336/1 10473/10481/1 10470/10478/1 +f 3328/3336/1 3327/3335/1 10474/10482/1 10473/10481/1 +f 6538/6546/1 10469/10477/1 10472/10480/1 6539/6547/1 +f 1583/1591/1 10516/10524/1 10469/10477/1 6538/6546/1 +f 10516/10524/1 10515/10523/1 10470/10478/1 10469/10477/1 +f 4654/4662/1 10465/10473/1 10468/10476/1 4655/4663/1 +f 6539/6547/1 10472/10480/1 10465/10473/1 4654/4662/1 +f 10472/10480/1 10471/10479/1 10466/10474/1 10465/10473/1 +f 10458/10466/1 10461/10469/1 10464/10472/1 10459/10467/1 +f 15615/15623/1 1628/1636/1 10461/10469/1 10458/10466/1 +f 1628/1636/1 1627/1635/1 10462/10470/1 10461/10469/1 +f 10474/10482/1 10457/10465/1 10460/10468/1 10475/10483/1 +f 3327/3335/1 15616/15624/1 10457/10465/1 10474/10482/1 +f 15616/15624/1 15615/15623/1 10458/10466/1 10457/10465/1 +f 3342/3350/1 10453/10461/1 10456/10464/1 3343/3351/1 +f 10475/10483/1 10460/10468/1 10453/10461/1 3342/3350/1 +f 10460/10468/1 10459/10467/1 10454/10462/1 10453/10461/1 +f 10446/10454/1 10449/10457/1 10452/10460/1 10447/10455/1 +f 10431/10439/1 3356/3364/1 10449/10457/1 10446/10454/1 +f 3356/3364/1 3355/3363/1 10450/10458/1 10449/10457/1 +f 15658/15666/1 10445/10453/1 10448/10456/1 15659/15667/1 +f 3371/3379/1 10432/10440/1 10445/10453/1 15658/15666/1 +f 10432/10440/1 10431/10439/1 10446/10454/1 10445/10453/1 +f 1614/1622/1 10441/10449/1 10444/10452/1 1615/1623/1 +f 15659/15667/1 10448/10456/1 10441/10449/1 1614/1622/1 +f 10448/10456/1 10447/10455/1 10442/10450/1 10441/10449/1 +f 10434/10442/1 10437/10445/1 10440/10448/1 10435/10443/1 +f 17495/17503/1 17496/17504/1 10437/10445/1 10434/10442/1 +f 17496/17504/1 17497/17505/1 10438/10446/1 10437/10445/1 +f 10390/10398/1 10433/10441/1 10436/10444/1 10391/10399/1 +f 17498/17506/1 17499/17507/1 10433/10441/1 10390/10398/1 +f 17499/17507/1 17495/17503/1 10434/10442/1 10433/10441/1 +f 3370/3378/1 10429/10437/1 10432/10440/1 3371/3379/1 +f 10391/10399/1 10436/10444/1 10429/10437/1 3370/3378/1 +f 10436/10444/1 10435/10443/1 10430/10438/1 10429/10437/1 +f 10422/10430/1 10425/10433/1 10428/10436/1 10423/10431/1 +f 17500/17508/1 17501/17509/1 10425/10433/1 10422/10430/1 +f 17501/17509/1 17502/17510/1 10426/10434/1 10425/10433/1 +f 10438/10446/1 10421/10429/1 10424/10432/1 10439/10447/1 +f 17497/17505/1 17503/17511/1 10421/10429/1 10438/10446/1 +f 17503/17511/1 17500/17508/1 10422/10430/1 10421/10429/1 +f 3354/3362/1 10417/10425/1 10420/10428/1 3355/3363/1 +f 10439/10447/1 10424/10432/1 10417/10425/1 3354/3362/1 +f 10424/10432/1 10423/10431/1 10418/10426/1 10417/10425/1 +f 10410/10418/1 10413/10421/1 10416/10424/1 10411/10419/1 +f 10395/10403/1 3368/3376/1 10413/10421/1 10410/10418/1 +f 3368/3376/1 3367/3375/1 10414/10422/1 10413/10421/1 +f 15610/15618/1 10409/10417/1 10412/10420/1 15611/15619/1 +f 3323/3331/1 10396/10404/1 10409/10417/1 15610/15618/1 +f 10396/10404/1 10395/10403/1 10410/10418/1 10409/10417/1 +f 1630/1638/1 10405/10413/1 10408/10416/1 1631/1639/1 +f 15611/15619/1 10412/10420/1 10405/10413/1 1630/1638/1 +f 10412/10420/1 10411/10419/1 10406/10414/1 10405/10413/1 +f 10398/10406/1 10401/10409/1 10404/10412/1 10399/10407/1 +f 17504/17512/1 17505/17513/1 10401/10409/1 10398/10406/1 +f 17505/17513/1 17506/17514/1 10402/10410/1 10401/10409/1 +f 10534/10542/1 10397/10405/1 10400/10408/1 10535/10543/1 +f 17485/17493/1 17507/17515/1 10397/10405/1 10534/10542/1 +f 17507/17515/1 17504/17512/1 10398/10406/1 10397/10405/1 +f 3322/3330/1 10393/10401/1 10396/10404/1 3323/3331/1 +f 10535/10543/1 10400/10408/1 10393/10401/1 3322/3330/1 +f 10400/10408/1 10399/10407/1 10394/10402/1 10393/10401/1 +f 10386/10394/1 10389/10397/1 10392/10400/1 10387/10395/1 +f 17508/17516/1 17509/17517/1 10389/10397/1 10386/10394/1 +f 17509/17517/1 17498/17506/1 10390/10398/1 10389/10397/1 +f 10402/10410/1 10385/10393/1 10388/10396/1 10403/10411/1 +f 17506/17514/1 17510/17518/1 10385/10393/1 10402/10410/1 +f 17510/17518/1 17508/17516/1 10386/10394/1 10385/10393/1 +f 3366/3374/1 10381/10389/1 10384/10392/1 3367/3375/1 +f 10403/10411/1 10388/10396/1 10381/10389/1 3366/3374/1 +f 10388/10396/1 10387/10395/1 10382/10390/1 10381/10389/1 +f 10374/10382/1 10377/10385/1 10380/10388/1 10375/10383/1 +f 10359/10367/1 3380/3388/1 10377/10385/1 10374/10382/1 +f 3380/3388/1 3379/3387/1 10378/10386/1 10377/10385/1 +f 16990/16998/1 10373/10381/1 10376/10384/1 16991/16999/1 +f 4703/4711/1 10360/10368/1 10373/10381/1 16990/16998/1 +f 10360/10368/1 10359/10367/1 10374/10382/1 10373/10381/1 +f 1170/1178/1 10369/10377/1 10372/10380/1 1171/1179/1 +f 16991/16999/1 10376/10384/1 10369/10377/1 1170/1178/1 +f 10376/10384/1 10375/10383/1 10370/10378/1 10369/10377/1 +f 10362/10370/1 10365/10373/1 10368/10376/1 10363/10371/1 +f 10407/10415/1 3364/3372/1 10365/10373/1 10362/10370/1 +f 3364/3372/1 3363/3371/1 10366/10374/1 10365/10373/1 +f 6394/6402/1 10361/10369/1 10364/10372/1 6395/6403/1 +f 1631/1639/1 10408/10416/1 10361/10369/1 6394/6402/1 +f 10408/10416/1 10407/10415/1 10362/10370/1 10361/10369/1 +f 4702/4710/1 10357/10365/1 10360/10368/1 4703/4711/1 +f 6395/6403/1 10364/10372/1 10357/10365/1 4702/4710/1 +f 10364/10372/1 10363/10371/1 10358/10366/1 10357/10365/1 +f 10350/10358/1 10353/10361/1 10356/10364/1 10351/10359/1 +f 15651/15659/1 1616/1624/1 10353/10361/1 10350/10358/1 +f 1616/1624/1 1615/1623/1 10354/10362/1 10353/10361/1 +f 10366/10374/1 10349/10357/1 10352/10360/1 10367/10375/1 +f 3363/3371/1 15652/15660/1 10349/10357/1 10366/10374/1 +f 15652/15660/1 15651/15659/1 10350/10358/1 10349/10357/1 +f 3378/3386/1 10345/10353/1 10348/10356/1 3379/3387/1 +f 10367/10375/1 10352/10360/1 10345/10353/1 3378/3386/1 +f 10352/10360/1 10351/10359/1 10346/10354/1 10345/10353/1 +f 10338/10346/1 10341/10349/1 10344/10352/1 10339/10347/1 +f 10323/10331/1 3392/3400/1 10341/10349/1 10338/10346/1 +f 3392/3400/1 3391/3399/1 10342/10350/1 10341/10349/1 +f 15694/15702/1 10337/10345/1 10340/10348/1 15695/15703/1 +f 3407/3415/1 10324/10332/1 10337/10345/1 15694/15702/1 +f 10324/10332/1 10323/10331/1 10338/10346/1 10337/10345/1 +f 1602/1610/1 10333/10341/1 10336/10344/1 1603/1611/1 +f 15695/15703/1 10340/10348/1 10333/10341/1 1602/1610/1 +f 10340/10348/1 10339/10347/1 10334/10342/1 10333/10341/1 +f 10326/10334/1 10329/10337/1 10332/10340/1 10327/10335/1 +f 6519/6527/1 4660/4668/1 10329/10337/1 10326/10334/1 +f 4660/4668/1 4659/4667/1 10330/10338/1 10329/10337/1 +f 10282/10290/1 10325/10333/1 10328/10336/1 10283/10291/1 +f 1587/1595/1 6520/6528/1 10325/10333/1 10282/10290/1 +f 6520/6528/1 6519/6527/1 10326/10334/1 10325/10333/1 +f 3406/3414/1 10321/10329/1 10324/10332/1 3407/3415/1 +f 10283/10291/1 10328/10336/1 10321/10329/1 3406/3414/1 +f 10328/10336/1 10327/10335/1 10322/10330/1 10321/10329/1 +f 10314/10322/1 10317/10325/1 10320/10328/1 10315/10323/1 +f 16947/16955/1 1184/1192/1 10317/10325/1 10314/10322/1 +f 1184/1192/1 1183/1191/1 10318/10326/1 10317/10325/1 +f 10330/10338/1 10313/10321/1 10316/10324/1 10331/10339/1 +f 4659/4667/1 16948/16956/1 10313/10321/1 10330/10338/1 +f 16948/16956/1 16947/16955/1 10314/10322/1 10313/10321/1 +f 3390/3398/1 10309/10317/1 10312/10320/1 3391/3399/1 +f 10331/10339/1 10316/10324/1 10309/10317/1 3390/3398/1 +f 10316/10324/1 10315/10323/1 10310/10318/1 10309/10317/1 +f 10302/10310/1 10305/10313/1 10308/10316/1 10303/10311/1 +f 10287/10295/1 3404/3412/1 10305/10313/1 10302/10310/1 +f 3404/3412/1 3403/3411/1 10306/10314/1 10305/10313/1 +f 17511/17519/1 10301/10309/1 10304/10312/1 17512/17520/1 +f 17513/17521/1 10288/10296/1 10301/10309/1 17511/17519/1 +f 10288/10296/1 10287/10295/1 10302/10310/1 10301/10309/1 +f 17514/17522/1 10297/10305/1 10300/10308/1 17515/17523/1 +f 17512/17520/1 10304/10312/1 10297/10305/1 17514/17522/1 +f 10304/10312/1 10303/10311/1 10298/10306/1 10297/10305/1 +f 10290/10298/1 10293/10301/1 10296/10304/1 10291/10299/1 +f 10155/10163/1 3448/3456/1 10293/10301/1 10290/10298/1 +f 3448/3456/1 3447/3455/1 10294/10302/1 10293/10301/1 +f 17516/17524/1 10289/10297/1 10292/10300/1 17517/17525/1 +f 17518/17526/1 10156/10164/1 10289/10297/1 17516/17524/1 +f 10156/10164/1 10155/10163/1 10290/10298/1 10289/10297/1 +f 17519/17527/1 10285/10293/1 10288/10296/1 17513/17521/1 +f 17517/17525/1 10292/10300/1 10285/10293/1 17519/17527/1 +f 10292/10300/1 10291/10299/1 10286/10294/1 10285/10293/1 +f 10278/10286/1 10281/10289/1 10284/10292/1 10279/10287/1 +f 15735/15743/1 1588/1596/1 10281/10289/1 10278/10286/1 +f 1588/1596/1 1587/1595/1 10282/10290/1 10281/10289/1 +f 10294/10302/1 10277/10285/1 10280/10288/1 10295/10303/1 +f 3447/3455/1 15736/15744/1 10277/10285/1 10294/10302/1 +f 15736/15744/1 15735/15743/1 10278/10286/1 10277/10285/1 +f 3402/3410/1 10273/10281/1 10276/10284/1 3403/3411/1 +f 10295/10303/1 10280/10288/1 10273/10281/1 3402/3410/1 +f 10280/10288/1 10279/10287/1 10274/10282/1 10273/10281/1 +f 10266/10274/1 10269/10277/1 10272/10280/1 10267/10275/1 +f 10251/10259/1 3416/3424/1 10269/10277/1 10266/10274/1 +f 3416/3424/1 3415/3423/1 10270/10278/1 10269/10277/1 +f 17520/17528/1 10265/10273/1 10268/10276/1 17521/17529/1 +f 17522/17530/1 10252/10260/1 10265/10273/1 17520/17528/1 +f 10252/10260/1 10251/10259/1 10266/10274/1 10265/10273/1 +f 17523/17531/1 10261/10269/1 10264/10272/1 17524/17532/1 +f 17521/17529/1 10268/10276/1 10261/10269/1 17523/17531/1 +f 10268/10276/1 10267/10275/1 10262/10270/1 10261/10269/1 +f 10254/10262/1 10257/10265/1 10260/10268/1 10255/10263/1 +f 10299/10307/1 3400/3408/1 10257/10265/1 10254/10262/1 +f 3400/3408/1 3399/3407/1 10258/10266/1 10257/10265/1 +f 17525/17533/1 10253/10261/1 10256/10264/1 17526/17534/1 +f 17515/17523/1 10300/10308/1 10253/10261/1 17525/17533/1 +f 10300/10308/1 10299/10307/1 10254/10262/1 10253/10261/1 +f 17527/17535/1 10249/10257/1 10252/10260/1 17522/17530/1 +f 17526/17534/1 10256/10264/1 10249/10257/1 17527/17535/1 +f 10256/10264/1 10255/10263/1 10250/10258/1 10249/10257/1 +f 10242/10250/1 10245/10253/1 10248/10256/1 10243/10251/1 +f 15687/15695/1 1604/1612/1 10245/10253/1 10242/10250/1 +f 1604/1612/1 1603/1611/1 10246/10254/1 10245/10253/1 +f 10258/10266/1 10241/10249/1 10244/10252/1 10259/10267/1 +f 3399/3407/1 15688/15696/1 10241/10249/1 10258/10266/1 +f 15688/15696/1 15687/15695/1 10242/10250/1 10241/10249/1 +f 3414/3422/1 10237/10245/1 10240/10248/1 3415/3423/1 +f 10259/10267/1 10244/10252/1 10237/10245/1 3414/3422/1 +f 10244/10252/1 10243/10251/1 10238/10246/1 10237/10245/1 +f 10230/10238/1 10233/10241/1 10236/10244/1 10231/10239/1 +f 10215/10223/1 3428/3436/1 10233/10241/1 10230/10238/1 +f 3428/3436/1 3427/3435/1 10234/10242/1 10233/10241/1 +f 15730/15738/1 10229/10237/1 10232/10240/1 15731/15739/1 +f 3443/3451/1 10216/10224/1 10229/10237/1 15730/15738/1 +f 10216/10224/1 10215/10223/1 10230/10238/1 10229/10237/1 +f 1590/1598/1 10225/10233/1 10228/10236/1 1591/1599/1 +f 15731/15739/1 10232/10240/1 10225/10233/1 1590/1598/1 +f 10232/10240/1 10231/10239/1 10226/10234/1 10225/10233/1 +f 10218/10226/1 10221/10229/1 10224/10232/1 10219/10227/1 +f 17528/17536/1 17529/17537/1 10221/10229/1 10218/10226/1 +f 17529/17537/1 17530/17538/1 10222/10230/1 10221/10229/1 +f 10174/10182/1 10217/10225/1 10220/10228/1 10175/10183/1 +f 17531/17539/1 17532/17540/1 10217/10225/1 10174/10182/1 +f 17532/17540/1 17528/17536/1 10218/10226/1 10217/10225/1 +f 3442/3450/1 10213/10221/1 10216/10224/1 3443/3451/1 +f 10175/10183/1 10220/10228/1 10213/10221/1 3442/3450/1 +f 10220/10228/1 10219/10227/1 10214/10222/1 10213/10221/1 +f 10206/10214/1 10209/10217/1 10212/10220/1 10207/10215/1 +f 17533/17541/1 17534/17542/1 10209/10217/1 10206/10214/1 +f 17534/17542/1 17535/17543/1 10210/10218/1 10209/10217/1 +f 10222/10230/1 10205/10213/1 10208/10216/1 10223/10231/1 +f 17530/17538/1 17536/17544/1 10205/10213/1 10222/10230/1 +f 17536/17544/1 17533/17541/1 10206/10214/1 10205/10213/1 +f 3426/3434/1 10201/10209/1 10204/10212/1 3427/3435/1 +f 10223/10231/1 10208/10216/1 10201/10209/1 3426/3434/1 +f 10208/10216/1 10207/10215/1 10202/10210/1 10201/10209/1 +f 10194/10202/1 10197/10205/1 10200/10208/1 10195/10203/1 +f 10179/10187/1 3440/3448/1 10197/10205/1 10194/10202/1 +f 3440/3448/1 3439/3447/1 10198/10206/1 10197/10205/1 +f 17537/17545/1 10193/10201/1 10196/10204/1 17538/17546/1 +f 17539/17547/1 10180/10188/1 10193/10201/1 17537/17545/1 +f 10180/10188/1 10179/10187/1 10194/10202/1 10193/10201/1 +f 17540/17548/1 10189/10197/1 10192/10200/1 17541/17549/1 +f 17538/17546/1 10196/10204/1 10189/10197/1 17540/17548/1 +f 10196/10204/1 10195/10203/1 10190/10198/1 10189/10197/1 +f 10182/10190/1 10185/10193/1 10188/10196/1 10183/10191/1 +f 17542/17550/1 17543/17551/1 10185/10193/1 10182/10190/1 +f 17543/17551/1 17544/17552/1 10186/10194/1 10185/10193/1 +f 17545/17553/1 10181/10189/1 10184/10192/1 17546/17554/1 +f 17547/17555/1 17548/17556/1 10181/10189/1 17545/17553/1 +f 17548/17556/1 17542/17550/1 10182/10190/1 10181/10189/1 +f 17549/17557/1 10177/10185/1 10180/10188/1 17539/17547/1 +f 17546/17554/1 10184/10192/1 10177/10185/1 17549/17557/1 +f 10184/10192/1 10183/10191/1 10178/10186/1 10177/10185/1 +f 10170/10178/1 10173/10181/1 10176/10184/1 10171/10179/1 +f 17550/17558/1 17551/17559/1 10173/10181/1 10170/10178/1 +f 17551/17559/1 17531/17539/1 10174/10182/1 10173/10181/1 +f 10186/10194/1 10169/10177/1 10172/10180/1 10187/10195/1 +f 17544/17552/1 17552/17560/1 10169/10177/1 10186/10194/1 +f 17552/17560/1 17550/17558/1 10170/10178/1 10169/10177/1 +f 3438/3446/1 10165/10173/1 10168/10176/1 3439/3447/1 +f 10187/10195/1 10172/10180/1 10165/10173/1 3438/3446/1 +f 10172/10180/1 10171/10179/1 10166/10174/1 10165/10173/1 +f 10158/10166/1 10161/10169/1 10164/10172/1 10159/10167/1 +f 10143/10151/1 3452/3460/1 10161/10169/1 10158/10166/1 +f 3452/3460/1 3451/3459/1 10162/10170/1 10161/10169/1 +f 17553/17561/1 10157/10165/1 10160/10168/1 17554/17562/1 +f 17555/17563/1 10144/10152/1 10157/10165/1 17553/17561/1 +f 10144/10152/1 10143/10151/1 10158/10166/1 10157/10165/1 +f 17556/17564/1 10153/10161/1 10156/10164/1 17518/17526/1 +f 17554/17562/1 10160/10168/1 10153/10161/1 17556/17564/1 +f 10160/10168/1 10159/10167/1 10154/10162/1 10153/10161/1 +f 10146/10154/1 10149/10157/1 10152/10160/1 10147/10155/1 +f 10191/10199/1 3436/3444/1 10149/10157/1 10146/10154/1 +f 3436/3444/1 3435/3443/1 10150/10158/1 10149/10157/1 +f 17557/17565/1 10145/10153/1 10148/10156/1 17558/17566/1 +f 17541/17549/1 10192/10200/1 10145/10153/1 17557/17565/1 +f 10192/10200/1 10191/10199/1 10146/10154/1 10145/10153/1 +f 17559/17567/1 10141/10149/1 10144/10152/1 17555/17563/1 +f 17558/17566/1 10148/10156/1 10141/10149/1 17559/17567/1 +f 10148/10156/1 10147/10155/1 10142/10150/1 10141/10149/1 +f 10134/10142/1 10137/10145/1 10140/10148/1 10135/10143/1 +f 15723/15731/1 1592/1600/1 10137/10145/1 10134/10142/1 +f 1592/1600/1 1591/1599/1 10138/10146/1 10137/10145/1 +f 10150/10158/1 10133/10141/1 10136/10144/1 10151/10159/1 +f 3435/3443/1 15724/15732/1 10133/10141/1 10150/10158/1 +f 15724/15732/1 15723/15731/1 10134/10142/1 10133/10141/1 +f 3450/3458/1 10129/10137/1 10132/10140/1 3451/3459/1 +f 10151/10159/1 10136/10144/1 10129/10137/1 3450/3458/1 +f 10136/10144/1 10135/10143/1 10130/10138/1 10129/10137/1 +f 10122/10130/1 10125/10133/1 10128/10136/1 10123/10131/1 +f 10107/10115/1 3464/3472/1 10125/10133/1 10122/10130/1 +f 3464/3472/1 3463/3471/1 10126/10134/1 10125/10133/1 +f 15766/15774/1 10121/10129/1 10124/10132/1 15767/15775/1 +f 3479/3487/1 10108/10116/1 10121/10129/1 15766/15774/1 +f 10108/10116/1 10107/10115/1 10122/10130/1 10121/10129/1 +f 1578/1586/1 10117/10125/1 10120/10128/1 1579/1587/1 +f 15767/15775/1 10124/10132/1 10117/10125/1 1578/1586/1 +f 10124/10132/1 10123/10131/1 10118/10126/1 10117/10125/1 +f 10110/10118/1 10113/10121/1 10116/10124/1 10111/10119/1 +f 17560/17568/1 17561/17569/1 10113/10121/1 10110/10118/1 +f 17561/17569/1 17562/17570/1 10114/10122/1 10113/10121/1 +f 10066/10074/1 10109/10117/1 10112/10120/1 10067/10075/1 +f 17563/17571/1 17564/17572/1 10109/10117/1 10066/10074/1 +f 17564/17572/1 17560/17568/1 10110/10118/1 10109/10117/1 +f 3478/3486/1 10105/10113/1 10108/10116/1 3479/3487/1 +f 10067/10075/1 10112/10120/1 10105/10113/1 3478/3486/1 +f 10112/10120/1 10111/10119/1 10106/10114/1 10105/10113/1 +f 10098/10106/1 10101/10109/1 10104/10112/1 10099/10107/1 +f 17565/17573/1 17566/17574/1 10101/10109/1 10098/10106/1 +f 17566/17574/1 17490/17498/1 10102/10110/1 10101/10109/1 +f 10114/10122/1 10097/10105/1 10100/10108/1 10115/10123/1 +f 17562/17570/1 17567/17575/1 10097/10105/1 10114/10122/1 +f 17567/17575/1 17565/17573/1 10098/10106/1 10097/10105/1 +f 3462/3470/1 10093/10101/1 10096/10104/1 3463/3471/1 +f 10115/10123/1 10100/10108/1 10093/10101/1 3462/3470/1 +f 10100/10108/1 10099/10107/1 10094/10102/1 10093/10101/1 +f 10086/10094/1 10089/10097/1 10092/10100/1 10087/10095/1 +f 10071/10079/1 3476/3484/1 10089/10097/1 10086/10094/1 +f 3476/3484/1 3475/3483/1 10090/10098/1 10089/10097/1 +f 15718/15726/1 10085/10093/1 10088/10096/1 15719/15727/1 +f 3431/3439/1 10072/10080/1 10085/10093/1 15718/15726/1 +f 10072/10080/1 10071/10079/1 10086/10094/1 10085/10093/1 +f 1594/1602/1 10081/10089/1 10084/10092/1 1595/1603/1 +f 15719/15727/1 10088/10096/1 10081/10089/1 1594/1602/1 +f 10088/10096/1 10087/10095/1 10082/10090/1 10081/10089/1 +f 10074/10082/1 10077/10085/1 10080/10088/1 10075/10083/1 +f 17568/17576/1 17569/17577/1 10077/10085/1 10074/10082/1 +f 17569/17577/1 17570/17578/1 10078/10086/1 10077/10085/1 +f 10210/10218/1 10073/10081/1 10076/10084/1 10211/10219/1 +f 17535/17543/1 17571/17579/1 10073/10081/1 10210/10218/1 +f 17571/17579/1 17568/17576/1 10074/10082/1 10073/10081/1 +f 3430/3438/1 10069/10077/1 10072/10080/1 3431/3439/1 +f 10211/10219/1 10076/10084/1 10069/10077/1 3430/3438/1 +f 10076/10084/1 10075/10083/1 10070/10078/1 10069/10077/1 +f 10062/10070/1 10065/10073/1 10068/10076/1 10063/10071/1 +f 17572/17580/1 17573/17581/1 10065/10073/1 10062/10070/1 +f 17573/17581/1 17563/17571/1 10066/10074/1 10065/10073/1 +f 10078/10086/1 10061/10069/1 10064/10072/1 10079/10087/1 +f 17570/17578/1 17574/17582/1 10061/10069/1 10078/10086/1 +f 17574/17582/1 17572/17580/1 10062/10070/1 10061/10069/1 +f 3474/3482/1 10057/10065/1 10060/10068/1 3475/3483/1 +f 10079/10087/1 10064/10072/1 10057/10065/1 3474/3482/1 +f 10064/10072/1 10063/10071/1 10058/10066/1 10057/10065/1 +f 10050/10058/1 10053/10061/1 10056/10064/1 10051/10059/1 +f 10035/10043/1 3488/3496/1 10053/10061/1 10050/10058/1 +f 3488/3496/1 3487/3495/1 10054/10062/1 10053/10061/1 +f 16954/16962/1 10049/10057/1 10052/10060/1 16955/16963/1 +f 4667/4675/1 10036/10044/1 10049/10057/1 16954/16962/1 +f 10036/10044/1 10035/10043/1 10050/10058/1 10049/10057/1 +f 1182/1190/1 10045/10053/1 10048/10056/1 1183/1191/1 +f 16955/16963/1 10052/10060/1 10045/10053/1 1182/1190/1 +f 10052/10060/1 10051/10059/1 10046/10054/1 10045/10053/1 +f 10038/10046/1 10041/10049/1 10044/10052/1 10039/10047/1 +f 10083/10091/1 3472/3480/1 10041/10049/1 10038/10046/1 +f 3472/3480/1 3471/3479/1 10042/10050/1 10041/10049/1 +f 6502/6510/1 10037/10045/1 10040/10048/1 6503/6511/1 +f 1595/1603/1 10084/10092/1 10037/10045/1 6502/6510/1 +f 10084/10092/1 10083/10091/1 10038/10046/1 10037/10045/1 +f 4666/4674/1 10033/10041/1 10036/10044/1 4667/4675/1 +f 6503/6511/1 10040/10048/1 10033/10041/1 4666/4674/1 +f 10040/10048/1 10039/10047/1 10034/10042/1 10033/10041/1 +f 10026/10034/1 10029/10037/1 10032/10040/1 10027/10035/1 +f 15759/15767/1 1580/1588/1 10029/10037/1 10026/10034/1 +f 1580/1588/1 1579/1587/1 10030/10038/1 10029/10037/1 +f 10042/10050/1 10025/10033/1 10028/10036/1 10043/10051/1 +f 3471/3479/1 15760/15768/1 10025/10033/1 10042/10050/1 +f 15760/15768/1 15759/15767/1 10026/10034/1 10025/10033/1 +f 3486/3494/1 10021/10029/1 10024/10032/1 3487/3495/1 +f 10043/10051/1 10028/10036/1 10021/10029/1 3486/3494/1 +f 10028/10036/1 10027/10035/1 10022/10030/1 10021/10029/1 +f 10014/10022/1 10017/10025/1 10020/10028/1 10015/10023/1 +f 9999/10007/1 3500/3508/1 10017/10025/1 10014/10022/1 +f 3500/3508/1 3499/3507/1 10018/10026/1 10017/10025/1 +f 15802/15810/1 10013/10021/1 10016/10024/1 15803/15811/1 +f 3515/3523/1 10000/10008/1 10013/10021/1 15802/15810/1 +f 10000/10008/1 9999/10007/1 10014/10022/1 10013/10021/1 +f 1566/1574/1 10009/10017/1 10012/10020/1 1567/1575/1 +f 15803/15811/1 10016/10024/1 10009/10017/1 1566/1574/1 +f 10016/10024/1 10015/10023/1 10010/10018/1 10009/10017/1 +f 10002/10010/1 10005/10013/1 10008/10016/1 10003/10011/1 +f 6627/6635/1 4624/4632/1 10005/10013/1 10002/10010/1 +f 4624/4632/1 4623/4631/1 10006/10014/1 10005/10013/1 +f 9958/9966/1 10001/10009/1 10004/10012/1 9959/9967/1 +f 1551/1559/1 6628/6636/1 10001/10009/1 9958/9966/1 +f 6628/6636/1 6627/6635/1 10002/10010/1 10001/10009/1 +f 3514/3522/1 9997/10005/1 10000/10008/1 3515/3523/1 +f 9959/9967/1 10004/10012/1 9997/10005/1 3514/3522/1 +f 10004/10012/1 10003/10011/1 9998/10006/1 9997/10005/1 +f 9990/9998/1 9993/10001/1 9996/10004/1 9991/9999/1 +f 16911/16919/1 1196/1204/1 9993/10001/1 9990/9998/1 +f 1196/1204/1 1195/1203/1 9994/10002/1 9993/10001/1 +f 10006/10014/1 9989/9997/1 9992/10000/1 10007/10015/1 +f 4623/4631/1 16912/16920/1 9989/9997/1 10006/10014/1 +f 16912/16920/1 16911/16919/1 9990/9998/1 9989/9997/1 +f 3498/3506/1 9985/9993/1 9988/9996/1 3499/3507/1 +f 10007/10015/1 9992/10000/1 9985/9993/1 3498/3506/1 +f 9992/10000/1 9991/9999/1 9986/9994/1 9985/9993/1 +f 9978/9986/1 9981/9989/1 9984/9992/1 9979/9987/1 +f 9963/9971/1 3512/3520/1 9981/9989/1 9978/9986/1 +f 3512/3520/1 3511/3519/1 9982/9990/1 9981/9989/1 +f 17575/17583/1 9977/9985/1 9980/9988/1 17576/17584/1 +f 17577/17585/1 9964/9972/1 9977/9985/1 17575/17583/1 +f 9964/9972/1 9963/9971/1 9978/9986/1 9977/9985/1 +f 17578/17586/1 9973/9981/1 9976/9984/1 17579/17587/1 +f 17576/17584/1 9980/9988/1 9973/9981/1 17578/17586/1 +f 9980/9988/1 9979/9987/1 9974/9982/1 9973/9981/1 +f 9966/9974/1 9969/9977/1 9972/9980/1 9967/9975/1 +f 9831/9839/1 3556/3564/1 9969/9977/1 9966/9974/1 +f 3556/3564/1 3555/3563/1 9970/9978/1 9969/9977/1 +f 17580/17588/1 9965/9973/1 9968/9976/1 17581/17589/1 +f 17582/17590/1 9832/9840/1 9965/9973/1 17580/17588/1 +f 9832/9840/1 9831/9839/1 9966/9974/1 9965/9973/1 +f 17583/17591/1 9961/9969/1 9964/9972/1 17577/17585/1 +f 17581/17589/1 9968/9976/1 9961/9969/1 17583/17591/1 +f 9968/9976/1 9967/9975/1 9962/9970/1 9961/9969/1 +f 9954/9962/1 9957/9965/1 9960/9968/1 9955/9963/1 +f 15843/15851/1 1552/1560/1 9957/9965/1 9954/9962/1 +f 1552/1560/1 1551/1559/1 9958/9966/1 9957/9965/1 +f 9970/9978/1 9953/9961/1 9956/9964/1 9971/9979/1 +f 3555/3563/1 15844/15852/1 9953/9961/1 9970/9978/1 +f 15844/15852/1 15843/15851/1 9954/9962/1 9953/9961/1 +f 3510/3518/1 9949/9957/1 9952/9960/1 3511/3519/1 +f 9971/9979/1 9956/9964/1 9949/9957/1 3510/3518/1 +f 9956/9964/1 9955/9963/1 9950/9958/1 9949/9957/1 +f 9942/9950/1 9945/9953/1 9948/9956/1 9943/9951/1 +f 9927/9935/1 3524/3532/1 9945/9953/1 9942/9950/1 +f 3524/3532/1 3523/3531/1 9946/9954/1 9945/9953/1 +f 17584/17592/1 9941/9949/1 9944/9952/1 17585/17593/1 +f 17586/17594/1 9928/9936/1 9941/9949/1 17584/17592/1 +f 9928/9936/1 9927/9935/1 9942/9950/1 9941/9949/1 +f 17587/17595/1 9937/9945/1 9940/9948/1 17437/17445/1 +f 17585/17593/1 9944/9952/1 9937/9945/1 17587/17595/1 +f 9944/9952/1 9943/9951/1 9938/9946/1 9937/9945/1 +f 9930/9938/1 9933/9941/1 9936/9944/1 9931/9939/1 +f 9975/9983/1 3508/3516/1 9933/9941/1 9930/9938/1 +f 3508/3516/1 3507/3515/1 9934/9942/1 9933/9941/1 +f 17588/17596/1 9929/9937/1 9932/9940/1 17589/17597/1 +f 17579/17587/1 9976/9984/1 9929/9937/1 17588/17596/1 +f 9976/9984/1 9975/9983/1 9930/9938/1 9929/9937/1 +f 17590/17598/1 9925/9933/1 9928/9936/1 17586/17594/1 +f 17589/17597/1 9932/9940/1 9925/9933/1 17590/17598/1 +f 9932/9940/1 9931/9939/1 9926/9934/1 9925/9933/1 +f 9918/9926/1 9921/9929/1 9924/9932/1 9919/9927/1 +f 15795/15803/1 1568/1576/1 9921/9929/1 9918/9926/1 +f 1568/1576/1 1567/1575/1 9922/9930/1 9921/9929/1 +f 9934/9942/1 9917/9925/1 9920/9928/1 9935/9943/1 +f 3507/3515/1 15796/15804/1 9917/9925/1 9934/9942/1 +f 15796/15804/1 15795/15803/1 9918/9926/1 9917/9925/1 +f 3522/3530/1 9913/9921/1 9916/9924/1 3523/3531/1 +f 9935/9943/1 9920/9928/1 9913/9921/1 3522/3530/1 +f 9920/9928/1 9919/9927/1 9914/9922/1 9913/9921/1 +f 9906/9914/1 9909/9917/1 9912/9920/1 9907/9915/1 +f 9891/9899/1 3536/3544/1 9909/9917/1 9906/9914/1 +f 3536/3544/1 3535/3543/1 9910/9918/1 9909/9917/1 +f 15838/15846/1 9905/9913/1 9908/9916/1 15839/15847/1 +f 3551/3559/1 9892/9900/1 9905/9913/1 15838/15846/1 +f 9892/9900/1 9891/9899/1 9906/9914/1 9905/9913/1 +f 1554/1562/1 9901/9909/1 9904/9912/1 1555/1563/1 +f 15839/15847/1 9908/9916/1 9901/9909/1 1554/1562/1 +f 9908/9916/1 9907/9915/1 9902/9910/1 9901/9909/1 +f 9894/9902/1 9897/9905/1 9900/9908/1 9895/9903/1 +f 6483/6491/1 4672/4680/1 9897/9905/1 9894/9902/1 +f 4672/4680/1 4671/4679/1 9898/9906/1 9897/9905/1 +f 9850/9858/1 9893/9901/1 9896/9904/1 9851/9859/1 +f 1599/1607/1 6484/6492/1 9893/9901/1 9850/9858/1 +f 6484/6492/1 6483/6491/1 9894/9902/1 9893/9901/1 +f 3550/3558/1 9889/9897/1 9892/9900/1 3551/3559/1 +f 9851/9859/1 9896/9904/1 9889/9897/1 3550/3558/1 +f 9896/9904/1 9895/9903/1 9890/9898/1 9889/9897/1 +f 9882/9890/1 9885/9893/1 9888/9896/1 9883/9891/1 +f 16959/16967/1 1180/1188/1 9885/9893/1 9882/9890/1 +f 1180/1188/1 1179/1187/1 9886/9894/1 9885/9893/1 +f 9898/9906/1 9881/9889/1 9884/9892/1 9899/9907/1 +f 4671/4679/1 16960/16968/1 9881/9889/1 9898/9906/1 +f 16960/16968/1 16959/16967/1 9882/9890/1 9881/9889/1 +f 3534/3542/1 9877/9885/1 9880/9888/1 3535/3543/1 +f 9899/9907/1 9884/9892/1 9877/9885/1 3534/3542/1 +f 9884/9892/1 9883/9891/1 9878/9886/1 9877/9885/1 +f 9870/9878/1 9873/9881/1 9876/9884/1 9871/9879/1 +f 9855/9863/1 3548/3556/1 9873/9881/1 9870/9878/1 +f 3548/3556/1 3547/3555/1 9874/9882/1 9873/9881/1 +f 17591/17599/1 9869/9877/1 9872/9880/1 17592/17600/1 +f 17593/17601/1 9856/9864/1 9869/9877/1 17591/17599/1 +f 9856/9864/1 9855/9863/1 9870/9878/1 9869/9877/1 +f 17594/17602/1 9865/9873/1 9868/9876/1 17595/17603/1 +f 17592/17600/1 9872/9880/1 9865/9873/1 17594/17602/1 +f 9872/9880/1 9871/9879/1 9866/9874/1 9865/9873/1 +f 9858/9866/1 9861/9869/1 9864/9872/1 9859/9867/1 +f 10263/10271/1 3412/3420/1 9861/9869/1 9858/9866/1 +f 3412/3420/1 3411/3419/1 9862/9870/1 9861/9869/1 +f 17596/17604/1 9857/9865/1 9860/9868/1 17597/17605/1 +f 17524/17532/1 10264/10272/1 9857/9865/1 17596/17604/1 +f 10264/10272/1 10263/10271/1 9858/9866/1 9857/9865/1 +f 17598/17606/1 9853/9861/1 9856/9864/1 17593/17601/1 +f 17597/17605/1 9860/9868/1 9853/9861/1 17598/17606/1 +f 9860/9868/1 9859/9867/1 9854/9862/1 9853/9861/1 +f 9846/9854/1 9849/9857/1 9852/9860/1 9847/9855/1 +f 15699/15707/1 1600/1608/1 9849/9857/1 9846/9854/1 +f 1600/1608/1 1599/1607/1 9850/9858/1 9849/9857/1 +f 9862/9870/1 9845/9853/1 9848/9856/1 9863/9871/1 +f 3411/3419/1 15700/15708/1 9845/9853/1 9862/9870/1 +f 15700/15708/1 15699/15707/1 9846/9854/1 9845/9853/1 +f 3546/3554/1 9841/9849/1 9844/9852/1 3547/3555/1 +f 9863/9871/1 9848/9856/1 9841/9849/1 3546/3554/1 +f 9848/9856/1 9847/9855/1 9842/9850/1 9841/9849/1 +f 9834/9842/1 9837/9845/1 9840/9848/1 9835/9843/1 +f 9819/9827/1 3560/3568/1 9837/9845/1 9834/9842/1 +f 3560/3568/1 3559/3567/1 9838/9846/1 9837/9845/1 +f 17599/17607/1 9833/9841/1 9836/9844/1 17600/17608/1 +f 17601/17609/1 9820/9828/1 9833/9841/1 17599/17607/1 +f 9820/9828/1 9819/9827/1 9834/9842/1 9833/9841/1 +f 17602/17610/1 9829/9837/1 9832/9840/1 17582/17590/1 +f 17600/17608/1 9836/9844/1 9829/9837/1 17602/17610/1 +f 9836/9844/1 9835/9843/1 9830/9838/1 9829/9837/1 +f 9822/9830/1 9825/9833/1 9828/9836/1 9823/9831/1 +f 9867/9875/1 3544/3552/1 9825/9833/1 9822/9830/1 +f 3544/3552/1 3543/3551/1 9826/9834/1 9825/9833/1 +f 17603/17611/1 9821/9829/1 9824/9832/1 17604/17612/1 +f 17595/17603/1 9868/9876/1 9821/9829/1 17603/17611/1 +f 9868/9876/1 9867/9875/1 9822/9830/1 9821/9829/1 +f 17605/17613/1 9817/9825/1 9820/9828/1 17601/17609/1 +f 17604/17612/1 9824/9832/1 9817/9825/1 17605/17613/1 +f 9824/9832/1 9823/9831/1 9818/9826/1 9817/9825/1 +f 9810/9818/1 9813/9821/1 9816/9824/1 9811/9819/1 +f 15831/15839/1 1556/1564/1 9813/9821/1 9810/9818/1 +f 1556/1564/1 1555/1563/1 9814/9822/1 9813/9821/1 +f 9826/9834/1 9809/9817/1 9812/9820/1 9827/9835/1 +f 3543/3551/1 15832/15840/1 9809/9817/1 9826/9834/1 +f 15832/15840/1 15831/15839/1 9810/9818/1 9809/9817/1 +f 3558/3566/1 9805/9813/1 9808/9816/1 3559/3567/1 +f 9827/9835/1 9812/9820/1 9805/9813/1 3558/3566/1 +f 9812/9820/1 9811/9819/1 9806/9814/1 9805/9813/1 +f 9798/9806/1 9801/9809/1 9804/9812/1 9799/9807/1 +f 9783/9791/1 3572/3580/1 9801/9809/1 9798/9806/1 +f 3572/3580/1 3571/3579/1 9802/9810/1 9801/9809/1 +f 15874/15882/1 9797/9805/1 9800/9808/1 15875/15883/1 +f 3587/3595/1 9784/9792/1 9797/9805/1 15874/15882/1 +f 9784/9792/1 9783/9791/1 9798/9806/1 9797/9805/1 +f 1542/1550/1 9793/9801/1 9796/9804/1 1543/1551/1 +f 15875/15883/1 9800/9808/1 9793/9801/1 1542/1550/1 +f 9800/9808/1 9799/9807/1 9794/9802/1 9793/9801/1 +f 9786/9794/1 9789/9797/1 9792/9800/1 9787/9795/1 +f 5439/5447/1 5020/5028/1 9789/9797/1 9786/9794/1 +f 5020/5028/1 5019/5027/1 9790/9798/1 9789/9797/1 +f 9742/9750/1 9785/9793/1 9788/9796/1 9743/9751/1 +f 1947/1955/1 5440/5448/1 9785/9793/1 9742/9750/1 +f 5440/5448/1 5439/5447/1 9786/9794/1 9785/9793/1 +f 3586/3594/1 9781/9789/1 9784/9792/1 3587/3595/1 +f 9743/9751/1 9788/9796/1 9781/9789/1 3586/3594/1 +f 9788/9796/1 9787/9795/1 9782/9790/1 9781/9789/1 +f 9774/9782/1 9777/9785/1 9780/9788/1 9775/9783/1 +f 17307/17315/1 1064/1072/1 9777/9785/1 9774/9782/1 +f 1064/1072/1 1063/1071/1 9778/9786/1 9777/9785/1 +f 9790/9798/1 9773/9781/1 9776/9784/1 9791/9799/1 +f 5019/5027/1 17308/17316/1 9773/9781/1 9790/9798/1 +f 17308/17316/1 17307/17315/1 9774/9782/1 9773/9781/1 +f 3570/3578/1 9769/9777/1 9772/9780/1 3571/3579/1 +f 9791/9799/1 9776/9784/1 9769/9777/1 3570/3578/1 +f 9776/9784/1 9775/9783/1 9770/9778/1 9769/9777/1 +f 9762/9770/1 9765/9773/1 9768/9776/1 9763/9771/1 +f 9747/9755/1 3584/3592/1 9765/9773/1 9762/9770/1 +f 3584/3592/1 3583/3591/1 9766/9774/1 9765/9773/1 +f 15826/15834/1 9761/9769/1 9764/9772/1 15827/15835/1 +f 3539/3547/1 9748/9756/1 9761/9769/1 15826/15834/1 +f 9748/9756/1 9747/9755/1 9762/9770/1 9761/9769/1 +f 1558/1566/1 9757/9765/1 9760/9768/1 1559/1567/1 +f 15827/15835/1 9764/9772/1 9757/9765/1 1558/1566/1 +f 9764/9772/1 9763/9771/1 9758/9766/1 9757/9765/1 +f 9750/9758/1 9753/9761/1 9756/9764/1 9751/9759/1 +f 13395/13403/1 2368/2376/1 9753/9761/1 9750/9758/1 +f 2368/2376/1 2367/2375/1 9754/9762/1 9753/9761/1 +f 9886/9894/1 9749/9757/1 9752/9760/1 9887/9895/1 +f 1179/1187/1 13396/13404/1 9749/9757/1 9886/9894/1 +f 13396/13404/1 13395/13403/1 9750/9758/1 9749/9757/1 +f 3538/3546/1 9745/9753/1 9748/9756/1 3539/3547/1 +f 9887/9895/1 9752/9760/1 9745/9753/1 3538/3546/1 +f 9752/9760/1 9751/9759/1 9746/9754/1 9745/9753/1 +f 9738/9746/1 9741/9749/1 9744/9752/1 9739/9747/1 +f 14655/14663/1 1948/1956/1 9741/9749/1 9738/9746/1 +f 1948/1956/1 1947/1955/1 9742/9750/1 9741/9749/1 +f 9754/9762/1 9737/9745/1 9740/9748/1 9755/9763/1 +f 2367/2375/1 14656/14664/1 9737/9745/1 9754/9762/1 +f 14656/14664/1 14655/14663/1 9738/9746/1 9737/9745/1 +f 3582/3590/1 9733/9741/1 9736/9744/1 3583/3591/1 +f 9755/9763/1 9740/9748/1 9733/9741/1 3582/3590/1 +f 9740/9748/1 9739/9747/1 9734/9742/1 9733/9741/1 +f 9726/9734/1 9729/9737/1 9732/9740/1 9727/9735/1 +f 9711/9719/1 3596/3604/1 9729/9737/1 9726/9734/1 +f 3596/3604/1 3595/3603/1 9730/9738/1 9729/9737/1 +f 16918/16926/1 9725/9733/1 9728/9736/1 16919/16927/1 +f 4631/4639/1 9712/9720/1 9725/9733/1 16918/16926/1 +f 9712/9720/1 9711/9719/1 9726/9734/1 9725/9733/1 +f 1194/1202/1 9721/9729/1 9724/9732/1 1195/1203/1 +f 16919/16927/1 9728/9736/1 9721/9729/1 1194/1202/1 +f 9728/9736/1 9727/9735/1 9722/9730/1 9721/9729/1 +f 9714/9722/1 9717/9725/1 9720/9728/1 9715/9723/1 +f 9759/9767/1 3580/3588/1 9717/9725/1 9714/9722/1 +f 3580/3588/1 3579/3587/1 9718/9726/1 9717/9725/1 +f 6610/6618/1 9713/9721/1 9716/9724/1 6611/6619/1 +f 1559/1567/1 9760/9768/1 9713/9721/1 6610/6618/1 +f 9760/9768/1 9759/9767/1 9714/9722/1 9713/9721/1 +f 4630/4638/1 9709/9717/1 9712/9720/1 4631/4639/1 +f 6611/6619/1 9716/9724/1 9709/9717/1 4630/4638/1 +f 9716/9724/1 9715/9723/1 9710/9718/1 9709/9717/1 +f 9702/9710/1 9705/9713/1 9708/9716/1 9703/9711/1 +f 15867/15875/1 1544/1552/1 9705/9713/1 9702/9710/1 +f 1544/1552/1 1543/1551/1 9706/9714/1 9705/9713/1 +f 9718/9726/1 9701/9709/1 9704/9712/1 9719/9727/1 +f 3579/3587/1 15868/15876/1 9701/9709/1 9718/9726/1 +f 15868/15876/1 15867/15875/1 9702/9710/1 9701/9709/1 +f 3594/3602/1 9697/9705/1 9700/9708/1 3595/3603/1 +f 9719/9727/1 9704/9712/1 9697/9705/1 3594/3602/1 +f 9704/9712/1 9703/9711/1 9698/9706/1 9697/9705/1 +f 9690/9698/1 9693/9701/1 9696/9704/1 9691/9699/1 +f 9675/9683/1 3608/3616/1 9693/9701/1 9690/9698/1 +f 3608/3616/1 3607/3615/1 9694/9702/1 9693/9701/1 +f 15910/15918/1 9689/9697/1 9692/9700/1 15911/15919/1 +f 3623/3631/1 9676/9684/1 9689/9697/1 15910/15918/1 +f 9676/9684/1 9675/9683/1 9690/9698/1 9689/9697/1 +f 1530/1538/1 9685/9693/1 9688/9696/1 1531/1539/1 +f 15911/15919/1 9692/9700/1 9685/9693/1 1530/1538/1 +f 9692/9700/1 9691/9699/1 9686/9694/1 9685/9693/1 +f 9678/9686/1 9681/9689/1 9684/9692/1 9679/9687/1 +f 6735/6743/1 4588/4596/1 9681/9689/1 9678/9686/1 +f 4588/4596/1 4587/4595/1 9682/9690/1 9681/9689/1 +f 9634/9642/1 9677/9685/1 9680/9688/1 9635/9643/1 +f 1515/1523/1 6736/6744/1 9677/9685/1 9634/9642/1 +f 6736/6744/1 6735/6743/1 9678/9686/1 9677/9685/1 +f 3622/3630/1 9673/9681/1 9676/9684/1 3623/3631/1 +f 9635/9643/1 9680/9688/1 9673/9681/1 3622/3630/1 +f 9680/9688/1 9679/9687/1 9674/9682/1 9673/9681/1 +f 9666/9674/1 9669/9677/1 9672/9680/1 9667/9675/1 +f 16875/16883/1 1208/1216/1 9669/9677/1 9666/9674/1 +f 1208/1216/1 1207/1215/1 9670/9678/1 9669/9677/1 +f 9682/9690/1 9665/9673/1 9668/9676/1 9683/9691/1 +f 4587/4595/1 16876/16884/1 9665/9673/1 9682/9690/1 +f 16876/16884/1 16875/16883/1 9666/9674/1 9665/9673/1 +f 3606/3614/1 9661/9669/1 9664/9672/1 3607/3615/1 +f 9683/9691/1 9668/9676/1 9661/9669/1 3606/3614/1 +f 9668/9676/1 9667/9675/1 9662/9670/1 9661/9669/1 +f 9654/9662/1 9657/9665/1 9660/9668/1 9655/9663/1 +f 9639/9647/1 3620/3628/1 9657/9665/1 9654/9662/1 +f 3620/3628/1 3619/3627/1 9658/9666/1 9657/9665/1 +f 14530/14538/1 9653/9661/1 9656/9664/1 14531/14539/1 +f 2243/2251/1 9640/9648/1 9653/9661/1 14530/14538/1 +f 9640/9648/1 9639/9647/1 9654/9662/1 9653/9661/1 +f 1990/1998/1 9649/9657/1 9652/9660/1 1991/1999/1 +f 14531/14539/1 9656/9664/1 9649/9657/1 1990/1998/1 +f 9656/9664/1 9655/9663/1 9650/9658/1 9649/9657/1 +f 9642/9650/1 9645/9653/1 9648/9656/1 9643/9651/1 +f 9507/9515/1 3664/3672/1 9645/9653/1 9642/9650/1 +f 3664/3672/1 3663/3671/1 9646/9654/1 9645/9653/1 +f 13774/13782/1 9641/9649/1 9644/9652/1 13775/13783/1 +f 1223/1231/1 9508/9516/1 9641/9649/1 13774/13782/1 +f 9508/9516/1 9507/9515/1 9642/9650/1 9641/9649/1 +f 2242/2250/1 9637/9645/1 9640/9648/1 2243/2251/1 +f 13775/13783/1 9644/9652/1 9637/9645/1 2242/2250/1 +f 9644/9652/1 9643/9651/1 9638/9646/1 9637/9645/1 +f 9630/9638/1 9633/9641/1 9636/9644/1 9631/9639/1 +f 15951/15959/1 1516/1524/1 9633/9641/1 9630/9638/1 +f 1516/1524/1 1515/1523/1 9634/9642/1 9633/9641/1 +f 9646/9654/1 9629/9637/1 9632/9640/1 9647/9655/1 +f 3663/3671/1 15952/15960/1 9629/9637/1 9646/9654/1 +f 15952/15960/1 15951/15959/1 9630/9638/1 9629/9637/1 +f 3618/3626/1 9625/9633/1 9628/9636/1 3619/3627/1 +f 9647/9655/1 9632/9640/1 9625/9633/1 3618/3626/1 +f 9632/9640/1 9631/9639/1 9626/9634/1 9625/9633/1 +f 9618/9626/1 9621/9629/1 9624/9632/1 9619/9627/1 +f 9603/9611/1 3632/3640/1 9621/9629/1 9618/9626/1 +f 3632/3640/1 3631/3639/1 9622/9630/1 9621/9629/1 +f 17350/17358/1 9617/9625/1 9620/9628/1 17351/17359/1 +f 5063/5071/1 9604/9612/1 9617/9625/1 17350/17358/1 +f 9604/9612/1 9603/9611/1 9618/9626/1 9617/9625/1 +f 1050/1058/1 9613/9621/1 9616/9624/1 1051/1059/1 +f 17351/17359/1 9620/9628/1 9613/9621/1 1050/1058/1 +f 9620/9628/1 9619/9627/1 9614/9622/1 9613/9621/1 +f 9606/9614/1 9609/9617/1 9612/9620/1 9607/9615/1 +f 9651/9659/1 3616/3624/1 9609/9617/1 9606/9614/1 +f 3616/3624/1 3615/3623/1 9610/9618/1 9609/9617/1 +f 5314/5322/1 9605/9613/1 9608/9616/1 5315/5323/1 +f 1991/1999/1 9652/9660/1 9605/9613/1 5314/5322/1 +f 9652/9660/1 9651/9659/1 9606/9614/1 9605/9613/1 +f 5062/5070/1 9601/9609/1 9604/9612/1 5063/5071/1 +f 5315/5323/1 9608/9616/1 9601/9609/1 5062/5070/1 +f 9608/9616/1 9607/9615/1 9602/9610/1 9601/9609/1 +f 9594/9602/1 9597/9605/1 9600/9608/1 9595/9603/1 +f 15903/15911/1 1532/1540/1 9597/9605/1 9594/9602/1 +f 1532/1540/1 1531/1539/1 9598/9606/1 9597/9605/1 +f 9610/9618/1 9593/9601/1 9596/9604/1 9611/9619/1 +f 3615/3623/1 15904/15912/1 9593/9601/1 9610/9618/1 +f 15904/15912/1 15903/15911/1 9594/9602/1 9593/9601/1 +f 3630/3638/1 9589/9597/1 9592/9600/1 3631/3639/1 +f 9611/9619/1 9596/9604/1 9589/9597/1 3630/3638/1 +f 9596/9604/1 9595/9603/1 9590/9598/1 9589/9597/1 +f 9582/9590/1 9585/9593/1 9588/9596/1 9583/9591/1 +f 9567/9575/1 3644/3652/1 9585/9593/1 9582/9590/1 +f 3644/3652/1 3643/3651/1 9586/9594/1 9585/9593/1 +f 15946/15954/1 9581/9589/1 9584/9592/1 15947/15955/1 +f 3659/3667/1 9568/9576/1 9581/9589/1 15946/15954/1 +f 9568/9576/1 9567/9575/1 9582/9590/1 9581/9589/1 +f 1518/1526/1 9577/9585/1 9580/9588/1 1519/1527/1 +f 15947/15955/1 9584/9592/1 9577/9585/1 1518/1526/1 +f 9584/9592/1 9583/9591/1 9578/9586/1 9577/9585/1 +f 9570/9578/1 9573/9581/1 9576/9584/1 9571/9579/1 +f 17606/17614/1 17607/17615/1 9573/9581/1 9570/9578/1 +f 17607/17615/1 17608/17616/1 9574/9582/1 9573/9581/1 +f 9526/9534/1 9569/9577/1 9572/9580/1 9527/9535/1 +f 17609/17617/1 17610/17618/1 9569/9577/1 9526/9534/1 +f 17610/17618/1 17606/17614/1 9570/9578/1 9569/9577/1 +f 3658/3666/1 9565/9573/1 9568/9576/1 3659/3667/1 +f 9527/9535/1 9572/9580/1 9565/9573/1 3658/3666/1 +f 9572/9580/1 9571/9579/1 9566/9574/1 9565/9573/1 +f 9558/9566/1 9561/9569/1 9564/9572/1 9559/9567/1 +f 17611/17619/1 17612/17620/1 9561/9569/1 9558/9566/1 +f 17612/17620/1 17613/17621/1 9562/9570/1 9561/9569/1 +f 9574/9582/1 9557/9565/1 9560/9568/1 9575/9583/1 +f 17608/17616/1 17614/17622/1 9557/9565/1 9574/9582/1 +f 17614/17622/1 17611/17619/1 9558/9566/1 9557/9565/1 +f 3642/3650/1 9553/9561/1 9556/9564/1 3643/3651/1 +f 9575/9583/1 9560/9568/1 9553/9561/1 3642/3650/1 +f 9560/9568/1 9559/9567/1 9554/9562/1 9553/9561/1 +f 9546/9554/1 9549/9557/1 9552/9560/1 9547/9555/1 +f 9531/9539/1 3656/3664/1 9549/9557/1 9546/9554/1 +f 3656/3664/1 3655/3663/1 9550/9558/1 9549/9557/1 +f 16078/16086/1 9545/9553/1 9548/9556/1 16079/16087/1 +f 3791/3799/1 9532/9540/1 9545/9553/1 16078/16086/1 +f 9532/9540/1 9531/9539/1 9546/9554/1 9545/9553/1 +f 1474/1482/1 9541/9549/1 9544/9552/1 1475/1483/1 +f 16079/16087/1 9548/9556/1 9541/9549/1 1474/1482/1 +f 9548/9556/1 9547/9555/1 9542/9550/1 9541/9549/1 +f 9534/9542/1 9537/9545/1 9540/9548/1 9535/9543/1 +f 17615/17623/1 17616/17624/1 9537/9545/1 9534/9542/1 +f 17616/17624/1 17617/17625/1 9538/9546/1 9537/9545/1 +f 9130/9138/1 9533/9541/1 9536/9544/1 9131/9139/1 +f 17618/17626/1 17619/17627/1 9533/9541/1 9130/9138/1 +f 17619/17627/1 17615/17623/1 9534/9542/1 9533/9541/1 +f 3790/3798/1 9529/9537/1 9532/9540/1 3791/3799/1 +f 9131/9139/1 9536/9544/1 9529/9537/1 3790/3798/1 +f 9536/9544/1 9535/9543/1 9530/9538/1 9529/9537/1 +f 9522/9530/1 9525/9533/1 9528/9536/1 9523/9531/1 +f 17620/17628/1 17621/17629/1 9525/9533/1 9522/9530/1 +f 17621/17629/1 17609/17617/1 9526/9534/1 9525/9533/1 +f 9538/9546/1 9521/9529/1 9524/9532/1 9539/9547/1 +f 17617/17625/1 17622/17630/1 9521/9529/1 9538/9546/1 +f 17622/17630/1 17620/17628/1 9522/9530/1 9521/9529/1 +f 3654/3662/1 9517/9525/1 9520/9528/1 3655/3663/1 +f 9539/9547/1 9524/9532/1 9517/9525/1 3654/3662/1 +f 9524/9532/1 9523/9531/1 9518/9526/1 9517/9525/1 +f 9510/9518/1 9513/9521/1 9516/9524/1 9511/9519/1 +f 9495/9503/1 3668/3676/1 9513/9521/1 9510/9518/1 +f 3668/3676/1 3667/3675/1 9514/9522/1 9513/9521/1 +f 16834/16842/1 9509/9517/1 9512/9520/1 16835/16843/1 +f 4547/4555/1 9496/9504/1 9509/9517/1 16834/16842/1 +f 9496/9504/1 9495/9503/1 9510/9518/1 9509/9517/1 +f 1222/1230/1 9505/9513/1 9508/9516/1 1223/1231/1 +f 16835/16843/1 9512/9520/1 9505/9513/1 1222/1230/1 +f 9512/9520/1 9511/9519/1 9506/9514/1 9505/9513/1 +f 9498/9506/1 9501/9509/1 9504/9512/1 9499/9507/1 +f 9543/9551/1 3652/3660/1 9501/9509/1 9498/9506/1 +f 3652/3660/1 3651/3659/1 9502/9510/1 9501/9509/1 +f 6862/6870/1 9497/9505/1 9500/9508/1 6863/6871/1 +f 1475/1483/1 9544/9552/1 9497/9505/1 6862/6870/1 +f 9544/9552/1 9543/9551/1 9498/9506/1 9497/9505/1 +f 4546/4554/1 9493/9501/1 9496/9504/1 4547/4555/1 +f 6863/6871/1 9500/9508/1 9493/9501/1 4546/4554/1 +f 9500/9508/1 9499/9507/1 9494/9502/1 9493/9501/1 +f 9486/9494/1 9489/9497/1 9492/9500/1 9487/9495/1 +f 15939/15947/1 1520/1528/1 9489/9497/1 9486/9494/1 +f 1520/1528/1 1519/1527/1 9490/9498/1 9489/9497/1 +f 9502/9510/1 9485/9493/1 9488/9496/1 9503/9511/1 +f 3651/3659/1 15940/15948/1 9485/9493/1 9502/9510/1 +f 15940/15948/1 15939/15947/1 9486/9494/1 9485/9493/1 +f 3666/3674/1 9481/9489/1 9484/9492/1 3667/3675/1 +f 9503/9511/1 9488/9496/1 9481/9489/1 3666/3674/1 +f 9488/9496/1 9487/9495/1 9482/9490/1 9481/9489/1 +f 9474/9482/1 9477/9485/1 9480/9488/1 9475/9483/1 +f 9459/9467/1 3680/3688/1 9477/9485/1 9474/9482/1 +f 3680/3688/1 3679/3687/1 9478/9486/1 9477/9485/1 +f 15982/15990/1 9473/9481/1 9476/9484/1 15983/15991/1 +f 3695/3703/1 9460/9468/1 9473/9481/1 15982/15990/1 +f 9460/9468/1 9459/9467/1 9474/9482/1 9473/9481/1 +f 1506/1514/1 9469/9477/1 9472/9480/1 1507/1515/1 +f 15983/15991/1 9476/9484/1 9469/9477/1 1506/1514/1 +f 9476/9484/1 9475/9483/1 9470/9478/1 9469/9477/1 +f 9462/9470/1 9465/9473/1 9468/9476/1 9463/9471/1 +f 17623/17631/1 17624/17632/1 9465/9473/1 9462/9470/1 +f 17624/17632/1 17625/17633/1 9466/9474/1 9465/9473/1 +f 9418/9426/1 9461/9469/1 9464/9472/1 9419/9427/1 +f 17626/17634/1 17627/17635/1 9461/9469/1 9418/9426/1 +f 17627/17635/1 17623/17631/1 9462/9470/1 9461/9469/1 +f 3694/3702/1 9457/9465/1 9460/9468/1 3695/3703/1 +f 9419/9427/1 9464/9472/1 9457/9465/1 3694/3702/1 +f 9464/9472/1 9463/9471/1 9458/9466/1 9457/9465/1 +f 9450/9458/1 9453/9461/1 9456/9464/1 9451/9459/1 +f 17628/17636/1 17629/17637/1 9453/9461/1 9450/9458/1 +f 17629/17637/1 17630/17638/1 9454/9462/1 9453/9461/1 +f 9466/9474/1 9449/9457/1 9452/9460/1 9467/9475/1 +f 17625/17633/1 17631/17639/1 9449/9457/1 9466/9474/1 +f 17631/17639/1 17628/17636/1 9450/9458/1 9449/9457/1 +f 3678/3686/1 9445/9453/1 9448/9456/1 3679/3687/1 +f 9467/9475/1 9452/9460/1 9445/9453/1 3678/3686/1 +f 9452/9460/1 9451/9459/1 9446/9454/1 9445/9453/1 +f 9438/9446/1 9441/9449/1 9444/9452/1 9439/9447/1 +f 9423/9431/1 3692/3700/1 9441/9449/1 9438/9446/1 +f 3692/3700/1 3691/3699/1 9442/9450/1 9441/9449/1 +f 15934/15942/1 9437/9445/1 9440/9448/1 15935/15943/1 +f 3647/3655/1 9424/9432/1 9437/9445/1 15934/15942/1 +f 9424/9432/1 9423/9431/1 9438/9446/1 9437/9445/1 +f 1522/1530/1 9433/9441/1 9436/9444/1 1523/1531/1 +f 15935/15943/1 9440/9448/1 9433/9441/1 1522/1530/1 +f 9440/9448/1 9439/9447/1 9434/9442/1 9433/9441/1 +f 9426/9434/1 9429/9437/1 9432/9440/1 9427/9435/1 +f 17632/17640/1 17633/17641/1 9429/9437/1 9426/9434/1 +f 17633/17641/1 17634/17642/1 9430/9438/1 9429/9437/1 +f 9562/9570/1 9425/9433/1 9428/9436/1 9563/9571/1 +f 17613/17621/1 17635/17643/1 9425/9433/1 9562/9570/1 +f 17635/17643/1 17632/17640/1 9426/9434/1 9425/9433/1 +f 3646/3654/1 9421/9429/1 9424/9432/1 3647/3655/1 +f 9563/9571/1 9428/9436/1 9421/9429/1 3646/3654/1 +f 9428/9436/1 9427/9435/1 9422/9430/1 9421/9429/1 +f 9414/9422/1 9417/9425/1 9420/9428/1 9415/9423/1 +f 17636/17644/1 17637/17645/1 9417/9425/1 9414/9422/1 +f 17637/17645/1 17626/17634/1 9418/9426/1 9417/9425/1 +f 9430/9438/1 9413/9421/1 9416/9424/1 9431/9439/1 +f 17634/17642/1 17638/17646/1 9413/9421/1 9430/9438/1 +f 17638/17646/1 17636/17644/1 9414/9422/1 9413/9421/1 +f 3690/3698/1 9409/9417/1 9412/9420/1 3691/3699/1 +f 9431/9439/1 9416/9424/1 9409/9417/1 3690/3698/1 +f 9416/9424/1 9415/9423/1 9410/9418/1 9409/9417/1 +f 9402/9410/1 9405/9413/1 9408/9416/1 9403/9411/1 +f 9387/9395/1 3704/3712/1 9405/9413/1 9402/9410/1 +f 3704/3712/1 3703/3711/1 9406/9414/1 9405/9413/1 +f 16882/16890/1 9401/9409/1 9404/9412/1 16883/16891/1 +f 4595/4603/1 9388/9396/1 9401/9409/1 16882/16890/1 +f 9388/9396/1 9387/9395/1 9402/9410/1 9401/9409/1 +f 1206/1214/1 9397/9405/1 9400/9408/1 1207/1215/1 +f 16883/16891/1 9404/9412/1 9397/9405/1 1206/1214/1 +f 9404/9412/1 9403/9411/1 9398/9406/1 9397/9405/1 +f 9390/9398/1 9393/9401/1 9396/9404/1 9391/9399/1 +f 9435/9443/1 3688/3696/1 9393/9401/1 9390/9398/1 +f 3688/3696/1 3687/3695/1 9394/9402/1 9393/9401/1 +f 6718/6726/1 9389/9397/1 9392/9400/1 6719/6727/1 +f 1523/1531/1 9436/9444/1 9389/9397/1 6718/6726/1 +f 9436/9444/1 9435/9443/1 9390/9398/1 9389/9397/1 +f 4594/4602/1 9385/9393/1 9388/9396/1 4595/4603/1 +f 6719/6727/1 9392/9400/1 9385/9393/1 4594/4602/1 +f 9392/9400/1 9391/9399/1 9386/9394/1 9385/9393/1 +f 9378/9386/1 9381/9389/1 9384/9392/1 9379/9387/1 +f 15975/15983/1 1508/1516/1 9381/9389/1 9378/9386/1 +f 1508/1516/1 1507/1515/1 9382/9390/1 9381/9389/1 +f 9394/9402/1 9377/9385/1 9380/9388/1 9395/9403/1 +f 3687/3695/1 15976/15984/1 9377/9385/1 9394/9402/1 +f 15976/15984/1 15975/15983/1 9378/9386/1 9377/9385/1 +f 3702/3710/1 9373/9381/1 9376/9384/1 3703/3711/1 +f 9395/9403/1 9380/9388/1 9373/9381/1 3702/3710/1 +f 9380/9388/1 9379/9387/1 9374/9382/1 9373/9381/1 +f 9366/9374/1 9369/9377/1 9372/9380/1 9367/9375/1 +f 9351/9359/1 3716/3724/1 9369/9377/1 9366/9374/1 +f 3716/3724/1 3715/3723/1 9370/9378/1 9369/9377/1 +f 16018/16026/1 9365/9373/1 9368/9376/1 16019/16027/1 +f 3731/3739/1 9352/9360/1 9365/9373/1 16018/16026/1 +f 9352/9360/1 9351/9359/1 9366/9374/1 9365/9373/1 +f 1494/1502/1 9361/9369/1 9364/9372/1 1495/1503/1 +f 16019/16027/1 9368/9376/1 9361/9369/1 1494/1502/1 +f 9368/9376/1 9367/9375/1 9362/9370/1 9361/9369/1 +f 9354/9362/1 9357/9365/1 9360/9368/1 9355/9363/1 +f 6843/6851/1 4552/4560/1 9357/9365/1 9354/9362/1 +f 4552/4560/1 4551/4559/1 9358/9366/1 9357/9365/1 +f 9310/9318/1 9353/9361/1 9356/9364/1 9311/9319/1 +f 1479/1487/1 6844/6852/1 9353/9361/1 9310/9318/1 +f 6844/6852/1 6843/6851/1 9354/9362/1 9353/9361/1 +f 3730/3738/1 9349/9357/1 9352/9360/1 3731/3739/1 +f 9311/9319/1 9356/9364/1 9349/9357/1 3730/3738/1 +f 9356/9364/1 9355/9363/1 9350/9358/1 9349/9357/1 +f 9342/9350/1 9345/9353/1 9348/9356/1 9343/9351/1 +f 16839/16847/1 1220/1228/1 9345/9353/1 9342/9350/1 +f 1220/1228/1 1219/1227/1 9346/9354/1 9345/9353/1 +f 9358/9366/1 9341/9349/1 9344/9352/1 9359/9367/1 +f 4551/4559/1 16840/16848/1 9341/9349/1 9358/9366/1 +f 16840/16848/1 16839/16847/1 9342/9350/1 9341/9349/1 +f 3714/3722/1 9337/9345/1 9340/9348/1 3715/3723/1 +f 9359/9367/1 9344/9352/1 9337/9345/1 3714/3722/1 +f 9344/9352/1 9343/9351/1 9338/9346/1 9337/9345/1 +f 9330/9338/1 9333/9341/1 9336/9344/1 9331/9339/1 +f 9315/9323/1 3728/3736/1 9333/9341/1 9330/9338/1 +f 3728/3736/1 3727/3735/1 9334/9342/1 9333/9341/1 +f 14674/14682/1 9329/9337/1 9332/9340/1 14675/14683/1 +f 2387/2395/1 9316/9324/1 9329/9337/1 14674/14682/1 +f 9316/9324/1 9315/9323/1 9330/9338/1 9329/9337/1 +f 1942/1950/1 9325/9333/1 9328/9336/1 1943/1951/1 +f 14675/14683/1 9332/9340/1 9325/9333/1 1942/1950/1 +f 9332/9340/1 9331/9339/1 9326/9334/1 9325/9333/1 +f 9318/9326/1 9321/9329/1 9324/9332/1 9319/9327/1 +f 9183/9191/1 3772/3780/1 9321/9329/1 9318/9326/1 +f 3772/3780/1 3771/3779/1 9322/9330/1 9321/9329/1 +f 13342/13350/1 9317/9325/1 9320/9328/1 13343/13351/1 +f 1175/1183/1 9184/9192/1 9317/9325/1 13342/13350/1 +f 9184/9192/1 9183/9191/1 9318/9326/1 9317/9325/1 +f 2386/2394/1 9313/9321/1 9316/9324/1 2387/2395/1 +f 13343/13351/1 9320/9328/1 9313/9321/1 2386/2394/1 +f 9320/9328/1 9319/9327/1 9314/9322/1 9313/9321/1 +f 9306/9314/1 9309/9317/1 9312/9320/1 9307/9315/1 +f 16059/16067/1 1480/1488/1 9309/9317/1 9306/9314/1 +f 1480/1488/1 1479/1487/1 9310/9318/1 9309/9317/1 +f 9322/9330/1 9305/9313/1 9308/9316/1 9323/9331/1 +f 3771/3779/1 16060/16068/1 9305/9313/1 9322/9330/1 +f 16060/16068/1 16059/16067/1 9306/9314/1 9305/9313/1 +f 3726/3734/1 9301/9309/1 9304/9312/1 3727/3735/1 +f 9323/9331/1 9308/9316/1 9301/9309/1 3726/3734/1 +f 9308/9316/1 9307/9315/1 9302/9310/1 9301/9309/1 +f 9294/9302/1 9297/9305/1 9300/9308/1 9295/9303/1 +f 9279/9287/1 3740/3748/1 9297/9305/1 9294/9302/1 +f 3740/3748/1 3739/3747/1 9298/9306/1 9297/9305/1 +f 17302/17310/1 9293/9301/1 9296/9304/1 17303/17311/1 +f 5015/5023/1 9280/9288/1 9293/9301/1 17302/17310/1 +f 9280/9288/1 9279/9287/1 9294/9302/1 9293/9301/1 +f 1066/1074/1 9289/9297/1 9292/9300/1 1067/1075/1 +f 17303/17311/1 9296/9304/1 9289/9297/1 1066/1074/1 +f 9296/9304/1 9295/9303/1 9290/9298/1 9289/9297/1 +f 9282/9290/1 9285/9293/1 9288/9296/1 9283/9291/1 +f 9327/9335/1 3724/3732/1 9285/9293/1 9282/9290/1 +f 3724/3732/1 3723/3731/1 9286/9294/1 9285/9293/1 +f 5458/5466/1 9281/9289/1 9284/9292/1 5459/5467/1 +f 1943/1951/1 9328/9336/1 9281/9289/1 5458/5466/1 +f 9328/9336/1 9327/9335/1 9282/9290/1 9281/9289/1 +f 5014/5022/1 9277/9285/1 9280/9288/1 5015/5023/1 +f 5459/5467/1 9284/9292/1 9277/9285/1 5014/5022/1 +f 9284/9292/1 9283/9291/1 9278/9286/1 9277/9285/1 +f 9270/9278/1 9273/9281/1 9276/9284/1 9271/9279/1 +f 16011/16019/1 1496/1504/1 9273/9281/1 9270/9278/1 +f 1496/1504/1 1495/1503/1 9274/9282/1 9273/9281/1 +f 9286/9294/1 9269/9277/1 9272/9280/1 9287/9295/1 +f 3723/3731/1 16012/16020/1 9269/9277/1 9286/9294/1 +f 16012/16020/1 16011/16019/1 9270/9278/1 9269/9277/1 +f 3738/3746/1 9265/9273/1 9268/9276/1 3739/3747/1 +f 9287/9295/1 9272/9280/1 9265/9273/1 3738/3746/1 +f 9272/9280/1 9271/9279/1 9266/9274/1 9265/9273/1 +f 9258/9266/1 9261/9269/1 9264/9272/1 9259/9267/1 +f 9243/9251/1 3752/3760/1 9261/9269/1 9258/9266/1 +f 3752/3760/1 3751/3759/1 9262/9270/1 9261/9269/1 +f 16054/16062/1 9257/9265/1 9260/9268/1 16055/16063/1 +f 3767/3775/1 9244/9252/1 9257/9265/1 16054/16062/1 +f 9244/9252/1 9243/9251/1 9258/9266/1 9257/9265/1 +f 1482/1490/1 9253/9261/1 9256/9264/1 1483/1491/1 +f 16055/16063/1 9260/9268/1 9253/9261/1 1482/1490/1 +f 9260/9268/1 9259/9267/1 9254/9262/1 9253/9261/1 +f 9246/9254/1 9249/9257/1 9252/9260/1 9247/9255/1 +f 17639/17647/1 17640/17648/1 9249/9257/1 9246/9254/1 +f 17640/17648/1 17641/17649/1 9250/9258/1 9249/9257/1 +f 9202/9210/1 9245/9253/1 9248/9256/1 9203/9211/1 +f 17642/17650/1 17643/17651/1 9245/9253/1 9202/9210/1 +f 17643/17651/1 17639/17647/1 9246/9254/1 9245/9253/1 +f 3766/3774/1 9241/9249/1 9244/9252/1 3767/3775/1 +f 9203/9211/1 9248/9256/1 9241/9249/1 3766/3774/1 +f 9248/9256/1 9247/9255/1 9242/9250/1 9241/9249/1 +f 9234/9242/1 9237/9245/1 9240/9248/1 9235/9243/1 +f 17644/17652/1 17645/17653/1 9237/9245/1 9234/9242/1 +f 17645/17653/1 17646/17654/1 9238/9246/1 9237/9245/1 +f 9250/9258/1 9233/9241/1 9236/9244/1 9251/9259/1 +f 17641/17649/1 17647/17655/1 9233/9241/1 9250/9258/1 +f 17647/17655/1 17644/17652/1 9234/9242/1 9233/9241/1 +f 3750/3758/1 9229/9237/1 9232/9240/1 3751/3759/1 +f 9251/9259/1 9236/9244/1 9229/9237/1 3750/3758/1 +f 9236/9244/1 9235/9243/1 9230/9238/1 9229/9237/1 +f 9222/9230/1 9225/9233/1 9228/9236/1 9223/9231/1 +f 9207/9215/1 3764/3772/1 9225/9233/1 9222/9230/1 +f 3764/3772/1 3763/3771/1 9226/9234/1 9225/9233/1 +f 15646/15654/1 9221/9229/1 9224/9232/1 15647/15655/1 +f 3359/3367/1 9208/9216/1 9221/9229/1 15646/15654/1 +f 9208/9216/1 9207/9215/1 9222/9230/1 9221/9229/1 +f 1618/1626/1 9217/9225/1 9220/9228/1 1619/1627/1 +f 15647/15655/1 9224/9232/1 9217/9225/1 1618/1626/1 +f 9224/9232/1 9223/9231/1 9218/9226/1 9217/9225/1 +f 9210/9218/1 9213/9221/1 9216/9224/1 9211/9219/1 +f 17648/17656/1 17649/17657/1 9213/9221/1 9210/9218/1 +f 17649/17657/1 17650/17658/1 9214/9222/1 9213/9221/1 +f 10426/10434/1 9209/9217/1 9212/9220/1 10427/10435/1 +f 17502/17510/1 17651/17659/1 9209/9217/1 10426/10434/1 +f 17651/17659/1 17648/17656/1 9210/9218/1 9209/9217/1 +f 3358/3366/1 9205/9213/1 9208/9216/1 3359/3367/1 +f 10427/10435/1 9212/9220/1 9205/9213/1 3358/3366/1 +f 9212/9220/1 9211/9219/1 9206/9214/1 9205/9213/1 +f 9198/9206/1 9201/9209/1 9204/9212/1 9199/9207/1 +f 17652/17660/1 17653/17661/1 9201/9209/1 9198/9206/1 +f 17653/17661/1 17642/17650/1 9202/9210/1 9201/9209/1 +f 9214/9222/1 9197/9205/1 9200/9208/1 9215/9223/1 +f 17650/17658/1 17654/17662/1 9197/9205/1 9214/9222/1 +f 17654/17662/1 17652/17660/1 9198/9206/1 9197/9205/1 +f 3762/3770/1 9193/9201/1 9196/9204/1 3763/3771/1 +f 9215/9223/1 9200/9208/1 9193/9201/1 3762/3770/1 +f 9200/9208/1 9199/9207/1 9194/9202/1 9193/9201/1 +f 9186/9194/1 9189/9197/1 9192/9200/1 9187/9195/1 +f 9171/9179/1 3776/3784/1 9189/9197/1 9186/9194/1 +f 3776/3784/1 3775/3783/1 9190/9198/1 9189/9197/1 +f 16978/16986/1 9185/9193/1 9188/9196/1 16979/16987/1 +f 4691/4699/1 9172/9180/1 9185/9193/1 16978/16986/1 +f 9172/9180/1 9171/9179/1 9186/9194/1 9185/9193/1 +f 1174/1182/1 9181/9189/1 9184/9192/1 1175/1183/1 +f 16979/16987/1 9188/9196/1 9181/9189/1 1174/1182/1 +f 9188/9196/1 9187/9195/1 9182/9190/1 9181/9189/1 +f 9174/9182/1 9177/9185/1 9180/9188/1 9175/9183/1 +f 9219/9227/1 3760/3768/1 9177/9185/1 9174/9182/1 +f 3760/3768/1 3759/3767/1 9178/9186/1 9177/9185/1 +f 6430/6438/1 9173/9181/1 9176/9184/1 6431/6439/1 +f 1619/1627/1 9220/9228/1 9173/9181/1 6430/6438/1 +f 9220/9228/1 9219/9227/1 9174/9182/1 9173/9181/1 +f 4690/4698/1 9169/9177/1 9172/9180/1 4691/4699/1 +f 6431/6439/1 9176/9184/1 9169/9177/1 4690/4698/1 +f 9176/9184/1 9175/9183/1 9170/9178/1 9169/9177/1 +f 9162/9170/1 9165/9173/1 9168/9176/1 9163/9171/1 +f 16047/16055/1 1484/1492/1 9165/9173/1 9162/9170/1 +f 1484/1492/1 1483/1491/1 9166/9174/1 9165/9173/1 +f 9178/9186/1 9161/9169/1 9164/9172/1 9179/9187/1 +f 3759/3767/1 16048/16056/1 9161/9169/1 9178/9186/1 +f 16048/16056/1 16047/16055/1 9162/9170/1 9161/9169/1 +f 3774/3782/1 9157/9165/1 9160/9168/1 3775/3783/1 +f 9179/9187/1 9164/9172/1 9157/9165/1 3774/3782/1 +f 9164/9172/1 9163/9171/1 9158/9166/1 9157/9165/1 +f 9150/9158/1 9153/9161/1 9156/9164/1 9151/9159/1 +f 9135/9143/1 3788/3796/1 9153/9161/1 9150/9158/1 +f 3788/3796/1 3787/3795/1 9154/9162/1 9153/9161/1 +f 16090/16098/1 9149/9157/1 9152/9160/1 16091/16099/1 +f 3803/3811/1 9136/9144/1 9149/9157/1 16090/16098/1 +f 9136/9144/1 9135/9143/1 9150/9158/1 9149/9157/1 +f 1470/1478/1 9145/9153/1 9148/9156/1 1471/1479/1 +f 16091/16099/1 9152/9160/1 9145/9153/1 1470/1478/1 +f 9152/9160/1 9151/9159/1 9146/9154/1 9145/9153/1 +f 9138/9146/1 9141/9149/1 9144/9152/1 9139/9147/1 +f 17655/17663/1 17656/17664/1 9141/9149/1 9138/9146/1 +f 17656/17664/1 17657/17665/1 9142/9150/1 9141/9149/1 +f 9094/9102/1 9137/9145/1 9140/9148/1 9095/9103/1 +f 17658/17666/1 17659/17667/1 9137/9145/1 9094/9102/1 +f 17659/17667/1 17655/17663/1 9138/9146/1 9137/9145/1 +f 3802/3810/1 9133/9141/1 9136/9144/1 3803/3811/1 +f 9095/9103/1 9140/9148/1 9133/9141/1 3802/3810/1 +f 9140/9148/1 9139/9147/1 9134/9142/1 9133/9141/1 +f 9126/9134/1 9129/9137/1 9132/9140/1 9127/9135/1 +f 17660/17668/1 17661/17669/1 9129/9137/1 9126/9134/1 +f 17661/17669/1 17618/17626/1 9130/9138/1 9129/9137/1 +f 9142/9150/1 9125/9133/1 9128/9136/1 9143/9151/1 +f 17657/17665/1 17662/17670/1 9125/9133/1 9142/9150/1 +f 17662/17670/1 17660/17668/1 9126/9134/1 9125/9133/1 +f 3786/3794/1 9121/9129/1 9124/9132/1 3787/3795/1 +f 9143/9151/1 9128/9136/1 9121/9129/1 3786/3794/1 +f 9128/9136/1 9127/9135/1 9122/9130/1 9121/9129/1 +f 9114/9122/1 9117/9125/1 9120/9128/1 9115/9123/1 +f 9099/9107/1 3800/3808/1 9117/9125/1 9114/9122/1 +f 3800/3808/1 3799/3807/1 9118/9126/1 9117/9125/1 +f 16042/16050/1 9113/9121/1 9116/9124/1 16043/16051/1 +f 3755/3763/1 9100/9108/1 9113/9121/1 16042/16050/1 +f 9100/9108/1 9099/9107/1 9114/9122/1 9113/9121/1 +f 1486/1494/1 9109/9117/1 9112/9120/1 1487/1495/1 +f 16043/16051/1 9116/9124/1 9109/9117/1 1486/1494/1 +f 9116/9124/1 9115/9123/1 9110/9118/1 9109/9117/1 +f 9102/9110/1 9105/9113/1 9108/9116/1 9103/9111/1 +f 17663/17671/1 17664/17672/1 9105/9113/1 9102/9110/1 +f 17664/17672/1 17665/17673/1 9106/9114/1 9105/9113/1 +f 9238/9246/1 9101/9109/1 9104/9112/1 9239/9247/1 +f 17646/17654/1 17666/17674/1 9101/9109/1 9238/9246/1 +f 17666/17674/1 17663/17671/1 9102/9110/1 9101/9109/1 +f 3754/3762/1 9097/9105/1 9100/9108/1 3755/3763/1 +f 9239/9247/1 9104/9112/1 9097/9105/1 3754/3762/1 +f 9104/9112/1 9103/9111/1 9098/9106/1 9097/9105/1 +f 9090/9098/1 9093/9101/1 9096/9104/1 9091/9099/1 +f 17667/17675/1 17668/17676/1 9093/9101/1 9090/9098/1 +f 17668/17676/1 17658/17666/1 9094/9102/1 9093/9101/1 +f 9106/9114/1 9089/9097/1 9092/9100/1 9107/9115/1 +f 17665/17673/1 17669/17677/1 9089/9097/1 9106/9114/1 +f 17669/17677/1 17667/17675/1 9090/9098/1 9089/9097/1 +f 3798/3806/1 9085/9093/1 9088/9096/1 3799/3807/1 +f 9107/9115/1 9092/9100/1 9085/9093/1 3798/3806/1 +f 9092/9100/1 9091/9099/1 9086/9094/1 9085/9093/1 +f 9078/9086/1 9081/9089/1 9084/9092/1 9079/9087/1 +f 9063/9071/1 3812/3820/1 9081/9089/1 9078/9086/1 +f 3812/3820/1 3811/3819/1 9082/9090/1 9081/9089/1 +f 16846/16854/1 9077/9085/1 9080/9088/1 16847/16855/1 +f 4559/4567/1 9064/9072/1 9077/9085/1 16846/16854/1 +f 9064/9072/1 9063/9071/1 9078/9086/1 9077/9085/1 +f 1218/1226/1 9073/9081/1 9076/9084/1 1219/1227/1 +f 16847/16855/1 9080/9088/1 9073/9081/1 1218/1226/1 +f 9080/9088/1 9079/9087/1 9074/9082/1 9073/9081/1 +f 9066/9074/1 9069/9077/1 9072/9080/1 9067/9075/1 +f 9111/9119/1 3796/3804/1 9069/9077/1 9066/9074/1 +f 3796/3804/1 3795/3803/1 9070/9078/1 9069/9077/1 +f 6826/6834/1 9065/9073/1 9068/9076/1 6827/6835/1 +f 1487/1495/1 9112/9120/1 9065/9073/1 6826/6834/1 +f 9112/9120/1 9111/9119/1 9066/9074/1 9065/9073/1 +f 4558/4566/1 9061/9069/1 9064/9072/1 4559/4567/1 +f 6827/6835/1 9068/9076/1 9061/9069/1 4558/4566/1 +f 9068/9076/1 9067/9075/1 9062/9070/1 9061/9069/1 +f 9054/9062/1 9057/9065/1 9060/9068/1 9055/9063/1 +f 16083/16091/1 1472/1480/1 9057/9065/1 9054/9062/1 +f 1472/1480/1 1471/1479/1 9058/9066/1 9057/9065/1 +f 9070/9078/1 9053/9061/1 9056/9064/1 9071/9079/1 +f 3795/3803/1 16084/16092/1 9053/9061/1 9070/9078/1 +f 16084/16092/1 16083/16091/1 9054/9062/1 9053/9061/1 +f 3810/3818/1 9049/9057/1 9052/9060/1 3811/3819/1 +f 9071/9079/1 9056/9064/1 9049/9057/1 3810/3818/1 +f 9056/9064/1 9055/9063/1 9050/9058/1 9049/9057/1 +f 9042/9050/1 9045/9053/1 9048/9056/1 9043/9051/1 +f 9027/9035/1 3824/3832/1 9045/9053/1 9042/9050/1 +f 3824/3832/1 3823/3831/1 9046/9054/1 9045/9053/1 +f 16126/16134/1 9041/9049/1 9044/9052/1 16127/16135/1 +f 3839/3847/1 9028/9036/1 9041/9049/1 16126/16134/1 +f 9028/9036/1 9027/9035/1 9042/9050/1 9041/9049/1 +f 1458/1466/1 9037/9045/1 9040/9048/1 1459/1467/1 +f 16127/16135/1 9044/9052/1 9037/9045/1 1458/1466/1 +f 9044/9052/1 9043/9051/1 9038/9046/1 9037/9045/1 +f 9030/9038/1 9033/9041/1 9036/9044/1 9031/9039/1 +f 6951/6959/1 4516/4524/1 9033/9041/1 9030/9038/1 +f 4516/4524/1 4515/4523/1 9034/9042/1 9033/9041/1 +f 8986/8994/1 9029/9037/1 9032/9040/1 8987/8995/1 +f 1443/1451/1 6952/6960/1 9029/9037/1 8986/8994/1 +f 6952/6960/1 6951/6959/1 9030/9038/1 9029/9037/1 +f 3838/3846/1 9025/9033/1 9028/9036/1 3839/3847/1 +f 8987/8995/1 9032/9040/1 9025/9033/1 3838/3846/1 +f 9032/9040/1 9031/9039/1 9026/9034/1 9025/9033/1 +f 9018/9026/1 9021/9029/1 9024/9032/1 9019/9027/1 +f 16803/16811/1 1232/1240/1 9021/9029/1 9018/9026/1 +f 1232/1240/1 1231/1239/1 9022/9030/1 9021/9029/1 +f 9034/9042/1 9017/9025/1 9020/9028/1 9035/9043/1 +f 4515/4523/1 16804/16812/1 9017/9025/1 9034/9042/1 +f 16804/16812/1 16803/16811/1 9018/9026/1 9017/9025/1 +f 3822/3830/1 9013/9021/1 9016/9024/1 3823/3831/1 +f 9035/9043/1 9020/9028/1 9013/9021/1 3822/3830/1 +f 9020/9028/1 9019/9027/1 9014/9022/1 9013/9021/1 +f 9006/9014/1 9009/9017/1 9012/9020/1 9007/9015/1 +f 8991/8999/1 3836/3844/1 9009/9017/1 9006/9014/1 +f 3836/3844/1 3835/3843/1 9010/9018/1 9009/9017/1 +f 14422/14430/1 9005/9013/1 9008/9016/1 14423/14431/1 +f 2135/2143/1 8992/9000/1 9005/9013/1 14422/14430/1 +f 8992/9000/1 8991/8999/1 9006/9014/1 9005/9013/1 +f 2026/2034/1 9001/9009/1 9004/9012/1 2027/2035/1 +f 14423/14431/1 9008/9016/1 9001/9009/1 2026/2034/1 +f 9008/9016/1 9007/9015/1 9002/9010/1 9001/9009/1 +f 8994/9002/1 8997/9005/1 9000/9008/1 8995/9003/1 +f 8859/8867/1 3880/3888/1 8997/9005/1 8994/9002/1 +f 3880/3888/1 3879/3887/1 8998/9006/1 8997/9005/1 +f 14098/14106/1 8993/9001/1 8996/9004/1 14099/14107/1 +f 1259/1267/1 8860/8868/1 8993/9001/1 14098/14106/1 +f 8860/8868/1 8859/8867/1 8994/9002/1 8993/9001/1 +f 2134/2142/1 8989/8997/1 8992/9000/1 2135/2143/1 +f 14099/14107/1 8996/9004/1 8989/8997/1 2134/2142/1 +f 8996/9004/1 8995/9003/1 8990/8998/1 8989/8997/1 +f 8982/8990/1 8985/8993/1 8988/8996/1 8983/8991/1 +f 16167/16175/1 1444/1452/1 8985/8993/1 8982/8990/1 +f 1444/1452/1 1443/1451/1 8986/8994/1 8985/8993/1 +f 8998/9006/1 8981/8989/1 8984/8992/1 8999/9007/1 +f 3879/3887/1 16168/16176/1 8981/8989/1 8998/9006/1 +f 16168/16176/1 16167/16175/1 8982/8990/1 8981/8989/1 +f 3834/3842/1 8977/8985/1 8980/8988/1 3835/3843/1 +f 8999/9007/1 8984/8992/1 8977/8985/1 3834/3842/1 +f 8984/8992/1 8983/8991/1 8978/8986/1 8977/8985/1 +f 8970/8978/1 8973/8981/1 8976/8984/1 8971/8979/1 +f 8955/8963/1 3848/3856/1 8973/8981/1 8970/8978/1 +f 3848/3856/1 3847/3855/1 8974/8982/1 8973/8981/1 +f 17386/17394/1 8969/8977/1 8972/8980/1 17387/17395/1 +f 5099/5107/1 8956/8964/1 8969/8977/1 17386/17394/1 +f 8956/8964/1 8955/8963/1 8970/8978/1 8969/8977/1 +f 1038/1046/1 8965/8973/1 8968/8976/1 1039/1047/1 +f 17387/17395/1 8972/8980/1 8965/8973/1 1038/1046/1 +f 8972/8980/1 8971/8979/1 8966/8974/1 8965/8973/1 +f 8958/8966/1 8961/8969/1 8964/8972/1 8959/8967/1 +f 9003/9011/1 3832/3840/1 8961/8969/1 8958/8966/1 +f 3832/3840/1 3831/3839/1 8962/8970/1 8961/8969/1 +f 5206/5214/1 8957/8965/1 8960/8968/1 5207/5215/1 +f 2027/2035/1 9004/9012/1 8957/8965/1 5206/5214/1 +f 9004/9012/1 9003/9011/1 8958/8966/1 8957/8965/1 +f 5098/5106/1 8953/8961/1 8956/8964/1 5099/5107/1 +f 5207/5215/1 8960/8968/1 8953/8961/1 5098/5106/1 +f 8960/8968/1 8959/8967/1 8954/8962/1 8953/8961/1 +f 8946/8954/1 8949/8957/1 8952/8960/1 8947/8955/1 +f 16119/16127/1 1460/1468/1 8949/8957/1 8946/8954/1 +f 1460/1468/1 1459/1467/1 8950/8958/1 8949/8957/1 +f 8962/8970/1 8945/8953/1 8948/8956/1 8963/8971/1 +f 3831/3839/1 16120/16128/1 8945/8953/1 8962/8970/1 +f 16120/16128/1 16119/16127/1 8946/8954/1 8945/8953/1 +f 3846/3854/1 8941/8949/1 8944/8952/1 3847/3855/1 +f 8963/8971/1 8948/8956/1 8941/8949/1 3846/3854/1 +f 8948/8956/1 8947/8955/1 8942/8950/1 8941/8949/1 +f 8934/8942/1 8937/8945/1 8940/8948/1 8935/8943/1 +f 8919/8927/1 3860/3868/1 8937/8945/1 8934/8942/1 +f 3860/3868/1 3859/3867/1 8938/8946/1 8937/8945/1 +f 16162/16170/1 8933/8941/1 8936/8944/1 16163/16171/1 +f 3875/3883/1 8920/8928/1 8933/8941/1 16162/16170/1 +f 8920/8928/1 8919/8927/1 8934/8942/1 8933/8941/1 +f 1446/1454/1 8929/8937/1 8932/8940/1 1447/1455/1 +f 16163/16171/1 8936/8944/1 8929/8937/1 1446/1454/1 +f 8936/8944/1 8935/8943/1 8930/8938/1 8929/8937/1 +f 8922/8930/1 8925/8933/1 8928/8936/1 8923/8931/1 +f 6807/6815/1 4564/4572/1 8925/8933/1 8922/8930/1 +f 4564/4572/1 4563/4571/1 8926/8934/1 8925/8933/1 +f 8878/8886/1 8921/8929/1 8924/8932/1 8879/8887/1 +f 1491/1499/1 6808/6816/1 8921/8929/1 8878/8886/1 +f 6808/6816/1 6807/6815/1 8922/8930/1 8921/8929/1 +f 3874/3882/1 8917/8925/1 8920/8928/1 3875/3883/1 +f 8879/8887/1 8924/8932/1 8917/8925/1 3874/3882/1 +f 8924/8932/1 8923/8931/1 8918/8926/1 8917/8925/1 +f 8910/8918/1 8913/8921/1 8916/8924/1 8911/8919/1 +f 16851/16859/1 1216/1224/1 8913/8921/1 8910/8918/1 +f 1216/1224/1 1215/1223/1 8914/8922/1 8913/8921/1 +f 8926/8934/1 8909/8917/1 8912/8920/1 8927/8935/1 +f 4563/4571/1 16852/16860/1 8909/8917/1 8926/8934/1 +f 16852/16860/1 16851/16859/1 8910/8918/1 8909/8917/1 +f 3858/3866/1 8905/8913/1 8908/8916/1 3859/3867/1 +f 8927/8935/1 8912/8920/1 8905/8913/1 3858/3866/1 +f 8912/8920/1 8911/8919/1 8906/8914/1 8905/8913/1 +f 8898/8906/1 8901/8909/1 8904/8912/1 8899/8907/1 +f 8883/8891/1 3872/3880/1 8901/8909/1 8898/8906/1 +f 3872/3880/1 3871/3879/1 8902/8910/1 8901/8909/1 +f 16402/16410/1 8897/8905/1 8900/8908/1 16403/16411/1 +f 4115/4123/1 8884/8892/1 8897/8905/1 16402/16410/1 +f 8884/8892/1 8883/8891/1 8898/8906/1 8897/8905/1 +f 1366/1374/1 8893/8901/1 8896/8904/1 1367/1375/1 +f 16403/16411/1 8900/8908/1 8893/8901/1 1366/1374/1 +f 8900/8908/1 8899/8907/1 8894/8902/1 8893/8901/1 +f 8886/8894/1 8889/8897/1 8892/8900/1 8887/8895/1 +f 9291/9299/1 3736/3744/1 8889/8897/1 8886/8894/1 +f 3736/3744/1 3735/3743/1 8890/8898/1 8889/8897/1 +f 8158/8166/1 8885/8893/1 8888/8896/1 8159/8167/1 +f 1067/1075/1 9292/9300/1 8885/8893/1 8158/8166/1 +f 9292/9300/1 9291/9299/1 8886/8894/1 8885/8893/1 +f 4114/4122/1 8881/8889/1 8884/8892/1 4115/4123/1 +f 8159/8167/1 8888/8896/1 8881/8889/1 4114/4122/1 +f 8888/8896/1 8887/8895/1 8882/8890/1 8881/8889/1 +f 8874/8882/1 8877/8885/1 8880/8888/1 8875/8883/1 +f 16023/16031/1 1492/1500/1 8877/8885/1 8874/8882/1 +f 1492/1500/1 1491/1499/1 8878/8886/1 8877/8885/1 +f 8890/8898/1 8873/8881/1 8876/8884/1 8891/8899/1 +f 3735/3743/1 16024/16032/1 8873/8881/1 8890/8898/1 +f 16024/16032/1 16023/16031/1 8874/8882/1 8873/8881/1 +f 3870/3878/1 8869/8877/1 8872/8880/1 3871/3879/1 +f 8891/8899/1 8876/8884/1 8869/8877/1 3870/3878/1 +f 8876/8884/1 8875/8883/1 8870/8878/1 8869/8877/1 +f 8862/8870/1 8865/8873/1 8868/8876/1 8863/8871/1 +f 8847/8855/1 3884/3892/1 8865/8873/1 8862/8870/1 +f 3884/3892/1 3883/3891/1 8866/8874/1 8865/8873/1 +f 16726/16734/1 8861/8869/1 8864/8872/1 16727/16735/1 +f 4439/4447/1 8848/8856/1 8861/8869/1 16726/16734/1 +f 8848/8856/1 8847/8855/1 8862/8870/1 8861/8869/1 +f 1258/1266/1 8857/8865/1 8860/8868/1 1259/1267/1 +f 16727/16735/1 8864/8872/1 8857/8865/1 1258/1266/1 +f 8864/8872/1 8863/8871/1 8858/8866/1 8857/8865/1 +f 8850/8858/1 8853/8861/1 8856/8864/1 8851/8859/1 +f 8895/8903/1 3868/3876/1 8853/8861/1 8850/8858/1 +f 3868/3876/1 3867/3875/1 8854/8862/1 8853/8861/1 +f 7186/7194/1 8849/8857/1 8852/8860/1 7187/7195/1 +f 1367/1375/1 8896/8904/1 8849/8857/1 7186/7194/1 +f 8896/8904/1 8895/8903/1 8850/8858/1 8849/8857/1 +f 4438/4446/1 8845/8853/1 8848/8856/1 4439/4447/1 +f 7187/7195/1 8852/8860/1 8845/8853/1 4438/4446/1 +f 8852/8860/1 8851/8859/1 8846/8854/1 8845/8853/1 +f 8838/8846/1 8841/8849/1 8844/8852/1 8839/8847/1 +f 16155/16163/1 1448/1456/1 8841/8849/1 8838/8846/1 +f 1448/1456/1 1447/1455/1 8842/8850/1 8841/8849/1 +f 8854/8862/1 8837/8845/1 8840/8848/1 8855/8863/1 +f 3867/3875/1 16156/16164/1 8837/8845/1 8854/8862/1 +f 16156/16164/1 16155/16163/1 8838/8846/1 8837/8845/1 +f 3882/3890/1 8833/8841/1 8836/8844/1 3883/3891/1 +f 8855/8863/1 8840/8848/1 8833/8841/1 3882/3890/1 +f 8840/8848/1 8839/8847/1 8834/8842/1 8833/8841/1 +f 8826/8834/1 8829/8837/1 8832/8840/1 8827/8835/1 +f 8811/8819/1 3896/3904/1 8829/8837/1 8826/8834/1 +f 3896/3904/1 3895/3903/1 8830/8838/1 8829/8837/1 +f 16198/16206/1 8825/8833/1 8828/8836/1 16199/16207/1 +f 3911/3919/1 8812/8820/1 8825/8833/1 16198/16206/1 +f 8812/8820/1 8811/8819/1 8826/8834/1 8825/8833/1 +f 1434/1442/1 8821/8829/1 8824/8832/1 1435/1443/1 +f 16199/16207/1 8828/8836/1 8821/8829/1 1434/1442/1 +f 8828/8836/1 8827/8835/1 8822/8830/1 8821/8829/1 +f 8814/8822/1 8817/8825/1 8820/8828/1 8815/8823/1 +f 5331/5339/1 5056/5064/1 8817/8825/1 8814/8822/1 +f 5056/5064/1 5055/5063/1 8818/8826/1 8817/8825/1 +f 8770/8778/1 8813/8821/1 8816/8824/1 8771/8779/1 +f 1983/1991/1 5332/5340/1 8813/8821/1 8770/8778/1 +f 5332/5340/1 5331/5339/1 8814/8822/1 8813/8821/1 +f 3910/3918/1 8809/8817/1 8812/8820/1 3911/3919/1 +f 8771/8779/1 8816/8824/1 8809/8817/1 3910/3918/1 +f 8816/8824/1 8815/8823/1 8810/8818/1 8809/8817/1 +f 8802/8810/1 8805/8813/1 8808/8816/1 8803/8811/1 +f 17343/17351/1 1052/1060/1 8805/8813/1 8802/8810/1 +f 1052/1060/1 1051/1059/1 8806/8814/1 8805/8813/1 +f 8818/8826/1 8801/8809/1 8804/8812/1 8819/8827/1 +f 5055/5063/1 17344/17352/1 8801/8809/1 8818/8826/1 +f 17344/17352/1 17343/17351/1 8802/8810/1 8801/8809/1 +f 3894/3902/1 8797/8805/1 8800/8808/1 3895/3903/1 +f 8819/8827/1 8804/8812/1 8797/8805/1 3894/3902/1 +f 8804/8812/1 8803/8811/1 8798/8806/1 8797/8805/1 +f 8790/8798/1 8793/8801/1 8796/8804/1 8791/8799/1 +f 8775/8783/1 3908/3916/1 8793/8801/1 8790/8798/1 +f 3908/3916/1 3907/3915/1 8794/8802/1 8793/8801/1 +f 16150/16158/1 8789/8797/1 8792/8800/1 16151/16159/1 +f 3863/3871/1 8776/8784/1 8789/8797/1 16150/16158/1 +f 8776/8784/1 8775/8783/1 8790/8798/1 8789/8797/1 +f 1450/1458/1 8785/8793/1 8788/8796/1 1451/1459/1 +f 16151/16159/1 8792/8800/1 8785/8793/1 1450/1458/1 +f 8792/8800/1 8791/8799/1 8786/8794/1 8785/8793/1 +f 8778/8786/1 8781/8789/1 8784/8792/1 8779/8787/1 +f 13719/13727/1 2260/2268/1 8781/8789/1 8778/8786/1 +f 2260/2268/1 2259/2267/1 8782/8790/1 8781/8789/1 +f 8914/8922/1 8777/8785/1 8780/8788/1 8915/8923/1 +f 1215/1223/1 13720/13728/1 8777/8785/1 8914/8922/1 +f 13720/13728/1 13719/13727/1 8778/8786/1 8777/8785/1 +f 3862/3870/1 8773/8781/1 8776/8784/1 3863/3871/1 +f 8915/8923/1 8780/8788/1 8773/8781/1 3862/3870/1 +f 8780/8788/1 8779/8787/1 8774/8782/1 8773/8781/1 +f 8766/8774/1 8769/8777/1 8772/8780/1 8767/8775/1 +f 14547/14555/1 1984/1992/1 8769/8777/1 8766/8774/1 +f 1984/1992/1 1983/1991/1 8770/8778/1 8769/8777/1 +f 8782/8790/1 8765/8773/1 8768/8776/1 8783/8791/1 +f 2259/2267/1 14548/14556/1 8765/8773/1 8782/8790/1 +f 14548/14556/1 14547/14555/1 8766/8774/1 8765/8773/1 +f 3906/3914/1 8761/8769/1 8764/8772/1 3907/3915/1 +f 8783/8791/1 8768/8776/1 8761/8769/1 3906/3914/1 +f 8768/8776/1 8767/8775/1 8762/8770/1 8761/8769/1 +f 8754/8762/1 8757/8765/1 8760/8768/1 8755/8763/1 +f 8739/8747/1 3920/3928/1 8757/8765/1 8754/8762/1 +f 3920/3928/1 3919/3927/1 8758/8766/1 8757/8765/1 +f 16810/16818/1 8753/8761/1 8756/8764/1 16811/16819/1 +f 4523/4531/1 8740/8748/1 8753/8761/1 16810/16818/1 +f 8740/8748/1 8739/8747/1 8754/8762/1 8753/8761/1 +f 1230/1238/1 8749/8757/1 8752/8760/1 1231/1239/1 +f 16811/16819/1 8756/8764/1 8749/8757/1 1230/1238/1 +f 8756/8764/1 8755/8763/1 8750/8758/1 8749/8757/1 +f 8742/8750/1 8745/8753/1 8748/8756/1 8743/8751/1 +f 8787/8795/1 3904/3912/1 8745/8753/1 8742/8750/1 +f 3904/3912/1 3903/3911/1 8746/8754/1 8745/8753/1 +f 6934/6942/1 8741/8749/1 8744/8752/1 6935/6943/1 +f 1451/1459/1 8788/8796/1 8741/8749/1 6934/6942/1 +f 8788/8796/1 8787/8795/1 8742/8750/1 8741/8749/1 +f 4522/4530/1 8737/8745/1 8740/8748/1 4523/4531/1 +f 6935/6943/1 8744/8752/1 8737/8745/1 4522/4530/1 +f 8744/8752/1 8743/8751/1 8738/8746/1 8737/8745/1 +f 8730/8738/1 8733/8741/1 8736/8744/1 8731/8739/1 +f 16191/16199/1 1436/1444/1 8733/8741/1 8730/8738/1 +f 1436/1444/1 1435/1443/1 8734/8742/1 8733/8741/1 +f 8746/8754/1 8729/8737/1 8732/8740/1 8747/8755/1 +f 3903/3911/1 16192/16200/1 8729/8737/1 8746/8754/1 +f 16192/16200/1 16191/16199/1 8730/8738/1 8729/8737/1 +f 3918/3926/1 8725/8733/1 8728/8736/1 3919/3927/1 +f 8747/8755/1 8732/8740/1 8725/8733/1 3918/3926/1 +f 8732/8740/1 8731/8739/1 8726/8734/1 8725/8733/1 +f 8718/8726/1 8721/8729/1 8724/8732/1 8719/8727/1 +f 8703/8711/1 3932/3940/1 8721/8729/1 8718/8726/1 +f 3932/3940/1 3931/3939/1 8722/8730/1 8721/8729/1 +f 16234/16242/1 8717/8725/1 8720/8728/1 16235/16243/1 +f 3947/3955/1 8704/8712/1 8717/8725/1 16234/16242/1 +f 8704/8712/1 8703/8711/1 8718/8726/1 8717/8725/1 +f 1422/1430/1 8713/8721/1 8716/8724/1 1423/1431/1 +f 16235/16243/1 8720/8728/1 8713/8721/1 1422/1430/1 +f 8720/8728/1 8719/8727/1 8714/8722/1 8713/8721/1 +f 8706/8714/1 8709/8717/1 8712/8720/1 8707/8715/1 +f 7059/7067/1 4480/4488/1 8709/8717/1 8706/8714/1 +f 4480/4488/1 4479/4487/1 8710/8718/1 8709/8717/1 +f 8662/8670/1 8705/8713/1 8708/8716/1 8663/8671/1 +f 1407/1415/1 7060/7068/1 8705/8713/1 8662/8670/1 +f 7060/7068/1 7059/7067/1 8706/8714/1 8705/8713/1 +f 3946/3954/1 8701/8709/1 8704/8712/1 3947/3955/1 +f 8663/8671/1 8708/8716/1 8701/8709/1 3946/3954/1 +f 8708/8716/1 8707/8715/1 8702/8710/1 8701/8709/1 +f 8694/8702/1 8697/8705/1 8700/8708/1 8695/8703/1 +f 16767/16775/1 1244/1252/1 8697/8705/1 8694/8702/1 +f 1244/1252/1 1243/1251/1 8698/8706/1 8697/8705/1 +f 8710/8718/1 8693/8701/1 8696/8704/1 8711/8719/1 +f 4479/4487/1 16768/16776/1 8693/8701/1 8710/8718/1 +f 16768/16776/1 16767/16775/1 8694/8702/1 8693/8701/1 +f 3930/3938/1 8689/8697/1 8692/8700/1 3931/3939/1 +f 8711/8719/1 8696/8704/1 8689/8697/1 3930/3938/1 +f 8696/8704/1 8695/8703/1 8690/8698/1 8689/8697/1 +f 8682/8690/1 8685/8693/1 8688/8696/1 8683/8691/1 +f 8667/8675/1 3944/3952/1 8685/8693/1 8682/8690/1 +f 3944/3952/1 3943/3951/1 8686/8694/1 8685/8693/1 +f 14494/14502/1 8681/8689/1 8684/8692/1 14495/14503/1 +f 2207/2215/1 8668/8676/1 8681/8689/1 14494/14502/1 +f 8668/8676/1 8667/8675/1 8682/8690/1 8681/8689/1 +f 2002/2010/1 8677/8685/1 8680/8688/1 2003/2011/1 +f 14495/14503/1 8684/8692/1 8677/8685/1 2002/2010/1 +f 8684/8692/1 8683/8691/1 8678/8686/1 8677/8685/1 +f 8670/8678/1 8673/8681/1 8676/8684/1 8671/8679/1 +f 8535/8543/1 3988/3996/1 8673/8681/1 8670/8678/1 +f 3988/3996/1 3987/3995/1 8674/8682/1 8673/8681/1 +f 13882/13890/1 8669/8677/1 8672/8680/1 13883/13891/1 +f 1235/1243/1 8536/8544/1 8669/8677/1 13882/13890/1 +f 8536/8544/1 8535/8543/1 8670/8678/1 8669/8677/1 +f 2206/2214/1 8665/8673/1 8668/8676/1 2207/2215/1 +f 13883/13891/1 8672/8680/1 8665/8673/1 2206/2214/1 +f 8672/8680/1 8671/8679/1 8666/8674/1 8665/8673/1 +f 8658/8666/1 8661/8669/1 8664/8672/1 8659/8667/1 +f 16275/16283/1 1408/1416/1 8661/8669/1 8658/8666/1 +f 1408/1416/1 1407/1415/1 8662/8670/1 8661/8669/1 +f 8674/8682/1 8657/8665/1 8660/8668/1 8675/8683/1 +f 3987/3995/1 16276/16284/1 8657/8665/1 8674/8682/1 +f 16276/16284/1 16275/16283/1 8658/8666/1 8657/8665/1 +f 3942/3950/1 8653/8661/1 8656/8664/1 3943/3951/1 +f 8675/8683/1 8660/8668/1 8653/8661/1 3942/3950/1 +f 8660/8668/1 8659/8667/1 8654/8662/1 8653/8661/1 +f 8646/8654/1 8649/8657/1 8652/8660/1 8647/8655/1 +f 8631/8639/1 3956/3964/1 8649/8657/1 8646/8654/1 +f 3956/3964/1 3955/3963/1 8650/8658/1 8649/8657/1 +f 17362/17370/1 8645/8653/1 8648/8656/1 17363/17371/1 +f 5075/5083/1 8632/8640/1 8645/8653/1 17362/17370/1 +f 8632/8640/1 8631/8639/1 8646/8654/1 8645/8653/1 +f 1046/1054/1 8641/8649/1 8644/8652/1 1047/1055/1 +f 17363/17371/1 8648/8656/1 8641/8649/1 1046/1054/1 +f 8648/8656/1 8647/8655/1 8642/8650/1 8641/8649/1 +f 8634/8642/1 8637/8645/1 8640/8648/1 8635/8643/1 +f 8679/8687/1 3940/3948/1 8637/8645/1 8634/8642/1 +f 3940/3948/1 3939/3947/1 8638/8646/1 8637/8645/1 +f 5278/5286/1 8633/8641/1 8636/8644/1 5279/5287/1 +f 2003/2011/1 8680/8688/1 8633/8641/1 5278/5286/1 +f 8680/8688/1 8679/8687/1 8634/8642/1 8633/8641/1 +f 5074/5082/1 8629/8637/1 8632/8640/1 5075/5083/1 +f 5279/5287/1 8636/8644/1 8629/8637/1 5074/5082/1 +f 8636/8644/1 8635/8643/1 8630/8638/1 8629/8637/1 +f 8622/8630/1 8625/8633/1 8628/8636/1 8623/8631/1 +f 16227/16235/1 1424/1432/1 8625/8633/1 8622/8630/1 +f 1424/1432/1 1423/1431/1 8626/8634/1 8625/8633/1 +f 8638/8646/1 8621/8629/1 8624/8632/1 8639/8647/1 +f 3939/3947/1 16228/16236/1 8621/8629/1 8638/8646/1 +f 16228/16236/1 16227/16235/1 8622/8630/1 8621/8629/1 +f 3954/3962/1 8617/8625/1 8620/8628/1 3955/3963/1 +f 8639/8647/1 8624/8632/1 8617/8625/1 3954/3962/1 +f 8624/8632/1 8623/8631/1 8618/8626/1 8617/8625/1 +f 8610/8618/1 8613/8621/1 8616/8624/1 8611/8619/1 +f 8595/8603/1 3968/3976/1 8613/8621/1 8610/8618/1 +f 3968/3976/1 3967/3975/1 8614/8622/1 8613/8621/1 +f 16270/16278/1 8609/8617/1 8612/8620/1 16271/16279/1 +f 3983/3991/1 8596/8604/1 8609/8617/1 16270/16278/1 +f 8596/8604/1 8595/8603/1 8610/8618/1 8609/8617/1 +f 1410/1418/1 8605/8613/1 8608/8616/1 1411/1419/1 +f 16271/16279/1 8612/8620/1 8605/8613/1 1410/1418/1 +f 8612/8620/1 8611/8619/1 8606/8614/1 8605/8613/1 +f 8598/8606/1 8601/8609/1 8604/8612/1 8599/8607/1 +f 6699/6707/1 4600/4608/1 8601/8609/1 8598/8606/1 +f 4600/4608/1 4599/4607/1 8602/8610/1 8601/8609/1 +f 8554/8562/1 8597/8605/1 8600/8608/1 8555/8563/1 +f 1527/1535/1 6700/6708/1 8597/8605/1 8554/8562/1 +f 6700/6708/1 6699/6707/1 8598/8606/1 8597/8605/1 +f 3982/3990/1 8593/8601/1 8596/8604/1 3983/3991/1 +f 8555/8563/1 8600/8608/1 8593/8601/1 3982/3990/1 +f 8600/8608/1 8599/8607/1 8594/8602/1 8593/8601/1 +f 8586/8594/1 8589/8597/1 8592/8600/1 8587/8595/1 +f 16887/16895/1 1204/1212/1 8589/8597/1 8586/8594/1 +f 1204/1212/1 1203/1211/1 8590/8598/1 8589/8597/1 +f 8602/8610/1 8585/8593/1 8588/8596/1 8603/8611/1 +f 4599/4607/1 16888/16896/1 8585/8593/1 8602/8610/1 +f 16888/16896/1 16887/16895/1 8586/8594/1 8585/8593/1 +f 3966/3974/1 8581/8589/1 8584/8592/1 3967/3975/1 +f 8603/8611/1 8588/8596/1 8581/8589/1 3966/3974/1 +f 8588/8596/1 8587/8595/1 8582/8590/1 8581/8589/1 +f 8574/8582/1 8577/8585/1 8580/8588/1 8575/8583/1 +f 8559/8567/1 3980/3988/1 8577/8585/1 8574/8582/1 +f 3980/3988/1 3979/3987/1 8578/8586/1 8577/8585/1 +f 16186/16194/1 8573/8581/1 8576/8584/1 16187/16195/1 +f 3899/3907/1 8560/8568/1 8573/8581/1 16186/16194/1 +f 8560/8568/1 8559/8567/1 8574/8582/1 8573/8581/1 +f 1438/1446/1 8569/8577/1 8572/8580/1 1439/1447/1 +f 16187/16195/1 8576/8584/1 8569/8577/1 1438/1446/1 +f 8576/8584/1 8575/8583/1 8570/8578/1 8569/8577/1 +f 8562/8570/1 8565/8573/1 8568/8576/1 8563/8571/1 +f 9615/9623/1 3628/3636/1 8565/8573/1 8562/8570/1 +f 3628/3636/1 3627/3635/1 8566/8574/1 8565/8573/1 +f 8806/8814/1 8561/8569/1 8564/8572/1 8807/8815/1 +f 1051/1059/1 9616/9624/1 8561/8569/1 8806/8814/1 +f 9616/9624/1 9615/9623/1 8562/8570/1 8561/8569/1 +f 3898/3906/1 8557/8565/1 8560/8568/1 3899/3907/1 +f 8807/8815/1 8564/8572/1 8557/8565/1 3898/3906/1 +f 8564/8572/1 8563/8571/1 8558/8566/1 8557/8565/1 +f 8550/8558/1 8553/8561/1 8556/8564/1 8551/8559/1 +f 15915/15923/1 1528/1536/1 8553/8561/1 8550/8558/1 +f 1528/1536/1 1527/1535/1 8554/8562/1 8553/8561/1 +f 8566/8574/1 8549/8557/1 8552/8560/1 8567/8575/1 +f 3627/3635/1 15916/15924/1 8549/8557/1 8566/8574/1 +f 15916/15924/1 15915/15923/1 8550/8558/1 8549/8557/1 +f 3978/3986/1 8545/8553/1 8548/8556/1 3979/3987/1 +f 8567/8575/1 8552/8560/1 8545/8553/1 3978/3986/1 +f 8552/8560/1 8551/8559/1 8546/8554/1 8545/8553/1 +f 8538/8546/1 8541/8549/1 8544/8552/1 8539/8547/1 +f 8523/8531/1 3992/4000/1 8541/8549/1 8538/8546/1 +f 3992/4000/1 3991/3999/1 8542/8550/1 8541/8549/1 +f 16798/16806/1 8537/8545/1 8540/8548/1 16799/16807/1 +f 4511/4519/1 8524/8532/1 8537/8545/1 16798/16806/1 +f 8524/8532/1 8523/8531/1 8538/8546/1 8537/8545/1 +f 1234/1242/1 8533/8541/1 8536/8544/1 1235/1243/1 +f 16799/16807/1 8540/8548/1 8533/8541/1 1234/1242/1 +f 8540/8548/1 8539/8547/1 8534/8542/1 8533/8541/1 +f 8526/8534/1 8529/8537/1 8532/8540/1 8527/8535/1 +f 8571/8579/1 3976/3984/1 8529/8537/1 8526/8534/1 +f 3976/3984/1 3975/3983/1 8530/8538/1 8529/8537/1 +f 6970/6978/1 8525/8533/1 8528/8536/1 6971/6979/1 +f 1439/1447/1 8572/8580/1 8525/8533/1 6970/6978/1 +f 8572/8580/1 8571/8579/1 8526/8534/1 8525/8533/1 +f 4510/4518/1 8521/8529/1 8524/8532/1 4511/4519/1 +f 6971/6979/1 8528/8536/1 8521/8529/1 4510/4518/1 +f 8528/8536/1 8527/8535/1 8522/8530/1 8521/8529/1 +f 8514/8522/1 8517/8525/1 8520/8528/1 8515/8523/1 +f 16263/16271/1 1412/1420/1 8517/8525/1 8514/8522/1 +f 1412/1420/1 1411/1419/1 8518/8526/1 8517/8525/1 +f 8530/8538/1 8513/8521/1 8516/8524/1 8531/8539/1 +f 3975/3983/1 16264/16272/1 8513/8521/1 8530/8538/1 +f 16264/16272/1 16263/16271/1 8514/8522/1 8513/8521/1 +f 3990/3998/1 8509/8517/1 8512/8520/1 3991/3999/1 +f 8531/8539/1 8516/8524/1 8509/8517/1 3990/3998/1 +f 8516/8524/1 8515/8523/1 8510/8518/1 8509/8517/1 +f 8502/8510/1 8505/8513/1 8508/8516/1 8503/8511/1 +f 8487/8495/1 4004/4012/1 8505/8513/1 8502/8510/1 +f 4004/4012/1 4003/4011/1 8506/8514/1 8505/8513/1 +f 16306/16314/1 8501/8509/1 8504/8512/1 16307/16315/1 +f 4019/4027/1 8488/8496/1 8501/8509/1 16306/16314/1 +f 8488/8496/1 8487/8495/1 8502/8510/1 8501/8509/1 +f 1398/1406/1 8497/8505/1 8500/8508/1 1399/1407/1 +f 16307/16315/1 8504/8512/1 8497/8505/1 1398/1406/1 +f 8504/8512/1 8503/8511/1 8498/8506/1 8497/8505/1 +f 8490/8498/1 8493/8501/1 8496/8504/1 8491/8499/1 +f 5367/5375/1 5044/5052/1 8493/8501/1 8490/8498/1 +f 5044/5052/1 5043/5051/1 8494/8502/1 8493/8501/1 +f 8446/8454/1 8489/8497/1 8492/8500/1 8447/8455/1 +f 1971/1979/1 5368/5376/1 8489/8497/1 8446/8454/1 +f 5368/5376/1 5367/5375/1 8490/8498/1 8489/8497/1 +f 4018/4026/1 8485/8493/1 8488/8496/1 4019/4027/1 +f 8447/8455/1 8492/8500/1 8485/8493/1 4018/4026/1 +f 8492/8500/1 8491/8499/1 8486/8494/1 8485/8493/1 +f 8478/8486/1 8481/8489/1 8484/8492/1 8479/8487/1 +f 17331/17339/1 1056/1064/1 8481/8489/1 8478/8486/1 +f 1056/1064/1 1055/1063/1 8482/8490/1 8481/8489/1 +f 8494/8502/1 8477/8485/1 8480/8488/1 8495/8503/1 +f 5043/5051/1 17332/17340/1 8477/8485/1 8494/8502/1 +f 17332/17340/1 17331/17339/1 8478/8486/1 8477/8485/1 +f 4002/4010/1 8473/8481/1 8476/8484/1 4003/4011/1 +f 8495/8503/1 8480/8488/1 8473/8481/1 4002/4010/1 +f 8480/8488/1 8479/8487/1 8474/8482/1 8473/8481/1 +f 8466/8474/1 8469/8477/1 8472/8480/1 8467/8475/1 +f 8451/8459/1 4016/4024/1 8469/8477/1 8466/8474/1 +f 4016/4024/1 4015/4023/1 8470/8478/1 8469/8477/1 +f 16258/16266/1 8465/8473/1 8468/8476/1 16259/16267/1 +f 3971/3979/1 8452/8460/1 8465/8473/1 16258/16266/1 +f 8452/8460/1 8451/8459/1 8466/8474/1 8465/8473/1 +f 1414/1422/1 8461/8469/1 8464/8472/1 1415/1423/1 +f 16259/16267/1 8468/8476/1 8461/8469/1 1414/1422/1 +f 8468/8476/1 8467/8475/1 8462/8470/1 8461/8469/1 +f 8454/8462/1 8457/8465/1 8460/8468/1 8455/8463/1 +f 13611/13619/1 2296/2304/1 8457/8465/1 8454/8462/1 +f 2296/2304/1 2295/2303/1 8458/8466/1 8457/8465/1 +f 8590/8598/1 8453/8461/1 8456/8464/1 8591/8599/1 +f 1203/1211/1 13612/13620/1 8453/8461/1 8590/8598/1 +f 13612/13620/1 13611/13619/1 8454/8462/1 8453/8461/1 +f 3970/3978/1 8449/8457/1 8452/8460/1 3971/3979/1 +f 8591/8599/1 8456/8464/1 8449/8457/1 3970/3978/1 +f 8456/8464/1 8455/8463/1 8450/8458/1 8449/8457/1 +f 8442/8450/1 8445/8453/1 8448/8456/1 8443/8451/1 +f 14583/14591/1 1972/1980/1 8445/8453/1 8442/8450/1 +f 1972/1980/1 1971/1979/1 8446/8454/1 8445/8453/1 +f 8458/8466/1 8441/8449/1 8444/8452/1 8459/8467/1 +f 2295/2303/1 14584/14592/1 8441/8449/1 8458/8466/1 +f 14584/14592/1 14583/14591/1 8442/8450/1 8441/8449/1 +f 4014/4022/1 8437/8445/1 8440/8448/1 4015/4023/1 +f 8459/8467/1 8444/8452/1 8437/8445/1 4014/4022/1 +f 8444/8452/1 8443/8451/1 8438/8446/1 8437/8445/1 +f 8430/8438/1 8433/8441/1 8436/8444/1 8431/8439/1 +f 8415/8423/1 4028/4036/1 8433/8441/1 8430/8438/1 +f 4028/4036/1 4027/4035/1 8434/8442/1 8433/8441/1 +f 16774/16782/1 8429/8437/1 8432/8440/1 16775/16783/1 +f 4487/4495/1 8416/8424/1 8429/8437/1 16774/16782/1 +f 8416/8424/1 8415/8423/1 8430/8438/1 8429/8437/1 +f 1242/1250/1 8425/8433/1 8428/8436/1 1243/1251/1 +f 16775/16783/1 8432/8440/1 8425/8433/1 1242/1250/1 +f 8432/8440/1 8431/8439/1 8426/8434/1 8425/8433/1 +f 8418/8426/1 8421/8429/1 8424/8432/1 8419/8427/1 +f 8463/8471/1 4012/4020/1 8421/8429/1 8418/8426/1 +f 4012/4020/1 4011/4019/1 8422/8430/1 8421/8429/1 +f 7042/7050/1 8417/8425/1 8420/8428/1 7043/7051/1 +f 1415/1423/1 8464/8472/1 8417/8425/1 7042/7050/1 +f 8464/8472/1 8463/8471/1 8418/8426/1 8417/8425/1 +f 4486/4494/1 8413/8421/1 8416/8424/1 4487/4495/1 +f 7043/7051/1 8420/8428/1 8413/8421/1 4486/4494/1 +f 8420/8428/1 8419/8427/1 8414/8422/1 8413/8421/1 +f 8406/8414/1 8409/8417/1 8412/8420/1 8407/8415/1 +f 16299/16307/1 1400/1408/1 8409/8417/1 8406/8414/1 +f 1400/1408/1 1399/1407/1 8410/8418/1 8409/8417/1 +f 8422/8430/1 8405/8413/1 8408/8416/1 8423/8431/1 +f 4011/4019/1 16300/16308/1 8405/8413/1 8422/8430/1 +f 16300/16308/1 16299/16307/1 8406/8414/1 8405/8413/1 +f 4026/4034/1 8401/8409/1 8404/8412/1 4027/4035/1 +f 8423/8431/1 8408/8416/1 8401/8409/1 4026/4034/1 +f 8408/8416/1 8407/8415/1 8402/8410/1 8401/8409/1 +f 8394/8402/1 8397/8405/1 8400/8408/1 8395/8403/1 +f 8379/8387/1 4040/4048/1 8397/8405/1 8394/8402/1 +f 4040/4048/1 4039/4047/1 8398/8406/1 8397/8405/1 +f 16342/16350/1 8393/8401/1 8396/8404/1 16343/16351/1 +f 4055/4063/1 8380/8388/1 8393/8401/1 16342/16350/1 +f 8380/8388/1 8379/8387/1 8394/8402/1 8393/8401/1 +f 1386/1394/1 8389/8397/1 8392/8400/1 1387/1395/1 +f 16343/16351/1 8396/8404/1 8389/8397/1 1386/1394/1 +f 8396/8404/1 8395/8403/1 8390/8398/1 8389/8397/1 +f 8382/8390/1 8385/8393/1 8388/8396/1 8383/8391/1 +f 7167/7175/1 4444/4452/1 8385/8393/1 8382/8390/1 +f 4444/4452/1 4443/4451/1 8386/8394/1 8385/8393/1 +f 8338/8346/1 8381/8389/1 8384/8392/1 8339/8347/1 +f 1371/1379/1 7168/7176/1 8381/8389/1 8338/8346/1 +f 7168/7176/1 7167/7175/1 8382/8390/1 8381/8389/1 +f 4054/4062/1 8377/8385/1 8380/8388/1 4055/4063/1 +f 8339/8347/1 8384/8392/1 8377/8385/1 4054/4062/1 +f 8384/8392/1 8383/8391/1 8378/8386/1 8377/8385/1 +f 8370/8378/1 8373/8381/1 8376/8384/1 8371/8379/1 +f 16731/16739/1 1256/1264/1 8373/8381/1 8370/8378/1 +f 1256/1264/1 1255/1263/1 8374/8382/1 8373/8381/1 +f 8386/8394/1 8369/8377/1 8372/8380/1 8387/8395/1 +f 4443/4451/1 16732/16740/1 8369/8377/1 8386/8394/1 +f 16732/16740/1 16731/16739/1 8370/8378/1 8369/8377/1 +f 4038/4046/1 8365/8373/1 8368/8376/1 4039/4047/1 +f 8387/8395/1 8372/8380/1 8365/8373/1 4038/4046/1 +f 8372/8380/1 8371/8379/1 8366/8374/1 8365/8373/1 +f 8358/8366/1 8361/8369/1 8364/8372/1 8359/8367/1 +f 8343/8351/1 4052/4060/1 8361/8369/1 8358/8366/1 +f 4052/4060/1 4051/4059/1 8362/8370/1 8361/8369/1 +f 14602/14610/1 8357/8365/1 8360/8368/1 14603/14611/1 +f 2315/2323/1 8344/8352/1 8357/8365/1 14602/14610/1 +f 8344/8352/1 8343/8351/1 8358/8366/1 8357/8365/1 +f 1966/1974/1 8353/8361/1 8356/8364/1 1967/1975/1 +f 14603/14611/1 8360/8368/1 8353/8361/1 1966/1974/1 +f 8360/8368/1 8359/8367/1 8354/8362/1 8353/8361/1 +f 8346/8354/1 8349/8357/1 8352/8360/1 8347/8355/1 +f 8211/8219/1 4096/4104/1 8349/8357/1 8346/8354/1 +f 4096/4104/1 4095/4103/1 8350/8358/1 8349/8357/1 +f 13558/13566/1 8345/8353/1 8348/8356/1 13559/13567/1 +f 1199/1207/1 8212/8220/1 8345/8353/1 13558/13566/1 +f 8212/8220/1 8211/8219/1 8346/8354/1 8345/8353/1 +f 2314/2322/1 8341/8349/1 8344/8352/1 2315/2323/1 +f 13559/13567/1 8348/8356/1 8341/8349/1 2314/2322/1 +f 8348/8356/1 8347/8355/1 8342/8350/1 8341/8349/1 +f 8334/8342/1 8337/8345/1 8340/8348/1 8335/8343/1 +f 16383/16391/1 1372/1380/1 8337/8345/1 8334/8342/1 +f 1372/1380/1 1371/1379/1 8338/8346/1 8337/8345/1 +f 8350/8358/1 8333/8341/1 8336/8344/1 8351/8359/1 +f 4095/4103/1 16384/16392/1 8333/8341/1 8350/8358/1 +f 16384/16392/1 16383/16391/1 8334/8342/1 8333/8341/1 +f 4050/4058/1 8329/8337/1 8332/8340/1 4051/4059/1 +f 8351/8359/1 8336/8344/1 8329/8337/1 4050/4058/1 +f 8336/8344/1 8335/8343/1 8330/8338/1 8329/8337/1 +f 8322/8330/1 8325/8333/1 8328/8336/1 8323/8331/1 +f 8307/8315/1 4064/4072/1 8325/8333/1 8322/8330/1 +f 4064/4072/1 4063/4071/1 8326/8334/1 8325/8333/1 +f 17326/17334/1 8321/8329/1 8324/8332/1 17327/17335/1 +f 5039/5047/1 8308/8316/1 8321/8329/1 17326/17334/1 +f 8308/8316/1 8307/8315/1 8322/8330/1 8321/8329/1 +f 1058/1066/1 8317/8325/1 8320/8328/1 1059/1067/1 +f 17327/17335/1 8324/8332/1 8317/8325/1 1058/1066/1 +f 8324/8332/1 8323/8331/1 8318/8326/1 8317/8325/1 +f 8310/8318/1 8313/8321/1 8316/8324/1 8311/8319/1 +f 8355/8363/1 4048/4056/1 8313/8321/1 8310/8318/1 +f 4048/4056/1 4047/4055/1 8314/8322/1 8313/8321/1 +f 5386/5394/1 8309/8317/1 8312/8320/1 5387/5395/1 +f 1967/1975/1 8356/8364/1 8309/8317/1 5386/5394/1 +f 8356/8364/1 8355/8363/1 8310/8318/1 8309/8317/1 +f 5038/5046/1 8305/8313/1 8308/8316/1 5039/5047/1 +f 5387/5395/1 8312/8320/1 8305/8313/1 5038/5046/1 +f 8312/8320/1 8311/8319/1 8306/8314/1 8305/8313/1 +f 8298/8306/1 8301/8309/1 8304/8312/1 8299/8307/1 +f 16335/16343/1 1388/1396/1 8301/8309/1 8298/8306/1 +f 1388/1396/1 1387/1395/1 8302/8310/1 8301/8309/1 +f 8314/8322/1 8297/8305/1 8300/8308/1 8315/8323/1 +f 4047/4055/1 16336/16344/1 8297/8305/1 8314/8322/1 +f 16336/16344/1 16335/16343/1 8298/8306/1 8297/8305/1 +f 4062/4070/1 8293/8301/1 8296/8304/1 4063/4071/1 +f 8315/8323/1 8300/8308/1 8293/8301/1 4062/4070/1 +f 8300/8308/1 8299/8307/1 8294/8302/1 8293/8301/1 +f 8286/8294/1 8289/8297/1 8292/8300/1 8287/8295/1 +f 8271/8279/1 4076/4084/1 8289/8297/1 8286/8294/1 +f 4076/4084/1 4075/4083/1 8290/8298/1 8289/8297/1 +f 16378/16386/1 8285/8293/1 8288/8296/1 16379/16387/1 +f 4091/4099/1 8272/8280/1 8285/8293/1 16378/16386/1 +f 8272/8280/1 8271/8279/1 8286/8294/1 8285/8293/1 +f 1374/1382/1 8281/8289/1 8284/8292/1 1375/1383/1 +f 16379/16387/1 8288/8296/1 8281/8289/1 1374/1382/1 +f 8288/8296/1 8287/8295/1 8282/8290/1 8281/8289/1 +f 8274/8282/1 8277/8285/1 8280/8288/1 8275/8283/1 +f 6375/6383/1 4708/4716/1 8277/8285/1 8274/8282/1 +f 4708/4716/1 4707/4715/1 8278/8286/1 8277/8285/1 +f 8230/8238/1 8273/8281/1 8276/8284/1 8231/8239/1 +f 1635/1643/1 6376/6384/1 8273/8281/1 8230/8238/1 +f 6376/6384/1 6375/6383/1 8274/8282/1 8273/8281/1 +f 4090/4098/1 8269/8277/1 8272/8280/1 4091/4099/1 +f 8231/8239/1 8276/8284/1 8269/8277/1 4090/4098/1 +f 8276/8284/1 8275/8283/1 8270/8278/1 8269/8277/1 +f 8262/8270/1 8265/8273/1 8268/8276/1 8263/8271/1 +f 16995/17003/1 1168/1176/1 8265/8273/1 8262/8270/1 +f 1168/1176/1 1167/1175/1 8266/8274/1 8265/8273/1 +f 8278/8286/1 8261/8269/1 8264/8272/1 8279/8287/1 +f 4707/4715/1 16996/17004/1 8261/8269/1 8278/8286/1 +f 16996/17004/1 16995/17003/1 8262/8270/1 8261/8269/1 +f 4074/4082/1 8257/8265/1 8260/8268/1 4075/4083/1 +f 8279/8287/1 8264/8272/1 8257/8265/1 4074/4082/1 +f 8264/8272/1 8263/8271/1 8258/8266/1 8257/8265/1 +f 8250/8258/1 8253/8261/1 8256/8264/1 8251/8259/1 +f 8235/8243/1 4088/4096/1 8253/8261/1 8250/8258/1 +f 4088/4096/1 4087/4095/1 8254/8262/1 8253/8261/1 +f 15862/15870/1 8249/8257/1 8252/8260/1 15863/15871/1 +f 3575/3583/1 8236/8244/1 8249/8257/1 15862/15870/1 +f 8236/8244/1 8235/8243/1 8250/8258/1 8249/8257/1 +f 1546/1554/1 8245/8253/1 8248/8256/1 1547/1555/1 +f 15863/15871/1 8252/8260/1 8245/8253/1 1546/1554/1 +f 8252/8260/1 8251/8259/1 8246/8254/1 8245/8253/1 +f 8238/8246/1 8241/8249/1 8244/8252/1 8239/8247/1 +f 10587/10595/1 3304/3312/1 8241/8249/1 8238/8246/1 +f 3304/3312/1 3303/3311/1 8242/8250/1 8241/8249/1 +f 9778/9786/1 8237/8245/1 8240/8248/1 9779/9787/1 +f 1063/1071/1 10588/10596/1 8237/8245/1 9778/9786/1 +f 10588/10596/1 10587/10595/1 8238/8246/1 8237/8245/1 +f 3574/3582/1 8233/8241/1 8236/8244/1 3575/3583/1 +f 9779/9787/1 8240/8248/1 8233/8241/1 3574/3582/1 +f 8240/8248/1 8239/8247/1 8234/8242/1 8233/8241/1 +f 8226/8234/1 8229/8237/1 8232/8240/1 8227/8235/1 +f 15591/15599/1 1636/1644/1 8229/8237/1 8226/8234/1 +f 1636/1644/1 1635/1643/1 8230/8238/1 8229/8237/1 +f 8242/8250/1 8225/8233/1 8228/8236/1 8243/8251/1 +f 3303/3311/1 15592/15600/1 8225/8233/1 8242/8250/1 +f 15592/15600/1 15591/15599/1 8226/8234/1 8225/8233/1 +f 4086/4094/1 8221/8229/1 8224/8232/1 4087/4095/1 +f 8243/8251/1 8228/8236/1 8221/8229/1 4086/4094/1 +f 8228/8236/1 8227/8235/1 8222/8230/1 8221/8229/1 +f 8214/8222/1 8217/8225/1 8220/8228/1 8215/8223/1 +f 8199/8207/1 4100/4108/1 8217/8225/1 8214/8222/1 +f 4100/4108/1 4099/4107/1 8218/8226/1 8217/8225/1 +f 16906/16914/1 8213/8221/1 8216/8224/1 16907/16915/1 +f 4619/4627/1 8200/8208/1 8213/8221/1 16906/16914/1 +f 8200/8208/1 8199/8207/1 8214/8222/1 8213/8221/1 +f 1198/1206/1 8209/8217/1 8212/8220/1 1199/1207/1 +f 16907/16915/1 8216/8224/1 8209/8217/1 1198/1206/1 +f 8216/8224/1 8215/8223/1 8210/8218/1 8209/8217/1 +f 8202/8210/1 8205/8213/1 8208/8216/1 8203/8211/1 +f 8247/8255/1 4084/4092/1 8205/8213/1 8202/8210/1 +f 4084/4092/1 4083/4091/1 8206/8214/1 8205/8213/1 +f 6646/6654/1 8201/8209/1 8204/8212/1 6647/6655/1 +f 1547/1555/1 8248/8256/1 8201/8209/1 6646/6654/1 +f 8248/8256/1 8247/8255/1 8202/8210/1 8201/8209/1 +f 4618/4626/1 8197/8205/1 8200/8208/1 4619/4627/1 +f 6647/6655/1 8204/8212/1 8197/8205/1 4618/4626/1 +f 8204/8212/1 8203/8211/1 8198/8206/1 8197/8205/1 +f 8190/8198/1 8193/8201/1 8196/8204/1 8191/8199/1 +f 16371/16379/1 1376/1384/1 8193/8201/1 8190/8198/1 +f 1376/1384/1 1375/1383/1 8194/8202/1 8193/8201/1 +f 8206/8214/1 8189/8197/1 8192/8200/1 8207/8215/1 +f 4083/4091/1 16372/16380/1 8189/8197/1 8206/8214/1 +f 16372/16380/1 16371/16379/1 8190/8198/1 8189/8197/1 +f 4098/4106/1 8185/8193/1 8188/8196/1 4099/4107/1 +f 8207/8215/1 8192/8200/1 8185/8193/1 4098/4106/1 +f 8192/8200/1 8191/8199/1 8186/8194/1 8185/8193/1 +f 8178/8186/1 8181/8189/1 8184/8192/1 8179/8187/1 +f 8163/8171/1 4112/4120/1 8181/8189/1 8178/8186/1 +f 4112/4120/1 4111/4119/1 8182/8190/1 8181/8189/1 +f 16414/16422/1 8177/8185/1 8180/8188/1 16415/16423/1 +f 4127/4135/1 8164/8172/1 8177/8185/1 16414/16422/1 +f 8164/8172/1 8163/8171/1 8178/8186/1 8177/8185/1 +f 1362/1370/1 8173/8181/1 8176/8184/1 1363/1371/1 +f 16415/16423/1 8180/8188/1 8173/8181/1 1362/1370/1 +f 8180/8188/1 8179/8187/1 8174/8182/1 8173/8181/1 +f 8166/8174/1 8169/8177/1 8172/8180/1 8167/8175/1 +f 5475/5483/1 5008/5016/1 8169/8177/1 8166/8174/1 +f 5008/5016/1 5007/5015/1 8170/8178/1 8169/8177/1 +f 8122/8130/1 8165/8173/1 8168/8176/1 8123/8131/1 +f 1935/1943/1 5476/5484/1 8165/8173/1 8122/8130/1 +f 5476/5484/1 5475/5483/1 8166/8174/1 8165/8173/1 +f 4126/4134/1 8161/8169/1 8164/8172/1 4127/4135/1 +f 8123/8131/1 8168/8176/1 8161/8169/1 4126/4134/1 +f 8168/8176/1 8167/8175/1 8162/8170/1 8161/8169/1 +f 8154/8162/1 8157/8165/1 8160/8168/1 8155/8163/1 +f 17295/17303/1 1068/1076/1 8157/8165/1 8154/8162/1 +f 1068/1076/1 1067/1075/1 8158/8166/1 8157/8165/1 +f 8170/8178/1 8153/8161/1 8156/8164/1 8171/8179/1 +f 5007/5015/1 17296/17304/1 8153/8161/1 8170/8178/1 +f 17296/17304/1 17295/17303/1 8154/8162/1 8153/8161/1 +f 4110/4118/1 8149/8157/1 8152/8160/1 4111/4119/1 +f 8171/8179/1 8156/8164/1 8149/8157/1 4110/4118/1 +f 8156/8164/1 8155/8163/1 8150/8158/1 8149/8157/1 +f 8142/8150/1 8145/8153/1 8148/8156/1 8143/8151/1 +f 8127/8135/1 4124/4132/1 8145/8153/1 8142/8150/1 +f 4124/4132/1 4123/4131/1 8146/8154/1 8145/8153/1 +f 16366/16374/1 8141/8149/1 8144/8152/1 16367/16375/1 +f 4079/4087/1 8128/8136/1 8141/8149/1 16366/16374/1 +f 8128/8136/1 8127/8135/1 8142/8150/1 8141/8149/1 +f 1378/1386/1 8137/8145/1 8140/8148/1 1379/1387/1 +f 16367/16375/1 8144/8152/1 8137/8145/1 1378/1386/1 +f 8144/8152/1 8143/8151/1 8138/8146/1 8137/8145/1 +f 8130/8138/1 8133/8141/1 8136/8144/1 8131/8139/1 +f 13287/13295/1 2404/2412/1 8133/8141/1 8130/8138/1 +f 2404/2412/1 2403/2411/1 8134/8142/1 8133/8141/1 +f 8266/8274/1 8129/8137/1 8132/8140/1 8267/8275/1 +f 1167/1175/1 13288/13296/1 8129/8137/1 8266/8274/1 +f 13288/13296/1 13287/13295/1 8130/8138/1 8129/8137/1 +f 4078/4086/1 8125/8133/1 8128/8136/1 4079/4087/1 +f 8267/8275/1 8132/8140/1 8125/8133/1 4078/4086/1 +f 8132/8140/1 8131/8139/1 8126/8134/1 8125/8133/1 +f 8118/8126/1 8121/8129/1 8124/8132/1 8119/8127/1 +f 14691/14699/1 1936/1944/1 8121/8129/1 8118/8126/1 +f 1936/1944/1 1935/1943/1 8122/8130/1 8121/8129/1 +f 8134/8142/1 8117/8125/1 8120/8128/1 8135/8143/1 +f 2403/2411/1 14692/14700/1 8117/8125/1 8134/8142/1 +f 14692/14700/1 14691/14699/1 8118/8126/1 8117/8125/1 +f 4122/4130/1 8113/8121/1 8116/8124/1 4123/4131/1 +f 8135/8143/1 8120/8128/1 8113/8121/1 4122/4130/1 +f 8120/8128/1 8119/8127/1 8114/8122/1 8113/8121/1 +f 8106/8114/1 8109/8117/1 8112/8120/1 8107/8115/1 +f 8091/8099/1 4136/4144/1 8109/8117/1 8106/8114/1 +f 4136/4144/1 4135/4143/1 8110/8118/1 8109/8117/1 +f 16738/16746/1 8105/8113/1 8108/8116/1 16739/16747/1 +f 4451/4459/1 8092/8100/1 8105/8113/1 16738/16746/1 +f 8092/8100/1 8091/8099/1 8106/8114/1 8105/8113/1 +f 1254/1262/1 8101/8109/1 8104/8112/1 1255/1263/1 +f 16739/16747/1 8108/8116/1 8101/8109/1 1254/1262/1 +f 8108/8116/1 8107/8115/1 8102/8110/1 8101/8109/1 +f 8094/8102/1 8097/8105/1 8100/8108/1 8095/8103/1 +f 8139/8147/1 4120/4128/1 8097/8105/1 8094/8102/1 +f 4120/4128/1 4119/4127/1 8098/8106/1 8097/8105/1 +f 7150/7158/1 8093/8101/1 8096/8104/1 7151/7159/1 +f 1379/1387/1 8140/8148/1 8093/8101/1 7150/7158/1 +f 8140/8148/1 8139/8147/1 8094/8102/1 8093/8101/1 +f 4450/4458/1 8089/8097/1 8092/8100/1 4451/4459/1 +f 7151/7159/1 8096/8104/1 8089/8097/1 4450/4458/1 +f 8096/8104/1 8095/8103/1 8090/8098/1 8089/8097/1 +f 8082/8090/1 8085/8093/1 8088/8096/1 8083/8091/1 +f 16407/16415/1 1364/1372/1 8085/8093/1 8082/8090/1 +f 1364/1372/1 1363/1371/1 8086/8094/1 8085/8093/1 +f 8098/8106/1 8081/8089/1 8084/8092/1 8099/8107/1 +f 4119/4127/1 16408/16416/1 8081/8089/1 8098/8106/1 +f 16408/16416/1 16407/16415/1 8082/8090/1 8081/8089/1 +f 4134/4142/1 8077/8085/1 8080/8088/1 4135/4143/1 +f 8099/8107/1 8084/8092/1 8077/8085/1 4134/4142/1 +f 8084/8092/1 8083/8091/1 8078/8086/1 8077/8085/1 +f 8070/8078/1 8073/8081/1 8076/8084/1 8071/8079/1 +f 8055/8063/1 4148/4156/1 8073/8081/1 8070/8078/1 +f 4148/4156/1 4147/4155/1 8074/8082/1 8073/8081/1 +f 16450/16458/1 8069/8077/1 8072/8080/1 16451/16459/1 +f 4163/4171/1 8056/8064/1 8069/8077/1 16450/16458/1 +f 8056/8064/1 8055/8063/1 8070/8078/1 8069/8077/1 +f 1350/1358/1 8065/8073/1 8068/8076/1 1351/1359/1 +f 16451/16459/1 8072/8080/1 8065/8073/1 1350/1358/1 +f 8072/8080/1 8071/8079/1 8066/8074/1 8065/8073/1 +f 8058/8066/1 8061/8069/1 8064/8072/1 8059/8067/1 +f 7275/7283/1 4408/4416/1 8061/8069/1 8058/8066/1 +f 4408/4416/1 4407/4415/1 8062/8070/1 8061/8069/1 +f 8014/8022/1 8057/8065/1 8060/8068/1 8015/8023/1 +f 1335/1343/1 7276/7284/1 8057/8065/1 8014/8022/1 +f 7276/7284/1 7275/7283/1 8058/8066/1 8057/8065/1 +f 4162/4170/1 8053/8061/1 8056/8064/1 4163/4171/1 +f 8015/8023/1 8060/8068/1 8053/8061/1 4162/4170/1 +f 8060/8068/1 8059/8067/1 8054/8062/1 8053/8061/1 +f 8046/8054/1 8049/8057/1 8052/8060/1 8047/8055/1 +f 16695/16703/1 1268/1276/1 8049/8057/1 8046/8054/1 +f 1268/1276/1 1267/1275/1 8050/8058/1 8049/8057/1 +f 8062/8070/1 8045/8053/1 8048/8056/1 8063/8071/1 +f 4407/4415/1 16696/16704/1 8045/8053/1 8062/8070/1 +f 16696/16704/1 16695/16703/1 8046/8054/1 8045/8053/1 +f 4146/4154/1 8041/8049/1 8044/8052/1 4147/4155/1 +f 8063/8071/1 8048/8056/1 8041/8049/1 4146/4154/1 +f 8048/8056/1 8047/8055/1 8042/8050/1 8041/8049/1 +f 8034/8042/1 8037/8045/1 8040/8048/1 8035/8043/1 +f 8019/8027/1 4160/4168/1 8037/8045/1 8034/8042/1 +f 4160/4168/1 4159/4167/1 8038/8046/1 8037/8045/1 +f 14710/14718/1 8033/8041/1 8036/8044/1 14711/14719/1 +f 2423/2431/1 8020/8028/1 8033/8041/1 14710/14718/1 +f 8020/8028/1 8019/8027/1 8034/8042/1 8033/8041/1 +f 1930/1938/1 8029/8037/1 8032/8040/1 1931/1939/1 +f 14711/14719/1 8036/8044/1 8029/8037/1 1930/1938/1 +f 8036/8044/1 8035/8043/1 8030/8038/1 8029/8037/1 +f 8022/8030/1 8025/8033/1 8028/8036/1 8023/8031/1 +f 7887/7895/1 4204/4212/1 8025/8033/1 8022/8030/1 +f 4204/4212/1 4203/4211/1 8026/8034/1 8025/8033/1 +f 13234/13242/1 8021/8029/1 8024/8032/1 13235/13243/1 +f 1163/1171/1 7888/7896/1 8021/8029/1 13234/13242/1 +f 7888/7896/1 7887/7895/1 8022/8030/1 8021/8029/1 +f 2422/2430/1 8017/8025/1 8020/8028/1 2423/2431/1 +f 13235/13243/1 8024/8032/1 8017/8025/1 2422/2430/1 +f 8024/8032/1 8023/8031/1 8018/8026/1 8017/8025/1 +f 8010/8018/1 8013/8021/1 8016/8024/1 8011/8019/1 +f 16491/16499/1 1336/1344/1 8013/8021/1 8010/8018/1 +f 1336/1344/1 1335/1343/1 8014/8022/1 8013/8021/1 +f 8026/8034/1 8009/8017/1 8012/8020/1 8027/8035/1 +f 4203/4211/1 16492/16500/1 8009/8017/1 8026/8034/1 +f 16492/16500/1 16491/16499/1 8010/8018/1 8009/8017/1 +f 4158/4166/1 8005/8013/1 8008/8016/1 4159/4167/1 +f 8027/8035/1 8012/8020/1 8005/8013/1 4158/4166/1 +f 8012/8020/1 8011/8019/1 8006/8014/1 8005/8013/1 +f 7998/8006/1 8001/8009/1 8004/8012/1 7999/8007/1 +f 7983/7991/1 4172/4180/1 8001/8009/1 7998/8006/1 +f 4172/4180/1 4171/4179/1 8002/8010/1 8001/8009/1 +f 17290/17298/1 7997/8005/1 8000/8008/1 17291/17299/1 +f 5003/5011/1 7984/7992/1 7997/8005/1 17290/17298/1 +f 7984/7992/1 7983/7991/1 7998/8006/1 7997/8005/1 +f 1070/1078/1 7993/8001/1 7996/8004/1 1071/1079/1 +f 17291/17299/1 8000/8008/1 7993/8001/1 1070/1078/1 +f 8000/8008/1 7999/8007/1 7994/8002/1 7993/8001/1 +f 7986/7994/1 7989/7997/1 7992/8000/1 7987/7995/1 +f 8031/8039/1 4156/4164/1 7989/7997/1 7986/7994/1 +f 4156/4164/1 4155/4163/1 7990/7998/1 7989/7997/1 +f 5494/5502/1 7985/7993/1 7988/7996/1 5495/5503/1 +f 1931/1939/1 8032/8040/1 7985/7993/1 5494/5502/1 +f 8032/8040/1 8031/8039/1 7986/7994/1 7985/7993/1 +f 5002/5010/1 7981/7989/1 7984/7992/1 5003/5011/1 +f 5495/5503/1 7988/7996/1 7981/7989/1 5002/5010/1 +f 7988/7996/1 7987/7995/1 7982/7990/1 7981/7989/1 +f 7974/7982/1 7977/7985/1 7980/7988/1 7975/7983/1 +f 16443/16451/1 1352/1360/1 7977/7985/1 7974/7982/1 +f 1352/1360/1 1351/1359/1 7978/7986/1 7977/7985/1 +f 7990/7998/1 7973/7981/1 7976/7984/1 7991/7999/1 +f 4155/4163/1 16444/16452/1 7973/7981/1 7990/7998/1 +f 16444/16452/1 16443/16451/1 7974/7982/1 7973/7981/1 +f 4170/4178/1 7969/7977/1 7972/7980/1 4171/4179/1 +f 7991/7999/1 7976/7984/1 7969/7977/1 4170/4178/1 +f 7976/7984/1 7975/7983/1 7970/7978/1 7969/7977/1 +f 7962/7970/1 7965/7973/1 7968/7976/1 7963/7971/1 +f 7947/7955/1 4184/4192/1 7965/7973/1 7962/7970/1 +f 4184/4192/1 4183/4191/1 7966/7974/1 7965/7973/1 +f 16486/16494/1 7961/7969/1 7964/7972/1 16487/16495/1 +f 4199/4207/1 7948/7956/1 7961/7969/1 16486/16494/1 +f 7948/7956/1 7947/7955/1 7962/7970/1 7961/7969/1 +f 1338/1346/1 7957/7965/1 7960/7968/1 1339/1347/1 +f 16487/16495/1 7964/7972/1 7957/7965/1 1338/1346/1 +f 7964/7972/1 7963/7971/1 7958/7966/1 7957/7965/1 +f 7950/7958/1 7953/7961/1 7956/7964/1 7951/7959/1 +f 6051/6059/1 4816/4824/1 7953/7961/1 7950/7958/1 +f 4816/4824/1 4815/4823/1 7954/7962/1 7953/7961/1 +f 7906/7914/1 7949/7957/1 7952/7960/1 7907/7915/1 +f 1743/1751/1 6052/6060/1 7949/7957/1 7906/7914/1 +f 6052/6060/1 6051/6059/1 7950/7958/1 7949/7957/1 +f 4198/4206/1 7945/7953/1 7948/7956/1 4199/4207/1 +f 7907/7915/1 7952/7960/1 7945/7953/1 4198/4206/1 +f 7952/7960/1 7951/7959/1 7946/7954/1 7945/7953/1 +f 7938/7946/1 7941/7949/1 7944/7952/1 7939/7947/1 +f 17103/17111/1 1132/1140/1 7941/7949/1 7938/7946/1 +f 1132/1140/1 1131/1139/1 7942/7950/1 7941/7949/1 +f 7954/7962/1 7937/7945/1 7940/7948/1 7955/7963/1 +f 4815/4823/1 17104/17112/1 7937/7945/1 7954/7962/1 +f 17104/17112/1 17103/17111/1 7938/7946/1 7937/7945/1 +f 4182/4190/1 7933/7941/1 7936/7944/1 4183/4191/1 +f 7955/7963/1 7940/7948/1 7933/7941/1 4182/4190/1 +f 7940/7948/1 7939/7947/1 7934/7942/1 7933/7941/1 +f 7926/7934/1 7929/7937/1 7932/7940/1 7927/7935/1 +f 7911/7919/1 4196/4204/1 7929/7937/1 7926/7934/1 +f 4196/4204/1 4195/4203/1 7930/7938/1 7929/7937/1 +f 15538/15546/1 7925/7933/1 7928/7936/1 15539/15547/1 +f 3251/3259/1 7912/7920/1 7925/7933/1 15538/15546/1 +f 7912/7920/1 7911/7919/1 7926/7934/1 7925/7933/1 +f 1654/1662/1 7921/7929/1 7924/7932/1 1655/1663/1 +f 15539/15547/1 7928/7936/1 7921/7929/1 1654/1662/1 +f 7928/7936/1 7927/7935/1 7922/7930/1 7921/7929/1 +f 7914/7922/1 7917/7925/1 7920/7928/1 7915/7923/1 +f 11559/11567/1 2980/2988/1 7917/7925/1 7914/7922/1 +f 2980/2988/1 2979/2987/1 7918/7926/1 7917/7925/1 +f 10750/10758/1 7913/7921/1 7916/7924/1 10751/10759/1 +f 1075/1083/1 11560/11568/1 7913/7921/1 10750/10758/1 +f 11560/11568/1 11559/11567/1 7914/7922/1 7913/7921/1 +f 3250/3258/1 7909/7917/1 7912/7920/1 3251/3259/1 +f 10751/10759/1 7916/7924/1 7909/7917/1 3250/3258/1 +f 7916/7924/1 7915/7923/1 7910/7918/1 7909/7917/1 +f 7902/7910/1 7905/7913/1 7908/7916/1 7903/7911/1 +f 15267/15275/1 1744/1752/1 7905/7913/1 7902/7910/1 +f 1744/1752/1 1743/1751/1 7906/7914/1 7905/7913/1 +f 7918/7926/1 7901/7909/1 7904/7912/1 7919/7927/1 +f 2979/2987/1 15268/15276/1 7901/7909/1 7918/7926/1 +f 15268/15276/1 15267/15275/1 7902/7910/1 7901/7909/1 +f 4194/4202/1 7897/7905/1 7900/7908/1 4195/4203/1 +f 7919/7927/1 7904/7912/1 7897/7905/1 4194/4202/1 +f 7904/7912/1 7903/7911/1 7898/7906/1 7897/7905/1 +f 7890/7898/1 7893/7901/1 7896/7904/1 7891/7899/1 +f 7875/7883/1 4208/4216/1 7893/7901/1 7890/7898/1 +f 4208/4216/1 4207/4215/1 7894/7902/1 7893/7901/1 +f 17014/17022/1 7889/7897/1 7892/7900/1 17015/17023/1 +f 4727/4735/1 7876/7884/1 7889/7897/1 17014/17022/1 +f 7876/7884/1 7875/7883/1 7890/7898/1 7889/7897/1 +f 1162/1170/1 7885/7893/1 7888/7896/1 1163/1171/1 +f 17015/17023/1 7892/7900/1 7885/7893/1 1162/1170/1 +f 7892/7900/1 7891/7899/1 7886/7894/1 7885/7893/1 +f 7878/7886/1 7881/7889/1 7884/7892/1 7879/7887/1 +f 7923/7931/1 4192/4200/1 7881/7889/1 7878/7886/1 +f 4192/4200/1 4191/4199/1 7882/7890/1 7881/7889/1 +f 6322/6330/1 7877/7885/1 7880/7888/1 6323/6331/1 +f 1655/1663/1 7924/7932/1 7877/7885/1 6322/6330/1 +f 7924/7932/1 7923/7931/1 7878/7886/1 7877/7885/1 +f 4726/4734/1 7873/7881/1 7876/7884/1 4727/4735/1 +f 6323/6331/1 7880/7888/1 7873/7881/1 4726/4734/1 +f 7880/7888/1 7879/7887/1 7874/7882/1 7873/7881/1 +f 7866/7874/1 7869/7877/1 7872/7880/1 7867/7875/1 +f 16479/16487/1 1340/1348/1 7869/7877/1 7866/7874/1 +f 1340/1348/1 1339/1347/1 7870/7878/1 7869/7877/1 +f 7882/7890/1 7865/7873/1 7868/7876/1 7883/7891/1 +f 4191/4199/1 16480/16488/1 7865/7873/1 7882/7890/1 +f 16480/16488/1 16479/16487/1 7866/7874/1 7865/7873/1 +f 4206/4214/1 7861/7869/1 7864/7872/1 4207/4215/1 +f 7883/7891/1 7868/7876/1 7861/7869/1 4206/4214/1 +f 7868/7876/1 7867/7875/1 7862/7870/1 7861/7869/1 +f 7854/7862/1 7857/7865/1 7860/7868/1 7855/7863/1 +f 7839/7847/1 4220/4228/1 7857/7865/1 7854/7862/1 +f 4220/4228/1 4219/4227/1 7858/7866/1 7857/7865/1 +f 16522/16530/1 7853/7861/1 7856/7864/1 16523/16531/1 +f 4235/4243/1 7840/7848/1 7853/7861/1 16522/16530/1 +f 7840/7848/1 7839/7847/1 7854/7862/1 7853/7861/1 +f 1326/1334/1 7849/7857/1 7852/7860/1 1327/1335/1 +f 16523/16531/1 7856/7864/1 7849/7857/1 1326/1334/1 +f 7856/7864/1 7855/7863/1 7850/7858/1 7849/7857/1 +f 7842/7850/1 7845/7853/1 7848/7856/1 7843/7851/1 +f 5583/5591/1 4972/4980/1 7845/7853/1 7842/7850/1 +f 4972/4980/1 4971/4979/1 7846/7854/1 7845/7853/1 +f 7798/7806/1 7841/7849/1 7844/7852/1 7799/7807/1 +f 1899/1907/1 5584/5592/1 7841/7849/1 7798/7806/1 +f 5584/5592/1 5583/5591/1 7842/7850/1 7841/7849/1 +f 4234/4242/1 7837/7845/1 7840/7848/1 4235/4243/1 +f 7799/7807/1 7844/7852/1 7837/7845/1 4234/4242/1 +f 7844/7852/1 7843/7851/1 7838/7846/1 7837/7845/1 +f 7830/7838/1 7833/7841/1 7836/7844/1 7831/7839/1 +f 17259/17267/1 1080/1088/1 7833/7841/1 7830/7838/1 +f 1080/1088/1 1079/1087/1 7834/7842/1 7833/7841/1 +f 7846/7854/1 7829/7837/1 7832/7840/1 7847/7855/1 +f 4971/4979/1 17260/17268/1 7829/7837/1 7846/7854/1 +f 17260/17268/1 17259/17267/1 7830/7838/1 7829/7837/1 +f 4218/4226/1 7825/7833/1 7828/7836/1 4219/4227/1 +f 7847/7855/1 7832/7840/1 7825/7833/1 4218/4226/1 +f 7832/7840/1 7831/7839/1 7826/7834/1 7825/7833/1 +f 7818/7826/1 7821/7829/1 7824/7832/1 7819/7827/1 +f 7803/7811/1 4232/4240/1 7821/7829/1 7818/7826/1 +f 4232/4240/1 4231/4239/1 7822/7830/1 7821/7829/1 +f 16474/16482/1 7817/7825/1 7820/7828/1 16475/16483/1 +f 4187/4195/1 7804/7812/1 7817/7825/1 16474/16482/1 +f 7804/7812/1 7803/7811/1 7818/7826/1 7817/7825/1 +f 1342/1350/1 7813/7821/1 7816/7824/1 1343/1351/1 +f 16475/16483/1 7820/7828/1 7813/7821/1 1342/1350/1 +f 7820/7828/1 7819/7827/1 7814/7822/1 7813/7821/1 +f 7806/7814/1 7809/7817/1 7812/7820/1 7807/7815/1 +f 12963/12971/1 2512/2520/1 7809/7817/1 7806/7814/1 +f 2512/2520/1 2511/2519/1 7810/7818/1 7809/7817/1 +f 7942/7950/1 7805/7813/1 7808/7816/1 7943/7951/1 +f 1131/1139/1 12964/12972/1 7805/7813/1 7942/7950/1 +f 12964/12972/1 12963/12971/1 7806/7814/1 7805/7813/1 +f 4186/4194/1 7801/7809/1 7804/7812/1 4187/4195/1 +f 7943/7951/1 7808/7816/1 7801/7809/1 4186/4194/1 +f 7808/7816/1 7807/7815/1 7802/7810/1 7801/7809/1 +f 7794/7802/1 7797/7805/1 7800/7808/1 7795/7803/1 +f 14799/14807/1 1900/1908/1 7797/7805/1 7794/7802/1 +f 1900/1908/1 1899/1907/1 7798/7806/1 7797/7805/1 +f 7810/7818/1 7793/7801/1 7796/7804/1 7811/7819/1 +f 2511/2519/1 14800/14808/1 7793/7801/1 7810/7818/1 +f 14800/14808/1 14799/14807/1 7794/7802/1 7793/7801/1 +f 4230/4238/1 7789/7797/1 7792/7800/1 4231/4239/1 +f 7811/7819/1 7796/7804/1 7789/7797/1 4230/4238/1 +f 7796/7804/1 7795/7803/1 7790/7798/1 7789/7797/1 +f 7782/7790/1 7785/7793/1 7788/7796/1 7783/7791/1 +f 7767/7775/1 4244/4252/1 7785/7793/1 7782/7790/1 +f 4244/4252/1 4243/4251/1 7786/7794/1 7785/7793/1 +f 16702/16710/1 7781/7789/1 7784/7792/1 16703/16711/1 +f 4415/4423/1 7768/7776/1 7781/7789/1 16702/16710/1 +f 7768/7776/1 7767/7775/1 7782/7790/1 7781/7789/1 +f 1266/1274/1 7777/7785/1 7780/7788/1 1267/1275/1 +f 16703/16711/1 7784/7792/1 7777/7785/1 1266/1274/1 +f 7784/7792/1 7783/7791/1 7778/7786/1 7777/7785/1 +f 7770/7778/1 7773/7781/1 7776/7784/1 7771/7779/1 +f 7815/7823/1 4228/4236/1 7773/7781/1 7770/7778/1 +f 4228/4236/1 4227/4235/1 7774/7782/1 7773/7781/1 +f 7258/7266/1 7769/7777/1 7772/7780/1 7259/7267/1 +f 1343/1351/1 7816/7824/1 7769/7777/1 7258/7266/1 +f 7816/7824/1 7815/7823/1 7770/7778/1 7769/7777/1 +f 4414/4422/1 7765/7773/1 7768/7776/1 4415/4423/1 +f 7259/7267/1 7772/7780/1 7765/7773/1 4414/4422/1 +f 7772/7780/1 7771/7779/1 7766/7774/1 7765/7773/1 +f 7758/7766/1 7761/7769/1 7764/7772/1 7759/7767/1 +f 16515/16523/1 1328/1336/1 7761/7769/1 7758/7766/1 +f 1328/1336/1 1327/1335/1 7762/7770/1 7761/7769/1 +f 7774/7782/1 7757/7765/1 7760/7768/1 7775/7783/1 +f 4227/4235/1 16516/16524/1 7757/7765/1 7774/7782/1 +f 16516/16524/1 16515/16523/1 7758/7766/1 7757/7765/1 +f 4242/4250/1 7753/7761/1 7756/7764/1 4243/4251/1 +f 7775/7783/1 7760/7768/1 7753/7761/1 4242/4250/1 +f 7760/7768/1 7759/7767/1 7754/7762/1 7753/7761/1 +f 7746/7754/1 7749/7757/1 7752/7760/1 7747/7755/1 +f 7731/7739/1 4256/4264/1 7749/7757/1 7746/7754/1 +f 4256/4264/1 4255/4263/1 7750/7758/1 7749/7757/1 +f 16558/16566/1 7745/7753/1 7748/7756/1 16559/16567/1 +f 4271/4279/1 7732/7740/1 7745/7753/1 16558/16566/1 +f 7732/7740/1 7731/7739/1 7746/7754/1 7745/7753/1 +f 1314/1322/1 7741/7749/1 7744/7752/1 1315/1323/1 +f 16559/16567/1 7748/7756/1 7741/7749/1 1314/1322/1 +f 7748/7756/1 7747/7755/1 7742/7750/1 7741/7749/1 +f 7734/7742/1 7737/7745/1 7740/7748/1 7735/7743/1 +f 7383/7391/1 4372/4380/1 7737/7745/1 7734/7742/1 +f 4372/4380/1 4371/4379/1 7738/7746/1 7737/7745/1 +f 7690/7698/1 7733/7741/1 7736/7744/1 7691/7699/1 +f 1299/1307/1 7384/7392/1 7733/7741/1 7690/7698/1 +f 7384/7392/1 7383/7391/1 7734/7742/1 7733/7741/1 +f 4270/4278/1 7729/7737/1 7732/7740/1 4271/4279/1 +f 7691/7699/1 7736/7744/1 7729/7737/1 4270/4278/1 +f 7736/7744/1 7735/7743/1 7730/7738/1 7729/7737/1 +f 7722/7730/1 7725/7733/1 7728/7736/1 7723/7731/1 +f 16659/16667/1 1280/1288/1 7725/7733/1 7722/7730/1 +f 1280/1288/1 1279/1287/1 7726/7734/1 7725/7733/1 +f 7738/7746/1 7721/7729/1 7724/7732/1 7739/7747/1 +f 4371/4379/1 16660/16668/1 7721/7729/1 7738/7746/1 +f 16660/16668/1 16659/16667/1 7722/7730/1 7721/7729/1 +f 4254/4262/1 7717/7725/1 7720/7728/1 4255/4263/1 +f 7739/7747/1 7724/7732/1 7717/7725/1 4254/4262/1 +f 7724/7732/1 7723/7731/1 7718/7726/1 7717/7725/1 +f 7710/7718/1 7713/7721/1 7716/7724/1 7711/7719/1 +f 7695/7703/1 4268/4276/1 7713/7721/1 7710/7718/1 +f 4268/4276/1 4267/4275/1 7714/7722/1 7713/7721/1 +f 14818/14826/1 7709/7717/1 7712/7720/1 14819/14827/1 +f 2531/2539/1 7696/7704/1 7709/7717/1 14818/14826/1 +f 7696/7704/1 7695/7703/1 7710/7718/1 7709/7717/1 +f 1894/1902/1 7705/7713/1 7708/7716/1 1895/1903/1 +f 14819/14827/1 7712/7720/1 7705/7713/1 1894/1902/1 +f 7712/7720/1 7711/7719/1 7706/7714/1 7705/7713/1 +f 7698/7706/1 7701/7709/1 7704/7712/1 7699/7707/1 +f 7563/7571/1 4312/4320/1 7701/7709/1 7698/7706/1 +f 4312/4320/1 4311/4319/1 7702/7710/1 7701/7709/1 +f 12910/12918/1 7697/7705/1 7700/7708/1 12911/12919/1 +f 1127/1135/1 7564/7572/1 7697/7705/1 12910/12918/1 +f 7564/7572/1 7563/7571/1 7698/7706/1 7697/7705/1 +f 2530/2538/1 7693/7701/1 7696/7704/1 2531/2539/1 +f 12911/12919/1 7700/7708/1 7693/7701/1 2530/2538/1 +f 7700/7708/1 7699/7707/1 7694/7702/1 7693/7701/1 +f 7686/7694/1 7689/7697/1 7692/7700/1 7687/7695/1 +f 16599/16607/1 1300/1308/1 7689/7697/1 7686/7694/1 +f 1300/1308/1 1299/1307/1 7690/7698/1 7689/7697/1 +f 7702/7710/1 7685/7693/1 7688/7696/1 7703/7711/1 +f 4311/4319/1 16600/16608/1 7685/7693/1 7702/7710/1 +f 16600/16608/1 16599/16607/1 7686/7694/1 7685/7693/1 +f 4266/4274/1 7681/7689/1 7684/7692/1 4267/4275/1 +f 7703/7711/1 7688/7696/1 7681/7689/1 4266/4274/1 +f 7688/7696/1 7687/7695/1 7682/7690/1 7681/7689/1 +f 7674/7682/1 7677/7685/1 7680/7688/1 7675/7683/1 +f 7659/7667/1 4280/4288/1 7677/7685/1 7674/7682/1 +f 4280/4288/1 4279/4287/1 7678/7686/1 7677/7685/1 +f 17254/17262/1 7673/7681/1 7676/7684/1 17255/17263/1 +f 4967/4975/1 7660/7668/1 7673/7681/1 17254/17262/1 +f 7660/7668/1 7659/7667/1 7674/7682/1 7673/7681/1 +f 1082/1090/1 7669/7677/1 7672/7680/1 1083/1091/1 +f 17255/17263/1 7676/7684/1 7669/7677/1 1082/1090/1 +f 7676/7684/1 7675/7683/1 7670/7678/1 7669/7677/1 +f 7662/7670/1 7665/7673/1 7668/7676/1 7663/7671/1 +f 7707/7715/1 4264/4272/1 7665/7673/1 7662/7670/1 +f 4264/4272/1 4263/4271/1 7666/7674/1 7665/7673/1 +f 5602/5610/1 7661/7669/1 7664/7672/1 5603/5611/1 +f 1895/1903/1 7708/7716/1 7661/7669/1 5602/5610/1 +f 7708/7716/1 7707/7715/1 7662/7670/1 7661/7669/1 +f 4966/4974/1 7657/7665/1 7660/7668/1 4967/4975/1 +f 5603/5611/1 7664/7672/1 7657/7665/1 4966/4974/1 +f 7664/7672/1 7663/7671/1 7658/7666/1 7657/7665/1 +f 7650/7658/1 7653/7661/1 7656/7664/1 7651/7659/1 +f 16551/16559/1 1316/1324/1 7653/7661/1 7650/7658/1 +f 1316/1324/1 1315/1323/1 7654/7662/1 7653/7661/1 +f 7666/7674/1 7649/7657/1 7652/7660/1 7667/7675/1 +f 4263/4271/1 16552/16560/1 7649/7657/1 7666/7674/1 +f 16552/16560/1 16551/16559/1 7650/7658/1 7649/7657/1 +f 4278/4286/1 7645/7653/1 7648/7656/1 4279/4287/1 +f 7667/7675/1 7652/7660/1 7645/7653/1 4278/4286/1 +f 7652/7660/1 7651/7659/1 7646/7654/1 7645/7653/1 +f 7638/7646/1 7641/7649/1 7644/7652/1 7639/7647/1 +f 7623/7631/1 4292/4300/1 7641/7649/1 7638/7646/1 +f 4292/4300/1 4291/4299/1 7642/7650/1 7641/7649/1 +f 16594/16602/1 7637/7645/1 7640/7648/1 16595/16603/1 +f 4307/4315/1 7624/7632/1 7637/7645/1 16594/16602/1 +f 7624/7632/1 7623/7631/1 7638/7646/1 7637/7645/1 +f 1302/1310/1 7633/7641/1 7636/7644/1 1303/1311/1 +f 16595/16603/1 7640/7648/1 7633/7641/1 1302/1310/1 +f 7640/7648/1 7639/7647/1 7634/7642/1 7633/7641/1 +f 7626/7634/1 7629/7637/1 7632/7640/1 7627/7635/1 +f 5727/5735/1 4924/4932/1 7629/7637/1 7626/7634/1 +f 4924/4932/1 4923/4931/1 7630/7638/1 7629/7637/1 +f 7582/7590/1 7625/7633/1 7628/7636/1 7583/7591/1 +f 1851/1859/1 5728/5736/1 7625/7633/1 7582/7590/1 +f 5728/5736/1 5727/5735/1 7626/7634/1 7625/7633/1 +f 4306/4314/1 7621/7629/1 7624/7632/1 4307/4315/1 +f 7583/7591/1 7628/7636/1 7621/7629/1 4306/4314/1 +f 7628/7636/1 7627/7635/1 7622/7630/1 7621/7629/1 +f 7614/7622/1 7617/7625/1 7620/7628/1 7615/7623/1 +f 17211/17219/1 1096/1104/1 7617/7625/1 7614/7622/1 +f 1096/1104/1 1095/1103/1 7618/7626/1 7617/7625/1 +f 7630/7638/1 7613/7621/1 7616/7624/1 7631/7639/1 +f 4923/4931/1 17212/17220/1 7613/7621/1 7630/7638/1 +f 17212/17220/1 17211/17219/1 7614/7622/1 7613/7621/1 +f 4290/4298/1 7609/7617/1 7612/7620/1 4291/4299/1 +f 7631/7639/1 7616/7624/1 7609/7617/1 4290/4298/1 +f 7616/7624/1 7615/7623/1 7610/7618/1 7609/7617/1 +f 7602/7610/1 7605/7613/1 7608/7616/1 7603/7611/1 +f 7587/7595/1 4304/4312/1 7605/7613/1 7602/7610/1 +f 4304/4312/1 4303/4311/1 7606/7614/1 7605/7613/1 +f 15214/15222/1 7601/7609/1 7604/7612/1 15215/15223/1 +f 2927/2935/1 7588/7596/1 7601/7609/1 15214/15222/1 +f 7588/7596/1 7587/7595/1 7602/7610/1 7601/7609/1 +f 1762/1770/1 7597/7605/1 7600/7608/1 1763/1771/1 +f 15215/15223/1 7604/7612/1 7597/7605/1 1762/1770/1 +f 7604/7612/1 7603/7611/1 7598/7606/1 7597/7605/1 +f 7590/7598/1 7593/7601/1 7596/7604/1 7591/7599/1 +f 12531/12539/1 2656/2664/1 7593/7601/1 7590/7598/1 +f 2656/2664/1 2655/2663/1 7594/7602/1 7593/7601/1 +f 11722/11730/1 7589/7597/1 7592/7600/1 11723/11731/1 +f 1087/1095/1 12532/12540/1 7589/7597/1 11722/11730/1 +f 12532/12540/1 12531/12539/1 7590/7598/1 7589/7597/1 +f 2926/2934/1 7585/7593/1 7588/7596/1 2927/2935/1 +f 11723/11731/1 7592/7600/1 7585/7593/1 2926/2934/1 +f 7592/7600/1 7591/7599/1 7586/7594/1 7585/7593/1 +f 7578/7586/1 7581/7589/1 7584/7592/1 7579/7587/1 +f 14943/14951/1 1852/1860/1 7581/7589/1 7578/7586/1 +f 1852/1860/1 1851/1859/1 7582/7590/1 7581/7589/1 +f 7594/7602/1 7577/7585/1 7580/7588/1 7595/7603/1 +f 2655/2663/1 14944/14952/1 7577/7585/1 7594/7602/1 +f 14944/14952/1 14943/14951/1 7578/7586/1 7577/7585/1 +f 4302/4310/1 7573/7581/1 7576/7584/1 4303/4311/1 +f 7595/7603/1 7580/7588/1 7573/7581/1 4302/4310/1 +f 7580/7588/1 7579/7587/1 7574/7582/1 7573/7581/1 +f 7566/7574/1 7569/7577/1 7572/7580/1 7567/7575/1 +f 7551/7559/1 4316/4324/1 7569/7577/1 7566/7574/1 +f 4316/4324/1 4315/4323/1 7570/7578/1 7569/7577/1 +f 17122/17130/1 7565/7573/1 7568/7576/1 17123/17131/1 +f 4835/4843/1 7552/7560/1 7565/7573/1 17122/17130/1 +f 7552/7560/1 7551/7559/1 7566/7574/1 7565/7573/1 +f 1126/1134/1 7561/7569/1 7564/7572/1 1127/1135/1 +f 17123/17131/1 7568/7576/1 7561/7569/1 1126/1134/1 +f 7568/7576/1 7567/7575/1 7562/7570/1 7561/7569/1 +f 7554/7562/1 7557/7565/1 7560/7568/1 7555/7563/1 +f 7599/7607/1 4300/4308/1 7557/7565/1 7554/7562/1 +f 4300/4308/1 4299/4307/1 7558/7566/1 7557/7565/1 +f 5998/6006/1 7553/7561/1 7556/7564/1 5999/6007/1 +f 1763/1771/1 7600/7608/1 7553/7561/1 5998/6006/1 +f 7600/7608/1 7599/7607/1 7554/7562/1 7553/7561/1 +f 4834/4842/1 7549/7557/1 7552/7560/1 4835/4843/1 +f 5999/6007/1 7556/7564/1 7549/7557/1 4834/4842/1 +f 7556/7564/1 7555/7563/1 7550/7558/1 7549/7557/1 +f 7542/7550/1 7545/7553/1 7548/7556/1 7543/7551/1 +f 16587/16595/1 1304/1312/1 7545/7553/1 7542/7550/1 +f 1304/1312/1 1303/1311/1 7546/7554/1 7545/7553/1 +f 7558/7566/1 7541/7549/1 7544/7552/1 7559/7567/1 +f 4299/4307/1 16588/16596/1 7541/7549/1 7558/7566/1 +f 16588/16596/1 16587/16595/1 7542/7550/1 7541/7549/1 +f 4314/4322/1 7537/7545/1 7540/7548/1 4315/4323/1 +f 7559/7567/1 7544/7552/1 7537/7545/1 4314/4322/1 +f 7544/7552/1 7543/7551/1 7538/7546/1 7537/7545/1 +f 7530/7538/1 7533/7541/1 7536/7544/1 7531/7539/1 +f 7515/7523/1 4328/4336/1 7533/7541/1 7530/7538/1 +f 4328/4336/1 4327/4335/1 7534/7542/1 7533/7541/1 +f 16630/16638/1 7529/7537/1 7532/7540/1 16631/16639/1 +f 4343/4351/1 7516/7524/1 7529/7537/1 16630/16638/1 +f 7516/7524/1 7515/7523/1 7530/7538/1 7529/7537/1 +f 1290/1298/1 7525/7533/1 7528/7536/1 1291/1299/1 +f 16631/16639/1 7532/7540/1 7525/7533/1 1290/1298/1 +f 7532/7540/1 7531/7539/1 7526/7534/1 7525/7533/1 +f 7518/7526/1 7521/7529/1 7524/7532/1 7519/7527/1 +f 5691/5699/1 4936/4944/1 7521/7529/1 7518/7526/1 +f 4936/4944/1 4935/4943/1 7522/7530/1 7521/7529/1 +f 7474/7482/1 7517/7525/1 7520/7528/1 7475/7483/1 +f 1863/1871/1 5692/5700/1 7517/7525/1 7474/7482/1 +f 5692/5700/1 5691/5699/1 7518/7526/1 7517/7525/1 +f 4342/4350/1 7513/7521/1 7516/7524/1 4343/4351/1 +f 7475/7483/1 7520/7528/1 7513/7521/1 4342/4350/1 +f 7520/7528/1 7519/7527/1 7514/7522/1 7513/7521/1 +f 7506/7514/1 7509/7517/1 7512/7520/1 7507/7515/1 +f 17223/17231/1 1092/1100/1 7509/7517/1 7506/7514/1 +f 1092/1100/1 1091/1099/1 7510/7518/1 7509/7517/1 +f 7522/7530/1 7505/7513/1 7508/7516/1 7523/7531/1 +f 4935/4943/1 17224/17232/1 7505/7513/1 7522/7530/1 +f 17224/17232/1 17223/17231/1 7506/7514/1 7505/7513/1 +f 4326/4334/1 7501/7509/1 7504/7512/1 4327/4335/1 +f 7523/7531/1 7508/7516/1 7501/7509/1 4326/4334/1 +f 7508/7516/1 7507/7515/1 7502/7510/1 7501/7509/1 +f 7494/7502/1 7497/7505/1 7500/7508/1 7495/7503/1 +f 7479/7487/1 4340/4348/1 7497/7505/1 7494/7502/1 +f 4340/4348/1 4339/4347/1 7498/7506/1 7497/7505/1 +f 16582/16590/1 7493/7501/1 7496/7504/1 16583/16591/1 +f 4295/4303/1 7480/7488/1 7493/7501/1 16582/16590/1 +f 7480/7488/1 7479/7487/1 7494/7502/1 7493/7501/1 +f 1306/1314/1 7489/7497/1 7492/7500/1 1307/1315/1 +f 16583/16591/1 7496/7504/1 7489/7497/1 1306/1314/1 +f 7496/7504/1 7495/7503/1 7490/7498/1 7489/7497/1 +f 7482/7490/1 7485/7493/1 7488/7496/1 7483/7491/1 +f 12639/12647/1 2620/2628/1 7485/7493/1 7482/7490/1 +f 2620/2628/1 2619/2627/1 7486/7494/1 7485/7493/1 +f 7618/7626/1 7481/7489/1 7484/7492/1 7619/7627/1 +f 1095/1103/1 12640/12648/1 7481/7489/1 7618/7626/1 +f 12640/12648/1 12639/12647/1 7482/7490/1 7481/7489/1 +f 4294/4302/1 7477/7485/1 7480/7488/1 4295/4303/1 +f 7619/7627/1 7484/7492/1 7477/7485/1 4294/4302/1 +f 7484/7492/1 7483/7491/1 7478/7486/1 7477/7485/1 +f 7470/7478/1 7473/7481/1 7476/7484/1 7471/7479/1 +f 14907/14915/1 1864/1872/1 7473/7481/1 7470/7478/1 +f 1864/1872/1 1863/1871/1 7474/7482/1 7473/7481/1 +f 7486/7494/1 7469/7477/1 7472/7480/1 7487/7495/1 +f 2619/2627/1 14908/14916/1 7469/7477/1 7486/7494/1 +f 14908/14916/1 14907/14915/1 7470/7478/1 7469/7477/1 +f 4338/4346/1 7465/7473/1 7468/7476/1 4339/4347/1 +f 7487/7495/1 7472/7480/1 7465/7473/1 4338/4346/1 +f 7472/7480/1 7471/7479/1 7466/7474/1 7465/7473/1 +f 7458/7466/1 7461/7469/1 7464/7472/1 7459/7467/1 +f 7443/7451/1 4352/4360/1 7461/7469/1 7458/7466/1 +f 4352/4360/1 4351/4359/1 7462/7470/1 7461/7469/1 +f 16666/16674/1 7457/7465/1 7460/7468/1 16667/16675/1 +f 4379/4387/1 7444/7452/1 7457/7465/1 16666/16674/1 +f 7444/7452/1 7443/7451/1 7458/7466/1 7457/7465/1 +f 1278/1286/1 7453/7461/1 7456/7464/1 1279/1287/1 +f 16667/16675/1 7460/7468/1 7453/7461/1 1278/1286/1 +f 7460/7468/1 7459/7467/1 7454/7462/1 7453/7461/1 +f 7446/7454/1 7449/7457/1 7452/7460/1 7447/7455/1 +f 7491/7499/1 4336/4344/1 7449/7457/1 7446/7454/1 +f 4336/4344/1 4335/4343/1 7450/7458/1 7449/7457/1 +f 7366/7374/1 7445/7453/1 7448/7456/1 7367/7375/1 +f 1307/1315/1 7492/7500/1 7445/7453/1 7366/7374/1 +f 7492/7500/1 7491/7499/1 7446/7454/1 7445/7453/1 +f 4378/4386/1 7441/7449/1 7444/7452/1 4379/4387/1 +f 7367/7375/1 7448/7456/1 7441/7449/1 4378/4386/1 +f 7448/7456/1 7447/7455/1 7442/7450/1 7441/7449/1 +f 7434/7442/1 7437/7445/1 7440/7448/1 7435/7443/1 +f 16623/16631/1 1292/1300/1 7437/7445/1 7434/7442/1 +f 1292/1300/1 1291/1299/1 7438/7446/1 7437/7445/1 +f 7450/7458/1 7433/7441/1 7436/7444/1 7451/7459/1 +f 4335/4343/1 16624/16632/1 7433/7441/1 7450/7458/1 +f 16624/16632/1 16623/16631/1 7434/7442/1 7433/7441/1 +f 4350/4358/1 7429/7437/1 7432/7440/1 4351/4359/1 +f 7451/7459/1 7436/7444/1 7429/7437/1 4350/4358/1 +f 7436/7444/1 7435/7443/1 7430/7438/1 7429/7437/1 +f 7422/7430/1 7425/7433/1 7428/7436/1 7423/7431/1 +f 7407/7415/1 4364/4372/1 7425/7433/1 7422/7430/1 +f 4364/4372/1 4363/4371/1 7426/7434/1 7425/7433/1 +f 16642/16650/1 7421/7429/1 7424/7432/1 16643/16651/1 +f 4355/4363/1 7408/7416/1 7421/7429/1 16642/16650/1 +f 7408/7416/1 7407/7415/1 7422/7430/1 7421/7429/1 +f 1286/1294/1 7417/7425/1 7420/7428/1 1287/1295/1 +f 16643/16651/1 7424/7432/1 7417/7425/1 1286/1294/1 +f 7424/7432/1 7423/7431/1 7418/7426/1 7417/7425/1 +f 7410/7418/1 7413/7421/1 7416/7424/1 7411/7419/1 +f 7527/7535/1 4324/4332/1 7413/7421/1 7410/7418/1 +f 4324/4332/1 4323/4331/1 7414/7422/1 7413/7421/1 +f 7438/7446/1 7409/7417/1 7412/7420/1 7439/7447/1 +f 1291/1299/1 7528/7536/1 7409/7417/1 7438/7446/1 +f 7528/7536/1 7527/7535/1 7410/7418/1 7409/7417/1 +f 4354/4362/1 7405/7413/1 7408/7416/1 4355/4363/1 +f 7439/7447/1 7412/7420/1 7405/7413/1 4354/4362/1 +f 7412/7420/1 7411/7419/1 7406/7414/1 7405/7413/1 +f 7398/7406/1 7401/7409/1 7404/7412/1 7399/7407/1 +f 16611/16619/1 1296/1304/1 7401/7409/1 7398/7406/1 +f 1296/1304/1 1295/1303/1 7402/7410/1 7401/7409/1 +f 7414/7422/1 7397/7405/1 7400/7408/1 7415/7423/1 +f 4323/4331/1 16612/16620/1 7397/7405/1 7414/7422/1 +f 16612/16620/1 16611/16619/1 7398/7406/1 7397/7405/1 +f 4362/4370/1 7393/7401/1 7396/7404/1 4363/4371/1 +f 7415/7423/1 7400/7408/1 7393/7401/1 4362/4370/1 +f 7400/7408/1 7399/7407/1 7394/7402/1 7393/7401/1 +f 7386/7394/1 7389/7397/1 7392/7400/1 7387/7395/1 +f 7371/7379/1 4376/4384/1 7389/7397/1 7386/7394/1 +f 4376/4384/1 4375/4383/1 7390/7398/1 7389/7397/1 +f 16606/16614/1 7385/7393/1 7388/7396/1 16607/16615/1 +f 4319/4327/1 7372/7380/1 7385/7393/1 16606/16614/1 +f 7372/7380/1 7371/7379/1 7386/7394/1 7385/7393/1 +f 1298/1306/1 7381/7389/1 7384/7392/1 1299/1307/1 +f 16607/16615/1 7388/7396/1 7381/7389/1 1298/1306/1 +f 7388/7396/1 7387/7395/1 7382/7390/1 7381/7389/1 +f 7374/7382/1 7377/7385/1 7380/7388/1 7375/7383/1 +f 7635/7643/1 4288/4296/1 7377/7385/1 7374/7382/1 +f 4288/4296/1 4287/4295/1 7378/7386/1 7377/7385/1 +f 7546/7554/1 7373/7381/1 7376/7384/1 7547/7555/1 +f 1303/1311/1 7636/7644/1 7373/7381/1 7546/7554/1 +f 7636/7644/1 7635/7643/1 7374/7382/1 7373/7381/1 +f 4318/4326/1 7369/7377/1 7372/7380/1 4319/4327/1 +f 7547/7555/1 7376/7384/1 7369/7377/1 4318/4326/1 +f 7376/7384/1 7375/7383/1 7370/7378/1 7369/7377/1 +f 7362/7370/1 7365/7373/1 7368/7376/1 7363/7371/1 +f 16575/16583/1 1308/1316/1 7365/7373/1 7362/7370/1 +f 1308/1316/1 1307/1315/1 7366/7374/1 7365/7373/1 +f 7378/7386/1 7361/7369/1 7364/7372/1 7379/7387/1 +f 4287/4295/1 16576/16584/1 7361/7369/1 7378/7386/1 +f 16576/16584/1 16575/16583/1 7362/7370/1 7361/7369/1 +f 4374/4382/1 7357/7365/1 7360/7368/1 4375/4383/1 +f 7379/7387/1 7364/7372/1 7357/7365/1 4374/4382/1 +f 7364/7372/1 7363/7371/1 7358/7366/1 7357/7365/1 +f 7350/7358/1 7353/7361/1 7356/7364/1 7351/7359/1 +f 7335/7343/1 4388/4396/1 7353/7361/1 7350/7358/1 +f 4388/4396/1 4387/4395/1 7354/7362/1 7353/7361/1 +f 16570/16578/1 7349/7357/1 7352/7360/1 16571/16579/1 +f 4283/4291/1 7336/7344/1 7349/7357/1 16570/16578/1 +f 7336/7344/1 7335/7343/1 7350/7358/1 7349/7357/1 +f 1310/1318/1 7345/7353/1 7348/7356/1 1311/1319/1 +f 16571/16579/1 7352/7360/1 7345/7353/1 1310/1318/1 +f 7352/7360/1 7351/7359/1 7346/7354/1 7345/7353/1 +f 7338/7346/1 7341/7349/1 7344/7352/1 7339/7347/1 +f 7743/7751/1 4252/4260/1 7341/7349/1 7338/7346/1 +f 4252/4260/1 4251/4259/1 7342/7350/1 7341/7349/1 +f 7654/7662/1 7337/7345/1 7340/7348/1 7655/7663/1 +f 1315/1323/1 7744/7752/1 7337/7345/1 7654/7662/1 +f 7744/7752/1 7743/7751/1 7338/7346/1 7337/7345/1 +f 4282/4290/1 7333/7341/1 7336/7344/1 4283/4291/1 +f 7655/7663/1 7340/7348/1 7333/7341/1 4282/4290/1 +f 7340/7348/1 7339/7347/1 7334/7342/1 7333/7341/1 +f 7326/7334/1 7329/7337/1 7332/7340/1 7327/7335/1 +f 16539/16547/1 1320/1328/1 7329/7337/1 7326/7334/1 +f 1320/1328/1 1319/1327/1 7330/7338/1 7329/7337/1 +f 7342/7350/1 7325/7333/1 7328/7336/1 7343/7351/1 +f 4251/4259/1 16540/16548/1 7325/7333/1 7342/7350/1 +f 16540/16548/1 16539/16547/1 7326/7334/1 7325/7333/1 +f 4386/4394/1 7321/7329/1 7324/7332/1 4387/4395/1 +f 7343/7351/1 7328/7336/1 7321/7329/1 4386/4394/1 +f 7328/7336/1 7327/7335/1 7322/7330/1 7321/7329/1 +f 7314/7322/1 7317/7325/1 7320/7328/1 7315/7323/1 +f 7299/7307/1 4400/4408/1 7317/7325/1 7314/7322/1 +f 4400/4408/1 4399/4407/1 7318/7326/1 7317/7325/1 +f 16534/16542/1 7313/7321/1 7316/7324/1 16535/16543/1 +f 4247/4255/1 7300/7308/1 7313/7321/1 16534/16542/1 +f 7300/7308/1 7299/7307/1 7314/7322/1 7313/7321/1 +f 1322/1330/1 7309/7317/1 7312/7320/1 1323/1331/1 +f 16535/16543/1 7316/7324/1 7309/7317/1 1322/1330/1 +f 7316/7324/1 7315/7323/1 7310/7318/1 7309/7317/1 +f 7302/7310/1 7305/7313/1 7308/7316/1 7303/7311/1 +f 7851/7859/1 4216/4224/1 7305/7313/1 7302/7310/1 +f 4216/4224/1 4215/4223/1 7306/7314/1 7305/7313/1 +f 7762/7770/1 7301/7309/1 7304/7312/1 7763/7771/1 +f 1327/1335/1 7852/7860/1 7301/7309/1 7762/7770/1 +f 7852/7860/1 7851/7859/1 7302/7310/1 7301/7309/1 +f 4246/4254/1 7297/7305/1 7300/7308/1 4247/4255/1 +f 7763/7771/1 7304/7312/1 7297/7305/1 4246/4254/1 +f 7304/7312/1 7303/7311/1 7298/7306/1 7297/7305/1 +f 7290/7298/1 7293/7301/1 7296/7304/1 7291/7299/1 +f 16503/16511/1 1332/1340/1 7293/7301/1 7290/7298/1 +f 1332/1340/1 1331/1339/1 7294/7302/1 7293/7301/1 +f 7306/7314/1 7289/7297/1 7292/7300/1 7307/7315/1 +f 4215/4223/1 16504/16512/1 7289/7297/1 7306/7314/1 +f 16504/16512/1 16503/16511/1 7290/7298/1 7289/7297/1 +f 4398/4406/1 7285/7293/1 7288/7296/1 4399/4407/1 +f 7307/7315/1 7292/7300/1 7285/7293/1 4398/4406/1 +f 7292/7300/1 7291/7299/1 7286/7294/1 7285/7293/1 +f 7278/7286/1 7281/7289/1 7284/7292/1 7279/7287/1 +f 7263/7271/1 4412/4420/1 7281/7289/1 7278/7286/1 +f 4412/4420/1 4411/4419/1 7282/7290/1 7281/7289/1 +f 16498/16506/1 7277/7285/1 7280/7288/1 16499/16507/1 +f 4211/4219/1 7264/7272/1 7277/7285/1 16498/16506/1 +f 7264/7272/1 7263/7271/1 7278/7286/1 7277/7285/1 +f 1334/1342/1 7273/7281/1 7276/7284/1 1335/1343/1 +f 16499/16507/1 7280/7288/1 7273/7281/1 1334/1342/1 +f 7280/7288/1 7279/7287/1 7274/7282/1 7273/7281/1 +f 7266/7274/1 7269/7277/1 7272/7280/1 7267/7275/1 +f 7959/7967/1 4180/4188/1 7269/7277/1 7266/7274/1 +f 4180/4188/1 4179/4187/1 7270/7278/1 7269/7277/1 +f 7870/7878/1 7265/7273/1 7268/7276/1 7871/7879/1 +f 1339/1347/1 7960/7968/1 7265/7273/1 7870/7878/1 +f 7960/7968/1 7959/7967/1 7266/7274/1 7265/7273/1 +f 4210/4218/1 7261/7269/1 7264/7272/1 4211/4219/1 +f 7871/7879/1 7268/7276/1 7261/7269/1 4210/4218/1 +f 7268/7276/1 7267/7275/1 7262/7270/1 7261/7269/1 +f 7254/7262/1 7257/7265/1 7260/7268/1 7255/7263/1 +f 16467/16475/1 1344/1352/1 7257/7265/1 7254/7262/1 +f 1344/1352/1 1343/1351/1 7258/7266/1 7257/7265/1 +f 7270/7278/1 7253/7261/1 7256/7264/1 7271/7279/1 +f 4179/4187/1 16468/16476/1 7253/7261/1 7270/7278/1 +f 16468/16476/1 16467/16475/1 7254/7262/1 7253/7261/1 +f 4410/4418/1 7249/7257/1 7252/7260/1 4411/4419/1 +f 7271/7279/1 7256/7264/1 7249/7257/1 4410/4418/1 +f 7256/7264/1 7255/7263/1 7250/7258/1 7249/7257/1 +f 7242/7250/1 7245/7253/1 7248/7256/1 7243/7251/1 +f 7227/7235/1 4424/4432/1 7245/7253/1 7242/7250/1 +f 4424/4432/1 4423/4431/1 7246/7254/1 7245/7253/1 +f 16462/16470/1 7241/7249/1 7244/7252/1 16463/16471/1 +f 4175/4183/1 7228/7236/1 7241/7249/1 16462/16470/1 +f 7228/7236/1 7227/7235/1 7242/7250/1 7241/7249/1 +f 1346/1354/1 7237/7245/1 7240/7248/1 1347/1355/1 +f 16463/16471/1 7244/7252/1 7237/7245/1 1346/1354/1 +f 7244/7252/1 7243/7251/1 7238/7246/1 7237/7245/1 +f 7230/7238/1 7233/7241/1 7236/7244/1 7231/7239/1 +f 8067/8075/1 4144/4152/1 7233/7241/1 7230/7238/1 +f 4144/4152/1 4143/4151/1 7234/7242/1 7233/7241/1 +f 7978/7986/1 7229/7237/1 7232/7240/1 7979/7987/1 +f 1351/1359/1 8068/8076/1 7229/7237/1 7978/7986/1 +f 8068/8076/1 8067/8075/1 7230/7238/1 7229/7237/1 +f 4174/4182/1 7225/7233/1 7228/7236/1 4175/4183/1 +f 7979/7987/1 7232/7240/1 7225/7233/1 4174/4182/1 +f 7232/7240/1 7231/7239/1 7226/7234/1 7225/7233/1 +f 7218/7226/1 7221/7229/1 7224/7232/1 7219/7227/1 +f 16431/16439/1 1356/1364/1 7221/7229/1 7218/7226/1 +f 1356/1364/1 1355/1363/1 7222/7230/1 7221/7229/1 +f 7234/7242/1 7217/7225/1 7220/7228/1 7235/7243/1 +f 4143/4151/1 16432/16440/1 7217/7225/1 7234/7242/1 +f 16432/16440/1 16431/16439/1 7218/7226/1 7217/7225/1 +f 4422/4430/1 7213/7221/1 7216/7224/1 4423/4431/1 +f 7235/7243/1 7220/7228/1 7213/7221/1 4422/4430/1 +f 7220/7228/1 7219/7227/1 7214/7222/1 7213/7221/1 +f 7206/7214/1 7209/7217/1 7212/7220/1 7207/7215/1 +f 7191/7199/1 4436/4444/1 7209/7217/1 7206/7214/1 +f 4436/4444/1 4435/4443/1 7210/7218/1 7209/7217/1 +f 16426/16434/1 7205/7213/1 7208/7216/1 16427/16435/1 +f 4139/4147/1 7192/7200/1 7205/7213/1 16426/16434/1 +f 7192/7200/1 7191/7199/1 7206/7214/1 7205/7213/1 +f 1358/1366/1 7201/7209/1 7204/7212/1 1359/1367/1 +f 16427/16435/1 7208/7216/1 7201/7209/1 1358/1366/1 +f 7208/7216/1 7207/7215/1 7202/7210/1 7201/7209/1 +f 7194/7202/1 7197/7205/1 7200/7208/1 7195/7203/1 +f 8175/8183/1 4108/4116/1 7197/7205/1 7194/7202/1 +f 4108/4116/1 4107/4115/1 7198/7206/1 7197/7205/1 +f 8086/8094/1 7193/7201/1 7196/7204/1 8087/8095/1 +f 1363/1371/1 8176/8184/1 7193/7201/1 8086/8094/1 +f 8176/8184/1 8175/8183/1 7194/7202/1 7193/7201/1 +f 4138/4146/1 7189/7197/1 7192/7200/1 4139/4147/1 +f 8087/8095/1 7196/7204/1 7189/7197/1 4138/4146/1 +f 7196/7204/1 7195/7203/1 7190/7198/1 7189/7197/1 +f 7182/7190/1 7185/7193/1 7188/7196/1 7183/7191/1 +f 16395/16403/1 1368/1376/1 7185/7193/1 7182/7190/1 +f 1368/1376/1 1367/1375/1 7186/7194/1 7185/7193/1 +f 7198/7206/1 7181/7189/1 7184/7192/1 7199/7207/1 +f 4107/4115/1 16396/16404/1 7181/7189/1 7198/7206/1 +f 16396/16404/1 16395/16403/1 7182/7190/1 7181/7189/1 +f 4434/4442/1 7177/7185/1 7180/7188/1 4435/4443/1 +f 7199/7207/1 7184/7192/1 7177/7185/1 4434/4442/1 +f 7184/7192/1 7183/7191/1 7178/7186/1 7177/7185/1 +f 7170/7178/1 7173/7181/1 7176/7184/1 7171/7179/1 +f 7155/7163/1 4448/4456/1 7173/7181/1 7170/7178/1 +f 4448/4456/1 4447/4455/1 7174/7182/1 7173/7181/1 +f 16390/16398/1 7169/7177/1 7172/7180/1 16391/16399/1 +f 4103/4111/1 7156/7164/1 7169/7177/1 16390/16398/1 +f 7156/7164/1 7155/7163/1 7170/7178/1 7169/7177/1 +f 1370/1378/1 7165/7173/1 7168/7176/1 1371/1379/1 +f 16391/16399/1 7172/7180/1 7165/7173/1 1370/1378/1 +f 7172/7180/1 7171/7179/1 7166/7174/1 7165/7173/1 +f 7158/7166/1 7161/7169/1 7164/7172/1 7159/7167/1 +f 8283/8291/1 4072/4080/1 7161/7169/1 7158/7166/1 +f 4072/4080/1 4071/4079/1 7162/7170/1 7161/7169/1 +f 8194/8202/1 7157/7165/1 7160/7168/1 8195/8203/1 +f 1375/1383/1 8284/8292/1 7157/7165/1 8194/8202/1 +f 8284/8292/1 8283/8291/1 7158/7166/1 7157/7165/1 +f 4102/4110/1 7153/7161/1 7156/7164/1 4103/4111/1 +f 8195/8203/1 7160/7168/1 7153/7161/1 4102/4110/1 +f 7160/7168/1 7159/7167/1 7154/7162/1 7153/7161/1 +f 7146/7154/1 7149/7157/1 7152/7160/1 7147/7155/1 +f 16359/16367/1 1380/1388/1 7149/7157/1 7146/7154/1 +f 1380/1388/1 1379/1387/1 7150/7158/1 7149/7157/1 +f 7162/7170/1 7145/7153/1 7148/7156/1 7163/7171/1 +f 4071/4079/1 16360/16368/1 7145/7153/1 7162/7170/1 +f 16360/16368/1 16359/16367/1 7146/7154/1 7145/7153/1 +f 4446/4454/1 7141/7149/1 7144/7152/1 4447/4455/1 +f 7163/7171/1 7148/7156/1 7141/7149/1 4446/4454/1 +f 7148/7156/1 7147/7155/1 7142/7150/1 7141/7149/1 +f 7134/7142/1 7137/7145/1 7140/7148/1 7135/7143/1 +f 7119/7127/1 4460/4468/1 7137/7145/1 7134/7142/1 +f 4460/4468/1 4459/4467/1 7138/7146/1 7137/7145/1 +f 16354/16362/1 7133/7141/1 7136/7144/1 16355/16363/1 +f 4067/4075/1 7120/7128/1 7133/7141/1 16354/16362/1 +f 7120/7128/1 7119/7127/1 7134/7142/1 7133/7141/1 +f 1382/1390/1 7129/7137/1 7132/7140/1 1383/1391/1 +f 16355/16363/1 7136/7144/1 7129/7137/1 1382/1390/1 +f 7136/7144/1 7135/7143/1 7130/7138/1 7129/7137/1 +f 7122/7130/1 7125/7133/1 7128/7136/1 7123/7131/1 +f 8391/8399/1 4036/4044/1 7125/7133/1 7122/7130/1 +f 4036/4044/1 4035/4043/1 7126/7134/1 7125/7133/1 +f 8302/8310/1 7121/7129/1 7124/7132/1 8303/8311/1 +f 1387/1395/1 8392/8400/1 7121/7129/1 8302/8310/1 +f 8392/8400/1 8391/8399/1 7122/7130/1 7121/7129/1 +f 4066/4074/1 7117/7125/1 7120/7128/1 4067/4075/1 +f 8303/8311/1 7124/7132/1 7117/7125/1 4066/4074/1 +f 7124/7132/1 7123/7131/1 7118/7126/1 7117/7125/1 +f 7110/7118/1 7113/7121/1 7116/7124/1 7111/7119/1 +f 16323/16331/1 1392/1400/1 7113/7121/1 7110/7118/1 +f 1392/1400/1 1391/1399/1 7114/7122/1 7113/7121/1 +f 7126/7134/1 7109/7117/1 7112/7120/1 7127/7135/1 +f 4035/4043/1 16324/16332/1 7109/7117/1 7126/7134/1 +f 16324/16332/1 16323/16331/1 7110/7118/1 7109/7117/1 +f 4458/4466/1 7105/7113/1 7108/7116/1 4459/4467/1 +f 7127/7135/1 7112/7120/1 7105/7113/1 4458/4466/1 +f 7112/7120/1 7111/7119/1 7106/7114/1 7105/7113/1 +f 7098/7106/1 7101/7109/1 7104/7112/1 7099/7107/1 +f 7083/7091/1 4472/4480/1 7101/7109/1 7098/7106/1 +f 4472/4480/1 4471/4479/1 7102/7110/1 7101/7109/1 +f 16318/16326/1 7097/7105/1 7100/7108/1 16319/16327/1 +f 4031/4039/1 7084/7092/1 7097/7105/1 16318/16326/1 +f 7084/7092/1 7083/7091/1 7098/7106/1 7097/7105/1 +f 1394/1402/1 7093/7101/1 7096/7104/1 1395/1403/1 +f 16319/16327/1 7100/7108/1 7093/7101/1 1394/1402/1 +f 7100/7108/1 7099/7107/1 7094/7102/1 7093/7101/1 +f 7086/7094/1 7089/7097/1 7092/7100/1 7087/7095/1 +f 8499/8507/1 4000/4008/1 7089/7097/1 7086/7094/1 +f 4000/4008/1 3999/4007/1 7090/7098/1 7089/7097/1 +f 8410/8418/1 7085/7093/1 7088/7096/1 8411/8419/1 +f 1399/1407/1 8500/8508/1 7085/7093/1 8410/8418/1 +f 8500/8508/1 8499/8507/1 7086/7094/1 7085/7093/1 +f 4030/4038/1 7081/7089/1 7084/7092/1 4031/4039/1 +f 8411/8419/1 7088/7096/1 7081/7089/1 4030/4038/1 +f 7088/7096/1 7087/7095/1 7082/7090/1 7081/7089/1 +f 7074/7082/1 7077/7085/1 7080/7088/1 7075/7083/1 +f 16287/16295/1 1404/1412/1 7077/7085/1 7074/7082/1 +f 1404/1412/1 1403/1411/1 7078/7086/1 7077/7085/1 +f 7090/7098/1 7073/7081/1 7076/7084/1 7091/7099/1 +f 3999/4007/1 16288/16296/1 7073/7081/1 7090/7098/1 +f 16288/16296/1 16287/16295/1 7074/7082/1 7073/7081/1 +f 4470/4478/1 7069/7077/1 7072/7080/1 4471/4479/1 +f 7091/7099/1 7076/7084/1 7069/7077/1 4470/4478/1 +f 7076/7084/1 7075/7083/1 7070/7078/1 7069/7077/1 +f 7062/7070/1 7065/7073/1 7068/7076/1 7063/7071/1 +f 7047/7055/1 4484/4492/1 7065/7073/1 7062/7070/1 +f 4484/4492/1 4483/4491/1 7066/7074/1 7065/7073/1 +f 16282/16290/1 7061/7069/1 7064/7072/1 16283/16291/1 +f 3995/4003/1 7048/7056/1 7061/7069/1 16282/16290/1 +f 7048/7056/1 7047/7055/1 7062/7070/1 7061/7069/1 +f 1406/1414/1 7057/7065/1 7060/7068/1 1407/1415/1 +f 16283/16291/1 7064/7072/1 7057/7065/1 1406/1414/1 +f 7064/7072/1 7063/7071/1 7058/7066/1 7057/7065/1 +f 7050/7058/1 7053/7061/1 7056/7064/1 7051/7059/1 +f 8607/8615/1 3964/3972/1 7053/7061/1 7050/7058/1 +f 3964/3972/1 3963/3971/1 7054/7062/1 7053/7061/1 +f 8518/8526/1 7049/7057/1 7052/7060/1 8519/8527/1 +f 1411/1419/1 8608/8616/1 7049/7057/1 8518/8526/1 +f 8608/8616/1 8607/8615/1 7050/7058/1 7049/7057/1 +f 3994/4002/1 7045/7053/1 7048/7056/1 3995/4003/1 +f 8519/8527/1 7052/7060/1 7045/7053/1 3994/4002/1 +f 7052/7060/1 7051/7059/1 7046/7054/1 7045/7053/1 +f 7038/7046/1 7041/7049/1 7044/7052/1 7039/7047/1 +f 16251/16259/1 1416/1424/1 7041/7049/1 7038/7046/1 +f 1416/1424/1 1415/1423/1 7042/7050/1 7041/7049/1 +f 7054/7062/1 7037/7045/1 7040/7048/1 7055/7063/1 +f 3963/3971/1 16252/16260/1 7037/7045/1 7054/7062/1 +f 16252/16260/1 16251/16259/1 7038/7046/1 7037/7045/1 +f 4482/4490/1 7033/7041/1 7036/7044/1 4483/4491/1 +f 7055/7063/1 7040/7048/1 7033/7041/1 4482/4490/1 +f 7040/7048/1 7039/7047/1 7034/7042/1 7033/7041/1 +f 7026/7034/1 7029/7037/1 7032/7040/1 7027/7035/1 +f 7011/7019/1 4496/4504/1 7029/7037/1 7026/7034/1 +f 4496/4504/1 4495/4503/1 7030/7038/1 7029/7037/1 +f 16246/16254/1 7025/7033/1 7028/7036/1 16247/16255/1 +f 3959/3967/1 7012/7020/1 7025/7033/1 16246/16254/1 +f 7012/7020/1 7011/7019/1 7026/7034/1 7025/7033/1 +f 1418/1426/1 7021/7029/1 7024/7032/1 1419/1427/1 +f 16247/16255/1 7028/7036/1 7021/7029/1 1418/1426/1 +f 7028/7036/1 7027/7035/1 7022/7030/1 7021/7029/1 +f 7014/7022/1 7017/7025/1 7020/7028/1 7015/7023/1 +f 8715/8723/1 3928/3936/1 7017/7025/1 7014/7022/1 +f 3928/3936/1 3927/3935/1 7018/7026/1 7017/7025/1 +f 8626/8634/1 7013/7021/1 7016/7024/1 8627/8635/1 +f 1423/1431/1 8716/8724/1 7013/7021/1 8626/8634/1 +f 8716/8724/1 8715/8723/1 7014/7022/1 7013/7021/1 +f 3958/3966/1 7009/7017/1 7012/7020/1 3959/3967/1 +f 8627/8635/1 7016/7024/1 7009/7017/1 3958/3966/1 +f 7016/7024/1 7015/7023/1 7010/7018/1 7009/7017/1 +f 7002/7010/1 7005/7013/1 7008/7016/1 7003/7011/1 +f 16215/16223/1 1428/1436/1 7005/7013/1 7002/7010/1 +f 1428/1436/1 1427/1435/1 7006/7014/1 7005/7013/1 +f 7018/7026/1 7001/7009/1 7004/7012/1 7019/7027/1 +f 3927/3935/1 16216/16224/1 7001/7009/1 7018/7026/1 +f 16216/16224/1 16215/16223/1 7002/7010/1 7001/7009/1 +f 4494/4502/1 6997/7005/1 7000/7008/1 4495/4503/1 +f 7019/7027/1 7004/7012/1 6997/7005/1 4494/4502/1 +f 7004/7012/1 7003/7011/1 6998/7006/1 6997/7005/1 +f 6990/6998/1 6993/7001/1 6996/7004/1 6991/6999/1 +f 6975/6983/1 4508/4516/1 6993/7001/1 6990/6998/1 +f 4508/4516/1 4507/4515/1 6994/7002/1 6993/7001/1 +f 16210/16218/1 6989/6997/1 6992/7000/1 16211/16219/1 +f 3923/3931/1 6976/6984/1 6989/6997/1 16210/16218/1 +f 6976/6984/1 6975/6983/1 6990/6998/1 6989/6997/1 +f 1430/1438/1 6985/6993/1 6988/6996/1 1431/1439/1 +f 16211/16219/1 6992/7000/1 6985/6993/1 1430/1438/1 +f 6992/7000/1 6991/6999/1 6986/6994/1 6985/6993/1 +f 6978/6986/1 6981/6989/1 6984/6992/1 6979/6987/1 +f 8823/8831/1 3892/3900/1 6981/6989/1 6978/6986/1 +f 3892/3900/1 3891/3899/1 6982/6990/1 6981/6989/1 +f 8734/8742/1 6977/6985/1 6980/6988/1 8735/8743/1 +f 1435/1443/1 8824/8832/1 6977/6985/1 8734/8742/1 +f 8824/8832/1 8823/8831/1 6978/6986/1 6977/6985/1 +f 3922/3930/1 6973/6981/1 6976/6984/1 3923/3931/1 +f 8735/8743/1 6980/6988/1 6973/6981/1 3922/3930/1 +f 6980/6988/1 6979/6987/1 6974/6982/1 6973/6981/1 +f 6966/6974/1 6969/6977/1 6972/6980/1 6967/6975/1 +f 16179/16187/1 1440/1448/1 6969/6977/1 6966/6974/1 +f 1440/1448/1 1439/1447/1 6970/6978/1 6969/6977/1 +f 6982/6990/1 6965/6973/1 6968/6976/1 6983/6991/1 +f 3891/3899/1 16180/16188/1 6965/6973/1 6982/6990/1 +f 16180/16188/1 16179/16187/1 6966/6974/1 6965/6973/1 +f 4506/4514/1 6961/6969/1 6964/6972/1 4507/4515/1 +f 6983/6991/1 6968/6976/1 6961/6969/1 4506/4514/1 +f 6968/6976/1 6967/6975/1 6962/6970/1 6961/6969/1 +f 6954/6962/1 6957/6965/1 6960/6968/1 6955/6963/1 +f 6939/6947/1 4520/4528/1 6957/6965/1 6954/6962/1 +f 4520/4528/1 4519/4527/1 6958/6966/1 6957/6965/1 +f 16174/16182/1 6953/6961/1 6956/6964/1 16175/16183/1 +f 3887/3895/1 6940/6948/1 6953/6961/1 16174/16182/1 +f 6940/6948/1 6939/6947/1 6954/6962/1 6953/6961/1 +f 1442/1450/1 6949/6957/1 6952/6960/1 1443/1451/1 +f 16175/16183/1 6956/6964/1 6949/6957/1 1442/1450/1 +f 6956/6964/1 6955/6963/1 6950/6958/1 6949/6957/1 +f 6942/6950/1 6945/6953/1 6948/6956/1 6943/6951/1 +f 8931/8939/1 3856/3864/1 6945/6953/1 6942/6950/1 +f 3856/3864/1 3855/3863/1 6946/6954/1 6945/6953/1 +f 8842/8850/1 6941/6949/1 6944/6952/1 8843/8851/1 +f 1447/1455/1 8932/8940/1 6941/6949/1 8842/8850/1 +f 8932/8940/1 8931/8939/1 6942/6950/1 6941/6949/1 +f 3886/3894/1 6937/6945/1 6940/6948/1 3887/3895/1 +f 8843/8851/1 6944/6952/1 6937/6945/1 3886/3894/1 +f 6944/6952/1 6943/6951/1 6938/6946/1 6937/6945/1 +f 6930/6938/1 6933/6941/1 6936/6944/1 6931/6939/1 +f 16143/16151/1 1452/1460/1 6933/6941/1 6930/6938/1 +f 1452/1460/1 1451/1459/1 6934/6942/1 6933/6941/1 +f 6946/6954/1 6929/6937/1 6932/6940/1 6947/6955/1 +f 3855/3863/1 16144/16152/1 6929/6937/1 6946/6954/1 +f 16144/16152/1 16143/16151/1 6930/6938/1 6929/6937/1 +f 4518/4526/1 6925/6933/1 6928/6936/1 4519/4527/1 +f 6947/6955/1 6932/6940/1 6925/6933/1 4518/4526/1 +f 6932/6940/1 6931/6939/1 6926/6934/1 6925/6933/1 +f 6918/6926/1 6921/6929/1 6924/6932/1 6919/6927/1 +f 6903/6911/1 4532/4540/1 6921/6929/1 6918/6926/1 +f 4532/4540/1 4531/4539/1 6922/6930/1 6921/6929/1 +f 16138/16146/1 6917/6925/1 6920/6928/1 16139/16147/1 +f 3851/3859/1 6904/6912/1 6917/6925/1 16138/16146/1 +f 6904/6912/1 6903/6911/1 6918/6926/1 6917/6925/1 +f 1454/1462/1 6913/6921/1 6916/6924/1 1455/1463/1 +f 16139/16147/1 6920/6928/1 6913/6921/1 1454/1462/1 +f 6920/6928/1 6919/6927/1 6914/6922/1 6913/6921/1 +f 6906/6914/1 6909/6917/1 6912/6920/1 6907/6915/1 +f 9039/9047/1 3820/3828/1 6909/6917/1 6906/6914/1 +f 3820/3828/1 3819/3827/1 6910/6918/1 6909/6917/1 +f 8950/8958/1 6905/6913/1 6908/6916/1 8951/8959/1 +f 1459/1467/1 9040/9048/1 6905/6913/1 8950/8958/1 +f 9040/9048/1 9039/9047/1 6906/6914/1 6905/6913/1 +f 3850/3858/1 6901/6909/1 6904/6912/1 3851/3859/1 +f 8951/8959/1 6908/6916/1 6901/6909/1 3850/3858/1 +f 6908/6916/1 6907/6915/1 6902/6910/1 6901/6909/1 +f 6894/6902/1 6897/6905/1 6900/6908/1 6895/6903/1 +f 16107/16115/1 1464/1472/1 6897/6905/1 6894/6902/1 +f 1464/1472/1 1463/1471/1 6898/6906/1 6897/6905/1 +f 6910/6918/1 6893/6901/1 6896/6904/1 6911/6919/1 +f 3819/3827/1 16108/16116/1 6893/6901/1 6910/6918/1 +f 16108/16116/1 16107/16115/1 6894/6902/1 6893/6901/1 +f 4530/4538/1 6889/6897/1 6892/6900/1 4531/4539/1 +f 6911/6919/1 6896/6904/1 6889/6897/1 4530/4538/1 +f 6896/6904/1 6895/6903/1 6890/6898/1 6889/6897/1 +f 6882/6890/1 6885/6893/1 6888/6896/1 6883/6891/1 +f 6867/6875/1 4544/4552/1 6885/6893/1 6882/6890/1 +f 4544/4552/1 4543/4551/1 6886/6894/1 6885/6893/1 +f 16102/16110/1 6881/6889/1 6884/6892/1 16103/16111/1 +f 3815/3823/1 6868/6876/1 6881/6889/1 16102/16110/1 +f 6868/6876/1 6867/6875/1 6882/6890/1 6881/6889/1 +f 1466/1474/1 6877/6885/1 6880/6888/1 1467/1475/1 +f 16103/16111/1 6884/6892/1 6877/6885/1 1466/1474/1 +f 6884/6892/1 6883/6891/1 6878/6886/1 6877/6885/1 +f 6870/6878/1 6873/6881/1 6876/6884/1 6871/6879/1 +f 9147/9155/1 3784/3792/1 6873/6881/1 6870/6878/1 +f 3784/3792/1 3783/3791/1 6874/6882/1 6873/6881/1 +f 9058/9066/1 6869/6877/1 6872/6880/1 9059/9067/1 +f 1471/1479/1 9148/9156/1 6869/6877/1 9058/9066/1 +f 9148/9156/1 9147/9155/1 6870/6878/1 6869/6877/1 +f 3814/3822/1 6865/6873/1 6868/6876/1 3815/3823/1 +f 9059/9067/1 6872/6880/1 6865/6873/1 3814/3822/1 +f 6872/6880/1 6871/6879/1 6866/6874/1 6865/6873/1 +f 6858/6866/1 6861/6869/1 6864/6872/1 6859/6867/1 +f 16071/16079/1 1476/1484/1 6861/6869/1 6858/6866/1 +f 1476/1484/1 1475/1483/1 6862/6870/1 6861/6869/1 +f 6874/6882/1 6857/6865/1 6860/6868/1 6875/6883/1 +f 3783/3791/1 16072/16080/1 6857/6865/1 6874/6882/1 +f 16072/16080/1 16071/16079/1 6858/6866/1 6857/6865/1 +f 4542/4550/1 6853/6861/1 6856/6864/1 4543/4551/1 +f 6875/6883/1 6860/6868/1 6853/6861/1 4542/4550/1 +f 6860/6868/1 6859/6867/1 6854/6862/1 6853/6861/1 +f 6846/6854/1 6849/6857/1 6852/6860/1 6847/6855/1 +f 6831/6839/1 4556/4564/1 6849/6857/1 6846/6854/1 +f 4556/4564/1 4555/4563/1 6850/6858/1 6849/6857/1 +f 16066/16074/1 6845/6853/1 6848/6856/1 16067/16075/1 +f 3779/3787/1 6832/6840/1 6845/6853/1 16066/16074/1 +f 6832/6840/1 6831/6839/1 6846/6854/1 6845/6853/1 +f 1478/1486/1 6841/6849/1 6844/6852/1 1479/1487/1 +f 16067/16075/1 6848/6856/1 6841/6849/1 1478/1486/1 +f 6848/6856/1 6847/6855/1 6842/6850/1 6841/6849/1 +f 6834/6842/1 6837/6845/1 6840/6848/1 6835/6843/1 +f 9255/9263/1 3748/3756/1 6837/6845/1 6834/6842/1 +f 3748/3756/1 3747/3755/1 6838/6846/1 6837/6845/1 +f 9166/9174/1 6833/6841/1 6836/6844/1 9167/9175/1 +f 1483/1491/1 9256/9264/1 6833/6841/1 9166/9174/1 +f 9256/9264/1 9255/9263/1 6834/6842/1 6833/6841/1 +f 3778/3786/1 6829/6837/1 6832/6840/1 3779/3787/1 +f 9167/9175/1 6836/6844/1 6829/6837/1 3778/3786/1 +f 6836/6844/1 6835/6843/1 6830/6838/1 6829/6837/1 +f 6822/6830/1 6825/6833/1 6828/6836/1 6823/6831/1 +f 16035/16043/1 1488/1496/1 6825/6833/1 6822/6830/1 +f 1488/1496/1 1487/1495/1 6826/6834/1 6825/6833/1 +f 6838/6846/1 6821/6829/1 6824/6832/1 6839/6847/1 +f 3747/3755/1 16036/16044/1 6821/6829/1 6838/6846/1 +f 16036/16044/1 16035/16043/1 6822/6830/1 6821/6829/1 +f 4554/4562/1 6817/6825/1 6820/6828/1 4555/4563/1 +f 6839/6847/1 6824/6832/1 6817/6825/1 4554/4562/1 +f 6824/6832/1 6823/6831/1 6818/6826/1 6817/6825/1 +f 6810/6818/1 6813/6821/1 6816/6824/1 6811/6819/1 +f 6795/6803/1 4568/4576/1 6813/6821/1 6810/6818/1 +f 4568/4576/1 4567/4575/1 6814/6822/1 6813/6821/1 +f 16030/16038/1 6809/6817/1 6812/6820/1 16031/16039/1 +f 3743/3751/1 6796/6804/1 6809/6817/1 16030/16038/1 +f 6796/6804/1 6795/6803/1 6810/6818/1 6809/6817/1 +f 1490/1498/1 6805/6813/1 6808/6816/1 1491/1499/1 +f 16031/16039/1 6812/6820/1 6805/6813/1 1490/1498/1 +f 6812/6820/1 6811/6819/1 6806/6814/1 6805/6813/1 +f 6798/6806/1 6801/6809/1 6804/6812/1 6799/6807/1 +f 9363/9371/1 3712/3720/1 6801/6809/1 6798/6806/1 +f 3712/3720/1 3711/3719/1 6802/6810/1 6801/6809/1 +f 9274/9282/1 6797/6805/1 6800/6808/1 9275/9283/1 +f 1495/1503/1 9364/9372/1 6797/6805/1 9274/9282/1 +f 9364/9372/1 9363/9371/1 6798/6806/1 6797/6805/1 +f 3742/3750/1 6793/6801/1 6796/6804/1 3743/3751/1 +f 9275/9283/1 6800/6808/1 6793/6801/1 3742/3750/1 +f 6800/6808/1 6799/6807/1 6794/6802/1 6793/6801/1 +f 6786/6794/1 6789/6797/1 6792/6800/1 6787/6795/1 +f 15999/16007/1 1500/1508/1 6789/6797/1 6786/6794/1 +f 1500/1508/1 1499/1507/1 6790/6798/1 6789/6797/1 +f 6802/6810/1 6785/6793/1 6788/6796/1 6803/6811/1 +f 3711/3719/1 16000/16008/1 6785/6793/1 6802/6810/1 +f 16000/16008/1 15999/16007/1 6786/6794/1 6785/6793/1 +f 4566/4574/1 6781/6789/1 6784/6792/1 4567/4575/1 +f 6803/6811/1 6788/6796/1 6781/6789/1 4566/4574/1 +f 6788/6796/1 6787/6795/1 6782/6790/1 6781/6789/1 +f 6774/6782/1 6777/6785/1 6780/6788/1 6775/6783/1 +f 6759/6767/1 4580/4588/1 6777/6785/1 6774/6782/1 +f 4580/4588/1 4579/4587/1 6778/6786/1 6777/6785/1 +f 15994/16002/1 6773/6781/1 6776/6784/1 15995/16003/1 +f 3707/3715/1 6760/6768/1 6773/6781/1 15994/16002/1 +f 6760/6768/1 6759/6767/1 6774/6782/1 6773/6781/1 +f 1502/1510/1 6769/6777/1 6772/6780/1 1503/1511/1 +f 15995/16003/1 6776/6784/1 6769/6777/1 1502/1510/1 +f 6776/6784/1 6775/6783/1 6770/6778/1 6769/6777/1 +f 6762/6770/1 6765/6773/1 6768/6776/1 6763/6771/1 +f 9471/9479/1 3676/3684/1 6765/6773/1 6762/6770/1 +f 3676/3684/1 3675/3683/1 6766/6774/1 6765/6773/1 +f 9382/9390/1 6761/6769/1 6764/6772/1 9383/9391/1 +f 1507/1515/1 9472/9480/1 6761/6769/1 9382/9390/1 +f 9472/9480/1 9471/9479/1 6762/6770/1 6761/6769/1 +f 3706/3714/1 6757/6765/1 6760/6768/1 3707/3715/1 +f 9383/9391/1 6764/6772/1 6757/6765/1 3706/3714/1 +f 6764/6772/1 6763/6771/1 6758/6766/1 6757/6765/1 +f 6750/6758/1 6753/6761/1 6756/6764/1 6751/6759/1 +f 15963/15971/1 1512/1520/1 6753/6761/1 6750/6758/1 +f 1512/1520/1 1511/1519/1 6754/6762/1 6753/6761/1 +f 6766/6774/1 6749/6757/1 6752/6760/1 6767/6775/1 +f 3675/3683/1 15964/15972/1 6749/6757/1 6766/6774/1 +f 15964/15972/1 15963/15971/1 6750/6758/1 6749/6757/1 +f 4578/4586/1 6745/6753/1 6748/6756/1 4579/4587/1 +f 6767/6775/1 6752/6760/1 6745/6753/1 4578/4586/1 +f 6752/6760/1 6751/6759/1 6746/6754/1 6745/6753/1 +f 6738/6746/1 6741/6749/1 6744/6752/1 6739/6747/1 +f 6723/6731/1 4592/4600/1 6741/6749/1 6738/6746/1 +f 4592/4600/1 4591/4599/1 6742/6750/1 6741/6749/1 +f 15958/15966/1 6737/6745/1 6740/6748/1 15959/15967/1 +f 3671/3679/1 6724/6732/1 6737/6745/1 15958/15966/1 +f 6724/6732/1 6723/6731/1 6738/6746/1 6737/6745/1 +f 1514/1522/1 6733/6741/1 6736/6744/1 1515/1523/1 +f 15959/15967/1 6740/6748/1 6733/6741/1 1514/1522/1 +f 6740/6748/1 6739/6747/1 6734/6742/1 6733/6741/1 +f 6726/6734/1 6729/6737/1 6732/6740/1 6727/6735/1 +f 9579/9587/1 3640/3648/1 6729/6737/1 6726/6734/1 +f 3640/3648/1 3639/3647/1 6730/6738/1 6729/6737/1 +f 9490/9498/1 6725/6733/1 6728/6736/1 9491/9499/1 +f 1519/1527/1 9580/9588/1 6725/6733/1 9490/9498/1 +f 9580/9588/1 9579/9587/1 6726/6734/1 6725/6733/1 +f 3670/3678/1 6721/6729/1 6724/6732/1 3671/3679/1 +f 9491/9499/1 6728/6736/1 6721/6729/1 3670/3678/1 +f 6728/6736/1 6727/6735/1 6722/6730/1 6721/6729/1 +f 6714/6722/1 6717/6725/1 6720/6728/1 6715/6723/1 +f 15927/15935/1 1524/1532/1 6717/6725/1 6714/6722/1 +f 1524/1532/1 1523/1531/1 6718/6726/1 6717/6725/1 +f 6730/6738/1 6713/6721/1 6716/6724/1 6731/6739/1 +f 3639/3647/1 15928/15936/1 6713/6721/1 6730/6738/1 +f 15928/15936/1 15927/15935/1 6714/6722/1 6713/6721/1 +f 4590/4598/1 6709/6717/1 6712/6720/1 4591/4599/1 +f 6731/6739/1 6716/6724/1 6709/6717/1 4590/4598/1 +f 6716/6724/1 6715/6723/1 6710/6718/1 6709/6717/1 +f 6702/6710/1 6705/6713/1 6708/6716/1 6703/6711/1 +f 6687/6695/1 4604/4612/1 6705/6713/1 6702/6710/1 +f 4604/4612/1 4603/4611/1 6706/6714/1 6705/6713/1 +f 15922/15930/1 6701/6709/1 6704/6712/1 15923/15931/1 +f 3635/3643/1 6688/6696/1 6701/6709/1 15922/15930/1 +f 6688/6696/1 6687/6695/1 6702/6710/1 6701/6709/1 +f 1526/1534/1 6697/6705/1 6700/6708/1 1527/1535/1 +f 15923/15931/1 6704/6712/1 6697/6705/1 1526/1534/1 +f 6704/6712/1 6703/6711/1 6698/6706/1 6697/6705/1 +f 6690/6698/1 6693/6701/1 6696/6704/1 6691/6699/1 +f 9687/9695/1 3604/3612/1 6693/6701/1 6690/6698/1 +f 3604/3612/1 3603/3611/1 6694/6702/1 6693/6701/1 +f 9598/9606/1 6689/6697/1 6692/6700/1 9599/9607/1 +f 1531/1539/1 9688/9696/1 6689/6697/1 9598/9606/1 +f 9688/9696/1 9687/9695/1 6690/6698/1 6689/6697/1 +f 3634/3642/1 6685/6693/1 6688/6696/1 3635/3643/1 +f 9599/9607/1 6692/6700/1 6685/6693/1 3634/3642/1 +f 6692/6700/1 6691/6699/1 6686/6694/1 6685/6693/1 +f 6678/6686/1 6681/6689/1 6684/6692/1 6679/6687/1 +f 15891/15899/1 1536/1544/1 6681/6689/1 6678/6686/1 +f 1536/1544/1 1535/1543/1 6682/6690/1 6681/6689/1 +f 6694/6702/1 6677/6685/1 6680/6688/1 6695/6703/1 +f 3603/3611/1 15892/15900/1 6677/6685/1 6694/6702/1 +f 15892/15900/1 15891/15899/1 6678/6686/1 6677/6685/1 +f 4602/4610/1 6673/6681/1 6676/6684/1 4603/4611/1 +f 6695/6703/1 6680/6688/1 6673/6681/1 4602/4610/1 +f 6680/6688/1 6679/6687/1 6674/6682/1 6673/6681/1 +f 6666/6674/1 6669/6677/1 6672/6680/1 6667/6675/1 +f 6651/6659/1 4616/4624/1 6669/6677/1 6666/6674/1 +f 4616/4624/1 4615/4623/1 6670/6678/1 6669/6677/1 +f 15886/15894/1 6665/6673/1 6668/6676/1 15887/15895/1 +f 3599/3607/1 6652/6660/1 6665/6673/1 15886/15894/1 +f 6652/6660/1 6651/6659/1 6666/6674/1 6665/6673/1 +f 1538/1546/1 6661/6669/1 6664/6672/1 1539/1547/1 +f 15887/15895/1 6668/6676/1 6661/6669/1 1538/1546/1 +f 6668/6676/1 6667/6675/1 6662/6670/1 6661/6669/1 +f 6654/6662/1 6657/6665/1 6660/6668/1 6655/6663/1 +f 9795/9803/1 3568/3576/1 6657/6665/1 6654/6662/1 +f 3568/3576/1 3567/3575/1 6658/6666/1 6657/6665/1 +f 9706/9714/1 6653/6661/1 6656/6664/1 9707/9715/1 +f 1543/1551/1 9796/9804/1 6653/6661/1 9706/9714/1 +f 9796/9804/1 9795/9803/1 6654/6662/1 6653/6661/1 +f 3598/3606/1 6649/6657/1 6652/6660/1 3599/3607/1 +f 9707/9715/1 6656/6664/1 6649/6657/1 3598/3606/1 +f 6656/6664/1 6655/6663/1 6650/6658/1 6649/6657/1 +f 6642/6650/1 6645/6653/1 6648/6656/1 6643/6651/1 +f 15855/15863/1 1548/1556/1 6645/6653/1 6642/6650/1 +f 1548/1556/1 1547/1555/1 6646/6654/1 6645/6653/1 +f 6658/6666/1 6641/6649/1 6644/6652/1 6659/6667/1 +f 3567/3575/1 15856/15864/1 6641/6649/1 6658/6666/1 +f 15856/15864/1 15855/15863/1 6642/6650/1 6641/6649/1 +f 4614/4622/1 6637/6645/1 6640/6648/1 4615/4623/1 +f 6659/6667/1 6644/6652/1 6637/6645/1 4614/4622/1 +f 6644/6652/1 6643/6651/1 6638/6646/1 6637/6645/1 +f 6630/6638/1 6633/6641/1 6636/6644/1 6631/6639/1 +f 6615/6623/1 4628/4636/1 6633/6641/1 6630/6638/1 +f 4628/4636/1 4627/4635/1 6634/6642/1 6633/6641/1 +f 15850/15858/1 6629/6637/1 6632/6640/1 15851/15859/1 +f 3563/3571/1 6616/6624/1 6629/6637/1 15850/15858/1 +f 6616/6624/1 6615/6623/1 6630/6638/1 6629/6637/1 +f 1550/1558/1 6625/6633/1 6628/6636/1 1551/1559/1 +f 15851/15859/1 6632/6640/1 6625/6633/1 1550/1558/1 +f 6632/6640/1 6631/6639/1 6626/6634/1 6625/6633/1 +f 6618/6626/1 6621/6629/1 6624/6632/1 6619/6627/1 +f 9903/9911/1 3532/3540/1 6621/6629/1 6618/6626/1 +f 3532/3540/1 3531/3539/1 6622/6630/1 6621/6629/1 +f 9814/9822/1 6617/6625/1 6620/6628/1 9815/9823/1 +f 1555/1563/1 9904/9912/1 6617/6625/1 9814/9822/1 +f 9904/9912/1 9903/9911/1 6618/6626/1 6617/6625/1 +f 3562/3570/1 6613/6621/1 6616/6624/1 3563/3571/1 +f 9815/9823/1 6620/6628/1 6613/6621/1 3562/3570/1 +f 6620/6628/1 6619/6627/1 6614/6622/1 6613/6621/1 +f 6606/6614/1 6609/6617/1 6612/6620/1 6607/6615/1 +f 15819/15827/1 1560/1568/1 6609/6617/1 6606/6614/1 +f 1560/1568/1 1559/1567/1 6610/6618/1 6609/6617/1 +f 6622/6630/1 6605/6613/1 6608/6616/1 6623/6631/1 +f 3531/3539/1 15820/15828/1 6605/6613/1 6622/6630/1 +f 15820/15828/1 15819/15827/1 6606/6614/1 6605/6613/1 +f 4626/4634/1 6601/6609/1 6604/6612/1 4627/4635/1 +f 6623/6631/1 6608/6616/1 6601/6609/1 4626/4634/1 +f 6608/6616/1 6607/6615/1 6602/6610/1 6601/6609/1 +f 6594/6602/1 6597/6605/1 6600/6608/1 6595/6603/1 +f 6579/6587/1 4640/4648/1 6597/6605/1 6594/6602/1 +f 4640/4648/1 4639/4647/1 6598/6606/1 6597/6605/1 +f 15814/15822/1 6593/6601/1 6596/6604/1 15815/15823/1 +f 3527/3535/1 6580/6588/1 6593/6601/1 15814/15822/1 +f 6580/6588/1 6579/6587/1 6594/6602/1 6593/6601/1 +f 1562/1570/1 6589/6597/1 6592/6600/1 1563/1571/1 +f 15815/15823/1 6596/6604/1 6589/6597/1 1562/1570/1 +f 6596/6604/1 6595/6603/1 6590/6598/1 6589/6597/1 +f 6582/6590/1 6585/6593/1 6588/6596/1 6583/6591/1 +f 10011/10019/1 3496/3504/1 6585/6593/1 6582/6590/1 +f 3496/3504/1 3495/3503/1 6586/6594/1 6585/6593/1 +f 9922/9930/1 6581/6589/1 6584/6592/1 9923/9931/1 +f 1567/1575/1 10012/10020/1 6581/6589/1 9922/9930/1 +f 10012/10020/1 10011/10019/1 6582/6590/1 6581/6589/1 +f 3526/3534/1 6577/6585/1 6580/6588/1 3527/3535/1 +f 9923/9931/1 6584/6592/1 6577/6585/1 3526/3534/1 +f 6584/6592/1 6583/6591/1 6578/6586/1 6577/6585/1 +f 6570/6578/1 6573/6581/1 6576/6584/1 6571/6579/1 +f 15783/15791/1 1572/1580/1 6573/6581/1 6570/6578/1 +f 1572/1580/1 1571/1579/1 6574/6582/1 6573/6581/1 +f 6586/6594/1 6569/6577/1 6572/6580/1 6587/6595/1 +f 3495/3503/1 15784/15792/1 6569/6577/1 6586/6594/1 +f 15784/15792/1 15783/15791/1 6570/6578/1 6569/6577/1 +f 4638/4646/1 6565/6573/1 6568/6576/1 4639/4647/1 +f 6587/6595/1 6572/6580/1 6565/6573/1 4638/4646/1 +f 6572/6580/1 6571/6579/1 6566/6574/1 6565/6573/1 +f 6558/6566/1 6561/6569/1 6564/6572/1 6559/6567/1 +f 6543/6551/1 4652/4660/1 6561/6569/1 6558/6566/1 +f 4652/4660/1 4651/4659/1 6562/6570/1 6561/6569/1 +f 15778/15786/1 6557/6565/1 6560/6568/1 15779/15787/1 +f 3491/3499/1 6544/6552/1 6557/6565/1 15778/15786/1 +f 6544/6552/1 6543/6551/1 6558/6566/1 6557/6565/1 +f 1574/1582/1 6553/6561/1 6556/6564/1 1575/1583/1 +f 15779/15787/1 6560/6568/1 6553/6561/1 1574/1582/1 +f 6560/6568/1 6559/6567/1 6554/6562/1 6553/6561/1 +f 6546/6554/1 6549/6557/1 6552/6560/1 6547/6555/1 +f 10119/10127/1 3460/3468/1 6549/6557/1 6546/6554/1 +f 3460/3468/1 3459/3467/1 6550/6558/1 6549/6557/1 +f 10030/10038/1 6545/6553/1 6548/6556/1 10031/10039/1 +f 1579/1587/1 10120/10128/1 6545/6553/1 10030/10038/1 +f 10120/10128/1 10119/10127/1 6546/6554/1 6545/6553/1 +f 3490/3498/1 6541/6549/1 6544/6552/1 3491/3499/1 +f 10031/10039/1 6548/6556/1 6541/6549/1 3490/3498/1 +f 6548/6556/1 6547/6555/1 6542/6550/1 6541/6549/1 +f 6534/6542/1 6537/6545/1 6540/6548/1 6535/6543/1 +f 15747/15755/1 1584/1592/1 6537/6545/1 6534/6542/1 +f 1584/1592/1 1583/1591/1 6538/6546/1 6537/6545/1 +f 6550/6558/1 6533/6541/1 6536/6544/1 6551/6559/1 +f 3459/3467/1 15748/15756/1 6533/6541/1 6550/6558/1 +f 15748/15756/1 15747/15755/1 6534/6542/1 6533/6541/1 +f 4650/4658/1 6529/6537/1 6532/6540/1 4651/4659/1 +f 6551/6559/1 6536/6544/1 6529/6537/1 4650/4658/1 +f 6536/6544/1 6535/6543/1 6530/6538/1 6529/6537/1 +f 6522/6530/1 6525/6533/1 6528/6536/1 6523/6531/1 +f 6507/6515/1 4664/4672/1 6525/6533/1 6522/6530/1 +f 4664/4672/1 4663/4671/1 6526/6534/1 6525/6533/1 +f 15742/15750/1 6521/6529/1 6524/6532/1 15743/15751/1 +f 3455/3463/1 6508/6516/1 6521/6529/1 15742/15750/1 +f 6508/6516/1 6507/6515/1 6522/6530/1 6521/6529/1 +f 1586/1594/1 6517/6525/1 6520/6528/1 1587/1595/1 +f 15743/15751/1 6524/6532/1 6517/6525/1 1586/1594/1 +f 6524/6532/1 6523/6531/1 6518/6526/1 6517/6525/1 +f 6510/6518/1 6513/6521/1 6516/6524/1 6511/6519/1 +f 10227/10235/1 3424/3432/1 6513/6521/1 6510/6518/1 +f 3424/3432/1 3423/3431/1 6514/6522/1 6513/6521/1 +f 10138/10146/1 6509/6517/1 6512/6520/1 10139/10147/1 +f 1591/1599/1 10228/10236/1 6509/6517/1 10138/10146/1 +f 10228/10236/1 10227/10235/1 6510/6518/1 6509/6517/1 +f 3454/3462/1 6505/6513/1 6508/6516/1 3455/3463/1 +f 10139/10147/1 6512/6520/1 6505/6513/1 3454/3462/1 +f 6512/6520/1 6511/6519/1 6506/6514/1 6505/6513/1 +f 6498/6506/1 6501/6509/1 6504/6512/1 6499/6507/1 +f 15711/15719/1 1596/1604/1 6501/6509/1 6498/6506/1 +f 1596/1604/1 1595/1603/1 6502/6510/1 6501/6509/1 +f 6514/6522/1 6497/6505/1 6500/6508/1 6515/6523/1 +f 3423/3431/1 15712/15720/1 6497/6505/1 6514/6522/1 +f 15712/15720/1 15711/15719/1 6498/6506/1 6497/6505/1 +f 4662/4670/1 6493/6501/1 6496/6504/1 4663/4671/1 +f 6515/6523/1 6500/6508/1 6493/6501/1 4662/4670/1 +f 6500/6508/1 6499/6507/1 6494/6502/1 6493/6501/1 +f 6486/6494/1 6489/6497/1 6492/6500/1 6487/6495/1 +f 6471/6479/1 4676/4684/1 6489/6497/1 6486/6494/1 +f 4676/4684/1 4675/4683/1 6490/6498/1 6489/6497/1 +f 15706/15714/1 6485/6493/1 6488/6496/1 15707/15715/1 +f 3419/3427/1 6472/6480/1 6485/6493/1 15706/15714/1 +f 6472/6480/1 6471/6479/1 6486/6494/1 6485/6493/1 +f 1598/1606/1 6481/6489/1 6484/6492/1 1599/1607/1 +f 15707/15715/1 6488/6496/1 6481/6489/1 1598/1606/1 +f 6488/6496/1 6487/6495/1 6482/6490/1 6481/6489/1 +f 6474/6482/1 6477/6485/1 6480/6488/1 6475/6483/1 +f 10335/10343/1 3388/3396/1 6477/6485/1 6474/6482/1 +f 3388/3396/1 3387/3395/1 6478/6486/1 6477/6485/1 +f 10246/10254/1 6473/6481/1 6476/6484/1 10247/10255/1 +f 1603/1611/1 10336/10344/1 6473/6481/1 10246/10254/1 +f 10336/10344/1 10335/10343/1 6474/6482/1 6473/6481/1 +f 3418/3426/1 6469/6477/1 6472/6480/1 3419/3427/1 +f 10247/10255/1 6476/6484/1 6469/6477/1 3418/3426/1 +f 6476/6484/1 6475/6483/1 6470/6478/1 6469/6477/1 +f 6462/6470/1 6465/6473/1 6468/6476/1 6463/6471/1 +f 15675/15683/1 1608/1616/1 6465/6473/1 6462/6470/1 +f 1608/1616/1 1607/1615/1 6466/6474/1 6465/6473/1 +f 6478/6486/1 6461/6469/1 6464/6472/1 6479/6487/1 +f 3387/3395/1 15676/15684/1 6461/6469/1 6478/6486/1 +f 15676/15684/1 15675/15683/1 6462/6470/1 6461/6469/1 +f 4674/4682/1 6457/6465/1 6460/6468/1 4675/4683/1 +f 6479/6487/1 6464/6472/1 6457/6465/1 4674/4682/1 +f 6464/6472/1 6463/6471/1 6458/6466/1 6457/6465/1 +f 6450/6458/1 6453/6461/1 6456/6464/1 6451/6459/1 +f 6435/6443/1 4688/4696/1 6453/6461/1 6450/6458/1 +f 4688/4696/1 4687/4695/1 6454/6462/1 6453/6461/1 +f 15670/15678/1 6449/6457/1 6452/6460/1 15671/15679/1 +f 3383/3391/1 6436/6444/1 6449/6457/1 15670/15678/1 +f 6436/6444/1 6435/6443/1 6450/6458/1 6449/6457/1 +f 1610/1618/1 6445/6453/1 6448/6456/1 1611/1619/1 +f 15671/15679/1 6452/6460/1 6445/6453/1 1610/1618/1 +f 6452/6460/1 6451/6459/1 6446/6454/1 6445/6453/1 +f 6438/6446/1 6441/6449/1 6444/6452/1 6439/6447/1 +f 10443/10451/1 3352/3360/1 6441/6449/1 6438/6446/1 +f 3352/3360/1 3351/3359/1 6442/6450/1 6441/6449/1 +f 10354/10362/1 6437/6445/1 6440/6448/1 10355/10363/1 +f 1615/1623/1 10444/10452/1 6437/6445/1 10354/10362/1 +f 10444/10452/1 10443/10451/1 6438/6446/1 6437/6445/1 +f 3382/3390/1 6433/6441/1 6436/6444/1 3383/3391/1 +f 10355/10363/1 6440/6448/1 6433/6441/1 3382/3390/1 +f 6440/6448/1 6439/6447/1 6434/6442/1 6433/6441/1 +f 6426/6434/1 6429/6437/1 6432/6440/1 6427/6435/1 +f 15639/15647/1 1620/1628/1 6429/6437/1 6426/6434/1 +f 1620/1628/1 1619/1627/1 6430/6438/1 6429/6437/1 +f 6442/6450/1 6425/6433/1 6428/6436/1 6443/6451/1 +f 3351/3359/1 15640/15648/1 6425/6433/1 6442/6450/1 +f 15640/15648/1 15639/15647/1 6426/6434/1 6425/6433/1 +f 4686/4694/1 6421/6429/1 6424/6432/1 4687/4695/1 +f 6443/6451/1 6428/6436/1 6421/6429/1 4686/4694/1 +f 6428/6436/1 6427/6435/1 6422/6430/1 6421/6429/1 +f 6414/6422/1 6417/6425/1 6420/6428/1 6415/6423/1 +f 6399/6407/1 4700/4708/1 6417/6425/1 6414/6422/1 +f 4700/4708/1 4699/4707/1 6418/6426/1 6417/6425/1 +f 15634/15642/1 6413/6421/1 6416/6424/1 15635/15643/1 +f 3347/3355/1 6400/6408/1 6413/6421/1 15634/15642/1 +f 6400/6408/1 6399/6407/1 6414/6422/1 6413/6421/1 +f 1622/1630/1 6409/6417/1 6412/6420/1 1623/1631/1 +f 15635/15643/1 6416/6424/1 6409/6417/1 1622/1630/1 +f 6416/6424/1 6415/6423/1 6410/6418/1 6409/6417/1 +f 6402/6410/1 6405/6413/1 6408/6416/1 6403/6411/1 +f 10551/10559/1 3316/3324/1 6405/6413/1 6402/6410/1 +f 3316/3324/1 3315/3323/1 6406/6414/1 6405/6413/1 +f 10462/10470/1 6401/6409/1 6404/6412/1 10463/10471/1 +f 1627/1635/1 10552/10560/1 6401/6409/1 10462/10470/1 +f 10552/10560/1 10551/10559/1 6402/6410/1 6401/6409/1 +f 3346/3354/1 6397/6405/1 6400/6408/1 3347/3355/1 +f 10463/10471/1 6404/6412/1 6397/6405/1 3346/3354/1 +f 6404/6412/1 6403/6411/1 6398/6406/1 6397/6405/1 +f 6390/6398/1 6393/6401/1 6396/6404/1 6391/6399/1 +f 15603/15611/1 1632/1640/1 6393/6401/1 6390/6398/1 +f 1632/1640/1 1631/1639/1 6394/6402/1 6393/6401/1 +f 6406/6414/1 6389/6397/1 6392/6400/1 6407/6415/1 +f 3315/3323/1 15604/15612/1 6389/6397/1 6406/6414/1 +f 15604/15612/1 15603/15611/1 6390/6398/1 6389/6397/1 +f 4698/4706/1 6385/6393/1 6388/6396/1 4699/4707/1 +f 6407/6415/1 6392/6400/1 6385/6393/1 4698/4706/1 +f 6392/6400/1 6391/6399/1 6386/6394/1 6385/6393/1 +f 6378/6386/1 6381/6389/1 6384/6392/1 6379/6387/1 +f 6363/6371/1 4712/4720/1 6381/6389/1 6378/6386/1 +f 4712/4720/1 4711/4719/1 6382/6390/1 6381/6389/1 +f 15598/15606/1 6377/6385/1 6380/6388/1 15599/15607/1 +f 3311/3319/1 6364/6372/1 6377/6385/1 15598/15606/1 +f 6364/6372/1 6363/6371/1 6378/6386/1 6377/6385/1 +f 1634/1642/1 6373/6381/1 6376/6384/1 1635/1643/1 +f 15599/15607/1 6380/6388/1 6373/6381/1 1634/1642/1 +f 6380/6388/1 6379/6387/1 6374/6382/1 6373/6381/1 +f 6366/6374/1 6369/6377/1 6372/6380/1 6367/6375/1 +f 10659/10667/1 3280/3288/1 6369/6377/1 6366/6374/1 +f 3280/3288/1 3279/3287/1 6370/6378/1 6369/6377/1 +f 10570/10578/1 6365/6373/1 6368/6376/1 10571/10579/1 +f 1639/1647/1 10660/10668/1 6365/6373/1 10570/10578/1 +f 10660/10668/1 10659/10667/1 6366/6374/1 6365/6373/1 +f 3310/3318/1 6361/6369/1 6364/6372/1 3311/3319/1 +f 10571/10579/1 6368/6376/1 6361/6369/1 3310/3318/1 +f 6368/6376/1 6367/6375/1 6362/6370/1 6361/6369/1 +f 6354/6362/1 6357/6365/1 6360/6368/1 6355/6363/1 +f 15567/15575/1 1644/1652/1 6357/6365/1 6354/6362/1 +f 1644/1652/1 1643/1651/1 6358/6366/1 6357/6365/1 +f 6370/6378/1 6353/6361/1 6356/6364/1 6371/6379/1 +f 3279/3287/1 15568/15576/1 6353/6361/1 6370/6378/1 +f 15568/15576/1 15567/15575/1 6354/6362/1 6353/6361/1 +f 4710/4718/1 6349/6357/1 6352/6360/1 4711/4719/1 +f 6371/6379/1 6356/6364/1 6349/6357/1 4710/4718/1 +f 6356/6364/1 6355/6363/1 6350/6358/1 6349/6357/1 +f 6342/6350/1 6345/6353/1 6348/6356/1 6343/6351/1 +f 6327/6335/1 4724/4732/1 6345/6353/1 6342/6350/1 +f 4724/4732/1 4723/4731/1 6346/6354/1 6345/6353/1 +f 15562/15570/1 6341/6349/1 6344/6352/1 15563/15571/1 +f 3275/3283/1 6328/6336/1 6341/6349/1 15562/15570/1 +f 6328/6336/1 6327/6335/1 6342/6350/1 6341/6349/1 +f 1646/1654/1 6337/6345/1 6340/6348/1 1647/1655/1 +f 15563/15571/1 6344/6352/1 6337/6345/1 1646/1654/1 +f 6344/6352/1 6343/6351/1 6338/6346/1 6337/6345/1 +f 6330/6338/1 6333/6341/1 6336/6344/1 6331/6339/1 +f 10767/10775/1 3244/3252/1 6333/6341/1 6330/6338/1 +f 3244/3252/1 3243/3251/1 6334/6342/1 6333/6341/1 +f 10678/10686/1 6329/6337/1 6332/6340/1 10679/10687/1 +f 1651/1659/1 10768/10776/1 6329/6337/1 10678/10686/1 +f 10768/10776/1 10767/10775/1 6330/6338/1 6329/6337/1 +f 3274/3282/1 6325/6333/1 6328/6336/1 3275/3283/1 +f 10679/10687/1 6332/6340/1 6325/6333/1 3274/3282/1 +f 6332/6340/1 6331/6339/1 6326/6334/1 6325/6333/1 +f 6318/6326/1 6321/6329/1 6324/6332/1 6319/6327/1 +f 15531/15539/1 1656/1664/1 6321/6329/1 6318/6326/1 +f 1656/1664/1 1655/1663/1 6322/6330/1 6321/6329/1 +f 6334/6342/1 6317/6325/1 6320/6328/1 6335/6343/1 +f 3243/3251/1 15532/15540/1 6317/6325/1 6334/6342/1 +f 15532/15540/1 15531/15539/1 6318/6326/1 6317/6325/1 +f 4722/4730/1 6313/6321/1 6316/6324/1 4723/4731/1 +f 6335/6343/1 6320/6328/1 6313/6321/1 4722/4730/1 +f 6320/6328/1 6319/6327/1 6314/6322/1 6313/6321/1 +f 6306/6314/1 6309/6317/1 6312/6320/1 6307/6315/1 +f 6291/6299/1 4736/4744/1 6309/6317/1 6306/6314/1 +f 4736/4744/1 4735/4743/1 6310/6318/1 6309/6317/1 +f 15526/15534/1 6305/6313/1 6308/6316/1 15527/15535/1 +f 3239/3247/1 6292/6300/1 6305/6313/1 15526/15534/1 +f 6292/6300/1 6291/6299/1 6306/6314/1 6305/6313/1 +f 1658/1666/1 6301/6309/1 6304/6312/1 1659/1667/1 +f 15527/15535/1 6308/6316/1 6301/6309/1 1658/1666/1 +f 6308/6316/1 6307/6315/1 6302/6310/1 6301/6309/1 +f 6294/6302/1 6297/6305/1 6300/6308/1 6295/6303/1 +f 10875/10883/1 3208/3216/1 6297/6305/1 6294/6302/1 +f 3208/3216/1 3207/3215/1 6298/6306/1 6297/6305/1 +f 10786/10794/1 6293/6301/1 6296/6304/1 10787/10795/1 +f 1663/1671/1 10876/10884/1 6293/6301/1 10786/10794/1 +f 10876/10884/1 10875/10883/1 6294/6302/1 6293/6301/1 +f 3238/3246/1 6289/6297/1 6292/6300/1 3239/3247/1 +f 10787/10795/1 6296/6304/1 6289/6297/1 3238/3246/1 +f 6296/6304/1 6295/6303/1 6290/6298/1 6289/6297/1 +f 6282/6290/1 6285/6293/1 6288/6296/1 6283/6291/1 +f 15495/15503/1 1668/1676/1 6285/6293/1 6282/6290/1 +f 1668/1676/1 1667/1675/1 6286/6294/1 6285/6293/1 +f 6298/6306/1 6281/6289/1 6284/6292/1 6299/6307/1 +f 3207/3215/1 15496/15504/1 6281/6289/1 6298/6306/1 +f 15496/15504/1 15495/15503/1 6282/6290/1 6281/6289/1 +f 4734/4742/1 6277/6285/1 6280/6288/1 4735/4743/1 +f 6299/6307/1 6284/6292/1 6277/6285/1 4734/4742/1 +f 6284/6292/1 6283/6291/1 6278/6286/1 6277/6285/1 +f 6270/6278/1 6273/6281/1 6276/6284/1 6271/6279/1 +f 6255/6263/1 4748/4756/1 6273/6281/1 6270/6278/1 +f 4748/4756/1 4747/4755/1 6274/6282/1 6273/6281/1 +f 15490/15498/1 6269/6277/1 6272/6280/1 15491/15499/1 +f 3203/3211/1 6256/6264/1 6269/6277/1 15490/15498/1 +f 6256/6264/1 6255/6263/1 6270/6278/1 6269/6277/1 +f 1670/1678/1 6265/6273/1 6268/6276/1 1671/1679/1 +f 15491/15499/1 6272/6280/1 6265/6273/1 1670/1678/1 +f 6272/6280/1 6271/6279/1 6266/6274/1 6265/6273/1 +f 6258/6266/1 6261/6269/1 6264/6272/1 6259/6267/1 +f 10983/10991/1 3172/3180/1 6261/6269/1 6258/6266/1 +f 3172/3180/1 3171/3179/1 6262/6270/1 6261/6269/1 +f 10894/10902/1 6257/6265/1 6260/6268/1 10895/10903/1 +f 1675/1683/1 10984/10992/1 6257/6265/1 10894/10902/1 +f 10984/10992/1 10983/10991/1 6258/6266/1 6257/6265/1 +f 3202/3210/1 6253/6261/1 6256/6264/1 3203/3211/1 +f 10895/10903/1 6260/6268/1 6253/6261/1 3202/3210/1 +f 6260/6268/1 6259/6267/1 6254/6262/1 6253/6261/1 +f 6246/6254/1 6249/6257/1 6252/6260/1 6247/6255/1 +f 15459/15467/1 1680/1688/1 6249/6257/1 6246/6254/1 +f 1680/1688/1 1679/1687/1 6250/6258/1 6249/6257/1 +f 6262/6270/1 6245/6253/1 6248/6256/1 6263/6271/1 +f 3171/3179/1 15460/15468/1 6245/6253/1 6262/6270/1 +f 15460/15468/1 15459/15467/1 6246/6254/1 6245/6253/1 +f 4746/4754/1 6241/6249/1 6244/6252/1 4747/4755/1 +f 6263/6271/1 6248/6256/1 6241/6249/1 4746/4754/1 +f 6248/6256/1 6247/6255/1 6242/6250/1 6241/6249/1 +f 6234/6242/1 6237/6245/1 6240/6248/1 6235/6243/1 +f 6219/6227/1 4760/4768/1 6237/6245/1 6234/6242/1 +f 4760/4768/1 4759/4767/1 6238/6246/1 6237/6245/1 +f 15454/15462/1 6233/6241/1 6236/6244/1 15455/15463/1 +f 3167/3175/1 6220/6228/1 6233/6241/1 15454/15462/1 +f 6220/6228/1 6219/6227/1 6234/6242/1 6233/6241/1 +f 1682/1690/1 6229/6237/1 6232/6240/1 1683/1691/1 +f 15455/15463/1 6236/6244/1 6229/6237/1 1682/1690/1 +f 6236/6244/1 6235/6243/1 6230/6238/1 6229/6237/1 +f 6222/6230/1 6225/6233/1 6228/6236/1 6223/6231/1 +f 11091/11099/1 3136/3144/1 6225/6233/1 6222/6230/1 +f 3136/3144/1 3135/3143/1 6226/6234/1 6225/6233/1 +f 11002/11010/1 6221/6229/1 6224/6232/1 11003/11011/1 +f 1687/1695/1 11092/11100/1 6221/6229/1 11002/11010/1 +f 11092/11100/1 11091/11099/1 6222/6230/1 6221/6229/1 +f 3166/3174/1 6217/6225/1 6220/6228/1 3167/3175/1 +f 11003/11011/1 6224/6232/1 6217/6225/1 3166/3174/1 +f 6224/6232/1 6223/6231/1 6218/6226/1 6217/6225/1 +f 6210/6218/1 6213/6221/1 6216/6224/1 6211/6219/1 +f 15423/15431/1 1692/1700/1 6213/6221/1 6210/6218/1 +f 1692/1700/1 1691/1699/1 6214/6222/1 6213/6221/1 +f 6226/6234/1 6209/6217/1 6212/6220/1 6227/6235/1 +f 3135/3143/1 15424/15432/1 6209/6217/1 6226/6234/1 +f 15424/15432/1 15423/15431/1 6210/6218/1 6209/6217/1 +f 4758/4766/1 6205/6213/1 6208/6216/1 4759/4767/1 +f 6227/6235/1 6212/6220/1 6205/6213/1 4758/4766/1 +f 6212/6220/1 6211/6219/1 6206/6214/1 6205/6213/1 +f 6198/6206/1 6201/6209/1 6204/6212/1 6199/6207/1 +f 6183/6191/1 4772/4780/1 6201/6209/1 6198/6206/1 +f 4772/4780/1 4771/4779/1 6202/6210/1 6201/6209/1 +f 15418/15426/1 6197/6205/1 6200/6208/1 15419/15427/1 +f 3131/3139/1 6184/6192/1 6197/6205/1 15418/15426/1 +f 6184/6192/1 6183/6191/1 6198/6206/1 6197/6205/1 +f 1694/1702/1 6193/6201/1 6196/6204/1 1695/1703/1 +f 15419/15427/1 6200/6208/1 6193/6201/1 1694/1702/1 +f 6200/6208/1 6199/6207/1 6194/6202/1 6193/6201/1 +f 6186/6194/1 6189/6197/1 6192/6200/1 6187/6195/1 +f 11199/11207/1 3100/3108/1 6189/6197/1 6186/6194/1 +f 3100/3108/1 3099/3107/1 6190/6198/1 6189/6197/1 +f 11110/11118/1 6185/6193/1 6188/6196/1 11111/11119/1 +f 1699/1707/1 11200/11208/1 6185/6193/1 11110/11118/1 +f 11200/11208/1 11199/11207/1 6186/6194/1 6185/6193/1 +f 3130/3138/1 6181/6189/1 6184/6192/1 3131/3139/1 +f 11111/11119/1 6188/6196/1 6181/6189/1 3130/3138/1 +f 6188/6196/1 6187/6195/1 6182/6190/1 6181/6189/1 +f 6174/6182/1 6177/6185/1 6180/6188/1 6175/6183/1 +f 15387/15395/1 1704/1712/1 6177/6185/1 6174/6182/1 +f 1704/1712/1 1703/1711/1 6178/6186/1 6177/6185/1 +f 6190/6198/1 6173/6181/1 6176/6184/1 6191/6199/1 +f 3099/3107/1 15388/15396/1 6173/6181/1 6190/6198/1 +f 15388/15396/1 15387/15395/1 6174/6182/1 6173/6181/1 +f 4770/4778/1 6169/6177/1 6172/6180/1 4771/4779/1 +f 6191/6199/1 6176/6184/1 6169/6177/1 4770/4778/1 +f 6176/6184/1 6175/6183/1 6170/6178/1 6169/6177/1 +f 6162/6170/1 6165/6173/1 6168/6176/1 6163/6171/1 +f 6147/6155/1 4784/4792/1 6165/6173/1 6162/6170/1 +f 4784/4792/1 4783/4791/1 6166/6174/1 6165/6173/1 +f 15382/15390/1 6161/6169/1 6164/6172/1 15383/15391/1 +f 3095/3103/1 6148/6156/1 6161/6169/1 15382/15390/1 +f 6148/6156/1 6147/6155/1 6162/6170/1 6161/6169/1 +f 1706/1714/1 6157/6165/1 6160/6168/1 1707/1715/1 +f 15383/15391/1 6164/6172/1 6157/6165/1 1706/1714/1 +f 6164/6172/1 6163/6171/1 6158/6166/1 6157/6165/1 +f 6150/6158/1 6153/6161/1 6156/6164/1 6151/6159/1 +f 11307/11315/1 3064/3072/1 6153/6161/1 6150/6158/1 +f 3064/3072/1 3063/3071/1 6154/6162/1 6153/6161/1 +f 11218/11226/1 6149/6157/1 6152/6160/1 11219/11227/1 +f 1711/1719/1 11308/11316/1 6149/6157/1 11218/11226/1 +f 11308/11316/1 11307/11315/1 6150/6158/1 6149/6157/1 +f 3094/3102/1 6145/6153/1 6148/6156/1 3095/3103/1 +f 11219/11227/1 6152/6160/1 6145/6153/1 3094/3102/1 +f 6152/6160/1 6151/6159/1 6146/6154/1 6145/6153/1 +f 6138/6146/1 6141/6149/1 6144/6152/1 6139/6147/1 +f 15351/15359/1 1716/1724/1 6141/6149/1 6138/6146/1 +f 1716/1724/1 1715/1723/1 6142/6150/1 6141/6149/1 +f 6154/6162/1 6137/6145/1 6140/6148/1 6155/6163/1 +f 3063/3071/1 15352/15360/1 6137/6145/1 6154/6162/1 +f 15352/15360/1 15351/15359/1 6138/6146/1 6137/6145/1 +f 4782/4790/1 6133/6141/1 6136/6144/1 4783/4791/1 +f 6155/6163/1 6140/6148/1 6133/6141/1 4782/4790/1 +f 6140/6148/1 6139/6147/1 6134/6142/1 6133/6141/1 +f 6126/6134/1 6129/6137/1 6132/6140/1 6127/6135/1 +f 6111/6119/1 4796/4804/1 6129/6137/1 6126/6134/1 +f 4796/4804/1 4795/4803/1 6130/6138/1 6129/6137/1 +f 15346/15354/1 6125/6133/1 6128/6136/1 15347/15355/1 +f 3059/3067/1 6112/6120/1 6125/6133/1 15346/15354/1 +f 6112/6120/1 6111/6119/1 6126/6134/1 6125/6133/1 +f 1718/1726/1 6121/6129/1 6124/6132/1 1719/1727/1 +f 15347/15355/1 6128/6136/1 6121/6129/1 1718/1726/1 +f 6128/6136/1 6127/6135/1 6122/6130/1 6121/6129/1 +f 6114/6122/1 6117/6125/1 6120/6128/1 6115/6123/1 +f 11415/11423/1 3028/3036/1 6117/6125/1 6114/6122/1 +f 3028/3036/1 3027/3035/1 6118/6126/1 6117/6125/1 +f 11326/11334/1 6113/6121/1 6116/6124/1 11327/11335/1 +f 1723/1731/1 11416/11424/1 6113/6121/1 11326/11334/1 +f 11416/11424/1 11415/11423/1 6114/6122/1 6113/6121/1 +f 3058/3066/1 6109/6117/1 6112/6120/1 3059/3067/1 +f 11327/11335/1 6116/6124/1 6109/6117/1 3058/3066/1 +f 6116/6124/1 6115/6123/1 6110/6118/1 6109/6117/1 +f 6102/6110/1 6105/6113/1 6108/6116/1 6103/6111/1 +f 15315/15323/1 1728/1736/1 6105/6113/1 6102/6110/1 +f 1728/1736/1 1727/1735/1 6106/6114/1 6105/6113/1 +f 6118/6126/1 6101/6109/1 6104/6112/1 6119/6127/1 +f 3027/3035/1 15316/15324/1 6101/6109/1 6118/6126/1 +f 15316/15324/1 15315/15323/1 6102/6110/1 6101/6109/1 +f 4794/4802/1 6097/6105/1 6100/6108/1 4795/4803/1 +f 6119/6127/1 6104/6112/1 6097/6105/1 4794/4802/1 +f 6104/6112/1 6103/6111/1 6098/6106/1 6097/6105/1 +f 6090/6098/1 6093/6101/1 6096/6104/1 6091/6099/1 +f 6075/6083/1 4808/4816/1 6093/6101/1 6090/6098/1 +f 4808/4816/1 4807/4815/1 6094/6102/1 6093/6101/1 +f 15310/15318/1 6089/6097/1 6092/6100/1 15311/15319/1 +f 3023/3031/1 6076/6084/1 6089/6097/1 15310/15318/1 +f 6076/6084/1 6075/6083/1 6090/6098/1 6089/6097/1 +f 1730/1738/1 6085/6093/1 6088/6096/1 1731/1739/1 +f 15311/15319/1 6092/6100/1 6085/6093/1 1730/1738/1 +f 6092/6100/1 6091/6099/1 6086/6094/1 6085/6093/1 +f 6078/6086/1 6081/6089/1 6084/6092/1 6079/6087/1 +f 11523/11531/1 2992/3000/1 6081/6089/1 6078/6086/1 +f 2992/3000/1 2991/2999/1 6082/6090/1 6081/6089/1 +f 11434/11442/1 6077/6085/1 6080/6088/1 11435/11443/1 +f 1735/1743/1 11524/11532/1 6077/6085/1 11434/11442/1 +f 11524/11532/1 11523/11531/1 6078/6086/1 6077/6085/1 +f 3022/3030/1 6073/6081/1 6076/6084/1 3023/3031/1 +f 11435/11443/1 6080/6088/1 6073/6081/1 3022/3030/1 +f 6080/6088/1 6079/6087/1 6074/6082/1 6073/6081/1 +f 6066/6074/1 6069/6077/1 6072/6080/1 6067/6075/1 +f 15279/15287/1 1740/1748/1 6069/6077/1 6066/6074/1 +f 1740/1748/1 1739/1747/1 6070/6078/1 6069/6077/1 +f 6082/6090/1 6065/6073/1 6068/6076/1 6083/6091/1 +f 2991/2999/1 15280/15288/1 6065/6073/1 6082/6090/1 +f 15280/15288/1 15279/15287/1 6066/6074/1 6065/6073/1 +f 4806/4814/1 6061/6069/1 6064/6072/1 4807/4815/1 +f 6083/6091/1 6068/6076/1 6061/6069/1 4806/4814/1 +f 6068/6076/1 6067/6075/1 6062/6070/1 6061/6069/1 +f 6054/6062/1 6057/6065/1 6060/6068/1 6055/6063/1 +f 6039/6047/1 4820/4828/1 6057/6065/1 6054/6062/1 +f 4820/4828/1 4819/4827/1 6058/6066/1 6057/6065/1 +f 15274/15282/1 6053/6061/1 6056/6064/1 15275/15283/1 +f 2987/2995/1 6040/6048/1 6053/6061/1 15274/15282/1 +f 6040/6048/1 6039/6047/1 6054/6062/1 6053/6061/1 +f 1742/1750/1 6049/6057/1 6052/6060/1 1743/1751/1 +f 15275/15283/1 6056/6064/1 6049/6057/1 1742/1750/1 +f 6056/6064/1 6055/6063/1 6050/6058/1 6049/6057/1 +f 6042/6050/1 6045/6053/1 6048/6056/1 6043/6051/1 +f 11631/11639/1 2956/2964/1 6045/6053/1 6042/6050/1 +f 2956/2964/1 2955/2963/1 6046/6054/1 6045/6053/1 +f 11542/11550/1 6041/6049/1 6044/6052/1 11543/11551/1 +f 1747/1755/1 11632/11640/1 6041/6049/1 11542/11550/1 +f 11632/11640/1 11631/11639/1 6042/6050/1 6041/6049/1 +f 2986/2994/1 6037/6045/1 6040/6048/1 2987/2995/1 +f 11543/11551/1 6044/6052/1 6037/6045/1 2986/2994/1 +f 6044/6052/1 6043/6051/1 6038/6046/1 6037/6045/1 +f 6030/6038/1 6033/6041/1 6036/6044/1 6031/6039/1 +f 15243/15251/1 1752/1760/1 6033/6041/1 6030/6038/1 +f 1752/1760/1 1751/1759/1 6034/6042/1 6033/6041/1 +f 6046/6054/1 6029/6037/1 6032/6040/1 6047/6055/1 +f 2955/2963/1 15244/15252/1 6029/6037/1 6046/6054/1 +f 15244/15252/1 15243/15251/1 6030/6038/1 6029/6037/1 +f 4818/4826/1 6025/6033/1 6028/6036/1 4819/4827/1 +f 6047/6055/1 6032/6040/1 6025/6033/1 4818/4826/1 +f 6032/6040/1 6031/6039/1 6026/6034/1 6025/6033/1 +f 6018/6026/1 6021/6029/1 6024/6032/1 6019/6027/1 +f 6003/6011/1 4832/4840/1 6021/6029/1 6018/6026/1 +f 4832/4840/1 4831/4839/1 6022/6030/1 6021/6029/1 +f 15238/15246/1 6017/6025/1 6020/6028/1 15239/15247/1 +f 2951/2959/1 6004/6012/1 6017/6025/1 15238/15246/1 +f 6004/6012/1 6003/6011/1 6018/6026/1 6017/6025/1 +f 1754/1762/1 6013/6021/1 6016/6024/1 1755/1763/1 +f 15239/15247/1 6020/6028/1 6013/6021/1 1754/1762/1 +f 6020/6028/1 6019/6027/1 6014/6022/1 6013/6021/1 +f 6006/6014/1 6009/6017/1 6012/6020/1 6007/6015/1 +f 11739/11747/1 2920/2928/1 6009/6017/1 6006/6014/1 +f 2920/2928/1 2919/2927/1 6010/6018/1 6009/6017/1 +f 11650/11658/1 6005/6013/1 6008/6016/1 11651/11659/1 +f 1759/1767/1 11740/11748/1 6005/6013/1 11650/11658/1 +f 11740/11748/1 11739/11747/1 6006/6014/1 6005/6013/1 +f 2950/2958/1 6001/6009/1 6004/6012/1 2951/2959/1 +f 11651/11659/1 6008/6016/1 6001/6009/1 2950/2958/1 +f 6008/6016/1 6007/6015/1 6002/6010/1 6001/6009/1 +f 5994/6002/1 5997/6005/1 6000/6008/1 5995/6003/1 +f 15207/15215/1 1764/1772/1 5997/6005/1 5994/6002/1 +f 1764/1772/1 1763/1771/1 5998/6006/1 5997/6005/1 +f 6010/6018/1 5993/6001/1 5996/6004/1 6011/6019/1 +f 2919/2927/1 15208/15216/1 5993/6001/1 6010/6018/1 +f 15208/15216/1 15207/15215/1 5994/6002/1 5993/6001/1 +f 4830/4838/1 5989/5997/1 5992/6000/1 4831/4839/1 +f 6011/6019/1 5996/6004/1 5989/5997/1 4830/4838/1 +f 5996/6004/1 5995/6003/1 5990/5998/1 5989/5997/1 +f 5982/5990/1 5985/5993/1 5988/5996/1 5983/5991/1 +f 5967/5975/1 4844/4852/1 5985/5993/1 5982/5990/1 +f 4844/4852/1 4843/4851/1 5986/5994/1 5985/5993/1 +f 15202/15210/1 5981/5989/1 5984/5992/1 15203/15211/1 +f 2915/2923/1 5968/5976/1 5981/5989/1 15202/15210/1 +f 5968/5976/1 5967/5975/1 5982/5990/1 5981/5989/1 +f 1766/1774/1 5977/5985/1 5980/5988/1 1767/1775/1 +f 15203/15211/1 5984/5992/1 5977/5985/1 1766/1774/1 +f 5984/5992/1 5983/5991/1 5978/5986/1 5977/5985/1 +f 5970/5978/1 5973/5981/1 5976/5984/1 5971/5979/1 +f 11847/11855/1 2884/2892/1 5973/5981/1 5970/5978/1 +f 2884/2892/1 2883/2891/1 5974/5982/1 5973/5981/1 +f 11758/11766/1 5969/5977/1 5972/5980/1 11759/11767/1 +f 1771/1779/1 11848/11856/1 5969/5977/1 11758/11766/1 +f 11848/11856/1 11847/11855/1 5970/5978/1 5969/5977/1 +f 2914/2922/1 5965/5973/1 5968/5976/1 2915/2923/1 +f 11759/11767/1 5972/5980/1 5965/5973/1 2914/2922/1 +f 5972/5980/1 5971/5979/1 5966/5974/1 5965/5973/1 +f 5958/5966/1 5961/5969/1 5964/5972/1 5959/5967/1 +f 15171/15179/1 1776/1784/1 5961/5969/1 5958/5966/1 +f 1776/1784/1 1775/1783/1 5962/5970/1 5961/5969/1 +f 5974/5982/1 5957/5965/1 5960/5968/1 5975/5983/1 +f 2883/2891/1 15172/15180/1 5957/5965/1 5974/5982/1 +f 15172/15180/1 15171/15179/1 5958/5966/1 5957/5965/1 +f 4842/4850/1 5953/5961/1 5956/5964/1 4843/4851/1 +f 5975/5983/1 5960/5968/1 5953/5961/1 4842/4850/1 +f 5960/5968/1 5959/5967/1 5954/5962/1 5953/5961/1 +f 5946/5954/1 5949/5957/1 5952/5960/1 5947/5955/1 +f 5931/5939/1 4856/4864/1 5949/5957/1 5946/5954/1 +f 4856/4864/1 4855/4863/1 5950/5958/1 5949/5957/1 +f 15166/15174/1 5945/5953/1 5948/5956/1 15167/15175/1 +f 2879/2887/1 5932/5940/1 5945/5953/1 15166/15174/1 +f 5932/5940/1 5931/5939/1 5946/5954/1 5945/5953/1 +f 1778/1786/1 5941/5949/1 5944/5952/1 1779/1787/1 +f 15167/15175/1 5948/5956/1 5941/5949/1 1778/1786/1 +f 5948/5956/1 5947/5955/1 5942/5950/1 5941/5949/1 +f 5934/5942/1 5937/5945/1 5940/5948/1 5935/5943/1 +f 11955/11963/1 2848/2856/1 5937/5945/1 5934/5942/1 +f 2848/2856/1 2847/2855/1 5938/5946/1 5937/5945/1 +f 11866/11874/1 5933/5941/1 5936/5944/1 11867/11875/1 +f 1783/1791/1 11956/11964/1 5933/5941/1 11866/11874/1 +f 11956/11964/1 11955/11963/1 5934/5942/1 5933/5941/1 +f 2878/2886/1 5929/5937/1 5932/5940/1 2879/2887/1 +f 11867/11875/1 5936/5944/1 5929/5937/1 2878/2886/1 +f 5936/5944/1 5935/5943/1 5930/5938/1 5929/5937/1 +f 5922/5930/1 5925/5933/1 5928/5936/1 5923/5931/1 +f 15135/15143/1 1788/1796/1 5925/5933/1 5922/5930/1 +f 1788/1796/1 1787/1795/1 5926/5934/1 5925/5933/1 +f 5938/5946/1 5921/5929/1 5924/5932/1 5939/5947/1 +f 2847/2855/1 15136/15144/1 5921/5929/1 5938/5946/1 +f 15136/15144/1 15135/15143/1 5922/5930/1 5921/5929/1 +f 4854/4862/1 5917/5925/1 5920/5928/1 4855/4863/1 +f 5939/5947/1 5924/5932/1 5917/5925/1 4854/4862/1 +f 5924/5932/1 5923/5931/1 5918/5926/1 5917/5925/1 +f 5910/5918/1 5913/5921/1 5916/5924/1 5911/5919/1 +f 5895/5903/1 4868/4876/1 5913/5921/1 5910/5918/1 +f 4868/4876/1 4867/4875/1 5914/5922/1 5913/5921/1 +f 15130/15138/1 5909/5917/1 5912/5920/1 15131/15139/1 +f 2843/2851/1 5896/5904/1 5909/5917/1 15130/15138/1 +f 5896/5904/1 5895/5903/1 5910/5918/1 5909/5917/1 +f 1790/1798/1 5905/5913/1 5908/5916/1 1791/1799/1 +f 15131/15139/1 5912/5920/1 5905/5913/1 1790/1798/1 +f 5912/5920/1 5911/5919/1 5906/5914/1 5905/5913/1 +f 5898/5906/1 5901/5909/1 5904/5912/1 5899/5907/1 +f 12063/12071/1 2812/2820/1 5901/5909/1 5898/5906/1 +f 2812/2820/1 2811/2819/1 5902/5910/1 5901/5909/1 +f 11974/11982/1 5897/5905/1 5900/5908/1 11975/11983/1 +f 1795/1803/1 12064/12072/1 5897/5905/1 11974/11982/1 +f 12064/12072/1 12063/12071/1 5898/5906/1 5897/5905/1 +f 2842/2850/1 5893/5901/1 5896/5904/1 2843/2851/1 +f 11975/11983/1 5900/5908/1 5893/5901/1 2842/2850/1 +f 5900/5908/1 5899/5907/1 5894/5902/1 5893/5901/1 +f 5886/5894/1 5889/5897/1 5892/5900/1 5887/5895/1 +f 15099/15107/1 1800/1808/1 5889/5897/1 5886/5894/1 +f 1800/1808/1 1799/1807/1 5890/5898/1 5889/5897/1 +f 5902/5910/1 5885/5893/1 5888/5896/1 5903/5911/1 +f 2811/2819/1 15100/15108/1 5885/5893/1 5902/5910/1 +f 15100/15108/1 15099/15107/1 5886/5894/1 5885/5893/1 +f 4866/4874/1 5881/5889/1 5884/5892/1 4867/4875/1 +f 5903/5911/1 5888/5896/1 5881/5889/1 4866/4874/1 +f 5888/5896/1 5887/5895/1 5882/5890/1 5881/5889/1 +f 5874/5882/1 5877/5885/1 5880/5888/1 5875/5883/1 +f 5859/5867/1 4880/4888/1 5877/5885/1 5874/5882/1 +f 4880/4888/1 4879/4887/1 5878/5886/1 5877/5885/1 +f 15094/15102/1 5873/5881/1 5876/5884/1 15095/15103/1 +f 2807/2815/1 5860/5868/1 5873/5881/1 15094/15102/1 +f 5860/5868/1 5859/5867/1 5874/5882/1 5873/5881/1 +f 1802/1810/1 5869/5877/1 5872/5880/1 1803/1811/1 +f 15095/15103/1 5876/5884/1 5869/5877/1 1802/1810/1 +f 5876/5884/1 5875/5883/1 5870/5878/1 5869/5877/1 +f 5862/5870/1 5865/5873/1 5868/5876/1 5863/5871/1 +f 12171/12179/1 2776/2784/1 5865/5873/1 5862/5870/1 +f 2776/2784/1 2775/2783/1 5866/5874/1 5865/5873/1 +f 12082/12090/1 5861/5869/1 5864/5872/1 12083/12091/1 +f 1807/1815/1 12172/12180/1 5861/5869/1 12082/12090/1 +f 12172/12180/1 12171/12179/1 5862/5870/1 5861/5869/1 +f 2806/2814/1 5857/5865/1 5860/5868/1 2807/2815/1 +f 12083/12091/1 5864/5872/1 5857/5865/1 2806/2814/1 +f 5864/5872/1 5863/5871/1 5858/5866/1 5857/5865/1 +f 5850/5858/1 5853/5861/1 5856/5864/1 5851/5859/1 +f 15063/15071/1 1812/1820/1 5853/5861/1 5850/5858/1 +f 1812/1820/1 1811/1819/1 5854/5862/1 5853/5861/1 +f 5866/5874/1 5849/5857/1 5852/5860/1 5867/5875/1 +f 2775/2783/1 15064/15072/1 5849/5857/1 5866/5874/1 +f 15064/15072/1 15063/15071/1 5850/5858/1 5849/5857/1 +f 4878/4886/1 5845/5853/1 5848/5856/1 4879/4887/1 +f 5867/5875/1 5852/5860/1 5845/5853/1 4878/4886/1 +f 5852/5860/1 5851/5859/1 5846/5854/1 5845/5853/1 +f 5838/5846/1 5841/5849/1 5844/5852/1 5839/5847/1 +f 5823/5831/1 4892/4900/1 5841/5849/1 5838/5846/1 +f 4892/4900/1 4891/4899/1 5842/5850/1 5841/5849/1 +f 15058/15066/1 5837/5845/1 5840/5848/1 15059/15067/1 +f 2771/2779/1 5824/5832/1 5837/5845/1 15058/15066/1 +f 5824/5832/1 5823/5831/1 5838/5846/1 5837/5845/1 +f 1814/1822/1 5833/5841/1 5836/5844/1 1815/1823/1 +f 15059/15067/1 5840/5848/1 5833/5841/1 1814/1822/1 +f 5840/5848/1 5839/5847/1 5834/5842/1 5833/5841/1 +f 5826/5834/1 5829/5837/1 5832/5840/1 5827/5835/1 +f 12279/12287/1 2740/2748/1 5829/5837/1 5826/5834/1 +f 2740/2748/1 2739/2747/1 5830/5838/1 5829/5837/1 +f 12190/12198/1 5825/5833/1 5828/5836/1 12191/12199/1 +f 1819/1827/1 12280/12288/1 5825/5833/1 12190/12198/1 +f 12280/12288/1 12279/12287/1 5826/5834/1 5825/5833/1 +f 2770/2778/1 5821/5829/1 5824/5832/1 2771/2779/1 +f 12191/12199/1 5828/5836/1 5821/5829/1 2770/2778/1 +f 5828/5836/1 5827/5835/1 5822/5830/1 5821/5829/1 +f 5814/5822/1 5817/5825/1 5820/5828/1 5815/5823/1 +f 15027/15035/1 1824/1832/1 5817/5825/1 5814/5822/1 +f 1824/1832/1 1823/1831/1 5818/5826/1 5817/5825/1 +f 5830/5838/1 5813/5821/1 5816/5824/1 5831/5839/1 +f 2739/2747/1 15028/15036/1 5813/5821/1 5830/5838/1 +f 15028/15036/1 15027/15035/1 5814/5822/1 5813/5821/1 +f 4890/4898/1 5809/5817/1 5812/5820/1 4891/4899/1 +f 5831/5839/1 5816/5824/1 5809/5817/1 4890/4898/1 +f 5816/5824/1 5815/5823/1 5810/5818/1 5809/5817/1 +f 5802/5810/1 5805/5813/1 5808/5816/1 5803/5811/1 +f 5787/5795/1 4904/4912/1 5805/5813/1 5802/5810/1 +f 4904/4912/1 4903/4911/1 5806/5814/1 5805/5813/1 +f 15022/15030/1 5801/5809/1 5804/5812/1 15023/15031/1 +f 2735/2743/1 5788/5796/1 5801/5809/1 15022/15030/1 +f 5788/5796/1 5787/5795/1 5802/5810/1 5801/5809/1 +f 1826/1834/1 5797/5805/1 5800/5808/1 1827/1835/1 +f 15023/15031/1 5804/5812/1 5797/5805/1 1826/1834/1 +f 5804/5812/1 5803/5811/1 5798/5806/1 5797/5805/1 +f 5790/5798/1 5793/5801/1 5796/5804/1 5791/5799/1 +f 12387/12395/1 2704/2712/1 5793/5801/1 5790/5798/1 +f 2704/2712/1 2703/2711/1 5794/5802/1 5793/5801/1 +f 12298/12306/1 5789/5797/1 5792/5800/1 12299/12307/1 +f 1831/1839/1 12388/12396/1 5789/5797/1 12298/12306/1 +f 12388/12396/1 12387/12395/1 5790/5798/1 5789/5797/1 +f 2734/2742/1 5785/5793/1 5788/5796/1 2735/2743/1 +f 12299/12307/1 5792/5800/1 5785/5793/1 2734/2742/1 +f 5792/5800/1 5791/5799/1 5786/5794/1 5785/5793/1 +f 5778/5786/1 5781/5789/1 5784/5792/1 5779/5787/1 +f 14991/14999/1 1836/1844/1 5781/5789/1 5778/5786/1 +f 1836/1844/1 1835/1843/1 5782/5790/1 5781/5789/1 +f 5794/5802/1 5777/5785/1 5780/5788/1 5795/5803/1 +f 2703/2711/1 14992/15000/1 5777/5785/1 5794/5802/1 +f 14992/15000/1 14991/14999/1 5778/5786/1 5777/5785/1 +f 4902/4910/1 5773/5781/1 5776/5784/1 4903/4911/1 +f 5795/5803/1 5780/5788/1 5773/5781/1 4902/4910/1 +f 5780/5788/1 5779/5787/1 5774/5782/1 5773/5781/1 +f 5766/5774/1 5769/5777/1 5772/5780/1 5767/5775/1 +f 5751/5759/1 4916/4924/1 5769/5777/1 5766/5774/1 +f 4916/4924/1 4915/4923/1 5770/5778/1 5769/5777/1 +f 14986/14994/1 5765/5773/1 5768/5776/1 14987/14995/1 +f 2699/2707/1 5752/5760/1 5765/5773/1 14986/14994/1 +f 5752/5760/1 5751/5759/1 5766/5774/1 5765/5773/1 +f 1838/1846/1 5761/5769/1 5764/5772/1 1839/1847/1 +f 14987/14995/1 5768/5776/1 5761/5769/1 1838/1846/1 +f 5768/5776/1 5767/5775/1 5762/5770/1 5761/5769/1 +f 5754/5762/1 5757/5765/1 5760/5768/1 5755/5763/1 +f 12495/12503/1 2668/2676/1 5757/5765/1 5754/5762/1 +f 2668/2676/1 2667/2675/1 5758/5766/1 5757/5765/1 +f 12406/12414/1 5753/5761/1 5756/5764/1 12407/12415/1 +f 1843/1851/1 12496/12504/1 5753/5761/1 12406/12414/1 +f 12496/12504/1 12495/12503/1 5754/5762/1 5753/5761/1 +f 2698/2706/1 5749/5757/1 5752/5760/1 2699/2707/1 +f 12407/12415/1 5756/5764/1 5749/5757/1 2698/2706/1 +f 5756/5764/1 5755/5763/1 5750/5758/1 5749/5757/1 +f 5742/5750/1 5745/5753/1 5748/5756/1 5743/5751/1 +f 14955/14963/1 1848/1856/1 5745/5753/1 5742/5750/1 +f 1848/1856/1 1847/1855/1 5746/5754/1 5745/5753/1 +f 5758/5766/1 5741/5749/1 5744/5752/1 5759/5767/1 +f 2667/2675/1 14956/14964/1 5741/5749/1 5758/5766/1 +f 14956/14964/1 14955/14963/1 5742/5750/1 5741/5749/1 +f 4914/4922/1 5737/5745/1 5740/5748/1 4915/4923/1 +f 5759/5767/1 5744/5752/1 5737/5745/1 4914/4922/1 +f 5744/5752/1 5743/5751/1 5738/5746/1 5737/5745/1 +f 5730/5738/1 5733/5741/1 5736/5744/1 5731/5739/1 +f 5715/5723/1 4928/4936/1 5733/5741/1 5730/5738/1 +f 4928/4936/1 4927/4935/1 5734/5742/1 5733/5741/1 +f 14950/14958/1 5729/5737/1 5732/5740/1 14951/14959/1 +f 2663/2671/1 5716/5724/1 5729/5737/1 14950/14958/1 +f 5716/5724/1 5715/5723/1 5730/5738/1 5729/5737/1 +f 1850/1858/1 5725/5733/1 5728/5736/1 1851/1859/1 +f 14951/14959/1 5732/5740/1 5725/5733/1 1850/1858/1 +f 5732/5740/1 5731/5739/1 5726/5734/1 5725/5733/1 +f 5718/5726/1 5721/5729/1 5724/5732/1 5719/5727/1 +f 12603/12611/1 2632/2640/1 5721/5729/1 5718/5726/1 +f 2632/2640/1 2631/2639/1 5722/5730/1 5721/5729/1 +f 12514/12522/1 5717/5725/1 5720/5728/1 12515/12523/1 +f 1855/1863/1 12604/12612/1 5717/5725/1 12514/12522/1 +f 12604/12612/1 12603/12611/1 5718/5726/1 5717/5725/1 +f 2662/2670/1 5713/5721/1 5716/5724/1 2663/2671/1 +f 12515/12523/1 5720/5728/1 5713/5721/1 2662/2670/1 +f 5720/5728/1 5719/5727/1 5714/5722/1 5713/5721/1 +f 5706/5714/1 5709/5717/1 5712/5720/1 5707/5715/1 +f 14919/14927/1 1860/1868/1 5709/5717/1 5706/5714/1 +f 1860/1868/1 1859/1867/1 5710/5718/1 5709/5717/1 +f 5722/5730/1 5705/5713/1 5708/5716/1 5723/5731/1 +f 2631/2639/1 14920/14928/1 5705/5713/1 5722/5730/1 +f 14920/14928/1 14919/14927/1 5706/5714/1 5705/5713/1 +f 4926/4934/1 5701/5709/1 5704/5712/1 4927/4935/1 +f 5723/5731/1 5708/5716/1 5701/5709/1 4926/4934/1 +f 5708/5716/1 5707/5715/1 5702/5710/1 5701/5709/1 +f 5694/5702/1 5697/5705/1 5700/5708/1 5695/5703/1 +f 5679/5687/1 4940/4948/1 5697/5705/1 5694/5702/1 +f 4940/4948/1 4939/4947/1 5698/5706/1 5697/5705/1 +f 14914/14922/1 5693/5701/1 5696/5704/1 14915/14923/1 +f 2627/2635/1 5680/5688/1 5693/5701/1 14914/14922/1 +f 5680/5688/1 5679/5687/1 5694/5702/1 5693/5701/1 +f 1862/1870/1 5689/5697/1 5692/5700/1 1863/1871/1 +f 14915/14923/1 5696/5704/1 5689/5697/1 1862/1870/1 +f 5696/5704/1 5695/5703/1 5690/5698/1 5689/5697/1 +f 5682/5690/1 5685/5693/1 5688/5696/1 5683/5691/1 +f 12711/12719/1 2596/2604/1 5685/5693/1 5682/5690/1 +f 2596/2604/1 2595/2603/1 5686/5694/1 5685/5693/1 +f 12622/12630/1 5681/5689/1 5684/5692/1 12623/12631/1 +f 1867/1875/1 12712/12720/1 5681/5689/1 12622/12630/1 +f 12712/12720/1 12711/12719/1 5682/5690/1 5681/5689/1 +f 2626/2634/1 5677/5685/1 5680/5688/1 2627/2635/1 +f 12623/12631/1 5684/5692/1 5677/5685/1 2626/2634/1 +f 5684/5692/1 5683/5691/1 5678/5686/1 5677/5685/1 +f 5670/5678/1 5673/5681/1 5676/5684/1 5671/5679/1 +f 14883/14891/1 1872/1880/1 5673/5681/1 5670/5678/1 +f 1872/1880/1 1871/1879/1 5674/5682/1 5673/5681/1 +f 5686/5694/1 5669/5677/1 5672/5680/1 5687/5695/1 +f 2595/2603/1 14884/14892/1 5669/5677/1 5686/5694/1 +f 14884/14892/1 14883/14891/1 5670/5678/1 5669/5677/1 +f 4938/4946/1 5665/5673/1 5668/5676/1 4939/4947/1 +f 5687/5695/1 5672/5680/1 5665/5673/1 4938/4946/1 +f 5672/5680/1 5671/5679/1 5666/5674/1 5665/5673/1 +f 5658/5666/1 5661/5669/1 5664/5672/1 5659/5667/1 +f 5643/5651/1 4952/4960/1 5661/5669/1 5658/5666/1 +f 4952/4960/1 4951/4959/1 5662/5670/1 5661/5669/1 +f 14878/14886/1 5657/5665/1 5660/5668/1 14879/14887/1 +f 2591/2599/1 5644/5652/1 5657/5665/1 14878/14886/1 +f 5644/5652/1 5643/5651/1 5658/5666/1 5657/5665/1 +f 1874/1882/1 5653/5661/1 5656/5664/1 1875/1883/1 +f 14879/14887/1 5660/5668/1 5653/5661/1 1874/1882/1 +f 5660/5668/1 5659/5667/1 5654/5662/1 5653/5661/1 +f 5646/5654/1 5649/5657/1 5652/5660/1 5647/5655/1 +f 12819/12827/1 2560/2568/1 5649/5657/1 5646/5654/1 +f 2560/2568/1 2559/2567/1 5650/5658/1 5649/5657/1 +f 12730/12738/1 5645/5653/1 5648/5656/1 12731/12739/1 +f 1879/1887/1 12820/12828/1 5645/5653/1 12730/12738/1 +f 12820/12828/1 12819/12827/1 5646/5654/1 5645/5653/1 +f 2590/2598/1 5641/5649/1 5644/5652/1 2591/2599/1 +f 12731/12739/1 5648/5656/1 5641/5649/1 2590/2598/1 +f 5648/5656/1 5647/5655/1 5642/5650/1 5641/5649/1 +f 5634/5642/1 5637/5645/1 5640/5648/1 5635/5643/1 +f 14847/14855/1 1884/1892/1 5637/5645/1 5634/5642/1 +f 1884/1892/1 1883/1891/1 5638/5646/1 5637/5645/1 +f 5650/5658/1 5633/5641/1 5636/5644/1 5651/5659/1 +f 2559/2567/1 14848/14856/1 5633/5641/1 5650/5658/1 +f 14848/14856/1 14847/14855/1 5634/5642/1 5633/5641/1 +f 4950/4958/1 5629/5637/1 5632/5640/1 4951/4959/1 +f 5651/5659/1 5636/5644/1 5629/5637/1 4950/4958/1 +f 5636/5644/1 5635/5643/1 5630/5638/1 5629/5637/1 +f 5622/5630/1 5625/5633/1 5628/5636/1 5623/5631/1 +f 5607/5615/1 4964/4972/1 5625/5633/1 5622/5630/1 +f 4964/4972/1 4963/4971/1 5626/5634/1 5625/5633/1 +f 14842/14850/1 5621/5629/1 5624/5632/1 14843/14851/1 +f 2555/2563/1 5608/5616/1 5621/5629/1 14842/14850/1 +f 5608/5616/1 5607/5615/1 5622/5630/1 5621/5629/1 +f 1886/1894/1 5617/5625/1 5620/5628/1 1887/1895/1 +f 14843/14851/1 5624/5632/1 5617/5625/1 1886/1894/1 +f 5624/5632/1 5623/5631/1 5618/5626/1 5617/5625/1 +f 5610/5618/1 5613/5621/1 5616/5624/1 5611/5619/1 +f 12927/12935/1 2524/2532/1 5613/5621/1 5610/5618/1 +f 2524/2532/1 2523/2531/1 5614/5622/1 5613/5621/1 +f 12838/12846/1 5609/5617/1 5612/5620/1 12839/12847/1 +f 1891/1899/1 12928/12936/1 5609/5617/1 12838/12846/1 +f 12928/12936/1 12927/12935/1 5610/5618/1 5609/5617/1 +f 2554/2562/1 5605/5613/1 5608/5616/1 2555/2563/1 +f 12839/12847/1 5612/5620/1 5605/5613/1 2554/2562/1 +f 5612/5620/1 5611/5619/1 5606/5614/1 5605/5613/1 +f 5598/5606/1 5601/5609/1 5604/5612/1 5599/5607/1 +f 14811/14819/1 1896/1904/1 5601/5609/1 5598/5606/1 +f 1896/1904/1 1895/1903/1 5602/5610/1 5601/5609/1 +f 5614/5622/1 5597/5605/1 5600/5608/1 5615/5623/1 +f 2523/2531/1 14812/14820/1 5597/5605/1 5614/5622/1 +f 14812/14820/1 14811/14819/1 5598/5606/1 5597/5605/1 +f 4962/4970/1 5593/5601/1 5596/5604/1 4963/4971/1 +f 5615/5623/1 5600/5608/1 5593/5601/1 4962/4970/1 +f 5600/5608/1 5599/5607/1 5594/5602/1 5593/5601/1 +f 5586/5594/1 5589/5597/1 5592/5600/1 5587/5595/1 +f 5571/5579/1 4976/4984/1 5589/5597/1 5586/5594/1 +f 4976/4984/1 4975/4983/1 5590/5598/1 5589/5597/1 +f 14806/14814/1 5585/5593/1 5588/5596/1 14807/14815/1 +f 2519/2527/1 5572/5580/1 5585/5593/1 14806/14814/1 +f 5572/5580/1 5571/5579/1 5586/5594/1 5585/5593/1 +f 1898/1906/1 5581/5589/1 5584/5592/1 1899/1907/1 +f 14807/14815/1 5588/5596/1 5581/5589/1 1898/1906/1 +f 5588/5596/1 5587/5595/1 5582/5590/1 5581/5589/1 +f 5574/5582/1 5577/5585/1 5580/5588/1 5575/5583/1 +f 13035/13043/1 2488/2496/1 5577/5585/1 5574/5582/1 +f 2488/2496/1 2487/2495/1 5578/5586/1 5577/5585/1 +f 12946/12954/1 5573/5581/1 5576/5584/1 12947/12955/1 +f 1903/1911/1 13036/13044/1 5573/5581/1 12946/12954/1 +f 13036/13044/1 13035/13043/1 5574/5582/1 5573/5581/1 +f 2518/2526/1 5569/5577/1 5572/5580/1 2519/2527/1 +f 12947/12955/1 5576/5584/1 5569/5577/1 2518/2526/1 +f 5576/5584/1 5575/5583/1 5570/5578/1 5569/5577/1 +f 5562/5570/1 5565/5573/1 5568/5576/1 5563/5571/1 +f 14775/14783/1 1908/1916/1 5565/5573/1 5562/5570/1 +f 1908/1916/1 1907/1915/1 5566/5574/1 5565/5573/1 +f 5578/5586/1 5561/5569/1 5564/5572/1 5579/5587/1 +f 2487/2495/1 14776/14784/1 5561/5569/1 5578/5586/1 +f 14776/14784/1 14775/14783/1 5562/5570/1 5561/5569/1 +f 4974/4982/1 5557/5565/1 5560/5568/1 4975/4983/1 +f 5579/5587/1 5564/5572/1 5557/5565/1 4974/4982/1 +f 5564/5572/1 5563/5571/1 5558/5566/1 5557/5565/1 +f 5550/5558/1 5553/5561/1 5556/5564/1 5551/5559/1 +f 5535/5543/1 4988/4996/1 5553/5561/1 5550/5558/1 +f 4988/4996/1 4987/4995/1 5554/5562/1 5553/5561/1 +f 14770/14778/1 5549/5557/1 5552/5560/1 14771/14779/1 +f 2483/2491/1 5536/5544/1 5549/5557/1 14770/14778/1 +f 5536/5544/1 5535/5543/1 5550/5558/1 5549/5557/1 +f 1910/1918/1 5545/5553/1 5548/5556/1 1911/1919/1 +f 14771/14779/1 5552/5560/1 5545/5553/1 1910/1918/1 +f 5552/5560/1 5551/5559/1 5546/5554/1 5545/5553/1 +f 5538/5546/1 5541/5549/1 5544/5552/1 5539/5547/1 +f 13143/13151/1 2452/2460/1 5541/5549/1 5538/5546/1 +f 2452/2460/1 2451/2459/1 5542/5550/1 5541/5549/1 +f 13054/13062/1 5537/5545/1 5540/5548/1 13055/13063/1 +f 1915/1923/1 13144/13152/1 5537/5545/1 13054/13062/1 +f 13144/13152/1 13143/13151/1 5538/5546/1 5537/5545/1 +f 2482/2490/1 5533/5541/1 5536/5544/1 2483/2491/1 +f 13055/13063/1 5540/5548/1 5533/5541/1 2482/2490/1 +f 5540/5548/1 5539/5547/1 5534/5542/1 5533/5541/1 +f 5526/5534/1 5529/5537/1 5532/5540/1 5527/5535/1 +f 14739/14747/1 1920/1928/1 5529/5537/1 5526/5534/1 +f 1920/1928/1 1919/1927/1 5530/5538/1 5529/5537/1 +f 5542/5550/1 5525/5533/1 5528/5536/1 5543/5551/1 +f 2451/2459/1 14740/14748/1 5525/5533/1 5542/5550/1 +f 14740/14748/1 14739/14747/1 5526/5534/1 5525/5533/1 +f 4986/4994/1 5521/5529/1 5524/5532/1 4987/4995/1 +f 5543/5551/1 5528/5536/1 5521/5529/1 4986/4994/1 +f 5528/5536/1 5527/5535/1 5522/5530/1 5521/5529/1 +f 5514/5522/1 5517/5525/1 5520/5528/1 5515/5523/1 +f 5499/5507/1 5000/5008/1 5517/5525/1 5514/5522/1 +f 5000/5008/1 4999/5007/1 5518/5526/1 5517/5525/1 +f 14734/14742/1 5513/5521/1 5516/5524/1 14735/14743/1 +f 2447/2455/1 5500/5508/1 5513/5521/1 14734/14742/1 +f 5500/5508/1 5499/5507/1 5514/5522/1 5513/5521/1 +f 1922/1930/1 5509/5517/1 5512/5520/1 1923/1931/1 +f 14735/14743/1 5516/5524/1 5509/5517/1 1922/1930/1 +f 5516/5524/1 5515/5523/1 5510/5518/1 5509/5517/1 +f 5502/5510/1 5505/5513/1 5508/5516/1 5503/5511/1 +f 13251/13259/1 2416/2424/1 5505/5513/1 5502/5510/1 +f 2416/2424/1 2415/2423/1 5506/5514/1 5505/5513/1 +f 13162/13170/1 5501/5509/1 5504/5512/1 13163/13171/1 +f 1927/1935/1 13252/13260/1 5501/5509/1 13162/13170/1 +f 13252/13260/1 13251/13259/1 5502/5510/1 5501/5509/1 +f 2446/2454/1 5497/5505/1 5500/5508/1 2447/2455/1 +f 13163/13171/1 5504/5512/1 5497/5505/1 2446/2454/1 +f 5504/5512/1 5503/5511/1 5498/5506/1 5497/5505/1 +f 5490/5498/1 5493/5501/1 5496/5504/1 5491/5499/1 +f 14703/14711/1 1932/1940/1 5493/5501/1 5490/5498/1 +f 1932/1940/1 1931/1939/1 5494/5502/1 5493/5501/1 +f 5506/5514/1 5489/5497/1 5492/5500/1 5507/5515/1 +f 2415/2423/1 14704/14712/1 5489/5497/1 5506/5514/1 +f 14704/14712/1 14703/14711/1 5490/5498/1 5489/5497/1 +f 4998/5006/1 5485/5493/1 5488/5496/1 4999/5007/1 +f 5507/5515/1 5492/5500/1 5485/5493/1 4998/5006/1 +f 5492/5500/1 5491/5499/1 5486/5494/1 5485/5493/1 +f 5478/5486/1 5481/5489/1 5484/5492/1 5479/5487/1 +f 5463/5471/1 5012/5020/1 5481/5489/1 5478/5486/1 +f 5012/5020/1 5011/5019/1 5482/5490/1 5481/5489/1 +f 14698/14706/1 5477/5485/1 5480/5488/1 14699/14707/1 +f 2411/2419/1 5464/5472/1 5477/5485/1 14698/14706/1 +f 5464/5472/1 5463/5471/1 5478/5486/1 5477/5485/1 +f 1934/1942/1 5473/5481/1 5476/5484/1 1935/1943/1 +f 14699/14707/1 5480/5488/1 5473/5481/1 1934/1942/1 +f 5480/5488/1 5479/5487/1 5474/5482/1 5473/5481/1 +f 5466/5474/1 5469/5477/1 5472/5480/1 5467/5475/1 +f 13359/13367/1 2380/2388/1 5469/5477/1 5466/5474/1 +f 2380/2388/1 2379/2387/1 5470/5478/1 5469/5477/1 +f 13270/13278/1 5465/5473/1 5468/5476/1 13271/13279/1 +f 1939/1947/1 13360/13368/1 5465/5473/1 13270/13278/1 +f 13360/13368/1 13359/13367/1 5466/5474/1 5465/5473/1 +f 2410/2418/1 5461/5469/1 5464/5472/1 2411/2419/1 +f 13271/13279/1 5468/5476/1 5461/5469/1 2410/2418/1 +f 5468/5476/1 5467/5475/1 5462/5470/1 5461/5469/1 +f 5454/5462/1 5457/5465/1 5460/5468/1 5455/5463/1 +f 14667/14675/1 1944/1952/1 5457/5465/1 5454/5462/1 +f 1944/1952/1 1943/1951/1 5458/5466/1 5457/5465/1 +f 5470/5478/1 5453/5461/1 5456/5464/1 5471/5479/1 +f 2379/2387/1 14668/14676/1 5453/5461/1 5470/5478/1 +f 14668/14676/1 14667/14675/1 5454/5462/1 5453/5461/1 +f 5010/5018/1 5449/5457/1 5452/5460/1 5011/5019/1 +f 5471/5479/1 5456/5464/1 5449/5457/1 5010/5018/1 +f 5456/5464/1 5455/5463/1 5450/5458/1 5449/5457/1 +f 5442/5450/1 5445/5453/1 5448/5456/1 5443/5451/1 +f 5427/5435/1 5024/5032/1 5445/5453/1 5442/5450/1 +f 5024/5032/1 5023/5031/1 5446/5454/1 5445/5453/1 +f 14662/14670/1 5441/5449/1 5444/5452/1 14663/14671/1 +f 2375/2383/1 5428/5436/1 5441/5449/1 14662/14670/1 +f 5428/5436/1 5427/5435/1 5442/5450/1 5441/5449/1 +f 1946/1954/1 5437/5445/1 5440/5448/1 1947/1955/1 +f 14663/14671/1 5444/5452/1 5437/5445/1 1946/1954/1 +f 5444/5452/1 5443/5451/1 5438/5446/1 5437/5445/1 +f 5430/5438/1 5433/5441/1 5436/5444/1 5431/5439/1 +f 13467/13475/1 2344/2352/1 5433/5441/1 5430/5438/1 +f 2344/2352/1 2343/2351/1 5434/5442/1 5433/5441/1 +f 13378/13386/1 5429/5437/1 5432/5440/1 13379/13387/1 +f 1951/1959/1 13468/13476/1 5429/5437/1 13378/13386/1 +f 13468/13476/1 13467/13475/1 5430/5438/1 5429/5437/1 +f 2374/2382/1 5425/5433/1 5428/5436/1 2375/2383/1 +f 13379/13387/1 5432/5440/1 5425/5433/1 2374/2382/1 +f 5432/5440/1 5431/5439/1 5426/5434/1 5425/5433/1 +f 5418/5426/1 5421/5429/1 5424/5432/1 5419/5427/1 +f 14631/14639/1 1956/1964/1 5421/5429/1 5418/5426/1 +f 1956/1964/1 1955/1963/1 5422/5430/1 5421/5429/1 +f 5434/5442/1 5417/5425/1 5420/5428/1 5435/5443/1 +f 2343/2351/1 14632/14640/1 5417/5425/1 5434/5442/1 +f 14632/14640/1 14631/14639/1 5418/5426/1 5417/5425/1 +f 5022/5030/1 5413/5421/1 5416/5424/1 5023/5031/1 +f 5435/5443/1 5420/5428/1 5413/5421/1 5022/5030/1 +f 5420/5428/1 5419/5427/1 5414/5422/1 5413/5421/1 +f 5406/5414/1 5409/5417/1 5412/5420/1 5407/5415/1 +f 5391/5399/1 5036/5044/1 5409/5417/1 5406/5414/1 +f 5036/5044/1 5035/5043/1 5410/5418/1 5409/5417/1 +f 14626/14634/1 5405/5413/1 5408/5416/1 14627/14635/1 +f 2339/2347/1 5392/5400/1 5405/5413/1 14626/14634/1 +f 5392/5400/1 5391/5399/1 5406/5414/1 5405/5413/1 +f 1958/1966/1 5401/5409/1 5404/5412/1 1959/1967/1 +f 14627/14635/1 5408/5416/1 5401/5409/1 1958/1966/1 +f 5408/5416/1 5407/5415/1 5402/5410/1 5401/5409/1 +f 5394/5402/1 5397/5405/1 5400/5408/1 5395/5403/1 +f 13575/13583/1 2308/2316/1 5397/5405/1 5394/5402/1 +f 2308/2316/1 2307/2315/1 5398/5406/1 5397/5405/1 +f 13486/13494/1 5393/5401/1 5396/5404/1 13487/13495/1 +f 1963/1971/1 13576/13584/1 5393/5401/1 13486/13494/1 +f 13576/13584/1 13575/13583/1 5394/5402/1 5393/5401/1 +f 2338/2346/1 5389/5397/1 5392/5400/1 2339/2347/1 +f 13487/13495/1 5396/5404/1 5389/5397/1 2338/2346/1 +f 5396/5404/1 5395/5403/1 5390/5398/1 5389/5397/1 +f 5382/5390/1 5385/5393/1 5388/5396/1 5383/5391/1 +f 14595/14603/1 1968/1976/1 5385/5393/1 5382/5390/1 +f 1968/1976/1 1967/1975/1 5386/5394/1 5385/5393/1 +f 5398/5406/1 5381/5389/1 5384/5392/1 5399/5407/1 +f 2307/2315/1 14596/14604/1 5381/5389/1 5398/5406/1 +f 14596/14604/1 14595/14603/1 5382/5390/1 5381/5389/1 +f 5034/5042/1 5377/5385/1 5380/5388/1 5035/5043/1 +f 5399/5407/1 5384/5392/1 5377/5385/1 5034/5042/1 +f 5384/5392/1 5383/5391/1 5378/5386/1 5377/5385/1 +f 5370/5378/1 5373/5381/1 5376/5384/1 5371/5379/1 +f 5355/5363/1 5048/5056/1 5373/5381/1 5370/5378/1 +f 5048/5056/1 5047/5055/1 5374/5382/1 5373/5381/1 +f 14590/14598/1 5369/5377/1 5372/5380/1 14591/14599/1 +f 2303/2311/1 5356/5364/1 5369/5377/1 14590/14598/1 +f 5356/5364/1 5355/5363/1 5370/5378/1 5369/5377/1 +f 1970/1978/1 5365/5373/1 5368/5376/1 1971/1979/1 +f 14591/14599/1 5372/5380/1 5365/5373/1 1970/1978/1 +f 5372/5380/1 5371/5379/1 5366/5374/1 5365/5373/1 +f 5358/5366/1 5361/5369/1 5364/5372/1 5359/5367/1 +f 13683/13691/1 2272/2280/1 5361/5369/1 5358/5366/1 +f 2272/2280/1 2271/2279/1 5362/5370/1 5361/5369/1 +f 13594/13602/1 5357/5365/1 5360/5368/1 13595/13603/1 +f 1975/1983/1 13684/13692/1 5357/5365/1 13594/13602/1 +f 13684/13692/1 13683/13691/1 5358/5366/1 5357/5365/1 +f 2302/2310/1 5353/5361/1 5356/5364/1 2303/2311/1 +f 13595/13603/1 5360/5368/1 5353/5361/1 2302/2310/1 +f 5360/5368/1 5359/5367/1 5354/5362/1 5353/5361/1 +f 5346/5354/1 5349/5357/1 5352/5360/1 5347/5355/1 +f 14559/14567/1 1980/1988/1 5349/5357/1 5346/5354/1 +f 1980/1988/1 1979/1987/1 5350/5358/1 5349/5357/1 +f 5362/5370/1 5345/5353/1 5348/5356/1 5363/5371/1 +f 2271/2279/1 14560/14568/1 5345/5353/1 5362/5370/1 +f 14560/14568/1 14559/14567/1 5346/5354/1 5345/5353/1 +f 5046/5054/1 5341/5349/1 5344/5352/1 5047/5055/1 +f 5363/5371/1 5348/5356/1 5341/5349/1 5046/5054/1 +f 5348/5356/1 5347/5355/1 5342/5350/1 5341/5349/1 +f 5334/5342/1 5337/5345/1 5340/5348/1 5335/5343/1 +f 5319/5327/1 5060/5068/1 5337/5345/1 5334/5342/1 +f 5060/5068/1 5059/5067/1 5338/5346/1 5337/5345/1 +f 14554/14562/1 5333/5341/1 5336/5344/1 14555/14563/1 +f 2267/2275/1 5320/5328/1 5333/5341/1 14554/14562/1 +f 5320/5328/1 5319/5327/1 5334/5342/1 5333/5341/1 +f 1982/1990/1 5329/5337/1 5332/5340/1 1983/1991/1 +f 14555/14563/1 5336/5344/1 5329/5337/1 1982/1990/1 +f 5336/5344/1 5335/5343/1 5330/5338/1 5329/5337/1 +f 5322/5330/1 5325/5333/1 5328/5336/1 5323/5331/1 +f 13791/13799/1 2236/2244/1 5325/5333/1 5322/5330/1 +f 2236/2244/1 2235/2243/1 5326/5334/1 5325/5333/1 +f 13702/13710/1 5321/5329/1 5324/5332/1 13703/13711/1 +f 1987/1995/1 13792/13800/1 5321/5329/1 13702/13710/1 +f 13792/13800/1 13791/13799/1 5322/5330/1 5321/5329/1 +f 2266/2274/1 5317/5325/1 5320/5328/1 2267/2275/1 +f 13703/13711/1 5324/5332/1 5317/5325/1 2266/2274/1 +f 5324/5332/1 5323/5331/1 5318/5326/1 5317/5325/1 +f 5310/5318/1 5313/5321/1 5316/5324/1 5311/5319/1 +f 14523/14531/1 1992/2000/1 5313/5321/1 5310/5318/1 +f 1992/2000/1 1991/1999/1 5314/5322/1 5313/5321/1 +f 5326/5334/1 5309/5317/1 5312/5320/1 5327/5335/1 +f 2235/2243/1 14524/14532/1 5309/5317/1 5326/5334/1 +f 14524/14532/1 14523/14531/1 5310/5318/1 5309/5317/1 +f 5058/5066/1 5305/5313/1 5308/5316/1 5059/5067/1 +f 5327/5335/1 5312/5320/1 5305/5313/1 5058/5066/1 +f 5312/5320/1 5311/5319/1 5306/5314/1 5305/5313/1 +f 5298/5306/1 5301/5309/1 5304/5312/1 5299/5307/1 +f 5283/5291/1 5072/5080/1 5301/5309/1 5298/5306/1 +f 5072/5080/1 5071/5079/1 5302/5310/1 5301/5309/1 +f 14518/14526/1 5297/5305/1 5300/5308/1 14519/14527/1 +f 2231/2239/1 5284/5292/1 5297/5305/1 14518/14526/1 +f 5284/5292/1 5283/5291/1 5298/5306/1 5297/5305/1 +f 1994/2002/1 5293/5301/1 5296/5304/1 1995/2003/1 +f 14519/14527/1 5300/5308/1 5293/5301/1 1994/2002/1 +f 5300/5308/1 5299/5307/1 5294/5302/1 5293/5301/1 +f 5286/5294/1 5289/5297/1 5292/5300/1 5287/5295/1 +f 13899/13907/1 2200/2208/1 5289/5297/1 5286/5294/1 +f 2200/2208/1 2199/2207/1 5290/5298/1 5289/5297/1 +f 13810/13818/1 5285/5293/1 5288/5296/1 13811/13819/1 +f 1999/2007/1 13900/13908/1 5285/5293/1 13810/13818/1 +f 13900/13908/1 13899/13907/1 5286/5294/1 5285/5293/1 +f 2230/2238/1 5281/5289/1 5284/5292/1 2231/2239/1 +f 13811/13819/1 5288/5296/1 5281/5289/1 2230/2238/1 +f 5288/5296/1 5287/5295/1 5282/5290/1 5281/5289/1 +f 5274/5282/1 5277/5285/1 5280/5288/1 5275/5283/1 +f 14487/14495/1 2004/2012/1 5277/5285/1 5274/5282/1 +f 2004/2012/1 2003/2011/1 5278/5286/1 5277/5285/1 +f 5290/5298/1 5273/5281/1 5276/5284/1 5291/5299/1 +f 2199/2207/1 14488/14496/1 5273/5281/1 5290/5298/1 +f 14488/14496/1 14487/14495/1 5274/5282/1 5273/5281/1 +f 5070/5078/1 5269/5277/1 5272/5280/1 5071/5079/1 +f 5291/5299/1 5276/5284/1 5269/5277/1 5070/5078/1 +f 5276/5284/1 5275/5283/1 5270/5278/1 5269/5277/1 +f 5262/5270/1 5265/5273/1 5268/5276/1 5263/5271/1 +f 5247/5255/1 5084/5092/1 5265/5273/1 5262/5270/1 +f 5084/5092/1 5083/5091/1 5266/5274/1 5265/5273/1 +f 14482/14490/1 5261/5269/1 5264/5272/1 14483/14491/1 +f 2195/2203/1 5248/5256/1 5261/5269/1 14482/14490/1 +f 5248/5256/1 5247/5255/1 5262/5270/1 5261/5269/1 +f 2006/2014/1 5257/5265/1 5260/5268/1 2007/2015/1 +f 14483/14491/1 5264/5272/1 5257/5265/1 2006/2014/1 +f 5264/5272/1 5263/5271/1 5258/5266/1 5257/5265/1 +f 5250/5258/1 5253/5261/1 5256/5264/1 5251/5259/1 +f 14007/14015/1 2164/2172/1 5253/5261/1 5250/5258/1 +f 2164/2172/1 2163/2171/1 5254/5262/1 5253/5261/1 +f 13918/13926/1 5249/5257/1 5252/5260/1 13919/13927/1 +f 2011/2019/1 14008/14016/1 5249/5257/1 13918/13926/1 +f 14008/14016/1 14007/14015/1 5250/5258/1 5249/5257/1 +f 2194/2202/1 5245/5253/1 5248/5256/1 2195/2203/1 +f 13919/13927/1 5252/5260/1 5245/5253/1 2194/2202/1 +f 5252/5260/1 5251/5259/1 5246/5254/1 5245/5253/1 +f 5238/5246/1 5241/5249/1 5244/5252/1 5239/5247/1 +f 14451/14459/1 2016/2024/1 5241/5249/1 5238/5246/1 +f 2016/2024/1 2015/2023/1 5242/5250/1 5241/5249/1 +f 5254/5262/1 5237/5245/1 5240/5248/1 5255/5263/1 +f 2163/2171/1 14452/14460/1 5237/5245/1 5254/5262/1 +f 14452/14460/1 14451/14459/1 5238/5246/1 5237/5245/1 +f 5082/5090/1 5233/5241/1 5236/5244/1 5083/5091/1 +f 5255/5263/1 5240/5248/1 5233/5241/1 5082/5090/1 +f 5240/5248/1 5239/5247/1 5234/5242/1 5233/5241/1 +f 5226/5234/1 5229/5237/1 5232/5240/1 5227/5235/1 +f 5211/5219/1 5096/5104/1 5229/5237/1 5226/5234/1 +f 5096/5104/1 5095/5103/1 5230/5238/1 5229/5237/1 +f 14446/14454/1 5225/5233/1 5228/5236/1 14447/14455/1 +f 2159/2167/1 5212/5220/1 5225/5233/1 14446/14454/1 +f 5212/5220/1 5211/5219/1 5226/5234/1 5225/5233/1 +f 2018/2026/1 5221/5229/1 5224/5232/1 2019/2027/1 +f 14447/14455/1 5228/5236/1 5221/5229/1 2018/2026/1 +f 5228/5236/1 5227/5235/1 5222/5230/1 5221/5229/1 +f 5214/5222/1 5217/5225/1 5220/5228/1 5215/5223/1 +f 14115/14123/1 2128/2136/1 5217/5225/1 5214/5222/1 +f 2128/2136/1 2127/2135/1 5218/5226/1 5217/5225/1 +f 14026/14034/1 5213/5221/1 5216/5224/1 14027/14035/1 +f 2023/2031/1 14116/14124/1 5213/5221/1 14026/14034/1 +f 14116/14124/1 14115/14123/1 5214/5222/1 5213/5221/1 +f 2158/2166/1 5209/5217/1 5212/5220/1 2159/2167/1 +f 14027/14035/1 5216/5224/1 5209/5217/1 2158/2166/1 +f 5216/5224/1 5215/5223/1 5210/5218/1 5209/5217/1 +f 5202/5210/1 5205/5213/1 5208/5216/1 5203/5211/1 +f 14415/14423/1 2028/2036/1 5205/5213/1 5202/5210/1 +f 2028/2036/1 2027/2035/1 5206/5214/1 5205/5213/1 +f 5218/5226/1 5201/5209/1 5204/5212/1 5219/5227/1 +f 2127/2135/1 14416/14424/1 5201/5209/1 5218/5226/1 +f 14416/14424/1 14415/14423/1 5202/5210/1 5201/5209/1 +f 5094/5102/1 5197/5205/1 5200/5208/1 5095/5103/1 +f 5219/5227/1 5204/5212/1 5197/5205/1 5094/5102/1 +f 5204/5212/1 5203/5211/1 5198/5206/1 5197/5205/1 +f 5190/5198/1 5193/5201/1 5196/5204/1 5191/5199/1 +f 5175/5183/1 5108/5116/1 5193/5201/1 5190/5198/1 +f 5108/5116/1 5107/5115/1 5194/5202/1 5193/5201/1 +f 14410/14418/1 5189/5197/1 5192/5200/1 14411/14419/1 +f 2123/2131/1 5176/5184/1 5189/5197/1 14410/14418/1 +f 5176/5184/1 5175/5183/1 5190/5198/1 5189/5197/1 +f 2030/2038/1 5185/5193/1 5188/5196/1 2031/2039/1 +f 14411/14419/1 5192/5200/1 5185/5193/1 2030/2038/1 +f 5192/5200/1 5191/5199/1 5186/5194/1 5185/5193/1 +f 5178/5186/1 5181/5189/1 5184/5192/1 5179/5187/1 +f 14223/14231/1 2092/2100/1 5181/5189/1 5178/5186/1 +f 2092/2100/1 2091/2099/1 5182/5190/1 5181/5189/1 +f 14134/14142/1 5177/5185/1 5180/5188/1 14135/14143/1 +f 2035/2043/1 14224/14232/1 5177/5185/1 14134/14142/1 +f 14224/14232/1 14223/14231/1 5178/5186/1 5177/5185/1 +f 2122/2130/1 5173/5181/1 5176/5184/1 2123/2131/1 +f 14135/14143/1 5180/5188/1 5173/5181/1 2122/2130/1 +f 5180/5188/1 5179/5187/1 5174/5182/1 5173/5181/1 +f 5166/5174/1 5169/5177/1 5172/5180/1 5167/5175/1 +f 14379/14387/1 2040/2048/1 5169/5177/1 5166/5174/1 +f 2040/2048/1 2039/2047/1 5170/5178/1 5169/5177/1 +f 5182/5190/1 5165/5173/1 5168/5176/1 5183/5191/1 +f 2091/2099/1 14380/14388/1 5165/5173/1 5182/5190/1 +f 14380/14388/1 14379/14387/1 5166/5174/1 5165/5173/1 +f 5106/5114/1 5161/5169/1 5164/5172/1 5107/5115/1 +f 5183/5191/1 5168/5176/1 5161/5169/1 5106/5114/1 +f 5168/5176/1 5167/5175/1 5162/5170/1 5161/5169/1 +f 5154/5162/1 5157/5165/1 5160/5168/1 5155/5163/1 +f 5139/5147/1 5120/5128/1 5157/5165/1 5154/5162/1 +f 5120/5128/1 5119/5127/1 5158/5166/1 5157/5165/1 +f 14374/14382/1 5153/5161/1 5156/5164/1 14375/14383/1 +f 2087/2095/1 5140/5148/1 5153/5161/1 14374/14382/1 +f 5140/5148/1 5139/5147/1 5154/5162/1 5153/5161/1 +f 2042/2050/1 5149/5157/1 5152/5160/1 2043/2051/1 +f 14375/14383/1 5156/5164/1 5149/5157/1 2042/2050/1 +f 5156/5164/1 5155/5163/1 5150/5158/1 5149/5157/1 +f 5142/5150/1 5145/5153/1 5148/5156/1 5143/5151/1 +f 14331/14339/1 2056/2064/1 5145/5153/1 5142/5150/1 +f 2056/2064/1 2055/2063/1 5146/5154/1 5145/5153/1 +f 14242/14250/1 5141/5149/1 5144/5152/1 14243/14251/1 +f 2047/2055/1 14332/14340/1 5141/5149/1 14242/14250/1 +f 14332/14340/1 14331/14339/1 5142/5150/1 5141/5149/1 +f 2086/2094/1 5137/5145/1 5140/5148/1 2087/2095/1 +f 14243/14251/1 5144/5152/1 5137/5145/1 2086/2094/1 +f 5144/5152/1 5143/5151/1 5138/5146/1 5137/5145/1 +f 5130/5138/1 5133/5141/1 5136/5144/1 5131/5139/1 +f 14343/14351/1 2052/2060/1 5133/5141/1 5130/5138/1 +f 2052/2060/1 2051/2059/1 5134/5142/1 5133/5141/1 +f 5146/5154/1 5129/5137/1 5132/5140/1 5147/5155/1 +f 2055/2063/1 14344/14352/1 5129/5137/1 5146/5154/1 +f 14344/14352/1 14343/14351/1 5130/5138/1 5129/5137/1 +f 5118/5126/1 5125/5133/1 5128/5136/1 5119/5127/1 +f 5147/5155/1 5132/5140/1 5125/5133/1 5118/5126/1 +f 5132/5140/1 5131/5139/1 5126/5134/1 5125/5133/1 +f 5126/5134/1 5121/5129/1 5124/5132/1 5127/5135/1 +f 5131/5139/1 5136/5144/1 5121/5129/1 5126/5134/1 +f 5136/5144/1 5135/5143/1 5122/5130/1 5121/5129/1 +f 5138/5146/1 5117/5125/1 5120/5128/1 5139/5147/1 +f 5143/5151/1 5148/5156/1 5117/5125/1 5138/5146/1 +f 5148/5156/1 5147/5155/1 5118/5126/1 5117/5125/1 +f 5150/5158/1 5113/5121/1 5116/5124/1 5151/5159/1 +f 5155/5163/1 5160/5168/1 5113/5121/1 5150/5158/1 +f 5160/5168/1 5159/5167/1 5114/5122/1 5113/5121/1 +f 5162/5170/1 5109/5117/1 5112/5120/1 5163/5171/1 +f 5167/5175/1 5172/5180/1 5109/5117/1 5162/5170/1 +f 5172/5180/1 5171/5179/1 5110/5118/1 5109/5117/1 +f 5174/5182/1 5105/5113/1 5108/5116/1 5175/5183/1 +f 5179/5187/1 5184/5192/1 5105/5113/1 5174/5182/1 +f 5184/5192/1 5183/5191/1 5106/5114/1 5105/5113/1 +f 5186/5194/1 5101/5109/1 5104/5112/1 5187/5195/1 +f 5191/5199/1 5196/5204/1 5101/5109/1 5186/5194/1 +f 5196/5204/1 5195/5203/1 5102/5110/1 5101/5109/1 +f 5198/5206/1 5097/5105/1 5100/5108/1 5199/5207/1 +f 5203/5211/1 5208/5216/1 5097/5105/1 5198/5206/1 +f 5208/5216/1 5207/5215/1 5098/5106/1 5097/5105/1 +f 5210/5218/1 5093/5101/1 5096/5104/1 5211/5219/1 +f 5215/5223/1 5220/5228/1 5093/5101/1 5210/5218/1 +f 5220/5228/1 5219/5227/1 5094/5102/1 5093/5101/1 +f 5222/5230/1 5089/5097/1 5092/5100/1 5223/5231/1 +f 5227/5235/1 5232/5240/1 5089/5097/1 5222/5230/1 +f 5232/5240/1 5231/5239/1 5090/5098/1 5089/5097/1 +f 5234/5242/1 5085/5093/1 5088/5096/1 5235/5243/1 +f 5239/5247/1 5244/5252/1 5085/5093/1 5234/5242/1 +f 5244/5252/1 5243/5251/1 5086/5094/1 5085/5093/1 +f 5246/5254/1 5081/5089/1 5084/5092/1 5247/5255/1 +f 5251/5259/1 5256/5264/1 5081/5089/1 5246/5254/1 +f 5256/5264/1 5255/5263/1 5082/5090/1 5081/5089/1 +f 5258/5266/1 5077/5085/1 5080/5088/1 5259/5267/1 +f 5263/5271/1 5268/5276/1 5077/5085/1 5258/5266/1 +f 5268/5276/1 5267/5275/1 5078/5086/1 5077/5085/1 +f 5270/5278/1 5073/5081/1 5076/5084/1 5271/5279/1 +f 5275/5283/1 5280/5288/1 5073/5081/1 5270/5278/1 +f 5280/5288/1 5279/5287/1 5074/5082/1 5073/5081/1 +f 5282/5290/1 5069/5077/1 5072/5080/1 5283/5291/1 +f 5287/5295/1 5292/5300/1 5069/5077/1 5282/5290/1 +f 5292/5300/1 5291/5299/1 5070/5078/1 5069/5077/1 +f 5294/5302/1 5065/5073/1 5068/5076/1 5295/5303/1 +f 5299/5307/1 5304/5312/1 5065/5073/1 5294/5302/1 +f 5304/5312/1 5303/5311/1 5066/5074/1 5065/5073/1 +f 5306/5314/1 5061/5069/1 5064/5072/1 5307/5315/1 +f 5311/5319/1 5316/5324/1 5061/5069/1 5306/5314/1 +f 5316/5324/1 5315/5323/1 5062/5070/1 5061/5069/1 +f 5318/5326/1 5057/5065/1 5060/5068/1 5319/5327/1 +f 5323/5331/1 5328/5336/1 5057/5065/1 5318/5326/1 +f 5328/5336/1 5327/5335/1 5058/5066/1 5057/5065/1 +f 5330/5338/1 5053/5061/1 5056/5064/1 5331/5339/1 +f 5335/5343/1 5340/5348/1 5053/5061/1 5330/5338/1 +f 5340/5348/1 5339/5347/1 5054/5062/1 5053/5061/1 +f 5342/5350/1 5049/5057/1 5052/5060/1 5343/5351/1 +f 5347/5355/1 5352/5360/1 5049/5057/1 5342/5350/1 +f 5352/5360/1 5351/5359/1 5050/5058/1 5049/5057/1 +f 5354/5362/1 5045/5053/1 5048/5056/1 5355/5363/1 +f 5359/5367/1 5364/5372/1 5045/5053/1 5354/5362/1 +f 5364/5372/1 5363/5371/1 5046/5054/1 5045/5053/1 +f 5366/5374/1 5041/5049/1 5044/5052/1 5367/5375/1 +f 5371/5379/1 5376/5384/1 5041/5049/1 5366/5374/1 +f 5376/5384/1 5375/5383/1 5042/5050/1 5041/5049/1 +f 5378/5386/1 5037/5045/1 5040/5048/1 5379/5387/1 +f 5383/5391/1 5388/5396/1 5037/5045/1 5378/5386/1 +f 5388/5396/1 5387/5395/1 5038/5046/1 5037/5045/1 +f 5390/5398/1 5033/5041/1 5036/5044/1 5391/5399/1 +f 5395/5403/1 5400/5408/1 5033/5041/1 5390/5398/1 +f 5400/5408/1 5399/5407/1 5034/5042/1 5033/5041/1 +f 5402/5410/1 5029/5037/1 5032/5040/1 5403/5411/1 +f 5407/5415/1 5412/5420/1 5029/5037/1 5402/5410/1 +f 5412/5420/1 5411/5419/1 5030/5038/1 5029/5037/1 +f 5414/5422/1 5025/5033/1 5028/5036/1 5415/5423/1 +f 5419/5427/1 5424/5432/1 5025/5033/1 5414/5422/1 +f 5424/5432/1 5423/5431/1 5026/5034/1 5025/5033/1 +f 5426/5434/1 5021/5029/1 5024/5032/1 5427/5435/1 +f 5431/5439/1 5436/5444/1 5021/5029/1 5426/5434/1 +f 5436/5444/1 5435/5443/1 5022/5030/1 5021/5029/1 +f 5438/5446/1 5017/5025/1 5020/5028/1 5439/5447/1 +f 5443/5451/1 5448/5456/1 5017/5025/1 5438/5446/1 +f 5448/5456/1 5447/5455/1 5018/5026/1 5017/5025/1 +f 5450/5458/1 5013/5021/1 5016/5024/1 5451/5459/1 +f 5455/5463/1 5460/5468/1 5013/5021/1 5450/5458/1 +f 5460/5468/1 5459/5467/1 5014/5022/1 5013/5021/1 +f 5462/5470/1 5009/5017/1 5012/5020/1 5463/5471/1 +f 5467/5475/1 5472/5480/1 5009/5017/1 5462/5470/1 +f 5472/5480/1 5471/5479/1 5010/5018/1 5009/5017/1 +f 5474/5482/1 5005/5013/1 5008/5016/1 5475/5483/1 +f 5479/5487/1 5484/5492/1 5005/5013/1 5474/5482/1 +f 5484/5492/1 5483/5491/1 5006/5014/1 5005/5013/1 +f 5486/5494/1 5001/5009/1 5004/5012/1 5487/5495/1 +f 5491/5499/1 5496/5504/1 5001/5009/1 5486/5494/1 +f 5496/5504/1 5495/5503/1 5002/5010/1 5001/5009/1 +f 5498/5506/1 4997/5005/1 5000/5008/1 5499/5507/1 +f 5503/5511/1 5508/5516/1 4997/5005/1 5498/5506/1 +f 5508/5516/1 5507/5515/1 4998/5006/1 4997/5005/1 +f 5510/5518/1 4993/5001/1 4996/5004/1 5511/5519/1 +f 5515/5523/1 5520/5528/1 4993/5001/1 5510/5518/1 +f 5520/5528/1 5519/5527/1 4994/5002/1 4993/5001/1 +f 5522/5530/1 4989/4997/1 4992/5000/1 5523/5531/1 +f 5527/5535/1 5532/5540/1 4989/4997/1 5522/5530/1 +f 5532/5540/1 5531/5539/1 4990/4998/1 4989/4997/1 +f 5534/5542/1 4985/4993/1 4988/4996/1 5535/5543/1 +f 5539/5547/1 5544/5552/1 4985/4993/1 5534/5542/1 +f 5544/5552/1 5543/5551/1 4986/4994/1 4985/4993/1 +f 5546/5554/1 4981/4989/1 4984/4992/1 5547/5555/1 +f 5551/5559/1 5556/5564/1 4981/4989/1 5546/5554/1 +f 5556/5564/1 5555/5563/1 4982/4990/1 4981/4989/1 +f 5558/5566/1 4977/4985/1 4980/4988/1 5559/5567/1 +f 5563/5571/1 5568/5576/1 4977/4985/1 5558/5566/1 +f 5568/5576/1 5567/5575/1 4978/4986/1 4977/4985/1 +f 5570/5578/1 4973/4981/1 4976/4984/1 5571/5579/1 +f 5575/5583/1 5580/5588/1 4973/4981/1 5570/5578/1 +f 5580/5588/1 5579/5587/1 4974/4982/1 4973/4981/1 +f 5582/5590/1 4969/4977/1 4972/4980/1 5583/5591/1 +f 5587/5595/1 5592/5600/1 4969/4977/1 5582/5590/1 +f 5592/5600/1 5591/5599/1 4970/4978/1 4969/4977/1 +f 5594/5602/1 4965/4973/1 4968/4976/1 5595/5603/1 +f 5599/5607/1 5604/5612/1 4965/4973/1 5594/5602/1 +f 5604/5612/1 5603/5611/1 4966/4974/1 4965/4973/1 +f 5606/5614/1 4961/4969/1 4964/4972/1 5607/5615/1 +f 5611/5619/1 5616/5624/1 4961/4969/1 5606/5614/1 +f 5616/5624/1 5615/5623/1 4962/4970/1 4961/4969/1 +f 5618/5626/1 4957/4965/1 4960/4968/1 5619/5627/1 +f 5623/5631/1 5628/5636/1 4957/4965/1 5618/5626/1 +f 5628/5636/1 5627/5635/1 4958/4966/1 4957/4965/1 +f 5630/5638/1 4953/4961/1 4956/4964/1 5631/5639/1 +f 5635/5643/1 5640/5648/1 4953/4961/1 5630/5638/1 +f 5640/5648/1 5639/5647/1 4954/4962/1 4953/4961/1 +f 5642/5650/1 4949/4957/1 4952/4960/1 5643/5651/1 +f 5647/5655/1 5652/5660/1 4949/4957/1 5642/5650/1 +f 5652/5660/1 5651/5659/1 4950/4958/1 4949/4957/1 +f 5654/5662/1 4945/4953/1 4948/4956/1 5655/5663/1 +f 5659/5667/1 5664/5672/1 4945/4953/1 5654/5662/1 +f 5664/5672/1 5663/5671/1 4946/4954/1 4945/4953/1 +f 5666/5674/1 4941/4949/1 4944/4952/1 5667/5675/1 +f 5671/5679/1 5676/5684/1 4941/4949/1 5666/5674/1 +f 5676/5684/1 5675/5683/1 4942/4950/1 4941/4949/1 +f 5678/5686/1 4937/4945/1 4940/4948/1 5679/5687/1 +f 5683/5691/1 5688/5696/1 4937/4945/1 5678/5686/1 +f 5688/5696/1 5687/5695/1 4938/4946/1 4937/4945/1 +f 5690/5698/1 4933/4941/1 4936/4944/1 5691/5699/1 +f 5695/5703/1 5700/5708/1 4933/4941/1 5690/5698/1 +f 5700/5708/1 5699/5707/1 4934/4942/1 4933/4941/1 +f 5702/5710/1 4929/4937/1 4932/4940/1 5703/5711/1 +f 5707/5715/1 5712/5720/1 4929/4937/1 5702/5710/1 +f 5712/5720/1 5711/5719/1 4930/4938/1 4929/4937/1 +f 5714/5722/1 4925/4933/1 4928/4936/1 5715/5723/1 +f 5719/5727/1 5724/5732/1 4925/4933/1 5714/5722/1 +f 5724/5732/1 5723/5731/1 4926/4934/1 4925/4933/1 +f 5726/5734/1 4921/4929/1 4924/4932/1 5727/5735/1 +f 5731/5739/1 5736/5744/1 4921/4929/1 5726/5734/1 +f 5736/5744/1 5735/5743/1 4922/4930/1 4921/4929/1 +f 5738/5746/1 4917/4925/1 4920/4928/1 5739/5747/1 +f 5743/5751/1 5748/5756/1 4917/4925/1 5738/5746/1 +f 5748/5756/1 5747/5755/1 4918/4926/1 4917/4925/1 +f 5750/5758/1 4913/4921/1 4916/4924/1 5751/5759/1 +f 5755/5763/1 5760/5768/1 4913/4921/1 5750/5758/1 +f 5760/5768/1 5759/5767/1 4914/4922/1 4913/4921/1 +f 5762/5770/1 4909/4917/1 4912/4920/1 5763/5771/1 +f 5767/5775/1 5772/5780/1 4909/4917/1 5762/5770/1 +f 5772/5780/1 5771/5779/1 4910/4918/1 4909/4917/1 +f 5774/5782/1 4905/4913/1 4908/4916/1 5775/5783/1 +f 5779/5787/1 5784/5792/1 4905/4913/1 5774/5782/1 +f 5784/5792/1 5783/5791/1 4906/4914/1 4905/4913/1 +f 5786/5794/1 4901/4909/1 4904/4912/1 5787/5795/1 +f 5791/5799/1 5796/5804/1 4901/4909/1 5786/5794/1 +f 5796/5804/1 5795/5803/1 4902/4910/1 4901/4909/1 +f 5798/5806/1 4897/4905/1 4900/4908/1 5799/5807/1 +f 5803/5811/1 5808/5816/1 4897/4905/1 5798/5806/1 +f 5808/5816/1 5807/5815/1 4898/4906/1 4897/4905/1 +f 5810/5818/1 4893/4901/1 4896/4904/1 5811/5819/1 +f 5815/5823/1 5820/5828/1 4893/4901/1 5810/5818/1 +f 5820/5828/1 5819/5827/1 4894/4902/1 4893/4901/1 +f 5822/5830/1 4889/4897/1 4892/4900/1 5823/5831/1 +f 5827/5835/1 5832/5840/1 4889/4897/1 5822/5830/1 +f 5832/5840/1 5831/5839/1 4890/4898/1 4889/4897/1 +f 5834/5842/1 4885/4893/1 4888/4896/1 5835/5843/1 +f 5839/5847/1 5844/5852/1 4885/4893/1 5834/5842/1 +f 5844/5852/1 5843/5851/1 4886/4894/1 4885/4893/1 +f 5846/5854/1 4881/4889/1 4884/4892/1 5847/5855/1 +f 5851/5859/1 5856/5864/1 4881/4889/1 5846/5854/1 +f 5856/5864/1 5855/5863/1 4882/4890/1 4881/4889/1 +f 5858/5866/1 4877/4885/1 4880/4888/1 5859/5867/1 +f 5863/5871/1 5868/5876/1 4877/4885/1 5858/5866/1 +f 5868/5876/1 5867/5875/1 4878/4886/1 4877/4885/1 +f 5870/5878/1 4873/4881/1 4876/4884/1 5871/5879/1 +f 5875/5883/1 5880/5888/1 4873/4881/1 5870/5878/1 +f 5880/5888/1 5879/5887/1 4874/4882/1 4873/4881/1 +f 5882/5890/1 4869/4877/1 4872/4880/1 5883/5891/1 +f 5887/5895/1 5892/5900/1 4869/4877/1 5882/5890/1 +f 5892/5900/1 5891/5899/1 4870/4878/1 4869/4877/1 +f 5894/5902/1 4865/4873/1 4868/4876/1 5895/5903/1 +f 5899/5907/1 5904/5912/1 4865/4873/1 5894/5902/1 +f 5904/5912/1 5903/5911/1 4866/4874/1 4865/4873/1 +f 5906/5914/1 4861/4869/1 4864/4872/1 5907/5915/1 +f 5911/5919/1 5916/5924/1 4861/4869/1 5906/5914/1 +f 5916/5924/1 5915/5923/1 4862/4870/1 4861/4869/1 +f 5918/5926/1 4857/4865/1 4860/4868/1 5919/5927/1 +f 5923/5931/1 5928/5936/1 4857/4865/1 5918/5926/1 +f 5928/5936/1 5927/5935/1 4858/4866/1 4857/4865/1 +f 5930/5938/1 4853/4861/1 4856/4864/1 5931/5939/1 +f 5935/5943/1 5940/5948/1 4853/4861/1 5930/5938/1 +f 5940/5948/1 5939/5947/1 4854/4862/1 4853/4861/1 +f 5942/5950/1 4849/4857/1 4852/4860/1 5943/5951/1 +f 5947/5955/1 5952/5960/1 4849/4857/1 5942/5950/1 +f 5952/5960/1 5951/5959/1 4850/4858/1 4849/4857/1 +f 5954/5962/1 4845/4853/1 4848/4856/1 5955/5963/1 +f 5959/5967/1 5964/5972/1 4845/4853/1 5954/5962/1 +f 5964/5972/1 5963/5971/1 4846/4854/1 4845/4853/1 +f 5966/5974/1 4841/4849/1 4844/4852/1 5967/5975/1 +f 5971/5979/1 5976/5984/1 4841/4849/1 5966/5974/1 +f 5976/5984/1 5975/5983/1 4842/4850/1 4841/4849/1 +f 5978/5986/1 4837/4845/1 4840/4848/1 5979/5987/1 +f 5983/5991/1 5988/5996/1 4837/4845/1 5978/5986/1 +f 5988/5996/1 5987/5995/1 4838/4846/1 4837/4845/1 +f 5990/5998/1 4833/4841/1 4836/4844/1 5991/5999/1 +f 5995/6003/1 6000/6008/1 4833/4841/1 5990/5998/1 +f 6000/6008/1 5999/6007/1 4834/4842/1 4833/4841/1 +f 6002/6010/1 4829/4837/1 4832/4840/1 6003/6011/1 +f 6007/6015/1 6012/6020/1 4829/4837/1 6002/6010/1 +f 6012/6020/1 6011/6019/1 4830/4838/1 4829/4837/1 +f 6014/6022/1 4825/4833/1 4828/4836/1 6015/6023/1 +f 6019/6027/1 6024/6032/1 4825/4833/1 6014/6022/1 +f 6024/6032/1 6023/6031/1 4826/4834/1 4825/4833/1 +f 6026/6034/1 4821/4829/1 4824/4832/1 6027/6035/1 +f 6031/6039/1 6036/6044/1 4821/4829/1 6026/6034/1 +f 6036/6044/1 6035/6043/1 4822/4830/1 4821/4829/1 +f 6038/6046/1 4817/4825/1 4820/4828/1 6039/6047/1 +f 6043/6051/1 6048/6056/1 4817/4825/1 6038/6046/1 +f 6048/6056/1 6047/6055/1 4818/4826/1 4817/4825/1 +f 6050/6058/1 4813/4821/1 4816/4824/1 6051/6059/1 +f 6055/6063/1 6060/6068/1 4813/4821/1 6050/6058/1 +f 6060/6068/1 6059/6067/1 4814/4822/1 4813/4821/1 +f 6062/6070/1 4809/4817/1 4812/4820/1 6063/6071/1 +f 6067/6075/1 6072/6080/1 4809/4817/1 6062/6070/1 +f 6072/6080/1 6071/6079/1 4810/4818/1 4809/4817/1 +f 6074/6082/1 4805/4813/1 4808/4816/1 6075/6083/1 +f 6079/6087/1 6084/6092/1 4805/4813/1 6074/6082/1 +f 6084/6092/1 6083/6091/1 4806/4814/1 4805/4813/1 +f 6086/6094/1 4801/4809/1 4804/4812/1 6087/6095/1 +f 6091/6099/1 6096/6104/1 4801/4809/1 6086/6094/1 +f 6096/6104/1 6095/6103/1 4802/4810/1 4801/4809/1 +f 6098/6106/1 4797/4805/1 4800/4808/1 6099/6107/1 +f 6103/6111/1 6108/6116/1 4797/4805/1 6098/6106/1 +f 6108/6116/1 6107/6115/1 4798/4806/1 4797/4805/1 +f 6110/6118/1 4793/4801/1 4796/4804/1 6111/6119/1 +f 6115/6123/1 6120/6128/1 4793/4801/1 6110/6118/1 +f 6120/6128/1 6119/6127/1 4794/4802/1 4793/4801/1 +f 6122/6130/1 4789/4797/1 4792/4800/1 6123/6131/1 +f 6127/6135/1 6132/6140/1 4789/4797/1 6122/6130/1 +f 6132/6140/1 6131/6139/1 4790/4798/1 4789/4797/1 +f 6134/6142/1 4785/4793/1 4788/4796/1 6135/6143/1 +f 6139/6147/1 6144/6152/1 4785/4793/1 6134/6142/1 +f 6144/6152/1 6143/6151/1 4786/4794/1 4785/4793/1 +f 6146/6154/1 4781/4789/1 4784/4792/1 6147/6155/1 +f 6151/6159/1 6156/6164/1 4781/4789/1 6146/6154/1 +f 6156/6164/1 6155/6163/1 4782/4790/1 4781/4789/1 +f 6158/6166/1 4777/4785/1 4780/4788/1 6159/6167/1 +f 6163/6171/1 6168/6176/1 4777/4785/1 6158/6166/1 +f 6168/6176/1 6167/6175/1 4778/4786/1 4777/4785/1 +f 6170/6178/1 4773/4781/1 4776/4784/1 6171/6179/1 +f 6175/6183/1 6180/6188/1 4773/4781/1 6170/6178/1 +f 6180/6188/1 6179/6187/1 4774/4782/1 4773/4781/1 +f 6182/6190/1 4769/4777/1 4772/4780/1 6183/6191/1 +f 6187/6195/1 6192/6200/1 4769/4777/1 6182/6190/1 +f 6192/6200/1 6191/6199/1 4770/4778/1 4769/4777/1 +f 6194/6202/1 4765/4773/1 4768/4776/1 6195/6203/1 +f 6199/6207/1 6204/6212/1 4765/4773/1 6194/6202/1 +f 6204/6212/1 6203/6211/1 4766/4774/1 4765/4773/1 +f 6206/6214/1 4761/4769/1 4764/4772/1 6207/6215/1 +f 6211/6219/1 6216/6224/1 4761/4769/1 6206/6214/1 +f 6216/6224/1 6215/6223/1 4762/4770/1 4761/4769/1 +f 6218/6226/1 4757/4765/1 4760/4768/1 6219/6227/1 +f 6223/6231/1 6228/6236/1 4757/4765/1 6218/6226/1 +f 6228/6236/1 6227/6235/1 4758/4766/1 4757/4765/1 +f 6230/6238/1 4753/4761/1 4756/4764/1 6231/6239/1 +f 6235/6243/1 6240/6248/1 4753/4761/1 6230/6238/1 +f 6240/6248/1 6239/6247/1 4754/4762/1 4753/4761/1 +f 6242/6250/1 4749/4757/1 4752/4760/1 6243/6251/1 +f 6247/6255/1 6252/6260/1 4749/4757/1 6242/6250/1 +f 6252/6260/1 6251/6259/1 4750/4758/1 4749/4757/1 +f 6254/6262/1 4745/4753/1 4748/4756/1 6255/6263/1 +f 6259/6267/1 6264/6272/1 4745/4753/1 6254/6262/1 +f 6264/6272/1 6263/6271/1 4746/4754/1 4745/4753/1 +f 6266/6274/1 4741/4749/1 4744/4752/1 6267/6275/1 +f 6271/6279/1 6276/6284/1 4741/4749/1 6266/6274/1 +f 6276/6284/1 6275/6283/1 4742/4750/1 4741/4749/1 +f 6278/6286/1 4737/4745/1 4740/4748/1 6279/6287/1 +f 6283/6291/1 6288/6296/1 4737/4745/1 6278/6286/1 +f 6288/6296/1 6287/6295/1 4738/4746/1 4737/4745/1 +f 6290/6298/1 4733/4741/1 4736/4744/1 6291/6299/1 +f 6295/6303/1 6300/6308/1 4733/4741/1 6290/6298/1 +f 6300/6308/1 6299/6307/1 4734/4742/1 4733/4741/1 +f 6302/6310/1 4729/4737/1 4732/4740/1 6303/6311/1 +f 6307/6315/1 6312/6320/1 4729/4737/1 6302/6310/1 +f 6312/6320/1 6311/6319/1 4730/4738/1 4729/4737/1 +f 6314/6322/1 4725/4733/1 4728/4736/1 6315/6323/1 +f 6319/6327/1 6324/6332/1 4725/4733/1 6314/6322/1 +f 6324/6332/1 6323/6331/1 4726/4734/1 4725/4733/1 +f 6326/6334/1 4721/4729/1 4724/4732/1 6327/6335/1 +f 6331/6339/1 6336/6344/1 4721/4729/1 6326/6334/1 +f 6336/6344/1 6335/6343/1 4722/4730/1 4721/4729/1 +f 6338/6346/1 4717/4725/1 4720/4728/1 6339/6347/1 +f 6343/6351/1 6348/6356/1 4717/4725/1 6338/6346/1 +f 6348/6356/1 6347/6355/1 4718/4726/1 4717/4725/1 +f 6350/6358/1 4713/4721/1 4716/4724/1 6351/6359/1 +f 6355/6363/1 6360/6368/1 4713/4721/1 6350/6358/1 +f 6360/6368/1 6359/6367/1 4714/4722/1 4713/4721/1 +f 6362/6370/1 4709/4717/1 4712/4720/1 6363/6371/1 +f 6367/6375/1 6372/6380/1 4709/4717/1 6362/6370/1 +f 6372/6380/1 6371/6379/1 4710/4718/1 4709/4717/1 +f 6374/6382/1 4705/4713/1 4708/4716/1 6375/6383/1 +f 6379/6387/1 6384/6392/1 4705/4713/1 6374/6382/1 +f 6384/6392/1 6383/6391/1 4706/4714/1 4705/4713/1 +f 6386/6394/1 4701/4709/1 4704/4712/1 6387/6395/1 +f 6391/6399/1 6396/6404/1 4701/4709/1 6386/6394/1 +f 6396/6404/1 6395/6403/1 4702/4710/1 4701/4709/1 +f 6398/6406/1 4697/4705/1 4700/4708/1 6399/6407/1 +f 6403/6411/1 6408/6416/1 4697/4705/1 6398/6406/1 +f 6408/6416/1 6407/6415/1 4698/4706/1 4697/4705/1 +f 6410/6418/1 4693/4701/1 4696/4704/1 6411/6419/1 +f 6415/6423/1 6420/6428/1 4693/4701/1 6410/6418/1 +f 6420/6428/1 6419/6427/1 4694/4702/1 4693/4701/1 +f 6422/6430/1 4689/4697/1 4692/4700/1 6423/6431/1 +f 6427/6435/1 6432/6440/1 4689/4697/1 6422/6430/1 +f 6432/6440/1 6431/6439/1 4690/4698/1 4689/4697/1 +f 6434/6442/1 4685/4693/1 4688/4696/1 6435/6443/1 +f 6439/6447/1 6444/6452/1 4685/4693/1 6434/6442/1 +f 6444/6452/1 6443/6451/1 4686/4694/1 4685/4693/1 +f 6446/6454/1 4681/4689/1 4684/4692/1 6447/6455/1 +f 6451/6459/1 6456/6464/1 4681/4689/1 6446/6454/1 +f 6456/6464/1 6455/6463/1 4682/4690/1 4681/4689/1 +f 6458/6466/1 4677/4685/1 4680/4688/1 6459/6467/1 +f 6463/6471/1 6468/6476/1 4677/4685/1 6458/6466/1 +f 6468/6476/1 6467/6475/1 4678/4686/1 4677/4685/1 +f 6470/6478/1 4673/4681/1 4676/4684/1 6471/6479/1 +f 6475/6483/1 6480/6488/1 4673/4681/1 6470/6478/1 +f 6480/6488/1 6479/6487/1 4674/4682/1 4673/4681/1 +f 6482/6490/1 4669/4677/1 4672/4680/1 6483/6491/1 +f 6487/6495/1 6492/6500/1 4669/4677/1 6482/6490/1 +f 6492/6500/1 6491/6499/1 4670/4678/1 4669/4677/1 +f 6494/6502/1 4665/4673/1 4668/4676/1 6495/6503/1 +f 6499/6507/1 6504/6512/1 4665/4673/1 6494/6502/1 +f 6504/6512/1 6503/6511/1 4666/4674/1 4665/4673/1 +f 6506/6514/1 4661/4669/1 4664/4672/1 6507/6515/1 +f 6511/6519/1 6516/6524/1 4661/4669/1 6506/6514/1 +f 6516/6524/1 6515/6523/1 4662/4670/1 4661/4669/1 +f 6518/6526/1 4657/4665/1 4660/4668/1 6519/6527/1 +f 6523/6531/1 6528/6536/1 4657/4665/1 6518/6526/1 +f 6528/6536/1 6527/6535/1 4658/4666/1 4657/4665/1 +f 6530/6538/1 4653/4661/1 4656/4664/1 6531/6539/1 +f 6535/6543/1 6540/6548/1 4653/4661/1 6530/6538/1 +f 6540/6548/1 6539/6547/1 4654/4662/1 4653/4661/1 +f 6542/6550/1 4649/4657/1 4652/4660/1 6543/6551/1 +f 6547/6555/1 6552/6560/1 4649/4657/1 6542/6550/1 +f 6552/6560/1 6551/6559/1 4650/4658/1 4649/4657/1 +f 6554/6562/1 4645/4653/1 4648/4656/1 6555/6563/1 +f 6559/6567/1 6564/6572/1 4645/4653/1 6554/6562/1 +f 6564/6572/1 6563/6571/1 4646/4654/1 4645/4653/1 +f 6566/6574/1 4641/4649/1 4644/4652/1 6567/6575/1 +f 6571/6579/1 6576/6584/1 4641/4649/1 6566/6574/1 +f 6576/6584/1 6575/6583/1 4642/4650/1 4641/4649/1 +f 6578/6586/1 4637/4645/1 4640/4648/1 6579/6587/1 +f 6583/6591/1 6588/6596/1 4637/4645/1 6578/6586/1 +f 6588/6596/1 6587/6595/1 4638/4646/1 4637/4645/1 +f 6590/6598/1 4633/4641/1 4636/4644/1 6591/6599/1 +f 6595/6603/1 6600/6608/1 4633/4641/1 6590/6598/1 +f 6600/6608/1 6599/6607/1 4634/4642/1 4633/4641/1 +f 6602/6610/1 4629/4637/1 4632/4640/1 6603/6611/1 +f 6607/6615/1 6612/6620/1 4629/4637/1 6602/6610/1 +f 6612/6620/1 6611/6619/1 4630/4638/1 4629/4637/1 +f 6614/6622/1 4625/4633/1 4628/4636/1 6615/6623/1 +f 6619/6627/1 6624/6632/1 4625/4633/1 6614/6622/1 +f 6624/6632/1 6623/6631/1 4626/4634/1 4625/4633/1 +f 6626/6634/1 4621/4629/1 4624/4632/1 6627/6635/1 +f 6631/6639/1 6636/6644/1 4621/4629/1 6626/6634/1 +f 6636/6644/1 6635/6643/1 4622/4630/1 4621/4629/1 +f 6638/6646/1 4617/4625/1 4620/4628/1 6639/6647/1 +f 6643/6651/1 6648/6656/1 4617/4625/1 6638/6646/1 +f 6648/6656/1 6647/6655/1 4618/4626/1 4617/4625/1 +f 6650/6658/1 4613/4621/1 4616/4624/1 6651/6659/1 +f 6655/6663/1 6660/6668/1 4613/4621/1 6650/6658/1 +f 6660/6668/1 6659/6667/1 4614/4622/1 4613/4621/1 +f 6662/6670/1 4609/4617/1 4612/4620/1 6663/6671/1 +f 6667/6675/1 6672/6680/1 4609/4617/1 6662/6670/1 +f 6672/6680/1 6671/6679/1 4610/4618/1 4609/4617/1 +f 6674/6682/1 4605/4613/1 4608/4616/1 6675/6683/1 +f 6679/6687/1 6684/6692/1 4605/4613/1 6674/6682/1 +f 6684/6692/1 6683/6691/1 4606/4614/1 4605/4613/1 +f 6686/6694/1 4601/4609/1 4604/4612/1 6687/6695/1 +f 6691/6699/1 6696/6704/1 4601/4609/1 6686/6694/1 +f 6696/6704/1 6695/6703/1 4602/4610/1 4601/4609/1 +f 6698/6706/1 4597/4605/1 4600/4608/1 6699/6707/1 +f 6703/6711/1 6708/6716/1 4597/4605/1 6698/6706/1 +f 6708/6716/1 6707/6715/1 4598/4606/1 4597/4605/1 +f 6710/6718/1 4593/4601/1 4596/4604/1 6711/6719/1 +f 6715/6723/1 6720/6728/1 4593/4601/1 6710/6718/1 +f 6720/6728/1 6719/6727/1 4594/4602/1 4593/4601/1 +f 6722/6730/1 4589/4597/1 4592/4600/1 6723/6731/1 +f 6727/6735/1 6732/6740/1 4589/4597/1 6722/6730/1 +f 6732/6740/1 6731/6739/1 4590/4598/1 4589/4597/1 +f 6734/6742/1 4585/4593/1 4588/4596/1 6735/6743/1 +f 6739/6747/1 6744/6752/1 4585/4593/1 6734/6742/1 +f 6744/6752/1 6743/6751/1 4586/4594/1 4585/4593/1 +f 6746/6754/1 4581/4589/1 4584/4592/1 6747/6755/1 +f 6751/6759/1 6756/6764/1 4581/4589/1 6746/6754/1 +f 6756/6764/1 6755/6763/1 4582/4590/1 4581/4589/1 +f 6758/6766/1 4577/4585/1 4580/4588/1 6759/6767/1 +f 6763/6771/1 6768/6776/1 4577/4585/1 6758/6766/1 +f 6768/6776/1 6767/6775/1 4578/4586/1 4577/4585/1 +f 6770/6778/1 4573/4581/1 4576/4584/1 6771/6779/1 +f 6775/6783/1 6780/6788/1 4573/4581/1 6770/6778/1 +f 6780/6788/1 6779/6787/1 4574/4582/1 4573/4581/1 +f 6782/6790/1 4569/4577/1 4572/4580/1 6783/6791/1 +f 6787/6795/1 6792/6800/1 4569/4577/1 6782/6790/1 +f 6792/6800/1 6791/6799/1 4570/4578/1 4569/4577/1 +f 6794/6802/1 4565/4573/1 4568/4576/1 6795/6803/1 +f 6799/6807/1 6804/6812/1 4565/4573/1 6794/6802/1 +f 6804/6812/1 6803/6811/1 4566/4574/1 4565/4573/1 +f 6806/6814/1 4561/4569/1 4564/4572/1 6807/6815/1 +f 6811/6819/1 6816/6824/1 4561/4569/1 6806/6814/1 +f 6816/6824/1 6815/6823/1 4562/4570/1 4561/4569/1 +f 6818/6826/1 4557/4565/1 4560/4568/1 6819/6827/1 +f 6823/6831/1 6828/6836/1 4557/4565/1 6818/6826/1 +f 6828/6836/1 6827/6835/1 4558/4566/1 4557/4565/1 +f 6830/6838/1 4553/4561/1 4556/4564/1 6831/6839/1 +f 6835/6843/1 6840/6848/1 4553/4561/1 6830/6838/1 +f 6840/6848/1 6839/6847/1 4554/4562/1 4553/4561/1 +f 6842/6850/1 4549/4557/1 4552/4560/1 6843/6851/1 +f 6847/6855/1 6852/6860/1 4549/4557/1 6842/6850/1 +f 6852/6860/1 6851/6859/1 4550/4558/1 4549/4557/1 +f 6854/6862/1 4545/4553/1 4548/4556/1 6855/6863/1 +f 6859/6867/1 6864/6872/1 4545/4553/1 6854/6862/1 +f 6864/6872/1 6863/6871/1 4546/4554/1 4545/4553/1 +f 6866/6874/1 4541/4549/1 4544/4552/1 6867/6875/1 +f 6871/6879/1 6876/6884/1 4541/4549/1 6866/6874/1 +f 6876/6884/1 6875/6883/1 4542/4550/1 4541/4549/1 +f 6878/6886/1 4537/4545/1 4540/4548/1 6879/6887/1 +f 6883/6891/1 6888/6896/1 4537/4545/1 6878/6886/1 +f 6888/6896/1 6887/6895/1 4538/4546/1 4537/4545/1 +f 6890/6898/1 4533/4541/1 4536/4544/1 6891/6899/1 +f 6895/6903/1 6900/6908/1 4533/4541/1 6890/6898/1 +f 6900/6908/1 6899/6907/1 4534/4542/1 4533/4541/1 +f 6902/6910/1 4529/4537/1 4532/4540/1 6903/6911/1 +f 6907/6915/1 6912/6920/1 4529/4537/1 6902/6910/1 +f 6912/6920/1 6911/6919/1 4530/4538/1 4529/4537/1 +f 6914/6922/1 4525/4533/1 4528/4536/1 6915/6923/1 +f 6919/6927/1 6924/6932/1 4525/4533/1 6914/6922/1 +f 6924/6932/1 6923/6931/1 4526/4534/1 4525/4533/1 +f 6926/6934/1 4521/4529/1 4524/4532/1 6927/6935/1 +f 6931/6939/1 6936/6944/1 4521/4529/1 6926/6934/1 +f 6936/6944/1 6935/6943/1 4522/4530/1 4521/4529/1 +f 6938/6946/1 4517/4525/1 4520/4528/1 6939/6947/1 +f 6943/6951/1 6948/6956/1 4517/4525/1 6938/6946/1 +f 6948/6956/1 6947/6955/1 4518/4526/1 4517/4525/1 +f 6950/6958/1 4513/4521/1 4516/4524/1 6951/6959/1 +f 6955/6963/1 6960/6968/1 4513/4521/1 6950/6958/1 +f 6960/6968/1 6959/6967/1 4514/4522/1 4513/4521/1 +f 6962/6970/1 4509/4517/1 4512/4520/1 6963/6971/1 +f 6967/6975/1 6972/6980/1 4509/4517/1 6962/6970/1 +f 6972/6980/1 6971/6979/1 4510/4518/1 4509/4517/1 +f 6974/6982/1 4505/4513/1 4508/4516/1 6975/6983/1 +f 6979/6987/1 6984/6992/1 4505/4513/1 6974/6982/1 +f 6984/6992/1 6983/6991/1 4506/4514/1 4505/4513/1 +f 6986/6994/1 4501/4509/1 4504/4512/1 6987/6995/1 +f 6991/6999/1 6996/7004/1 4501/4509/1 6986/6994/1 +f 6996/7004/1 6995/7003/1 4502/4510/1 4501/4509/1 +f 6998/7006/1 4497/4505/1 4500/4508/1 6999/7007/1 +f 7003/7011/1 7008/7016/1 4497/4505/1 6998/7006/1 +f 7008/7016/1 7007/7015/1 4498/4506/1 4497/4505/1 +f 7010/7018/1 4493/4501/1 4496/4504/1 7011/7019/1 +f 7015/7023/1 7020/7028/1 4493/4501/1 7010/7018/1 +f 7020/7028/1 7019/7027/1 4494/4502/1 4493/4501/1 +f 7022/7030/1 4489/4497/1 4492/4500/1 7023/7031/1 +f 7027/7035/1 7032/7040/1 4489/4497/1 7022/7030/1 +f 7032/7040/1 7031/7039/1 4490/4498/1 4489/4497/1 +f 7034/7042/1 4485/4493/1 4488/4496/1 7035/7043/1 +f 7039/7047/1 7044/7052/1 4485/4493/1 7034/7042/1 +f 7044/7052/1 7043/7051/1 4486/4494/1 4485/4493/1 +f 7046/7054/1 4481/4489/1 4484/4492/1 7047/7055/1 +f 7051/7059/1 7056/7064/1 4481/4489/1 7046/7054/1 +f 7056/7064/1 7055/7063/1 4482/4490/1 4481/4489/1 +f 7058/7066/1 4477/4485/1 4480/4488/1 7059/7067/1 +f 7063/7071/1 7068/7076/1 4477/4485/1 7058/7066/1 +f 7068/7076/1 7067/7075/1 4478/4486/1 4477/4485/1 +f 7070/7078/1 4473/4481/1 4476/4484/1 7071/7079/1 +f 7075/7083/1 7080/7088/1 4473/4481/1 7070/7078/1 +f 7080/7088/1 7079/7087/1 4474/4482/1 4473/4481/1 +f 7082/7090/1 4469/4477/1 4472/4480/1 7083/7091/1 +f 7087/7095/1 7092/7100/1 4469/4477/1 7082/7090/1 +f 7092/7100/1 7091/7099/1 4470/4478/1 4469/4477/1 +f 7094/7102/1 4465/4473/1 4468/4476/1 7095/7103/1 +f 7099/7107/1 7104/7112/1 4465/4473/1 7094/7102/1 +f 7104/7112/1 7103/7111/1 4466/4474/1 4465/4473/1 +f 7106/7114/1 4461/4469/1 4464/4472/1 7107/7115/1 +f 7111/7119/1 7116/7124/1 4461/4469/1 7106/7114/1 +f 7116/7124/1 7115/7123/1 4462/4470/1 4461/4469/1 +f 7118/7126/1 4457/4465/1 4460/4468/1 7119/7127/1 +f 7123/7131/1 7128/7136/1 4457/4465/1 7118/7126/1 +f 7128/7136/1 7127/7135/1 4458/4466/1 4457/4465/1 +f 7130/7138/1 4453/4461/1 4456/4464/1 7131/7139/1 +f 7135/7143/1 7140/7148/1 4453/4461/1 7130/7138/1 +f 7140/7148/1 7139/7147/1 4454/4462/1 4453/4461/1 +f 7142/7150/1 4449/4457/1 4452/4460/1 7143/7151/1 +f 7147/7155/1 7152/7160/1 4449/4457/1 7142/7150/1 +f 7152/7160/1 7151/7159/1 4450/4458/1 4449/4457/1 +f 7154/7162/1 4445/4453/1 4448/4456/1 7155/7163/1 +f 7159/7167/1 7164/7172/1 4445/4453/1 7154/7162/1 +f 7164/7172/1 7163/7171/1 4446/4454/1 4445/4453/1 +f 7166/7174/1 4441/4449/1 4444/4452/1 7167/7175/1 +f 7171/7179/1 7176/7184/1 4441/4449/1 7166/7174/1 +f 7176/7184/1 7175/7183/1 4442/4450/1 4441/4449/1 +f 7178/7186/1 4437/4445/1 4440/4448/1 7179/7187/1 +f 7183/7191/1 7188/7196/1 4437/4445/1 7178/7186/1 +f 7188/7196/1 7187/7195/1 4438/4446/1 4437/4445/1 +f 7190/7198/1 4433/4441/1 4436/4444/1 7191/7199/1 +f 7195/7203/1 7200/7208/1 4433/4441/1 7190/7198/1 +f 7200/7208/1 7199/7207/1 4434/4442/1 4433/4441/1 +f 7202/7210/1 4429/4437/1 4432/4440/1 7203/7211/1 +f 7207/7215/1 7212/7220/1 4429/4437/1 7202/7210/1 +f 7212/7220/1 7211/7219/1 4430/4438/1 4429/4437/1 +f 7214/7222/1 4425/4433/1 4428/4436/1 7215/7223/1 +f 7219/7227/1 7224/7232/1 4425/4433/1 7214/7222/1 +f 7224/7232/1 7223/7231/1 4426/4434/1 4425/4433/1 +f 7226/7234/1 4421/4429/1 4424/4432/1 7227/7235/1 +f 7231/7239/1 7236/7244/1 4421/4429/1 7226/7234/1 +f 7236/7244/1 7235/7243/1 4422/4430/1 4421/4429/1 +f 7238/7246/1 4417/4425/1 4420/4428/1 7239/7247/1 +f 7243/7251/1 7248/7256/1 4417/4425/1 7238/7246/1 +f 7248/7256/1 7247/7255/1 4418/4426/1 4417/4425/1 +f 7250/7258/1 4413/4421/1 4416/4424/1 7251/7259/1 +f 7255/7263/1 7260/7268/1 4413/4421/1 7250/7258/1 +f 7260/7268/1 7259/7267/1 4414/4422/1 4413/4421/1 +f 7262/7270/1 4409/4417/1 4412/4420/1 7263/7271/1 +f 7267/7275/1 7272/7280/1 4409/4417/1 7262/7270/1 +f 7272/7280/1 7271/7279/1 4410/4418/1 4409/4417/1 +f 7274/7282/1 4405/4413/1 4408/4416/1 7275/7283/1 +f 7279/7287/1 7284/7292/1 4405/4413/1 7274/7282/1 +f 7284/7292/1 7283/7291/1 4406/4414/1 4405/4413/1 +f 7286/7294/1 4401/4409/1 4404/4412/1 7287/7295/1 +f 7291/7299/1 7296/7304/1 4401/4409/1 7286/7294/1 +f 7296/7304/1 7295/7303/1 4402/4410/1 4401/4409/1 +f 7298/7306/1 4397/4405/1 4400/4408/1 7299/7307/1 +f 7303/7311/1 7308/7316/1 4397/4405/1 7298/7306/1 +f 7308/7316/1 7307/7315/1 4398/4406/1 4397/4405/1 +f 7310/7318/1 4393/4401/1 4396/4404/1 7311/7319/1 +f 7315/7323/1 7320/7328/1 4393/4401/1 7310/7318/1 +f 7320/7328/1 7319/7327/1 4394/4402/1 4393/4401/1 +f 7322/7330/1 4389/4397/1 4392/4400/1 7323/7331/1 +f 7327/7335/1 7332/7340/1 4389/4397/1 7322/7330/1 +f 7332/7340/1 7331/7339/1 4390/4398/1 4389/4397/1 +f 7334/7342/1 4385/4393/1 4388/4396/1 7335/7343/1 +f 7339/7347/1 7344/7352/1 4385/4393/1 7334/7342/1 +f 7344/7352/1 7343/7351/1 4386/4394/1 4385/4393/1 +f 7346/7354/1 4381/4389/1 4384/4392/1 7347/7355/1 +f 7351/7359/1 7356/7364/1 4381/4389/1 7346/7354/1 +f 7356/7364/1 7355/7363/1 4382/4390/1 4381/4389/1 +f 7358/7366/1 4377/4385/1 4380/4388/1 7359/7367/1 +f 7363/7371/1 7368/7376/1 4377/4385/1 7358/7366/1 +f 7368/7376/1 7367/7375/1 4378/4386/1 4377/4385/1 +f 7370/7378/1 4373/4381/1 4376/4384/1 7371/7379/1 +f 7375/7383/1 7380/7388/1 4373/4381/1 7370/7378/1 +f 7380/7388/1 7379/7387/1 4374/4382/1 4373/4381/1 +f 7382/7390/1 4369/4377/1 4372/4380/1 7383/7391/1 +f 7387/7395/1 7392/7400/1 4369/4377/1 7382/7390/1 +f 7392/7400/1 7391/7399/1 4370/4378/1 4369/4377/1 +f 7394/7402/1 4365/4373/1 4368/4376/1 7395/7403/1 +f 7399/7407/1 7404/7412/1 4365/4373/1 7394/7402/1 +f 7404/7412/1 7403/7411/1 4366/4374/1 4365/4373/1 +f 7406/7414/1 4361/4369/1 4364/4372/1 7407/7415/1 +f 7411/7419/1 7416/7424/1 4361/4369/1 7406/7414/1 +f 7416/7424/1 7415/7423/1 4362/4370/1 4361/4369/1 +f 7418/7426/1 4357/4365/1 4360/4368/1 7419/7427/1 +f 7423/7431/1 7428/7436/1 4357/4365/1 7418/7426/1 +f 7428/7436/1 7427/7435/1 4358/4366/1 4357/4365/1 +f 7430/7438/1 4353/4361/1 4356/4364/1 7431/7439/1 +f 7435/7443/1 7440/7448/1 4353/4361/1 7430/7438/1 +f 7440/7448/1 7439/7447/1 4354/4362/1 4353/4361/1 +f 7442/7450/1 4349/4357/1 4352/4360/1 7443/7451/1 +f 7447/7455/1 7452/7460/1 4349/4357/1 7442/7450/1 +f 7452/7460/1 7451/7459/1 4350/4358/1 4349/4357/1 +f 7454/7462/1 4345/4353/1 4348/4356/1 7455/7463/1 +f 7459/7467/1 7464/7472/1 4345/4353/1 7454/7462/1 +f 7464/7472/1 7463/7471/1 4346/4354/1 4345/4353/1 +f 7466/7474/1 4341/4349/1 4344/4352/1 7467/7475/1 +f 7471/7479/1 7476/7484/1 4341/4349/1 7466/7474/1 +f 7476/7484/1 7475/7483/1 4342/4350/1 4341/4349/1 +f 7478/7486/1 4337/4345/1 4340/4348/1 7479/7487/1 +f 7483/7491/1 7488/7496/1 4337/4345/1 7478/7486/1 +f 7488/7496/1 7487/7495/1 4338/4346/1 4337/4345/1 +f 7490/7498/1 4333/4341/1 4336/4344/1 7491/7499/1 +f 7495/7503/1 7500/7508/1 4333/4341/1 7490/7498/1 +f 7500/7508/1 7499/7507/1 4334/4342/1 4333/4341/1 +f 7502/7510/1 4329/4337/1 4332/4340/1 7503/7511/1 +f 7507/7515/1 7512/7520/1 4329/4337/1 7502/7510/1 +f 7512/7520/1 7511/7519/1 4330/4338/1 4329/4337/1 +f 7514/7522/1 4325/4333/1 4328/4336/1 7515/7523/1 +f 7519/7527/1 7524/7532/1 4325/4333/1 7514/7522/1 +f 7524/7532/1 7523/7531/1 4326/4334/1 4325/4333/1 +f 7526/7534/1 4321/4329/1 4324/4332/1 7527/7535/1 +f 7531/7539/1 7536/7544/1 4321/4329/1 7526/7534/1 +f 7536/7544/1 7535/7543/1 4322/4330/1 4321/4329/1 +f 7538/7546/1 4317/4325/1 4320/4328/1 7539/7547/1 +f 7543/7551/1 7548/7556/1 4317/4325/1 7538/7546/1 +f 7548/7556/1 7547/7555/1 4318/4326/1 4317/4325/1 +f 7550/7558/1 4313/4321/1 4316/4324/1 7551/7559/1 +f 7555/7563/1 7560/7568/1 4313/4321/1 7550/7558/1 +f 7560/7568/1 7559/7567/1 4314/4322/1 4313/4321/1 +f 7562/7570/1 4309/4317/1 4312/4320/1 7563/7571/1 +f 7567/7575/1 7572/7580/1 4309/4317/1 7562/7570/1 +f 7572/7580/1 7571/7579/1 4310/4318/1 4309/4317/1 +f 7574/7582/1 4305/4313/1 4308/4316/1 7575/7583/1 +f 7579/7587/1 7584/7592/1 4305/4313/1 7574/7582/1 +f 7584/7592/1 7583/7591/1 4306/4314/1 4305/4313/1 +f 7586/7594/1 4301/4309/1 4304/4312/1 7587/7595/1 +f 7591/7599/1 7596/7604/1 4301/4309/1 7586/7594/1 +f 7596/7604/1 7595/7603/1 4302/4310/1 4301/4309/1 +f 7598/7606/1 4297/4305/1 4300/4308/1 7599/7607/1 +f 7603/7611/1 7608/7616/1 4297/4305/1 7598/7606/1 +f 7608/7616/1 7607/7615/1 4298/4306/1 4297/4305/1 +f 7610/7618/1 4293/4301/1 4296/4304/1 7611/7619/1 +f 7615/7623/1 7620/7628/1 4293/4301/1 7610/7618/1 +f 7620/7628/1 7619/7627/1 4294/4302/1 4293/4301/1 +f 7622/7630/1 4289/4297/1 4292/4300/1 7623/7631/1 +f 7627/7635/1 7632/7640/1 4289/4297/1 7622/7630/1 +f 7632/7640/1 7631/7639/1 4290/4298/1 4289/4297/1 +f 7634/7642/1 4285/4293/1 4288/4296/1 7635/7643/1 +f 7639/7647/1 7644/7652/1 4285/4293/1 7634/7642/1 +f 7644/7652/1 7643/7651/1 4286/4294/1 4285/4293/1 +f 7646/7654/1 4281/4289/1 4284/4292/1 7647/7655/1 +f 7651/7659/1 7656/7664/1 4281/4289/1 7646/7654/1 +f 7656/7664/1 7655/7663/1 4282/4290/1 4281/4289/1 +f 7658/7666/1 4277/4285/1 4280/4288/1 7659/7667/1 +f 7663/7671/1 7668/7676/1 4277/4285/1 7658/7666/1 +f 7668/7676/1 7667/7675/1 4278/4286/1 4277/4285/1 +f 7670/7678/1 4273/4281/1 4276/4284/1 7671/7679/1 +f 7675/7683/1 7680/7688/1 4273/4281/1 7670/7678/1 +f 7680/7688/1 7679/7687/1 4274/4282/1 4273/4281/1 +f 7682/7690/1 4269/4277/1 4272/4280/1 7683/7691/1 +f 7687/7695/1 7692/7700/1 4269/4277/1 7682/7690/1 +f 7692/7700/1 7691/7699/1 4270/4278/1 4269/4277/1 +f 7694/7702/1 4265/4273/1 4268/4276/1 7695/7703/1 +f 7699/7707/1 7704/7712/1 4265/4273/1 7694/7702/1 +f 7704/7712/1 7703/7711/1 4266/4274/1 4265/4273/1 +f 7706/7714/1 4261/4269/1 4264/4272/1 7707/7715/1 +f 7711/7719/1 7716/7724/1 4261/4269/1 7706/7714/1 +f 7716/7724/1 7715/7723/1 4262/4270/1 4261/4269/1 +f 7718/7726/1 4257/4265/1 4260/4268/1 7719/7727/1 +f 7723/7731/1 7728/7736/1 4257/4265/1 7718/7726/1 +f 7728/7736/1 7727/7735/1 4258/4266/1 4257/4265/1 +f 7730/7738/1 4253/4261/1 4256/4264/1 7731/7739/1 +f 7735/7743/1 7740/7748/1 4253/4261/1 7730/7738/1 +f 7740/7748/1 7739/7747/1 4254/4262/1 4253/4261/1 +f 7742/7750/1 4249/4257/1 4252/4260/1 7743/7751/1 +f 7747/7755/1 7752/7760/1 4249/4257/1 7742/7750/1 +f 7752/7760/1 7751/7759/1 4250/4258/1 4249/4257/1 +f 7754/7762/1 4245/4253/1 4248/4256/1 7755/7763/1 +f 7759/7767/1 7764/7772/1 4245/4253/1 7754/7762/1 +f 7764/7772/1 7763/7771/1 4246/4254/1 4245/4253/1 +f 7766/7774/1 4241/4249/1 4244/4252/1 7767/7775/1 +f 7771/7779/1 7776/7784/1 4241/4249/1 7766/7774/1 +f 7776/7784/1 7775/7783/1 4242/4250/1 4241/4249/1 +f 7778/7786/1 4237/4245/1 4240/4248/1 7779/7787/1 +f 7783/7791/1 7788/7796/1 4237/4245/1 7778/7786/1 +f 7788/7796/1 7787/7795/1 4238/4246/1 4237/4245/1 +f 7790/7798/1 4233/4241/1 4236/4244/1 7791/7799/1 +f 7795/7803/1 7800/7808/1 4233/4241/1 7790/7798/1 +f 7800/7808/1 7799/7807/1 4234/4242/1 4233/4241/1 +f 7802/7810/1 4229/4237/1 4232/4240/1 7803/7811/1 +f 7807/7815/1 7812/7820/1 4229/4237/1 7802/7810/1 +f 7812/7820/1 7811/7819/1 4230/4238/1 4229/4237/1 +f 7814/7822/1 4225/4233/1 4228/4236/1 7815/7823/1 +f 7819/7827/1 7824/7832/1 4225/4233/1 7814/7822/1 +f 7824/7832/1 7823/7831/1 4226/4234/1 4225/4233/1 +f 7826/7834/1 4221/4229/1 4224/4232/1 7827/7835/1 +f 7831/7839/1 7836/7844/1 4221/4229/1 7826/7834/1 +f 7836/7844/1 7835/7843/1 4222/4230/1 4221/4229/1 +f 7838/7846/1 4217/4225/1 4220/4228/1 7839/7847/1 +f 7843/7851/1 7848/7856/1 4217/4225/1 7838/7846/1 +f 7848/7856/1 7847/7855/1 4218/4226/1 4217/4225/1 +f 7850/7858/1 4213/4221/1 4216/4224/1 7851/7859/1 +f 7855/7863/1 7860/7868/1 4213/4221/1 7850/7858/1 +f 7860/7868/1 7859/7867/1 4214/4222/1 4213/4221/1 +f 7862/7870/1 4209/4217/1 4212/4220/1 7863/7871/1 +f 7867/7875/1 7872/7880/1 4209/4217/1 7862/7870/1 +f 7872/7880/1 7871/7879/1 4210/4218/1 4209/4217/1 +f 7874/7882/1 4205/4213/1 4208/4216/1 7875/7883/1 +f 7879/7887/1 7884/7892/1 4205/4213/1 7874/7882/1 +f 7884/7892/1 7883/7891/1 4206/4214/1 4205/4213/1 +f 7886/7894/1 4201/4209/1 4204/4212/1 7887/7895/1 +f 7891/7899/1 7896/7904/1 4201/4209/1 7886/7894/1 +f 7896/7904/1 7895/7903/1 4202/4210/1 4201/4209/1 +f 7898/7906/1 4197/4205/1 4200/4208/1 7899/7907/1 +f 7903/7911/1 7908/7916/1 4197/4205/1 7898/7906/1 +f 7908/7916/1 7907/7915/1 4198/4206/1 4197/4205/1 +f 7910/7918/1 4193/4201/1 4196/4204/1 7911/7919/1 +f 7915/7923/1 7920/7928/1 4193/4201/1 7910/7918/1 +f 7920/7928/1 7919/7927/1 4194/4202/1 4193/4201/1 +f 7922/7930/1 4189/4197/1 4192/4200/1 7923/7931/1 +f 7927/7935/1 7932/7940/1 4189/4197/1 7922/7930/1 +f 7932/7940/1 7931/7939/1 4190/4198/1 4189/4197/1 +f 7934/7942/1 4185/4193/1 4188/4196/1 7935/7943/1 +f 7939/7947/1 7944/7952/1 4185/4193/1 7934/7942/1 +f 7944/7952/1 7943/7951/1 4186/4194/1 4185/4193/1 +f 7946/7954/1 4181/4189/1 4184/4192/1 7947/7955/1 +f 7951/7959/1 7956/7964/1 4181/4189/1 7946/7954/1 +f 7956/7964/1 7955/7963/1 4182/4190/1 4181/4189/1 +f 7958/7966/1 4177/4185/1 4180/4188/1 7959/7967/1 +f 7963/7971/1 7968/7976/1 4177/4185/1 7958/7966/1 +f 7968/7976/1 7967/7975/1 4178/4186/1 4177/4185/1 +f 7970/7978/1 4173/4181/1 4176/4184/1 7971/7979/1 +f 7975/7983/1 7980/7988/1 4173/4181/1 7970/7978/1 +f 7980/7988/1 7979/7987/1 4174/4182/1 4173/4181/1 +f 7982/7990/1 4169/4177/1 4172/4180/1 7983/7991/1 +f 7987/7995/1 7992/8000/1 4169/4177/1 7982/7990/1 +f 7992/8000/1 7991/7999/1 4170/4178/1 4169/4177/1 +f 7994/8002/1 4165/4173/1 4168/4176/1 7995/8003/1 +f 7999/8007/1 8004/8012/1 4165/4173/1 7994/8002/1 +f 8004/8012/1 8003/8011/1 4166/4174/1 4165/4173/1 +f 8006/8014/1 4161/4169/1 4164/4172/1 8007/8015/1 +f 8011/8019/1 8016/8024/1 4161/4169/1 8006/8014/1 +f 8016/8024/1 8015/8023/1 4162/4170/1 4161/4169/1 +f 8018/8026/1 4157/4165/1 4160/4168/1 8019/8027/1 +f 8023/8031/1 8028/8036/1 4157/4165/1 8018/8026/1 +f 8028/8036/1 8027/8035/1 4158/4166/1 4157/4165/1 +f 8030/8038/1 4153/4161/1 4156/4164/1 8031/8039/1 +f 8035/8043/1 8040/8048/1 4153/4161/1 8030/8038/1 +f 8040/8048/1 8039/8047/1 4154/4162/1 4153/4161/1 +f 8042/8050/1 4149/4157/1 4152/4160/1 8043/8051/1 +f 8047/8055/1 8052/8060/1 4149/4157/1 8042/8050/1 +f 8052/8060/1 8051/8059/1 4150/4158/1 4149/4157/1 +f 8054/8062/1 4145/4153/1 4148/4156/1 8055/8063/1 +f 8059/8067/1 8064/8072/1 4145/4153/1 8054/8062/1 +f 8064/8072/1 8063/8071/1 4146/4154/1 4145/4153/1 +f 8066/8074/1 4141/4149/1 4144/4152/1 8067/8075/1 +f 8071/8079/1 8076/8084/1 4141/4149/1 8066/8074/1 +f 8076/8084/1 8075/8083/1 4142/4150/1 4141/4149/1 +f 8078/8086/1 4137/4145/1 4140/4148/1 8079/8087/1 +f 8083/8091/1 8088/8096/1 4137/4145/1 8078/8086/1 +f 8088/8096/1 8087/8095/1 4138/4146/1 4137/4145/1 +f 8090/8098/1 4133/4141/1 4136/4144/1 8091/8099/1 +f 8095/8103/1 8100/8108/1 4133/4141/1 8090/8098/1 +f 8100/8108/1 8099/8107/1 4134/4142/1 4133/4141/1 +f 8102/8110/1 4129/4137/1 4132/4140/1 8103/8111/1 +f 8107/8115/1 8112/8120/1 4129/4137/1 8102/8110/1 +f 8112/8120/1 8111/8119/1 4130/4138/1 4129/4137/1 +f 8114/8122/1 4125/4133/1 4128/4136/1 8115/8123/1 +f 8119/8127/1 8124/8132/1 4125/4133/1 8114/8122/1 +f 8124/8132/1 8123/8131/1 4126/4134/1 4125/4133/1 +f 8126/8134/1 4121/4129/1 4124/4132/1 8127/8135/1 +f 8131/8139/1 8136/8144/1 4121/4129/1 8126/8134/1 +f 8136/8144/1 8135/8143/1 4122/4130/1 4121/4129/1 +f 8138/8146/1 4117/4125/1 4120/4128/1 8139/8147/1 +f 8143/8151/1 8148/8156/1 4117/4125/1 8138/8146/1 +f 8148/8156/1 8147/8155/1 4118/4126/1 4117/4125/1 +f 8150/8158/1 4113/4121/1 4116/4124/1 8151/8159/1 +f 8155/8163/1 8160/8168/1 4113/4121/1 8150/8158/1 +f 8160/8168/1 8159/8167/1 4114/4122/1 4113/4121/1 +f 8162/8170/1 4109/4117/1 4112/4120/1 8163/8171/1 +f 8167/8175/1 8172/8180/1 4109/4117/1 8162/8170/1 +f 8172/8180/1 8171/8179/1 4110/4118/1 4109/4117/1 +f 8174/8182/1 4105/4113/1 4108/4116/1 8175/8183/1 +f 8179/8187/1 8184/8192/1 4105/4113/1 8174/8182/1 +f 8184/8192/1 8183/8191/1 4106/4114/1 4105/4113/1 +f 8186/8194/1 4101/4109/1 4104/4112/1 8187/8195/1 +f 8191/8199/1 8196/8204/1 4101/4109/1 8186/8194/1 +f 8196/8204/1 8195/8203/1 4102/4110/1 4101/4109/1 +f 8198/8206/1 4097/4105/1 4100/4108/1 8199/8207/1 +f 8203/8211/1 8208/8216/1 4097/4105/1 8198/8206/1 +f 8208/8216/1 8207/8215/1 4098/4106/1 4097/4105/1 +f 8210/8218/1 4093/4101/1 4096/4104/1 8211/8219/1 +f 8215/8223/1 8220/8228/1 4093/4101/1 8210/8218/1 +f 8220/8228/1 8219/8227/1 4094/4102/1 4093/4101/1 +f 8222/8230/1 4089/4097/1 4092/4100/1 8223/8231/1 +f 8227/8235/1 8232/8240/1 4089/4097/1 8222/8230/1 +f 8232/8240/1 8231/8239/1 4090/4098/1 4089/4097/1 +f 8234/8242/1 4085/4093/1 4088/4096/1 8235/8243/1 +f 8239/8247/1 8244/8252/1 4085/4093/1 8234/8242/1 +f 8244/8252/1 8243/8251/1 4086/4094/1 4085/4093/1 +f 8246/8254/1 4081/4089/1 4084/4092/1 8247/8255/1 +f 8251/8259/1 8256/8264/1 4081/4089/1 8246/8254/1 +f 8256/8264/1 8255/8263/1 4082/4090/1 4081/4089/1 +f 8258/8266/1 4077/4085/1 4080/4088/1 8259/8267/1 +f 8263/8271/1 8268/8276/1 4077/4085/1 8258/8266/1 +f 8268/8276/1 8267/8275/1 4078/4086/1 4077/4085/1 +f 8270/8278/1 4073/4081/1 4076/4084/1 8271/8279/1 +f 8275/8283/1 8280/8288/1 4073/4081/1 8270/8278/1 +f 8280/8288/1 8279/8287/1 4074/4082/1 4073/4081/1 +f 8282/8290/1 4069/4077/1 4072/4080/1 8283/8291/1 +f 8287/8295/1 8292/8300/1 4069/4077/1 8282/8290/1 +f 8292/8300/1 8291/8299/1 4070/4078/1 4069/4077/1 +f 8294/8302/1 4065/4073/1 4068/4076/1 8295/8303/1 +f 8299/8307/1 8304/8312/1 4065/4073/1 8294/8302/1 +f 8304/8312/1 8303/8311/1 4066/4074/1 4065/4073/1 +f 8306/8314/1 4061/4069/1 4064/4072/1 8307/8315/1 +f 8311/8319/1 8316/8324/1 4061/4069/1 8306/8314/1 +f 8316/8324/1 8315/8323/1 4062/4070/1 4061/4069/1 +f 8318/8326/1 4057/4065/1 4060/4068/1 8319/8327/1 +f 8323/8331/1 8328/8336/1 4057/4065/1 8318/8326/1 +f 8328/8336/1 8327/8335/1 4058/4066/1 4057/4065/1 +f 8330/8338/1 4053/4061/1 4056/4064/1 8331/8339/1 +f 8335/8343/1 8340/8348/1 4053/4061/1 8330/8338/1 +f 8340/8348/1 8339/8347/1 4054/4062/1 4053/4061/1 +f 8342/8350/1 4049/4057/1 4052/4060/1 8343/8351/1 +f 8347/8355/1 8352/8360/1 4049/4057/1 8342/8350/1 +f 8352/8360/1 8351/8359/1 4050/4058/1 4049/4057/1 +f 8354/8362/1 4045/4053/1 4048/4056/1 8355/8363/1 +f 8359/8367/1 8364/8372/1 4045/4053/1 8354/8362/1 +f 8364/8372/1 8363/8371/1 4046/4054/1 4045/4053/1 +f 8366/8374/1 4041/4049/1 4044/4052/1 8367/8375/1 +f 8371/8379/1 8376/8384/1 4041/4049/1 8366/8374/1 +f 8376/8384/1 8375/8383/1 4042/4050/1 4041/4049/1 +f 8378/8386/1 4037/4045/1 4040/4048/1 8379/8387/1 +f 8383/8391/1 8388/8396/1 4037/4045/1 8378/8386/1 +f 8388/8396/1 8387/8395/1 4038/4046/1 4037/4045/1 +f 8390/8398/1 4033/4041/1 4036/4044/1 8391/8399/1 +f 8395/8403/1 8400/8408/1 4033/4041/1 8390/8398/1 +f 8400/8408/1 8399/8407/1 4034/4042/1 4033/4041/1 +f 8402/8410/1 4029/4037/1 4032/4040/1 8403/8411/1 +f 8407/8415/1 8412/8420/1 4029/4037/1 8402/8410/1 +f 8412/8420/1 8411/8419/1 4030/4038/1 4029/4037/1 +f 8414/8422/1 4025/4033/1 4028/4036/1 8415/8423/1 +f 8419/8427/1 8424/8432/1 4025/4033/1 8414/8422/1 +f 8424/8432/1 8423/8431/1 4026/4034/1 4025/4033/1 +f 8426/8434/1 4021/4029/1 4024/4032/1 8427/8435/1 +f 8431/8439/1 8436/8444/1 4021/4029/1 8426/8434/1 +f 8436/8444/1 8435/8443/1 4022/4030/1 4021/4029/1 +f 8438/8446/1 4017/4025/1 4020/4028/1 8439/8447/1 +f 8443/8451/1 8448/8456/1 4017/4025/1 8438/8446/1 +f 8448/8456/1 8447/8455/1 4018/4026/1 4017/4025/1 +f 8450/8458/1 4013/4021/1 4016/4024/1 8451/8459/1 +f 8455/8463/1 8460/8468/1 4013/4021/1 8450/8458/1 +f 8460/8468/1 8459/8467/1 4014/4022/1 4013/4021/1 +f 8462/8470/1 4009/4017/1 4012/4020/1 8463/8471/1 +f 8467/8475/1 8472/8480/1 4009/4017/1 8462/8470/1 +f 8472/8480/1 8471/8479/1 4010/4018/1 4009/4017/1 +f 8474/8482/1 4005/4013/1 4008/4016/1 8475/8483/1 +f 8479/8487/1 8484/8492/1 4005/4013/1 8474/8482/1 +f 8484/8492/1 8483/8491/1 4006/4014/1 4005/4013/1 +f 8486/8494/1 4001/4009/1 4004/4012/1 8487/8495/1 +f 8491/8499/1 8496/8504/1 4001/4009/1 8486/8494/1 +f 8496/8504/1 8495/8503/1 4002/4010/1 4001/4009/1 +f 8498/8506/1 3997/4005/1 4000/4008/1 8499/8507/1 +f 8503/8511/1 8508/8516/1 3997/4005/1 8498/8506/1 +f 8508/8516/1 8507/8515/1 3998/4006/1 3997/4005/1 +f 8510/8518/1 3993/4001/1 3996/4004/1 8511/8519/1 +f 8515/8523/1 8520/8528/1 3993/4001/1 8510/8518/1 +f 8520/8528/1 8519/8527/1 3994/4002/1 3993/4001/1 +f 8522/8530/1 3989/3997/1 3992/4000/1 8523/8531/1 +f 8527/8535/1 8532/8540/1 3989/3997/1 8522/8530/1 +f 8532/8540/1 8531/8539/1 3990/3998/1 3989/3997/1 +f 8534/8542/1 3985/3993/1 3988/3996/1 8535/8543/1 +f 8539/8547/1 8544/8552/1 3985/3993/1 8534/8542/1 +f 8544/8552/1 8543/8551/1 3986/3994/1 3985/3993/1 +f 8546/8554/1 3981/3989/1 3984/3992/1 8547/8555/1 +f 8551/8559/1 8556/8564/1 3981/3989/1 8546/8554/1 +f 8556/8564/1 8555/8563/1 3982/3990/1 3981/3989/1 +f 8558/8566/1 3977/3985/1 3980/3988/1 8559/8567/1 +f 8563/8571/1 8568/8576/1 3977/3985/1 8558/8566/1 +f 8568/8576/1 8567/8575/1 3978/3986/1 3977/3985/1 +f 8570/8578/1 3973/3981/1 3976/3984/1 8571/8579/1 +f 8575/8583/1 8580/8588/1 3973/3981/1 8570/8578/1 +f 8580/8588/1 8579/8587/1 3974/3982/1 3973/3981/1 +f 8582/8590/1 3969/3977/1 3972/3980/1 8583/8591/1 +f 8587/8595/1 8592/8600/1 3969/3977/1 8582/8590/1 +f 8592/8600/1 8591/8599/1 3970/3978/1 3969/3977/1 +f 8594/8602/1 3965/3973/1 3968/3976/1 8595/8603/1 +f 8599/8607/1 8604/8612/1 3965/3973/1 8594/8602/1 +f 8604/8612/1 8603/8611/1 3966/3974/1 3965/3973/1 +f 8606/8614/1 3961/3969/1 3964/3972/1 8607/8615/1 +f 8611/8619/1 8616/8624/1 3961/3969/1 8606/8614/1 +f 8616/8624/1 8615/8623/1 3962/3970/1 3961/3969/1 +f 8618/8626/1 3957/3965/1 3960/3968/1 8619/8627/1 +f 8623/8631/1 8628/8636/1 3957/3965/1 8618/8626/1 +f 8628/8636/1 8627/8635/1 3958/3966/1 3957/3965/1 +f 8630/8638/1 3953/3961/1 3956/3964/1 8631/8639/1 +f 8635/8643/1 8640/8648/1 3953/3961/1 8630/8638/1 +f 8640/8648/1 8639/8647/1 3954/3962/1 3953/3961/1 +f 8642/8650/1 3949/3957/1 3952/3960/1 8643/8651/1 +f 8647/8655/1 8652/8660/1 3949/3957/1 8642/8650/1 +f 8652/8660/1 8651/8659/1 3950/3958/1 3949/3957/1 +f 8654/8662/1 3945/3953/1 3948/3956/1 8655/8663/1 +f 8659/8667/1 8664/8672/1 3945/3953/1 8654/8662/1 +f 8664/8672/1 8663/8671/1 3946/3954/1 3945/3953/1 +f 8666/8674/1 3941/3949/1 3944/3952/1 8667/8675/1 +f 8671/8679/1 8676/8684/1 3941/3949/1 8666/8674/1 +f 8676/8684/1 8675/8683/1 3942/3950/1 3941/3949/1 +f 8678/8686/1 3937/3945/1 3940/3948/1 8679/8687/1 +f 8683/8691/1 8688/8696/1 3937/3945/1 8678/8686/1 +f 8688/8696/1 8687/8695/1 3938/3946/1 3937/3945/1 +f 8690/8698/1 3933/3941/1 3936/3944/1 8691/8699/1 +f 8695/8703/1 8700/8708/1 3933/3941/1 8690/8698/1 +f 8700/8708/1 8699/8707/1 3934/3942/1 3933/3941/1 +f 8702/8710/1 3929/3937/1 3932/3940/1 8703/8711/1 +f 8707/8715/1 8712/8720/1 3929/3937/1 8702/8710/1 +f 8712/8720/1 8711/8719/1 3930/3938/1 3929/3937/1 +f 8714/8722/1 3925/3933/1 3928/3936/1 8715/8723/1 +f 8719/8727/1 8724/8732/1 3925/3933/1 8714/8722/1 +f 8724/8732/1 8723/8731/1 3926/3934/1 3925/3933/1 +f 8726/8734/1 3921/3929/1 3924/3932/1 8727/8735/1 +f 8731/8739/1 8736/8744/1 3921/3929/1 8726/8734/1 +f 8736/8744/1 8735/8743/1 3922/3930/1 3921/3929/1 +f 8738/8746/1 3917/3925/1 3920/3928/1 8739/8747/1 +f 8743/8751/1 8748/8756/1 3917/3925/1 8738/8746/1 +f 8748/8756/1 8747/8755/1 3918/3926/1 3917/3925/1 +f 8750/8758/1 3913/3921/1 3916/3924/1 8751/8759/1 +f 8755/8763/1 8760/8768/1 3913/3921/1 8750/8758/1 +f 8760/8768/1 8759/8767/1 3914/3922/1 3913/3921/1 +f 8762/8770/1 3909/3917/1 3912/3920/1 8763/8771/1 +f 8767/8775/1 8772/8780/1 3909/3917/1 8762/8770/1 +f 8772/8780/1 8771/8779/1 3910/3918/1 3909/3917/1 +f 8774/8782/1 3905/3913/1 3908/3916/1 8775/8783/1 +f 8779/8787/1 8784/8792/1 3905/3913/1 8774/8782/1 +f 8784/8792/1 8783/8791/1 3906/3914/1 3905/3913/1 +f 8786/8794/1 3901/3909/1 3904/3912/1 8787/8795/1 +f 8791/8799/1 8796/8804/1 3901/3909/1 8786/8794/1 +f 8796/8804/1 8795/8803/1 3902/3910/1 3901/3909/1 +f 8798/8806/1 3897/3905/1 3900/3908/1 8799/8807/1 +f 8803/8811/1 8808/8816/1 3897/3905/1 8798/8806/1 +f 8808/8816/1 8807/8815/1 3898/3906/1 3897/3905/1 +f 8810/8818/1 3893/3901/1 3896/3904/1 8811/8819/1 +f 8815/8823/1 8820/8828/1 3893/3901/1 8810/8818/1 +f 8820/8828/1 8819/8827/1 3894/3902/1 3893/3901/1 +f 8822/8830/1 3889/3897/1 3892/3900/1 8823/8831/1 +f 8827/8835/1 8832/8840/1 3889/3897/1 8822/8830/1 +f 8832/8840/1 8831/8839/1 3890/3898/1 3889/3897/1 +f 8834/8842/1 3885/3893/1 3888/3896/1 8835/8843/1 +f 8839/8847/1 8844/8852/1 3885/3893/1 8834/8842/1 +f 8844/8852/1 8843/8851/1 3886/3894/1 3885/3893/1 +f 8846/8854/1 3881/3889/1 3884/3892/1 8847/8855/1 +f 8851/8859/1 8856/8864/1 3881/3889/1 8846/8854/1 +f 8856/8864/1 8855/8863/1 3882/3890/1 3881/3889/1 +f 8858/8866/1 3877/3885/1 3880/3888/1 8859/8867/1 +f 8863/8871/1 8868/8876/1 3877/3885/1 8858/8866/1 +f 8868/8876/1 8867/8875/1 3878/3886/1 3877/3885/1 +f 8870/8878/1 3873/3881/1 3876/3884/1 8871/8879/1 +f 8875/8883/1 8880/8888/1 3873/3881/1 8870/8878/1 +f 8880/8888/1 8879/8887/1 3874/3882/1 3873/3881/1 +f 8882/8890/1 3869/3877/1 3872/3880/1 8883/8891/1 +f 8887/8895/1 8892/8900/1 3869/3877/1 8882/8890/1 +f 8892/8900/1 8891/8899/1 3870/3878/1 3869/3877/1 +f 8894/8902/1 3865/3873/1 3868/3876/1 8895/8903/1 +f 8899/8907/1 8904/8912/1 3865/3873/1 8894/8902/1 +f 8904/8912/1 8903/8911/1 3866/3874/1 3865/3873/1 +f 8906/8914/1 3861/3869/1 3864/3872/1 8907/8915/1 +f 8911/8919/1 8916/8924/1 3861/3869/1 8906/8914/1 +f 8916/8924/1 8915/8923/1 3862/3870/1 3861/3869/1 +f 8918/8926/1 3857/3865/1 3860/3868/1 8919/8927/1 +f 8923/8931/1 8928/8936/1 3857/3865/1 8918/8926/1 +f 8928/8936/1 8927/8935/1 3858/3866/1 3857/3865/1 +f 8930/8938/1 3853/3861/1 3856/3864/1 8931/8939/1 +f 8935/8943/1 8940/8948/1 3853/3861/1 8930/8938/1 +f 8940/8948/1 8939/8947/1 3854/3862/1 3853/3861/1 +f 8942/8950/1 3849/3857/1 3852/3860/1 8943/8951/1 +f 8947/8955/1 8952/8960/1 3849/3857/1 8942/8950/1 +f 8952/8960/1 8951/8959/1 3850/3858/1 3849/3857/1 +f 8954/8962/1 3845/3853/1 3848/3856/1 8955/8963/1 +f 8959/8967/1 8964/8972/1 3845/3853/1 8954/8962/1 +f 8964/8972/1 8963/8971/1 3846/3854/1 3845/3853/1 +f 8966/8974/1 3841/3849/1 3844/3852/1 8967/8975/1 +f 8971/8979/1 8976/8984/1 3841/3849/1 8966/8974/1 +f 8976/8984/1 8975/8983/1 3842/3850/1 3841/3849/1 +f 8978/8986/1 3837/3845/1 3840/3848/1 8979/8987/1 +f 8983/8991/1 8988/8996/1 3837/3845/1 8978/8986/1 +f 8988/8996/1 8987/8995/1 3838/3846/1 3837/3845/1 +f 8990/8998/1 3833/3841/1 3836/3844/1 8991/8999/1 +f 8995/9003/1 9000/9008/1 3833/3841/1 8990/8998/1 +f 9000/9008/1 8999/9007/1 3834/3842/1 3833/3841/1 +f 9002/9010/1 3829/3837/1 3832/3840/1 9003/9011/1 +f 9007/9015/1 9012/9020/1 3829/3837/1 9002/9010/1 +f 9012/9020/1 9011/9019/1 3830/3838/1 3829/3837/1 +f 9014/9022/1 3825/3833/1 3828/3836/1 9015/9023/1 +f 9019/9027/1 9024/9032/1 3825/3833/1 9014/9022/1 +f 9024/9032/1 9023/9031/1 3826/3834/1 3825/3833/1 +f 9026/9034/1 3821/3829/1 3824/3832/1 9027/9035/1 +f 9031/9039/1 9036/9044/1 3821/3829/1 9026/9034/1 +f 9036/9044/1 9035/9043/1 3822/3830/1 3821/3829/1 +f 9038/9046/1 3817/3825/1 3820/3828/1 9039/9047/1 +f 9043/9051/1 9048/9056/1 3817/3825/1 9038/9046/1 +f 9048/9056/1 9047/9055/1 3818/3826/1 3817/3825/1 +f 9050/9058/1 3813/3821/1 3816/3824/1 9051/9059/1 +f 9055/9063/1 9060/9068/1 3813/3821/1 9050/9058/1 +f 9060/9068/1 9059/9067/1 3814/3822/1 3813/3821/1 +f 9062/9070/1 3809/3817/1 3812/3820/1 9063/9071/1 +f 9067/9075/1 9072/9080/1 3809/3817/1 9062/9070/1 +f 9072/9080/1 9071/9079/1 3810/3818/1 3809/3817/1 +f 9074/9082/1 3805/3813/1 3808/3816/1 9075/9083/1 +f 9079/9087/1 9084/9092/1 3805/3813/1 9074/9082/1 +f 9084/9092/1 9083/9091/1 3806/3814/1 3805/3813/1 +f 9086/9094/1 3801/3809/1 3804/3812/1 9087/9095/1 +f 9091/9099/1 9096/9104/1 3801/3809/1 9086/9094/1 +f 9096/9104/1 9095/9103/1 3802/3810/1 3801/3809/1 +f 9098/9106/1 3797/3805/1 3800/3808/1 9099/9107/1 +f 9103/9111/1 9108/9116/1 3797/3805/1 9098/9106/1 +f 9108/9116/1 9107/9115/1 3798/3806/1 3797/3805/1 +f 9110/9118/1 3793/3801/1 3796/3804/1 9111/9119/1 +f 9115/9123/1 9120/9128/1 3793/3801/1 9110/9118/1 +f 9120/9128/1 9119/9127/1 3794/3802/1 3793/3801/1 +f 9122/9130/1 3789/3797/1 3792/3800/1 9123/9131/1 +f 9127/9135/1 9132/9140/1 3789/3797/1 9122/9130/1 +f 9132/9140/1 9131/9139/1 3790/3798/1 3789/3797/1 +f 9134/9142/1 3785/3793/1 3788/3796/1 9135/9143/1 +f 9139/9147/1 9144/9152/1 3785/3793/1 9134/9142/1 +f 9144/9152/1 9143/9151/1 3786/3794/1 3785/3793/1 +f 9146/9154/1 3781/3789/1 3784/3792/1 9147/9155/1 +f 9151/9159/1 9156/9164/1 3781/3789/1 9146/9154/1 +f 9156/9164/1 9155/9163/1 3782/3790/1 3781/3789/1 +f 9158/9166/1 3777/3785/1 3780/3788/1 9159/9167/1 +f 9163/9171/1 9168/9176/1 3777/3785/1 9158/9166/1 +f 9168/9176/1 9167/9175/1 3778/3786/1 3777/3785/1 +f 9170/9178/1 3773/3781/1 3776/3784/1 9171/9179/1 +f 9175/9183/1 9180/9188/1 3773/3781/1 9170/9178/1 +f 9180/9188/1 9179/9187/1 3774/3782/1 3773/3781/1 +f 9182/9190/1 3769/3777/1 3772/3780/1 9183/9191/1 +f 9187/9195/1 9192/9200/1 3769/3777/1 9182/9190/1 +f 9192/9200/1 9191/9199/1 3770/3778/1 3769/3777/1 +f 9194/9202/1 3765/3773/1 3768/3776/1 9195/9203/1 +f 9199/9207/1 9204/9212/1 3765/3773/1 9194/9202/1 +f 9204/9212/1 9203/9211/1 3766/3774/1 3765/3773/1 +f 9206/9214/1 3761/3769/1 3764/3772/1 9207/9215/1 +f 9211/9219/1 9216/9224/1 3761/3769/1 9206/9214/1 +f 9216/9224/1 9215/9223/1 3762/3770/1 3761/3769/1 +f 9218/9226/1 3757/3765/1 3760/3768/1 9219/9227/1 +f 9223/9231/1 9228/9236/1 3757/3765/1 9218/9226/1 +f 9228/9236/1 9227/9235/1 3758/3766/1 3757/3765/1 +f 9230/9238/1 3753/3761/1 3756/3764/1 9231/9239/1 +f 9235/9243/1 9240/9248/1 3753/3761/1 9230/9238/1 +f 9240/9248/1 9239/9247/1 3754/3762/1 3753/3761/1 +f 9242/9250/1 3749/3757/1 3752/3760/1 9243/9251/1 +f 9247/9255/1 9252/9260/1 3749/3757/1 9242/9250/1 +f 9252/9260/1 9251/9259/1 3750/3758/1 3749/3757/1 +f 9254/9262/1 3745/3753/1 3748/3756/1 9255/9263/1 +f 9259/9267/1 9264/9272/1 3745/3753/1 9254/9262/1 +f 9264/9272/1 9263/9271/1 3746/3754/1 3745/3753/1 +f 9266/9274/1 3741/3749/1 3744/3752/1 9267/9275/1 +f 9271/9279/1 9276/9284/1 3741/3749/1 9266/9274/1 +f 9276/9284/1 9275/9283/1 3742/3750/1 3741/3749/1 +f 9278/9286/1 3737/3745/1 3740/3748/1 9279/9287/1 +f 9283/9291/1 9288/9296/1 3737/3745/1 9278/9286/1 +f 9288/9296/1 9287/9295/1 3738/3746/1 3737/3745/1 +f 9290/9298/1 3733/3741/1 3736/3744/1 9291/9299/1 +f 9295/9303/1 9300/9308/1 3733/3741/1 9290/9298/1 +f 9300/9308/1 9299/9307/1 3734/3742/1 3733/3741/1 +f 9302/9310/1 3729/3737/1 3732/3740/1 9303/9311/1 +f 9307/9315/1 9312/9320/1 3729/3737/1 9302/9310/1 +f 9312/9320/1 9311/9319/1 3730/3738/1 3729/3737/1 +f 9314/9322/1 3725/3733/1 3728/3736/1 9315/9323/1 +f 9319/9327/1 9324/9332/1 3725/3733/1 9314/9322/1 +f 9324/9332/1 9323/9331/1 3726/3734/1 3725/3733/1 +f 9326/9334/1 3721/3729/1 3724/3732/1 9327/9335/1 +f 9331/9339/1 9336/9344/1 3721/3729/1 9326/9334/1 +f 9336/9344/1 9335/9343/1 3722/3730/1 3721/3729/1 +f 9338/9346/1 3717/3725/1 3720/3728/1 9339/9347/1 +f 9343/9351/1 9348/9356/1 3717/3725/1 9338/9346/1 +f 9348/9356/1 9347/9355/1 3718/3726/1 3717/3725/1 +f 9350/9358/1 3713/3721/1 3716/3724/1 9351/9359/1 +f 9355/9363/1 9360/9368/1 3713/3721/1 9350/9358/1 +f 9360/9368/1 9359/9367/1 3714/3722/1 3713/3721/1 +f 9362/9370/1 3709/3717/1 3712/3720/1 9363/9371/1 +f 9367/9375/1 9372/9380/1 3709/3717/1 9362/9370/1 +f 9372/9380/1 9371/9379/1 3710/3718/1 3709/3717/1 +f 9374/9382/1 3705/3713/1 3708/3716/1 9375/9383/1 +f 9379/9387/1 9384/9392/1 3705/3713/1 9374/9382/1 +f 9384/9392/1 9383/9391/1 3706/3714/1 3705/3713/1 +f 9386/9394/1 3701/3709/1 3704/3712/1 9387/9395/1 +f 9391/9399/1 9396/9404/1 3701/3709/1 9386/9394/1 +f 9396/9404/1 9395/9403/1 3702/3710/1 3701/3709/1 +f 9398/9406/1 3697/3705/1 3700/3708/1 9399/9407/1 +f 9403/9411/1 9408/9416/1 3697/3705/1 9398/9406/1 +f 9408/9416/1 9407/9415/1 3698/3706/1 3697/3705/1 +f 9410/9418/1 3693/3701/1 3696/3704/1 9411/9419/1 +f 9415/9423/1 9420/9428/1 3693/3701/1 9410/9418/1 +f 9420/9428/1 9419/9427/1 3694/3702/1 3693/3701/1 +f 9422/9430/1 3689/3697/1 3692/3700/1 9423/9431/1 +f 9427/9435/1 9432/9440/1 3689/3697/1 9422/9430/1 +f 9432/9440/1 9431/9439/1 3690/3698/1 3689/3697/1 +f 9434/9442/1 3685/3693/1 3688/3696/1 9435/9443/1 +f 9439/9447/1 9444/9452/1 3685/3693/1 9434/9442/1 +f 9444/9452/1 9443/9451/1 3686/3694/1 3685/3693/1 +f 9446/9454/1 3681/3689/1 3684/3692/1 9447/9455/1 +f 9451/9459/1 9456/9464/1 3681/3689/1 9446/9454/1 +f 9456/9464/1 9455/9463/1 3682/3690/1 3681/3689/1 +f 9458/9466/1 3677/3685/1 3680/3688/1 9459/9467/1 +f 9463/9471/1 9468/9476/1 3677/3685/1 9458/9466/1 +f 9468/9476/1 9467/9475/1 3678/3686/1 3677/3685/1 +f 9470/9478/1 3673/3681/1 3676/3684/1 9471/9479/1 +f 9475/9483/1 9480/9488/1 3673/3681/1 9470/9478/1 +f 9480/9488/1 9479/9487/1 3674/3682/1 3673/3681/1 +f 9482/9490/1 3669/3677/1 3672/3680/1 9483/9491/1 +f 9487/9495/1 9492/9500/1 3669/3677/1 9482/9490/1 +f 9492/9500/1 9491/9499/1 3670/3678/1 3669/3677/1 +f 9494/9502/1 3665/3673/1 3668/3676/1 9495/9503/1 +f 9499/9507/1 9504/9512/1 3665/3673/1 9494/9502/1 +f 9504/9512/1 9503/9511/1 3666/3674/1 3665/3673/1 +f 9506/9514/1 3661/3669/1 3664/3672/1 9507/9515/1 +f 9511/9519/1 9516/9524/1 3661/3669/1 9506/9514/1 +f 9516/9524/1 9515/9523/1 3662/3670/1 3661/3669/1 +f 9518/9526/1 3657/3665/1 3660/3668/1 9519/9527/1 +f 9523/9531/1 9528/9536/1 3657/3665/1 9518/9526/1 +f 9528/9536/1 9527/9535/1 3658/3666/1 3657/3665/1 +f 9530/9538/1 3653/3661/1 3656/3664/1 9531/9539/1 +f 9535/9543/1 9540/9548/1 3653/3661/1 9530/9538/1 +f 9540/9548/1 9539/9547/1 3654/3662/1 3653/3661/1 +f 9542/9550/1 3649/3657/1 3652/3660/1 9543/9551/1 +f 9547/9555/1 9552/9560/1 3649/3657/1 9542/9550/1 +f 9552/9560/1 9551/9559/1 3650/3658/1 3649/3657/1 +f 9554/9562/1 3645/3653/1 3648/3656/1 9555/9563/1 +f 9559/9567/1 9564/9572/1 3645/3653/1 9554/9562/1 +f 9564/9572/1 9563/9571/1 3646/3654/1 3645/3653/1 +f 9566/9574/1 3641/3649/1 3644/3652/1 9567/9575/1 +f 9571/9579/1 9576/9584/1 3641/3649/1 9566/9574/1 +f 9576/9584/1 9575/9583/1 3642/3650/1 3641/3649/1 +f 9578/9586/1 3637/3645/1 3640/3648/1 9579/9587/1 +f 9583/9591/1 9588/9596/1 3637/3645/1 9578/9586/1 +f 9588/9596/1 9587/9595/1 3638/3646/1 3637/3645/1 +f 9590/9598/1 3633/3641/1 3636/3644/1 9591/9599/1 +f 9595/9603/1 9600/9608/1 3633/3641/1 9590/9598/1 +f 9600/9608/1 9599/9607/1 3634/3642/1 3633/3641/1 +f 9602/9610/1 3629/3637/1 3632/3640/1 9603/9611/1 +f 9607/9615/1 9612/9620/1 3629/3637/1 9602/9610/1 +f 9612/9620/1 9611/9619/1 3630/3638/1 3629/3637/1 +f 9614/9622/1 3625/3633/1 3628/3636/1 9615/9623/1 +f 9619/9627/1 9624/9632/1 3625/3633/1 9614/9622/1 +f 9624/9632/1 9623/9631/1 3626/3634/1 3625/3633/1 +f 9626/9634/1 3621/3629/1 3624/3632/1 9627/9635/1 +f 9631/9639/1 9636/9644/1 3621/3629/1 9626/9634/1 +f 9636/9644/1 9635/9643/1 3622/3630/1 3621/3629/1 +f 9638/9646/1 3617/3625/1 3620/3628/1 9639/9647/1 +f 9643/9651/1 9648/9656/1 3617/3625/1 9638/9646/1 +f 9648/9656/1 9647/9655/1 3618/3626/1 3617/3625/1 +f 9650/9658/1 3613/3621/1 3616/3624/1 9651/9659/1 +f 9655/9663/1 9660/9668/1 3613/3621/1 9650/9658/1 +f 9660/9668/1 9659/9667/1 3614/3622/1 3613/3621/1 +f 9662/9670/1 3609/3617/1 3612/3620/1 9663/9671/1 +f 9667/9675/1 9672/9680/1 3609/3617/1 9662/9670/1 +f 9672/9680/1 9671/9679/1 3610/3618/1 3609/3617/1 +f 9674/9682/1 3605/3613/1 3608/3616/1 9675/9683/1 +f 9679/9687/1 9684/9692/1 3605/3613/1 9674/9682/1 +f 9684/9692/1 9683/9691/1 3606/3614/1 3605/3613/1 +f 9686/9694/1 3601/3609/1 3604/3612/1 9687/9695/1 +f 9691/9699/1 9696/9704/1 3601/3609/1 9686/9694/1 +f 9696/9704/1 9695/9703/1 3602/3610/1 3601/3609/1 +f 9698/9706/1 3597/3605/1 3600/3608/1 9699/9707/1 +f 9703/9711/1 9708/9716/1 3597/3605/1 9698/9706/1 +f 9708/9716/1 9707/9715/1 3598/3606/1 3597/3605/1 +f 9710/9718/1 3593/3601/1 3596/3604/1 9711/9719/1 +f 9715/9723/1 9720/9728/1 3593/3601/1 9710/9718/1 +f 9720/9728/1 9719/9727/1 3594/3602/1 3593/3601/1 +f 9722/9730/1 3589/3597/1 3592/3600/1 9723/9731/1 +f 9727/9735/1 9732/9740/1 3589/3597/1 9722/9730/1 +f 9732/9740/1 9731/9739/1 3590/3598/1 3589/3597/1 +f 9734/9742/1 3585/3593/1 3588/3596/1 9735/9743/1 +f 9739/9747/1 9744/9752/1 3585/3593/1 9734/9742/1 +f 9744/9752/1 9743/9751/1 3586/3594/1 3585/3593/1 +f 9746/9754/1 3581/3589/1 3584/3592/1 9747/9755/1 +f 9751/9759/1 9756/9764/1 3581/3589/1 9746/9754/1 +f 9756/9764/1 9755/9763/1 3582/3590/1 3581/3589/1 +f 9758/9766/1 3577/3585/1 3580/3588/1 9759/9767/1 +f 9763/9771/1 9768/9776/1 3577/3585/1 9758/9766/1 +f 9768/9776/1 9767/9775/1 3578/3586/1 3577/3585/1 +f 9770/9778/1 3573/3581/1 3576/3584/1 9771/9779/1 +f 9775/9783/1 9780/9788/1 3573/3581/1 9770/9778/1 +f 9780/9788/1 9779/9787/1 3574/3582/1 3573/3581/1 +f 9782/9790/1 3569/3577/1 3572/3580/1 9783/9791/1 +f 9787/9795/1 9792/9800/1 3569/3577/1 9782/9790/1 +f 9792/9800/1 9791/9799/1 3570/3578/1 3569/3577/1 +f 9794/9802/1 3565/3573/1 3568/3576/1 9795/9803/1 +f 9799/9807/1 9804/9812/1 3565/3573/1 9794/9802/1 +f 9804/9812/1 9803/9811/1 3566/3574/1 3565/3573/1 +f 9806/9814/1 3561/3569/1 3564/3572/1 9807/9815/1 +f 9811/9819/1 9816/9824/1 3561/3569/1 9806/9814/1 +f 9816/9824/1 9815/9823/1 3562/3570/1 3561/3569/1 +f 9818/9826/1 3557/3565/1 3560/3568/1 9819/9827/1 +f 9823/9831/1 9828/9836/1 3557/3565/1 9818/9826/1 +f 9828/9836/1 9827/9835/1 3558/3566/1 3557/3565/1 +f 9830/9838/1 3553/3561/1 3556/3564/1 9831/9839/1 +f 9835/9843/1 9840/9848/1 3553/3561/1 9830/9838/1 +f 9840/9848/1 9839/9847/1 3554/3562/1 3553/3561/1 +f 9842/9850/1 3549/3557/1 3552/3560/1 9843/9851/1 +f 9847/9855/1 9852/9860/1 3549/3557/1 9842/9850/1 +f 9852/9860/1 9851/9859/1 3550/3558/1 3549/3557/1 +f 9854/9862/1 3545/3553/1 3548/3556/1 9855/9863/1 +f 9859/9867/1 9864/9872/1 3545/3553/1 9854/9862/1 +f 9864/9872/1 9863/9871/1 3546/3554/1 3545/3553/1 +f 9866/9874/1 3541/3549/1 3544/3552/1 9867/9875/1 +f 9871/9879/1 9876/9884/1 3541/3549/1 9866/9874/1 +f 9876/9884/1 9875/9883/1 3542/3550/1 3541/3549/1 +f 9878/9886/1 3537/3545/1 3540/3548/1 9879/9887/1 +f 9883/9891/1 9888/9896/1 3537/3545/1 9878/9886/1 +f 9888/9896/1 9887/9895/1 3538/3546/1 3537/3545/1 +f 9890/9898/1 3533/3541/1 3536/3544/1 9891/9899/1 +f 9895/9903/1 9900/9908/1 3533/3541/1 9890/9898/1 +f 9900/9908/1 9899/9907/1 3534/3542/1 3533/3541/1 +f 9902/9910/1 3529/3537/1 3532/3540/1 9903/9911/1 +f 9907/9915/1 9912/9920/1 3529/3537/1 9902/9910/1 +f 9912/9920/1 9911/9919/1 3530/3538/1 3529/3537/1 +f 9914/9922/1 3525/3533/1 3528/3536/1 9915/9923/1 +f 9919/9927/1 9924/9932/1 3525/3533/1 9914/9922/1 +f 9924/9932/1 9923/9931/1 3526/3534/1 3525/3533/1 +f 9926/9934/1 3521/3529/1 3524/3532/1 9927/9935/1 +f 9931/9939/1 9936/9944/1 3521/3529/1 9926/9934/1 +f 9936/9944/1 9935/9943/1 3522/3530/1 3521/3529/1 +f 9938/9946/1 3517/3525/1 3520/3528/1 9939/9947/1 +f 9943/9951/1 9948/9956/1 3517/3525/1 9938/9946/1 +f 9948/9956/1 9947/9955/1 3518/3526/1 3517/3525/1 +f 9950/9958/1 3513/3521/1 3516/3524/1 9951/9959/1 +f 9955/9963/1 9960/9968/1 3513/3521/1 9950/9958/1 +f 9960/9968/1 9959/9967/1 3514/3522/1 3513/3521/1 +f 9962/9970/1 3509/3517/1 3512/3520/1 9963/9971/1 +f 9967/9975/1 9972/9980/1 3509/3517/1 9962/9970/1 +f 9972/9980/1 9971/9979/1 3510/3518/1 3509/3517/1 +f 9974/9982/1 3505/3513/1 3508/3516/1 9975/9983/1 +f 9979/9987/1 9984/9992/1 3505/3513/1 9974/9982/1 +f 9984/9992/1 9983/9991/1 3506/3514/1 3505/3513/1 +f 9986/9994/1 3501/3509/1 3504/3512/1 9987/9995/1 +f 9991/9999/1 9996/10004/1 3501/3509/1 9986/9994/1 +f 9996/10004/1 9995/10003/1 3502/3510/1 3501/3509/1 +f 9998/10006/1 3497/3505/1 3500/3508/1 9999/10007/1 +f 10003/10011/1 10008/10016/1 3497/3505/1 9998/10006/1 +f 10008/10016/1 10007/10015/1 3498/3506/1 3497/3505/1 +f 10010/10018/1 3493/3501/1 3496/3504/1 10011/10019/1 +f 10015/10023/1 10020/10028/1 3493/3501/1 10010/10018/1 +f 10020/10028/1 10019/10027/1 3494/3502/1 3493/3501/1 +f 10022/10030/1 3489/3497/1 3492/3500/1 10023/10031/1 +f 10027/10035/1 10032/10040/1 3489/3497/1 10022/10030/1 +f 10032/10040/1 10031/10039/1 3490/3498/1 3489/3497/1 +f 10034/10042/1 3485/3493/1 3488/3496/1 10035/10043/1 +f 10039/10047/1 10044/10052/1 3485/3493/1 10034/10042/1 +f 10044/10052/1 10043/10051/1 3486/3494/1 3485/3493/1 +f 10046/10054/1 3481/3489/1 3484/3492/1 10047/10055/1 +f 10051/10059/1 10056/10064/1 3481/3489/1 10046/10054/1 +f 10056/10064/1 10055/10063/1 3482/3490/1 3481/3489/1 +f 10058/10066/1 3477/3485/1 3480/3488/1 10059/10067/1 +f 10063/10071/1 10068/10076/1 3477/3485/1 10058/10066/1 +f 10068/10076/1 10067/10075/1 3478/3486/1 3477/3485/1 +f 10070/10078/1 3473/3481/1 3476/3484/1 10071/10079/1 +f 10075/10083/1 10080/10088/1 3473/3481/1 10070/10078/1 +f 10080/10088/1 10079/10087/1 3474/3482/1 3473/3481/1 +f 10082/10090/1 3469/3477/1 3472/3480/1 10083/10091/1 +f 10087/10095/1 10092/10100/1 3469/3477/1 10082/10090/1 +f 10092/10100/1 10091/10099/1 3470/3478/1 3469/3477/1 +f 10094/10102/1 3465/3473/1 3468/3476/1 10095/10103/1 +f 10099/10107/1 10104/10112/1 3465/3473/1 10094/10102/1 +f 10104/10112/1 10103/10111/1 3466/3474/1 3465/3473/1 +f 10106/10114/1 3461/3469/1 3464/3472/1 10107/10115/1 +f 10111/10119/1 10116/10124/1 3461/3469/1 10106/10114/1 +f 10116/10124/1 10115/10123/1 3462/3470/1 3461/3469/1 +f 10118/10126/1 3457/3465/1 3460/3468/1 10119/10127/1 +f 10123/10131/1 10128/10136/1 3457/3465/1 10118/10126/1 +f 10128/10136/1 10127/10135/1 3458/3466/1 3457/3465/1 +f 10130/10138/1 3453/3461/1 3456/3464/1 10131/10139/1 +f 10135/10143/1 10140/10148/1 3453/3461/1 10130/10138/1 +f 10140/10148/1 10139/10147/1 3454/3462/1 3453/3461/1 +f 10142/10150/1 3449/3457/1 3452/3460/1 10143/10151/1 +f 10147/10155/1 10152/10160/1 3449/3457/1 10142/10150/1 +f 10152/10160/1 10151/10159/1 3450/3458/1 3449/3457/1 +f 10154/10162/1 3445/3453/1 3448/3456/1 10155/10163/1 +f 10159/10167/1 10164/10172/1 3445/3453/1 10154/10162/1 +f 10164/10172/1 10163/10171/1 3446/3454/1 3445/3453/1 +f 10166/10174/1 3441/3449/1 3444/3452/1 10167/10175/1 +f 10171/10179/1 10176/10184/1 3441/3449/1 10166/10174/1 +f 10176/10184/1 10175/10183/1 3442/3450/1 3441/3449/1 +f 10178/10186/1 3437/3445/1 3440/3448/1 10179/10187/1 +f 10183/10191/1 10188/10196/1 3437/3445/1 10178/10186/1 +f 10188/10196/1 10187/10195/1 3438/3446/1 3437/3445/1 +f 10190/10198/1 3433/3441/1 3436/3444/1 10191/10199/1 +f 10195/10203/1 10200/10208/1 3433/3441/1 10190/10198/1 +f 10200/10208/1 10199/10207/1 3434/3442/1 3433/3441/1 +f 10202/10210/1 3429/3437/1 3432/3440/1 10203/10211/1 +f 10207/10215/1 10212/10220/1 3429/3437/1 10202/10210/1 +f 10212/10220/1 10211/10219/1 3430/3438/1 3429/3437/1 +f 10214/10222/1 3425/3433/1 3428/3436/1 10215/10223/1 +f 10219/10227/1 10224/10232/1 3425/3433/1 10214/10222/1 +f 10224/10232/1 10223/10231/1 3426/3434/1 3425/3433/1 +f 10226/10234/1 3421/3429/1 3424/3432/1 10227/10235/1 +f 10231/10239/1 10236/10244/1 3421/3429/1 10226/10234/1 +f 10236/10244/1 10235/10243/1 3422/3430/1 3421/3429/1 +f 10238/10246/1 3417/3425/1 3420/3428/1 10239/10247/1 +f 10243/10251/1 10248/10256/1 3417/3425/1 10238/10246/1 +f 10248/10256/1 10247/10255/1 3418/3426/1 3417/3425/1 +f 10250/10258/1 3413/3421/1 3416/3424/1 10251/10259/1 +f 10255/10263/1 10260/10268/1 3413/3421/1 10250/10258/1 +f 10260/10268/1 10259/10267/1 3414/3422/1 3413/3421/1 +f 10262/10270/1 3409/3417/1 3412/3420/1 10263/10271/1 +f 10267/10275/1 10272/10280/1 3409/3417/1 10262/10270/1 +f 10272/10280/1 10271/10279/1 3410/3418/1 3409/3417/1 +f 10274/10282/1 3405/3413/1 3408/3416/1 10275/10283/1 +f 10279/10287/1 10284/10292/1 3405/3413/1 10274/10282/1 +f 10284/10292/1 10283/10291/1 3406/3414/1 3405/3413/1 +f 10286/10294/1 3401/3409/1 3404/3412/1 10287/10295/1 +f 10291/10299/1 10296/10304/1 3401/3409/1 10286/10294/1 +f 10296/10304/1 10295/10303/1 3402/3410/1 3401/3409/1 +f 10298/10306/1 3397/3405/1 3400/3408/1 10299/10307/1 +f 10303/10311/1 10308/10316/1 3397/3405/1 10298/10306/1 +f 10308/10316/1 10307/10315/1 3398/3406/1 3397/3405/1 +f 10310/10318/1 3393/3401/1 3396/3404/1 10311/10319/1 +f 10315/10323/1 10320/10328/1 3393/3401/1 10310/10318/1 +f 10320/10328/1 10319/10327/1 3394/3402/1 3393/3401/1 +f 10322/10330/1 3389/3397/1 3392/3400/1 10323/10331/1 +f 10327/10335/1 10332/10340/1 3389/3397/1 10322/10330/1 +f 10332/10340/1 10331/10339/1 3390/3398/1 3389/3397/1 +f 10334/10342/1 3385/3393/1 3388/3396/1 10335/10343/1 +f 10339/10347/1 10344/10352/1 3385/3393/1 10334/10342/1 +f 10344/10352/1 10343/10351/1 3386/3394/1 3385/3393/1 +f 10346/10354/1 3381/3389/1 3384/3392/1 10347/10355/1 +f 10351/10359/1 10356/10364/1 3381/3389/1 10346/10354/1 +f 10356/10364/1 10355/10363/1 3382/3390/1 3381/3389/1 +f 10358/10366/1 3377/3385/1 3380/3388/1 10359/10367/1 +f 10363/10371/1 10368/10376/1 3377/3385/1 10358/10366/1 +f 10368/10376/1 10367/10375/1 3378/3386/1 3377/3385/1 +f 10370/10378/1 3373/3381/1 3376/3384/1 10371/10379/1 +f 10375/10383/1 10380/10388/1 3373/3381/1 10370/10378/1 +f 10380/10388/1 10379/10387/1 3374/3382/1 3373/3381/1 +f 10382/10390/1 3369/3377/1 3372/3380/1 10383/10391/1 +f 10387/10395/1 10392/10400/1 3369/3377/1 10382/10390/1 +f 10392/10400/1 10391/10399/1 3370/3378/1 3369/3377/1 +f 10394/10402/1 3365/3373/1 3368/3376/1 10395/10403/1 +f 10399/10407/1 10404/10412/1 3365/3373/1 10394/10402/1 +f 10404/10412/1 10403/10411/1 3366/3374/1 3365/3373/1 +f 10406/10414/1 3361/3369/1 3364/3372/1 10407/10415/1 +f 10411/10419/1 10416/10424/1 3361/3369/1 10406/10414/1 +f 10416/10424/1 10415/10423/1 3362/3370/1 3361/3369/1 +f 10418/10426/1 3357/3365/1 3360/3368/1 10419/10427/1 +f 10423/10431/1 10428/10436/1 3357/3365/1 10418/10426/1 +f 10428/10436/1 10427/10435/1 3358/3366/1 3357/3365/1 +f 10430/10438/1 3353/3361/1 3356/3364/1 10431/10439/1 +f 10435/10443/1 10440/10448/1 3353/3361/1 10430/10438/1 +f 10440/10448/1 10439/10447/1 3354/3362/1 3353/3361/1 +f 10442/10450/1 3349/3357/1 3352/3360/1 10443/10451/1 +f 10447/10455/1 10452/10460/1 3349/3357/1 10442/10450/1 +f 10452/10460/1 10451/10459/1 3350/3358/1 3349/3357/1 +f 10454/10462/1 3345/3353/1 3348/3356/1 10455/10463/1 +f 10459/10467/1 10464/10472/1 3345/3353/1 10454/10462/1 +f 10464/10472/1 10463/10471/1 3346/3354/1 3345/3353/1 +f 10466/10474/1 3341/3349/1 3344/3352/1 10467/10475/1 +f 10471/10479/1 10476/10484/1 3341/3349/1 10466/10474/1 +f 10476/10484/1 10475/10483/1 3342/3350/1 3341/3349/1 +f 10478/10486/1 3337/3345/1 3340/3348/1 10479/10487/1 +f 10483/10491/1 10488/10496/1 3337/3345/1 10478/10486/1 +f 10488/10496/1 10487/10495/1 3338/3346/1 3337/3345/1 +f 10490/10498/1 3333/3341/1 3336/3344/1 10491/10499/1 +f 10495/10503/1 10500/10508/1 3333/3341/1 10490/10498/1 +f 10500/10508/1 10499/10507/1 3334/3342/1 3333/3341/1 +f 10502/10510/1 3329/3337/1 3332/3340/1 10503/10511/1 +f 10507/10515/1 10512/10520/1 3329/3337/1 10502/10510/1 +f 10512/10520/1 10511/10519/1 3330/3338/1 3329/3337/1 +f 10514/10522/1 3325/3333/1 3328/3336/1 10515/10523/1 +f 10519/10527/1 10524/10532/1 3325/3333/1 10514/10522/1 +f 10524/10532/1 10523/10531/1 3326/3334/1 3325/3333/1 +f 10526/10534/1 3321/3329/1 3324/3332/1 10527/10535/1 +f 10531/10539/1 10536/10544/1 3321/3329/1 10526/10534/1 +f 10536/10544/1 10535/10543/1 3322/3330/1 3321/3329/1 +f 10538/10546/1 3317/3325/1 3320/3328/1 10539/10547/1 +f 10543/10551/1 10548/10556/1 3317/3325/1 10538/10546/1 +f 10548/10556/1 10547/10555/1 3318/3326/1 3317/3325/1 +f 10550/10558/1 3313/3321/1 3316/3324/1 10551/10559/1 +f 10555/10563/1 10560/10568/1 3313/3321/1 10550/10558/1 +f 10560/10568/1 10559/10567/1 3314/3322/1 3313/3321/1 +f 10562/10570/1 3309/3317/1 3312/3320/1 10563/10571/1 +f 10567/10575/1 10572/10580/1 3309/3317/1 10562/10570/1 +f 10572/10580/1 10571/10579/1 3310/3318/1 3309/3317/1 +f 10574/10582/1 3305/3313/1 3308/3316/1 10575/10583/1 +f 10579/10587/1 10584/10592/1 3305/3313/1 10574/10582/1 +f 10584/10592/1 10583/10591/1 3306/3314/1 3305/3313/1 +f 10586/10594/1 3301/3309/1 3304/3312/1 10587/10595/1 +f 10591/10599/1 10596/10604/1 3301/3309/1 10586/10594/1 +f 10596/10604/1 10595/10603/1 3302/3310/1 3301/3309/1 +f 10598/10606/1 3297/3305/1 3300/3308/1 10599/10607/1 +f 10603/10611/1 10608/10616/1 3297/3305/1 10598/10606/1 +f 10608/10616/1 10607/10615/1 3298/3306/1 3297/3305/1 +f 10610/10618/1 3293/3301/1 3296/3304/1 10611/10619/1 +f 10615/10623/1 10620/10628/1 3293/3301/1 10610/10618/1 +f 10620/10628/1 10619/10627/1 3294/3302/1 3293/3301/1 +f 10622/10630/1 3289/3297/1 3292/3300/1 10623/10631/1 +f 10627/10635/1 10632/10640/1 3289/3297/1 10622/10630/1 +f 10632/10640/1 10631/10639/1 3290/3298/1 3289/3297/1 +f 10634/10642/1 3285/3293/1 3288/3296/1 10635/10643/1 +f 10639/10647/1 10644/10652/1 3285/3293/1 10634/10642/1 +f 10644/10652/1 10643/10651/1 3286/3294/1 3285/3293/1 +f 10646/10654/1 3281/3289/1 3284/3292/1 10647/10655/1 +f 10651/10659/1 10656/10664/1 3281/3289/1 10646/10654/1 +f 10656/10664/1 10655/10663/1 3282/3290/1 3281/3289/1 +f 10658/10666/1 3277/3285/1 3280/3288/1 10659/10667/1 +f 10663/10671/1 10668/10676/1 3277/3285/1 10658/10666/1 +f 10668/10676/1 10667/10675/1 3278/3286/1 3277/3285/1 +f 10670/10678/1 3273/3281/1 3276/3284/1 10671/10679/1 +f 10675/10683/1 10680/10688/1 3273/3281/1 10670/10678/1 +f 10680/10688/1 10679/10687/1 3274/3282/1 3273/3281/1 +f 10682/10690/1 3269/3277/1 3272/3280/1 10683/10691/1 +f 10687/10695/1 10692/10700/1 3269/3277/1 10682/10690/1 +f 10692/10700/1 10691/10699/1 3270/3278/1 3269/3277/1 +f 10694/10702/1 3265/3273/1 3268/3276/1 10695/10703/1 +f 10699/10707/1 10704/10712/1 3265/3273/1 10694/10702/1 +f 10704/10712/1 10703/10711/1 3266/3274/1 3265/3273/1 +f 10706/10714/1 3261/3269/1 3264/3272/1 10707/10715/1 +f 10711/10719/1 10716/10724/1 3261/3269/1 10706/10714/1 +f 10716/10724/1 10715/10723/1 3262/3270/1 3261/3269/1 +f 10718/10726/1 3257/3265/1 3260/3268/1 10719/10727/1 +f 10723/10731/1 10728/10736/1 3257/3265/1 10718/10726/1 +f 10728/10736/1 10727/10735/1 3258/3266/1 3257/3265/1 +f 10730/10738/1 3253/3261/1 3256/3264/1 10731/10739/1 +f 10735/10743/1 10740/10748/1 3253/3261/1 10730/10738/1 +f 10740/10748/1 10739/10747/1 3254/3262/1 3253/3261/1 +f 10742/10750/1 3249/3257/1 3252/3260/1 10743/10751/1 +f 10747/10755/1 10752/10760/1 3249/3257/1 10742/10750/1 +f 10752/10760/1 10751/10759/1 3250/3258/1 3249/3257/1 +f 10754/10762/1 3245/3253/1 3248/3256/1 10755/10763/1 +f 10759/10767/1 10764/10772/1 3245/3253/1 10754/10762/1 +f 10764/10772/1 10763/10771/1 3246/3254/1 3245/3253/1 +f 10766/10774/1 3241/3249/1 3244/3252/1 10767/10775/1 +f 10771/10779/1 10776/10784/1 3241/3249/1 10766/10774/1 +f 10776/10784/1 10775/10783/1 3242/3250/1 3241/3249/1 +f 10778/10786/1 3237/3245/1 3240/3248/1 10779/10787/1 +f 10783/10791/1 10788/10796/1 3237/3245/1 10778/10786/1 +f 10788/10796/1 10787/10795/1 3238/3246/1 3237/3245/1 +f 10790/10798/1 3233/3241/1 3236/3244/1 10791/10799/1 +f 10795/10803/1 10800/10808/1 3233/3241/1 10790/10798/1 +f 10800/10808/1 10799/10807/1 3234/3242/1 3233/3241/1 +f 10802/10810/1 3229/3237/1 3232/3240/1 10803/10811/1 +f 10807/10815/1 10812/10820/1 3229/3237/1 10802/10810/1 +f 10812/10820/1 10811/10819/1 3230/3238/1 3229/3237/1 +f 10814/10822/1 3225/3233/1 3228/3236/1 10815/10823/1 +f 10819/10827/1 10824/10832/1 3225/3233/1 10814/10822/1 +f 10824/10832/1 10823/10831/1 3226/3234/1 3225/3233/1 +f 10826/10834/1 3221/3229/1 3224/3232/1 10827/10835/1 +f 10831/10839/1 10836/10844/1 3221/3229/1 10826/10834/1 +f 10836/10844/1 10835/10843/1 3222/3230/1 3221/3229/1 +f 10838/10846/1 3217/3225/1 3220/3228/1 10839/10847/1 +f 10843/10851/1 10848/10856/1 3217/3225/1 10838/10846/1 +f 10848/10856/1 10847/10855/1 3218/3226/1 3217/3225/1 +f 10850/10858/1 3213/3221/1 3216/3224/1 10851/10859/1 +f 10855/10863/1 10860/10868/1 3213/3221/1 10850/10858/1 +f 10860/10868/1 10859/10867/1 3214/3222/1 3213/3221/1 +f 10862/10870/1 3209/3217/1 3212/3220/1 10863/10871/1 +f 10867/10875/1 10872/10880/1 3209/3217/1 10862/10870/1 +f 10872/10880/1 10871/10879/1 3210/3218/1 3209/3217/1 +f 10874/10882/1 3205/3213/1 3208/3216/1 10875/10883/1 +f 10879/10887/1 10884/10892/1 3205/3213/1 10874/10882/1 +f 10884/10892/1 10883/10891/1 3206/3214/1 3205/3213/1 +f 10886/10894/1 3201/3209/1 3204/3212/1 10887/10895/1 +f 10891/10899/1 10896/10904/1 3201/3209/1 10886/10894/1 +f 10896/10904/1 10895/10903/1 3202/3210/1 3201/3209/1 +f 10898/10906/1 3197/3205/1 3200/3208/1 10899/10907/1 +f 10903/10911/1 10908/10916/1 3197/3205/1 10898/10906/1 +f 10908/10916/1 10907/10915/1 3198/3206/1 3197/3205/1 +f 10910/10918/1 3193/3201/1 3196/3204/1 10911/10919/1 +f 10915/10923/1 10920/10928/1 3193/3201/1 10910/10918/1 +f 10920/10928/1 10919/10927/1 3194/3202/1 3193/3201/1 +f 10922/10930/1 3189/3197/1 3192/3200/1 10923/10931/1 +f 10927/10935/1 10932/10940/1 3189/3197/1 10922/10930/1 +f 10932/10940/1 10931/10939/1 3190/3198/1 3189/3197/1 +f 10934/10942/1 3185/3193/1 3188/3196/1 10935/10943/1 +f 10939/10947/1 10944/10952/1 3185/3193/1 10934/10942/1 +f 10944/10952/1 10943/10951/1 3186/3194/1 3185/3193/1 +f 10946/10954/1 3181/3189/1 3184/3192/1 10947/10955/1 +f 10951/10959/1 10956/10964/1 3181/3189/1 10946/10954/1 +f 10956/10964/1 10955/10963/1 3182/3190/1 3181/3189/1 +f 10958/10966/1 3177/3185/1 3180/3188/1 10959/10967/1 +f 10963/10971/1 10968/10976/1 3177/3185/1 10958/10966/1 +f 10968/10976/1 10967/10975/1 3178/3186/1 3177/3185/1 +f 10970/10978/1 3173/3181/1 3176/3184/1 10971/10979/1 +f 10975/10983/1 10980/10988/1 3173/3181/1 10970/10978/1 +f 10980/10988/1 10979/10987/1 3174/3182/1 3173/3181/1 +f 10982/10990/1 3169/3177/1 3172/3180/1 10983/10991/1 +f 10987/10995/1 10992/11000/1 3169/3177/1 10982/10990/1 +f 10992/11000/1 10991/10999/1 3170/3178/1 3169/3177/1 +f 10994/11002/1 3165/3173/1 3168/3176/1 10995/11003/1 +f 10999/11007/1 11004/11012/1 3165/3173/1 10994/11002/1 +f 11004/11012/1 11003/11011/1 3166/3174/1 3165/3173/1 +f 11006/11014/1 3161/3169/1 3164/3172/1 11007/11015/1 +f 11011/11019/1 11016/11024/1 3161/3169/1 11006/11014/1 +f 11016/11024/1 11015/11023/1 3162/3170/1 3161/3169/1 +f 11018/11026/1 3157/3165/1 3160/3168/1 11019/11027/1 +f 11023/11031/1 11028/11036/1 3157/3165/1 11018/11026/1 +f 11028/11036/1 11027/11035/1 3158/3166/1 3157/3165/1 +f 11030/11038/1 3153/3161/1 3156/3164/1 11031/11039/1 +f 11035/11043/1 11040/11048/1 3153/3161/1 11030/11038/1 +f 11040/11048/1 11039/11047/1 3154/3162/1 3153/3161/1 +f 11042/11050/1 3149/3157/1 3152/3160/1 11043/11051/1 +f 11047/11055/1 11052/11060/1 3149/3157/1 11042/11050/1 +f 11052/11060/1 11051/11059/1 3150/3158/1 3149/3157/1 +f 11054/11062/1 3145/3153/1 3148/3156/1 11055/11063/1 +f 11059/11067/1 11064/11072/1 3145/3153/1 11054/11062/1 +f 11064/11072/1 11063/11071/1 3146/3154/1 3145/3153/1 +f 11066/11074/1 3141/3149/1 3144/3152/1 11067/11075/1 +f 11071/11079/1 11076/11084/1 3141/3149/1 11066/11074/1 +f 11076/11084/1 11075/11083/1 3142/3150/1 3141/3149/1 +f 11078/11086/1 3137/3145/1 3140/3148/1 11079/11087/1 +f 11083/11091/1 11088/11096/1 3137/3145/1 11078/11086/1 +f 11088/11096/1 11087/11095/1 3138/3146/1 3137/3145/1 +f 11090/11098/1 3133/3141/1 3136/3144/1 11091/11099/1 +f 11095/11103/1 11100/11108/1 3133/3141/1 11090/11098/1 +f 11100/11108/1 11099/11107/1 3134/3142/1 3133/3141/1 +f 11102/11110/1 3129/3137/1 3132/3140/1 11103/11111/1 +f 11107/11115/1 11112/11120/1 3129/3137/1 11102/11110/1 +f 11112/11120/1 11111/11119/1 3130/3138/1 3129/3137/1 +f 11114/11122/1 3125/3133/1 3128/3136/1 11115/11123/1 +f 11119/11127/1 11124/11132/1 3125/3133/1 11114/11122/1 +f 11124/11132/1 11123/11131/1 3126/3134/1 3125/3133/1 +f 11126/11134/1 3121/3129/1 3124/3132/1 11127/11135/1 +f 11131/11139/1 11136/11144/1 3121/3129/1 11126/11134/1 +f 11136/11144/1 11135/11143/1 3122/3130/1 3121/3129/1 +f 11138/11146/1 3117/3125/1 3120/3128/1 11139/11147/1 +f 11143/11151/1 11148/11156/1 3117/3125/1 11138/11146/1 +f 11148/11156/1 11147/11155/1 3118/3126/1 3117/3125/1 +f 11150/11158/1 3113/3121/1 3116/3124/1 11151/11159/1 +f 11155/11163/1 11160/11168/1 3113/3121/1 11150/11158/1 +f 11160/11168/1 11159/11167/1 3114/3122/1 3113/3121/1 +f 11162/11170/1 3109/3117/1 3112/3120/1 11163/11171/1 +f 11167/11175/1 11172/11180/1 3109/3117/1 11162/11170/1 +f 11172/11180/1 11171/11179/1 3110/3118/1 3109/3117/1 +f 11174/11182/1 3105/3113/1 3108/3116/1 11175/11183/1 +f 11179/11187/1 11184/11192/1 3105/3113/1 11174/11182/1 +f 11184/11192/1 11183/11191/1 3106/3114/1 3105/3113/1 +f 11186/11194/1 3101/3109/1 3104/3112/1 11187/11195/1 +f 11191/11199/1 11196/11204/1 3101/3109/1 11186/11194/1 +f 11196/11204/1 11195/11203/1 3102/3110/1 3101/3109/1 +f 11198/11206/1 3097/3105/1 3100/3108/1 11199/11207/1 +f 11203/11211/1 11208/11216/1 3097/3105/1 11198/11206/1 +f 11208/11216/1 11207/11215/1 3098/3106/1 3097/3105/1 +f 11210/11218/1 3093/3101/1 3096/3104/1 11211/11219/1 +f 11215/11223/1 11220/11228/1 3093/3101/1 11210/11218/1 +f 11220/11228/1 11219/11227/1 3094/3102/1 3093/3101/1 +f 11222/11230/1 3089/3097/1 3092/3100/1 11223/11231/1 +f 11227/11235/1 11232/11240/1 3089/3097/1 11222/11230/1 +f 11232/11240/1 11231/11239/1 3090/3098/1 3089/3097/1 +f 11234/11242/1 3085/3093/1 3088/3096/1 11235/11243/1 +f 11239/11247/1 11244/11252/1 3085/3093/1 11234/11242/1 +f 11244/11252/1 11243/11251/1 3086/3094/1 3085/3093/1 +f 11246/11254/1 3081/3089/1 3084/3092/1 11247/11255/1 +f 11251/11259/1 11256/11264/1 3081/3089/1 11246/11254/1 +f 11256/11264/1 11255/11263/1 3082/3090/1 3081/3089/1 +f 11258/11266/1 3077/3085/1 3080/3088/1 11259/11267/1 +f 11263/11271/1 11268/11276/1 3077/3085/1 11258/11266/1 +f 11268/11276/1 11267/11275/1 3078/3086/1 3077/3085/1 +f 11270/11278/1 3073/3081/1 3076/3084/1 11271/11279/1 +f 11275/11283/1 11280/11288/1 3073/3081/1 11270/11278/1 +f 11280/11288/1 11279/11287/1 3074/3082/1 3073/3081/1 +f 11282/11290/1 3069/3077/1 3072/3080/1 11283/11291/1 +f 11287/11295/1 11292/11300/1 3069/3077/1 11282/11290/1 +f 11292/11300/1 11291/11299/1 3070/3078/1 3069/3077/1 +f 11294/11302/1 3065/3073/1 3068/3076/1 11295/11303/1 +f 11299/11307/1 11304/11312/1 3065/3073/1 11294/11302/1 +f 11304/11312/1 11303/11311/1 3066/3074/1 3065/3073/1 +f 11306/11314/1 3061/3069/1 3064/3072/1 11307/11315/1 +f 11311/11319/1 11316/11324/1 3061/3069/1 11306/11314/1 +f 11316/11324/1 11315/11323/1 3062/3070/1 3061/3069/1 +f 11318/11326/1 3057/3065/1 3060/3068/1 11319/11327/1 +f 11323/11331/1 11328/11336/1 3057/3065/1 11318/11326/1 +f 11328/11336/1 11327/11335/1 3058/3066/1 3057/3065/1 +f 11330/11338/1 3053/3061/1 3056/3064/1 11331/11339/1 +f 11335/11343/1 11340/11348/1 3053/3061/1 11330/11338/1 +f 11340/11348/1 11339/11347/1 3054/3062/1 3053/3061/1 +f 11342/11350/1 3049/3057/1 3052/3060/1 11343/11351/1 +f 11347/11355/1 11352/11360/1 3049/3057/1 11342/11350/1 +f 11352/11360/1 11351/11359/1 3050/3058/1 3049/3057/1 +f 11354/11362/1 3045/3053/1 3048/3056/1 11355/11363/1 +f 11359/11367/1 11364/11372/1 3045/3053/1 11354/11362/1 +f 11364/11372/1 11363/11371/1 3046/3054/1 3045/3053/1 +f 11366/11374/1 3041/3049/1 3044/3052/1 11367/11375/1 +f 11371/11379/1 11376/11384/1 3041/3049/1 11366/11374/1 +f 11376/11384/1 11375/11383/1 3042/3050/1 3041/3049/1 +f 11378/11386/1 3037/3045/1 3040/3048/1 11379/11387/1 +f 11383/11391/1 11388/11396/1 3037/3045/1 11378/11386/1 +f 11388/11396/1 11387/11395/1 3038/3046/1 3037/3045/1 +f 11390/11398/1 3033/3041/1 3036/3044/1 11391/11399/1 +f 11395/11403/1 11400/11408/1 3033/3041/1 11390/11398/1 +f 11400/11408/1 11399/11407/1 3034/3042/1 3033/3041/1 +f 11402/11410/1 3029/3037/1 3032/3040/1 11403/11411/1 +f 11407/11415/1 11412/11420/1 3029/3037/1 11402/11410/1 +f 11412/11420/1 11411/11419/1 3030/3038/1 3029/3037/1 +f 11414/11422/1 3025/3033/1 3028/3036/1 11415/11423/1 +f 11419/11427/1 11424/11432/1 3025/3033/1 11414/11422/1 +f 11424/11432/1 11423/11431/1 3026/3034/1 3025/3033/1 +f 11426/11434/1 3021/3029/1 3024/3032/1 11427/11435/1 +f 11431/11439/1 11436/11444/1 3021/3029/1 11426/11434/1 +f 11436/11444/1 11435/11443/1 3022/3030/1 3021/3029/1 +f 11438/11446/1 3017/3025/1 3020/3028/1 11439/11447/1 +f 11443/11451/1 11448/11456/1 3017/3025/1 11438/11446/1 +f 11448/11456/1 11447/11455/1 3018/3026/1 3017/3025/1 +f 11450/11458/1 3013/3021/1 3016/3024/1 11451/11459/1 +f 11455/11463/1 11460/11468/1 3013/3021/1 11450/11458/1 +f 11460/11468/1 11459/11467/1 3014/3022/1 3013/3021/1 +f 11462/11470/1 3009/3017/1 3012/3020/1 11463/11471/1 +f 11467/11475/1 11472/11480/1 3009/3017/1 11462/11470/1 +f 11472/11480/1 11471/11479/1 3010/3018/1 3009/3017/1 +f 11474/11482/1 3005/3013/1 3008/3016/1 11475/11483/1 +f 11479/11487/1 11484/11492/1 3005/3013/1 11474/11482/1 +f 11484/11492/1 11483/11491/1 3006/3014/1 3005/3013/1 +f 11486/11494/1 3001/3009/1 3004/3012/1 11487/11495/1 +f 11491/11499/1 11496/11504/1 3001/3009/1 11486/11494/1 +f 11496/11504/1 11495/11503/1 3002/3010/1 3001/3009/1 +f 11498/11506/1 2997/3005/1 3000/3008/1 11499/11507/1 +f 11503/11511/1 11508/11516/1 2997/3005/1 11498/11506/1 +f 11508/11516/1 11507/11515/1 2998/3006/1 2997/3005/1 +f 11510/11518/1 2993/3001/1 2996/3004/1 11511/11519/1 +f 11515/11523/1 11520/11528/1 2993/3001/1 11510/11518/1 +f 11520/11528/1 11519/11527/1 2994/3002/1 2993/3001/1 +f 11522/11530/1 2989/2997/1 2992/3000/1 11523/11531/1 +f 11527/11535/1 11532/11540/1 2989/2997/1 11522/11530/1 +f 11532/11540/1 11531/11539/1 2990/2998/1 2989/2997/1 +f 11534/11542/1 2985/2993/1 2988/2996/1 11535/11543/1 +f 11539/11547/1 11544/11552/1 2985/2993/1 11534/11542/1 +f 11544/11552/1 11543/11551/1 2986/2994/1 2985/2993/1 +f 11546/11554/1 2981/2989/1 2984/2992/1 11547/11555/1 +f 11551/11559/1 11556/11564/1 2981/2989/1 11546/11554/1 +f 11556/11564/1 11555/11563/1 2982/2990/1 2981/2989/1 +f 11558/11566/1 2977/2985/1 2980/2988/1 11559/11567/1 +f 11563/11571/1 11568/11576/1 2977/2985/1 11558/11566/1 +f 11568/11576/1 11567/11575/1 2978/2986/1 2977/2985/1 +f 11570/11578/1 2973/2981/1 2976/2984/1 11571/11579/1 +f 11575/11583/1 11580/11588/1 2973/2981/1 11570/11578/1 +f 11580/11588/1 11579/11587/1 2974/2982/1 2973/2981/1 +f 11582/11590/1 2969/2977/1 2972/2980/1 11583/11591/1 +f 11587/11595/1 11592/11600/1 2969/2977/1 11582/11590/1 +f 11592/11600/1 11591/11599/1 2970/2978/1 2969/2977/1 +f 11594/11602/1 2965/2973/1 2968/2976/1 11595/11603/1 +f 11599/11607/1 11604/11612/1 2965/2973/1 11594/11602/1 +f 11604/11612/1 11603/11611/1 2966/2974/1 2965/2973/1 +f 11606/11614/1 2961/2969/1 2964/2972/1 11607/11615/1 +f 11611/11619/1 11616/11624/1 2961/2969/1 11606/11614/1 +f 11616/11624/1 11615/11623/1 2962/2970/1 2961/2969/1 +f 11618/11626/1 2957/2965/1 2960/2968/1 11619/11627/1 +f 11623/11631/1 11628/11636/1 2957/2965/1 11618/11626/1 +f 11628/11636/1 11627/11635/1 2958/2966/1 2957/2965/1 +f 11630/11638/1 2953/2961/1 2956/2964/1 11631/11639/1 +f 11635/11643/1 11640/11648/1 2953/2961/1 11630/11638/1 +f 11640/11648/1 11639/11647/1 2954/2962/1 2953/2961/1 +f 11642/11650/1 2949/2957/1 2952/2960/1 11643/11651/1 +f 11647/11655/1 11652/11660/1 2949/2957/1 11642/11650/1 +f 11652/11660/1 11651/11659/1 2950/2958/1 2949/2957/1 +f 11654/11662/1 2945/2953/1 2948/2956/1 11655/11663/1 +f 11659/11667/1 11664/11672/1 2945/2953/1 11654/11662/1 +f 11664/11672/1 11663/11671/1 2946/2954/1 2945/2953/1 +f 11666/11674/1 2941/2949/1 2944/2952/1 11667/11675/1 +f 11671/11679/1 11676/11684/1 2941/2949/1 11666/11674/1 +f 11676/11684/1 11675/11683/1 2942/2950/1 2941/2949/1 +f 11678/11686/1 2937/2945/1 2940/2948/1 11679/11687/1 +f 11683/11691/1 11688/11696/1 2937/2945/1 11678/11686/1 +f 11688/11696/1 11687/11695/1 2938/2946/1 2937/2945/1 +f 11690/11698/1 2933/2941/1 2936/2944/1 11691/11699/1 +f 11695/11703/1 11700/11708/1 2933/2941/1 11690/11698/1 +f 11700/11708/1 11699/11707/1 2934/2942/1 2933/2941/1 +f 11702/11710/1 2929/2937/1 2932/2940/1 11703/11711/1 +f 11707/11715/1 11712/11720/1 2929/2937/1 11702/11710/1 +f 11712/11720/1 11711/11719/1 2930/2938/1 2929/2937/1 +f 11714/11722/1 2925/2933/1 2928/2936/1 11715/11723/1 +f 11719/11727/1 11724/11732/1 2925/2933/1 11714/11722/1 +f 11724/11732/1 11723/11731/1 2926/2934/1 2925/2933/1 +f 11726/11734/1 2921/2929/1 2924/2932/1 11727/11735/1 +f 11731/11739/1 11736/11744/1 2921/2929/1 11726/11734/1 +f 11736/11744/1 11735/11743/1 2922/2930/1 2921/2929/1 +f 11738/11746/1 2917/2925/1 2920/2928/1 11739/11747/1 +f 11743/11751/1 11748/11756/1 2917/2925/1 11738/11746/1 +f 11748/11756/1 11747/11755/1 2918/2926/1 2917/2925/1 +f 11750/11758/1 2913/2921/1 2916/2924/1 11751/11759/1 +f 11755/11763/1 11760/11768/1 2913/2921/1 11750/11758/1 +f 11760/11768/1 11759/11767/1 2914/2922/1 2913/2921/1 +f 11762/11770/1 2909/2917/1 2912/2920/1 11763/11771/1 +f 11767/11775/1 11772/11780/1 2909/2917/1 11762/11770/1 +f 11772/11780/1 11771/11779/1 2910/2918/1 2909/2917/1 +f 11774/11782/1 2905/2913/1 2908/2916/1 11775/11783/1 +f 11779/11787/1 11784/11792/1 2905/2913/1 11774/11782/1 +f 11784/11792/1 11783/11791/1 2906/2914/1 2905/2913/1 +f 11786/11794/1 2901/2909/1 2904/2912/1 11787/11795/1 +f 11791/11799/1 11796/11804/1 2901/2909/1 11786/11794/1 +f 11796/11804/1 11795/11803/1 2902/2910/1 2901/2909/1 +f 11798/11806/1 2897/2905/1 2900/2908/1 11799/11807/1 +f 11803/11811/1 11808/11816/1 2897/2905/1 11798/11806/1 +f 11808/11816/1 11807/11815/1 2898/2906/1 2897/2905/1 +f 11810/11818/1 2893/2901/1 2896/2904/1 11811/11819/1 +f 11815/11823/1 11820/11828/1 2893/2901/1 11810/11818/1 +f 11820/11828/1 11819/11827/1 2894/2902/1 2893/2901/1 +f 11822/11830/1 2889/2897/1 2892/2900/1 11823/11831/1 +f 11827/11835/1 11832/11840/1 2889/2897/1 11822/11830/1 +f 11832/11840/1 11831/11839/1 2890/2898/1 2889/2897/1 +f 11834/11842/1 2885/2893/1 2888/2896/1 11835/11843/1 +f 11839/11847/1 11844/11852/1 2885/2893/1 11834/11842/1 +f 11844/11852/1 11843/11851/1 2886/2894/1 2885/2893/1 +f 11846/11854/1 2881/2889/1 2884/2892/1 11847/11855/1 +f 11851/11859/1 11856/11864/1 2881/2889/1 11846/11854/1 +f 11856/11864/1 11855/11863/1 2882/2890/1 2881/2889/1 +f 11858/11866/1 2877/2885/1 2880/2888/1 11859/11867/1 +f 11863/11871/1 11868/11876/1 2877/2885/1 11858/11866/1 +f 11868/11876/1 11867/11875/1 2878/2886/1 2877/2885/1 +f 11870/11878/1 2873/2881/1 2876/2884/1 11871/11879/1 +f 11875/11883/1 11880/11888/1 2873/2881/1 11870/11878/1 +f 11880/11888/1 11879/11887/1 2874/2882/1 2873/2881/1 +f 11882/11890/1 2869/2877/1 2872/2880/1 11883/11891/1 +f 11887/11895/1 11892/11900/1 2869/2877/1 11882/11890/1 +f 11892/11900/1 11891/11899/1 2870/2878/1 2869/2877/1 +f 11894/11902/1 2865/2873/1 2868/2876/1 11895/11903/1 +f 11899/11907/1 11904/11912/1 2865/2873/1 11894/11902/1 +f 11904/11912/1 11903/11911/1 2866/2874/1 2865/2873/1 +f 11906/11914/1 2861/2869/1 2864/2872/1 11907/11915/1 +f 11911/11919/1 11916/11924/1 2861/2869/1 11906/11914/1 +f 11916/11924/1 11915/11923/1 2862/2870/1 2861/2869/1 +f 11918/11926/1 2857/2865/1 2860/2868/1 11919/11927/1 +f 11923/11931/1 11928/11936/1 2857/2865/1 11918/11926/1 +f 11928/11936/1 11927/11935/1 2858/2866/1 2857/2865/1 +f 11930/11938/1 2853/2861/1 2856/2864/1 11931/11939/1 +f 11935/11943/1 11940/11948/1 2853/2861/1 11930/11938/1 +f 11940/11948/1 11939/11947/1 2854/2862/1 2853/2861/1 +f 11942/11950/1 2849/2857/1 2852/2860/1 11943/11951/1 +f 11947/11955/1 11952/11960/1 2849/2857/1 11942/11950/1 +f 11952/11960/1 11951/11959/1 2850/2858/1 2849/2857/1 +f 11954/11962/1 2845/2853/1 2848/2856/1 11955/11963/1 +f 11959/11967/1 11964/11972/1 2845/2853/1 11954/11962/1 +f 11964/11972/1 11963/11971/1 2846/2854/1 2845/2853/1 +f 11966/11974/1 2841/2849/1 2844/2852/1 11967/11975/1 +f 11971/11979/1 11976/11984/1 2841/2849/1 11966/11974/1 +f 11976/11984/1 11975/11983/1 2842/2850/1 2841/2849/1 +f 11978/11986/1 2837/2845/1 2840/2848/1 11979/11987/1 +f 11983/11991/1 11988/11996/1 2837/2845/1 11978/11986/1 +f 11988/11996/1 11987/11995/1 2838/2846/1 2837/2845/1 +f 11990/11998/1 2833/2841/1 2836/2844/1 11991/11999/1 +f 11995/12003/1 12000/12008/1 2833/2841/1 11990/11998/1 +f 12000/12008/1 11999/12007/1 2834/2842/1 2833/2841/1 +f 12002/12010/1 2829/2837/1 2832/2840/1 12003/12011/1 +f 12007/12015/1 12012/12020/1 2829/2837/1 12002/12010/1 +f 12012/12020/1 12011/12019/1 2830/2838/1 2829/2837/1 +f 12014/12022/1 2825/2833/1 2828/2836/1 12015/12023/1 +f 12019/12027/1 12024/12032/1 2825/2833/1 12014/12022/1 +f 12024/12032/1 12023/12031/1 2826/2834/1 2825/2833/1 +f 12026/12034/1 2821/2829/1 2824/2832/1 12027/12035/1 +f 12031/12039/1 12036/12044/1 2821/2829/1 12026/12034/1 +f 12036/12044/1 12035/12043/1 2822/2830/1 2821/2829/1 +f 12038/12046/1 2817/2825/1 2820/2828/1 12039/12047/1 +f 12043/12051/1 12048/12056/1 2817/2825/1 12038/12046/1 +f 12048/12056/1 12047/12055/1 2818/2826/1 2817/2825/1 +f 12050/12058/1 2813/2821/1 2816/2824/1 12051/12059/1 +f 12055/12063/1 12060/12068/1 2813/2821/1 12050/12058/1 +f 12060/12068/1 12059/12067/1 2814/2822/1 2813/2821/1 +f 12062/12070/1 2809/2817/1 2812/2820/1 12063/12071/1 +f 12067/12075/1 12072/12080/1 2809/2817/1 12062/12070/1 +f 12072/12080/1 12071/12079/1 2810/2818/1 2809/2817/1 +f 12074/12082/1 2805/2813/1 2808/2816/1 12075/12083/1 +f 12079/12087/1 12084/12092/1 2805/2813/1 12074/12082/1 +f 12084/12092/1 12083/12091/1 2806/2814/1 2805/2813/1 +f 12086/12094/1 2801/2809/1 2804/2812/1 12087/12095/1 +f 12091/12099/1 12096/12104/1 2801/2809/1 12086/12094/1 +f 12096/12104/1 12095/12103/1 2802/2810/1 2801/2809/1 +f 12098/12106/1 2797/2805/1 2800/2808/1 12099/12107/1 +f 12103/12111/1 12108/12116/1 2797/2805/1 12098/12106/1 +f 12108/12116/1 12107/12115/1 2798/2806/1 2797/2805/1 +f 12110/12118/1 2793/2801/1 2796/2804/1 12111/12119/1 +f 12115/12123/1 12120/12128/1 2793/2801/1 12110/12118/1 +f 12120/12128/1 12119/12127/1 2794/2802/1 2793/2801/1 +f 12122/12130/1 2789/2797/1 2792/2800/1 12123/12131/1 +f 12127/12135/1 12132/12140/1 2789/2797/1 12122/12130/1 +f 12132/12140/1 12131/12139/1 2790/2798/1 2789/2797/1 +f 12134/12142/1 2785/2793/1 2788/2796/1 12135/12143/1 +f 12139/12147/1 12144/12152/1 2785/2793/1 12134/12142/1 +f 12144/12152/1 12143/12151/1 2786/2794/1 2785/2793/1 +f 12146/12154/1 2781/2789/1 2784/2792/1 12147/12155/1 +f 12151/12159/1 12156/12164/1 2781/2789/1 12146/12154/1 +f 12156/12164/1 12155/12163/1 2782/2790/1 2781/2789/1 +f 12158/12166/1 2777/2785/1 2780/2788/1 12159/12167/1 +f 12163/12171/1 12168/12176/1 2777/2785/1 12158/12166/1 +f 12168/12176/1 12167/12175/1 2778/2786/1 2777/2785/1 +f 12170/12178/1 2773/2781/1 2776/2784/1 12171/12179/1 +f 12175/12183/1 12180/12188/1 2773/2781/1 12170/12178/1 +f 12180/12188/1 12179/12187/1 2774/2782/1 2773/2781/1 +f 12182/12190/1 2769/2777/1 2772/2780/1 12183/12191/1 +f 12187/12195/1 12192/12200/1 2769/2777/1 12182/12190/1 +f 12192/12200/1 12191/12199/1 2770/2778/1 2769/2777/1 +f 12194/12202/1 2765/2773/1 2768/2776/1 12195/12203/1 +f 12199/12207/1 12204/12212/1 2765/2773/1 12194/12202/1 +f 12204/12212/1 12203/12211/1 2766/2774/1 2765/2773/1 +f 12206/12214/1 2761/2769/1 2764/2772/1 12207/12215/1 +f 12211/12219/1 12216/12224/1 2761/2769/1 12206/12214/1 +f 12216/12224/1 12215/12223/1 2762/2770/1 2761/2769/1 +f 12218/12226/1 2757/2765/1 2760/2768/1 12219/12227/1 +f 12223/12231/1 12228/12236/1 2757/2765/1 12218/12226/1 +f 12228/12236/1 12227/12235/1 2758/2766/1 2757/2765/1 +f 12230/12238/1 2753/2761/1 2756/2764/1 12231/12239/1 +f 12235/12243/1 12240/12248/1 2753/2761/1 12230/12238/1 +f 12240/12248/1 12239/12247/1 2754/2762/1 2753/2761/1 +f 12242/12250/1 2749/2757/1 2752/2760/1 12243/12251/1 +f 12247/12255/1 12252/12260/1 2749/2757/1 12242/12250/1 +f 12252/12260/1 12251/12259/1 2750/2758/1 2749/2757/1 +f 12254/12262/1 2745/2753/1 2748/2756/1 12255/12263/1 +f 12259/12267/1 12264/12272/1 2745/2753/1 12254/12262/1 +f 12264/12272/1 12263/12271/1 2746/2754/1 2745/2753/1 +f 12266/12274/1 2741/2749/1 2744/2752/1 12267/12275/1 +f 12271/12279/1 12276/12284/1 2741/2749/1 12266/12274/1 +f 12276/12284/1 12275/12283/1 2742/2750/1 2741/2749/1 +f 12278/12286/1 2737/2745/1 2740/2748/1 12279/12287/1 +f 12283/12291/1 12288/12296/1 2737/2745/1 12278/12286/1 +f 12288/12296/1 12287/12295/1 2738/2746/1 2737/2745/1 +f 12290/12298/1 2733/2741/1 2736/2744/1 12291/12299/1 +f 12295/12303/1 12300/12308/1 2733/2741/1 12290/12298/1 +f 12300/12308/1 12299/12307/1 2734/2742/1 2733/2741/1 +f 12302/12310/1 2729/2737/1 2732/2740/1 12303/12311/1 +f 12307/12315/1 12312/12320/1 2729/2737/1 12302/12310/1 +f 12312/12320/1 12311/12319/1 2730/2738/1 2729/2737/1 +f 12314/12322/1 2725/2733/1 2728/2736/1 12315/12323/1 +f 12319/12327/1 12324/12332/1 2725/2733/1 12314/12322/1 +f 12324/12332/1 12323/12331/1 2726/2734/1 2725/2733/1 +f 12326/12334/1 2721/2729/1 2724/2732/1 12327/12335/1 +f 12331/12339/1 12336/12344/1 2721/2729/1 12326/12334/1 +f 12336/12344/1 12335/12343/1 2722/2730/1 2721/2729/1 +f 12338/12346/1 2717/2725/1 2720/2728/1 12339/12347/1 +f 12343/12351/1 12348/12356/1 2717/2725/1 12338/12346/1 +f 12348/12356/1 12347/12355/1 2718/2726/1 2717/2725/1 +f 12350/12358/1 2713/2721/1 2716/2724/1 12351/12359/1 +f 12355/12363/1 12360/12368/1 2713/2721/1 12350/12358/1 +f 12360/12368/1 12359/12367/1 2714/2722/1 2713/2721/1 +f 12362/12370/1 2709/2717/1 2712/2720/1 12363/12371/1 +f 12367/12375/1 12372/12380/1 2709/2717/1 12362/12370/1 +f 12372/12380/1 12371/12379/1 2710/2718/1 2709/2717/1 +f 12374/12382/1 2705/2713/1 2708/2716/1 12375/12383/1 +f 12379/12387/1 12384/12392/1 2705/2713/1 12374/12382/1 +f 12384/12392/1 12383/12391/1 2706/2714/1 2705/2713/1 +f 12386/12394/1 2701/2709/1 2704/2712/1 12387/12395/1 +f 12391/12399/1 12396/12404/1 2701/2709/1 12386/12394/1 +f 12396/12404/1 12395/12403/1 2702/2710/1 2701/2709/1 +f 12398/12406/1 2697/2705/1 2700/2708/1 12399/12407/1 +f 12403/12411/1 12408/12416/1 2697/2705/1 12398/12406/1 +f 12408/12416/1 12407/12415/1 2698/2706/1 2697/2705/1 +f 12410/12418/1 2693/2701/1 2696/2704/1 12411/12419/1 +f 12415/12423/1 12420/12428/1 2693/2701/1 12410/12418/1 +f 12420/12428/1 12419/12427/1 2694/2702/1 2693/2701/1 +f 12422/12430/1 2689/2697/1 2692/2700/1 12423/12431/1 +f 12427/12435/1 12432/12440/1 2689/2697/1 12422/12430/1 +f 12432/12440/1 12431/12439/1 2690/2698/1 2689/2697/1 +f 12434/12442/1 2685/2693/1 2688/2696/1 12435/12443/1 +f 12439/12447/1 12444/12452/1 2685/2693/1 12434/12442/1 +f 12444/12452/1 12443/12451/1 2686/2694/1 2685/2693/1 +f 12446/12454/1 2681/2689/1 2684/2692/1 12447/12455/1 +f 12451/12459/1 12456/12464/1 2681/2689/1 12446/12454/1 +f 12456/12464/1 12455/12463/1 2682/2690/1 2681/2689/1 +f 12458/12466/1 2677/2685/1 2680/2688/1 12459/12467/1 +f 12463/12471/1 12468/12476/1 2677/2685/1 12458/12466/1 +f 12468/12476/1 12467/12475/1 2678/2686/1 2677/2685/1 +f 12470/12478/1 2673/2681/1 2676/2684/1 12471/12479/1 +f 12475/12483/1 12480/12488/1 2673/2681/1 12470/12478/1 +f 12480/12488/1 12479/12487/1 2674/2682/1 2673/2681/1 +f 12482/12490/1 2669/2677/1 2672/2680/1 12483/12491/1 +f 12487/12495/1 12492/12500/1 2669/2677/1 12482/12490/1 +f 12492/12500/1 12491/12499/1 2670/2678/1 2669/2677/1 +f 12494/12502/1 2665/2673/1 2668/2676/1 12495/12503/1 +f 12499/12507/1 12504/12512/1 2665/2673/1 12494/12502/1 +f 12504/12512/1 12503/12511/1 2666/2674/1 2665/2673/1 +f 12506/12514/1 2661/2669/1 2664/2672/1 12507/12515/1 +f 12511/12519/1 12516/12524/1 2661/2669/1 12506/12514/1 +f 12516/12524/1 12515/12523/1 2662/2670/1 2661/2669/1 +f 12518/12526/1 2657/2665/1 2660/2668/1 12519/12527/1 +f 12523/12531/1 12528/12536/1 2657/2665/1 12518/12526/1 +f 12528/12536/1 12527/12535/1 2658/2666/1 2657/2665/1 +f 12530/12538/1 2653/2661/1 2656/2664/1 12531/12539/1 +f 12535/12543/1 12540/12548/1 2653/2661/1 12530/12538/1 +f 12540/12548/1 12539/12547/1 2654/2662/1 2653/2661/1 +f 12542/12550/1 2649/2657/1 2652/2660/1 12543/12551/1 +f 12547/12555/1 12552/12560/1 2649/2657/1 12542/12550/1 +f 12552/12560/1 12551/12559/1 2650/2658/1 2649/2657/1 +f 12554/12562/1 2645/2653/1 2648/2656/1 12555/12563/1 +f 12559/12567/1 12564/12572/1 2645/2653/1 12554/12562/1 +f 12564/12572/1 12563/12571/1 2646/2654/1 2645/2653/1 +f 12566/12574/1 2641/2649/1 2644/2652/1 12567/12575/1 +f 12571/12579/1 12576/12584/1 2641/2649/1 12566/12574/1 +f 12576/12584/1 12575/12583/1 2642/2650/1 2641/2649/1 +f 12578/12586/1 2637/2645/1 2640/2648/1 12579/12587/1 +f 12583/12591/1 12588/12596/1 2637/2645/1 12578/12586/1 +f 12588/12596/1 12587/12595/1 2638/2646/1 2637/2645/1 +f 12590/12598/1 2633/2641/1 2636/2644/1 12591/12599/1 +f 12595/12603/1 12600/12608/1 2633/2641/1 12590/12598/1 +f 12600/12608/1 12599/12607/1 2634/2642/1 2633/2641/1 +f 12602/12610/1 2629/2637/1 2632/2640/1 12603/12611/1 +f 12607/12615/1 12612/12620/1 2629/2637/1 12602/12610/1 +f 12612/12620/1 12611/12619/1 2630/2638/1 2629/2637/1 +f 12614/12622/1 2625/2633/1 2628/2636/1 12615/12623/1 +f 12619/12627/1 12624/12632/1 2625/2633/1 12614/12622/1 +f 12624/12632/1 12623/12631/1 2626/2634/1 2625/2633/1 +f 12626/12634/1 2621/2629/1 2624/2632/1 12627/12635/1 +f 12631/12639/1 12636/12644/1 2621/2629/1 12626/12634/1 +f 12636/12644/1 12635/12643/1 2622/2630/1 2621/2629/1 +f 12638/12646/1 2617/2625/1 2620/2628/1 12639/12647/1 +f 12643/12651/1 12648/12656/1 2617/2625/1 12638/12646/1 +f 12648/12656/1 12647/12655/1 2618/2626/1 2617/2625/1 +f 12650/12658/1 2613/2621/1 2616/2624/1 12651/12659/1 +f 12655/12663/1 12660/12668/1 2613/2621/1 12650/12658/1 +f 12660/12668/1 12659/12667/1 2614/2622/1 2613/2621/1 +f 12662/12670/1 2609/2617/1 2612/2620/1 12663/12671/1 +f 12667/12675/1 12672/12680/1 2609/2617/1 12662/12670/1 +f 12672/12680/1 12671/12679/1 2610/2618/1 2609/2617/1 +f 12674/12682/1 2605/2613/1 2608/2616/1 12675/12683/1 +f 12679/12687/1 12684/12692/1 2605/2613/1 12674/12682/1 +f 12684/12692/1 12683/12691/1 2606/2614/1 2605/2613/1 +f 12686/12694/1 2601/2609/1 2604/2612/1 12687/12695/1 +f 12691/12699/1 12696/12704/1 2601/2609/1 12686/12694/1 +f 12696/12704/1 12695/12703/1 2602/2610/1 2601/2609/1 +f 12698/12706/1 2597/2605/1 2600/2608/1 12699/12707/1 +f 12703/12711/1 12708/12716/1 2597/2605/1 12698/12706/1 +f 12708/12716/1 12707/12715/1 2598/2606/1 2597/2605/1 +f 12710/12718/1 2593/2601/1 2596/2604/1 12711/12719/1 +f 12715/12723/1 12720/12728/1 2593/2601/1 12710/12718/1 +f 12720/12728/1 12719/12727/1 2594/2602/1 2593/2601/1 +f 12722/12730/1 2589/2597/1 2592/2600/1 12723/12731/1 +f 12727/12735/1 12732/12740/1 2589/2597/1 12722/12730/1 +f 12732/12740/1 12731/12739/1 2590/2598/1 2589/2597/1 +f 12734/12742/1 2585/2593/1 2588/2596/1 12735/12743/1 +f 12739/12747/1 12744/12752/1 2585/2593/1 12734/12742/1 +f 12744/12752/1 12743/12751/1 2586/2594/1 2585/2593/1 +f 12746/12754/1 2581/2589/1 2584/2592/1 12747/12755/1 +f 12751/12759/1 12756/12764/1 2581/2589/1 12746/12754/1 +f 12756/12764/1 12755/12763/1 2582/2590/1 2581/2589/1 +f 12758/12766/1 2577/2585/1 2580/2588/1 12759/12767/1 +f 12763/12771/1 12768/12776/1 2577/2585/1 12758/12766/1 +f 12768/12776/1 12767/12775/1 2578/2586/1 2577/2585/1 +f 12770/12778/1 2573/2581/1 2576/2584/1 12771/12779/1 +f 12775/12783/1 12780/12788/1 2573/2581/1 12770/12778/1 +f 12780/12788/1 12779/12787/1 2574/2582/1 2573/2581/1 +f 12782/12790/1 2569/2577/1 2572/2580/1 12783/12791/1 +f 12787/12795/1 12792/12800/1 2569/2577/1 12782/12790/1 +f 12792/12800/1 12791/12799/1 2570/2578/1 2569/2577/1 +f 12794/12802/1 2565/2573/1 2568/2576/1 12795/12803/1 +f 12799/12807/1 12804/12812/1 2565/2573/1 12794/12802/1 +f 12804/12812/1 12803/12811/1 2566/2574/1 2565/2573/1 +f 12806/12814/1 2561/2569/1 2564/2572/1 12807/12815/1 +f 12811/12819/1 12816/12824/1 2561/2569/1 12806/12814/1 +f 12816/12824/1 12815/12823/1 2562/2570/1 2561/2569/1 +f 12818/12826/1 2557/2565/1 2560/2568/1 12819/12827/1 +f 12823/12831/1 12828/12836/1 2557/2565/1 12818/12826/1 +f 12828/12836/1 12827/12835/1 2558/2566/1 2557/2565/1 +f 12830/12838/1 2553/2561/1 2556/2564/1 12831/12839/1 +f 12835/12843/1 12840/12848/1 2553/2561/1 12830/12838/1 +f 12840/12848/1 12839/12847/1 2554/2562/1 2553/2561/1 +f 12842/12850/1 2549/2557/1 2552/2560/1 12843/12851/1 +f 12847/12855/1 12852/12860/1 2549/2557/1 12842/12850/1 +f 12852/12860/1 12851/12859/1 2550/2558/1 2549/2557/1 +f 12854/12862/1 2545/2553/1 2548/2556/1 12855/12863/1 +f 12859/12867/1 12864/12872/1 2545/2553/1 12854/12862/1 +f 12864/12872/1 12863/12871/1 2546/2554/1 2545/2553/1 +f 12866/12874/1 2541/2549/1 2544/2552/1 12867/12875/1 +f 12871/12879/1 12876/12884/1 2541/2549/1 12866/12874/1 +f 12876/12884/1 12875/12883/1 2542/2550/1 2541/2549/1 +f 12878/12886/1 2537/2545/1 2540/2548/1 12879/12887/1 +f 12883/12891/1 12888/12896/1 2537/2545/1 12878/12886/1 +f 12888/12896/1 12887/12895/1 2538/2546/1 2537/2545/1 +f 12890/12898/1 2533/2541/1 2536/2544/1 12891/12899/1 +f 12895/12903/1 12900/12908/1 2533/2541/1 12890/12898/1 +f 12900/12908/1 12899/12907/1 2534/2542/1 2533/2541/1 +f 12902/12910/1 2529/2537/1 2532/2540/1 12903/12911/1 +f 12907/12915/1 12912/12920/1 2529/2537/1 12902/12910/1 +f 12912/12920/1 12911/12919/1 2530/2538/1 2529/2537/1 +f 12914/12922/1 2525/2533/1 2528/2536/1 12915/12923/1 +f 12919/12927/1 12924/12932/1 2525/2533/1 12914/12922/1 +f 12924/12932/1 12923/12931/1 2526/2534/1 2525/2533/1 +f 12926/12934/1 2521/2529/1 2524/2532/1 12927/12935/1 +f 12931/12939/1 12936/12944/1 2521/2529/1 12926/12934/1 +f 12936/12944/1 12935/12943/1 2522/2530/1 2521/2529/1 +f 12938/12946/1 2517/2525/1 2520/2528/1 12939/12947/1 +f 12943/12951/1 12948/12956/1 2517/2525/1 12938/12946/1 +f 12948/12956/1 12947/12955/1 2518/2526/1 2517/2525/1 +f 12950/12958/1 2513/2521/1 2516/2524/1 12951/12959/1 +f 12955/12963/1 12960/12968/1 2513/2521/1 12950/12958/1 +f 12960/12968/1 12959/12967/1 2514/2522/1 2513/2521/1 +f 12962/12970/1 2509/2517/1 2512/2520/1 12963/12971/1 +f 12967/12975/1 12972/12980/1 2509/2517/1 12962/12970/1 +f 12972/12980/1 12971/12979/1 2510/2518/1 2509/2517/1 +f 12974/12982/1 2505/2513/1 2508/2516/1 12975/12983/1 +f 12979/12987/1 12984/12992/1 2505/2513/1 12974/12982/1 +f 12984/12992/1 12983/12991/1 2506/2514/1 2505/2513/1 +f 12986/12994/1 2501/2509/1 2504/2512/1 12987/12995/1 +f 12991/12999/1 12996/13004/1 2501/2509/1 12986/12994/1 +f 12996/13004/1 12995/13003/1 2502/2510/1 2501/2509/1 +f 12998/13006/1 2497/2505/1 2500/2508/1 12999/13007/1 +f 13003/13011/1 13008/13016/1 2497/2505/1 12998/13006/1 +f 13008/13016/1 13007/13015/1 2498/2506/1 2497/2505/1 +f 13010/13018/1 2493/2501/1 2496/2504/1 13011/13019/1 +f 13015/13023/1 13020/13028/1 2493/2501/1 13010/13018/1 +f 13020/13028/1 13019/13027/1 2494/2502/1 2493/2501/1 +f 13022/13030/1 2489/2497/1 2492/2500/1 13023/13031/1 +f 13027/13035/1 13032/13040/1 2489/2497/1 13022/13030/1 +f 13032/13040/1 13031/13039/1 2490/2498/1 2489/2497/1 +f 13034/13042/1 2485/2493/1 2488/2496/1 13035/13043/1 +f 13039/13047/1 13044/13052/1 2485/2493/1 13034/13042/1 +f 13044/13052/1 13043/13051/1 2486/2494/1 2485/2493/1 +f 13046/13054/1 2481/2489/1 2484/2492/1 13047/13055/1 +f 13051/13059/1 13056/13064/1 2481/2489/1 13046/13054/1 +f 13056/13064/1 13055/13063/1 2482/2490/1 2481/2489/1 +f 13058/13066/1 2477/2485/1 2480/2488/1 13059/13067/1 +f 13063/13071/1 13068/13076/1 2477/2485/1 13058/13066/1 +f 13068/13076/1 13067/13075/1 2478/2486/1 2477/2485/1 +f 13070/13078/1 2473/2481/1 2476/2484/1 13071/13079/1 +f 13075/13083/1 13080/13088/1 2473/2481/1 13070/13078/1 +f 13080/13088/1 13079/13087/1 2474/2482/1 2473/2481/1 +f 13082/13090/1 2469/2477/1 2472/2480/1 13083/13091/1 +f 13087/13095/1 13092/13100/1 2469/2477/1 13082/13090/1 +f 13092/13100/1 13091/13099/1 2470/2478/1 2469/2477/1 +f 13094/13102/1 2465/2473/1 2468/2476/1 13095/13103/1 +f 13099/13107/1 13104/13112/1 2465/2473/1 13094/13102/1 +f 13104/13112/1 13103/13111/1 2466/2474/1 2465/2473/1 +f 13106/13114/1 2461/2469/1 2464/2472/1 13107/13115/1 +f 13111/13119/1 13116/13124/1 2461/2469/1 13106/13114/1 +f 13116/13124/1 13115/13123/1 2462/2470/1 2461/2469/1 +f 13118/13126/1 2457/2465/1 2460/2468/1 13119/13127/1 +f 13123/13131/1 13128/13136/1 2457/2465/1 13118/13126/1 +f 13128/13136/1 13127/13135/1 2458/2466/1 2457/2465/1 +f 13130/13138/1 2453/2461/1 2456/2464/1 13131/13139/1 +f 13135/13143/1 13140/13148/1 2453/2461/1 13130/13138/1 +f 13140/13148/1 13139/13147/1 2454/2462/1 2453/2461/1 +f 13142/13150/1 2449/2457/1 2452/2460/1 13143/13151/1 +f 13147/13155/1 13152/13160/1 2449/2457/1 13142/13150/1 +f 13152/13160/1 13151/13159/1 2450/2458/1 2449/2457/1 +f 13154/13162/1 2445/2453/1 2448/2456/1 13155/13163/1 +f 13159/13167/1 13164/13172/1 2445/2453/1 13154/13162/1 +f 13164/13172/1 13163/13171/1 2446/2454/1 2445/2453/1 +f 13166/13174/1 2441/2449/1 2444/2452/1 13167/13175/1 +f 13171/13179/1 13176/13184/1 2441/2449/1 13166/13174/1 +f 13176/13184/1 13175/13183/1 2442/2450/1 2441/2449/1 +f 13178/13186/1 2437/2445/1 2440/2448/1 13179/13187/1 +f 13183/13191/1 13188/13196/1 2437/2445/1 13178/13186/1 +f 13188/13196/1 13187/13195/1 2438/2446/1 2437/2445/1 +f 13190/13198/1 2433/2441/1 2436/2444/1 13191/13199/1 +f 13195/13203/1 13200/13208/1 2433/2441/1 13190/13198/1 +f 13200/13208/1 13199/13207/1 2434/2442/1 2433/2441/1 +f 13202/13210/1 2429/2437/1 2432/2440/1 13203/13211/1 +f 13207/13215/1 13212/13220/1 2429/2437/1 13202/13210/1 +f 13212/13220/1 13211/13219/1 2430/2438/1 2429/2437/1 +f 13214/13222/1 2425/2433/1 2428/2436/1 13215/13223/1 +f 13219/13227/1 13224/13232/1 2425/2433/1 13214/13222/1 +f 13224/13232/1 13223/13231/1 2426/2434/1 2425/2433/1 +f 13226/13234/1 2421/2429/1 2424/2432/1 13227/13235/1 +f 13231/13239/1 13236/13244/1 2421/2429/1 13226/13234/1 +f 13236/13244/1 13235/13243/1 2422/2430/1 2421/2429/1 +f 13238/13246/1 2417/2425/1 2420/2428/1 13239/13247/1 +f 13243/13251/1 13248/13256/1 2417/2425/1 13238/13246/1 +f 13248/13256/1 13247/13255/1 2418/2426/1 2417/2425/1 +f 13250/13258/1 2413/2421/1 2416/2424/1 13251/13259/1 +f 13255/13263/1 13260/13268/1 2413/2421/1 13250/13258/1 +f 13260/13268/1 13259/13267/1 2414/2422/1 2413/2421/1 +f 13262/13270/1 2409/2417/1 2412/2420/1 13263/13271/1 +f 13267/13275/1 13272/13280/1 2409/2417/1 13262/13270/1 +f 13272/13280/1 13271/13279/1 2410/2418/1 2409/2417/1 +f 13274/13282/1 2405/2413/1 2408/2416/1 13275/13283/1 +f 13279/13287/1 13284/13292/1 2405/2413/1 13274/13282/1 +f 13284/13292/1 13283/13291/1 2406/2414/1 2405/2413/1 +f 13286/13294/1 2401/2409/1 2404/2412/1 13287/13295/1 +f 13291/13299/1 13296/13304/1 2401/2409/1 13286/13294/1 +f 13296/13304/1 13295/13303/1 2402/2410/1 2401/2409/1 +f 13298/13306/1 2397/2405/1 2400/2408/1 13299/13307/1 +f 13303/13311/1 13308/13316/1 2397/2405/1 13298/13306/1 +f 13308/13316/1 13307/13315/1 2398/2406/1 2397/2405/1 +f 13310/13318/1 2393/2401/1 2396/2404/1 13311/13319/1 +f 13315/13323/1 13320/13328/1 2393/2401/1 13310/13318/1 +f 13320/13328/1 13319/13327/1 2394/2402/1 2393/2401/1 +f 13322/13330/1 2389/2397/1 2392/2400/1 13323/13331/1 +f 13327/13335/1 13332/13340/1 2389/2397/1 13322/13330/1 +f 13332/13340/1 13331/13339/1 2390/2398/1 2389/2397/1 +f 13334/13342/1 2385/2393/1 2388/2396/1 13335/13343/1 +f 13339/13347/1 13344/13352/1 2385/2393/1 13334/13342/1 +f 13344/13352/1 13343/13351/1 2386/2394/1 2385/2393/1 +f 13346/13354/1 2381/2389/1 2384/2392/1 13347/13355/1 +f 13351/13359/1 13356/13364/1 2381/2389/1 13346/13354/1 +f 13356/13364/1 13355/13363/1 2382/2390/1 2381/2389/1 +f 13358/13366/1 2377/2385/1 2380/2388/1 13359/13367/1 +f 13363/13371/1 13368/13376/1 2377/2385/1 13358/13366/1 +f 13368/13376/1 13367/13375/1 2378/2386/1 2377/2385/1 +f 13370/13378/1 2373/2381/1 2376/2384/1 13371/13379/1 +f 13375/13383/1 13380/13388/1 2373/2381/1 13370/13378/1 +f 13380/13388/1 13379/13387/1 2374/2382/1 2373/2381/1 +f 13382/13390/1 2369/2377/1 2372/2380/1 13383/13391/1 +f 13387/13395/1 13392/13400/1 2369/2377/1 13382/13390/1 +f 13392/13400/1 13391/13399/1 2370/2378/1 2369/2377/1 +f 13394/13402/1 2365/2373/1 2368/2376/1 13395/13403/1 +f 13399/13407/1 13404/13412/1 2365/2373/1 13394/13402/1 +f 13404/13412/1 13403/13411/1 2366/2374/1 2365/2373/1 +f 13406/13414/1 2361/2369/1 2364/2372/1 13407/13415/1 +f 13411/13419/1 13416/13424/1 2361/2369/1 13406/13414/1 +f 13416/13424/1 13415/13423/1 2362/2370/1 2361/2369/1 +f 13418/13426/1 2357/2365/1 2360/2368/1 13419/13427/1 +f 13423/13431/1 13428/13436/1 2357/2365/1 13418/13426/1 +f 13428/13436/1 13427/13435/1 2358/2366/1 2357/2365/1 +f 13430/13438/1 2353/2361/1 2356/2364/1 13431/13439/1 +f 13435/13443/1 13440/13448/1 2353/2361/1 13430/13438/1 +f 13440/13448/1 13439/13447/1 2354/2362/1 2353/2361/1 +f 13442/13450/1 2349/2357/1 2352/2360/1 13443/13451/1 +f 13447/13455/1 13452/13460/1 2349/2357/1 13442/13450/1 +f 13452/13460/1 13451/13459/1 2350/2358/1 2349/2357/1 +f 13454/13462/1 2345/2353/1 2348/2356/1 13455/13463/1 +f 13459/13467/1 13464/13472/1 2345/2353/1 13454/13462/1 +f 13464/13472/1 13463/13471/1 2346/2354/1 2345/2353/1 +f 13466/13474/1 2341/2349/1 2344/2352/1 13467/13475/1 +f 13471/13479/1 13476/13484/1 2341/2349/1 13466/13474/1 +f 13476/13484/1 13475/13483/1 2342/2350/1 2341/2349/1 +f 13478/13486/1 2337/2345/1 2340/2348/1 13479/13487/1 +f 13483/13491/1 13488/13496/1 2337/2345/1 13478/13486/1 +f 13488/13496/1 13487/13495/1 2338/2346/1 2337/2345/1 +f 13490/13498/1 2333/2341/1 2336/2344/1 13491/13499/1 +f 13495/13503/1 13500/13508/1 2333/2341/1 13490/13498/1 +f 13500/13508/1 13499/13507/1 2334/2342/1 2333/2341/1 +f 13502/13510/1 2329/2337/1 2332/2340/1 13503/13511/1 +f 13507/13515/1 13512/13520/1 2329/2337/1 13502/13510/1 +f 13512/13520/1 13511/13519/1 2330/2338/1 2329/2337/1 +f 13514/13522/1 2325/2333/1 2328/2336/1 13515/13523/1 +f 13519/13527/1 13524/13532/1 2325/2333/1 13514/13522/1 +f 13524/13532/1 13523/13531/1 2326/2334/1 2325/2333/1 +f 13526/13534/1 2321/2329/1 2324/2332/1 13527/13535/1 +f 13531/13539/1 13536/13544/1 2321/2329/1 13526/13534/1 +f 13536/13544/1 13535/13543/1 2322/2330/1 2321/2329/1 +f 13538/13546/1 2317/2325/1 2320/2328/1 13539/13547/1 +f 13543/13551/1 13548/13556/1 2317/2325/1 13538/13546/1 +f 13548/13556/1 13547/13555/1 2318/2326/1 2317/2325/1 +f 13550/13558/1 2313/2321/1 2316/2324/1 13551/13559/1 +f 13555/13563/1 13560/13568/1 2313/2321/1 13550/13558/1 +f 13560/13568/1 13559/13567/1 2314/2322/1 2313/2321/1 +f 13562/13570/1 2309/2317/1 2312/2320/1 13563/13571/1 +f 13567/13575/1 13572/13580/1 2309/2317/1 13562/13570/1 +f 13572/13580/1 13571/13579/1 2310/2318/1 2309/2317/1 +f 13574/13582/1 2305/2313/1 2308/2316/1 13575/13583/1 +f 13579/13587/1 13584/13592/1 2305/2313/1 13574/13582/1 +f 13584/13592/1 13583/13591/1 2306/2314/1 2305/2313/1 +f 13586/13594/1 2301/2309/1 2304/2312/1 13587/13595/1 +f 13591/13599/1 13596/13604/1 2301/2309/1 13586/13594/1 +f 13596/13604/1 13595/13603/1 2302/2310/1 2301/2309/1 +f 13598/13606/1 2297/2305/1 2300/2308/1 13599/13607/1 +f 13603/13611/1 13608/13616/1 2297/2305/1 13598/13606/1 +f 13608/13616/1 13607/13615/1 2298/2306/1 2297/2305/1 +f 13610/13618/1 2293/2301/1 2296/2304/1 13611/13619/1 +f 13615/13623/1 13620/13628/1 2293/2301/1 13610/13618/1 +f 13620/13628/1 13619/13627/1 2294/2302/1 2293/2301/1 +f 13622/13630/1 2289/2297/1 2292/2300/1 13623/13631/1 +f 13627/13635/1 13632/13640/1 2289/2297/1 13622/13630/1 +f 13632/13640/1 13631/13639/1 2290/2298/1 2289/2297/1 +f 13634/13642/1 2285/2293/1 2288/2296/1 13635/13643/1 +f 13639/13647/1 13644/13652/1 2285/2293/1 13634/13642/1 +f 13644/13652/1 13643/13651/1 2286/2294/1 2285/2293/1 +f 13646/13654/1 2281/2289/1 2284/2292/1 13647/13655/1 +f 13651/13659/1 13656/13664/1 2281/2289/1 13646/13654/1 +f 13656/13664/1 13655/13663/1 2282/2290/1 2281/2289/1 +f 13658/13666/1 2277/2285/1 2280/2288/1 13659/13667/1 +f 13663/13671/1 13668/13676/1 2277/2285/1 13658/13666/1 +f 13668/13676/1 13667/13675/1 2278/2286/1 2277/2285/1 +f 13670/13678/1 2273/2281/1 2276/2284/1 13671/13679/1 +f 13675/13683/1 13680/13688/1 2273/2281/1 13670/13678/1 +f 13680/13688/1 13679/13687/1 2274/2282/1 2273/2281/1 +f 13682/13690/1 2269/2277/1 2272/2280/1 13683/13691/1 +f 13687/13695/1 13692/13700/1 2269/2277/1 13682/13690/1 +f 13692/13700/1 13691/13699/1 2270/2278/1 2269/2277/1 +f 13694/13702/1 2265/2273/1 2268/2276/1 13695/13703/1 +f 13699/13707/1 13704/13712/1 2265/2273/1 13694/13702/1 +f 13704/13712/1 13703/13711/1 2266/2274/1 2265/2273/1 +f 13706/13714/1 2261/2269/1 2264/2272/1 13707/13715/1 +f 13711/13719/1 13716/13724/1 2261/2269/1 13706/13714/1 +f 13716/13724/1 13715/13723/1 2262/2270/1 2261/2269/1 +f 13718/13726/1 2257/2265/1 2260/2268/1 13719/13727/1 +f 13723/13731/1 13728/13736/1 2257/2265/1 13718/13726/1 +f 13728/13736/1 13727/13735/1 2258/2266/1 2257/2265/1 +f 13730/13738/1 2253/2261/1 2256/2264/1 13731/13739/1 +f 13735/13743/1 13740/13748/1 2253/2261/1 13730/13738/1 +f 13740/13748/1 13739/13747/1 2254/2262/1 2253/2261/1 +f 13742/13750/1 2249/2257/1 2252/2260/1 13743/13751/1 +f 13747/13755/1 13752/13760/1 2249/2257/1 13742/13750/1 +f 13752/13760/1 13751/13759/1 2250/2258/1 2249/2257/1 +f 13754/13762/1 2245/2253/1 2248/2256/1 13755/13763/1 +f 13759/13767/1 13764/13772/1 2245/2253/1 13754/13762/1 +f 13764/13772/1 13763/13771/1 2246/2254/1 2245/2253/1 +f 13766/13774/1 2241/2249/1 2244/2252/1 13767/13775/1 +f 13771/13779/1 13776/13784/1 2241/2249/1 13766/13774/1 +f 13776/13784/1 13775/13783/1 2242/2250/1 2241/2249/1 +f 13778/13786/1 2237/2245/1 2240/2248/1 13779/13787/1 +f 13783/13791/1 13788/13796/1 2237/2245/1 13778/13786/1 +f 13788/13796/1 13787/13795/1 2238/2246/1 2237/2245/1 +f 13790/13798/1 2233/2241/1 2236/2244/1 13791/13799/1 +f 13795/13803/1 13800/13808/1 2233/2241/1 13790/13798/1 +f 13800/13808/1 13799/13807/1 2234/2242/1 2233/2241/1 +f 13802/13810/1 2229/2237/1 2232/2240/1 13803/13811/1 +f 13807/13815/1 13812/13820/1 2229/2237/1 13802/13810/1 +f 13812/13820/1 13811/13819/1 2230/2238/1 2229/2237/1 +f 13814/13822/1 2225/2233/1 2228/2236/1 13815/13823/1 +f 13819/13827/1 13824/13832/1 2225/2233/1 13814/13822/1 +f 13824/13832/1 13823/13831/1 2226/2234/1 2225/2233/1 +f 13826/13834/1 2221/2229/1 2224/2232/1 13827/13835/1 +f 13831/13839/1 13836/13844/1 2221/2229/1 13826/13834/1 +f 13836/13844/1 13835/13843/1 2222/2230/1 2221/2229/1 +f 13838/13846/1 2217/2225/1 2220/2228/1 13839/13847/1 +f 13843/13851/1 13848/13856/1 2217/2225/1 13838/13846/1 +f 13848/13856/1 13847/13855/1 2218/2226/1 2217/2225/1 +f 13850/13858/1 2213/2221/1 2216/2224/1 13851/13859/1 +f 13855/13863/1 13860/13868/1 2213/2221/1 13850/13858/1 +f 13860/13868/1 13859/13867/1 2214/2222/1 2213/2221/1 +f 13862/13870/1 2209/2217/1 2212/2220/1 13863/13871/1 +f 13867/13875/1 13872/13880/1 2209/2217/1 13862/13870/1 +f 13872/13880/1 13871/13879/1 2210/2218/1 2209/2217/1 +f 13874/13882/1 2205/2213/1 2208/2216/1 13875/13883/1 +f 13879/13887/1 13884/13892/1 2205/2213/1 13874/13882/1 +f 13884/13892/1 13883/13891/1 2206/2214/1 2205/2213/1 +f 13886/13894/1 2201/2209/1 2204/2212/1 13887/13895/1 +f 13891/13899/1 13896/13904/1 2201/2209/1 13886/13894/1 +f 13896/13904/1 13895/13903/1 2202/2210/1 2201/2209/1 +f 13898/13906/1 2197/2205/1 2200/2208/1 13899/13907/1 +f 13903/13911/1 13908/13916/1 2197/2205/1 13898/13906/1 +f 13908/13916/1 13907/13915/1 2198/2206/1 2197/2205/1 +f 13910/13918/1 2193/2201/1 2196/2204/1 13911/13919/1 +f 13915/13923/1 13920/13928/1 2193/2201/1 13910/13918/1 +f 13920/13928/1 13919/13927/1 2194/2202/1 2193/2201/1 +f 13922/13930/1 2189/2197/1 2192/2200/1 13923/13931/1 +f 13927/13935/1 13932/13940/1 2189/2197/1 13922/13930/1 +f 13932/13940/1 13931/13939/1 2190/2198/1 2189/2197/1 +f 13934/13942/1 2185/2193/1 2188/2196/1 13935/13943/1 +f 13939/13947/1 13944/13952/1 2185/2193/1 13934/13942/1 +f 13944/13952/1 13943/13951/1 2186/2194/1 2185/2193/1 +f 13946/13954/1 2181/2189/1 2184/2192/1 13947/13955/1 +f 13951/13959/1 13956/13964/1 2181/2189/1 13946/13954/1 +f 13956/13964/1 13955/13963/1 2182/2190/1 2181/2189/1 +f 13958/13966/1 2177/2185/1 2180/2188/1 13959/13967/1 +f 13963/13971/1 13968/13976/1 2177/2185/1 13958/13966/1 +f 13968/13976/1 13967/13975/1 2178/2186/1 2177/2185/1 +f 13970/13978/1 2173/2181/1 2176/2184/1 13971/13979/1 +f 13975/13983/1 13980/13988/1 2173/2181/1 13970/13978/1 +f 13980/13988/1 13979/13987/1 2174/2182/1 2173/2181/1 +f 13982/13990/1 2169/2177/1 2172/2180/1 13983/13991/1 +f 13987/13995/1 13992/14000/1 2169/2177/1 13982/13990/1 +f 13992/14000/1 13991/13999/1 2170/2178/1 2169/2177/1 +f 13994/14002/1 2165/2173/1 2168/2176/1 13995/14003/1 +f 13999/14007/1 14004/14012/1 2165/2173/1 13994/14002/1 +f 14004/14012/1 14003/14011/1 2166/2174/1 2165/2173/1 +f 14006/14014/1 2161/2169/1 2164/2172/1 14007/14015/1 +f 14011/14019/1 14016/14024/1 2161/2169/1 14006/14014/1 +f 14016/14024/1 14015/14023/1 2162/2170/1 2161/2169/1 +f 14018/14026/1 2157/2165/1 2160/2168/1 14019/14027/1 +f 14023/14031/1 14028/14036/1 2157/2165/1 14018/14026/1 +f 14028/14036/1 14027/14035/1 2158/2166/1 2157/2165/1 +f 14030/14038/1 2153/2161/1 2156/2164/1 14031/14039/1 +f 14035/14043/1 14040/14048/1 2153/2161/1 14030/14038/1 +f 14040/14048/1 14039/14047/1 2154/2162/1 2153/2161/1 +f 14042/14050/1 2149/2157/1 2152/2160/1 14043/14051/1 +f 14047/14055/1 14052/14060/1 2149/2157/1 14042/14050/1 +f 14052/14060/1 14051/14059/1 2150/2158/1 2149/2157/1 +f 14054/14062/1 2145/2153/1 2148/2156/1 14055/14063/1 +f 14059/14067/1 14064/14072/1 2145/2153/1 14054/14062/1 +f 14064/14072/1 14063/14071/1 2146/2154/1 2145/2153/1 +f 14066/14074/1 2141/2149/1 2144/2152/1 14067/14075/1 +f 14071/14079/1 14076/14084/1 2141/2149/1 14066/14074/1 +f 14076/14084/1 14075/14083/1 2142/2150/1 2141/2149/1 +f 14078/14086/1 2137/2145/1 2140/2148/1 14079/14087/1 +f 14083/14091/1 14088/14096/1 2137/2145/1 14078/14086/1 +f 14088/14096/1 14087/14095/1 2138/2146/1 2137/2145/1 +f 14090/14098/1 2133/2141/1 2136/2144/1 14091/14099/1 +f 14095/14103/1 14100/14108/1 2133/2141/1 14090/14098/1 +f 14100/14108/1 14099/14107/1 2134/2142/1 2133/2141/1 +f 14102/14110/1 2129/2137/1 2132/2140/1 14103/14111/1 +f 14107/14115/1 14112/14120/1 2129/2137/1 14102/14110/1 +f 14112/14120/1 14111/14119/1 2130/2138/1 2129/2137/1 +f 14114/14122/1 2125/2133/1 2128/2136/1 14115/14123/1 +f 14119/14127/1 14124/14132/1 2125/2133/1 14114/14122/1 +f 14124/14132/1 14123/14131/1 2126/2134/1 2125/2133/1 +f 14126/14134/1 2121/2129/1 2124/2132/1 14127/14135/1 +f 14131/14139/1 14136/14144/1 2121/2129/1 14126/14134/1 +f 14136/14144/1 14135/14143/1 2122/2130/1 2121/2129/1 +f 14138/14146/1 2117/2125/1 2120/2128/1 14139/14147/1 +f 14143/14151/1 14148/14156/1 2117/2125/1 14138/14146/1 +f 14148/14156/1 14147/14155/1 2118/2126/1 2117/2125/1 +f 14150/14158/1 2113/2121/1 2116/2124/1 14151/14159/1 +f 14155/14163/1 14160/14168/1 2113/2121/1 14150/14158/1 +f 14160/14168/1 14159/14167/1 2114/2122/1 2113/2121/1 +f 14162/14170/1 2109/2117/1 2112/2120/1 14163/14171/1 +f 14167/14175/1 14172/14180/1 2109/2117/1 14162/14170/1 +f 14172/14180/1 14171/14179/1 2110/2118/1 2109/2117/1 +f 14174/14182/1 2105/2113/1 2108/2116/1 14175/14183/1 +f 14179/14187/1 14184/14192/1 2105/2113/1 14174/14182/1 +f 14184/14192/1 14183/14191/1 2106/2114/1 2105/2113/1 +f 14186/14194/1 2101/2109/1 2104/2112/1 14187/14195/1 +f 14191/14199/1 14196/14204/1 2101/2109/1 14186/14194/1 +f 14196/14204/1 14195/14203/1 2102/2110/1 2101/2109/1 +f 14198/14206/1 2097/2105/1 2100/2108/1 14199/14207/1 +f 14203/14211/1 14208/14216/1 2097/2105/1 14198/14206/1 +f 14208/14216/1 14207/14215/1 2098/2106/1 2097/2105/1 +f 14210/14218/1 2093/2101/1 2096/2104/1 14211/14219/1 +f 14215/14223/1 14220/14228/1 2093/2101/1 14210/14218/1 +f 14220/14228/1 14219/14227/1 2094/2102/1 2093/2101/1 +f 14222/14230/1 2089/2097/1 2092/2100/1 14223/14231/1 +f 14227/14235/1 14232/14240/1 2089/2097/1 14222/14230/1 +f 14232/14240/1 14231/14239/1 2090/2098/1 2089/2097/1 +f 14234/14242/1 2085/2093/1 2088/2096/1 14235/14243/1 +f 14239/14247/1 14244/14252/1 2085/2093/1 14234/14242/1 +f 14244/14252/1 14243/14251/1 2086/2094/1 2085/2093/1 +f 14246/14254/1 2081/2089/1 2084/2092/1 14247/14255/1 +f 14251/14259/1 14256/14264/1 2081/2089/1 14246/14254/1 +f 14256/14264/1 14255/14263/1 2082/2090/1 2081/2089/1 +f 14258/14266/1 2077/2085/1 2080/2088/1 14259/14267/1 +f 14263/14271/1 14268/14276/1 2077/2085/1 14258/14266/1 +f 14268/14276/1 14267/14275/1 2078/2086/1 2077/2085/1 +f 14270/14278/1 2073/2081/1 2076/2084/1 14271/14279/1 +f 14275/14283/1 14280/14288/1 2073/2081/1 14270/14278/1 +f 14280/14288/1 14279/14287/1 2074/2082/1 2073/2081/1 +f 14282/14290/1 2069/2077/1 2072/2080/1 14283/14291/1 +f 14287/14295/1 14292/14300/1 2069/2077/1 14282/14290/1 +f 14292/14300/1 14291/14299/1 2070/2078/1 2069/2077/1 +f 14294/14302/1 2065/2073/1 2068/2076/1 14295/14303/1 +f 14299/14307/1 14304/14312/1 2065/2073/1 14294/14302/1 +f 14304/14312/1 14303/14311/1 2066/2074/1 2065/2073/1 +f 14306/14314/1 2061/2069/1 2064/2072/1 14307/14315/1 +f 14311/14319/1 14316/14324/1 2061/2069/1 14306/14314/1 +f 14316/14324/1 14315/14323/1 2062/2070/1 2061/2069/1 +f 14318/14326/1 2057/2065/1 2060/2068/1 14319/14327/1 +f 14323/14331/1 14328/14336/1 2057/2065/1 14318/14326/1 +f 14328/14336/1 14327/14335/1 2058/2066/1 2057/2065/1 +f 14330/14338/1 2053/2061/1 2056/2064/1 14331/14339/1 +f 14335/14343/1 14340/14348/1 2053/2061/1 14330/14338/1 +f 14340/14348/1 14339/14347/1 2054/2062/1 2053/2061/1 +f 14342/14350/1 2049/2057/1 2052/2060/1 14343/14351/1 +f 14347/14355/1 14352/14360/1 2049/2057/1 14342/14350/1 +f 14352/14360/1 14351/14359/1 2050/2058/1 2049/2057/1 +f 14354/14362/1 2045/2053/1 2048/2056/1 14355/14363/1 +f 14359/14367/1 14364/14372/1 2045/2053/1 14354/14362/1 +f 14364/14372/1 14363/14371/1 2046/2054/1 2045/2053/1 +f 14366/14374/1 2041/2049/1 2044/2052/1 14367/14375/1 +f 14371/14379/1 14376/14384/1 2041/2049/1 14366/14374/1 +f 14376/14384/1 14375/14383/1 2042/2050/1 2041/2049/1 +f 14378/14386/1 2037/2045/1 2040/2048/1 14379/14387/1 +f 14383/14391/1 14388/14396/1 2037/2045/1 14378/14386/1 +f 14388/14396/1 14387/14395/1 2038/2046/1 2037/2045/1 +f 14390/14398/1 2033/2041/1 2036/2044/1 14391/14399/1 +f 14395/14403/1 14400/14408/1 2033/2041/1 14390/14398/1 +f 14400/14408/1 14399/14407/1 2034/2042/1 2033/2041/1 +f 14402/14410/1 2029/2037/1 2032/2040/1 14403/14411/1 +f 14407/14415/1 14412/14420/1 2029/2037/1 14402/14410/1 +f 14412/14420/1 14411/14419/1 2030/2038/1 2029/2037/1 +f 14414/14422/1 2025/2033/1 2028/2036/1 14415/14423/1 +f 14419/14427/1 14424/14432/1 2025/2033/1 14414/14422/1 +f 14424/14432/1 14423/14431/1 2026/2034/1 2025/2033/1 +f 14426/14434/1 2021/2029/1 2024/2032/1 14427/14435/1 +f 14431/14439/1 14436/14444/1 2021/2029/1 14426/14434/1 +f 14436/14444/1 14435/14443/1 2022/2030/1 2021/2029/1 +f 14438/14446/1 2017/2025/1 2020/2028/1 14439/14447/1 +f 14443/14451/1 14448/14456/1 2017/2025/1 14438/14446/1 +f 14448/14456/1 14447/14455/1 2018/2026/1 2017/2025/1 +f 14450/14458/1 2013/2021/1 2016/2024/1 14451/14459/1 +f 14455/14463/1 14460/14468/1 2013/2021/1 14450/14458/1 +f 14460/14468/1 14459/14467/1 2014/2022/1 2013/2021/1 +f 14462/14470/1 2009/2017/1 2012/2020/1 14463/14471/1 +f 14467/14475/1 14472/14480/1 2009/2017/1 14462/14470/1 +f 14472/14480/1 14471/14479/1 2010/2018/1 2009/2017/1 +f 14474/14482/1 2005/2013/1 2008/2016/1 14475/14483/1 +f 14479/14487/1 14484/14492/1 2005/2013/1 14474/14482/1 +f 14484/14492/1 14483/14491/1 2006/2014/1 2005/2013/1 +f 14486/14494/1 2001/2009/1 2004/2012/1 14487/14495/1 +f 14491/14499/1 14496/14504/1 2001/2009/1 14486/14494/1 +f 14496/14504/1 14495/14503/1 2002/2010/1 2001/2009/1 +f 14498/14506/1 1997/2005/1 2000/2008/1 14499/14507/1 +f 14503/14511/1 14508/14516/1 1997/2005/1 14498/14506/1 +f 14508/14516/1 14507/14515/1 1998/2006/1 1997/2005/1 +f 14510/14518/1 1993/2001/1 1996/2004/1 14511/14519/1 +f 14515/14523/1 14520/14528/1 1993/2001/1 14510/14518/1 +f 14520/14528/1 14519/14527/1 1994/2002/1 1993/2001/1 +f 14522/14530/1 1989/1997/1 1992/2000/1 14523/14531/1 +f 14527/14535/1 14532/14540/1 1989/1997/1 14522/14530/1 +f 14532/14540/1 14531/14539/1 1990/1998/1 1989/1997/1 +f 14534/14542/1 1985/1993/1 1988/1996/1 14535/14543/1 +f 14539/14547/1 14544/14552/1 1985/1993/1 14534/14542/1 +f 14544/14552/1 14543/14551/1 1986/1994/1 1985/1993/1 +f 14546/14554/1 1981/1989/1 1984/1992/1 14547/14555/1 +f 14551/14559/1 14556/14564/1 1981/1989/1 14546/14554/1 +f 14556/14564/1 14555/14563/1 1982/1990/1 1981/1989/1 +f 14558/14566/1 1977/1985/1 1980/1988/1 14559/14567/1 +f 14563/14571/1 14568/14576/1 1977/1985/1 14558/14566/1 +f 14568/14576/1 14567/14575/1 1978/1986/1 1977/1985/1 +f 14570/14578/1 1973/1981/1 1976/1984/1 14571/14579/1 +f 14575/14583/1 14580/14588/1 1973/1981/1 14570/14578/1 +f 14580/14588/1 14579/14587/1 1974/1982/1 1973/1981/1 +f 14582/14590/1 1969/1977/1 1972/1980/1 14583/14591/1 +f 14587/14595/1 14592/14600/1 1969/1977/1 14582/14590/1 +f 14592/14600/1 14591/14599/1 1970/1978/1 1969/1977/1 +f 14594/14602/1 1965/1973/1 1968/1976/1 14595/14603/1 +f 14599/14607/1 14604/14612/1 1965/1973/1 14594/14602/1 +f 14604/14612/1 14603/14611/1 1966/1974/1 1965/1973/1 +f 14606/14614/1 1961/1969/1 1964/1972/1 14607/14615/1 +f 14611/14619/1 14616/14624/1 1961/1969/1 14606/14614/1 +f 14616/14624/1 14615/14623/1 1962/1970/1 1961/1969/1 +f 14618/14626/1 1957/1965/1 1960/1968/1 14619/14627/1 +f 14623/14631/1 14628/14636/1 1957/1965/1 14618/14626/1 +f 14628/14636/1 14627/14635/1 1958/1966/1 1957/1965/1 +f 14630/14638/1 1953/1961/1 1956/1964/1 14631/14639/1 +f 14635/14643/1 14640/14648/1 1953/1961/1 14630/14638/1 +f 14640/14648/1 14639/14647/1 1954/1962/1 1953/1961/1 +f 14642/14650/1 1949/1957/1 1952/1960/1 14643/14651/1 +f 14647/14655/1 14652/14660/1 1949/1957/1 14642/14650/1 +f 14652/14660/1 14651/14659/1 1950/1958/1 1949/1957/1 +f 14654/14662/1 1945/1953/1 1948/1956/1 14655/14663/1 +f 14659/14667/1 14664/14672/1 1945/1953/1 14654/14662/1 +f 14664/14672/1 14663/14671/1 1946/1954/1 1945/1953/1 +f 14666/14674/1 1941/1949/1 1944/1952/1 14667/14675/1 +f 14671/14679/1 14676/14684/1 1941/1949/1 14666/14674/1 +f 14676/14684/1 14675/14683/1 1942/1950/1 1941/1949/1 +f 14678/14686/1 1937/1945/1 1940/1948/1 14679/14687/1 +f 14683/14691/1 14688/14696/1 1937/1945/1 14678/14686/1 +f 14688/14696/1 14687/14695/1 1938/1946/1 1937/1945/1 +f 14690/14698/1 1933/1941/1 1936/1944/1 14691/14699/1 +f 14695/14703/1 14700/14708/1 1933/1941/1 14690/14698/1 +f 14700/14708/1 14699/14707/1 1934/1942/1 1933/1941/1 +f 14702/14710/1 1929/1937/1 1932/1940/1 14703/14711/1 +f 14707/14715/1 14712/14720/1 1929/1937/1 14702/14710/1 +f 14712/14720/1 14711/14719/1 1930/1938/1 1929/1937/1 +f 14714/14722/1 1925/1933/1 1928/1936/1 14715/14723/1 +f 14719/14727/1 14724/14732/1 1925/1933/1 14714/14722/1 +f 14724/14732/1 14723/14731/1 1926/1934/1 1925/1933/1 +f 14726/14734/1 1921/1929/1 1924/1932/1 14727/14735/1 +f 14731/14739/1 14736/14744/1 1921/1929/1 14726/14734/1 +f 14736/14744/1 14735/14743/1 1922/1930/1 1921/1929/1 +f 14738/14746/1 1917/1925/1 1920/1928/1 14739/14747/1 +f 14743/14751/1 14748/14756/1 1917/1925/1 14738/14746/1 +f 14748/14756/1 14747/14755/1 1918/1926/1 1917/1925/1 +f 14750/14758/1 1913/1921/1 1916/1924/1 14751/14759/1 +f 14755/14763/1 14760/14768/1 1913/1921/1 14750/14758/1 +f 14760/14768/1 14759/14767/1 1914/1922/1 1913/1921/1 +f 14762/14770/1 1909/1917/1 1912/1920/1 14763/14771/1 +f 14767/14775/1 14772/14780/1 1909/1917/1 14762/14770/1 +f 14772/14780/1 14771/14779/1 1910/1918/1 1909/1917/1 +f 14774/14782/1 1905/1913/1 1908/1916/1 14775/14783/1 +f 14779/14787/1 14784/14792/1 1905/1913/1 14774/14782/1 +f 14784/14792/1 14783/14791/1 1906/1914/1 1905/1913/1 +f 14786/14794/1 1901/1909/1 1904/1912/1 14787/14795/1 +f 14791/14799/1 14796/14804/1 1901/1909/1 14786/14794/1 +f 14796/14804/1 14795/14803/1 1902/1910/1 1901/1909/1 +f 14798/14806/1 1897/1905/1 1900/1908/1 14799/14807/1 +f 14803/14811/1 14808/14816/1 1897/1905/1 14798/14806/1 +f 14808/14816/1 14807/14815/1 1898/1906/1 1897/1905/1 +f 14810/14818/1 1893/1901/1 1896/1904/1 14811/14819/1 +f 14815/14823/1 14820/14828/1 1893/1901/1 14810/14818/1 +f 14820/14828/1 14819/14827/1 1894/1902/1 1893/1901/1 +f 14822/14830/1 1889/1897/1 1892/1900/1 14823/14831/1 +f 14827/14835/1 14832/14840/1 1889/1897/1 14822/14830/1 +f 14832/14840/1 14831/14839/1 1890/1898/1 1889/1897/1 +f 14834/14842/1 1885/1893/1 1888/1896/1 14835/14843/1 +f 14839/14847/1 14844/14852/1 1885/1893/1 14834/14842/1 +f 14844/14852/1 14843/14851/1 1886/1894/1 1885/1893/1 +f 14846/14854/1 1881/1889/1 1884/1892/1 14847/14855/1 +f 14851/14859/1 14856/14864/1 1881/1889/1 14846/14854/1 +f 14856/14864/1 14855/14863/1 1882/1890/1 1881/1889/1 +f 14858/14866/1 1877/1885/1 1880/1888/1 14859/14867/1 +f 14863/14871/1 14868/14876/1 1877/1885/1 14858/14866/1 +f 14868/14876/1 14867/14875/1 1878/1886/1 1877/1885/1 +f 14870/14878/1 1873/1881/1 1876/1884/1 14871/14879/1 +f 14875/14883/1 14880/14888/1 1873/1881/1 14870/14878/1 +f 14880/14888/1 14879/14887/1 1874/1882/1 1873/1881/1 +f 14882/14890/1 1869/1877/1 1872/1880/1 14883/14891/1 +f 14887/14895/1 14892/14900/1 1869/1877/1 14882/14890/1 +f 14892/14900/1 14891/14899/1 1870/1878/1 1869/1877/1 +f 14894/14902/1 1865/1873/1 1868/1876/1 14895/14903/1 +f 14899/14907/1 14904/14912/1 1865/1873/1 14894/14902/1 +f 14904/14912/1 14903/14911/1 1866/1874/1 1865/1873/1 +f 14906/14914/1 1861/1869/1 1864/1872/1 14907/14915/1 +f 14911/14919/1 14916/14924/1 1861/1869/1 14906/14914/1 +f 14916/14924/1 14915/14923/1 1862/1870/1 1861/1869/1 +f 14918/14926/1 1857/1865/1 1860/1868/1 14919/14927/1 +f 14923/14931/1 14928/14936/1 1857/1865/1 14918/14926/1 +f 14928/14936/1 14927/14935/1 1858/1866/1 1857/1865/1 +f 14930/14938/1 1853/1861/1 1856/1864/1 14931/14939/1 +f 14935/14943/1 14940/14948/1 1853/1861/1 14930/14938/1 +f 14940/14948/1 14939/14947/1 1854/1862/1 1853/1861/1 +f 14942/14950/1 1849/1857/1 1852/1860/1 14943/14951/1 +f 14947/14955/1 14952/14960/1 1849/1857/1 14942/14950/1 +f 14952/14960/1 14951/14959/1 1850/1858/1 1849/1857/1 +f 14954/14962/1 1845/1853/1 1848/1856/1 14955/14963/1 +f 14959/14967/1 14964/14972/1 1845/1853/1 14954/14962/1 +f 14964/14972/1 14963/14971/1 1846/1854/1 1845/1853/1 +f 14966/14974/1 1841/1849/1 1844/1852/1 14967/14975/1 +f 14971/14979/1 14976/14984/1 1841/1849/1 14966/14974/1 +f 14976/14984/1 14975/14983/1 1842/1850/1 1841/1849/1 +f 14978/14986/1 1837/1845/1 1840/1848/1 14979/14987/1 +f 14983/14991/1 14988/14996/1 1837/1845/1 14978/14986/1 +f 14988/14996/1 14987/14995/1 1838/1846/1 1837/1845/1 +f 14990/14998/1 1833/1841/1 1836/1844/1 14991/14999/1 +f 14995/15003/1 15000/15008/1 1833/1841/1 14990/14998/1 +f 15000/15008/1 14999/15007/1 1834/1842/1 1833/1841/1 +f 15002/15010/1 1829/1837/1 1832/1840/1 15003/15011/1 +f 15007/15015/1 15012/15020/1 1829/1837/1 15002/15010/1 +f 15012/15020/1 15011/15019/1 1830/1838/1 1829/1837/1 +f 15014/15022/1 1825/1833/1 1828/1836/1 15015/15023/1 +f 15019/15027/1 15024/15032/1 1825/1833/1 15014/15022/1 +f 15024/15032/1 15023/15031/1 1826/1834/1 1825/1833/1 +f 15026/15034/1 1821/1829/1 1824/1832/1 15027/15035/1 +f 15031/15039/1 15036/15044/1 1821/1829/1 15026/15034/1 +f 15036/15044/1 15035/15043/1 1822/1830/1 1821/1829/1 +f 15038/15046/1 1817/1825/1 1820/1828/1 15039/15047/1 +f 15043/15051/1 15048/15056/1 1817/1825/1 15038/15046/1 +f 15048/15056/1 15047/15055/1 1818/1826/1 1817/1825/1 +f 15050/15058/1 1813/1821/1 1816/1824/1 15051/15059/1 +f 15055/15063/1 15060/15068/1 1813/1821/1 15050/15058/1 +f 15060/15068/1 15059/15067/1 1814/1822/1 1813/1821/1 +f 15062/15070/1 1809/1817/1 1812/1820/1 15063/15071/1 +f 15067/15075/1 15072/15080/1 1809/1817/1 15062/15070/1 +f 15072/15080/1 15071/15079/1 1810/1818/1 1809/1817/1 +f 15074/15082/1 1805/1813/1 1808/1816/1 15075/15083/1 +f 15079/15087/1 15084/15092/1 1805/1813/1 15074/15082/1 +f 15084/15092/1 15083/15091/1 1806/1814/1 1805/1813/1 +f 15086/15094/1 1801/1809/1 1804/1812/1 15087/15095/1 +f 15091/15099/1 15096/15104/1 1801/1809/1 15086/15094/1 +f 15096/15104/1 15095/15103/1 1802/1810/1 1801/1809/1 +f 15098/15106/1 1797/1805/1 1800/1808/1 15099/15107/1 +f 15103/15111/1 15108/15116/1 1797/1805/1 15098/15106/1 +f 15108/15116/1 15107/15115/1 1798/1806/1 1797/1805/1 +f 15110/15118/1 1793/1801/1 1796/1804/1 15111/15119/1 +f 15115/15123/1 15120/15128/1 1793/1801/1 15110/15118/1 +f 15120/15128/1 15119/15127/1 1794/1802/1 1793/1801/1 +f 15122/15130/1 1789/1797/1 1792/1800/1 15123/15131/1 +f 15127/15135/1 15132/15140/1 1789/1797/1 15122/15130/1 +f 15132/15140/1 15131/15139/1 1790/1798/1 1789/1797/1 +f 15134/15142/1 1785/1793/1 1788/1796/1 15135/15143/1 +f 15139/15147/1 15144/15152/1 1785/1793/1 15134/15142/1 +f 15144/15152/1 15143/15151/1 1786/1794/1 1785/1793/1 +f 15146/15154/1 1781/1789/1 1784/1792/1 15147/15155/1 +f 15151/15159/1 15156/15164/1 1781/1789/1 15146/15154/1 +f 15156/15164/1 15155/15163/1 1782/1790/1 1781/1789/1 +f 15158/15166/1 1777/1785/1 1780/1788/1 15159/15167/1 +f 15163/15171/1 15168/15176/1 1777/1785/1 15158/15166/1 +f 15168/15176/1 15167/15175/1 1778/1786/1 1777/1785/1 +f 15170/15178/1 1773/1781/1 1776/1784/1 15171/15179/1 +f 15175/15183/1 15180/15188/1 1773/1781/1 15170/15178/1 +f 15180/15188/1 15179/15187/1 1774/1782/1 1773/1781/1 +f 15182/15190/1 1769/1777/1 1772/1780/1 15183/15191/1 +f 15187/15195/1 15192/15200/1 1769/1777/1 15182/15190/1 +f 15192/15200/1 15191/15199/1 1770/1778/1 1769/1777/1 +f 15194/15202/1 1765/1773/1 1768/1776/1 15195/15203/1 +f 15199/15207/1 15204/15212/1 1765/1773/1 15194/15202/1 +f 15204/15212/1 15203/15211/1 1766/1774/1 1765/1773/1 +f 15206/15214/1 1761/1769/1 1764/1772/1 15207/15215/1 +f 15211/15219/1 15216/15224/1 1761/1769/1 15206/15214/1 +f 15216/15224/1 15215/15223/1 1762/1770/1 1761/1769/1 +f 15218/15226/1 1757/1765/1 1760/1768/1 15219/15227/1 +f 15223/15231/1 15228/15236/1 1757/1765/1 15218/15226/1 +f 15228/15236/1 15227/15235/1 1758/1766/1 1757/1765/1 +f 15230/15238/1 1753/1761/1 1756/1764/1 15231/15239/1 +f 15235/15243/1 15240/15248/1 1753/1761/1 15230/15238/1 +f 15240/15248/1 15239/15247/1 1754/1762/1 1753/1761/1 +f 15242/15250/1 1749/1757/1 1752/1760/1 15243/15251/1 +f 15247/15255/1 15252/15260/1 1749/1757/1 15242/15250/1 +f 15252/15260/1 15251/15259/1 1750/1758/1 1749/1757/1 +f 15254/15262/1 1745/1753/1 1748/1756/1 15255/15263/1 +f 15259/15267/1 15264/15272/1 1745/1753/1 15254/15262/1 +f 15264/15272/1 15263/15271/1 1746/1754/1 1745/1753/1 +f 15266/15274/1 1741/1749/1 1744/1752/1 15267/15275/1 +f 15271/15279/1 15276/15284/1 1741/1749/1 15266/15274/1 +f 15276/15284/1 15275/15283/1 1742/1750/1 1741/1749/1 +f 15278/15286/1 1737/1745/1 1740/1748/1 15279/15287/1 +f 15283/15291/1 15288/15296/1 1737/1745/1 15278/15286/1 +f 15288/15296/1 15287/15295/1 1738/1746/1 1737/1745/1 +f 15290/15298/1 1733/1741/1 1736/1744/1 15291/15299/1 +f 15295/15303/1 15300/15308/1 1733/1741/1 15290/15298/1 +f 15300/15308/1 15299/15307/1 1734/1742/1 1733/1741/1 +f 15302/15310/1 1729/1737/1 1732/1740/1 15303/15311/1 +f 15307/15315/1 15312/15320/1 1729/1737/1 15302/15310/1 +f 15312/15320/1 15311/15319/1 1730/1738/1 1729/1737/1 +f 15314/15322/1 1725/1733/1 1728/1736/1 15315/15323/1 +f 15319/15327/1 15324/15332/1 1725/1733/1 15314/15322/1 +f 15324/15332/1 15323/15331/1 1726/1734/1 1725/1733/1 +f 15326/15334/1 1721/1729/1 1724/1732/1 15327/15335/1 +f 15331/15339/1 15336/15344/1 1721/1729/1 15326/15334/1 +f 15336/15344/1 15335/15343/1 1722/1730/1 1721/1729/1 +f 15338/15346/1 1717/1725/1 1720/1728/1 15339/15347/1 +f 15343/15351/1 15348/15356/1 1717/1725/1 15338/15346/1 +f 15348/15356/1 15347/15355/1 1718/1726/1 1717/1725/1 +f 15350/15358/1 1713/1721/1 1716/1724/1 15351/15359/1 +f 15355/15363/1 15360/15368/1 1713/1721/1 15350/15358/1 +f 15360/15368/1 15359/15367/1 1714/1722/1 1713/1721/1 +f 15362/15370/1 1709/1717/1 1712/1720/1 15363/15371/1 +f 15367/15375/1 15372/15380/1 1709/1717/1 15362/15370/1 +f 15372/15380/1 15371/15379/1 1710/1718/1 1709/1717/1 +f 15374/15382/1 1705/1713/1 1708/1716/1 15375/15383/1 +f 15379/15387/1 15384/15392/1 1705/1713/1 15374/15382/1 +f 15384/15392/1 15383/15391/1 1706/1714/1 1705/1713/1 +f 15386/15394/1 1701/1709/1 1704/1712/1 15387/15395/1 +f 15391/15399/1 15396/15404/1 1701/1709/1 15386/15394/1 +f 15396/15404/1 15395/15403/1 1702/1710/1 1701/1709/1 +f 15398/15406/1 1697/1705/1 1700/1708/1 15399/15407/1 +f 15403/15411/1 15408/15416/1 1697/1705/1 15398/15406/1 +f 15408/15416/1 15407/15415/1 1698/1706/1 1697/1705/1 +f 15410/15418/1 1693/1701/1 1696/1704/1 15411/15419/1 +f 15415/15423/1 15420/15428/1 1693/1701/1 15410/15418/1 +f 15420/15428/1 15419/15427/1 1694/1702/1 1693/1701/1 +f 15422/15430/1 1689/1697/1 1692/1700/1 15423/15431/1 +f 15427/15435/1 15432/15440/1 1689/1697/1 15422/15430/1 +f 15432/15440/1 15431/15439/1 1690/1698/1 1689/1697/1 +f 15434/15442/1 1685/1693/1 1688/1696/1 15435/15443/1 +f 15439/15447/1 15444/15452/1 1685/1693/1 15434/15442/1 +f 15444/15452/1 15443/15451/1 1686/1694/1 1685/1693/1 +f 15446/15454/1 1681/1689/1 1684/1692/1 15447/15455/1 +f 15451/15459/1 15456/15464/1 1681/1689/1 15446/15454/1 +f 15456/15464/1 15455/15463/1 1682/1690/1 1681/1689/1 +f 15458/15466/1 1677/1685/1 1680/1688/1 15459/15467/1 +f 15463/15471/1 15468/15476/1 1677/1685/1 15458/15466/1 +f 15468/15476/1 15467/15475/1 1678/1686/1 1677/1685/1 +f 15470/15478/1 1673/1681/1 1676/1684/1 15471/15479/1 +f 15475/15483/1 15480/15488/1 1673/1681/1 15470/15478/1 +f 15480/15488/1 15479/15487/1 1674/1682/1 1673/1681/1 +f 15482/15490/1 1669/1677/1 1672/1680/1 15483/15491/1 +f 15487/15495/1 15492/15500/1 1669/1677/1 15482/15490/1 +f 15492/15500/1 15491/15499/1 1670/1678/1 1669/1677/1 +f 15494/15502/1 1665/1673/1 1668/1676/1 15495/15503/1 +f 15499/15507/1 15504/15512/1 1665/1673/1 15494/15502/1 +f 15504/15512/1 15503/15511/1 1666/1674/1 1665/1673/1 +f 15506/15514/1 1661/1669/1 1664/1672/1 15507/15515/1 +f 15511/15519/1 15516/15524/1 1661/1669/1 15506/15514/1 +f 15516/15524/1 15515/15523/1 1662/1670/1 1661/1669/1 +f 15518/15526/1 1657/1665/1 1660/1668/1 15519/15527/1 +f 15523/15531/1 15528/15536/1 1657/1665/1 15518/15526/1 +f 15528/15536/1 15527/15535/1 1658/1666/1 1657/1665/1 +f 15530/15538/1 1653/1661/1 1656/1664/1 15531/15539/1 +f 15535/15543/1 15540/15548/1 1653/1661/1 15530/15538/1 +f 15540/15548/1 15539/15547/1 1654/1662/1 1653/1661/1 +f 15542/15550/1 1649/1657/1 1652/1660/1 15543/15551/1 +f 15547/15555/1 15552/15560/1 1649/1657/1 15542/15550/1 +f 15552/15560/1 15551/15559/1 1650/1658/1 1649/1657/1 +f 15554/15562/1 1645/1653/1 1648/1656/1 15555/15563/1 +f 15559/15567/1 15564/15572/1 1645/1653/1 15554/15562/1 +f 15564/15572/1 15563/15571/1 1646/1654/1 1645/1653/1 +f 15566/15574/1 1641/1649/1 1644/1652/1 15567/15575/1 +f 15571/15579/1 15576/15584/1 1641/1649/1 15566/15574/1 +f 15576/15584/1 15575/15583/1 1642/1650/1 1641/1649/1 +f 15578/15586/1 1637/1645/1 1640/1648/1 15579/15587/1 +f 15583/15591/1 15588/15596/1 1637/1645/1 15578/15586/1 +f 15588/15596/1 15587/15595/1 1638/1646/1 1637/1645/1 +f 15590/15598/1 1633/1641/1 1636/1644/1 15591/15599/1 +f 15595/15603/1 15600/15608/1 1633/1641/1 15590/15598/1 +f 15600/15608/1 15599/15607/1 1634/1642/1 1633/1641/1 +f 15602/15610/1 1629/1637/1 1632/1640/1 15603/15611/1 +f 15607/15615/1 15612/15620/1 1629/1637/1 15602/15610/1 +f 15612/15620/1 15611/15619/1 1630/1638/1 1629/1637/1 +f 15614/15622/1 1625/1633/1 1628/1636/1 15615/15623/1 +f 15619/15627/1 15624/15632/1 1625/1633/1 15614/15622/1 +f 15624/15632/1 15623/15631/1 1626/1634/1 1625/1633/1 +f 15626/15634/1 1621/1629/1 1624/1632/1 15627/15635/1 +f 15631/15639/1 15636/15644/1 1621/1629/1 15626/15634/1 +f 15636/15644/1 15635/15643/1 1622/1630/1 1621/1629/1 +f 15638/15646/1 1617/1625/1 1620/1628/1 15639/15647/1 +f 15643/15651/1 15648/15656/1 1617/1625/1 15638/15646/1 +f 15648/15656/1 15647/15655/1 1618/1626/1 1617/1625/1 +f 15650/15658/1 1613/1621/1 1616/1624/1 15651/15659/1 +f 15655/15663/1 15660/15668/1 1613/1621/1 15650/15658/1 +f 15660/15668/1 15659/15667/1 1614/1622/1 1613/1621/1 +f 15662/15670/1 1609/1617/1 1612/1620/1 15663/15671/1 +f 15667/15675/1 15672/15680/1 1609/1617/1 15662/15670/1 +f 15672/15680/1 15671/15679/1 1610/1618/1 1609/1617/1 +f 15674/15682/1 1605/1613/1 1608/1616/1 15675/15683/1 +f 15679/15687/1 15684/15692/1 1605/1613/1 15674/15682/1 +f 15684/15692/1 15683/15691/1 1606/1614/1 1605/1613/1 +f 15686/15694/1 1601/1609/1 1604/1612/1 15687/15695/1 +f 15691/15699/1 15696/15704/1 1601/1609/1 15686/15694/1 +f 15696/15704/1 15695/15703/1 1602/1610/1 1601/1609/1 +f 15698/15706/1 1597/1605/1 1600/1608/1 15699/15707/1 +f 15703/15711/1 15708/15716/1 1597/1605/1 15698/15706/1 +f 15708/15716/1 15707/15715/1 1598/1606/1 1597/1605/1 +f 15710/15718/1 1593/1601/1 1596/1604/1 15711/15719/1 +f 15715/15723/1 15720/15728/1 1593/1601/1 15710/15718/1 +f 15720/15728/1 15719/15727/1 1594/1602/1 1593/1601/1 +f 15722/15730/1 1589/1597/1 1592/1600/1 15723/15731/1 +f 15727/15735/1 15732/15740/1 1589/1597/1 15722/15730/1 +f 15732/15740/1 15731/15739/1 1590/1598/1 1589/1597/1 +f 15734/15742/1 1585/1593/1 1588/1596/1 15735/15743/1 +f 15739/15747/1 15744/15752/1 1585/1593/1 15734/15742/1 +f 15744/15752/1 15743/15751/1 1586/1594/1 1585/1593/1 +f 15746/15754/1 1581/1589/1 1584/1592/1 15747/15755/1 +f 15751/15759/1 15756/15764/1 1581/1589/1 15746/15754/1 +f 15756/15764/1 15755/15763/1 1582/1590/1 1581/1589/1 +f 15758/15766/1 1577/1585/1 1580/1588/1 15759/15767/1 +f 15763/15771/1 15768/15776/1 1577/1585/1 15758/15766/1 +f 15768/15776/1 15767/15775/1 1578/1586/1 1577/1585/1 +f 15770/15778/1 1573/1581/1 1576/1584/1 15771/15779/1 +f 15775/15783/1 15780/15788/1 1573/1581/1 15770/15778/1 +f 15780/15788/1 15779/15787/1 1574/1582/1 1573/1581/1 +f 15782/15790/1 1569/1577/1 1572/1580/1 15783/15791/1 +f 15787/15795/1 15792/15800/1 1569/1577/1 15782/15790/1 +f 15792/15800/1 15791/15799/1 1570/1578/1 1569/1577/1 +f 15794/15802/1 1565/1573/1 1568/1576/1 15795/15803/1 +f 15799/15807/1 15804/15812/1 1565/1573/1 15794/15802/1 +f 15804/15812/1 15803/15811/1 1566/1574/1 1565/1573/1 +f 15806/15814/1 1561/1569/1 1564/1572/1 15807/15815/1 +f 15811/15819/1 15816/15824/1 1561/1569/1 15806/15814/1 +f 15816/15824/1 15815/15823/1 1562/1570/1 1561/1569/1 +f 15818/15826/1 1557/1565/1 1560/1568/1 15819/15827/1 +f 15823/15831/1 15828/15836/1 1557/1565/1 15818/15826/1 +f 15828/15836/1 15827/15835/1 1558/1566/1 1557/1565/1 +f 15830/15838/1 1553/1561/1 1556/1564/1 15831/15839/1 +f 15835/15843/1 15840/15848/1 1553/1561/1 15830/15838/1 +f 15840/15848/1 15839/15847/1 1554/1562/1 1553/1561/1 +f 15842/15850/1 1549/1557/1 1552/1560/1 15843/15851/1 +f 15847/15855/1 15852/15860/1 1549/1557/1 15842/15850/1 +f 15852/15860/1 15851/15859/1 1550/1558/1 1549/1557/1 +f 15854/15862/1 1545/1553/1 1548/1556/1 15855/15863/1 +f 15859/15867/1 15864/15872/1 1545/1553/1 15854/15862/1 +f 15864/15872/1 15863/15871/1 1546/1554/1 1545/1553/1 +f 15866/15874/1 1541/1549/1 1544/1552/1 15867/15875/1 +f 15871/15879/1 15876/15884/1 1541/1549/1 15866/15874/1 +f 15876/15884/1 15875/15883/1 1542/1550/1 1541/1549/1 +f 15878/15886/1 1537/1545/1 1540/1548/1 15879/15887/1 +f 15883/15891/1 15888/15896/1 1537/1545/1 15878/15886/1 +f 15888/15896/1 15887/15895/1 1538/1546/1 1537/1545/1 +f 15890/15898/1 1533/1541/1 1536/1544/1 15891/15899/1 +f 15895/15903/1 15900/15908/1 1533/1541/1 15890/15898/1 +f 15900/15908/1 15899/15907/1 1534/1542/1 1533/1541/1 +f 15902/15910/1 1529/1537/1 1532/1540/1 15903/15911/1 +f 15907/15915/1 15912/15920/1 1529/1537/1 15902/15910/1 +f 15912/15920/1 15911/15919/1 1530/1538/1 1529/1537/1 +f 15914/15922/1 1525/1533/1 1528/1536/1 15915/15923/1 +f 15919/15927/1 15924/15932/1 1525/1533/1 15914/15922/1 +f 15924/15932/1 15923/15931/1 1526/1534/1 1525/1533/1 +f 15926/15934/1 1521/1529/1 1524/1532/1 15927/15935/1 +f 15931/15939/1 15936/15944/1 1521/1529/1 15926/15934/1 +f 15936/15944/1 15935/15943/1 1522/1530/1 1521/1529/1 +f 15938/15946/1 1517/1525/1 1520/1528/1 15939/15947/1 +f 15943/15951/1 15948/15956/1 1517/1525/1 15938/15946/1 +f 15948/15956/1 15947/15955/1 1518/1526/1 1517/1525/1 +f 15950/15958/1 1513/1521/1 1516/1524/1 15951/15959/1 +f 15955/15963/1 15960/15968/1 1513/1521/1 15950/15958/1 +f 15960/15968/1 15959/15967/1 1514/1522/1 1513/1521/1 +f 15962/15970/1 1509/1517/1 1512/1520/1 15963/15971/1 +f 15967/15975/1 15972/15980/1 1509/1517/1 15962/15970/1 +f 15972/15980/1 15971/15979/1 1510/1518/1 1509/1517/1 +f 15974/15982/1 1505/1513/1 1508/1516/1 15975/15983/1 +f 15979/15987/1 15984/15992/1 1505/1513/1 15974/15982/1 +f 15984/15992/1 15983/15991/1 1506/1514/1 1505/1513/1 +f 15986/15994/1 1501/1509/1 1504/1512/1 15987/15995/1 +f 15991/15999/1 15996/16004/1 1501/1509/1 15986/15994/1 +f 15996/16004/1 15995/16003/1 1502/1510/1 1501/1509/1 +f 15998/16006/1 1497/1505/1 1500/1508/1 15999/16007/1 +f 16003/16011/1 16008/16016/1 1497/1505/1 15998/16006/1 +f 16008/16016/1 16007/16015/1 1498/1506/1 1497/1505/1 +f 16010/16018/1 1493/1501/1 1496/1504/1 16011/16019/1 +f 16015/16023/1 16020/16028/1 1493/1501/1 16010/16018/1 +f 16020/16028/1 16019/16027/1 1494/1502/1 1493/1501/1 +f 16022/16030/1 1489/1497/1 1492/1500/1 16023/16031/1 +f 16027/16035/1 16032/16040/1 1489/1497/1 16022/16030/1 +f 16032/16040/1 16031/16039/1 1490/1498/1 1489/1497/1 +f 16034/16042/1 1485/1493/1 1488/1496/1 16035/16043/1 +f 16039/16047/1 16044/16052/1 1485/1493/1 16034/16042/1 +f 16044/16052/1 16043/16051/1 1486/1494/1 1485/1493/1 +f 16046/16054/1 1481/1489/1 1484/1492/1 16047/16055/1 +f 16051/16059/1 16056/16064/1 1481/1489/1 16046/16054/1 +f 16056/16064/1 16055/16063/1 1482/1490/1 1481/1489/1 +f 16058/16066/1 1477/1485/1 1480/1488/1 16059/16067/1 +f 16063/16071/1 16068/16076/1 1477/1485/1 16058/16066/1 +f 16068/16076/1 16067/16075/1 1478/1486/1 1477/1485/1 +f 16070/16078/1 1473/1481/1 1476/1484/1 16071/16079/1 +f 16075/16083/1 16080/16088/1 1473/1481/1 16070/16078/1 +f 16080/16088/1 16079/16087/1 1474/1482/1 1473/1481/1 +f 16082/16090/1 1469/1477/1 1472/1480/1 16083/16091/1 +f 16087/16095/1 16092/16100/1 1469/1477/1 16082/16090/1 +f 16092/16100/1 16091/16099/1 1470/1478/1 1469/1477/1 +f 16094/16102/1 1465/1473/1 1468/1476/1 16095/16103/1 +f 16099/16107/1 16104/16112/1 1465/1473/1 16094/16102/1 +f 16104/16112/1 16103/16111/1 1466/1474/1 1465/1473/1 +f 16106/16114/1 1461/1469/1 1464/1472/1 16107/16115/1 +f 16111/16119/1 16116/16124/1 1461/1469/1 16106/16114/1 +f 16116/16124/1 16115/16123/1 1462/1470/1 1461/1469/1 +f 16118/16126/1 1457/1465/1 1460/1468/1 16119/16127/1 +f 16123/16131/1 16128/16136/1 1457/1465/1 16118/16126/1 +f 16128/16136/1 16127/16135/1 1458/1466/1 1457/1465/1 +f 16130/16138/1 1453/1461/1 1456/1464/1 16131/16139/1 +f 16135/16143/1 16140/16148/1 1453/1461/1 16130/16138/1 +f 16140/16148/1 16139/16147/1 1454/1462/1 1453/1461/1 +f 16142/16150/1 1449/1457/1 1452/1460/1 16143/16151/1 +f 16147/16155/1 16152/16160/1 1449/1457/1 16142/16150/1 +f 16152/16160/1 16151/16159/1 1450/1458/1 1449/1457/1 +f 16154/16162/1 1445/1453/1 1448/1456/1 16155/16163/1 +f 16159/16167/1 16164/16172/1 1445/1453/1 16154/16162/1 +f 16164/16172/1 16163/16171/1 1446/1454/1 1445/1453/1 +f 16166/16174/1 1441/1449/1 1444/1452/1 16167/16175/1 +f 16171/16179/1 16176/16184/1 1441/1449/1 16166/16174/1 +f 16176/16184/1 16175/16183/1 1442/1450/1 1441/1449/1 +f 16178/16186/1 1437/1445/1 1440/1448/1 16179/16187/1 +f 16183/16191/1 16188/16196/1 1437/1445/1 16178/16186/1 +f 16188/16196/1 16187/16195/1 1438/1446/1 1437/1445/1 +f 16190/16198/1 1433/1441/1 1436/1444/1 16191/16199/1 +f 16195/16203/1 16200/16208/1 1433/1441/1 16190/16198/1 +f 16200/16208/1 16199/16207/1 1434/1442/1 1433/1441/1 +f 16202/16210/1 1429/1437/1 1432/1440/1 16203/16211/1 +f 16207/16215/1 16212/16220/1 1429/1437/1 16202/16210/1 +f 16212/16220/1 16211/16219/1 1430/1438/1 1429/1437/1 +f 16214/16222/1 1425/1433/1 1428/1436/1 16215/16223/1 +f 16219/16227/1 16224/16232/1 1425/1433/1 16214/16222/1 +f 16224/16232/1 16223/16231/1 1426/1434/1 1425/1433/1 +f 16226/16234/1 1421/1429/1 1424/1432/1 16227/16235/1 +f 16231/16239/1 16236/16244/1 1421/1429/1 16226/16234/1 +f 16236/16244/1 16235/16243/1 1422/1430/1 1421/1429/1 +f 16238/16246/1 1417/1425/1 1420/1428/1 16239/16247/1 +f 16243/16251/1 16248/16256/1 1417/1425/1 16238/16246/1 +f 16248/16256/1 16247/16255/1 1418/1426/1 1417/1425/1 +f 16250/16258/1 1413/1421/1 1416/1424/1 16251/16259/1 +f 16255/16263/1 16260/16268/1 1413/1421/1 16250/16258/1 +f 16260/16268/1 16259/16267/1 1414/1422/1 1413/1421/1 +f 16262/16270/1 1409/1417/1 1412/1420/1 16263/16271/1 +f 16267/16275/1 16272/16280/1 1409/1417/1 16262/16270/1 +f 16272/16280/1 16271/16279/1 1410/1418/1 1409/1417/1 +f 16274/16282/1 1405/1413/1 1408/1416/1 16275/16283/1 +f 16279/16287/1 16284/16292/1 1405/1413/1 16274/16282/1 +f 16284/16292/1 16283/16291/1 1406/1414/1 1405/1413/1 +f 16286/16294/1 1401/1409/1 1404/1412/1 16287/16295/1 +f 16291/16299/1 16296/16304/1 1401/1409/1 16286/16294/1 +f 16296/16304/1 16295/16303/1 1402/1410/1 1401/1409/1 +f 16298/16306/1 1397/1405/1 1400/1408/1 16299/16307/1 +f 16303/16311/1 16308/16316/1 1397/1405/1 16298/16306/1 +f 16308/16316/1 16307/16315/1 1398/1406/1 1397/1405/1 +f 16310/16318/1 1393/1401/1 1396/1404/1 16311/16319/1 +f 16315/16323/1 16320/16328/1 1393/1401/1 16310/16318/1 +f 16320/16328/1 16319/16327/1 1394/1402/1 1393/1401/1 +f 16322/16330/1 1389/1397/1 1392/1400/1 16323/16331/1 +f 16327/16335/1 16332/16340/1 1389/1397/1 16322/16330/1 +f 16332/16340/1 16331/16339/1 1390/1398/1 1389/1397/1 +f 16334/16342/1 1385/1393/1 1388/1396/1 16335/16343/1 +f 16339/16347/1 16344/16352/1 1385/1393/1 16334/16342/1 +f 16344/16352/1 16343/16351/1 1386/1394/1 1385/1393/1 +f 16346/16354/1 1381/1389/1 1384/1392/1 16347/16355/1 +f 16351/16359/1 16356/16364/1 1381/1389/1 16346/16354/1 +f 16356/16364/1 16355/16363/1 1382/1390/1 1381/1389/1 +f 16358/16366/1 1377/1385/1 1380/1388/1 16359/16367/1 +f 16363/16371/1 16368/16376/1 1377/1385/1 16358/16366/1 +f 16368/16376/1 16367/16375/1 1378/1386/1 1377/1385/1 +f 16370/16378/1 1373/1381/1 1376/1384/1 16371/16379/1 +f 16375/16383/1 16380/16388/1 1373/1381/1 16370/16378/1 +f 16380/16388/1 16379/16387/1 1374/1382/1 1373/1381/1 +f 16382/16390/1 1369/1377/1 1372/1380/1 16383/16391/1 +f 16387/16395/1 16392/16400/1 1369/1377/1 16382/16390/1 +f 16392/16400/1 16391/16399/1 1370/1378/1 1369/1377/1 +f 16394/16402/1 1365/1373/1 1368/1376/1 16395/16403/1 +f 16399/16407/1 16404/16412/1 1365/1373/1 16394/16402/1 +f 16404/16412/1 16403/16411/1 1366/1374/1 1365/1373/1 +f 16406/16414/1 1361/1369/1 1364/1372/1 16407/16415/1 +f 16411/16419/1 16416/16424/1 1361/1369/1 16406/16414/1 +f 16416/16424/1 16415/16423/1 1362/1370/1 1361/1369/1 +f 16418/16426/1 1357/1365/1 1360/1368/1 16419/16427/1 +f 16423/16431/1 16428/16436/1 1357/1365/1 16418/16426/1 +f 16428/16436/1 16427/16435/1 1358/1366/1 1357/1365/1 +f 16430/16438/1 1353/1361/1 1356/1364/1 16431/16439/1 +f 16435/16443/1 16440/16448/1 1353/1361/1 16430/16438/1 +f 16440/16448/1 16439/16447/1 1354/1362/1 1353/1361/1 +f 16442/16450/1 1349/1357/1 1352/1360/1 16443/16451/1 +f 16447/16455/1 16452/16460/1 1349/1357/1 16442/16450/1 +f 16452/16460/1 16451/16459/1 1350/1358/1 1349/1357/1 +f 16454/16462/1 1345/1353/1 1348/1356/1 16455/16463/1 +f 16459/16467/1 16464/16472/1 1345/1353/1 16454/16462/1 +f 16464/16472/1 16463/16471/1 1346/1354/1 1345/1353/1 +f 16466/16474/1 1341/1349/1 1344/1352/1 16467/16475/1 +f 16471/16479/1 16476/16484/1 1341/1349/1 16466/16474/1 +f 16476/16484/1 16475/16483/1 1342/1350/1 1341/1349/1 +f 16478/16486/1 1337/1345/1 1340/1348/1 16479/16487/1 +f 16483/16491/1 16488/16496/1 1337/1345/1 16478/16486/1 +f 16488/16496/1 16487/16495/1 1338/1346/1 1337/1345/1 +f 16490/16498/1 1333/1341/1 1336/1344/1 16491/16499/1 +f 16495/16503/1 16500/16508/1 1333/1341/1 16490/16498/1 +f 16500/16508/1 16499/16507/1 1334/1342/1 1333/1341/1 +f 16502/16510/1 1329/1337/1 1332/1340/1 16503/16511/1 +f 16507/16515/1 16512/16520/1 1329/1337/1 16502/16510/1 +f 16512/16520/1 16511/16519/1 1330/1338/1 1329/1337/1 +f 16514/16522/1 1325/1333/1 1328/1336/1 16515/16523/1 +f 16519/16527/1 16524/16532/1 1325/1333/1 16514/16522/1 +f 16524/16532/1 16523/16531/1 1326/1334/1 1325/1333/1 +f 16526/16534/1 1321/1329/1 1324/1332/1 16527/16535/1 +f 16531/16539/1 16536/16544/1 1321/1329/1 16526/16534/1 +f 16536/16544/1 16535/16543/1 1322/1330/1 1321/1329/1 +f 16538/16546/1 1317/1325/1 1320/1328/1 16539/16547/1 +f 16543/16551/1 16548/16556/1 1317/1325/1 16538/16546/1 +f 16548/16556/1 16547/16555/1 1318/1326/1 1317/1325/1 +f 16550/16558/1 1313/1321/1 1316/1324/1 16551/16559/1 +f 16555/16563/1 16560/16568/1 1313/1321/1 16550/16558/1 +f 16560/16568/1 16559/16567/1 1314/1322/1 1313/1321/1 +f 16562/16570/1 1309/1317/1 1312/1320/1 16563/16571/1 +f 16567/16575/1 16572/16580/1 1309/1317/1 16562/16570/1 +f 16572/16580/1 16571/16579/1 1310/1318/1 1309/1317/1 +f 16574/16582/1 1305/1313/1 1308/1316/1 16575/16583/1 +f 16579/16587/1 16584/16592/1 1305/1313/1 16574/16582/1 +f 16584/16592/1 16583/16591/1 1306/1314/1 1305/1313/1 +f 16586/16594/1 1301/1309/1 1304/1312/1 16587/16595/1 +f 16591/16599/1 16596/16604/1 1301/1309/1 16586/16594/1 +f 16596/16604/1 16595/16603/1 1302/1310/1 1301/1309/1 +f 16598/16606/1 1297/1305/1 1300/1308/1 16599/16607/1 +f 16603/16611/1 16608/16616/1 1297/1305/1 16598/16606/1 +f 16608/16616/1 16607/16615/1 1298/1306/1 1297/1305/1 +f 16610/16618/1 1293/1301/1 1296/1304/1 16611/16619/1 +f 16615/16623/1 16620/16628/1 1293/1301/1 16610/16618/1 +f 16620/16628/1 16619/16627/1 1294/1302/1 1293/1301/1 +f 16622/16630/1 1289/1297/1 1292/1300/1 16623/16631/1 +f 16627/16635/1 16632/16640/1 1289/1297/1 16622/16630/1 +f 16632/16640/1 16631/16639/1 1290/1298/1 1289/1297/1 +f 16634/16642/1 1285/1293/1 1288/1296/1 16635/16643/1 +f 16639/16647/1 16644/16652/1 1285/1293/1 16634/16642/1 +f 16644/16652/1 16643/16651/1 1286/1294/1 1285/1293/1 +f 16646/16654/1 1281/1289/1 1284/1292/1 16647/16655/1 +f 16651/16659/1 16656/16664/1 1281/1289/1 16646/16654/1 +f 16656/16664/1 16655/16663/1 1282/1290/1 1281/1289/1 +f 16658/16666/1 1277/1285/1 1280/1288/1 16659/16667/1 +f 16663/16671/1 16668/16676/1 1277/1285/1 16658/16666/1 +f 16668/16676/1 16667/16675/1 1278/1286/1 1277/1285/1 +f 16670/16678/1 1273/1281/1 1276/1284/1 16671/16679/1 +f 16675/16683/1 16680/16688/1 1273/1281/1 16670/16678/1 +f 16680/16688/1 16679/16687/1 1274/1282/1 1273/1281/1 +f 16682/16690/1 1269/1277/1 1272/1280/1 16683/16691/1 +f 16687/16695/1 16692/16700/1 1269/1277/1 16682/16690/1 +f 16692/16700/1 16691/16699/1 1270/1278/1 1269/1277/1 +f 16694/16702/1 1265/1273/1 1268/1276/1 16695/16703/1 +f 16699/16707/1 16704/16712/1 1265/1273/1 16694/16702/1 +f 16704/16712/1 16703/16711/1 1266/1274/1 1265/1273/1 +f 16706/16714/1 1261/1269/1 1264/1272/1 16707/16715/1 +f 16711/16719/1 16716/16724/1 1261/1269/1 16706/16714/1 +f 16716/16724/1 16715/16723/1 1262/1270/1 1261/1269/1 +f 16718/16726/1 1257/1265/1 1260/1268/1 16719/16727/1 +f 16723/16731/1 16728/16736/1 1257/1265/1 16718/16726/1 +f 16728/16736/1 16727/16735/1 1258/1266/1 1257/1265/1 +f 16730/16738/1 1253/1261/1 1256/1264/1 16731/16739/1 +f 16735/16743/1 16740/16748/1 1253/1261/1 16730/16738/1 +f 16740/16748/1 16739/16747/1 1254/1262/1 1253/1261/1 +f 16742/16750/1 1249/1257/1 1252/1260/1 16743/16751/1 +f 16747/16755/1 16752/16760/1 1249/1257/1 16742/16750/1 +f 16752/16760/1 16751/16759/1 1250/1258/1 1249/1257/1 +f 16754/16762/1 1245/1253/1 1248/1256/1 16755/16763/1 +f 16759/16767/1 16764/16772/1 1245/1253/1 16754/16762/1 +f 16764/16772/1 16763/16771/1 1246/1254/1 1245/1253/1 +f 16766/16774/1 1241/1249/1 1244/1252/1 16767/16775/1 +f 16771/16779/1 16776/16784/1 1241/1249/1 16766/16774/1 +f 16776/16784/1 16775/16783/1 1242/1250/1 1241/1249/1 +f 16778/16786/1 1237/1245/1 1240/1248/1 16779/16787/1 +f 16783/16791/1 16788/16796/1 1237/1245/1 16778/16786/1 +f 16788/16796/1 16787/16795/1 1238/1246/1 1237/1245/1 +f 16790/16798/1 1233/1241/1 1236/1244/1 16791/16799/1 +f 16795/16803/1 16800/16808/1 1233/1241/1 16790/16798/1 +f 16800/16808/1 16799/16807/1 1234/1242/1 1233/1241/1 +f 16802/16810/1 1229/1237/1 1232/1240/1 16803/16811/1 +f 16807/16815/1 16812/16820/1 1229/1237/1 16802/16810/1 +f 16812/16820/1 16811/16819/1 1230/1238/1 1229/1237/1 +f 16814/16822/1 1225/1233/1 1228/1236/1 16815/16823/1 +f 16819/16827/1 16824/16832/1 1225/1233/1 16814/16822/1 +f 16824/16832/1 16823/16831/1 1226/1234/1 1225/1233/1 +f 16826/16834/1 1221/1229/1 1224/1232/1 16827/16835/1 +f 16831/16839/1 16836/16844/1 1221/1229/1 16826/16834/1 +f 16836/16844/1 16835/16843/1 1222/1230/1 1221/1229/1 +f 16838/16846/1 1217/1225/1 1220/1228/1 16839/16847/1 +f 16843/16851/1 16848/16856/1 1217/1225/1 16838/16846/1 +f 16848/16856/1 16847/16855/1 1218/1226/1 1217/1225/1 +f 16850/16858/1 1213/1221/1 1216/1224/1 16851/16859/1 +f 16855/16863/1 16860/16868/1 1213/1221/1 16850/16858/1 +f 16860/16868/1 16859/16867/1 1214/1222/1 1213/1221/1 +f 16862/16870/1 1209/1217/1 1212/1220/1 16863/16871/1 +f 16867/16875/1 16872/16880/1 1209/1217/1 16862/16870/1 +f 16872/16880/1 16871/16879/1 1210/1218/1 1209/1217/1 +f 16874/16882/1 1205/1213/1 1208/1216/1 16875/16883/1 +f 16879/16887/1 16884/16892/1 1205/1213/1 16874/16882/1 +f 16884/16892/1 16883/16891/1 1206/1214/1 1205/1213/1 +f 16886/16894/1 1201/1209/1 1204/1212/1 16887/16895/1 +f 16891/16899/1 16896/16904/1 1201/1209/1 16886/16894/1 +f 16896/16904/1 16895/16903/1 1202/1210/1 1201/1209/1 +f 16898/16906/1 1197/1205/1 1200/1208/1 16899/16907/1 +f 16903/16911/1 16908/16916/1 1197/1205/1 16898/16906/1 +f 16908/16916/1 16907/16915/1 1198/1206/1 1197/1205/1 +f 16910/16918/1 1193/1201/1 1196/1204/1 16911/16919/1 +f 16915/16923/1 16920/16928/1 1193/1201/1 16910/16918/1 +f 16920/16928/1 16919/16927/1 1194/1202/1 1193/1201/1 +f 16922/16930/1 1189/1197/1 1192/1200/1 16923/16931/1 +f 16927/16935/1 16932/16940/1 1189/1197/1 16922/16930/1 +f 16932/16940/1 16931/16939/1 1190/1198/1 1189/1197/1 +f 16934/16942/1 1185/1193/1 1188/1196/1 16935/16943/1 +f 16939/16947/1 16944/16952/1 1185/1193/1 16934/16942/1 +f 16944/16952/1 16943/16951/1 1186/1194/1 1185/1193/1 +f 16946/16954/1 1181/1189/1 1184/1192/1 16947/16955/1 +f 16951/16959/1 16956/16964/1 1181/1189/1 16946/16954/1 +f 16956/16964/1 16955/16963/1 1182/1190/1 1181/1189/1 +f 16958/16966/1 1177/1185/1 1180/1188/1 16959/16967/1 +f 16963/16971/1 16968/16976/1 1177/1185/1 16958/16966/1 +f 16968/16976/1 16967/16975/1 1178/1186/1 1177/1185/1 +f 16970/16978/1 1173/1181/1 1176/1184/1 16971/16979/1 +f 16975/16983/1 16980/16988/1 1173/1181/1 16970/16978/1 +f 16980/16988/1 16979/16987/1 1174/1182/1 1173/1181/1 +f 16982/16990/1 1169/1177/1 1172/1180/1 16983/16991/1 +f 16987/16995/1 16992/17000/1 1169/1177/1 16982/16990/1 +f 16992/17000/1 16991/16999/1 1170/1178/1 1169/1177/1 +f 16994/17002/1 1165/1173/1 1168/1176/1 16995/17003/1 +f 16999/17007/1 17004/17012/1 1165/1173/1 16994/17002/1 +f 17004/17012/1 17003/17011/1 1166/1174/1 1165/1173/1 +f 17006/17014/1 1161/1169/1 1164/1172/1 17007/17015/1 +f 17011/17019/1 17016/17024/1 1161/1169/1 17006/17014/1 +f 17016/17024/1 17015/17023/1 1162/1170/1 1161/1169/1 +f 17018/17026/1 1157/1165/1 1160/1168/1 17019/17027/1 +f 17023/17031/1 17028/17036/1 1157/1165/1 17018/17026/1 +f 17028/17036/1 17027/17035/1 1158/1166/1 1157/1165/1 +f 17030/17038/1 1153/1161/1 1156/1164/1 17031/17039/1 +f 17035/17043/1 17040/17048/1 1153/1161/1 17030/17038/1 +f 17040/17048/1 17039/17047/1 1154/1162/1 1153/1161/1 +f 17042/17050/1 1149/1157/1 1152/1160/1 17043/17051/1 +f 17047/17055/1 17052/17060/1 1149/1157/1 17042/17050/1 +f 17052/17060/1 17051/17059/1 1150/1158/1 1149/1157/1 +f 17054/17062/1 1145/1153/1 1148/1156/1 17055/17063/1 +f 17059/17067/1 17064/17072/1 1145/1153/1 17054/17062/1 +f 17064/17072/1 17063/17071/1 1146/1154/1 1145/1153/1 +f 17066/17074/1 1141/1149/1 1144/1152/1 17067/17075/1 +f 17071/17079/1 17076/17084/1 1141/1149/1 17066/17074/1 +f 17076/17084/1 17075/17083/1 1142/1150/1 1141/1149/1 +f 17078/17086/1 1137/1145/1 1140/1148/1 17079/17087/1 +f 17083/17091/1 17088/17096/1 1137/1145/1 17078/17086/1 +f 17088/17096/1 17087/17095/1 1138/1146/1 1137/1145/1 +f 17090/17098/1 1133/1141/1 1136/1144/1 17091/17099/1 +f 17095/17103/1 17100/17108/1 1133/1141/1 17090/17098/1 +f 17100/17108/1 17099/17107/1 1134/1142/1 1133/1141/1 +f 17102/17110/1 1129/1137/1 1132/1140/1 17103/17111/1 +f 17107/17115/1 17112/17120/1 1129/1137/1 17102/17110/1 +f 17112/17120/1 17111/17119/1 1130/1138/1 1129/1137/1 +f 17114/17122/1 1125/1133/1 1128/1136/1 17115/17123/1 +f 17119/17127/1 17124/17132/1 1125/1133/1 17114/17122/1 +f 17124/17132/1 17123/17131/1 1126/1134/1 1125/1133/1 +f 17126/17134/1 1121/1129/1 1124/1132/1 17127/17135/1 +f 17131/17139/1 17136/17144/1 1121/1129/1 17126/17134/1 +f 17136/17144/1 17135/17143/1 1122/1130/1 1121/1129/1 +f 17138/17146/1 1117/1125/1 1120/1128/1 17139/17147/1 +f 17143/17151/1 17148/17156/1 1117/1125/1 17138/17146/1 +f 17148/17156/1 17147/17155/1 1118/1126/1 1117/1125/1 +f 17150/17158/1 1113/1121/1 1116/1124/1 17151/17159/1 +f 17155/17163/1 17160/17168/1 1113/1121/1 17150/17158/1 +f 17160/17168/1 17159/17167/1 1114/1122/1 1113/1121/1 +f 17162/17170/1 1109/1117/1 1112/1120/1 17163/17171/1 +f 17167/17175/1 17172/17180/1 1109/1117/1 17162/17170/1 +f 17172/17180/1 17171/17179/1 1110/1118/1 1109/1117/1 +f 17174/17182/1 1105/1113/1 1108/1116/1 17175/17183/1 +f 17179/17187/1 17184/17192/1 1105/1113/1 17174/17182/1 +f 17184/17192/1 17183/17191/1 1106/1114/1 1105/1113/1 +f 17186/17194/1 1101/1109/1 1104/1112/1 17187/17195/1 +f 17191/17199/1 17196/17204/1 1101/1109/1 17186/17194/1 +f 17196/17204/1 17195/17203/1 1102/1110/1 1101/1109/1 +f 17198/17206/1 1097/1105/1 1100/1108/1 17199/17207/1 +f 17203/17211/1 17208/17216/1 1097/1105/1 17198/17206/1 +f 17208/17216/1 17207/17215/1 1098/1106/1 1097/1105/1 +f 17210/17218/1 1093/1101/1 1096/1104/1 17211/17219/1 +f 17215/17223/1 17220/17228/1 1093/1101/1 17210/17218/1 +f 17220/17228/1 17219/17227/1 1094/1102/1 1093/1101/1 +f 17222/17230/1 1089/1097/1 1092/1100/1 17223/17231/1 +f 17227/17235/1 17232/17240/1 1089/1097/1 17222/17230/1 +f 17232/17240/1 17231/17239/1 1090/1098/1 1089/1097/1 +f 17234/17242/1 1085/1093/1 1088/1096/1 17235/17243/1 +f 17239/17247/1 17244/17252/1 1085/1093/1 17234/17242/1 +f 17244/17252/1 17243/17251/1 1086/1094/1 1085/1093/1 +f 17246/17254/1 1081/1089/1 1084/1092/1 17247/17255/1 +f 17251/17259/1 17256/17264/1 1081/1089/1 17246/17254/1 +f 17256/17264/1 17255/17263/1 1082/1090/1 1081/1089/1 +f 17258/17266/1 1077/1085/1 1080/1088/1 17259/17267/1 +f 17263/17271/1 17268/17276/1 1077/1085/1 17258/17266/1 +f 17268/17276/1 17267/17275/1 1078/1086/1 1077/1085/1 +f 17270/17278/1 1073/1081/1 1076/1084/1 17271/17279/1 +f 17275/17283/1 17280/17288/1 1073/1081/1 17270/17278/1 +f 17280/17288/1 17279/17287/1 1074/1082/1 1073/1081/1 +f 17282/17290/1 1069/1077/1 1072/1080/1 17283/17291/1 +f 17287/17295/1 17292/17300/1 1069/1077/1 17282/17290/1 +f 17292/17300/1 17291/17299/1 1070/1078/1 1069/1077/1 +f 17294/17302/1 1065/1073/1 1068/1076/1 17295/17303/1 +f 17299/17307/1 17304/17312/1 1065/1073/1 17294/17302/1 +f 17304/17312/1 17303/17311/1 1066/1074/1 1065/1073/1 +f 17306/17314/1 1061/1069/1 1064/1072/1 17307/17315/1 +f 17311/17319/1 17316/17324/1 1061/1069/1 17306/17314/1 +f 17316/17324/1 17315/17323/1 1062/1070/1 1061/1069/1 +f 17318/17326/1 1057/1065/1 1060/1068/1 17319/17327/1 +f 17323/17331/1 17328/17336/1 1057/1065/1 17318/17326/1 +f 17328/17336/1 17327/17335/1 1058/1066/1 1057/1065/1 +f 17330/17338/1 1053/1061/1 1056/1064/1 17331/17339/1 +f 17335/17343/1 17340/17348/1 1053/1061/1 17330/17338/1 +f 17340/17348/1 17339/17347/1 1054/1062/1 1053/1061/1 +f 17342/17350/1 1049/1057/1 1052/1060/1 17343/17351/1 +f 17347/17355/1 17352/17360/1 1049/1057/1 17342/17350/1 +f 17352/17360/1 17351/17359/1 1050/1058/1 1049/1057/1 +f 17354/17362/1 1045/1053/1 1048/1056/1 17355/17363/1 +f 17359/17367/1 17364/17372/1 1045/1053/1 17354/17362/1 +f 17364/17372/1 17363/17371/1 1046/1054/1 1045/1053/1 +f 17366/17374/1 1041/1049/1 1044/1052/1 17367/17375/1 +f 17371/17379/1 17376/17384/1 1041/1049/1 17366/17374/1 +f 17376/17384/1 17375/17383/1 1042/1050/1 1041/1049/1 +f 17378/17386/1 1037/1045/1 1040/1048/1 17379/17387/1 +f 17383/17391/1 17388/17396/1 1037/1045/1 17378/17386/1 +f 17388/17396/1 17387/17395/1 1038/1046/1 1037/1045/1 +f 17390/17398/1 1033/1041/1 1036/1044/1 17391/17399/1 +f 17395/17403/1 17400/17408/1 1033/1041/1 17390/17398/1 +f 17400/17408/1 17399/17407/1 1034/1042/1 1033/1041/1 +f 17402/17410/1 1029/1037/1 1032/1040/1 17403/17411/1 +f 17407/17415/1 17412/17420/1 1029/1037/1 17402/17410/1 +f 17412/17420/1 17411/17419/1 1030/1038/1 1029/1037/1 diff --git a/basicsuite/advancedcustommaterial/preview_l.jpg b/basicsuite/advancedcustommaterial/preview_l.jpg new file mode 100644 index 0000000..d9f1de1 Binary files /dev/null and b/basicsuite/advancedcustommaterial/preview_l.jpg differ diff --git a/basicsuite/advancedcustommaterial/shaders/es2/coordinatesystems.inc b/basicsuite/advancedcustommaterial/shaders/es2/coordinatesystems.inc new file mode 100644 index 0000000..5f6ee40 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/es2/coordinatesystems.inc @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#define FP highp + +FP mat3 transpose(const in FP mat3 inputMatrix) +{ + FP vec3 i0 = inputMatrix[0]; + FP vec3 i1 = inputMatrix[1]; + FP vec3 i2 = inputMatrix[2]; + + FP mat3 outputMatrix = mat3( + vec3(i0.x, i1.x, i2.x), + vec3(i0.y, i1.y, i2.y), + vec3(i0.z, i1.z, i2.z) + ); + + return outputMatrix; +} + +FP mat3 calcWorldSpaceToTangentSpaceMatrix(const in FP vec3 wNormal, const in FP vec4 wTangent) +{ + // Make the tangent truly orthogonal to the normal by using Gram-Schmidt. + // This allows to build the tangentMatrix below by simply transposing the + // tangent -> eyespace matrix (which would now be orthogonal) + FP vec3 wFixedTangent = normalize(wTangent.xyz - dot(wTangent.xyz, wNormal) * wNormal); + + // Calculate binormal vector. No "real" need to renormalize it, + // as built by crossing two normal vectors. + // To orient the binormal correctly, use the fourth coordinate of the tangent, + // which is +1 for a right hand system, and -1 for a left hand system. + FP vec3 wBinormal = cross(wNormal, wFixedTangent.xyz) * wTangent.w; + + // Construct matrix to transform from world space to tangent space + // This is the transpose of the tangentToWorld transformation matrix + FP mat3 tangentToWorldMatrix = mat3(wFixedTangent, wBinormal, wNormal); + FP mat3 worldToTangentMatrix = transpose(tangentToWorldMatrix); + return worldToTangentMatrix; +} + diff --git a/basicsuite/advancedcustommaterial/shaders/es2/light.inc.frag b/basicsuite/advancedcustommaterial/shaders/es2/light.inc.frag new file mode 100644 index 0000000..167ff30 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/es2/light.inc.frag @@ -0,0 +1,17 @@ +#define FP highp + +const int MAX_LIGHTS = 8; +const int TYPE_POINT = 0; +const int TYPE_DIRECTIONAL = 1; +const int TYPE_SPOT = 2; +struct Light { + int type; + FP vec3 position; + FP vec3 color; + FP float intensity; + FP vec3 direction; + FP vec3 attenuation; + FP float cutOffAngle; +}; +uniform Light lights[MAX_LIGHTS]; +uniform int lightCount; diff --git a/basicsuite/advancedcustommaterial/shaders/es2/phong.inc.frag b/basicsuite/advancedcustommaterial/shaders/es2/phong.inc.frag new file mode 100644 index 0000000..9d17b68 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/es2/phong.inc.frag @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma include light.inc.frag + +void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 vview, const in FP float shininess, + out FP vec3 diffuseColor, out FP vec3 specularColor) +{ + diffuseColor = vec3(0.0); + specularColor = vec3(0.0); + + FP vec3 n = normalize( vnormal ); + + FP vec3 s; + Light light; + for (int i = 0; i < lightCount; ++i) { + if (i == 0) + light = lights[0]; + else if (i == 1) + light = lights[1]; + else if (i == 2) + light = lights[2]; + else if (i == 3) + light = lights[3]; + else if (i == 4) + light = lights[4]; + else if (i == 5) + light = lights[5]; + else if (i == 6) + light = lights[6]; + else if (i == 7) + light = lights[7]; + + FP float att = 1.0; + if ( light.type != TYPE_DIRECTIONAL ) { + s = light.position - vpos; + if (length( light.attenuation ) != 0.0) { + FP float dist = length(s); + att = 1.0 / (light.attenuation.x + light.attenuation.y * dist + light.attenuation.z * dist * dist); + } + s = normalize( s ); + if ( light.type == TYPE_SPOT ) { + if ( degrees(acos(dot(-s, normalize(light.direction))) ) > light.cutOffAngle) + att = 0.0; + } + } else { + s = normalize( -light.direction ); + } + + FP float diffuse = max( dot( s, n ), 0.0 ); + + FP float specular = 0.0; + if (diffuse > 0.0 && shininess > 0.0 && att > 0.0) { + FP vec3 r = reflect( -s, n ); + FP float normFactor = ( shininess + 2.0 ) / 2.0; + specular = normFactor * pow( max( dot( r, vview ), 0.0 ), shininess ); + } + + diffuseColor += att * light.intensity * diffuse * light.color; + specularColor += att * light.intensity * specular * light.color; + } +} + +FP vec4 phongFunction(const in FP vec4 ambient, + const in FP vec4 diffuse, + const in FP vec4 specular, + const in FP float shininess, + const in FP vec3 worldPosition, + const in FP vec3 worldView, + const in FP vec3 worldNormal) +{ + // Calculate the lighting model, keeping the specular component separate + FP vec3 diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + + // Combine spec with ambient+diffuse for final fragment color + FP vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + + specularColor * specular.rgb; + + return vec4(color, diffuse.a); +} diff --git a/basicsuite/advancedcustommaterial/shaders/es2/water.frag b/basicsuite/advancedcustommaterial/shaders/es2/water.frag new file mode 100644 index 0000000..f471504 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/es2/water.frag @@ -0,0 +1,76 @@ +#define FP highp + +varying FP vec3 worldPosition; +varying FP vec3 worldNormal; +varying FP vec4 worldTangent; +varying FP vec2 texCoord; +varying FP vec2 waveTexCoord; +varying FP vec2 movtexCoord; +varying FP vec2 multexCoord; +varying FP vec2 skyTexCoord; + +varying FP vec3 vpos; + +varying FP vec3 color; + +uniform FP sampler2D diffuseTexture; +uniform FP sampler2D specularTexture; +uniform FP sampler2D normalTexture; +uniform FP sampler2D waveTexture; +uniform FP sampler2D skyTexture; +uniform FP sampler2D foamTexture; + +uniform FP float offsetx; +uniform FP float offsety; +uniform FP float specularity; +uniform FP float waveStrenght; +uniform FP vec4 ka; +uniform FP float shininess; +uniform FP float normalAmount; +uniform FP vec3 eyePosition; + +#pragma include phong.inc.frag +#pragma include coordinatesystems.inc + +void main() +{ + // Move waveTexCoords + FP vec2 waveMovCoord = waveTexCoord; + waveMovCoord.x += offsetx; + waveMovCoord.y -= offsety; + FP vec4 wave = texture2D(waveTexture, waveMovCoord); + + //Wiggle the newCoord by r and b colors of waveTexture + FP vec2 newCoord = texCoord; + newCoord.x += wave.r * waveStrenght; + newCoord.y -= wave.b * waveStrenght; + + // Sample the textures at the interpolated texCoords + // Use default texCoord for diffuse (it does not move on x or y, so it can be used as "ground under the water"). + FP vec4 diffuseTextureColor = texture2D(diffuseTexture, texCoord); + // 2 Animated Layers of specularTexture mixed with the newCoord + FP vec4 specularTextureColor = texture2D( specularTexture, multexCoord+newCoord) + (texture2D( specularTexture, movtexCoord+newCoord )); + // 2 Animated Layers of normalTexture mixed with the newCoord + FP vec3 tNormal = normalAmount * texture2D( normalTexture, movtexCoord+newCoord ).rgb - vec3( 1.0 )+(normalAmount * texture2D( normalTexture, multexCoord+newCoord ).rgb - vec3( 1.0 )); + // Animated skyTexture layer + FP vec4 skycolor = texture2D(skyTexture, skyTexCoord); + skycolor = skycolor * 0.4; + //Animated foamTexture layer + FP vec4 foamTextureColor = texture2D(foamTexture, texCoord); + + FP mat3 tangentMatrix = calcWorldSpaceToTangentSpaceMatrix(worldNormal, worldTangent); + FP mat3 invertTangentMatrix = transpose(tangentMatrix); + + FP vec3 wNormal = normalize(invertTangentMatrix * tNormal); + FP vec3 worldView = normalize(eyePosition - worldPosition); + + FP vec4 diffuse = vec4(diffuseTextureColor.rgb, vpos.y); + FP vec4 specular = vec4(specularTextureColor.a*specularity); + FP vec4 outputColor = phongFunction(ka, diffuse, specular, shininess, worldPosition, worldView, wNormal); + + outputColor += vec4(skycolor.rgb, vpos.y); + outputColor += (foamTextureColor.rgba*vpos.y); + + gl_FragColor = vec4(outputColor.rgb,1.0); +} + diff --git a/basicsuite/advancedcustommaterial/shaders/es2/water.vert b/basicsuite/advancedcustommaterial/shaders/es2/water.vert new file mode 100644 index 0000000..76dd3f8 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/es2/water.vert @@ -0,0 +1,73 @@ +#define FP highp + +attribute FP vec3 vertexPosition; +attribute FP vec3 vertexNormal; +attribute FP vec2 vertexTexCoord; +attribute FP vec4 vertexTangent; + +varying FP vec3 worldPosition; +varying FP vec3 worldNormal; +varying FP vec4 worldTangent; +varying FP vec2 texCoord; +varying FP vec2 movtexCoord; +varying FP vec2 multexCoord; +varying FP vec2 waveTexCoord; +varying FP vec2 skyTexCoord; +varying FP vec3 vpos; + +uniform FP mat4 modelMatrix; +uniform FP mat3 modelNormalMatrix; +uniform FP mat4 mvp; + +uniform FP float offsetx; +uniform FP float offsety; +uniform FP float vertYpos; +uniform FP float texCoordScale; +uniform FP float waveheight; +uniform FP float waveRandom; + + +void main() +{ + // Scale texture coordinates for for fragment shader + texCoord = vertexTexCoord * texCoordScale; + movtexCoord = vertexTexCoord * texCoordScale; + multexCoord = vertexTexCoord * (texCoordScale*0.5); + waveTexCoord = vertexTexCoord * (texCoordScale * 6.0); + skyTexCoord = vertexTexCoord * (texCoordScale * 0.2); + + // Add Animated x and y Offset to SKY, MOV and MUL texCoords + movtexCoord = vec2(texCoord.x+offsetx,texCoord.y+offsety); + multexCoord = vec2(texCoord.x-offsetx,texCoord.y+offsety); + skyTexCoord = vec2(texCoord.x-(offsetx/2.0),texCoord.y-(offsety/2.0)); + + // Transform position, normal, and tangent to world coords + worldPosition = vec3(modelMatrix * vec4(vertexPosition, 1.0)); + worldNormal = normalize(modelNormalMatrix * vertexNormal); + worldTangent.xyz = normalize(vec3(modelMatrix * vec4(vertexTangent.xyz, 0.0))); + worldTangent.w = vertexTangent.w; + + // Calculate animated vertex positions + + FP float sinPos = (vertexPosition.z)+(vertexPosition.x); + FP float sinPos2 = (vertexPosition.y/2.0)+(vertexPosition.z); + FP vec3 vertMod = vec3(vertexPosition.x,vertexPosition.y,vertexPosition.z); + + vertMod = vec3(vertMod.x+=sin(vertYpos*2.2-sinPos2)*waveheight, + vertMod.y=sin(vertYpos*2.2+sinPos)*waveheight, + vertMod.z-=sin(vertYpos*2.2-cos(sinPos2))*waveheight); + + FP vec3 vertModCom = vec3(vertMod.x+=cos(vertYpos*2.2-cos(sinPos2))*waveheight, + vertMod.y=sin(vertYpos*2.2+cos(sinPos))*waveheight, + vertMod.z-=cos(vertYpos*2.2-cos(sinPos))*waveheight); + + + // Add wave animation only to vertices above world pos.y zero + if(vertexPosition.y < 0.0){vertModCom = vertexPosition;} + else{vertModCom = vertModCom;} + + vpos = vertModCom; + + // Calculate vertex position in clip coordinates + gl_Position = mvp * vec4(vertModCom, 1.0); +} diff --git a/basicsuite/advancedcustommaterial/shaders/gl3/coordinatesystems.inc b/basicsuite/advancedcustommaterial/shaders/gl3/coordinatesystems.inc new file mode 100644 index 0000000..ed3d2cb --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/gl3/coordinatesystems.inc @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +mat3 calcWorldSpaceToTangentSpaceMatrix(const in vec3 wNormal, const in vec4 wTangent) +{ + // Make the tangent truly orthogonal to the normal by using Gram-Schmidt. + // This allows to build the tangentMatrix below by simply transposing the + // tangent -> eyespace matrix (which would now be orthogonal) + vec3 wFixedTangent = normalize(wTangent.xyz - dot(wTangent.xyz, wNormal) * wNormal); + + // Calculate binormal vector. No "real" need to renormalize it, + // as built by crossing two normal vectors. + // To orient the binormal correctly, use the fourth coordinate of the tangent, + // which is +1 for a right hand system, and -1 for a left hand system. + vec3 wBinormal = cross(wNormal, wFixedTangent.xyz) * wTangent.w; + + // Construct matrix to transform from world space to tangent space + // This is the transpose of the tangentToWorld transformation matrix + mat3 tangentToWorldMatrix = mat3(wFixedTangent, wBinormal, wNormal); + mat3 worldToTangentMatrix = transpose(tangentToWorldMatrix); + return worldToTangentMatrix; +} + diff --git a/basicsuite/advancedcustommaterial/shaders/gl3/light.inc.frag b/basicsuite/advancedcustommaterial/shaders/gl3/light.inc.frag new file mode 100644 index 0000000..0b64263 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/gl3/light.inc.frag @@ -0,0 +1,25 @@ +const int MAX_LIGHTS = 8; +const int TYPE_POINT = 0; +const int TYPE_DIRECTIONAL = 1; +const int TYPE_SPOT = 2; +struct Light { + int type; + vec3 position; + vec3 color; + float intensity; + vec3 direction; + float constantAttenuation; + float linearAttenuation; + float quadraticAttenuation; + float cutOffAngle; +}; +uniform Light lights[MAX_LIGHTS]; +uniform int lightCount; + +// Pre-convolved environment maps +struct EnvironmentLight { + samplerCube irradiance; // For diffuse contribution + samplerCube specular; // For specular contribution +}; +uniform EnvironmentLight envLight; +uniform int envLightCount = 0; diff --git a/basicsuite/advancedcustommaterial/shaders/gl3/phong.inc.frag b/basicsuite/advancedcustommaterial/shaders/gl3/phong.inc.frag new file mode 100644 index 0000000..47a6ecd --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/gl3/phong.inc.frag @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma include light.inc.frag + +void adsModel(const in vec3 worldPos, + const in vec3 worldNormal, + const in vec3 worldView, + const in float shininess, + out vec3 diffuseColor, + out vec3 specularColor) +{ + diffuseColor = vec3(0.0); + specularColor = vec3(0.0); + + // We perform all work in world space + vec3 n = normalize(worldNormal); + vec3 s = vec3(0.0); + + for (int i = 0; i < lightCount; ++i) { + float att = 1.0; + float sDotN = 0.0; + + if (lights[i].type != TYPE_DIRECTIONAL) { + // Point and Spot lights + + // Light position is already in world space + vec3 sUnnormalized = lights[i].position - worldPos; + s = normalize(sUnnormalized); // Light direction + + // Calculate the attenuation factor + sDotN = dot(s, n); + if (sDotN > 0.0) { + if (lights[i].constantAttenuation != 0.0 + || lights[i].linearAttenuation != 0.0 + || lights[i].quadraticAttenuation != 0.0) { + float dist = length(sUnnormalized); + att = 1.0 / (lights[i].constantAttenuation + + lights[i].linearAttenuation * dist + + lights[i].quadraticAttenuation * dist * dist); + } + + // The light direction is in world space already + if (lights[i].type == TYPE_SPOT) { + // Check if fragment is inside or outside of the spot light cone + if (degrees(acos(dot(-s, lights[i].direction))) > lights[i].cutOffAngle) + sDotN = 0.0; + } + } + } else { + // Directional lights + // The light direction is in world space already + s = normalize(-lights[i].direction); + sDotN = dot(s, n); + } + + // Calculate the diffuse factor + float diffuse = max(sDotN, 0.0); + + // Calculate the specular factor + float specular = 0.0; + if (diffuse > 0.0 && shininess > 0.0) { + float normFactor = (shininess + 2.0) / 2.0; + vec3 r = reflect(-s, n); // Reflection direction in world space + specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess); + } + + // Accumulate the diffuse and specular contributions + diffuseColor += att * lights[i].intensity * diffuse * lights[i].color; + specularColor += att * lights[i].intensity * specular * lights[i].color; + } +} + +vec4 phongFunction(const in vec4 ambient, + const in vec4 diffuse, + const in vec4 specular, + const in float shininess, + const in vec3 worldPosition, + const in vec3 worldView, + const in vec3 worldNormal) +{ + // Calculate the lighting model, keeping the specular component separate + vec3 diffuseColor, specularColor; + adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor); + + // Combine spec with ambient+diffuse for final fragment color + vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb + + specularColor * specular.rgb; + + return vec4(color, diffuse.a); +} diff --git a/basicsuite/advancedcustommaterial/shaders/gl3/water.frag b/basicsuite/advancedcustommaterial/shaders/gl3/water.frag new file mode 100644 index 0000000..6e97223 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/gl3/water.frag @@ -0,0 +1,79 @@ +#version 150 core + +in vec3 worldPosition; +in vec3 worldNormal; +in vec4 worldTangent; +in vec2 texCoord; +in vec2 waveTexCoord; +in vec2 movtexCoord; +in vec2 multexCoord; +in vec2 skyTexCoord; + +in vec3 vpos; + +in vec3 color; + +uniform sampler2D diffuseTexture; +uniform sampler2D specularTexture; +uniform sampler2D normalTexture; +uniform sampler2D waveTexture; +uniform sampler2D skyTexture; +uniform sampler2D foamTexture; + +uniform float offsetx; +uniform float offsety; +uniform float specularity; +uniform float waveStrenght; +uniform vec4 ka; +uniform vec3 specularColor; +uniform float shininess; +uniform float normalAmount; +uniform vec3 eyePosition; + +out vec4 fragColor; + +#pragma include phong.inc.frag +#pragma include coordinatesystems.inc + +void main() +{ + // Move waveTexCoords + vec2 waveMovCoord = waveTexCoord; + waveMovCoord.x += offsetx; + waveMovCoord.y -= offsety; + vec4 wave = texture(waveTexture, waveMovCoord); + + //Wiggle the newCoord by r and b colors of waveTexture + vec2 newCoord = texCoord; + newCoord.x += wave.r * waveStrenght; + newCoord.y -= wave.b * waveStrenght; + + // Sample the textures at the interpolated texCoords + // Use default texCoord for diffuse (it does not move on x or y, so it can be used as "ground under the water"). + vec4 diffuseTextureColor = texture(diffuseTexture, texCoord); + // 2 Animated Layers of specularTexture mixed with the newCoord + vec4 specularTextureColor = texture( specularTexture, multexCoord+newCoord) + (texture( specularTexture, movtexCoord+newCoord )); + // 2 Animated Layers of normalTexture mixed with the newCoord + vec3 tNormal = normalAmount * texture( normalTexture, movtexCoord+newCoord ).rgb - vec3( 1.0 )+(normalAmount * texture( normalTexture, multexCoord+newCoord ).rgb - vec3( 1.0 )); + // Animated skyTexture layer + vec4 skycolor = texture(skyTexture, skyTexCoord); + skycolor = skycolor * 0.4; + //Animated foamTexture layer + vec4 foamTextureColor = texture(foamTexture, texCoord); + + mat3 tangentMatrix = calcWorldSpaceToTangentSpaceMatrix(worldNormal, worldTangent); + mat3 invertTangentMatrix = transpose(tangentMatrix); + + vec3 wNormal = normalize(invertTangentMatrix * tNormal); + vec3 worldView = normalize(eyePosition - worldPosition); + + vec4 diffuse = vec4(diffuseTextureColor.rgb, vpos.y); + vec4 specular = vec4(specularTextureColor.a*specularity); + vec4 outputColor = phongFunction(ka, diffuse, specular, shininess, worldPosition, worldView, wNormal); + + outputColor += vec4(skycolor.rgb, vpos.y); + outputColor += (foamTextureColor.rgba*vpos.y); + + fragColor = vec4(outputColor.rgb,1.0); +} + diff --git a/basicsuite/advancedcustommaterial/shaders/gl3/water.vert b/basicsuite/advancedcustommaterial/shaders/gl3/water.vert new file mode 100644 index 0000000..3af37e9 --- /dev/null +++ b/basicsuite/advancedcustommaterial/shaders/gl3/water.vert @@ -0,0 +1,73 @@ +#version 150 core + +in vec3 vertexPosition; +in vec3 vertexNormal; +in vec2 vertexTexCoord; +in vec4 vertexTangent; + +out vec3 worldPosition; +out vec3 worldNormal; +out vec4 worldTangent; +out vec2 texCoord; +out vec2 movtexCoord; +out vec2 multexCoord; +out vec2 waveTexCoord; +out vec2 skyTexCoord; +out vec3 vpos; + +uniform mat4 modelMatrix; +uniform mat3 modelNormalMatrix; +uniform mat4 mvp; + +uniform float offsetx; +uniform float offsety; +uniform float vertYpos; +uniform float texCoordScale; +uniform float waveheight; +uniform float waveRandom; + + +void main() +{ + // Scale texture coordinates for for fragment shader + texCoord = vertexTexCoord * texCoordScale; + movtexCoord = vertexTexCoord * texCoordScale; + multexCoord = vertexTexCoord * (texCoordScale*0.5); + waveTexCoord = vertexTexCoord * (texCoordScale * 6); + skyTexCoord = vertexTexCoord * (texCoordScale * 0.2); + + // Add Animated x and y Offset to SKY, MOV and MUL texCoords + movtexCoord = vec2(texCoord.x+offsetx,texCoord.y+offsety); + multexCoord = vec2(texCoord.x-offsetx,texCoord.y+offsety); + skyTexCoord = vec2(texCoord.x-(offsetx/2),texCoord.y-(offsety/2)); + + // Transform position, normal, and tangent to world coords + worldPosition = vec3(modelMatrix * vec4(vertexPosition, 1.0)); + worldNormal = normalize(modelNormalMatrix * vertexNormal); + worldTangent.xyz = normalize(vec3(modelMatrix * vec4(vertexTangent.xyz, 0.0))); + worldTangent.w = vertexTangent.w; + + // Calculate animated vertex positions + + float sinPos = (vertexPosition.z)+(vertexPosition.x); + float sinPos2 = (vertexPosition.y/2)+(vertexPosition.z); + vec3 vertMod = vec3(vertexPosition.x,vertexPosition.y,vertexPosition.z); + + vertMod = vec3(vertMod.x+=sin(vertYpos*2.2-sinPos2)*waveheight, + vertMod.y=sin(vertYpos*2.2+sinPos)*waveheight, + vertMod.z-=sin(vertYpos*2.2-cos(sinPos2))*waveheight); + + vec3 vertModCom = vec3(vertMod.x+=cos(vertYpos*2.2-cos(sinPos2))*waveheight, + vertMod.y=sin(vertYpos*2.2+cos(sinPos))*waveheight, + vertMod.z-=cos(vertYpos*2.2-cos(sinPos))*waveheight); + + + // Add wave animation only to vertices above world pos.y zero + if(vertexPosition.y < 0.0){vertModCom = vertexPosition;} + else{vertModCom = vertModCom;} + + vpos = vertModCom; + + // Calculate vertex position in clip coordinates + gl_Position = mvp * vec4(vertModCom, 1.0); +} diff --git a/basicsuite/advancedcustommaterial/textures/WaterDiffuse.jpg b/basicsuite/advancedcustommaterial/textures/WaterDiffuse.jpg new file mode 100644 index 0000000..70b41d8 Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/WaterDiffuse.jpg differ diff --git a/basicsuite/advancedcustommaterial/textures/WaterNormal.jpg b/basicsuite/advancedcustommaterial/textures/WaterNormal.jpg new file mode 100644 index 0000000..884934a Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/WaterNormal.jpg differ diff --git a/basicsuite/advancedcustommaterial/textures/WaterSpecular.jpg b/basicsuite/advancedcustommaterial/textures/WaterSpecular.jpg new file mode 100644 index 0000000..a9bd823 Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/WaterSpecular.jpg differ diff --git a/basicsuite/advancedcustommaterial/textures/Waterwave.jpg b/basicsuite/advancedcustommaterial/textures/Waterwave.jpg new file mode 100644 index 0000000..15e3419 Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/Waterwave.jpg differ diff --git a/basicsuite/advancedcustommaterial/textures/foam.jpg b/basicsuite/advancedcustommaterial/textures/foam.jpg new file mode 100644 index 0000000..b2100a8 Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/foam.jpg differ diff --git a/basicsuite/advancedcustommaterial/textures/sky.jpg b/basicsuite/advancedcustommaterial/textures/sky.jpg new file mode 100644 index 0000000..0f57652 Binary files /dev/null and b/basicsuite/advancedcustommaterial/textures/sky.jpg differ diff --git a/basicsuite/basicsuite.pro b/basicsuite/basicsuite.pro index b943f4c..e64894b 100644 --- a/basicsuite/basicsuite.pro +++ b/basicsuite/basicsuite.pro @@ -9,3 +9,9 @@ qtHaveModule(multimedia) { SUBDIRS += \ camera } + +qtHaveModule(charts) { + SUBDIRS += \ + ebike-ui \ + datacollector +} diff --git a/basicsuite/camera/demo.xml b/basicsuite/camera/demo.xml new file mode 100644 index 0000000..cf30096 --- /dev/null +++ b/basicsuite/camera/demo.xml @@ -0,0 +1,9 @@ + + + + +This example demonstrates the use of the camera features of Qt Multimedia with Qt Quick. + +Demo can be used to take photos which are saved in the /data/images/ directory. Camera parameters such as flash mode, scene mode or white balance can be changed. The availability of parameters depends on what the camera driver provides. + + diff --git a/basicsuite/canvas3d-planets/demo.xml b/basicsuite/canvas3d-planets/demo.xml new file mode 100644 index 0000000..2fd205a --- /dev/null +++ b/basicsuite/canvas3d-planets/demo.xml @@ -0,0 +1,7 @@ + + + + +The Planets example showcases Qt Canvas 3D. This demo combines WebGL code and three.js with QML and Qt Quick Controls. + + diff --git a/basicsuite/datacollector/abstractdatasource.cpp b/basicsuite/datacollector/abstractdatasource.cpp new file mode 100644 index 0000000..e7e7aa3 --- /dev/null +++ b/basicsuite/datacollector/abstractdatasource.cpp @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "abstractdatasource.h" + +AbstractDataSource::AbstractDataSource(QObject *parent) + : QObject(parent) +{ +} diff --git a/basicsuite/datacollector/abstractdatasource.h b/basicsuite/datacollector/abstractdatasource.h new file mode 100644 index 0000000..3fc0e1b --- /dev/null +++ b/basicsuite/datacollector/abstractdatasource.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ABSTRACTDATASOURCE_H +#define ABSTRACTDATASOURCE_H + +#include +#include + +class AbstractDataSource : public QObject +{ + Q_OBJECT + +public: + explicit AbstractDataSource(QObject *parent = nullptr); + virtual ~AbstractDataSource() {} + +public: + virtual void setSpeed(double speed)=0; + virtual void setTopSpeed(double topSpeed)=0; + virtual void setAverageSpeed(double averageSpeed)=0; + virtual void setLifetime(double lifetime)=0; + virtual void setOdometer(double odometer)=0; + virtual void setCalories(double calories)=0; + virtual void setBatteryLevel(int batteryLevel)=0; + virtual void setAssistDistance(int assistdistance)=0; + virtual void setAssistPower(int assistpower)=0; + virtual void setCurrentTrip(const QJsonObject ¤t)=0; + +signals: + void dataUpdate(const QJsonObject &update); + +public slots: + virtual void parseMessage(const QJsonObject &message)=0; + virtual void shutdown()=0; +}; + +#endif // ABSTRACTDATASOURCE_H diff --git a/basicsuite/datacollector/datacollector.pro b/basicsuite/datacollector/datacollector.pro new file mode 100644 index 0000000..a01e690 --- /dev/null +++ b/basicsuite/datacollector/datacollector.pro @@ -0,0 +1,50 @@ +QT -= gui +QT += network + +CONFIG += c++11 console +CONFIG -= app_bundle + +QMAKE_CXXFLAGS += -Os + +if(linux*imx7*g++) { + message("Building for IMX7") + + #Use FLTO for better size, other for better speed + #(both needs to be used with proper Qt libs) + + if(linux-ffopt-imx7-g++) { + } + else { + DEFINES += USE_FLTO + } + + contains(DEFINES,USE_FLTO) { + message("Building with FLTO") + QMAKE_CXXFLAGS += -flto + QMAKE_LFLAGS += -flto + } else { + message("Building with Sections Optimization") + QMAKE_CXXFLAGS += -ffunction-sections -fdata-sections + QMAKE_LFLAGS += -Wl,--gc-sections + #QMAKE_LFLAGS += -Wl,--print-gc-sections + } +} + +SOURCES += main.cpp \ + socketserver.cpp \ + socketclient.cpp \ + abstractdatasource.cpp \ + mockdatasource.cpp \ + tripdata.cpp \ + unixsignalhandler.cpp + +HEADERS += \ + socketserver.h \ + socketclient.h \ + abstractdatasource.h \ + mockdatasource.h \ + tripdata.h \ + unixsignalhandler.h + +target.path += /data/user/qt/$$TARGET +INSTALLS += target diff --git a/basicsuite/datacollector/main.cpp b/basicsuite/datacollector/main.cpp new file mode 100644 index 0000000..438abbb --- /dev/null +++ b/basicsuite/datacollector/main.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "socketserver.h" +#include "mockdatasource.h" +#include "unixsignalhandler.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + SocketServer* server = new SocketServer(&app); + AbstractDataSource* ds = new MockDataSource(&app); + UnixSignalHandler* handler = new UnixSignalHandler(&app); + + QObject::connect(ds, &AbstractDataSource::dataUpdate, + server, static_cast(&SocketServer::sendToClients)); + QObject::connect(server, &SocketServer::clientMessage, + ds, &AbstractDataSource::parseMessage); + QObject::connect(handler, &UnixSignalHandler::sigInt, + ds, &AbstractDataSource::shutdown); + QObject::connect(handler, &UnixSignalHandler::sigInt, + &app, &QCoreApplication::quit); + + UnixSignalHandler::setupSignalHandlers(); + + return app.exec(); +} diff --git a/basicsuite/datacollector/mockdatasource.cpp b/basicsuite/datacollector/mockdatasource.cpp new file mode 100644 index 0000000..1932ce3 --- /dev/null +++ b/basicsuite/datacollector/mockdatasource.cpp @@ -0,0 +1,236 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +#include "mockdatasource.h" + +static const char currentTripFilename[] = "currenttrip.bson"; +static const char tripDataFilename[] = "tripdata.bson"; +static const char statisticsFilename[] = "stats.bson"; + +MockDataSource::MockDataSource(QObject *parent) + : AbstractDataSource(parent) +{ + connect(&m_updateTimer, &QTimer::timeout, this, &MockDataSource::generateData); + + QDir dir(QCoreApplication::applicationDirPath()); + + // Load current status + m_dataFile = dir.absoluteFilePath(statisticsFilename); + QFile dataFile(m_dataFile); + if (dataFile.open(QIODevice::ReadOnly)) { + QJsonDocument doc = QJsonDocument::fromBinaryData(dataFile.readAll()); + m_data = doc.object(); + m_lifetime = m_data.value("lifetime").toDouble(); + } else { + // Set some default values in case data file did not exist + m_data.insert("speed", 0.0); + m_data.insert("topspeed", 0.0); + m_data.insert("odometer", 0.0); + m_data.insert("batterylevel", 100); + m_lifetime = 0.0; + } + + // Try to load current trip data as well as recorded trip(s) + m_currentFile = dir.absoluteFilePath(currentTripFilename); + m_current.load(m_currentFile); + m_tripsFile = dir.absoluteFilePath(tripDataFilename); + m_trips.load(m_tripsFile); + + m_updateTimer.start(100); + m_elapsedTimer.start(); + + // Generate the list of static trips to be shown on reset + m_resettrips << TripData(2100, 6800, 225, 6.944, 3.2, 1515008400.0) // 3.1.2018 11:40 + << TripData(2700, 10700, 300, 8.333, 2.5, 1515122400.0) // 4.1.2018 19:20 + << TripData(3900, 13700, 370, 6.944, 5, 1515197100.0) // 5.1.2018 16:05 + << TripData(1500, 3300, 150, 6.944, 4.7, 1515260100.0) // 6.1.2018 9:35 + << TripData(4500, 15800, 450, 5.556, 3.2, 1515359700.0); // 7.1.2018 13:15 +} + +void MockDataSource::shutdown() +{ + m_current.save(m_currentFile); + m_trips.save(m_tripsFile); +} + +void MockDataSource::setSpeed(double speed) +{ + updateOne("speed", speed); +} + +void MockDataSource::setTopSpeed(double topspeed) +{ + updateOne("topspeed", topspeed); +} + +void MockDataSource::setAverageSpeed(double averagespeed) +{ + updateOne("averagespeed", averagespeed); +} + +void MockDataSource::setLifetime(double lifetime) +{ + updateOne("lifetime", lifetime); +} + +void MockDataSource::setOdometer(double odometer) +{ + updateOne("odometer", odometer); +} + +void MockDataSource::setCalories(double calories) +{ + updateOne("calories", calories); +} + +void MockDataSource::setBatteryLevel(int batterylevel) +{ + updateOne("batterylevel", batterylevel); +} + +void MockDataSource::setAssistDistance(int assistdistance) +{ + updateOne("assistdistance", assistdistance); +} + +void MockDataSource::setAssistPower(int assistpower) +{ + updateOne("assistpower", assistpower); +} + +void MockDataSource::setCurrentTrip(const QJsonObject ¤t) +{ + emit dataUpdate(QJsonObject{{"method", "currenttrip"}, {"currenttrip", current}}); +} + +void MockDataSource::updateOne(const QString &key, const QJsonValue &value) +{ + m_data.insert(key, value); + emit dataUpdate(QJsonObject{{"method", "updateone"}, {"key", key}, {"value", value}}); +} + +void MockDataSource::generateData() +{ + static int spd = 1; + static int btr = 101; + + double x = static_cast(spd) / 500; + double speed = 4.5 * (1.5 + (0.75 * sin(2 * M_PI * x) + 0.5 * sin(6 * M_PI * x - M_PI_2))) - 1.5; + double dist = speed / 10; // 10 times per second + double elapsed = static_cast(m_elapsedTimer.elapsed()) / 1000.0; + + setAssistPower(speed * 9.5); + setSpeed(speed); + if (speed > m_data.value("topspeed").toDouble()) + setTopSpeed(speed); + setAverageSpeed(m_data.value("odometer").toDouble() / (m_lifetime + elapsed)); + setOdometer(m_data.value("odometer").toDouble() + dist); + setLifetime(m_lifetime + elapsed); + + // Update trip data + if (speed > m_current.maxSpeed()) + m_current.setMaxSpeed(speed); + m_current.addDistance(dist); + m_current.addDuration(0.1); + m_current.addCalories(0.01); + + setCurrentTrip(m_current); + + if (spd % 50 == 0) { + btr -= 1; + setBatteryLevel(btr); + setAssistDistance(500 * btr); + if (btr == 0) + btr = 100; + } + + // Save the current trip and statistics files every 10 seconds + if (spd % 100 == 0) { + m_current.save(m_currentFile); + QFile dataFile(m_dataFile); + if (dataFile.open(QIODevice::WriteOnly)) { + QJsonDocument doc(m_data); + dataFile.write(doc.toBinaryData()); + } + } + + spd++; +} + +void MockDataSource::parseMessage(const QJsonObject &message) +{ + QString method = message.value("method").toString(); + + if (method == "set") { + m_data.insert(message.value("key").toString(), message.value("value")); + } else if (method == "getall") { + QJsonArray values; + // Iterate over all data + QJsonObject::ConstIterator it = m_data.constBegin(); + while (it != m_data.constEnd()) { + values.append(QJsonObject{{"key", it.key()}, {"value", it.value()}}); + ++it; + } + + emit dataUpdate(QJsonObject{{"method", "updatemany"}, {"values", values}}); + setCurrentTrip(m_current); + } else if (method == "gettrips") { + emit dataUpdate(QJsonObject{{"method", "trips"}, {"trips", m_trips.toJsonArray()}}); + } else if (method == "endtrip") { + // Append current trip to list of trips and send to frontend + m_trips.append(m_current); + emit dataUpdate(QJsonObject{{"method", "trip"}, {"trip", m_current.toJsonObject()}}); + // Then clear it and its save file + m_current.clear(); + m_current.setStartTime(); + QFile::remove(m_currentFile); + // Send update of an empty trip to frontend + setCurrentTrip(m_current); + // Also save current trip list to file (in case of a crash) + m_trips.save(m_tripsFile); + } else if (method == "reset") { + // Demo only method, to reset trip history + m_trips = m_resettrips; + emit dataUpdate(QJsonObject{{"method", "reset"}}); + emit dataUpdate(QJsonObject{{"method", "trips"}, {"trips", m_trips.toJsonArray()}}); + } +} diff --git a/basicsuite/datacollector/mockdatasource.h b/basicsuite/datacollector/mockdatasource.h new file mode 100644 index 0000000..fe82e19 --- /dev/null +++ b/basicsuite/datacollector/mockdatasource.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MOCKDATASOURCE_H +#define MOCKDATASOURCE_H + +#include +#include +#include +#include "abstractdatasource.h" +#include "tripdata.h" + +class MockDataSource: public AbstractDataSource +{ + Q_OBJECT + +public: + explicit MockDataSource(QObject *parent = nullptr); + +public: + void setSpeed(double speed); + void setTopSpeed(double topSpeed); + void setAverageSpeed(double averageSpeed); + void setLifetime(double lifetime); + void setOdometer(double odometer); + void setTrip(double trip); + void setCalories(double calories); + void setBatteryLevel(int batteryLevel); + void setAssistDistance(int assistdistance); + void setAssistPower(int assistpower); + void setCurrentTrip(const QJsonObject ¤t); + +public slots: + void parseMessage(const QJsonObject &message); + void shutdown(); + +private: + void updateOne(const QString &key, const QJsonValue &value); + +private slots: + void generateData(); + +private: + QTimer m_updateTimer; + QElapsedTimer m_elapsedTimer; + double m_lifetime; + + QJsonObject m_data; + QString m_dataFile; + TripData m_current; + Trips m_trips; + Trips m_resettrips; + QString m_currentFile; + QString m_tripsFile; +}; + +#endif // MOCKDATASOURCE_H diff --git a/basicsuite/datacollector/socketclient.cpp b/basicsuite/datacollector/socketclient.cpp new file mode 100644 index 0000000..a17f3dc --- /dev/null +++ b/basicsuite/datacollector/socketclient.cpp @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#include "socketclient.h" + +SocketClient::SocketClient(QLocalSocket *socket, QObject *parent) + : QObject(parent) + , m_socket(socket) +{ + // Connect socket signals + connect(m_socket, &QLocalSocket::connected, this, &SocketClient::connected); + connect(m_socket, &QLocalSocket::disconnected, this, &SocketClient::disconnected); + connect(m_socket, &QLocalSocket::readyRead, this, &SocketClient::readyRead); +} + +qint64 SocketClient::write(const QByteArray &data) { + return m_socket->write(data); +} + +void SocketClient::readyRead() { + m_data += m_socket->readAll(); + + bool messagefound = true; + while (messagefound) { + messagefound = false; + // If we have at least some data + if (m_data.size() >= 4) { + // Extract message size + qint32 messagesize; + QDataStream stream(m_data.left(4)); + stream >> messagesize; + + // If we have enough data for at least one message + if (m_data.size() >= messagesize) { + // Extract actual message + QByteArray message = m_data.mid(4, messagesize - 4); + parseMessage(message); + // Drop necessary amount of bytes + m_data = m_data.mid(messagesize); + messagefound = true; // Try to parse another message + } + } + } +} + +void SocketClient::parseMessage(const QByteArray &message) { + // Parse message from raw format + QJsonDocument doc = QJsonDocument::fromBinaryData(message); + QJsonObject obj = doc.object(); + + emit clientMessage(obj); +} diff --git a/basicsuite/datacollector/socketclient.h b/basicsuite/datacollector/socketclient.h new file mode 100644 index 0000000..c489fd5 --- /dev/null +++ b/basicsuite/datacollector/socketclient.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SOCKETCLIENT_H +#define SOCKETCLIENT_H + +#include +#include + +class SocketClient : public QObject +{ + Q_OBJECT + +public: + explicit SocketClient(QLocalSocket *socket, QObject *parent = nullptr); + +public: + QLocalSocket *socket(void) const { return m_socket; } + qint64 write(const QByteArray& data); + +private: + void parseMessage(const QByteArray& message); + +signals: + void connected(); + void disconnected(); + void clientMessage(const QJsonObject &message); + +public slots: + +private slots: + void readyRead(); + +private: + QLocalSocket *m_socket; + QByteArray m_data; +}; + +#endif // SOCKETCLIENT_H diff --git a/basicsuite/datacollector/socketserver.cpp b/basicsuite/datacollector/socketserver.cpp new file mode 100644 index 0000000..9391316 --- /dev/null +++ b/basicsuite/datacollector/socketserver.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#include "socketserver.h" +#include "socketclient.h" + +SocketServer::SocketServer(QObject *parent) + : QObject(parent) + , m_server(new QLocalServer(this)) +{ + connect(m_server, &QLocalServer::newConnection, this, &SocketServer::processConnected); + QLocalServer::removeServer("datasocket"); + m_server->listen("datasocket"); +} + +void SocketServer::processConnected(void) { + while (m_server->hasPendingConnections()) { + QLocalSocket* socket = m_server->nextPendingConnection(); + qDebug() << "Client connected" << socket; + if (socket) { + SocketClient *client = new SocketClient(socket, this); + connect(client, &SocketClient::disconnected, this, &SocketServer::processDisconnected); + connect(client, &SocketClient::clientMessage, this, &SocketServer::clientMessage); + m_clients.append(client); + } + } +} + +void SocketServer::processDisconnected(void) { + SocketClient *client = qobject_cast(sender()); + qDebug() << "Client disconnected" << client->socket(); + m_clients.removeOne(client); + client->deleteLater(); +} + +void SocketServer::sendToClients(const QByteArray &message) { + // Prepend the message length + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << static_cast(message.size() + 4); + data.append(message); + + foreach (SocketClient *client, m_clients) { + client->write(data); + } +} + +/** + * @brief sendToClients + * @param message + * + * Converts a JSON object to its binary representation and sends it to all clients + */ +void SocketServer::sendToClients(const QJsonObject &message) { + QJsonDocument doc(message); + sendToClients(doc.toBinaryData()); +} diff --git a/basicsuite/datacollector/socketserver.h b/basicsuite/datacollector/socketserver.h new file mode 100644 index 0000000..e48232c --- /dev/null +++ b/basicsuite/datacollector/socketserver.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SOCKETSERVER_H +#define SOCKETSERVER_H + +#include +#include + +class QLocalServer; +class SocketClient; + +class SocketServer: public QObject +{ + Q_OBJECT + +public: + explicit SocketServer(QObject *parent = nullptr); + +signals: + void clientMessage(const QJsonObject &message); + +public slots: + void sendToClients(const QByteArray &message); + void sendToClients(const QJsonObject &message); + +private slots: + void processConnected(); + void processDisconnected(); + +private: + QLocalServer *m_server; + QList m_clients; +}; + +#endif // SOCKETSERVER_H diff --git a/basicsuite/datacollector/tripdata.cpp b/basicsuite/datacollector/tripdata.cpp new file mode 100644 index 0000000..7ce5590 --- /dev/null +++ b/basicsuite/datacollector/tripdata.cpp @@ -0,0 +1,253 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include + +#include "tripdata.h" + +TripData::TripData() + : m_duration(0.0) + , m_distance(0.0) + , m_calories(0.0) + , m_maxspeed(0.0) + , m_ascent(0.0) + , m_starttime(static_cast(QDateTime::currentMSecsSinceEpoch()) / 1000.0) +{ +} + +TripData::TripData(double duration, double distance, double calories, + double maxspeed, double ascent, double starttime) + : m_duration(duration) + , m_distance(distance) + , m_calories(calories) + , m_maxspeed(maxspeed) + , m_ascent(ascent) + , m_starttime(starttime) +{ +} + +TripData::TripData(const QJsonObject &data) + : m_duration(data.value("duration").toDouble()) + , m_distance(data.value("distance").toDouble()) + , m_calories(data.value("calories").toDouble()) + , m_maxspeed(data.value("maxspeed").toDouble()) + , m_ascent(data.value("ascent").toDouble()) + , m_starttime(data.value("starttime").toDouble()) +{ +} + +bool TripData::load(const QString &filename) +{ + QFile jsonfile(filename); + if (jsonfile.open(QIODevice::ReadOnly)) { + QJsonDocument doc = QJsonDocument::fromBinaryData(jsonfile.readAll()); + QJsonObject data = doc.object(); + + m_duration = data.value("duration").toDouble(); + m_distance = data.value("distance").toDouble(); + m_calories = data.value("calories").toDouble(); + m_maxspeed = data.value("maxspeed").toDouble(); + m_ascent = data.value("ascent").toDouble(); + m_starttime = data.value("starttime").toDouble(); + + return true; + } + return false; +} + +void TripData::save(const QString &filename) const +{ + QFile jsonfile(filename); + if (jsonfile.open(QIODevice::WriteOnly)) { + QJsonDocument doc(toJsonObject()); + jsonfile.write(doc.toBinaryData()); + } +} + +void TripData::setDuration(double duration) +{ + if (qFuzzyCompare(m_duration, duration)) + return; + + m_duration = duration; +} + +void TripData::setDistance(double distance) +{ + if (qFuzzyCompare(m_distance, distance)) + return; + + m_distance = distance; +} + +void TripData::setCalories(double calories) +{ + if (qFuzzyCompare(m_calories, calories)) + return; + + m_calories = calories; +} + +void TripData::setMaxSpeed(double maxspeed) +{ + if (qFuzzyCompare(m_maxspeed, maxspeed)) + return; + + m_maxspeed = maxspeed; +} + +void TripData::setAscent(double ascent) +{ + if (qFuzzyCompare(m_ascent, ascent)) + return; + + m_ascent = ascent; +} + +void TripData::setStartTime(double starttime) +{ + // Special value means reset to current timestamp + if (starttime == 0.0) + starttime = static_cast(QDateTime::currentMSecsSinceEpoch()) / 1000.0; + + if (qFuzzyCompare(m_starttime, starttime)) + return; + + m_starttime = starttime; +} + +void TripData::addDuration(double duration) +{ + m_duration += duration; +} + +void TripData::addDistance(double distance) +{ + m_distance += distance; +} + +void TripData::addCalories(double calories) +{ + m_calories += calories; +} + +void TripData::clear() +{ + m_duration = 0.0; + m_distance = 0.0; + m_calories = 0.0; + m_maxspeed = 0.0; + m_ascent = 0.0; + m_starttime = 0.0; +} + +TripData::operator QJsonObject() const +{ + return toJsonObject(); +} + +const QJsonObject TripData::toJsonObject(void) const +{ + QJsonObject data; + + data.insert("duration", m_duration); + data.insert("distance", m_distance); + data.insert("calories", m_calories); + data.insert("maxspeed", m_maxspeed); + data.insert("avgspeed", m_distance / m_duration); + data.insert("ascent", m_ascent); + data.insert("starttime", m_starttime); + + return data; +} + +TripData TripData::fromJsonObject(const QJsonObject &data) +{ + return TripData(data); +} + +TripData TripData::fromFile(const QString &filename) +{ + TripData trip; + trip.load(filename); + return trip; +} + +bool Trips::load(const QString &filename) +{ + QFile jsonfile(filename); + if (jsonfile.open(QIODevice::ReadOnly)) { + QJsonDocument doc = QJsonDocument::fromBinaryData(jsonfile.readAll()); + clear(); + foreach (const QJsonValue &trip, doc.array()) + append(trip.toObject()); + return true; + } + return false; +} + +void Trips::save(const QString &filename) const +{ + QFile jsonfile(filename); + if (jsonfile.open(QIODevice::WriteOnly)) { + QJsonDocument doc(*this); + jsonfile.write(doc.toBinaryData()); + } +} + +Trips::operator QJsonArray() const +{ + return toJsonArray(); +} + +const QJsonArray Trips::toJsonArray() const +{ + QJsonArray array; + foreach (const TripData &data, *this) + array.append(data.toJsonObject()); + + return array; +} + +Trips Trips::fromFile(const QString &filename) +{ + Trips trips; + trips.load(filename); + return trips; +} diff --git a/basicsuite/datacollector/tripdata.h b/basicsuite/datacollector/tripdata.h new file mode 100644 index 0000000..36fd9c8 --- /dev/null +++ b/basicsuite/datacollector/tripdata.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TRIPDATA_H +#define TRIPDATA_H + +#include +#include +#include + +class TripData +{ +public: + TripData(); + TripData(double duration, double distance, double calories, + double maxspeed, double ascent, double starttime); + TripData(const QJsonObject &data); + +public: + double duration() const { return m_duration; } + double distance() const { return m_distance; } + double calories() const { return m_calories; } + double maxSpeed() const { return m_maxspeed; } + double avgSpeed() const { return m_distance / m_duration; } + double ascent() const { return m_ascent; } + double startTime() const { return m_starttime; } + + void setDuration(double duration); + void setDistance(double distance); + void setCalories(double calories); + void setMaxSpeed(double maxspeed); + void setAscent(double ascent); + void setStartTime(double starttime=0); + void addDuration(double duration); + void addDistance(double distance); + void addCalories(double calories); + void clear(); + + // Load from file + bool load(const QString &filename); + + // Save to file + void save(const QString &filename) const; + + // Convert to Json Object + operator QJsonObject() const; + const QJsonObject toJsonObject(void) const; + + // Create from Json + static TripData fromJsonObject(const QJsonObject &data); + + // Load from binary Json data + static TripData fromFile(const QString &filename); + +private: + QElapsedTimer m_timer; + double m_duration; // Seconds + double m_distance; // Meters + double m_calories; // calories, not kcal + double m_maxspeed; // m/s + double m_ascent; // meters + double m_starttime; // Timestamp of the start of the trip +}; + +class Trips: public QList +{ +public: + // Load from file + bool load(const QString &filename); + + // Save to file + void save(const QString &filename) const; + + // Convert to Json Array + operator QJsonArray() const; + const QJsonArray toJsonArray(void) const; + + // Load from binary Json data + static Trips fromFile(const QString &filename); +}; + +#endif // TRIPDATA_H diff --git a/basicsuite/datacollector/unixsignalhandler.cpp b/basicsuite/datacollector/unixsignalhandler.cpp new file mode 100644 index 0000000..61fd87b --- /dev/null +++ b/basicsuite/datacollector/unixsignalhandler.cpp @@ -0,0 +1,149 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include "unixsignalhandler.h" + +int UnixSignalHandler::sigintFd[2] = {0}; +int UnixSignalHandler::sighupFd[2] = {0}; +int UnixSignalHandler::sigtermFd[2] = {0}; + +UnixSignalHandler::UnixSignalHandler(QObject *parent) + : QObject(parent) +{ + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigintFd)) + qFatal("Couldn't create INT socketpair"); + + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sighupFd)) + qFatal("Couldn't create HUP socketpair"); + + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd)) + qFatal("Couldn't create TERM socketpair"); + + m_sigintNotifier = new QSocketNotifier(sigintFd[1], QSocketNotifier::Read, this); + connect(m_sigintNotifier, &QSocketNotifier::activated, + this, &UnixSignalHandler::handleSigInt); + m_sighupNotifier = new QSocketNotifier(sighupFd[1], QSocketNotifier::Read, this); + connect(m_sighupNotifier, &QSocketNotifier::activated, + this, &UnixSignalHandler::handleSigHup); + m_sigtermNotifier = new QSocketNotifier(sigtermFd[1], QSocketNotifier::Read, this); + connect(m_sigtermNotifier, &QSocketNotifier::activated, + this, &UnixSignalHandler::handleSigTerm); +} + +int UnixSignalHandler::setupSignalHandlers() +{ + struct sigaction sig_int, sig_hup, sig_term; + + sig_int.sa_handler = UnixSignalHandler::sigIntHandler; + sigemptyset(&sig_int.sa_mask); + sig_int.sa_flags = 0; + sig_int.sa_flags |= SA_RESTART; + + if (sigaction(SIGINT, &sig_int, 0)) + return 1; + + sig_hup.sa_handler = UnixSignalHandler::sigHupHandler; + sigemptyset(&sig_hup.sa_mask); + sig_hup.sa_flags = 0; + sig_hup.sa_flags |= SA_RESTART; + + if (sigaction(SIGHUP, &sig_hup, 0)) + return 2; + + sig_term.sa_handler = UnixSignalHandler::sigTermHandler; + sigemptyset(&sig_term.sa_mask); + sig_term.sa_flags |= SA_RESTART; + + if (sigaction(SIGTERM, &sig_term, 0)) + return 3; + + return 0; +} + +void UnixSignalHandler::sigIntHandler(int) +{ + char a = 1; + ::write(sigintFd[0], &a, sizeof(a)); +} + +void UnixSignalHandler::sigHupHandler(int) +{ + char a = 1; + ::write(sighupFd[0], &a, sizeof(a)); +} + +void UnixSignalHandler::sigTermHandler(int) +{ + char a = 1; + ::write(sigtermFd[0], &a, sizeof(a)); +} + +void UnixSignalHandler::handleSigInt() +{ + m_sigintNotifier->setEnabled(false); + char tmp; + ::read(sigintFd[1], &tmp, sizeof(tmp)); + + emit sigInt(); + + m_sigintNotifier->setEnabled(true); +} + +void UnixSignalHandler::handleSigHup() +{ + m_sighupNotifier->setEnabled(false); + char tmp; + ::read(sighupFd[1], &tmp, sizeof(tmp)); + + emit sigHup(); + + m_sighupNotifier->setEnabled(true); +} + +void UnixSignalHandler::handleSigTerm() +{ + m_sigtermNotifier->setEnabled(false); + char tmp; + ::read(sigtermFd[1], &tmp, sizeof(tmp)); + + emit sigTerm(); + + m_sigtermNotifier->setEnabled(true); +} diff --git a/basicsuite/datacollector/unixsignalhandler.h b/basicsuite/datacollector/unixsignalhandler.h new file mode 100644 index 0000000..63c5d53 --- /dev/null +++ b/basicsuite/datacollector/unixsignalhandler.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef UNIXSIGNALHANDLER_H +#define UNIXSIGNALHANDLER_H + +#include + +class QSocketNotifier; + +class UnixSignalHandler : public QObject +{ + Q_OBJECT + +public: + explicit UnixSignalHandler(QObject *parent = nullptr); + +public: + static int setupSignalHandlers(); + static void sigIntHandler(int); + static void sigHupHandler(int); + static void sigTermHandler(int); + +signals: + void sigInt(); + void sigHup(); + void sigTerm(); + +private slots: + void handleSigInt(); + void handleSigHup(); + void handleSigTerm(); + +private: + static int sigintFd[2]; + static int sighupFd[2]; + static int sigtermFd[2]; + + QSocketNotifier *m_sigintNotifier; + QSocketNotifier *m_sighupNotifier; + QSocketNotifier *m_sigtermNotifier; +}; + +#endif // UNIXSIGNALHANDLER_H diff --git a/basicsuite/demos.xml b/basicsuite/demos.xml deleted file mode 100644 index a465846..0000000 --- a/basicsuite/demos.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - -Provides an introduction to what Qt for Device Creation is all about. - - - - - -This example demonstrates the use of the camera features of Qt Multimedia with Qt Quick. - -Demo can be used to take photos which are saved in the /data/images/ directory. Camera parameters such as flash mode, scene mode or white balance can be changed. The availability of parameters depends on what the camera driver provides. - - - - - -The Planets example showcases Qt Canvas 3D. This demo combines WebGL code and three.js with QML and Qt Quick Controls. - - - - - -This demo presents different types of charts that are available from Qt Charts library. - -Qt Charts is part of the Qt Enterprise addons package which provides a set of easy to use chart components. It uses the Qt Graphics View Framework, therefore charts can be easily integrated to modern user interfaces. Qt Charts can be used as QWidgets, QGraphicsWidget, or QML types. - - - - - -The dashboard demo uses Qt Quick Extras to create a digital dashboard for a car. - - - - - -The Flat Style Gallery example showcases the Qt Quick Controls. This demo combines both the standard Qt Quick Controls as well as the Qt Quick Extras both of which are using the new Flat style. The Flat style for Qt Quick Controls has a modern look and feel and is perfect for the touch driven interfaces commonly developed by device creators. - - - - - -Shows how to make a 3D surface plot, displaying three layers from three different height map images using Surface3D with Qt Quick. - - - - - -This example shows the Qt Quick ShaderEffect type and the Qt Graphical Effects module. Qt Quick provides the ability to use inline GLSL in your Qt Quick applications to create stunning visual effects. - -However, as UIs typically reuse many of the same effects, the Qt Graphical Effects module provides a set of predefined, commonly used effects. This includes blur, drop-shadows, glow, blending, opacity masks, and more. - - - - - -The Media Player example demonstrates the use of media playback features provided by Qt Multimedia with Qt Quick. - -It can play content either from a file or a network source, both videos and music. - - - - - -The Qt 5 Cinematic Experience is a demo by "QUIt Coding". - -The demo shows off a number features of Qt Quick. A nicely styled list control of movie covers with lighting effects, particles and transitions. The information roll-down curvy curtain is implemented using inline GLSL in the QML file. The source code for this demo and more awesome looking Qt Quick examples are available from quitcoding.com. - - - - - -This example demonstrates the use of Qt WebEngine with Qt Quick. - -Demo can be used to browse the internet (working network connection required) or run the offline web page demos. - - - - - -This example illustrates how to handle input on touch devices. - -Qt for Device Creation comes with Qt Virtual Keyboard - a framework that consists of a C++ backend with support for custom input methods, as well as a reference keyboard front end implemented in QML, supporting multiple languages. - - - - diff --git a/basicsuite/ebike-ui/.gitignore b/basicsuite/ebike-ui/.gitignore new file mode 100644 index 0000000..fab7372 --- /dev/null +++ b/basicsuite/ebike-ui/.gitignore @@ -0,0 +1,73 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/basicsuite/ebike-ui/BikeInfoTab.qml b/basicsuite/ebike-ui/BikeInfoTab.qml new file mode 100644 index 0000000..a9ff216 --- /dev/null +++ b/basicsuite/ebike-ui/BikeInfoTab.qml @@ -0,0 +1,485 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import DataStore 1.0 + +import "./BikeStyle" + +Item { + property string selectedComponent: "battery" + property string bikeImageSource: "images/bike-battery.png" + property string componentName: "Battery" + property string componentStatusImageSource: "images/ok.png" + property color statusLineColor: selectedComponent === "rearwheel" ? Colors.bikeInfoLineWarning : Colors.bikeInfoLineOk + property int statusLineLength: 280 + property string primaryDetails: "Health" + property string primaryDetailsValue: "85%" + property bool primaryDetailsOk: true + property var activeComponent: batteryCircle + property real circleRadius: Math.min(parent.height * 0.125, parent.width * 0.125) + + function updateComponent() { + if (selectedComponent === "") + bikeImageSource = "images/bike.png"; + else + bikeImageSource = "images/bike-" + selectedComponent + ".png"; + + if (selectedComponent === "battery") { + componentName = "Battery"; + primaryDetails = "Health"; + primaryDetailsValue = "85%"; + primaryDetailsOk = true; + statusLineLength = 280; + } else if (selectedComponent === "brakes") { + componentName = "Brakes"; + primaryDetails = "Health"; + primaryDetailsValue = "85%"; + primaryDetailsOk = true; + statusLineLength = 448; + } else if (selectedComponent === "chain") { + componentName = "Chain"; + primaryDetails = "Health"; + primaryDetailsValue = "85%"; + primaryDetailsOk = true; + statusLineLength = 0; + } else if (selectedComponent === "gears") { + componentName = "Gears"; + primaryDetails = "Health"; + primaryDetailsValue = "85%"; + primaryDetailsOk = true; + statusLineLength = 245; + } else if (selectedComponent === "light") { + componentName = "Light"; + primaryDetails = "Health"; + primaryDetailsValue = "85%"; + primaryDetailsOk = true; + statusLineLength = 300; + } else if (selectedComponent === "frontwheel") { + componentName = "Front wheel"; + primaryDetails = "Tire pressure"; + primaryDetailsValue = "6.8 bar / 100 psi"; + primaryDetailsOk = true; + statusLineLength = 340; + } else if (selectedComponent === "rearwheel") { + componentName = "Rear wheel"; + primaryDetails = "Tire pressure"; + primaryDetailsValue = "4.0 bar / 58 psi"; + primaryDetailsOk = false; + statusLineLength = 210; + } + } + + Text { + id: bikeInfoText + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: stackLayout.height * 0.225 + width: parent.width + text: qsTr("BIKE INFO") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: height * 0.375 + } + color: Colors.tabTitleColor + verticalAlignment: Text.AlignVCenter + } + + ColumnSpacer { + id: spacer + anchors.top: bikeInfoText.bottom + color: Colors.tabItemBorder + } + + + Image { + id: bikeImage + anchors { + top: spacer.bottom + right: parent.right + bottom: parent.bottom + } + fillMode: Image.PreserveAspectFit + source: bikeImageSource + } + + Rectangle { + id: brakesCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.2 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.63 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "brakes" ? Colors.bikeInfoLineOk : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = brakesCircle; + selectedComponent = "brakes" + updateComponent() + } + } + } + + Rectangle { + id: lightCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.325 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.65 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "light" ? Colors.bikeInfoLineOk : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = lightCircle; + selectedComponent = "light" + updateComponent() + } + } + } + + Rectangle { + id: batteryCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.475 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.525 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "battery" ? Colors.bikeInfoLineOk : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = batteryCircle; + selectedComponent = "battery" + updateComponent() + } + } + } + + Rectangle { + id: gearsCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.625 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.2725 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "gears" ? Colors.bikeInfoLineOk : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = gearsCircle; + selectedComponent = "gears" + updateComponent() + } + } + } + + Rectangle { + id: rearWheelCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.625 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.15 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "rearwheel" ? Colors.bikeInfoLineWarning : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = rearWheelCircle; + selectedComponent = "rearwheel" + updateComponent() + } + } + + Image { + anchors.centerIn: parent + height: circleRadius * 0.65 + width: height + source: "images/warning.png" + } + } + + Rectangle { + id: frontWheelCircle + width: circleRadius + height: circleRadius + radius: circleRadius * 2 + anchors { + verticalCenter: bikeImage.top + verticalCenterOffset: bikeImage.height * 0.625 + horizontalCenter: bikeImage.left + horizontalCenterOffset: bikeImage.width * 0.82 + } + + color: "transparent" + border.width: UILayout.bikeInfoLineWidth + border.color: selectedComponent === "frontwheel" ? Colors.bikeInfoLineOk : Colors.bikeInfoDeselected + + MouseArea { + anchors.fill: parent + onClicked: { + activeComponent = frontWheelCircle; + selectedComponent = "frontwheel" + updateComponent() + } + } + } + + Canvas { + id: slantedLine + anchors { + left: statusLineHorizontal.right + top: statusLineHorizontal.top + right: activeComponent.horizontalCenter + bottom: activeComponent.verticalCenter + } + + onPaint: { + var ctx = getContext("2d"); + ctx.reset(); + + // Calculate line length and subtract circle radius + var lineLength = Math.sqrt(slantedLine.width * slantedLine.width + + slantedLine.height * slantedLine.height); + lineLength -= UILayout.bikeInfoCircleRadius; + + // Calculate angle + var angle = Math.atan2(slantedLine.height, slantedLine.width); + + // Calculate new endpoints + var x = Math.cos(angle) * lineLength; + var y = Math.sin(angle) * lineLength; + + ctx.lineCap = "round"; + ctx.strokeStyle = statusLineColor; + ctx.lineWidth = UILayout.bikeInfoLineWidth; + ctx.beginPath(); + ctx.moveTo(0, 1); + ctx.lineTo(x, y); + ctx.stroke(); + } + } + + Image { + id: componentStatusImage + height: circleRadius * 0.9 + width: height + anchors { + verticalCenter: componentNameText.verticalCenter + left: parent.left + } + source: componentStatusImageSource + visible: selectedComponent != "" + } + + Text { + id: componentNameText + anchors { + top: spacer.bottom + topMargin: parent.height * 0.0175 + left: componentStatusImage.right + leftMargin: parent.width * 0.01 + } + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.075 + } + color: Colors.bikeInfoComponentHeader + text: componentName + visible: selectedComponent != "" + } + + // The line goes here somehow + Rectangle { + id: statusLineHorizontal + anchors { + top: componentNameText.baseline + topMargin: parent.height * 0.03 + left: parent.left + } + height: UILayout.bikeInfoLineWidth + width: statusLineLength + color: statusLineColor + visible: selectedComponent != "" + } + + Text { + id: primaryDetailsText + anchors { + top: statusLineHorizontal.bottom + topMargin: parent.height * 0.035 + left: parent.left + } + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.065 + } + color: Colors.bikeInfoComponentText + text: primaryDetails + visible: selectedComponent != "" + } + + Text { + id: primaryDetailsValueText + anchors { + top: primaryDetailsText.bottom + left: parent.left + } + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.065 + } + color: primaryDetailsOk ? Colors.bikeInfoComponentOk : Colors.bikeInfoComponentWarning + text: primaryDetailsValue + visible: selectedComponent != "" + } + + Text { + id: lastMaintenanceText + anchors { + top: primaryDetailsValueText.bottom + topMargin: parent.height * 0.03 + left: parent.left + } + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.065 + } + color: Colors.bikeInfoComponentText + text: qsTr("Last maintenance") + visible: selectedComponent != "" + } + + Text { + id: lastMaintenanceValueText + anchors { + top: lastMaintenanceText.bottom + left: parent.left + } + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.065 + } + color: Colors.bikeInfoComponentOk + text: "10/3/2017" + visible: selectedComponent != "" + } + + Text { + id: nextMaintenanceText + anchors { + top: lastMaintenanceValueText.bottom + topMargin: parent.height * 0.03 + left: parent.left + } + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.065 + } + color: Colors.bikeInfoComponentText + text: qsTr("Scheduled maintenance") + visible: selectedComponent != "" + } + + Text { + id: nextMaintenanceValueText + anchors { + top: nextMaintenanceText.bottom + left: parent.left + } + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.065 + } + color: Colors.bikeInfoComponentOk + text: "10/3/2018" + visible: selectedComponent != "" + } +} diff --git a/basicsuite/ebike-ui/BikeStyle/Colors.qml b/basicsuite/ebike-ui/BikeStyle/Colors.qml new file mode 100644 index 0000000..0086c7e --- /dev/null +++ b/basicsuite/ebike-ui/BikeStyle/Colors.qml @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +pragma Singleton +import QtQuick 2.9 + +QtObject { + readonly property color clockText: "#d7dbe4" + readonly property color clockBackground: "#020611" + readonly property color mainBackground: "#1b1f2a" + readonly property color separator: "#040809" + readonly property color dottedRing: "#52576b" + readonly property color distanceText: "#ffffff" + readonly property color distanceUnit: "#acafbc" + readonly property color speedViewBackgroundCornered: "#020611" + readonly property color speedText: "#ffffff" + readonly property color speedUnit: "#acafbc" + readonly property color averageSpeedText: "#ffffff" + readonly property color averageSpeedUnit: "#acafbc" + readonly property color assistDistanceText: "#ffffff" + readonly property color assistDistanceUnit: "#acafbc" + readonly property color modeSelected: "#a0e63e" + readonly property color modeUnselected: "#acafbc" + readonly property color speedGradientStart: "#fcff2a" + readonly property color speedGradientEnd: "#41cd52" + readonly property color batteryGradientStart: "#34daea" + readonly property color batteryGradientEnd: "#3aeb95" + readonly property color assistPowerGradientStart: "#ffd200" + readonly property color assistPowerGradientEnd: "#f7971e" + readonly property color assistPowerEmpty: "#52576b" + readonly property color musicPlayerBackground: "#020611" + readonly property color musicPlayerSongText: "#d7dbe4" + readonly property color musicPlayerTimeText: "#989ba8" + readonly property color naviPageSuggestionBorder: "#a0e63e" + readonly property color naviPageSuggestionText: "#1b1f2a" + readonly property color naviPageSuggestionsDivider: "#989ba8" + readonly property color naviPageIconBackground: "#1b1f2a" + readonly property color naviPageIconPressedBackground: "#a0e63e" + readonly property color naviPageTripBackground: "#1b1f2a" + readonly property color naviPageTripDivider: "#acafbc" + readonly property color naviPageGuideBackground: "#1b1f2a" + readonly property color naviPageGuideTextColor: "#ffffff" + readonly property color naviPageGuideUnitColor: "#acafbc" + readonly property color naviPageGuideAddressColor: "#ffffff" + readonly property color curtainBackground: "#020611" + readonly property color tabBackground: "#020611" + readonly property color activeTabBorder: "#a0e63e" + readonly property color activeTabIcon: "#ffffff" + readonly property color tabIcon: "#989ba8" + readonly property color tabTitleColor: "#ffffff" + readonly property color tabItemColor: "#989ba8" + readonly property color tabItemBorder: "#1b1f2a" + readonly property color languageTextColor: "#acafbc" + readonly property color checkboxBorderColorChecked: "#a0e63e" + readonly property color checkboxBorderColor: "#acafbc" + readonly property color checkboxCheckedText: "#ffffff" + readonly property color checkboxUncheckedBackground: "#020611" + readonly property color sliderBackground: "#52576b" + readonly property color sliderInnerBackground: "#000000" + readonly property color sliderMinimumValue: "#fcff2a" + readonly property color sliderMaximumValue: "#41cd52" + readonly property color activeButtonBackground: "#a0e63e" + readonly property color inactiveButtonBackground: "#020611" + readonly property color activeButtonText: "#020611" + readonly property color inactiveButtonText: "#acafbc" + readonly property color inactiveButtonBorder: "#acafbc" + readonly property color switchOn: "#a0e63e" + readonly property color switchOff: "#ffffff" + readonly property color switchBackgroundOn: "#4da0e63e" + readonly property color switchBackgroundOff: "#52576b" + readonly property color bikeInfoDeselected: "#ffffff" + readonly property color bikeInfoLineOk: "#a0e63e" + readonly property color bikeInfoLineWarning: "#d4145a" + readonly property color bikeInfoComponentHeader: "#ffffff" + readonly property color bikeInfoComponentText: "#acafbc" + readonly property color bikeInfoComponentOk: "#ffffff" + readonly property color bikeInfoComponentWarning: "#d4145a" + readonly property color chartSpeed: "#a0e63e" + readonly property color chartAssistpower: "#34daea" + readonly property color chartLegend: "#ffffff" + readonly property color chartLabel: "#989ba8" + readonly property color chartTimeLabel: "#acafbc" + readonly property color chartGridLine: "#111520" + readonly property color statsButtonPressed: "#a0e63e" + readonly property color statsButtonInactive: "#52576b" + readonly property color statsButtonActive: "#848794" + readonly property color statsButtonInactiveText: "#52576b" + readonly property color statsButtonActiveText: "#ffffff" + readonly property color statsDescriptionText: "#989ba8" + readonly property color statsValueText: "#ffffff" + readonly property color statsSeparator: "#111520" +} diff --git a/basicsuite/ebike-ui/BikeStyle/UILayout.qml b/basicsuite/ebike-ui/BikeStyle/UILayout.qml new file mode 100644 index 0000000..046de2e --- /dev/null +++ b/basicsuite/ebike-ui/BikeStyle/UILayout.qml @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +pragma Singleton +import QtQuick 2.9 + +QtObject { + readonly property int clockBaselineMargin: 25 + + readonly property int speedViewDots: 96 + readonly property int speedViewDotsMinified: 48 + readonly property int speedViewDotsEnlarged: 128 + + readonly property double speedViewSpeedStart: Math.PI * 0.5 + Math.PI / 30 + readonly property double speedViewSpeedEnd: Math.PI * 1.5 - Math.PI / 30 + readonly property double speedViewBatteryStart: Math.PI * 0.5 - Math.PI / 30 + readonly property double speedViewBatteryEnd: -Math.PI * 0.5 + Math.PI / 30 + + readonly property int speedBaselineOffset: 137 + + readonly property int speedInfoTextsOffsetEnlarged: -34 + + readonly property int assistPowerCircleOffset: 8 + readonly property int assistPowerCircleVerticalOffset: 5 + + readonly property int musicPlayerWidth: 260 + readonly property int musicPlayerHeight: 75 + readonly property int musicPlayerCorner: 20 + readonly property int musicPlayerIconWidth: 40 + readonly property int musicPlayerIconHeight: 40 + readonly property int musicPlayerIconBottom: 5 + readonly property int musicPlayerIconSpacing: 50 + readonly property int musicPlayerTextBottom: 5 + readonly property int musicPlayerTextSize: 16 + + readonly property int naviPageLocationWidth: 300 + readonly property int naviPageLocationHeight: 40 + readonly property int naviPageLocationRadius: 20 + readonly property int naviPageLocationTopMargin: 60 + readonly property int naviPageLocationLeftPadding: 20 + readonly property int naviPageIconBackgroundWidth: 50 + readonly property int naviPageIconBackgroundHeight: 50 + readonly property int naviPageIconBackgroundRadius: 25 + readonly property int naviPageIconWidth: 40 + readonly property int naviPageIconHeight: 40 + readonly property int naviPageIconTopMargin: 15 + readonly property int naviPageIconRightMargin: 15 + readonly property int naviPageIconSpacing: 15 + readonly property int naviPageSuggestionsOffset: 5 + readonly property int naviPageSuggestionHeight: 40 + readonly property int naviPageSuggestionTextSize: 16 + + readonly property int naviPageSearchIconWidth: 40 + readonly property int naviPageSearchIconHeight: 40 + readonly property int naviPageSearchIconMargin: 5 + readonly property int naviPageSearchTextSize: 16 + + readonly property int naviPageTripWidth: 220 + readonly property int naviPageTripHeight: 40 + readonly property int naviPageTripRadius: 20 + readonly property int naviPageTripDividerWidth: 2 + readonly property int naviPageTripDividerHeight: 20 + readonly property int naviPageTripBottomMargin: 15 + readonly property int naviPageTripSearchMargin: 15 + readonly property int naviPageTripTotalTextSize: 18 + readonly property int naviPageTripTotalUnitSize: 18 + + readonly property int configurationItemSeparator: 1 + + readonly property int checkboxWidth: 20 + readonly property int checkboxHeight: 20 + readonly property int checkboxRadius: 5 + readonly property int checkboxTextOffset: 10 + readonly property int checkboxSliderOffset: 20 + readonly property int sliderHandleRadius: 10 + readonly property int sliderHandleRadiusInner: 6 + readonly property int sliderWidth: 256 + readonly property int sliderHeight: 4 + readonly property int switchWidth: 50 + readonly property int switchHeight: 20 + readonly property int switchIndicatorRadius: 15 + readonly property int unitButtonSpacing: 10 + readonly property int unitFontSize: 16 + readonly property int bikeInfoLineWidth: 2 + readonly property int bikeInfoCircleRadius: 17 + + readonly property int statsTripButtonWidth: 40 + readonly property int statsTripButtonHeight: 40 + readonly property int statsTripButtonMarginSide: 30 + readonly property int statsEndtripWidth: 150 + readonly property int statsEndtripHeight: 40 + readonly property int statsEndtripMargin: 60 + readonly property int statsEndtripTextSize: 16 + + readonly property int statsOdometerMarginRight: 30 + readonly property int statsOdometerBaselineOffset: 40 + readonly property int statsTopMargin: 28 + + readonly property int horizontalViewSeparatorHeight: 1 + readonly property int verticalViewSeparatorWidth: 1 +} diff --git a/basicsuite/ebike-ui/BikeStyle/qmldir b/basicsuite/ebike-ui/BikeStyle/qmldir new file mode 100644 index 0000000..e8e9d2f --- /dev/null +++ b/basicsuite/ebike-ui/BikeStyle/qmldir @@ -0,0 +1,2 @@ +singleton Colors 1.0 Colors.qml +singleton UILayout 1.0 UILayout.qml diff --git a/basicsuite/ebike-ui/ClockView.qml b/basicsuite/ebike-ui/ClockView.qml new file mode 100644 index 0000000..55ada41 --- /dev/null +++ b/basicsuite/ebike-ui/ClockView.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import "./BikeStyle" +// Permanent placeholder for time display +Item { + width: backgroundImage.width + height: backgroundImage.height + z: 1 + + // Timer that will show the current time at the top of the screen + Timer { + interval: 500; running: true; repeat: true + onTriggered: timeLabel.text = new Date().toLocaleTimeString(Qt.locale("en_US"), Locale.ShortFormat) + } + + Image { + id: backgroundImage + source: "images/top_curtain_drag.png" + anchors.centerIn: parent + fillMode: Image.PreserveAspectFit + width: root.width * 0.225 + height: root.height * 0.075 + } + + Text { + id: timeLabel + anchors { + horizontalCenter: parent.horizontalCenter + baseline: parent.top + baselineOffset: UILayout.clockBaselineMargin + } + color: Colors.clockText + text: "--:--" + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.4 + } + } +} diff --git a/basicsuite/ebike-ui/ColumnSpacer.qml b/basicsuite/ebike-ui/ColumnSpacer.qml new file mode 100644 index 0000000..2cdfe98 --- /dev/null +++ b/basicsuite/ebike-ui/ColumnSpacer.qml @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +import "./BikeStyle" + +Rectangle { + height: UILayout.configurationItemSeparator + width: parent.width + color: Colors.tabItemBorder +} diff --git a/basicsuite/ebike-ui/ConfigurationDrawer.qml b/basicsuite/ebike-ui/ConfigurationDrawer.qml new file mode 100644 index 0000000..f6f6094 --- /dev/null +++ b/basicsuite/ebike-ui/ConfigurationDrawer.qml @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import "./BikeStyle" + +Drawer { + property alias bikeInfoTab: bikeInfoTab + property alias generalTab: generalTab + property alias viewTab: viewTab + + background: Rectangle { + color: Colors.curtainBackground + width: parent.width + height: parent.height + } + + TabBar { + id: bar + anchors { + left: parent.left + right: parent.right + leftMargin: root.width * 0.025 + rightMargin: root.width * 0.025 + } + contentHeight: parent.height * 0.175 + background: Rectangle { + color: Colors.curtainBackground + } + + IconifiedTabButton { + id: bikeInfoTabButton + bar: bar + deselectedIcon: "images/info.png" + selectedIcon: "images/info_selected.png" + } + + IconifiedTabButton { + id: configurationTabButton + bar: bar + deselectedIcon: "images/settings.png" + selectedIcon: "images/settings_selected.png" + } + + IconifiedTabButton { + id: viewTabButton + bar: bar + deselectedIcon: "images/list.png" + selectedIcon: "images/list_selected.png" + } + } + + StackLayout { + id: stackLayout + anchors { + left: parent.left + right: parent.right + top: bar.bottom + leftMargin: parent.width * 0.025 + rightMargin: parent.width * 0.025 + bottom: parent.bottom + } + currentIndex: bar.currentIndex + + BikeInfoTab { + id: bikeInfoTab + } + + GeneralTab { + id: generalTab + } + + ViewTab { + id: viewTab + + onResetDemo: { + // Reset trip data + datastore.resetDemo() + // Reset navigation + naviPage.resetDemo() + } + } + } + + Rectangle { + id: drawerClose + anchors { + top: stackLayout.bottom + topMargin: -stackLayout.height * 0.01 + left: parent.left + right: parent.right + } + width: parent.width + height: drawerCloseImage.height + color: "transparent" + + Image { + id: drawerCloseImage + source: "images/curtain_shadow_handle.png" + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.width * 0.2 + height: root.height * 0.07 + fillMode: Image.PreserveAspectFit + } + + MouseArea { + anchors.fill: parent + onClicked: drawer.close() + } + } +} diff --git a/basicsuite/ebike-ui/ConfigurationItem.qml b/basicsuite/ebike-ui/ConfigurationItem.qml new file mode 100644 index 0000000..100f13e --- /dev/null +++ b/basicsuite/ebike-ui/ConfigurationItem.qml @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 + +import "./BikeStyle" + +Rectangle { + property string description + + color: "transparent" + height: stackLayout.height * 0.25 + width: parent.width + + Text { + anchors { + top: parent.top + bottom: parent.bottom + left: parent.left + } + text: description + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: height * 0.3 + } + color: Colors.tabItemColor + verticalAlignment: Text.AlignVCenter + } +} diff --git a/basicsuite/ebike-ui/FpsItem.qml b/basicsuite/ebike-ui/FpsItem.qml new file mode 100644 index 0000000..0ab183d --- /dev/null +++ b/basicsuite/ebike-ui/FpsItem.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: fpsItem + property int frameCounter: 0 + property int fpsValue: 0; + + width: spinnerImage.width + fpsText.width + height: 48 + z: 1 + + Image { + id: spinnerImage + source: "images/fps_icon.png" + NumberAnimation on rotation { + from: 0 + to: 360 + duration: 800 + loops: Animation.Infinite + } + onRotationChanged: frameCounter++; + } + + Text { + id: fpsText + anchors.right: parent.right + anchors.verticalCenter: spinnerImage.verticalCenter + color: "red" + text: "Fps: " + fpsItem.fpsValue + } + + Timer { + interval: 2000 + repeat: true + running: true + onTriggered: { + fpsValue = frameCounter / 2; + frameCounter = 0; + } + } +} diff --git a/basicsuite/ebike-ui/GeneralTab.qml b/basicsuite/ebike-ui/GeneralTab.qml new file mode 100644 index 0000000..70f661f --- /dev/null +++ b/basicsuite/ebike-ui/GeneralTab.qml @@ -0,0 +1,280 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import DataStore 1.0 + +import "./BikeStyle" + +Item { + Column { + anchors.left: parent.left + anchors.right: parent.right + + Text { + height: stackLayout.height * 0.225 + width: parent.width + text: qsTr("GENERAL") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: height * 0.375 + } + color: Colors.tabTitleColor + verticalAlignment: Text.AlignVCenter + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Language") + + Text { + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + text: qsTr("English") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: height * 0.25 + } + color: Colors.languageTextColor + verticalAlignment: Text.AlignVCenter + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Brightness") + + Text { + anchors { + right: autoBrightness.left + rightMargin: UILayout.checkboxTextOffset + verticalCenter: autoBrightness.verticalCenter + } + text: qsTr("Auto") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.225 + } + color: Colors.checkboxCheckedText + } + + CheckBox { + id: autoBrightness + width: UILayout.checkboxWidth + anchors { + right: brightnessSlider.left + rightMargin: UILayout.checkboxSliderOffset + verticalCenter: brightnessSlider.verticalCenter + } + checked: brightness.automatic + + indicator: Rectangle { + implicitWidth: UILayout.checkboxWidth + implicitHeight: UILayout.checkboxHeight + y: parent.height / 2 - height / 2 + radius: UILayout.checkboxRadius + color: Colors.checkboxUncheckedBackground + border.color: autoBrightness.checked ? Colors.checkboxBorderColorChecked : Colors.checkboxBorderColor + border.width: autoBrightness.checked ? 2 : 1 + + Image { + source: "images/checkmark.png" + anchors.centerIn: parent + visible: autoBrightness.checked + } + } + + contentItem: Item {} + + onToggled: brightness.automatic = checked + } + + Slider { + id: brightnessSlider + value: 4 + width: parent.width * 0.2 + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + from: 6 + to: 1 + stepSize: -1 + snapMode: Slider.SnapAlways + onMoved: brightness.brightness = value + + background: Rectangle { + x: brightnessSlider.leftPadding + y: brightnessSlider.topPadding + brightnessSlider.availableHeight / 2 - height / 2 + implicitWidth: UILayout.sliderWidth + implicitHeight: UILayout.sliderHeight + width: brightnessSlider.availableWidth + height: implicitHeight + radius: UILayout.sliderHeight / 2 + color: Colors.sliderBackground + + Rectangle { + // Since gradient is only available vertically, we must draw and rotate + width: parent.height + height: brightnessSlider.visualPosition * parent.width + radius: UILayout.sliderHeight / 2 + gradient: Gradient { + GradientStop { position: 0; color: Colors.sliderMinimumValue } + GradientStop { position: 1; color: Colors.sliderMaximumValue } + } + + transform: Rotation { origin.x: 0; origin.y: UILayout.sliderHeight; angle: -90} + } + } + + handle: Rectangle { + x: brightnessSlider.leftPadding + brightnessSlider.visualPosition * (brightnessSlider.availableWidth - width) + y: brightnessSlider.topPadding + brightnessSlider.availableHeight / 2 - height / 2 + implicitWidth: 2 * UILayout.sliderHandleRadius + implicitHeight: 2 * UILayout.sliderHandleRadius + radius: UILayout.sliderHandleRadius + color: Colors.sliderMaximumValue + + Rectangle { + anchors.centerIn: parent + implicitWidth: 2 * UILayout.sliderHandleRadiusInner + implicitHeight: 2 * UILayout.sliderHandleRadiusInner + radius: UILayout.sliderHandleRadiusInner + color: Colors.sliderInnerBackground + } + } + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Units") + + RoundButton { + id: kmhButton + height: parent.height * 0.6 + width: height + kmhText.implicitWidth + radius: height / 2 + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + } + + background: Rectangle { + width: parent.width + height: parent.height + radius: parent.radius + color: datastore.unit === DataStore.Kmh ? Colors.activeButtonBackground : Colors.inactiveButtonBackground + border.color: Colors.inactiveButtonBorder + border.width: datastore.unit === DataStore.Kmh ? 0 : 1 + } + + contentItem: Text { + id: kmhText + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.unitFontSize + } + text: "km/h" + color: datastore.unit === DataStore.Kmh ? Colors.activeButtonText : Colors.inactiveButtonText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + onClicked: datastore.unit = DataStore.Kmh + } + + RoundButton { + id: mphButton + height: parent.height * 0.6 + width: height + mphText.implicitWidth + radius: height / 2 + anchors { + verticalCenter: parent.verticalCenter + right: kmhButton.left + rightMargin: UILayout.unitButtonSpacing + } + + background: Rectangle { + width: parent.width + height: parent.height + radius: parent.radius + color: datastore.unit === DataStore.Mph ? Colors.activeButtonBackground : Colors.inactiveButtonBackground + border.color: Colors.inactiveButtonBorder + border.width: datastore.unit === DataStore.Mph ? 0 : 1 + } + + contentItem: Text { + id: mphText + text: "mph" + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.unitFontSize + } + color: datastore.unit === DataStore.Mph ? Colors.activeButtonText : Colors.inactiveButtonText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + onClicked: datastore.unit = DataStore.Mph + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + } +} diff --git a/basicsuite/ebike-ui/IconifiedTabButton.qml b/basicsuite/ebike-ui/IconifiedTabButton.qml new file mode 100644 index 0000000..4762d94 --- /dev/null +++ b/basicsuite/ebike-ui/IconifiedTabButton.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.9 +import QtQuick.Controls 2.2 + +import "./BikeStyle" + +TabButton { + property string deselectedIcon + property string selectedIcon + property var bar + + background: Rectangle { + color: Colors.tabBackground + + Image { + height: parent.height + width: height + source: bar.currentItem === parent.parent ? selectedIcon : deselectedIcon + fillMode: Image.PreserveAspectFit + anchors.centerIn: parent + + } + + Rectangle { + visible: bar.currentItem === parent.parent + width: parent.width + height: 2 + anchors.bottom: parent.bottom + anchors.bottomMargin: height + color: Colors.activeTabBorder + } + } +} diff --git a/basicsuite/ebike-ui/LightsBox.qml b/basicsuite/ebike-ui/LightsBox.qml new file mode 100644 index 0000000..b920864 --- /dev/null +++ b/basicsuite/ebike-ui/LightsBox.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Extras 1.4 + +import "./BikeStyle" + +// Bottom-left corner, controls +Item { + width: root.width * 0.425 + height: root.height * 0.45 + + property real imageMargin: Math.min(width, height) * 0.35 + Image { + id: lightsIcon + width: Math.min(parent.width, parent.height) * 0.35 + height: width + source: datastore.lights ? "images/lights_on.png" : "images/lights_off.png" + fillMode: Image.PreserveAspectFit + anchors { + right: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: imageMargin + } + } + + MouseArea { + anchors.fill: parent + onClicked: datastore.lights = !datastore.lights + } + + Rectangle { + width: parent.width * 0.775 + height: UILayout.horizontalViewSeparatorHeight + anchors.top: parent.top + anchors.left: parent.left + color: Colors.separator + } + + Rectangle { + width: UILayout.verticalViewSeparatorWidth + height: parent.height * 0.475 + anchors.bottom: parent.bottom + anchors.right: parent.right + color: Colors.separator + } +} diff --git a/basicsuite/ebike-ui/MainPage.qml b/basicsuite/ebike-ui/MainPage.qml new file mode 100644 index 0000000..e459789 --- /dev/null +++ b/basicsuite/ebike-ui/MainPage.qml @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Extras 1.4 + +import "./BikeStyle" + +Page { + background: Rectangle { + color: Colors.mainBackground + } + property alias statsButton: statsButton + property alias naviButton: naviButton + property alias lightsButton: lightsButton + property alias modeButton: modeButton + property string naviGuideArrowSource + property string naviGuideDistance + property string naviGuideAddress + + StatsBox { + id: statsButton + objectName: "ebikeStatsButton" + anchors.left: parent.left + anchors.top: parent.top + + MouseArea { + anchors.fill: parent + onClicked: { + swipeView.currentIndex = 0 + } + } + } + + NaviBox { + id: naviButton + objectName: "ebikeNaviButton" + anchors.right: parent.right + anchors.top: parent.top + arrowSource: naviGuideArrowSource + distance: naviGuideDistance + + MouseArea { + anchors.fill: parent + onClicked: { + swipeView.currentIndex = 2 + } + } + } + + LightsBox { + id: lightsButton + objectName: "ebikeLightsButton" + anchors.left: parent.left + anchors.bottom: parent.bottom + } + + ModeBox { + id: modeButton + anchors.right: parent.right + anchors.bottom: parent.bottom + } +} diff --git a/basicsuite/ebike-ui/ModeBox.qml b/basicsuite/ebike-ui/ModeBox.qml new file mode 100644 index 0000000..490bc16 --- /dev/null +++ b/basicsuite/ebike-ui/ModeBox.qml @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Extras 1.4 +import DataStore 1.0 + +import "./BikeStyle" + +// Bottom-right corner, mode +Item { + width: root.width * 0.425 + height: root.height * 0.45 + + Text { + id: sportModeText + anchors { + bottom: parent.bottom + bottomMargin: parent.height * 0.3 + left: parent.horizontalCenter + } + color: datastore.mode == DataStore.Sport ? Colors.modeSelected : Colors.modeUnselected + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.1 + } + text: qsTr("SPORT") + } + + Text { + id: cruiseModeText + anchors { + bottom: sportModeText.top + bottomMargin: parent.height * 0.025 + horizontalCenter: sportModeText.horizontalCenter + } + color: datastore.mode == DataStore.Cruise ? Colors.modeSelected : Colors.modeUnselected + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.1 + } + text: qsTr("CRUISE") + } + + MouseArea { + anchors.fill: parent + onClicked: datastore.toggleMode() + } + + Rectangle { + width: parent.width * 0.775 + height: UILayout.horizontalViewSeparatorHeight + anchors.top: parent.top + anchors.right: parent.right + color: Colors.separator + } + + Rectangle { + width: UILayout.verticalViewSeparatorWidth + height: parent.height * 0.475 + anchors.bottom: parent.bottom + anchors.left: parent.left + color: Colors.separator + } +} diff --git a/basicsuite/ebike-ui/MusicPlayer.qml b/basicsuite/ebike-ui/MusicPlayer.qml new file mode 100644 index 0000000..9d44534 --- /dev/null +++ b/basicsuite/ebike-ui/MusicPlayer.qml @@ -0,0 +1,239 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 + +import "./BikeStyle" + +Rectangle { + id: musicPlayer + width: UILayout.musicPlayerWidth + height: UILayout.musicPlayerHeight + UILayout.musicPlayerCorner + radius: UILayout.musicPlayerCorner + color: Colors.musicPlayerBackground + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: -UILayout.musicPlayerCorner + } + state: "hidden" + property bool isPlaying: false + property var songList: [ + ["Post Malone - Rockstar", 218], + ["Ed Sheeran - Perfect", 263], + ["Imagine Dragons - Thunder", 187] + ] + property int currentSong: 0 + + function setupSong() { + var dur = songList[currentSong][1]; + timeAnimation.stop(); + songTimeText.songDuration = dur; + timeAnimation.from = dur; + timeAnimation.to = 0; + timeAnimation.duration = dur * 1000; + if (isPlaying) + timeAnimation.start(); + } + + function previousSong() { + if (currentSong === 0) + currentSong = songList.length - 1; + else + currentSong -= 1; + setupSong(); + } + + function nextSong() { + if (currentSong >= (songList.length - 1)) + currentSong = 0; + else + currentSong += 1; + setupSong(); + } + + Component.onCompleted: setupSong() + + Image { + id: playIcon + width: UILayout.musicPlayerIconWidth + height: UILayout.musicPlayerIconHeight + source: isPlaying + ? (playIconArea.pressed ? "images/pause_pressed.png" : "images/pause.png") + : (playIconArea.pressed ? "images/play_pressed.png" : "images/play.png") + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: UILayout.musicPlayerIconBottom + UILayout.musicPlayerCorner + } + + MouseArea { + id: playIconArea + anchors { + fill: parent + margins: -UILayout.musicPlayerIconSpacing / 2 + } + onClicked: { + isPlaying = !isPlaying + if (isPlaying) { + if (timeAnimation.running) + timeAnimation.resume() + else + timeAnimation.start() + } else + timeAnimation.pause() + } + } + } + + Image { + id: previousIcon + width: UILayout.musicPlayerIconWidth + height: UILayout.musicPlayerIconHeight + source: previousIconArea.pressed ? "images/prevsong_pressed.png" : "images/prevsong.png" + anchors { + right: playIcon.left + rightMargin: UILayout.musicPlayerIconSpacing + bottom: playIcon.bottom + } + + MouseArea { + id: previousIconArea + anchors { + fill: parent + margins: -UILayout.musicPlayerIconSpacing / 2 + } + onClicked: previousSong() + } + } + + Image { + id: nextIcon + width: UILayout.musicPlayerIconWidth + height: UILayout.musicPlayerIconHeight + source: nextIconArea.pressed ? "images/nextsong_pressed.png" : "images/nextsong.png" + anchors { + left: playIcon.right + leftMargin: UILayout.musicPlayerIconSpacing + bottom: playIcon.bottom + } + + MouseArea { + id: nextIconArea + anchors { + fill: parent + margins: -UILayout.musicPlayerIconSpacing / 2 + } + onClicked: nextSong() + } + } + + Text { + id: songTitleText + anchors { + left: previousIcon.left + right: nextIcon.right + rightMargin: songTimeText.width + 5 + baseline: previousIcon.top + baselineOffset: -UILayout.musicPlayerTextBottom + } + + color: Colors.musicPlayerSongText + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: UILayout.musicPlayerTextSize + } + text: songList[currentSong][0] + elide: Text.ElideRight + } + + // Function for pretty-printing duration + function splitDuration(duration) { + var minutes = Math.floor(duration / 60); + var seconds = Math.floor(duration % 60); + if (seconds < 10) + seconds = "0" + seconds; + return minutes + ":" + seconds; + } + + Text { + property int songDuration + id: songTimeText + anchors { + right: nextIcon.right + baseline: nextIcon.top + baselineOffset: -UILayout.musicPlayerTextBottom + } + + color: Colors.musicPlayerTimeText + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: UILayout.musicPlayerTextSize + } + text: splitDuration(songDuration) + + NumberAnimation { + id: timeAnimation + target: songTimeText + property: "songDuration" + onStopped: { + if (isPlaying) + nextSong(); + } + } + } + + states: State { + name: "hidden" + PropertyChanges { + target: musicPlayer + anchors.bottomMargin: -musicPlayer.height + } + } + + transitions: Transition { + from: "" + to: "hidden" + reversible: true + NumberAnimation { + properties: "anchors.bottomMargin" + duration: 250 + easing.type: Easing.InOutQuad + } + } +} diff --git a/basicsuite/ebike-ui/NaviBox.qml b/basicsuite/ebike-ui/NaviBox.qml new file mode 100644 index 0000000..9a97cf8 --- /dev/null +++ b/basicsuite/ebike-ui/NaviBox.qml @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.0 + +import "./BikeStyle" + +// Top-right corner, navi +Item { + id: rootItem + width: root.width * 0.425 + height: root.height * 0.45 + property string arrowSource: "images/nav_right.png" + property string distance: "0" + property string unit: "m" + + property real imageMargin: Math.min(width, height) * 0.275 + Image { + id: naviIcon + width: Math.min(parent.width, parent.height) * 0.375 + height: width + source: arrowSource + anchors { + top: parent.top + topMargin: imageMargin + left: parent.horizontalCenter + } + } + + Item { + id: container + anchors.horizontalCenter: naviIcon.horizontalCenter + anchors.top: naviIcon.bottom + height: 30 + width: naviText.width + 5 + naviUnit.width + visible: navigation.active + + Text { + id: naviText + anchors.baseline: container.bottom + color: Colors.distanceText + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: rootItem.height * 0.1 + } + text: Math.round(datastore.convertSmallDistance(distance) / 10) * 10 + } + + Text { + id: naviUnit + anchors { + baseline: container.bottom + left: naviText.right + leftMargin: 5 + } + color: Colors.distanceUnit + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: rootItem.height * 0.1 + } + text: datastore.smallUnit + } + } + + Text { + id: navigateText + anchors.horizontalCenter: naviIcon.horizontalCenter + anchors.top: naviIcon.bottom + visible: !navigation.active + color: Colors.modeUnselected + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: rootItem.height * 0.1 + } + text: qsTr("NAVIGATE") + } + + Rectangle { + width: parent.width * 0.775 + height: UILayout.horizontalViewSeparatorHeight + anchors.bottom: parent.bottom + anchors.right: parent.right + color: Colors.separator + } + + Rectangle { + width: UILayout.verticalViewSeparatorWidth + height: parent.height * 0.475 + anchors.top: parent.top + anchors.left: parent.left + color: Colors.separator + } +} diff --git a/basicsuite/ebike-ui/NaviButton.qml b/basicsuite/ebike-ui/NaviButton.qml new file mode 100644 index 0000000..a34d540 --- /dev/null +++ b/basicsuite/ebike-ui/NaviButton.qml @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 + +import "./BikeStyle" + +RoundButton { + property string iconSource + + width: UILayout.naviPageIconBackgroundWidth + height: UILayout.naviPageIconBackgroundHeight + radius: UILayout.naviPageIconBackgroundRadius + z: 1 + + background: Item { + id: naviButtonBackground + width: parent.width + height: parent.height + + Image { + id: naviButtonShadow + fillMode: Image.Pad + anchors { + horizontalCenter: naviButtonBackground.horizontalCenter + verticalCenter: naviButtonBackground.verticalCenter + horizontalCenterOffset: 1 + verticalCenterOffset: 1 + } + source: "images/map_btn_shadow.png" + } + + Rectangle { + width: UILayout.naviPageIconBackgroundWidth + height: UILayout.naviPageIconBackgroundHeight + radius: UILayout.naviPageIconBackgroundRadius + color: parent.parent.down ? Colors.naviPageIconPressedBackground : Colors.naviPageIconBackground + } + } + + contentItem: Item {} + Image { + anchors.centerIn: parent + width: UILayout.naviPageIconWidth + height: UILayout.naviPageIconHeight + source: iconSource + z: 3 + } +} diff --git a/basicsuite/ebike-ui/NaviGuide.qml b/basicsuite/ebike-ui/NaviGuide.qml new file mode 100644 index 0000000..a3c011f --- /dev/null +++ b/basicsuite/ebike-ui/NaviGuide.qml @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 + +import "./BikeStyle" + +Rectangle { + property string arrowSource: "images/nav_nodir.png" + property string address: "-" + property string distance: "0" + property string unit: "m" + + width: root.width * 0.14 + height: width + radius: width + color: Colors.naviPageGuideBackground + z: 1 + + Rectangle { + width: parent.width / 2 + height: width + radius: width * 0.1 + color: Colors.naviPageGuideBackground + anchors.right: parent.right + anchors.bottom: parent.bottom + } + + Image { + id: guideArrow + anchors { + top: parent.top + topMargin: parent.height * 0.075 + horizontalCenter: parent.horizontalCenter + } + source: arrowSource + width: parent.width * 0.5 + height: width + } + + Text { + id: naviAddressText + anchors { + top: naviDistance.bottom + topMargin: parent.height * 0.025 + right: parent.right + rightMargin: parent.width * 0.1 + } + width: parent.width * 0.725 + horizontalAlignment: Text.AlignRight + color: Colors.naviPageGuideAddressColor + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: parent.height * 0.075 + } + fontSizeMode: Text.Fit + wrapMode: Text.WordWrap + minimumPixelSize: 5 + text: address + } + + Text { + id: naviUnit + anchors { + bottom: naviDistance.bottom + right: naviAddressText.right + } + verticalAlignment: Text.AlignBottom + color: Colors.naviPageGuideUnitColor + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.125 + } + text: datastore.smallUnit + } + + Text { + id: naviDistance + anchors { + top: guideArrow.bottom + right: naviUnit.left + rightMargin: parent.width * 0.05 + } + verticalAlignment: Text.AlignBottom + color: Colors.naviPageGuideTextColor + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: parent.height * 0.175 + } + text: Math.round(datastore.convertSmallDistance(distance) / 10) * 10 + } + + Image { + source: "images/navigation_widget_shadow.png" + width: parent.width * 1.05 + height: width + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + horizontalCenterOffset: parent.width * 0.025 + verticalCenterOffset: parent.height * 0.025 + } + z: -1 + } +} diff --git a/basicsuite/ebike-ui/NaviPage.qml b/basicsuite/ebike-ui/NaviPage.qml new file mode 100644 index 0000000..e059e68 --- /dev/null +++ b/basicsuite/ebike-ui/NaviPage.qml @@ -0,0 +1,691 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtPositioning 5.3 +import QtLocation 5.9 +import QtQuick.VirtualKeyboard 2.1 + +import "./BikeStyle" + +Page { + id: mapContainer + property var startCoordinate: QtPositioning.coordinate(36.131961, -115.153048) + property var destinationCoordinate: QtPositioning.coordinate(90, 0) + property var targetPlace + property real totalDistance + property real metersPerSecond // This is calculated at the start of a trip + property real totalTravelTime: totalDistance / metersPerSecond + property real naviGuideSegmentDistance: 0 + property string naviGuideArrowSource: "images/nav_nodir.png" + property string naviGuideDistance + property string naviGuideAddress: "-" + property alias routeQuery: routeQuery + property alias routeModel: routeModel + property alias targetEdit: targetEdit + property var routeSegmentList + property var currentSegment + property int routeSegment + property int pathSegment + + function resetDemo() { + // Clear/reset everything + naviGuideArrowSource = "images/nav_nodir.png" + naviGuideDistance = "-" + naviGuideAddress = "-" + navigation.active = false + navigationArrowAnimation.stop() + targetEdit.clear() + + map.focus = true + routeQuery.clearWaypoints() + routeModel.reset() + navigationArrowItem.coordinate = navigation.coordinate + destinationCoordinate = QtPositioning.coordinate(90, 0) + map.center = navigation.coordinate + } + + TextField { + id: targetEdit + width: UILayout.naviPageLocationWidth + height: UILayout.naviPageLocationHeight + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: UILayout.naviPageLocationTopMargin + } + background: Rectangle { + radius: UILayout.naviPageLocationRadius + implicitWidth: UILayout.naviPageLocationWidth + implicitHeight: UILayout.naviPageLocationHeight + border.color: Colors.naviPageSuggestionBorder + border.width: targetEdit.activeFocus ? 2 : 0 + } + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.naviPageSearchTextSize + } + cursorVisible: !navigation.active + inputMethodHints: Qt.ImhNoPredictiveText // This should disable lookup on the device + + leftPadding: UILayout.naviPageLocationLeftPadding + rightPadding: UILayout.naviPageSearchIconMargin + UILayout.naviPageSearchIconWidth + placeholderText: qsTr("Where do you want to go?") + z: 1 + autoScroll: false + + // Update search text whenever text is edited + onTextEdited: suggest.search = text + + // If in navigation mode, disable editing + readOnly: navigation.active + + Image { + source: navigation.active ? "images/search_cancel.png" : "images/search.png" + width: UILayout.naviPageSearchIconWidth + height: UILayout.naviPageSearchIconHeight + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + rightMargin: UILayout.naviPageSearchIconMargin + } + visible: !suggest.loading + + MouseArea { + anchors.fill: parent + enabled: navigation.active + onClicked: { + naviGuideArrowSource = "images/nav_nodir.png" + naviGuideDistance = "-" + naviGuideAddress = "-" + navigation.active = false + navigationArrowAnimation.stop() + targetEdit.clear() + } + } + } + + // Show a busy indicator whenever suggestions are loading + BusyIndicator { + width: height + anchors { + top: targetEdit.top + bottom: targetEdit.bottom + right: targetEdit.right + rightMargin: UILayout.naviPageSearchIconMargin + } + running: suggest.loading + } + + Image { + id: naviInputShadow + source: "images/small_input_box_shadow.png" + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + horizontalCenterOffset: 1 + verticalCenterOffset: 1 + } + visible: false + z: -2 + } + } + + ListView { + id: targetList + anchors { + top: targetEdit.bottom; + topMargin: UILayout.naviPageSuggestionsOffset + horizontalCenter: targetEdit.horizontalCenter + } + width: UILayout.naviPageLocationWidth + height: 3 * UILayout.naviPageSuggestionHeight + model: suggestions + visible: targetEdit.activeFocus && !navigation.active + z: 1 + currentIndex: -1 + + delegate: Component { + Rectangle { + width: parent.width + height: UILayout.naviPageSuggestionHeight + color: "white" + border.color: Colors.naviPageSuggestionsDivider + border.width: 1 + + Text { + width: parent.width + height: parent.height + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + elide: Text.ElideRight + text: placename + color: Colors.naviPageSuggestionText + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.naviPageSuggestionTextSize + } + } + + MouseArea { + anchors.fill: parent + onClicked: targetList.currentIndex = index + } + } + } + + onCurrentIndexChanged: { + // Called when the currentIndex is reset, ignore that + if (targetList.currentIndex == -1) + return; + + // Get current place name + targetPlace = model.get(targetList.currentIndex) + suggestions.addToMostRecent(targetPlace) + + // Reset search + targetList.currentIndex = -1 + // Update current text + targetEdit.text = targetPlace.place_name + // Clear the model and stop any search + suggestions.clear() + suggest.stopSuggest() + + targetEdit.cursorPosition = 0 + targetEdit.ensureVisible(1) + navigation.active = true + map.focus = true + + destinationCoordinate = QtPositioning.coordinate(targetPlace.center[1], targetPlace.center[0]); + routeQuery.clearWaypoints() + routeQuery.addWaypoint(map.center) + routeQuery.addWaypoint(destinationCoordinate) + routeQuery.travelModes = RouteQuery.BicycleTravel + routeQuery.routeOptimizations = RouteQuery.ShortestRoute + routeModel.update() + } + } + + // Zoom and location icons + NaviButton { + id: gpsCenter + anchors { + top: parent.top + topMargin: UILayout.naviPageIconTopMargin + right: parent.right + rightMargin: UILayout.naviPageIconRightMargin + } + iconSource: "images/map_locate.png" + onClicked: { + navigationArrowItem.coordinate = navigation.coordinate + map.center = navigation.coordinate + } + } + + NaviButton { + id: zoomIn + anchors { + top: gpsCenter.bottom + topMargin: UILayout.naviPageIconSpacing + right: parent.right + rightMargin: UILayout.naviPageIconRightMargin + } + iconSource: "images/map_zoomin.png" + autoRepeat: true + onClicked: navigation.zoomlevel += 0.1 + } + + NaviButton { + id: zoomOut + anchors { + top: zoomIn.bottom + topMargin: UILayout.naviPageIconSpacing + right: parent.right + rightMargin: UILayout.naviPageIconRightMargin + } + iconSource: "images/map_zoomout.png" + autoRepeat: true + onClicked: navigation.zoomlevel -= 0.1 + } + + NaviGuide { + id: naviGuide + anchors { + right: parent.right + bottom: parent.bottom + rightMargin: root.width * 0.015 + bottomMargin: anchors.rightMargin + } + arrowSource: naviGuideArrowSource + distance: naviGuideDistance + address: naviGuideAddress + visible: navigation.active + } + + NaviTripInfo { + id: totalTripInfo + z: 1 + visible: navigation.active + anchors { + bottom: parent.bottom + bottomMargin: UILayout.naviPageTripBottomMargin + horizontalCenter: parent.horizontalCenter + } + + remainingDistance: totalDistance + remainingTravelTime: totalTravelTime + } + + RouteQuery { + id: routeQuery + numberAlternativeRoutes: 0 + } + + function updateNaviGuide(segment, nextsegment) { + var maneuver = segment.maneuver; + naviGuideSegmentDistance = maneuver.distanceToNextInstruction; + navigationArrowAnimation.pathDistance = naviGuideSegmentDistance; + naviGuideDistance = maneuver.distanceToNextInstruction; + + if (nextsegment) { + var nextmaneuver = nextsegment.maneuver; + naviGuideAddress = nextmaneuver.instructionText; + switch (nextmaneuver.direction) { + case RouteManeuver.NoDirection: + naviGuideArrowSource = "images/nav_nodir.png"; + break; + case RouteManeuver.DirectionForward: + naviGuideArrowSource = "images/nav_straight.png"; + break; + case RouteManeuver.DirectionBearRight: + naviGuideArrowSource = "images/nav_bear_r.png"; + break; + case RouteManeuver.DirectionLightRight: + naviGuideArrowSource = "images/nav_light_right.png"; + break; + case RouteManeuver.DirectionRight: + naviGuideArrowSource = "images/nav_right.png"; + break; + case RouteManeuver.DirectionHardRight: + naviGuideArrowSource = "images/nav_hard_r.png"; + break; + case RouteManeuver.DirectionUTurnRight: + naviGuideArrowSource = "images/nav_uturn_r.png"; + break; + case RouteManeuver.DirectionUTurnLeft: + naviGuideArrowSource = "images/nav_uturn_l.png"; + break; + case RouteManeuver.DirectionHardLeft: + naviGuideArrowSource = "images/nav_hard_l.png"; + break; + case RouteManeuver.DirectionLeft: + naviGuideArrowSource = "images/nav_left.png"; + break; + case RouteManeuver.DirectionLightLeft: + naviGuideArrowSource = "images/nav_light_left.png"; + break; + case RouteManeuver.DirectionBearLeft: + naviGuideArrowSource = "images/nav_bear_l.png"; + break; + } + } else { + naviGuideAddress = "-"; + naviGuideArrowSource = "images/nav_nodir.png"; + } + } + + function setNextAnimation() { + if (!navigation.active) + return; + var position = QtPositioning.coordinate(currentSegment.maneuver.position.longitude, + currentSegment.maneuver.position.latitude); + + // Update the navigation instructions + if (pathSegment === 0) { + var nextSegment = routeSegmentList[routeSegment + 1]; + updateNaviGuide(currentSegment, nextSegment); + } + + var startPos = navigationArrowItem.coordinate; + var path = currentSegment.path; + pathSegment += 1; + if (pathSegment >= path.length) { + routeSegment += 1; + currentSegment = routeSegmentList[routeSegment]; + if (!currentSegment) { + naviGuideArrowSource = "images/nav_nodir.png"; + navigation.active = false; + targetEdit.clear(); + return; + } + pathSegment = 0; + setNextAnimation(); + return; + } + var endPos = path[pathSegment]; + + // Calculate new direction + var oldDir = navigationArrowAnimation.rotationDirection; + var newDir = startPos.azimuthTo(endPos); + + // Calculate the duration of the animation + var diff = oldDir - newDir; + if (Math.abs(diff) < 15) + navigationArrowAnimation.rotationDuration = 0; + else if (diff < -180) + navigationArrowAnimation.rotationDuration = (diff + 360) * 5; + else if (diff > 180) + navigationArrowAnimation.rotationDuration = (360 - diff) * 5; + else + navigationArrowAnimation.rotationDuration = Math.abs(diff) * 5; + + // Set animation details + var pathDistance = startPos.distanceTo(endPos); + var nextDistance = navigationArrowAnimation.pathDistance - pathDistance; + var nextRemainingDistance = navigationArrowAnimation.remainingDistance - pathDistance; + navigationArrowAnimation.coordinateDuration = pathDistance * 40; + navigationArrowAnimation.rotationDirection = startPos.azimuthTo(endPos); + navigationArrowAnimation.pathDistance = nextDistance; + navigationArrowAnimation.remainingDistance = nextRemainingDistance; + navigationArrowAnimation.sourceCoordinate = startPos; + navigationArrowAnimation.targetCoordinate = endPos; + navigationArrowAnimation.start(); + } + + RouteModel { + id: routeModel + plugin: map.plugin + query: routeQuery + onStatusChanged: { + if (status === RouteModel.Ready) { + switch (count) { + case 0: + // technically not an error + console.log('mapping error', errorString) + break + case 1: + break + } + } else if (status === RouteModel.Error) { + console.log('mapping error', errorString) + } + } + onRoutesChanged: { + if (count === 0) + return; + var route = routeModel.get(0); + + totalDistance = route.distance; + metersPerSecond = route.distance / route.travelTime; + navigationArrowAnimation.remainingDistance = route.distance; + + routeManeuverModel.clear(); + currentSegment = route.segments[0]; + routeSegmentList = route.segments; + + routeSegment = 0; + pathSegment = 0; + setNextAnimation(); + } + } + + // Model that is used to display individual instructions + ListModel { + id: routeManeuverModel + } + + Map { + id: map + gesture.enabled: true + anchors.fill: parent + plugin: mapboxgl + + center: navigation.coordinate + zoomLevel: navigation.zoomlevel + bearing: navigation.direction + + onCenterChanged: { + suggest.center = map.center + } + + Behavior on bearing { + RotationAnimation { + duration: 250 + direction: RotationAnimation.Shortest + } + } + + Behavior on center { + id: centerBehavior + enabled: true + CoordinateAnimation { duration: 1500 } + } + + MapQuickItem { + id: navigationArrowItem + z: 3 + coordinate: navigation.routePosition + anchorPoint.x: navigationArrowImage.width / 2 + anchorPoint.y: navigationArrowImage.height / 2 + sourceItem: Image { + id: navigationArrowImage + source: "images/map_location_arrow.png" + width: 30 + height: 30 + } + } + + MapQuickItem { + id: navigationCircleItem + z: 2 + coordinate: navigation.routePosition + anchorPoint.x: navigationCircleImage.width / 2 + anchorPoint.y: navigationCircleImage.height / 2 + sourceItem: Image { + id: navigationCircleImage + source: "images/blue_circle_gps_area.png" + width: 100 + height: 100 + } + } + + MapQuickItem { + id: destinationQuickItem + z: 3 + coordinate: destinationCoordinate + anchorPoint.x: destinationImage.width / 2 + anchorPoint.y: destinationImage.height - 10 + sourceItem: Image { + id: destinationImage + source: "images/map_destination.png" + width: 40 + height: 40 + } + visible: navigation.active + } + + MapItemView { + model: routeModel + delegate: routeDelegate + } + + Component { + id: routeDelegate + + MapRoute { + id: route + route: routeData + line.color: "#3698e8" + line.width: 6 + smooth: true + visible: index === 0 // Show only one route (numberAlternativeRoutes not respected yet) + } + } + + SequentialAnimation { + id: navigationArrowAnimation + property real rotationDuration: 0; + property real rotationDirection: 0; + property real coordinateDuration: 0; + property real pathDistance: 0; + property real remainingDistance: 0; + property var sourceCoordinate: navigation.routePosition; + property var targetCoordinate: startCoordinate; + + RotationAnimation { + target: map + property: "bearing" + duration: navigationArrowAnimation.rotationDuration + to: navigationArrowAnimation.rotationDirection + direction: RotationAnimation.Shortest + } + + ParallelAnimation { + CoordinateAnimation { + target: map + property: "center" + duration: navigationArrowAnimation.coordinateDuration + to: navigationArrowAnimation.targetCoordinate + } + + CoordinateAnimation { + target: navigationArrowItem + property: "coordinate" + duration: navigationArrowAnimation.coordinateDuration + to: navigationArrowAnimation.targetCoordinate + } + + CoordinateAnimation { + target: navigationCircleItem + property: "coordinate" + duration: navigationArrowAnimation.coordinateDuration + to: navigationArrowAnimation.targetCoordinate + } + + NumberAnimation { + target: mapContainer + property: "naviGuideDistance" + duration: navigationArrowAnimation.coordinateDuration + to: navigationArrowAnimation.pathDistance + } + + NumberAnimation { + target: mapContainer + property: "totalDistance" + duration: navigationArrowAnimation.coordinateDuration + to: navigationArrowAnimation.remainingDistance + } + } + + onStopped: setNextAnimation() + } + + MouseArea { + // Whenever the user taps on the map, move focus to it + anchors.fill: parent + onClicked: map.focus = true + } + } + + Plugin { + id: mapboxgl + name: "mapbox" + PluginParameter { + name: "mapbox.access_token" + value: "pk.eyJ1IjoibWFwYm94NHF0IiwiYSI6ImNpd3J3eDE0eDEzdm8ydHM3YzhzajlrN2oifQ.keEkjqm79SiFDFjnesTcgQ" + } + PluginParameter { + name: "mapbox.mapping.map_id" + value: "mapbox.run-bike-hike" + } + } + + states: [ + State { + name: ""; + when: !navigation.active + PropertyChanges { + target: targetEdit + width: UILayout.naviPageLocationWidth + anchors.topMargin: UILayout.naviPageLocationTopMargin + anchors.bottomMargin: 0 + } + AnchorChanges { + target: targetEdit + anchors.top: parent.top + anchors.bottom: undefined + } + PropertyChanges { + target: naviInputShadow + visible: false + } + }, + State { + name: "NAVIGATING"; + when: navigation.active + PropertyChanges { + target: targetEdit + width: UILayout.naviPageTripWidth + anchors.topMargin: 0 + anchors.bottomMargin: UILayout.naviPageTripSearchMargin + } + AnchorChanges { + target: targetEdit + anchors.top: undefined + anchors.bottom: totalTripInfo.top + } + PropertyChanges { + target: naviInputShadow + visible: true + } + } + ] + + transitions: Transition { + NumberAnimation { + properties: "width" + easing.type: Easing.InOutQuad + duration: 250 + } + AnchorAnimation { + duration: 250 + } + } +} diff --git a/basicsuite/ebike-ui/NaviTripInfo.qml b/basicsuite/ebike-ui/NaviTripInfo.qml new file mode 100644 index 0000000..e024aab --- /dev/null +++ b/basicsuite/ebike-ui/NaviTripInfo.qml @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 + +import "./BikeStyle" + +Rectangle { + property real remainingDistance: 0 + property real remainingTravelTime: 0 + property var remainingDistanceSplit: datastore.splitDistance(remainingDistance, true) + property var remainingTravelTimeSplit: datastore.splitDuration(remainingTravelTime) + + width: UILayout.naviPageTripWidth + height: UILayout.naviPageTripHeight + radius: UILayout.naviPageTripRadius + color: Colors.naviPageTripBackground + + Rectangle { + width: UILayout.naviPageTripDividerWidth + height: UILayout.naviPageTripDividerHeight + radius: 2 + color: Colors.naviPageTripDivider + anchors.centerIn: parent + } + + Item { + height: parent.height + width: naviTripDistanceRemainingText.width + 5 + naviTripDistanceUnitText.width + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + horizontalCenterOffset: -parent.width / 4 + } + + Text { + id: naviTripDistanceRemainingText + anchors.verticalCenter: parent.verticalCenter + color: Colors.naviPageGuideTextColor + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.naviPageTripTotalTextSize + } + text: remainingDistanceSplit.decimal ? remainingDistanceSplit.value.toFixed(1) : remainingDistanceSplit.value.toFixed(0) + } + + Text { + id: naviTripDistanceUnitText + anchors { + verticalCenter: parent.verticalCenter + left: naviTripDistanceRemainingText.right + leftMargin: 5 + } + color: Colors.naviPageGuideUnitColor + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: UILayout.naviPageTripTotalUnitSize + } + text: remainingDistanceSplit.unit + } + } + + + Item { + height: parent.height + width: naviTripTimeRemainingText.width + 5 + naviTripTimeUnitText.width + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + horizontalCenterOffset: parent.width / 4 + } + + Text { + id: naviTripTimeRemainingText + anchors.verticalCenter: parent.verticalCenter + color: Colors.naviPageGuideTextColor + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.naviPageTripTotalTextSize + } + text: remainingTravelTimeSplit.value.toFixed(0) + } + + Text { + id: naviTripTimeUnitText + anchors { + verticalCenter: parent.verticalCenter + left: naviTripTimeRemainingText.right + leftMargin: 5 + } + color: Colors.naviPageGuideUnitColor + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: UILayout.naviPageTripTotalUnitSize + } + text: remainingTravelTimeSplit.unit + } + } + + Image { + source: "images/small_input_box_shadow.png" + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + horizontalCenterOffset: 1 + verticalCenterOffset: 1 + } + z: -1 + } +} diff --git a/basicsuite/ebike-ui/SpeedView.qml b/basicsuite/ebike-ui/SpeedView.qml new file mode 100644 index 0000000..49be98a --- /dev/null +++ b/basicsuite/ebike-ui/SpeedView.qml @@ -0,0 +1,530 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import DataStore 1.0 +import "./BikeStyle" + +Rectangle { + id: speedViewItem + objectName: "ebikeSpeedView" + width: root.width * 0.35 + height: width + color: "transparent" + radius: width + z: 1 + anchors{ + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + } + property int dotcount: UILayout.speedViewDots + property int curvewidth: Math.min(width, height) * 0.0425 + property int speedTextSize: height * 0.4 + property int speedBaselineOffset: height * 0.45 + property int innerRadius: width * 0.45 + property int speedUnitsSize: height * 0.05 + property int speedUnitBaselineOffset: height * 0.075 + property int speedIconsOffset: width * 0.25 + property int speedInfoTextsOffset: 0 + property int speedInfoTextsSize: speedTextSize * 0.45 + property int speedInfoUnitsOffset: height * 0.075 + property int assistPowerIconOffset: height * 0.175 + property bool enlarged: false + property alias cornerRectangle: cornerRectangle + property bool showZero: false + + signal showMain() + + // Speed info + Text { + id: speedText + anchors { + horizontalCenter: speedView.horizontalCenter + baseline: speedView.bottom + baselineOffset: -speedBaselineOffset + } + + color: Colors.speedText + font { + family: "Teko, Light" + weight: Font.Light + pixelSize: speedTextSize + } + text: showZero ? "0" : datastore.speed.toFixed(0) + } + + Text { + id: speedUnit + anchors { + horizontalCenter: speedText.horizontalCenter + baseline: speedText.baseline + baselineOffset: speedUnitBaselineOffset + } + + color: Colors.speedUnit + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: speedUnitsSize + } + text: datastore.unit === DataStore.Kmh ? qsTr("km/h") : qsTr("mph") + } + + // Average speed info + Text { + id: averageSpeedText + anchors { + baseline: speedText.baseline + baselineOffset: speedInfoTextsOffset + horizontalCenter: speedText.horizontalCenter + horizontalCenterOffset: -speedIconsOffset + } + visible: speedView.state !== "CORNERED" + + color: Colors.averageSpeedText + font { + family: "Teko, Light" + weight: Font.Light + pixelSize: speedInfoTextsSize + } + text: datastore.averagespeed.toFixed(0) + } + + Text { + id: averageSpeedUnit + anchors { + horizontalCenter: averageSpeedText.horizontalCenter + baseline: averageSpeedText.baseline + baselineOffset: speedInfoUnitsOffset + } + visible: speedView.state !== "CORNERED" + + color: Colors.averageSpeedUnit + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: speedUnitsSize + } + horizontalAlignment: Text.AlignHCenter + text: datastore.unit === DataStore.Kmh ? qsTr("AVG\nkm/h") : qsTr("AVG\nmph") + } + + Image { + id: averageSpeedIcon + width: parent.width * 0.075 + height: width + fillMode: Image.PreserveAspectFit + source: "images/speed.png" + anchors { + horizontalCenter: averageSpeedText.horizontalCenter + bottom: averageSpeedText.top + } + visible: speedView.state !== "CORNERED" + } + + // Assist info + Text { + id: assistDistanceText + anchors { + baseline: speedText.baseline + baselineOffset: speedInfoTextsOffset + horizontalCenter: speedText.horizontalCenter + horizontalCenterOffset: speedIconsOffset + } + visible: speedView.state !== "CORNERED" + + color: Colors.assistDistanceText + font { + family: "Teko, Light" + weight: Font.Light + pixelSize: speedInfoTextsSize + } + text: datastore.assistdistance.toFixed(0) + } + + Text { + id: assistDistanceUnit + anchors { + horizontalCenter: assistDistanceText.horizontalCenter + baseline: assistDistanceText.baseline + baselineOffset: speedInfoUnitsOffset + } + visible: speedView.state !== "CORNERED" + + color: Colors.assistDistanceUnit + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: speedUnitsSize + } + horizontalAlignment: Text.AlignHCenter + text: datastore.unit === DataStore.Kmh ? qsTr("km\nassist\nleft") : qsTr("mi.\nassist\nleft") + } + + Image { + id: assistDistanceIcon + width: parent.width * 0.075 + height: width + fillMode: Image.PreserveAspectFit + source: "images/battery.png" + anchors { + horizontalCenter: assistDistanceText.horizontalCenter + bottom: assistDistanceText.top + } + visible: speedView.state !== "CORNERED" + } + + // Assist power icon + Image { + id: assistPowerIcon + width: parent.width * 0.125 + height: width + fillMode: Image.PreserveAspectFit + source: "images/assist.png" + anchors { + horizontalCenter: speedView.horizontalCenter + top: parent.verticalCenter + topMargin: assistPowerIconOffset + } + visible: speedView.state !== "CORNERED" + } + + Gradient { + id: assistPowerGradient + GradientStop { position: 0.0; color: Colors.assistPowerGradientStart } + GradientStop { position: 1.0; color: Colors.assistPowerGradientEnd } + } + + // Assist power circles + Rectangle { + id: assistPowerIcon1 + width: parent.width * 0.0375 + height: width + radius: parent.width * 0.0375 + anchors { + right: assistPowerIcon2.left + rightMargin: UILayout.assistPowerCircleOffset + bottom: assistPowerIcon2.bottom + bottomMargin: UILayout.assistPowerCircleVerticalOffset + } + color: Colors.assistPowerEmpty + gradient: datastore.assistpower > 2.0 ? assistPowerGradient : null + visible: speedView.state !== "CORNERED" + } + + Rectangle { + id: assistPowerIcon2 + width: parent.width * 0.0375 + height: width + radius: parent.width * 0.0375 + anchors { + right: parent.horizontalCenter + rightMargin: UILayout.assistPowerCircleOffset / 2 + top: assistPowerIcon.bottom + topMargin: parent.height * 0.02 + } + color: Colors.assistPowerEmpty + gradient: datastore.assistpower > 25.0 ? assistPowerGradient : null + visible: speedView.state !== "CORNERED" + } + + Rectangle { + id: assistPowerIcon3 + width: parent.width * 0.0375 + height: width + radius: parent.width * 0.0375 + anchors { + left: parent.horizontalCenter + leftMargin: UILayout.assistPowerCircleOffset / 2 + top: assistPowerIcon.bottom + topMargin: parent.height * 0.02 + } + color: Colors.assistPowerEmpty + gradient: datastore.assistpower > 50.0 ? assistPowerGradient : null + visible: speedView.state !== "CORNERED" + } + + Rectangle { + id: assistPowerIcon4 + width: parent.width * 0.0375 + height: width + radius: parent.width * 0.0375 + anchors { + left: assistPowerIcon3.right + leftMargin: UILayout.assistPowerCircleOffset + bottom: assistPowerIcon3.bottom + bottomMargin: UILayout.assistPowerCircleVerticalOffset + } + color: Colors.assistPowerEmpty + gradient: datastore.assistpower > 75.0 ? assistPowerGradient : null + visible: speedView.state !== "CORNERED" + } + + // Numbers for speed and battery level + Text { + anchors { + baseline: parent.bottom + baselineOffset: parent.height * 0.04 + right: parent.horizontalCenter + rightMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "0" + } + + Text { + anchors { + baseline: parent.bottom + baselineOffset: parent.height * 0.04 + left: parent.horizontalCenter + leftMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "0 %" + } + + Text { + anchors { + baseline: parent.verticalCenter + right: parent.left + rightMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "30" + } + + Text { + anchors { + baseline: parent.verticalCenter + left: parent.right + leftMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "50 %" + } + + Text { + anchors { + baseline: parent.top + baselineOffset: -parent.height * 0.02 + right: parent.horizontalCenter + rightMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "60" + } + + Text { + anchors { + baseline: parent.top + baselineOffset: -parent.height * 0.02 + left: parent.horizontalCenter + leftMargin: parent.width * 0.02 + } + visible: speedView.state !== "CORNERED" + + color: Colors.dottedRing + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.04 + } + text: "100 %" + } + + Rectangle { + id: cornerRectangle + width: parent.width / 2 + height: width + // By default this is centered, and invisible + anchors.horizontalCenter: speedView.horizontalCenter + anchors.verticalCenter: speedView.verticalCenter + color: "transparent" + radius: width * 0.1 + z: -1 + + Image { + source: "images/small_speedometer_arrow.png" + width: parent.width * 0.25 + height: width + anchors.left: parent.left + anchors.leftMargin: parent.width * 0.075 + anchors.bottom: parent.bottom + anchors.bottomMargin: parent.height * 0.075 + visible: swipeView.currentIndex != 1 + } + } + + Image { + source: "images/small_speedometer_shadow.png" + width: parent.width * 1.05 + height: width + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.verticalCenter + horizontalCenterOffset: parent.width * 0.025 + verticalCenterOffset: parent.height * 0.025 + } + z: -1 + + visible: speedView.state == "CORNERED" + } + + Canvas { + id: speedArc + anchors.fill: speedView + + Component.onCompleted: { + datastore.onSpeedChanged.connect(speedArc.requestPaint) + datastore.onBatterylevelChanged.connect(speedArc.requestPaint) + } + + onPaint: { + var ctx = getContext("2d"); + ctx.reset(); + + var currentRadius = (speedView.width - 2) / 2; + var centerX = speedView.width / 2; + var centerY = speedView.height / 2; + + // Draw the dotted circle (if not in corner mode) + if (speedView.state !== "CORNERED") { + ctx.fillStyle = Colors.dottedRing; + var angleStep = Math.PI * 2.0 / dotcount; + for (var angle = 0; angle <= Math.PI * 2; angle += angleStep) { + var x = currentRadius * Math.cos(angle); + var y = currentRadius * Math.sin(angle); + ctx.fillRect(centerX + x, centerY + y, 2, 2); + } + } + + // Draw speed and battery view bases + ctx.lineCap = "round"; + ctx.strokeStyle = Colors.dottedRing; + ctx.lineWidth = curvewidth; + ctx.beginPath(); + ctx.arc(centerX, centerY, innerRadius, + UILayout.speedViewSpeedStart, UILayout.speedViewSpeedEnd); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(centerX, centerY, innerRadius, + UILayout.speedViewBatteryStart, UILayout.speedViewBatteryEnd, true); + ctx.stroke(); + + // Draw speed gradient + if (!showZero) { + var speedArcLength = UILayout.speedViewSpeedEnd - UILayout.speedViewSpeedStart; + var speedAngle = Math.min(UILayout.speedViewSpeedEnd, + UILayout.speedViewSpeedStart + speedArcLength * (datastore.speed / 60)); + var speedAngleX = Math.cos(speedAngle) * innerRadius; + var speedAngleY = Math.sin(speedAngle) * innerRadius; + var speedGradient = ctx.createLinearGradient(centerX, centerY + innerRadius, + centerX + speedAngleX, centerY + speedAngleY); + speedGradient.addColorStop(0.0, Colors.speedGradientStart); + speedGradient.addColorStop(1.0, Colors.speedGradientEnd); + ctx.strokeStyle = speedGradient; + ctx.beginPath(); + ctx.arc(centerX, centerY, innerRadius, + UILayout.speedViewSpeedStart, speedAngle); + ctx.stroke(); + } + + // Draw battery gradient + var batteryArcLength = UILayout.speedViewBatteryEnd - UILayout.speedViewBatteryStart; + var batteryAngle = Math.max(UILayout.speedViewBatteryEnd, + UILayout.speedViewBatteryStart + batteryArcLength * (datastore.batterylevel / 100)); + var batteryAngleX = Math.cos(batteryAngle) * innerRadius; + var batteryAngleY = Math.sin(batteryAngle) * innerRadius; + var batteryGradient = ctx.createLinearGradient(centerX, centerY + innerRadius, + centerX + batteryAngleX, centerY + batteryAngleY); + //centerX, centerY - innerRadius); + batteryGradient.addColorStop(0.0, Colors.batteryGradientStart); + batteryGradient.addColorStop(1.0, Colors.batteryGradientEnd); + ctx.strokeStyle = batteryGradient; + ctx.beginPath(); + ctx.arc(centerX, centerY, innerRadius, + UILayout.speedViewBatteryStart, batteryAngle, true); + ctx.stroke(); + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + if (enlarged) + enlarged = false + else if (swipeView.currentIndex === 1) + enlarged = true + else + speedView.showMain() + } + } +} diff --git a/basicsuite/ebike-ui/StatsBox.qml b/basicsuite/ebike-ui/StatsBox.qml new file mode 100644 index 0000000..76254db --- /dev/null +++ b/basicsuite/ebike-ui/StatsBox.qml @@ -0,0 +1,155 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import DataStore 1.0 + +import "./BikeStyle" + +// Top-left corner, stats +Item { + width: root.width * 0.425 + height: root.height * 0.45 + property real imageMargin: Math.min(width, height) * 0.3 + + Image { + id: tripIcon + width: Math.min(parent.width, parent.height) * 0.15 + height: width + source: "images/trip.png" + fillMode: Image.PreserveAspectFit + anchors { + left: parent.left + leftMargin: imageMargin + top: parent.top + topMargin: imageMargin + } + } + + Text { + id: tripText + color: Colors.distanceText + anchors { + bottom: tripIcon.verticalCenter + bottomMargin: -imageMargin * 0.05 + left: tripIcon.right + } + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: parent.height * 0.1 + } + text: datastore.trip.toFixed(1) + verticalAlignment: Text.AlignBottom + } + + Text { + id: tripUnitText + color: Colors.distanceUnit + anchors { + top: tripText.bottom + left: tripIcon.right + } + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.065 + } + verticalAlignment: Text.AlignTop + text: datastore.unit === DataStore.Kmh ? "km" : "mi." + } + + Image { + id: calIcon + width: Math.min(parent.width, parent.height) * 0.15 + height: width + source: "images/calories.png" + anchors { + left: parent.left + leftMargin: imageMargin + top: tripIcon.bottom + topMargin: imageMargin * 0.25 + } + } + + Text { + id: calText + color: Colors.distanceText + anchors { + bottom: calIcon.verticalCenter + bottomMargin: -imageMargin * 0.05 + left: calIcon.right + } + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: parent.height * 0.1 + } + text: datastore.calories.toFixed(0) + } + + Text { + id: calUnitText + color: Colors.distanceUnit + anchors { + top: calText.bottom + left: calIcon.right + } + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.065 + } + text: "kcal" + } + + Rectangle { + width: parent.width * 0.775 + height: UILayout.horizontalViewSeparatorHeight + anchors.bottom: parent.bottom + anchors.left: parent.left + color: Colors.separator + } + + Rectangle { + width: UILayout.verticalViewSeparatorWidth + height: parent.height * 0.475 + anchors.top: parent.top + anchors.right: parent.right + color: Colors.separator + } +} diff --git a/basicsuite/ebike-ui/StatsPage.qml b/basicsuite/ebike-ui/StatsPage.qml new file mode 100644 index 0000000..2b3d418 --- /dev/null +++ b/basicsuite/ebike-ui/StatsPage.qml @@ -0,0 +1,318 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import QtCharts 2.2 +import DataStore 1.0 + +import "./BikeStyle" +import "moment.js" as Moment + +Page { + id: statsPage + background: Rectangle { + color: Colors.mainBackground + } + + // Function for pretty-printing duration + function splitDuration(duration) { + var hours = Math.floor(duration / 3600); + var minutes = Math.floor((duration % 3600) / 60); + var seconds = Math.floor(duration % 60); + if (minutes < 10) + minutes = "0" + minutes; + return hours + ":" + minutes; + } + + function timestampToReadable(timestamp) { + return moment.unix(timestamp).calendar(); + } + + // On new trip data (save clicked), switch index to new trip + Connections { + target: tripdata + onTripDataSaved: tripView.setCurrentIndex(index) + } + + RoundButton { + id: endTrip + width: UILayout.statsEndtripWidth + height: UILayout.statsEndtripHeight + radius: height / 2 + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: UILayout.statsEndtripMargin + } + + background: Rectangle { + anchors.fill: parent + color: parent.down ? Colors.statsButtonPressed : "transparent" + radius: parent.radius + border.color: Colors.statsButtonActive + border.width: parent.down ? 0 : 1 + } + + contentItem: Text { + color: Colors.statsButtonActiveText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: qsTr("END TRIP") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.statsEndtripTextSize + } + } + visible: tripView.currentIndex === 0 + onClicked: tripdata.endTrip() + } + + Text { + id: tripDateText + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: parent.top + verticalCenterOffset: UILayout.statsEndtripMargin + UILayout.statsEndtripHeight / 2 + } + color: Colors.statsButtonActiveText + text: qsTr("YESTERDAY") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.statsEndtripTextSize + } + visible: tripView.currentIndex > 0 + } + + RoundButton { + id: previousChart + width: UILayout.statsTripButtonWidth + height: UILayout.statsTripButtonHeight + radius: height / 2 + anchors { + left: parent.left + top: endTrip.top + leftMargin: UILayout.statsTripButtonMarginSide + } + enabled: tripView.currentIndex > 0 + + background: Rectangle { + anchors.fill: parent + color: parent.down ? Colors.statsButtonPressed : "transparent" + radius: parent.radius + border.color: enabled ? Colors.statsButtonActive : Colors.statsButtonInactive + border.width: parent.down ? 0 : 1 + } + + contentItem: Item {} + Image { + anchors.centerIn: parent + source: "images/arrow_left.png" + opacity: parent.enabled ? 1.0 : 0.3 + } + + onClicked: tripView.decrementCurrentIndex() + } + + RoundButton { + id: nextChart + width: UILayout.statsTripButtonWidth + height: UILayout.statsTripButtonHeight + radius: height / 2 + anchors { + right: parent.right + top: endTrip.top + rightMargin: UILayout.statsTripButtonMarginSide + } + enabled: tripView.currentIndex < tripView.count - 1 + + background: Rectangle { + anchors.fill: parent + color: parent.down ? Colors.statsButtonPressed : "transparent" + radius: parent.radius + border.color: enabled ? Colors.statsButtonActive : Colors.statsButtonInactive + border.width: parent.down ? 0 : 1 + } + + contentItem: Item {} + Image { + anchors.centerIn: parent + source: "images/arrow_right.png" + opacity: parent.enabled ? 1.0 : 0.3 + } + + onClicked: tripView.incrementCurrentIndex() + } + + // Odometer + Rectangle { + color: "transparent" + border.color: "red" + width: odometerText.width + odometerUnit.width + odometerDescription.width + 2 * 4 + anchors { + right: parent.right + bottom: parent.top + rightMargin: UILayout.statsOdometerMarginRight + bottomMargin: -UILayout.statsOdometerBaselineOffset + } + + Text { + id: odometerDescription + anchors.right: odometerText.left + anchors.rightMargin: 4 + anchors.baseline: parent.bottom + color: Colors.statsDescriptionText + text: qsTr("Total") + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: root.height * 0.035 + } + } + + Text { + id: odometerText + anchors.right: odometerUnit.left + anchors.rightMargin: 4 + anchors.baseline: parent.bottom + color: Colors.statsValueText + text: datastore.odometer.toFixed(1) + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: root.height * 0.035 + } + } + + Text { + id: odometerUnit + anchors.right: parent.right + anchors.baseline: parent.bottom + color: Colors.statsDescriptionText + text: datastore.unit === DataStore.Kmh ? qsTr("km") : qsTr("mi.") + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: root.height * 0.035 + } + } + } + + SwipeView { + id: tripView + anchors { + left: parent.left + right: parent.right + top: endTrip.bottom + leftMargin: root.width * 0.025 + rightMargin: root.width * 0.025 + topMargin: UILayout.statsTopMargin + } + height: root.height * 0.2 + // Hide any excess content, since we are using margins + clip: true + + // Load data on first show + Component.onCompleted: tripdata.refresh() + + onCurrentIndexChanged: tripDateText.text = timestampToReadable(tripdata.get(currentIndex).starttime) + + Repeater { + model: tripdata + + Column { + width: tripView.width + height: tripView.height + + ColumnSpacer { + color: Colors.statsSeparator + } + + StatsRow { + leftTitle: qsTr("Duration (h:m)") + leftValue: splitDuration(duration) + rightTitle: datastore.unit === DataStore.Kmh ? qsTr("Max. speed (km/h)") : qsTr("Max. speed (mph)") + rightValue: maxspeed.toFixed(1) + } + + ColumnSpacer { + color: Colors.statsSeparator + } + + StatsRow { + leftTitle: datastore.unit === DataStore.Kmh ? qsTr("Distance (km)") : qsTr("Distance (mi.)") + leftValue: distance.toFixed(1) + rightTitle: datastore.unit === DataStore.Kmh ? qsTr("Avg. speed (km/h)") : qsTr("Avg. speed (mph)") + rightValue: avgspeed.toFixed(1) + } + + ColumnSpacer { + color: Colors.statsSeparator + } + + StatsRow { + leftTitle: qsTr("Calories (kcal)") + leftValue: calories.toFixed(1) + rightTitle: qsTr("Ascent (m)") + rightValue: ascent.toFixed(1) + } + + ColumnSpacer { + color: Colors.statsSeparator + } + } + } + } + + TripChart { + id: tripChart + anchors { + bottom: parent.bottom + right: parent.right + bottomMargin: root.height * 0.0125 + rightMargin: root.width * 0.02 + top: tripView.bottom + left: parent.left + leftMargin: root.width * 0.175 + } + animationRunning: tripView.currentIndex === 0 + tripDetails: tripdata.get(currentIndex) + currentIndex: tripView.currentIndex + visible: swipeView.currentIndex === 0 + } +} diff --git a/basicsuite/ebike-ui/StatsRow.qml b/basicsuite/ebike-ui/StatsRow.qml new file mode 100644 index 0000000..fe49d68 --- /dev/null +++ b/basicsuite/ebike-ui/StatsRow.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 + +import "./BikeStyle" + +Item { + property string leftTitle + property string leftValue + property string rightTitle + property string rightValue + height: parent.height / 3 + width: parent.width + property int rowTextSize: height * 0.5 + + Text { + text: leftTitle + anchors.left: parent.left + height: parent.height + color: Colors.statsDescriptionText + verticalAlignment: Text.AlignVCenter + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: rowTextSize + } + } + + Text { + text: leftValue + anchors.right: parent.horizontalCenter + anchors.rightMargin: parent.width * 0.0125 + height: parent.height + color: Colors.statsValueText + verticalAlignment: Text.AlignVCenter + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: rowTextSize + } + } + + Text { + text: rightTitle + anchors.left: parent.horizontalCenter + anchors.leftMargin: parent.width * 0.0125 + height: parent.height + color: Colors.statsDescriptionText + verticalAlignment: Text.AlignVCenter + font { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: rowTextSize + } + } + + Text { + text: rightValue + anchors.right: parent.right + height: parent.height + color: Colors.statsValueText + verticalAlignment: Text.AlignVCenter + font { + family: "Montserrat, Bold" + weight: Font.Bold + pixelSize: rowTextSize + } + } +} diff --git a/basicsuite/ebike-ui/ToggleSwitch.qml b/basicsuite/ebike-ui/ToggleSwitch.qml new file mode 100644 index 0000000..94af651 --- /dev/null +++ b/basicsuite/ebike-ui/ToggleSwitch.qml @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 + +import "./BikeStyle" + +Switch { + id: control + + implicitWidth: indicator.implicitWidth + implicitHeight: indicator.implicitHeight + + indicator: Rectangle { + implicitWidth: UILayout.switchWidth + implicitHeight: UILayout.switchHeight + radius: height / 2 + y: parent.height / 2 - height / 2 + color: control.checked ? Colors.switchBackgroundOn : Colors.switchBackgroundOff + + Rectangle { + x: control.checked ? parent.width - width : 0 + y: UILayout.switchHeight / 2 - UILayout.switchIndicatorRadius + width: 2 * UILayout.switchIndicatorRadius + height: 2 * UILayout.switchIndicatorRadius + radius: UILayout.switchIndicatorRadius + color: control.checked ? Colors.switchOn : Colors.switchOff + } + } + + contentItem: Text {} +} diff --git a/basicsuite/ebike-ui/TripChart.qml b/basicsuite/ebike-ui/TripChart.qml new file mode 100644 index 0000000..0bc3a7d --- /dev/null +++ b/basicsuite/ebike-ui/TripChart.qml @@ -0,0 +1,236 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtCharts 2.2 +import DataStore 1.0 + +import "./BikeStyle" + +ChartView { + property var exampleTrips: [ + [[0, 0], [15, 250], [30, 0], [30, 0], [25, 450], [20, 400], [10, 200], [10, 200], [20, 350], [20, 300], [10, 200], [10, 100], [10, 100], [10, 175], [10, 150], [15, 200], [15, 250], [10, 200], [15, 250], [0, 0]], + [[0, 0], [5, 100], [10, 200], [10, 200], [10, 150], [15, 250], [15, 275], [15, 200], [20, 350], [5, 50], [15, 200], [15, 250], [15, 225], [20, 300], [25, 425], [25, 400], [15, 200], [8, 125], [10, 175], [0, 0]], + [[0, 0], [20, 375], [15, 250], [15, 300], [15, 275], [0, 0], [10, 200], [10, 100], [10, 100], [15, 250], [10, 200], [10, 100], [10, 100], [8, 100], [25, 50], [15, 200], [15, 250], [10, 200], [8, 100], [0, 0]], + [[0, 0], [15, 300], [15, 200], [15, 250], [10, 450], [20, 375], [20, 350], [20, 250], [15, 200], [15, 225], [8, 150], [8, 100], [8, 125], [8, 100], [10, 150], [15, 200], [15, 250], [20, 300], [15, 250], [0, 0]] + ] + property bool animationRunning: false + property int currentIndex + property var tripDetails + + id: tripChart + antialiasing: true + backgroundColor: "transparent" + backgroundRoundness: 0 + title: "" + legend { + markerShape: Legend.MarkerShapeCircle + reverseMarkers: true + labelColor: "#ffffff" + font { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.025 + } + } + + margins { + top: 0 + bottom: 0 + left: 0 + right: 0 + } + + // X-axis is a timestamp value + DateTimeAxis { + id: axisX + format: Qt.locale("en_US").timeFormat(Locale.ShortFormat) + tickCount: 3 + // No grid and no line + gridVisible: false + lineVisible: false + titleVisible: false + labelsColor: Colors.chartTimeLabel + labelsFont { + family: "Montserrat, Light" + weight: Font.Light + pixelSize: parent.height * 0.02 + } + } + + ValueAxis { + id: speedAxis + min: 0 + max: 50 + gridLineColor: Colors.chartGridLine + labelsColor: Colors.chartSpeed + labelsFont { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.0225 + } + titleVisible: false + lineVisible: false + labelFormat: "%.0f" + } + + ValueAxis { + id: assistAxis + min: 0 + max: 500 + labelsColor: Colors.chartAssistpower + labelsFont { + family: "Montserrat, Regular" + weight: Font.Normal + pixelSize: parent.height * 0.0225 + } + titleVisible: false + lineVisible: false + gridVisible: false + labelFormat: "%.0f" + } + + SplineSeries { + id: assistSeries + name: qsTr("Pedal assist (W)") + + axisX: axisX + axisYRight: assistAxis + pointsVisible: true + } + + SplineSeries { + id: speedSeries + name: datastore.unit === DataStore.Kmh ? qsTr("Speed (km/h)") : qsTr("Speed (mph)") + + axisX: axisX + axisY: speedAxis + pointsVisible: true + } + + function updateTripGraph() { + if (currentIndex === 0 ) { + // Clear all current values (resets the graph) + speedSeries.removePoints(0, speedSeries.count); + assistSeries.removePoints(0, assistSeries.count); + } else if (currentIndex > 0) { + // Clear all current values + speedSeries.removePoints(0, speedSeries.count); + assistSeries.removePoints(0, assistSeries.count); + var seriesdata = exampleTrips[currentIndex % 4]; + + var now = tripDetails.starttime * 1000; + var duration = tripDetails.duration / seriesdata.length; + + axisX.min = new Date(now - 60000); + for (var i = 0; i < seriesdata.length; i++) { + speedSeries.append(now, seriesdata[i][0]); + assistSeries.append(now, seriesdata[i][1]); + now += duration * 1000; + } + now -= duration * 1000; + axisX.max = new Date(now + 60000); + } + } + + onTripDetailsChanged: updateTripGraph() + + onCurrentIndexChanged: updateTripGraph() + + // Make sure we have a proper value here + onAnimationRunningChanged: tripAnimationTimer.lastUpdate = new Date().getTime() + + Timer { + id: tripAnimationTimer + property real lastUpdate: new Date().getTime() + property int currentIndex: 0 + property var values: [[0, 0], + [10, 200], + [15, 250], + [15, 250], + [8, 150], + [5, 100], + [20, 400], + [20, 375], + [15, 275], + [15, 250], + [25, 450], + [15, 200], + [15, 200], + [10, 175], + [10, 150], + [5, 100], + [8, 125], + [10, 200], + [15, 250], + [0, 0]] + + // Animate only if visible on screen + running: animationRunning && (swipeView.currentIndex === 0) + repeat: true + interval: 200 + onTriggered: { + var now = new Date().getTime(); + // Load a few initial numbers if empty + if (speedSeries.count === 0) { + speedSeries.append(now, values[0][0]); + assistSeries.append(now, values[0][1]); + speedSeries.append(now + 5000, values[1][0]); + assistSeries.append(now + 5000, values[1][1]); + speedSeries.append(now + 10000, values[2][0]); + assistSeries.append(now + 10000, values[2][1]); + speedSeries.append(now + 15000, values[3][0]); + assistSeries.append(now + 15000, values[3][1]); + currentIndex = 4; + } + + if (now - lastUpdate > 5000) { + speedSeries.append(now + 15000, values[currentIndex][0]); + assistSeries.append(now + 15000, values[currentIndex][1]); + if (speedSeries.count > 17) + speedSeries.remove(0); + if (assistSeries.count > 17) + assistSeries.remove(0); + currentIndex += 1; + if (currentIndex == 20) + currentIndex = 0; + lastUpdate = now; + } + axisX.min = new Date(now - 50 * 1000); + axisX.max = new Date(now); + } + } +} diff --git a/basicsuite/ebike-ui/ViewTab.qml b/basicsuite/ebike-ui/ViewTab.qml new file mode 100644 index 0000000..8670b2a --- /dev/null +++ b/basicsuite/ebike-ui/ViewTab.qml @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +import "./BikeStyle" + +Item { + property alias musicPlayerSwitch: musicPlayerSwitch + + signal resetDemo + + Column { + anchors.left: parent.left + anchors.right: parent.right + + Text { + height: stackLayout.height * 0.225 + width: parent.width + text: qsTr("VIEW") + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: height * 0.375 + } + color: Colors.tabTitleColor + verticalAlignment: Text.AlignVCenter + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Show FPS") + + ToggleSwitch { + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + checked: fps.visible + onCheckedChanged: fps.visible = checked + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Audio controls") + + ToggleSwitch { + id: musicPlayerSwitch + anchors { + top: parent.top + bottom: parent.bottom + right: parent.right + } + checked: false + onCheckedChanged: musicPlayer.state = (checked ? "" : "hidden") + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + + ConfigurationItem { + description: qsTr("Reset demo") + + RoundButton { + id: resetButton + height: parent.height * 0.6 + width: height + mphText.implicitWidth + radius: height / 2 + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + } + + background: Rectangle { + anchors.fill: parent + color: parent.down ? Colors.statsButtonPressed : "transparent" + radius: parent.radius + border.color: Colors.statsButtonActive + border.width: parent.down ? 0 : 1 + } + + contentItem: Text { + id: mphText + text: "RESET DEMO" + font { + family: "Montserrat, Medium" + weight: Font.Medium + pixelSize: UILayout.unitFontSize + } + color: Colors.statsButtonActiveText + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + onClicked: resetDemo() + } + } + + ColumnSpacer { + color: Colors.tabItemBorder + } + } +} diff --git a/basicsuite/ebike-ui/app.pro b/basicsuite/ebike-ui/app.pro new file mode 100644 index 0000000..d7094dc --- /dev/null +++ b/basicsuite/ebike-ui/app.pro @@ -0,0 +1,140 @@ +QT += quick +CONFIG += c++11 +TARGET = ebike + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +include(../shared/shared.pri) +b2qtdemo_deploy_defaults() + +content.files = \ + qtquickcontrols2.conf \ + main.qml \ + NaviPage.qml \ + StatsPage.qml \ + MainPage.qml \ + SpeedView.qml \ + StatsBox.qml \ + NaviBox.qml \ + LightsBox.qml \ + ModeBox.qml \ + ClockView.qml \ + MusicPlayer.qml \ + ConfigurationDrawer.qml \ + IconifiedTabButton.qml \ + GeneralTab.qml \ + ColumnSpacer.qml \ + BikeInfoTab.qml \ + TripChart.qml \ + FpsItem.qml \ + NaviGuide.qml \ + NaviTripInfo.qml \ + ViewTab.qml \ + moment.js \ + StatsRow.qml \ + ConfigurationItem.qml \ + NaviButton.qml \ + ToggleSwitch.qml \ + mostrecent.bson + +content.path = $$DESTPATH + +style.files = \ + BikeStyle/Colors.qml \ + BikeStyle/qmldir \ + BikeStyle/UILayout.qml + + +images.files = \ + images/lights_off.png \ + images/lights_on.png \ + images/map-marker.png \ + images/trip.png \ + images/calories.png \ + images/nextsong.png \ + images/nextsong_pressed.png \ + images/play.png \ + images/play_pressed.png \ + images/prevsong.png \ + images/prevsong_pressed.png \ + images/speed.png \ + images/battery.png \ + images/assist.png \ + images/arrow_left.png \ + images/top_curtain_drag.png \ + images/spinner.png \ + images/checkmark.png \ + images/nav_left.png \ + images/nav_right.png \ + images/nav_straight.png \ + images/small_speedometer_arrow.png \ + images/map_locate.png \ + images/map_zoomin.png \ + images/map_zoomout.png \ + images/info.png \ + images/info_selected.png \ + images/list.png \ + images/list_selected.png \ + images/settings.png \ + images/settings_selected.png \ + images/curtain_up_arrow.png \ + images/search.png \ + images/search_cancel.png \ + images/fps_icon.png \ + images/arrow_right.png \ + images/curtain_shadow_handle.png \ + images/map_btn_shadow.png \ + images/map_destination.png \ + images/map_location_arrow.png \ + images/small_speedometer_shadow.png \ + images/navigation_widget_shadow.png \ + images/small_input_box_shadow.png \ + images/nav_bear_l.png \ + images/nav_bear_r.png \ + images/nav_hard_l.png \ + images/nav_hard_r.png \ + images/nav_light_left.png \ + images/nav_light_right.png \ + images/nav_nodir.png \ + images/nav_uturn_l.png \ + images/nav_uturn_r.png \ + images/pause.png \ + images/pause_pressed.png \ + images/ok.png \ + images/warning.png \ + images/bike-battery.png \ + images/bike-brakes.png \ + images/bike-chain.png \ + images/bike-frontwheel.png \ + images/bike-gears.png \ + images/bike-rearwheel.png \ + images/bike-light.png \ + images/blue_circle_gps_area.png + +OTHER_FILES += $${images.files} +INSTALLS += images +images.path = $$DESTPATH/images +export(images.files) +export(images.path) + +OTHER_FILES += $${style.files} +INSTALLS += style +style.path = $$DESTPATH/BikeStyle +export(style.files) +export(style.path) +export(OTHER_FILES) +export(INSTALLS) + + +OTHER_FILES += $${content.files} + +INSTALLS += target content diff --git a/basicsuite/ebike-ui/brightnesscontroller.cpp b/basicsuite/ebike-ui/brightnesscontroller.cpp new file mode 100644 index 0000000..a6e2e30 --- /dev/null +++ b/basicsuite/ebike-ui/brightnesscontroller.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "brightnesscontroller.h" + +static const char brightnessSource[] = "/sys/class/backlight/backlight/brightness"; +static const int brightnessMax = 6; +static const int brightnessMin = 1; + +BrightnessController::BrightnessController(QObject *parent) + : QObject(parent) + , m_automatic(false) +{ + QFile brightnessfile(brightnessSource); + if (brightnessfile.exists() && brightnessfile.open(QIODevice::ReadOnly)) { + char data[1]; + if (brightnessfile.read(data, 1)) { + m_brightness = static_cast(data[0] - '0'); + } + } else { + // By default set to half + m_brightness = (brightnessMax + brightnessMin) / 2; + } +} + +void BrightnessController::setBrightness(int brightness) +{ + if (m_brightness == brightness) + return; + + // Valid values are between 1-6 + if (brightness < brightnessMin || brightness > brightnessMax) + return; + + QFile brightnessfile(brightnessSource); + if (brightnessfile.exists() && brightnessfile.open(QIODevice::WriteOnly)) { + char data[1] = {static_cast('0' + brightness)}; + if (brightnessfile.write(data, 1) == 1) { + m_brightness = brightness; + emit brightnessChanged(m_brightness); + } + } else { + // File does not exists, simulate changes + m_brightness = brightness; + emit brightnessChanged(m_brightness); + } +} + +void BrightnessController::setAutomatic(bool automatic) +{ + if (m_automatic == automatic) + return; + + m_automatic = automatic; + emit automaticChanged(m_automatic); +} diff --git a/basicsuite/ebike-ui/brightnesscontroller.h b/basicsuite/ebike-ui/brightnesscontroller.h new file mode 100644 index 0000000..7b85f58 --- /dev/null +++ b/basicsuite/ebike-ui/brightnesscontroller.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef BRIGHTNESSCONTROLLER_H +#define BRIGHTNESSCONTROLLER_H + +#include + +class BrightnessController : public QObject +{ + Q_OBJECT + Q_PROPERTY(int brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged) + Q_PROPERTY(bool automatic READ automatic WRITE setAutomatic NOTIFY automaticChanged) + +public: + explicit BrightnessController(QObject *parent = nullptr); + +public: + int brightness() const { return m_brightness; } + bool automatic() const { return m_automatic; } + + void setBrightness(int brightness); + void setAutomatic(bool automatic); + +signals: + void brightnessChanged(int brightness); + void automaticChanged(bool automatic); + +public slots: + +private: + int m_brightness; + bool m_automatic; +}; + +#endif // BRIGHTNESSCONTROLLER_H diff --git a/basicsuite/ebike-ui/datamodelplugin/datamodelplugin.pro b/basicsuite/ebike-ui/datamodelplugin/datamodelplugin.pro new file mode 100644 index 0000000..ce22eec --- /dev/null +++ b/basicsuite/ebike-ui/datamodelplugin/datamodelplugin.pro @@ -0,0 +1,39 @@ +TEMPLATE = lib +CONFIG += plugin +QT += qml quick positioning charts + +TARGET = ebikedatamodelplugin + +SOURCES += plugin.cpp \ + $$PWD/../socketclient.cpp \ + $$PWD/../datastore.cpp \ + $$PWD/../navigation.cpp \ + $$PWD/../mapboxsuggestions.cpp \ + $$PWD/../suggestionsmodel.cpp \ + $$PWD/../mapbox.cpp \ + $$PWD/../brightnesscontroller.cpp \ + $$PWD/../fpscounter.cpp \ + $$PWD/../tripdatamodel.cpp + +HEADERS += \ + $$PWD/../socketclient.h \ + $$PWD/../datastore.h \ + $$PWD/../navigation.h \ + $$PWD/../mapboxsuggestions.h \ + $$PWD/../suggestionsmodel.h \ + $$PWD/../mapbox.h \ + $$PWD/../brightnesscontroller.h \ + $$PWD/../fpscounter.h \ + $$PWD/../tripdatamodel.h + +INCLUDEPATH += $$PWD/../ + +pluginfiles.files += \ + qmldir \ + +B2QT_DEPLOYPATH = /data/user/qt/qmlplugins/DataStore +target.path += $$B2QT_DEPLOYPATH +pluginfiles.path += $$B2QT_DEPLOYPATH + +INSTALLS += target pluginfiles + diff --git a/basicsuite/ebike-ui/datamodelplugin/plugin.cpp b/basicsuite/ebike-ui/datamodelplugin/plugin.cpp new file mode 100644 index 0000000..098a6a8 --- /dev/null +++ b/basicsuite/ebike-ui/datamodelplugin/plugin.cpp @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +#include "datastore.h" +#include "tripdatamodel.h" +#include "navigation.h" +#include "mapbox.h" +#include "mapboxsuggestions.h" +#include "suggestionsmodel.h" +#include "brightnesscontroller.h" +#include "fpscounter.h" + +class QExampleQmlPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + + void registerTypes(const char *uri) + { + Q_UNUSED(uri); + qmlRegisterType("DataStore", 1, 0, "DataStore"); + } + + void initializeEngine(QQmlEngine *engine, const char *uri) + { + Q_UNUSED(uri); + + // Setup data store for connection to backend server + DataStore *datastore = new DataStore(engine); + datastore->connectToServer("datasocket"); + + // Setup mapbox and suggestions + MapBox *mapbox = new MapBox(engine); + MapBoxSuggestions *suggest = new MapBoxSuggestions(mapbox, engine); + + // Setup navigation container + Navigation *navi = new Navigation(mapbox, engine); + + // Brightness controller + BrightnessController *brightness = new BrightnessController(engine); + + // FPS counter + FpsCounter *fps = new FpsCounter(engine); + + QQmlContext *context = engine->rootContext(); + context->setContextProperty("datastore", datastore); + context->setContextProperty("tripdata", datastore->tripDataModel()); + context->setContextProperty("navigation", navi); + context->setContextProperty("suggest", suggest); + context->setContextProperty("suggestions", suggest->suggestions()); + context->setContextProperty("brightness", brightness); + context->setContextProperty("fps", fps); + } +}; + + +#include "plugin.moc" diff --git a/basicsuite/ebike-ui/datamodelplugin/qmldir b/basicsuite/ebike-ui/datamodelplugin/qmldir new file mode 100644 index 0000000..3018d21 --- /dev/null +++ b/basicsuite/ebike-ui/datamodelplugin/qmldir @@ -0,0 +1,2 @@ +module DataStore +plugin ebikedatamodelplugin diff --git a/basicsuite/ebike-ui/datastore.cpp b/basicsuite/ebike-ui/datastore.cpp new file mode 100644 index 0000000..73567ac --- /dev/null +++ b/basicsuite/ebike-ui/datastore.cpp @@ -0,0 +1,300 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#include "socketclient.h" +#include "datastore.h" +#include "tripdatamodel.h" + +// Speed conversions from m/s to km/h and mph +static const double msToKmh = 3.6; +static const double msToMph = 2.2369418519393043; +// Distance conversions to and from m to km and mi +static const double mToKm = 0.001; +static const double mToMi = 0.000621371; +static const double kmToM = 1000.0; +static const double miToM = 1609.344; +static const double mToYd = 1760.0 / 1609.344; + +DataStore::DataStore(QObject *parent) + : QObject(parent) + , m_client(new SocketClient(this)) + , m_unit(Mph) + , m_trips(new TripDataModel(this, this)) +{ + connect(m_client, &SocketClient::connected, this, &DataStore::requestStatus); + connect(m_client, &SocketClient::newMessage, this, &DataStore::parseMessage); +} + +void DataStore::connectToServer(const QString &servername) +{ + m_client->connectToServer(servername); +} + +void DataStore::getTrips() +{ + m_client->sendToServer(QJsonObject{{"method", "gettrips"}}); +} + +void DataStore::endTrip() +{ + m_client->sendToServer(QJsonObject{{"method", "endtrip"}}); +} + +void DataStore::toggleMode() +{ + setMode(mode() == Cruise ? Sport : Cruise); +} + +void DataStore::resetDemo() +{ + m_client->sendToServer(QJsonObject{{"method", "reset"}}); +} + +double DataStore::speed() const +{ + return convertSpeed(m_properties.value("speed").toDouble()); +} + +double DataStore::topSpeed() const +{ + return convertSpeed(m_properties.value("topspeed").toDouble()); +} + +double DataStore::averageSpeed() const +{ + return convertSpeed(m_current.value("distance").toDouble() / m_current.value("duration").toDouble()); +} + +double DataStore::odometer() const +{ + return convertDistance(m_properties.value("odometer").toDouble()); +} + +double DataStore::trip() const +{ + return convertDistance(m_current.value("distance").toDouble()); +} + +double DataStore::calories() const +{ + return m_current.value("calories").toDouble(); +} + +double DataStore::assistDistance() const +{ + return convertDistance(m_properties.value("assistdistance").toDouble()); +} + +double DataStore::assistPower() const +{ + return m_properties.value("assistpower").toDouble(); +} + +double DataStore::batteryLevel() const +{ + return m_properties.value("batterylevel").toDouble(); +} + +bool DataStore::lights() const +{ + return m_properties.value("lights").toBool(); +} + +DataStore::Mode DataStore::mode() const +{ + return static_cast(m_properties.value("mode").toInt()); +} + +DataStore::Unit DataStore::unit() const +{ + return m_unit; +} + +int DataStore::arrow() const +{ + return m_properties.value("arrow").toInt(); +} + +double DataStore::legDistance() const +{ + return m_properties.value("legdistance").toDouble(); +} + +double DataStore::tripRemaining() const +{ + return m_properties.value("tripremaining").toDouble(); +} + +QString DataStore::smallUnit() const +{ + return m_unit == Kmh ? "m" : "yd"; +} + +void DataStore::setLights(bool lights) +{ + if (m_properties.value("lights").toBool() == lights) + return; + + m_properties.insert("lights", lights); + m_client->sendToServer(QJsonObject{{"method", "set"}, {"key", "lights"}, {"value", lights}}); + emit lightsChanged(); +} + +void DataStore::setMode(Mode mode) +{ + if (DataStore::mode() == mode) + return; + + m_properties.insert("mode", mode); + m_client->sendToServer(QJsonObject{{"method", "set"}, {"key", "mode"}, {"value", static_cast(mode)}}); + emit modeChanged(); +} + +void DataStore::setUnit(DataStore::Unit unit) +{ + if (m_unit == unit) + return; + + m_unit = unit; + emit unitChanged(); + // Also emit all the other signals that are affected by mode change + emit speedChanged(); + emit averagespeedChanged(); + emit odometerChanged(); + emit tripChanged(); + emit assistdistanceChanged(); + emit smallUnitChanged(smallUnit()); +} + +double DataStore::convertSpeed(double speed) const +{ + return speed * (m_unit == Kmh ? msToKmh : msToMph); +} + +double DataStore::convertDistance(double distance) const +{ + return distance * (m_unit == Kmh ? mToKm : mToMi); +} + +double DataStore::convertSmallDistance(double distance) const +{ + return distance * (m_unit == Kmh ? 1.0 : mToYd); +} + +QString DataStore::getSmallUnit() const +{ + return m_unit == Kmh ? "m" : "yd"; +} + +QJsonObject DataStore::splitDistance(double distance, bool round) const +{ + if (m_unit == Kmh) { + if (distance >= kmToM) + return QJsonObject{{"value", distance * mToKm}, {"unit", "km"}, {"decimal", true}}; + else { + if (round) + distance = qRound(distance / 10) * 10; + return QJsonObject{{"value", distance}, {"unit", "m"}, {"decimal", false}}; + } + } else { + if (distance >= miToM) + return QJsonObject{{"value", distance * mToMi}, {"unit", "mi."}, {"decimal", true}}; + else { + distance *= mToYd; + if (round) + distance = qRound(distance / 10) * 10; + return QJsonObject{{"value", distance}, {"unit", "yd"}, {"decimal", false}}; + } + } +} + +QJsonObject DataStore::splitDuration(double duration) const +{ + if (duration >= 60.0) + return QJsonObject{{"value", duration / 60.0}, {"unit", "min"}}; + else + return QJsonObject{{"value", duration}, {"unit", "s"}}; +} + +void DataStore::requestStatus() +{ + m_client->sendToServer(QJsonObject{{"method", "getall"}}); +} + +void DataStore::emitByName(const QString &valuename) +{ + // Use QMetaObject information to find a proper signal + const QMetaObject *meta = metaObject(); + + // Find the notifier signal + QString signalName = QString("%1Changed()").arg(valuename); + int methodIndex = meta->indexOfSignal(signalName.toLatin1().constData()); + meta->method(methodIndex).invoke(this, Qt::AutoConnection); +} + +void DataStore::parseMessage(const QJsonObject &message) +{ + QString method = message.value("method").toString(); + + // If we are updating just one, simply insert new value and emit + if (method == "updateone") { + QString key = message.value("key").toString(); + m_properties.insert(key, message.value("value")); + emitByName(key); + // If we are updating many, then iterate over the list and update each value + } else if (method == "updatemany") { + foreach (const QJsonValue &value, message.value("values").toArray()) { + QJsonObject obj = value.toObject(); + QString key = obj.value("key").toString(); + m_properties.insert(key, obj.value("value")); + emitByName(key); + } + } else if (method == "trips") { + m_trips->setTrips(message.value("trips").toArray()); + } else if (method == "trip") { + m_trips->addTrip(message.value("trip").toObject()); + } else if (method == "currenttrip") { + m_current = message.value("currenttrip").toObject(); + m_trips->setCurrentTrip(m_current); + emit currentTripChanged(); + } else if (method == "reset") { + emit demoReset(); + } +} diff --git a/basicsuite/ebike-ui/datastore.h b/basicsuite/ebike-ui/datastore.h new file mode 100644 index 0000000..20fa388 --- /dev/null +++ b/basicsuite/ebike-ui/datastore.h @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DATASTORE_H +#define DATASTORE_H + +#include +#include + +class SocketClient; +class TripDataModel; + +class DataStore: public QObject +{ + Q_OBJECT + + // Different measured properties + Q_PROPERTY(double speed READ speed NOTIFY speedChanged) + Q_PROPERTY(double topspeed READ topSpeed NOTIFY topspeedChanged) + Q_PROPERTY(double averagespeed READ averageSpeed NOTIFY currentTripChanged) + Q_PROPERTY(double odometer READ odometer NOTIFY odometerChanged) + Q_PROPERTY(double trip READ trip NOTIFY currentTripChanged) + Q_PROPERTY(double calories READ calories NOTIFY currentTripChanged) + Q_PROPERTY(double assistdistance READ assistDistance NOTIFY assistdistanceChanged) + Q_PROPERTY(double assistpower READ assistPower NOTIFY assistpowerChanged) + Q_PROPERTY(double batterylevel READ batteryLevel NOTIFY batterylevelChanged) + + // Toggles for lights and mode + Q_PROPERTY(bool lights READ lights WRITE setLights NOTIFY lightsChanged) + Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged) + + // Current units + Q_PROPERTY(Unit unit READ unit WRITE setUnit NOTIFY unitChanged) + Q_PROPERTY(QString smallUnit READ smallUnit NOTIFY smallUnitChanged) + + // Navigation + Q_PROPERTY(int arrow READ arrow NOTIFY arrowChanged) + Q_PROPERTY(double legdistance READ legDistance NOTIFY legdistanceChanged) + Q_PROPERTY(double tripremaining READ tripRemaining NOTIFY tripremainingChanged) + +public: + explicit DataStore(QObject *parent = nullptr); + + enum Mode { Cruise, Sport }; + Q_ENUM(Mode) + + enum Unit { Kmh, Mph }; + Q_ENUM(Unit) + +public: + // Getters + double speed() const; + double topSpeed() const; + double averageSpeed() const; + double odometer() const; + double trip() const; + double calories() const; + double assistDistance() const; + double assistPower() const; + double batteryLevel() const; + bool lights() const; + Mode mode() const; + Unit unit() const; + int arrow() const; + double legDistance() const; + double tripRemaining() const; + QString smallUnit() const; + + // Setters + void setLights(bool lights); + void setMode(Mode mode); + void setUnit(Unit unit); + + // Get trip data model + TripDataModel *tripDataModel() const { return m_trips; } + + // Convert speed and distance to proper units + Q_INVOKABLE double convertSpeed(double speed) const; + Q_INVOKABLE double convertDistance(double distance) const; + Q_INVOKABLE double convertSmallDistance(double distance) const; + Q_INVOKABLE QString getSmallUnit() const; + + // Split and convert distance and duration to value and unit + Q_INVOKABLE QJsonObject splitDistance(double distance, bool round=false) const; + Q_INVOKABLE QJsonObject splitDuration(double duration) const; + +private: + void emitByName(const QString &valuename); + +signals: + void speedChanged(); + void topspeedChanged(); + void averagespeedChanged(); + void odometerChanged(); + void tripChanged(); + void caloriesChanged(); + void assistdistanceChanged(); + void assistpowerChanged(); + void batterylevelChanged(); + void lightsChanged(); + void modeChanged(); + void unitChanged(); + void arrowChanged(); + void legdistanceChanged(); + void tripremainingChanged(); + void currentTripChanged(); + void smallUnitChanged(QString smallUnit); + void demoReset(); + +public slots: + void connectToServer(const QString &servername); + void getTrips(); + void endTrip(); + void toggleMode(); + void resetDemo(); + +private slots: + void requestStatus(); + void parseMessage(const QJsonObject &message); + +private: + SocketClient *m_client; + QJsonObject m_properties; + QJsonObject m_current; + Unit m_unit; + TripDataModel *m_trips; + int m_smallUnit; +}; + +#endif // DATASTORE_H diff --git a/basicsuite/ebike-ui/demo.xml b/basicsuite/ebike-ui/demo.xml new file mode 100644 index 0000000..884a65c --- /dev/null +++ b/basicsuite/ebike-ui/demo.xml @@ -0,0 +1,9 @@ + + + + +An E-bike instrument cluster concept designed and implemented by Qt. + +The entire concept is a testament that Qt brings the HMI designers and Software engineers together by using the same tools, allowing them to fast prototyping through collaborative workflow. In addition to that, Qt is optimized for running on low end SoC even the ones that don't have GPU acceleration for graphics. + + diff --git a/basicsuite/ebike-ui/ebike-ui.pro b/basicsuite/ebike-ui/ebike-ui.pro new file mode 100644 index 0000000..70443af --- /dev/null +++ b/basicsuite/ebike-ui/ebike-ui.pro @@ -0,0 +1,7 @@ +TEMPLATE = subdirs +CONFIG += ordered + +SUBDIRS += \ + datamodelplugin \ + app.pro + diff --git a/basicsuite/ebike-ui/ebike_en.ts b/basicsuite/ebike-ui/ebike_en.ts new file mode 100644 index 0000000..14679be --- /dev/null +++ b/basicsuite/ebike-ui/ebike_en.ts @@ -0,0 +1,290 @@ + + + + + BikeInfoTab + + + BIKE INFO + BIKE INFO + + + + Next maintenance + Next maintenance + + + + 15000 km + 15000 km + + + + 10000 mi. + 10000 mi. + + + + Battery health + Battery health + + + + Excellent + Excellent + + + + System Log + System Log + + + + ConfigurationDrawer + + LIST + LIST + + + TBD + TBD + + + + GeneralTab + + + GENERAL + GENERAL + + + + Language + Language + + + + English + English + + + + Brightness + Brightness + + + + Auto + Auto + + + + Units + Units + + + + ModeBox + + + SPORT + SPORT + + + + CRUISE + CRUISE + + + + MusicPlayer + + + Singer McSongface - Some really long title here + + + + + NaviPage + + + <i>Where do you want to go?</i> + <i>Where do you want to go?</i> + + + + SpeedView + + + km/h + km/h + + + + mph + mph + + + + AVG +km/h + AVG +km/h + + + + AVG +mph + AVG +mph + + + + km +assist +left + km +assist +left + + + + mi. +assist +left + mi. +assist +left + + + + StatsPage + + + END TRIP + END TRIP + + + + YESTERDAY + YESTERDAY + + + + Total + Total + + + + km + km + + + + mi. + mi. + + + + Duration (h:m) + Duration (h:m) + + + + Max. speed (km/h) + Max. speed (km/h) + + + + Max. speed (mph) + Max. speed (mph) + + + + Distance (km) + Distance (km) + + + + Distance (mi.) + Distance (mi.) + + + + Avg. speed (km/h) + Avg. speed (km/h) + + + + Avg. speed (mph) + Avg. speed (mph) + + + + Calories (kcal) + Calories (kcal) + + + + Ascent (m) + Ascent (m) + + + + SuggestionsModel + + + Place + Place + + + + TripChart + + + Speed (km/h) + Speed (km/h) + + + + Speed (mph) + Speed (mph) + + + + Pedal assist (W) + Pedal assist (W) + + + + ViewTab + + + VIEW + VIEW + + + + Show FPS + Show FPS + + + + Audio controls + Audio controls + + + + TBD + TBD + + + + mainview + + + Qt eBike + Qt eBike + + + diff --git a/basicsuite/ebike-ui/ebike_fi.ts b/basicsuite/ebike-ui/ebike_fi.ts new file mode 100644 index 0000000..9601fc7 --- /dev/null +++ b/basicsuite/ebike-ui/ebike_fi.ts @@ -0,0 +1,290 @@ + + + + + BikeInfoTab + + + BIKE INFO + PYÖRÄN TIEDOT + + + + Next maintenance + Seuraava huolto + + + + 15000 km + 15000 km + + + + 10000 mi. + 10000 mi. + + + + Battery health + Akun tila + + + + Excellent + Loistava + + + + System Log + Järjestelmälogi + + + + ConfigurationDrawer + + LIST + LISTA + + + TBD + MYÖH + + + + GeneralTab + + + GENERAL + YLEINEN + + + + Language + Kieli + + + + English + englanti + + + + Brightness + Kirkkaus + + + + Auto + Auto + + + + Units + Yksiköt + + + + ModeBox + + + SPORT + SPORT + + + + CRUISE + CRUISE + + + + MusicPlayer + + + Singer McSongface - Some really long title here + + + + + NaviPage + + + <i>Where do you want to go?</i> + <i>Mihin haluat mennä?</i> + + + + SpeedView + + + km/h + km/h + + + + mph + mph + + + + AVG +km/h + KESK +km/h + + + + AVG +mph + KESK +mph + + + + km +assist +left + km +avustus +jäljellä + + + + mi. +assist +left + mi. +avustus +jäljellä + + + + StatsPage + + + END TRIP + LOPETA MATKA + + + + YESTERDAY + EILEN + + + + Total + Yhteensä + + + + km + km + + + + mi. + mi. + + + + Duration (h:m) + Kesto (h:m) + + + + Max. speed (km/h) + Huippunopeus (km/h) + + + + Max. speed (mph) + Huippunopeus (mph) + + + + Distance (km) + Etäisyys (km) + + + + Distance (mi.) + Etäisyys (mi.) + + + + Avg. speed (km/h) + Keskinopeus (km/h) + + + + Avg. speed (mph) + Keskinopeus (mph) + + + + Calories (kcal) + Kalorit (kcal) + + + + Ascent (m) + Nousu (m) + + + + SuggestionsModel + + + Place + Paikka + + + + TripChart + + + Speed (km/h) + Nopeus (km/h) + + + + Speed (mph) + Nopeus (mph) + + + + Pedal assist (W) + Avustusteho (W) + + + + ViewTab + + + VIEW + NÄYTÄ + + + + Show FPS + Näytä FPS + + + + Audio controls + Musiikkisoitin + + + + TBD + MYÖH + + + + mainview + + + Qt eBike + Qt eBike + + + diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Black.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Black.ttf new file mode 100644 index 0000000..bf5443c Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Black.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-BlackItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-BlackItalic.ttf new file mode 100644 index 0000000..3eee3a7 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-BlackItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Bold.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Bold.ttf new file mode 100644 index 0000000..8e9a5f3 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Bold.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-BoldItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-BoldItalic.ttf new file mode 100644 index 0000000..2c33630 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-BoldItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-ExtraBold.ttf b/basicsuite/ebike-ui/fonts/Montserrat-ExtraBold.ttf new file mode 100644 index 0000000..1e3692d Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-ExtraBold.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-ExtraBoldItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-ExtraBoldItalic.ttf new file mode 100644 index 0000000..5f6c382 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-ExtraBoldItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-ExtraLight.ttf b/basicsuite/ebike-ui/fonts/Montserrat-ExtraLight.ttf new file mode 100644 index 0000000..7490dc7 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-ExtraLight.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-ExtraLightItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-ExtraLightItalic.ttf new file mode 100644 index 0000000..24e1354 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-ExtraLightItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Italic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Italic.ttf new file mode 100644 index 0000000..c5a36e5 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Italic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Light.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Light.ttf new file mode 100644 index 0000000..e66dc5b Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Light.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-LightItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-LightItalic.ttf new file mode 100644 index 0000000..b78b8b7 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-LightItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Medium.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Medium.ttf new file mode 100644 index 0000000..88d70b8 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Medium.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-MediumItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-MediumItalic.ttf new file mode 100644 index 0000000..225fd18 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-MediumItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Regular.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Regular.ttf new file mode 100644 index 0000000..626355a Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Regular.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-SemiBold.ttf b/basicsuite/ebike-ui/fonts/Montserrat-SemiBold.ttf new file mode 100644 index 0000000..6157045 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-SemiBold.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-SemiBoldItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-SemiBoldItalic.ttf new file mode 100644 index 0000000..c6dd977 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-SemiBoldItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-Thin.ttf b/basicsuite/ebike-ui/fonts/Montserrat-Thin.ttf new file mode 100644 index 0000000..dc16a02 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-Thin.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Montserrat-ThinItalic.ttf b/basicsuite/ebike-ui/fonts/Montserrat-ThinItalic.ttf new file mode 100644 index 0000000..b9e12f4 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Montserrat-ThinItalic.ttf differ diff --git a/basicsuite/ebike-ui/fonts/OFL.txt b/basicsuite/ebike-ui/fonts/OFL.txt new file mode 100644 index 0000000..74605df --- /dev/null +++ b/basicsuite/ebike-ui/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/basicsuite/ebike-ui/fonts/Teko-Bold.ttf b/basicsuite/ebike-ui/fonts/Teko-Bold.ttf new file mode 100644 index 0000000..d061824 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Teko-Bold.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Teko-Light.ttf b/basicsuite/ebike-ui/fonts/Teko-Light.ttf new file mode 100644 index 0000000..ec5194a Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Teko-Light.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Teko-Medium.ttf b/basicsuite/ebike-ui/fonts/Teko-Medium.ttf new file mode 100644 index 0000000..cc38086 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Teko-Medium.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Teko-Regular.ttf b/basicsuite/ebike-ui/fonts/Teko-Regular.ttf new file mode 100644 index 0000000..3161e63 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Teko-Regular.ttf differ diff --git a/basicsuite/ebike-ui/fonts/Teko-SemiBold.ttf b/basicsuite/ebike-ui/fonts/Teko-SemiBold.ttf new file mode 100644 index 0000000..bc17e5a Binary files /dev/null and b/basicsuite/ebike-ui/fonts/Teko-SemiBold.ttf differ diff --git a/basicsuite/ebike-ui/fonts/fontawesome-webfont.ttf b/basicsuite/ebike-ui/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/basicsuite/ebike-ui/fonts/fontawesome-webfont.ttf differ diff --git a/basicsuite/ebike-ui/fpscounter.cpp b/basicsuite/ebike-ui/fpscounter.cpp new file mode 100644 index 0000000..137dcb4 --- /dev/null +++ b/basicsuite/ebike-ui/fpscounter.cpp @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "fpscounter.h" + +FpsCounter::FpsCounter(QObject *parent) + : QObject(parent) + , m_frameCounter(0) + , m_fps(0.0) + , m_visible(false) +{ +} + +void FpsCounter::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + m_visible = visible; + emit visibleChanged(m_visible); +} + +void FpsCounter::setWindow(QQuickWindow *window) +{ + connect(window, &QQuickWindow::frameSwapped, this, &FpsCounter::frameUpdated); + startTimer(1000); + m_timer.start(); +} + +void FpsCounter::timerEvent(QTimerEvent *) +{ + // Calculate new FPS + qreal newfps = qRound(m_frameCounter * 1000.0 / m_timer.elapsed()); + m_frameCounter = 0; + m_timer.start(); + + // If there is no change, do nothing + if (qFuzzyCompare(m_fps, newfps)) + return; + + // Otherwise emit new fps + m_fps = newfps; + emit fpsChanged(m_fps); +} diff --git a/basicsuite/ebike-ui/fpscounter.h b/basicsuite/ebike-ui/fpscounter.h new file mode 100644 index 0000000..7828844 --- /dev/null +++ b/basicsuite/ebike-ui/fpscounter.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef FPSCOUNTER_H +#define FPSCOUNTER_H + +#include +#include + +class QQuickWindow; + +class FpsCounter : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal fps READ fps NOTIFY fpsChanged) + Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) + +public: + explicit FpsCounter(QObject *parent = nullptr); + +public: + qreal fps() const { return m_fps; } + bool visible() const { return m_visible; } + void setVisible(bool visible); + void setWindow(QQuickWindow *window); + +protected: + void timerEvent(QTimerEvent *); + +signals: + void fpsChanged(qreal fps); + void visibleChanged(bool visible); + +private slots: + void frameUpdated() { m_frameCounter++; } + +private: + QElapsedTimer m_timer; + int m_frameCounter; + qreal m_fps; + bool m_visible; +}; + +#endif // FPSCOUNTER_H diff --git a/basicsuite/ebike-ui/images/arrow_left.png b/basicsuite/ebike-ui/images/arrow_left.png new file mode 100644 index 0000000..6c67a2c Binary files /dev/null and b/basicsuite/ebike-ui/images/arrow_left.png differ diff --git a/basicsuite/ebike-ui/images/arrow_right.png b/basicsuite/ebike-ui/images/arrow_right.png new file mode 100644 index 0000000..b8cfb2e Binary files /dev/null and b/basicsuite/ebike-ui/images/arrow_right.png differ diff --git a/basicsuite/ebike-ui/images/assist.png b/basicsuite/ebike-ui/images/assist.png new file mode 100644 index 0000000..4a2bc95 Binary files /dev/null and b/basicsuite/ebike-ui/images/assist.png differ diff --git a/basicsuite/ebike-ui/images/battery.png b/basicsuite/ebike-ui/images/battery.png new file mode 100644 index 0000000..90280ca Binary files /dev/null and b/basicsuite/ebike-ui/images/battery.png differ diff --git a/basicsuite/ebike-ui/images/bike-battery.png b/basicsuite/ebike-ui/images/bike-battery.png new file mode 100644 index 0000000..e354d33 Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-battery.png differ diff --git a/basicsuite/ebike-ui/images/bike-brakes.png b/basicsuite/ebike-ui/images/bike-brakes.png new file mode 100644 index 0000000..c271d75 Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-brakes.png differ diff --git a/basicsuite/ebike-ui/images/bike-chain.png b/basicsuite/ebike-ui/images/bike-chain.png new file mode 100644 index 0000000..07879a4 Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-chain.png differ diff --git a/basicsuite/ebike-ui/images/bike-frontwheel.png b/basicsuite/ebike-ui/images/bike-frontwheel.png new file mode 100644 index 0000000..ab9297f Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-frontwheel.png differ diff --git a/basicsuite/ebike-ui/images/bike-gears.png b/basicsuite/ebike-ui/images/bike-gears.png new file mode 100644 index 0000000..c977644 Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-gears.png differ diff --git a/basicsuite/ebike-ui/images/bike-light.png b/basicsuite/ebike-ui/images/bike-light.png new file mode 100644 index 0000000..b18da3c Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-light.png differ diff --git a/basicsuite/ebike-ui/images/bike-rearwheel.png b/basicsuite/ebike-ui/images/bike-rearwheel.png new file mode 100644 index 0000000..fb02923 Binary files /dev/null and b/basicsuite/ebike-ui/images/bike-rearwheel.png differ diff --git a/basicsuite/ebike-ui/images/blue_circle_gps_area.png b/basicsuite/ebike-ui/images/blue_circle_gps_area.png new file mode 100644 index 0000000..06e1b6e Binary files /dev/null and b/basicsuite/ebike-ui/images/blue_circle_gps_area.png differ diff --git a/basicsuite/ebike-ui/images/calories.png b/basicsuite/ebike-ui/images/calories.png new file mode 100644 index 0000000..fe3cbb1 Binary files /dev/null and b/basicsuite/ebike-ui/images/calories.png differ diff --git a/basicsuite/ebike-ui/images/checkmark.png b/basicsuite/ebike-ui/images/checkmark.png new file mode 100644 index 0000000..0e1b387 Binary files /dev/null and b/basicsuite/ebike-ui/images/checkmark.png differ diff --git a/basicsuite/ebike-ui/images/curtain_shadow_handle.png b/basicsuite/ebike-ui/images/curtain_shadow_handle.png new file mode 100644 index 0000000..6e57a56 Binary files /dev/null and b/basicsuite/ebike-ui/images/curtain_shadow_handle.png differ diff --git a/basicsuite/ebike-ui/images/curtain_up_arrow.png b/basicsuite/ebike-ui/images/curtain_up_arrow.png new file mode 100644 index 0000000..97095d0 Binary files /dev/null and b/basicsuite/ebike-ui/images/curtain_up_arrow.png differ diff --git a/basicsuite/ebike-ui/images/fps_icon.png b/basicsuite/ebike-ui/images/fps_icon.png new file mode 100644 index 0000000..4cecab7 Binary files /dev/null and b/basicsuite/ebike-ui/images/fps_icon.png differ diff --git a/basicsuite/ebike-ui/images/info.png b/basicsuite/ebike-ui/images/info.png new file mode 100644 index 0000000..6ad9192 Binary files /dev/null and b/basicsuite/ebike-ui/images/info.png differ diff --git a/basicsuite/ebike-ui/images/info_selected.png b/basicsuite/ebike-ui/images/info_selected.png new file mode 100644 index 0000000..25056ff Binary files /dev/null and b/basicsuite/ebike-ui/images/info_selected.png differ diff --git a/basicsuite/ebike-ui/images/lights_off.png b/basicsuite/ebike-ui/images/lights_off.png new file mode 100644 index 0000000..4ad0abd Binary files /dev/null and b/basicsuite/ebike-ui/images/lights_off.png differ diff --git a/basicsuite/ebike-ui/images/lights_on.png b/basicsuite/ebike-ui/images/lights_on.png new file mode 100644 index 0000000..6da9893 Binary files /dev/null and b/basicsuite/ebike-ui/images/lights_on.png differ diff --git a/basicsuite/ebike-ui/images/list.png b/basicsuite/ebike-ui/images/list.png new file mode 100644 index 0000000..2e1633d Binary files /dev/null and b/basicsuite/ebike-ui/images/list.png differ diff --git a/basicsuite/ebike-ui/images/list_selected.png b/basicsuite/ebike-ui/images/list_selected.png new file mode 100644 index 0000000..1c61a5e Binary files /dev/null and b/basicsuite/ebike-ui/images/list_selected.png differ diff --git a/basicsuite/ebike-ui/images/map-marker.png b/basicsuite/ebike-ui/images/map-marker.png new file mode 100644 index 0000000..e2dd669 Binary files /dev/null and b/basicsuite/ebike-ui/images/map-marker.png differ diff --git a/basicsuite/ebike-ui/images/map_btn_shadow.png b/basicsuite/ebike-ui/images/map_btn_shadow.png new file mode 100644 index 0000000..c40b9b1 Binary files /dev/null and b/basicsuite/ebike-ui/images/map_btn_shadow.png differ diff --git a/basicsuite/ebike-ui/images/map_destination.png b/basicsuite/ebike-ui/images/map_destination.png new file mode 100644 index 0000000..a41b134 Binary files /dev/null and b/basicsuite/ebike-ui/images/map_destination.png differ diff --git a/basicsuite/ebike-ui/images/map_locate.png b/basicsuite/ebike-ui/images/map_locate.png new file mode 100644 index 0000000..2579c94 Binary files /dev/null and b/basicsuite/ebike-ui/images/map_locate.png differ diff --git a/basicsuite/ebike-ui/images/map_location_arrow.png b/basicsuite/ebike-ui/images/map_location_arrow.png new file mode 100644 index 0000000..9ec4d44 Binary files /dev/null and b/basicsuite/ebike-ui/images/map_location_arrow.png differ diff --git a/basicsuite/ebike-ui/images/map_zoomin.png b/basicsuite/ebike-ui/images/map_zoomin.png new file mode 100644 index 0000000..aea24fe Binary files /dev/null and b/basicsuite/ebike-ui/images/map_zoomin.png differ diff --git a/basicsuite/ebike-ui/images/map_zoomout.png b/basicsuite/ebike-ui/images/map_zoomout.png new file mode 100644 index 0000000..e3f90da Binary files /dev/null and b/basicsuite/ebike-ui/images/map_zoomout.png differ diff --git a/basicsuite/ebike-ui/images/nav_bear_l.png b/basicsuite/ebike-ui/images/nav_bear_l.png new file mode 100644 index 0000000..b078fbf Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_bear_l.png differ diff --git a/basicsuite/ebike-ui/images/nav_bear_r.png b/basicsuite/ebike-ui/images/nav_bear_r.png new file mode 100644 index 0000000..84b48c1 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_bear_r.png differ diff --git a/basicsuite/ebike-ui/images/nav_hard_l.png b/basicsuite/ebike-ui/images/nav_hard_l.png new file mode 100644 index 0000000..7235cc3 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_hard_l.png differ diff --git a/basicsuite/ebike-ui/images/nav_hard_r.png b/basicsuite/ebike-ui/images/nav_hard_r.png new file mode 100644 index 0000000..4a19b65 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_hard_r.png differ diff --git a/basicsuite/ebike-ui/images/nav_left.png b/basicsuite/ebike-ui/images/nav_left.png new file mode 100644 index 0000000..5a5aa26 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_left.png differ diff --git a/basicsuite/ebike-ui/images/nav_light_left.png b/basicsuite/ebike-ui/images/nav_light_left.png new file mode 100644 index 0000000..7c88914 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_light_left.png differ diff --git a/basicsuite/ebike-ui/images/nav_light_right.png b/basicsuite/ebike-ui/images/nav_light_right.png new file mode 100644 index 0000000..3bb07ff Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_light_right.png differ diff --git a/basicsuite/ebike-ui/images/nav_nodir.png b/basicsuite/ebike-ui/images/nav_nodir.png new file mode 100644 index 0000000..7fc92a7 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_nodir.png differ diff --git a/basicsuite/ebike-ui/images/nav_right.png b/basicsuite/ebike-ui/images/nav_right.png new file mode 100644 index 0000000..8eecf13 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_right.png differ diff --git a/basicsuite/ebike-ui/images/nav_straight.png b/basicsuite/ebike-ui/images/nav_straight.png new file mode 100644 index 0000000..44a58c8 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_straight.png differ diff --git a/basicsuite/ebike-ui/images/nav_uturn_l.png b/basicsuite/ebike-ui/images/nav_uturn_l.png new file mode 100644 index 0000000..c9714d3 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_uturn_l.png differ diff --git a/basicsuite/ebike-ui/images/nav_uturn_r.png b/basicsuite/ebike-ui/images/nav_uturn_r.png new file mode 100644 index 0000000..a4aee58 Binary files /dev/null and b/basicsuite/ebike-ui/images/nav_uturn_r.png differ diff --git a/basicsuite/ebike-ui/images/navigation_widget_shadow.png b/basicsuite/ebike-ui/images/navigation_widget_shadow.png new file mode 100644 index 0000000..4de81eb Binary files /dev/null and b/basicsuite/ebike-ui/images/navigation_widget_shadow.png differ diff --git a/basicsuite/ebike-ui/images/nextsong.png b/basicsuite/ebike-ui/images/nextsong.png new file mode 100644 index 0000000..90d6520 Binary files /dev/null and b/basicsuite/ebike-ui/images/nextsong.png differ diff --git a/basicsuite/ebike-ui/images/nextsong_pressed.png b/basicsuite/ebike-ui/images/nextsong_pressed.png new file mode 100644 index 0000000..b764100 Binary files /dev/null and b/basicsuite/ebike-ui/images/nextsong_pressed.png differ diff --git a/basicsuite/ebike-ui/images/ok.png b/basicsuite/ebike-ui/images/ok.png new file mode 100644 index 0000000..6d862a4 Binary files /dev/null and b/basicsuite/ebike-ui/images/ok.png differ diff --git a/basicsuite/ebike-ui/images/pause.png b/basicsuite/ebike-ui/images/pause.png new file mode 100644 index 0000000..9425527 Binary files /dev/null and b/basicsuite/ebike-ui/images/pause.png differ diff --git a/basicsuite/ebike-ui/images/pause_pressed.png b/basicsuite/ebike-ui/images/pause_pressed.png new file mode 100644 index 0000000..b90e029 Binary files /dev/null and b/basicsuite/ebike-ui/images/pause_pressed.png differ diff --git a/basicsuite/ebike-ui/images/placeholder.png b/basicsuite/ebike-ui/images/placeholder.png new file mode 100644 index 0000000..a0e647e Binary files /dev/null and b/basicsuite/ebike-ui/images/placeholder.png differ diff --git a/basicsuite/ebike-ui/images/play.png b/basicsuite/ebike-ui/images/play.png new file mode 100644 index 0000000..d31ae43 Binary files /dev/null and b/basicsuite/ebike-ui/images/play.png differ diff --git a/basicsuite/ebike-ui/images/play_pressed.png b/basicsuite/ebike-ui/images/play_pressed.png new file mode 100644 index 0000000..3cd498b Binary files /dev/null and b/basicsuite/ebike-ui/images/play_pressed.png differ diff --git a/basicsuite/ebike-ui/images/prevsong.png b/basicsuite/ebike-ui/images/prevsong.png new file mode 100644 index 0000000..63d2619 Binary files /dev/null and b/basicsuite/ebike-ui/images/prevsong.png differ diff --git a/basicsuite/ebike-ui/images/prevsong_pressed.png b/basicsuite/ebike-ui/images/prevsong_pressed.png new file mode 100644 index 0000000..dbe5690 Binary files /dev/null and b/basicsuite/ebike-ui/images/prevsong_pressed.png differ diff --git a/basicsuite/ebike-ui/images/search.png b/basicsuite/ebike-ui/images/search.png new file mode 100644 index 0000000..f840e72 Binary files /dev/null and b/basicsuite/ebike-ui/images/search.png differ diff --git a/basicsuite/ebike-ui/images/search_cancel.png b/basicsuite/ebike-ui/images/search_cancel.png new file mode 100644 index 0000000..679ce32 Binary files /dev/null and b/basicsuite/ebike-ui/images/search_cancel.png differ diff --git a/basicsuite/ebike-ui/images/settings.png b/basicsuite/ebike-ui/images/settings.png new file mode 100644 index 0000000..9651de6 Binary files /dev/null and b/basicsuite/ebike-ui/images/settings.png differ diff --git a/basicsuite/ebike-ui/images/settings_selected.png b/basicsuite/ebike-ui/images/settings_selected.png new file mode 100644 index 0000000..2e8cd7f Binary files /dev/null and b/basicsuite/ebike-ui/images/settings_selected.png differ diff --git a/basicsuite/ebike-ui/images/small_input_box_shadow.png b/basicsuite/ebike-ui/images/small_input_box_shadow.png new file mode 100644 index 0000000..401c0f2 Binary files /dev/null and b/basicsuite/ebike-ui/images/small_input_box_shadow.png differ diff --git a/basicsuite/ebike-ui/images/small_speedometer_arrow.png b/basicsuite/ebike-ui/images/small_speedometer_arrow.png new file mode 100644 index 0000000..728825d Binary files /dev/null and b/basicsuite/ebike-ui/images/small_speedometer_arrow.png differ diff --git a/basicsuite/ebike-ui/images/small_speedometer_shadow.png b/basicsuite/ebike-ui/images/small_speedometer_shadow.png new file mode 100644 index 0000000..5b37857 Binary files /dev/null and b/basicsuite/ebike-ui/images/small_speedometer_shadow.png differ diff --git a/basicsuite/ebike-ui/images/speed.png b/basicsuite/ebike-ui/images/speed.png new file mode 100644 index 0000000..400ac9e Binary files /dev/null and b/basicsuite/ebike-ui/images/speed.png differ diff --git a/basicsuite/ebike-ui/images/spinner.png b/basicsuite/ebike-ui/images/spinner.png new file mode 100644 index 0000000..e59efb2 Binary files /dev/null and b/basicsuite/ebike-ui/images/spinner.png differ diff --git a/basicsuite/ebike-ui/images/top_curtain_drag.png b/basicsuite/ebike-ui/images/top_curtain_drag.png new file mode 100644 index 0000000..46e9f90 Binary files /dev/null and b/basicsuite/ebike-ui/images/top_curtain_drag.png differ diff --git a/basicsuite/ebike-ui/images/trip.png b/basicsuite/ebike-ui/images/trip.png new file mode 100644 index 0000000..5a1761c Binary files /dev/null and b/basicsuite/ebike-ui/images/trip.png differ diff --git a/basicsuite/ebike-ui/images/warning.png b/basicsuite/ebike-ui/images/warning.png new file mode 100644 index 0000000..0c37552 Binary files /dev/null and b/basicsuite/ebike-ui/images/warning.png differ diff --git a/basicsuite/ebike-ui/main.qml b/basicsuite/ebike-ui/main.qml new file mode 100644 index 0000000..c6e3675 --- /dev/null +++ b/basicsuite/ebike-ui/main.qml @@ -0,0 +1,269 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import QtQuick.VirtualKeyboard 2.1 +import QtQml 2.2 +import DataStore 1.0 + +import "./BikeStyle" + +Rectangle { + visible: true + width: 640 + height: 480 + color: "#111520" + id: root + + // Permanent placeholder for time display + ClockView { + id: clockButton + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + + MouseArea { + anchors.rightMargin: -20 + anchors.leftMargin: -20 + anchors.bottomMargin: -20 + anchors.fill: parent + onClicked: drawer.open() + } + } + + FpsItem { + anchors.top: parent.top + anchors.left: parent.left + visible: fps.visible + } + + // The always-visible speed view + SpeedView { + id: speedView + onShowMain: swipeView.currentIndex = 1 + showZero: naviPage.targetEdit.activeFocus + property real enlargedMultiplier: 1.19 + property real corneredMultiplier: 0.25 + states: [ + State { + name: "CORNERED" + when: swipeView.currentIndex != 1 + PropertyChanges { + target: speedView + width: root.width * 0.14 + height: width + anchors.leftMargin: root.width * 0.015 + anchors.bottomMargin: anchors.leftMargin + color: Colors.speedViewBackgroundCornered + dotcount: UILayout.speedViewDotsMinified + speedTextSize: height * 0.475 + speedBaselineOffset: height * 0.4 + innerRadius: width * 0.45 * 0.875 + speedUnitBaselineOffset: height * 0.1 + speedUnitsSize: height * 0.09 + curvewidth: Math.min(width, height) * 0.055 + } + AnchorChanges { + target: speedView + anchors.horizontalCenter: undefined + anchors.top: undefined + anchors.verticalCenter: undefined + anchors.left: root.left + anchors.bottom: root.bottom + } + PropertyChanges { + target: speedView.cornerRectangle + color: Colors.speedViewBackgroundCornered + } + AnchorChanges { + target: speedView.cornerRectangle + anchors.horizontalCenter: undefined + anchors.verticalCenter: undefined + anchors.left: speedView.left + anchors.bottom: speedView.bottom + } + StateChangeScript { + script: { + musicPlayer.lastMusicPlayerState = musicPlayer.state; + musicPlayer.state = "hidden"; + } + } + }, + State { + name: "ENLARGED" + when: swipeView.currentIndex == 1 && speedView.enlarged + PropertyChanges { + target: speedView + width: root.width * 0.35 * enlargedMultiplier + height: width + dotcount: UILayout.speedViewDotsEnlarged + speedTextSize: height * 0.4 * enlargedMultiplier + innerRadius: width * 0.45 + speedUnitsSize: height * 0.05 * 1.125 + speedUnitBaselineOffset: height * 0.075 * enlargedMultiplier + speedIconsOffset: width * 0.25 + speedInfoTextsOffset: 0 + speedInfoTextsSize: speedTextSize * 0.45 * enlargedMultiplier + speedInfoUnitsOffset: height * 0.075 * enlargedMultiplier + assistPowerIconOffset: height * 0.175 * enlargedMultiplier + } + PropertyChanges { + target: mainPage.statsButton + anchors.leftMargin: -mainPage.statsButton.width + anchors.topMargin: -mainPage.statsButton.height + } + PropertyChanges { + target: mainPage.naviButton + anchors.rightMargin: -mainPage.naviButton.width + anchors.topMargin: -mainPage.naviButton.height + } + PropertyChanges { + target: mainPage.lightsButton + anchors.leftMargin: -mainPage.statsButton.width + anchors.bottomMargin: -mainPage.statsButton.height + } + PropertyChanges { + target: mainPage.modeButton + anchors.rightMargin: -mainPage.statsButton.width + anchors.bottomMargin: -mainPage.statsButton.height + } + PropertyChanges { + target: clockButton + anchors.topMargin: -clockButton.height + } + AnchorChanges { + target: speedView + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + StateChangeScript { + script: { + musicPlayer.lastMusicPlayerState = musicPlayer.state; + musicPlayer.state = "hidden"; + } + } + } + ] + + transitions: [ + Transition { + from: ""; to: "ENLARGED" + NumberAnimation { + properties: "anchors.leftMargin,anchors.rightMargin,anchors.topMargin,anchors.bottomMargin" + duration: 250 + } + NumberAnimation { + properties: "width,height,dotcount,speedTextSize,speedBaselineOffset,innerRadius,speedUnitsSize,speedUnitBaselineOffset,speedIconsOffset,speedInfoTextsOffset,speedInfoTextsSize,speedInfoUnitsOffset,assistPowerIconOffset" + duration: 250 + } + AnchorAnimation { + duration: 250 + } + }, + Transition { + from: "ENLARGED"; to: "" + NumberAnimation { + properties: "anchors.leftMargin,anchors.rightMargin,anchors.topMargin,anchors.bottomMargin" + easing.type: Easing.OutBack + duration: 250 + } + NumberAnimation { + properties: "width,height,dotcount,speedTextSize,speedBaselineOffset,innerRadius,speedUnitsSize,speedUnitBaselineOffset,speedIconsOffset,speedInfoTextsOffset,speedInfoTextsSize,speedInfoUnitsOffset,assistPowerIconOffset" + duration: 250 + } + AnchorAnimation { + duration: 250 + } + }, + Transition { + NumberAnimation { + properties: "width,height,curvewidth,speedTextSize,speedBaselineOffset,innerRadius,speedUnitMargin" + easing.type: Easing.OutBack + duration: 250 + } + ColorAnimation { + duration: 250 + } + AnchorAnimation { + easing.type: Easing.OutBack + duration: 250 + } + } + ] + } + + // Configuration and settings drawer + ConfigurationDrawer { + id: drawer + height: root.height * 0.475 + width: root.width + edge: Qt.TopEdge + dragMargin: 20 + } + + // Inactive swipe view, for animations + SwipeView { + id: swipeView + anchors.fill: parent + currentIndex: 1 + interactive: false + + // List of pages + StatsPage {} + MainPage { + id: mainPage + naviGuideArrowSource: naviPage.naviGuideArrowSource + naviGuideDistance: naviPage.naviGuideDistance + naviGuideAddress: naviPage.naviGuideAddress + } + NaviPage { + id: naviPage; + } + } + + // Music player + MusicPlayer { + id: musicPlayer + property string lastMusicPlayerState: "unknown" + z: 1 + } + + Connections { + target: datastore + onDemoReset: drawer.close() + } +} diff --git a/basicsuite/ebike-ui/mapbox.cpp b/basicsuite/ebike-ui/mapbox.cpp new file mode 100644 index 0000000..9d2303d --- /dev/null +++ b/basicsuite/ebike-ui/mapbox.cpp @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +#include "mapbox.h" + +#define MAPBOX_URL "https://api.mapbox.com/" +#define MAPBOX_TOKEN "pk.eyJ1IjoibWFwYm94NHF0IiwiYSI6ImNpd3J3eDE0eDEzdm8ydHM3YzhzajlrN2oifQ.keEkjqm79SiFDFjnesTcgQ" + +MapBox::MapBox(QObject *parent) + : QObject(parent) + , m_nam(new QNetworkAccessManager(this)) +{ +} + +const QUrl MapBox::createUrl(const QString &path, QUrlQuery params) const +{ + // Create URL and set path + QUrl url(http://github.com/MAPBOX_URL); + url.setPath(path, QUrl::TolerantMode); + + // Add access token to query params + params.addQueryItem("access_token", MAPBOX_TOKEN); + url.setQuery(params); + + return url; +} + +QNetworkReply *MapBox::get(const QUrl &url) const +{ + return m_nam->get(QNetworkRequest(url)); +} + +QNetworkReply *MapBox::getGeocoding(const QString &query, const QGeoCoordinate &proximity) +{ + QUrlQuery params; + params.addQueryItem("autocomplete", "true"); + params.addQueryItem("limit", "3"); + if (proximity.isValid()) + params.addQueryItem("proximity", QString("%1,%2").arg(proximity.longitude()).arg(proximity.latitude())); + QUrl url = createUrl(QString("/geocoding/v5/mapbox.places/%1.json").arg(QString(QUrl::toPercentEncoding(query))), params); + + return get(url); +} + +QNetworkReply *MapBox::getDirections(const QGeoCoordinate &source, const QGeoCoordinate &destination, const QString &type) +{ + QString where = QString("%1,%2;%3,%4").arg(source.longitude()).arg(source.latitude()).arg(destination.longitude()).arg(destination.latitude()); + QUrlQuery params; + params.addQueryItem("steps", "true"); + params.addQueryItem("geometries", "geojson"); + QUrl url = createUrl(QString("/directions/v5/mapbox/%1/%2.json").arg(type).arg(QString(QUrl::toPercentEncoding(where))), params); + + return get(url); +} diff --git a/basicsuite/ebike-ui/mapbox.h b/basicsuite/ebike-ui/mapbox.h new file mode 100644 index 0000000..5bd295f --- /dev/null +++ b/basicsuite/ebike-ui/mapbox.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MAPBOX_H +#define MAPBOX_H + +#include +#include +#include + +class QNetworkAccessManager; +class QNetworkReply; + +class MapBox : public QObject +{ + Q_OBJECT + +public: + explicit MapBox(QObject *parent = nullptr); + +public: + const QUrl createUrl(const QString &path, QUrlQuery params) const; + QNetworkReply *get(const QUrl &url) const; + QNetworkReply *getGeocoding(const QString &query, const QGeoCoordinate &proximity=QGeoCoordinate()); + QNetworkReply *getDirections(const QGeoCoordinate &source, const QGeoCoordinate &destination, const QString &type=QString("cycling")); + +signals: + +public slots: + +private: + QNetworkAccessManager *m_nam; +}; + +#endif // MAPBOX_H diff --git a/basicsuite/ebike-ui/mapboxsuggestions.cpp b/basicsuite/ebike-ui/mapboxsuggestions.cpp new file mode 100644 index 0000000..3f66766 --- /dev/null +++ b/basicsuite/ebike-ui/mapboxsuggestions.cpp @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mapboxsuggestions.h" +#include "mapbox.h" +#include "suggestionsmodel.h" + +MapBoxSuggestions::MapBoxSuggestions(MapBox *mapbox, QObject *parent) + : QObject(parent) + , m_mapbox(mapbox) + , m_timer(new QTimer(this)) + , m_suggestions(new SuggestionsModel(this)) +{ + // Setup timer to request 500ms after user stops typing + m_timer->setSingleShot(true); + m_timer->setInterval(500); + + // Connect timer signal + connect(m_timer, &QTimer::timeout, this, &MapBoxSuggestions::loadSuggestions); +} + +void MapBoxSuggestions::stopSuggest() +{ + m_timer->stop(); +} + +void MapBoxSuggestions::setSearch(const QString &search) +{ + if (m_search == search) + return; + + m_search = search; + m_timer->start(); + emit searchChanged(m_search); +} + +void MapBoxSuggestions::loadSuggestions() +{ + QNetworkReply *reply = m_mapbox->getGeocoding(m_search, m_center); + connect(reply, &QNetworkReply::finished, this, &MapBoxSuggestions::handleReply); + m_requests.append(reply); + emit loadingChanged(); +} + +void MapBoxSuggestions::handleReply() +{ + QNetworkReply *reply = qobject_cast(sender()); + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(reply->readAll(), &error); + if (error.error == QJsonParseError::NoError) { + QJsonObject obj = doc.object(); + m_suggestions->setSuggestions(obj.value("features").toArray()); + emit suggestionsChanged(); + } + + m_requests.removeOne(reply); + emit loadingChanged(); + reply->deleteLater(); +} + +void MapBoxSuggestions::setCenter(const QGeoCoordinate ¢er) +{ + if (m_center != center) { + m_center = center; + emit centerChanged(); + } +} diff --git a/basicsuite/ebike-ui/mapboxsuggestions.h b/basicsuite/ebike-ui/mapboxsuggestions.h new file mode 100644 index 0000000..8dc1506 --- /dev/null +++ b/basicsuite/ebike-ui/mapboxsuggestions.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MAPBOXSUGGESTIONS_H +#define MAPBOXSUGGESTIONS_H + +#include +#include + +class MapBox; +class QNetworkReply; +class QTimer; +class SuggestionsModel; + +class MapBoxSuggestions : public QObject +{ + Q_OBJECT + Q_PROPERTY(SuggestionsModel suggestions READ suggestions NOTIFY suggestionsChanged) + Q_PROPERTY(bool loading READ loading NOTIFY loadingChanged) + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) + Q_PROPERTY(QString search READ search WRITE setSearch NOTIFY searchChanged) + +public: + explicit MapBoxSuggestions(MapBox *mapbox, QObject *parent = nullptr); + +public: + SuggestionsModel *suggestions() const { return m_suggestions; } + bool loading() const { return m_requests.size() > 0; } + const QGeoCoordinate center() { return m_center; } + void setCenter(const QGeoCoordinate ¢er); + const QString search() const { return m_search; } + void setSearch(const QString &search); + +signals: + void suggestionsChanged(); + void loadingChanged(); + void centerChanged(); + void searchChanged(QString search); + +public slots: + void stopSuggest(); + +private slots: + void loadSuggestions(); + void handleReply(); + +private: + MapBox *m_mapbox; + QTimer *m_timer; + QList m_requests; + SuggestionsModel *m_suggestions; + QGeoCoordinate m_center; + QString m_search; +}; + +#endif // MAPBOXSUGGESTIONS_H diff --git a/basicsuite/ebike-ui/moment.js b/basicsuite/ebike-ui/moment.js new file mode 100644 index 0000000..eaf827d --- /dev/null +++ b/basicsuite/ebike-ui/moment.js @@ -0,0 +1,4551 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//! moment.js +//! version : 2.19.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + +var hookCallback; + +function hooks () { + return hookCallback.apply(null, arguments); +} + +// This is done to register the method called with moment() +// without creating circular dependencies. +function setHookCallback (callback) { + hookCallback = callback; +} + +function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; +} + +function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; +} + +function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } +} + +function isUndefined(input) { + return input === void 0; +} + +function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; +} + +function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; +} + +function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; +} + +function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); +} + +function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; +} + +function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); +} + +function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; +} + +function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; +} + +var some; +if (Array.prototype.some) { + some = Array.prototype.some; +} else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; +} + +function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; +} + +function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; +} + +// Plugins that add properties should also add the key here (null value), +// so we can properly clone ourselves. +var momentProperties = hooks.momentProperties = []; + +function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; +} + +var updateInProgress = false; + +// Moment prototype object +function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } +} + +function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); +} + +function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } +} + +function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; +} + +// compare two arrays, return the number of differences +function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; +} + +function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } +} + +function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); +} + +var deprecations = {}; + +function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } +} + +hooks.suppressDeprecationWarnings = false; +hooks.deprecationHandler = null; + +function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; +} + +function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); +} + +function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; +} + +function Locale(config) { + if (config != null) { + this.set(config); + } +} + +var keys; + +if (Object.keys) { + keys = Object.keys; +} else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; +} + +var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' +}; + +function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; +} + +var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' +}; + +function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; +} + +var defaultInvalidDate = 'Invalid date'; + +function invalidDate () { + return this._invalidDate; +} + +var defaultOrdinal = '%d'; +var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + +function ordinal (number) { + return this._ordinal.replace('%d', number); +} + +var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' +}; + +function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); +} + +function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); +} + +var aliases = {}; + +function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; +} + +function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; +} + +function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; +} + +var priorities = {}; + +function addUnitPriority(unit, priority) { + priorities[unit] = priority; +} + +function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; +} + +function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; +} + +var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + +var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + +var formatFunctions = {}; + +var formatTokenFunctions = {}; + +// token: 'M' +// padded: ['MM', 2] +// ordinal: 'Mo' +// callback: function () { this.month() + 1 } +function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } +} + +function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); +} + +function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; +} + +// format date using native date object +function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); +} + +function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; +} + +var match1 = /\d/; // 0 - 9 +var match2 = /\d\d/; // 00 - 99 +var match3 = /\d{3}/; // 000 - 999 +var match4 = /\d{4}/; // 0000 - 9999 +var match6 = /[+-]?\d{6}/; // -999999 - 999999 +var match1to2 = /\d\d?/; // 0 - 99 +var match3to4 = /\d\d\d\d?/; // 999 - 9999 +var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 +var match1to3 = /\d{1,3}/; // 0 - 999 +var match1to4 = /\d{1,4}/; // 0 - 9999 +var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + +var matchUnsigned = /\d+/; // 0 - inf +var matchSigned = /[+-]?\d+/; // -inf - inf + +var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z +var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + +var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + +// any word (or two) characters or numbers including two/three word month in arabic. +// includes scottish gaelic two word and hyphenated months +var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + + +var regexes = {}; + +function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; +} + +function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); +} + +// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript +function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); +} + +function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); +} + +var tokens = {}; + +function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } +} + +function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); +} + +function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } +} + +var YEAR = 0; +var MONTH = 1; +var DATE = 2; +var HOUR = 3; +var MINUTE = 4; +var SECOND = 5; +var MILLISECOND = 6; +var WEEK = 7; +var WEEKDAY = 8; + +// FORMATTING + +addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; +}); + +addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; +}); + +addFormatToken(0, ['YYYY', 4], 0, 'year'); +addFormatToken(0, ['YYYYY', 5], 0, 'year'); +addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + +// ALIASES + +addUnitAlias('year', 'y'); + +// PRIORITIES + +addUnitPriority('year', 1); + +// PARSING + +addRegexToken('Y', matchSigned); +addRegexToken('YY', match1to2, match2); +addRegexToken('YYYY', match1to4, match4); +addRegexToken('YYYYY', match1to6, match6); +addRegexToken('YYYYYY', match1to6, match6); + +addParseToken(['YYYYY', 'YYYYYY'], YEAR); +addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); +}); +addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); +}); +addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); +}); + +// HELPERS + +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} + +function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; +} + +// HOOKS + +hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); +}; + +// MOMENTS + +var getSetYear = makeGetSet('FullYear', true); + +function getIsLeapYear () { + return isLeapYear(this.year()); +} + +function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; +} + +function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; +} + +function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } +} + +// MOMENTS + +function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; +} + + +function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; +} + +function mod(n, x) { + return ((n % x) + x) % x; +} + +var indexOf; + +if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; +} else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; +} + +function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); +} + +// FORMATTING + +addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; +}); + +addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); +}); + +addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); +}); + +// ALIASES + +addUnitAlias('month', 'M'); + +// PRIORITY + +addUnitPriority('month', 8); + +// PARSING + +addRegexToken('M', match1to2); +addRegexToken('MM', match1to2, match2); +addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); +}); +addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); +}); + +addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; +}); + +addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } +}); + +// LOCALES + +var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; +var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); +function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; +} + +var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); +function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; +} + +function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } +} + +// MOMENTS + +function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; +} + +function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } +} + +function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); +} + +var defaultMonthsShortRegex = matchWord; +function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } +} + +var defaultMonthsRegex = matchWord; +function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } +} + +function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); +} + +function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; +} + +function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; +} + +// start-of-first-week - start-of-year +function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; +} + +// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday +function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; +} + +function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; +} + +function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; +} + +// FORMATTING + +addFormatToken('w', ['ww', 2], 'wo', 'week'); +addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + +// ALIASES + +addUnitAlias('week', 'w'); +addUnitAlias('isoWeek', 'W'); + +// PRIORITIES + +addUnitPriority('week', 5); +addUnitPriority('isoWeek', 5); + +// PARSING + +addRegexToken('w', match1to2); +addRegexToken('ww', match1to2, match2); +addRegexToken('W', match1to2); +addRegexToken('WW', match1to2, match2); + +addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); +}); + +// HELPERS + +// LOCALES + +function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; +} + +var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. +}; + +function localeFirstDayOfWeek () { + return this._week.dow; +} + +function localeFirstDayOfYear () { + return this._week.doy; +} + +// MOMENTS + +function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); +} + +function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); +} + +// FORMATTING + +addFormatToken('d', 0, 'do', 'day'); + +addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); +}); + +addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); +}); + +addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); +}); + +addFormatToken('e', 0, 0, 'weekday'); +addFormatToken('E', 0, 0, 'isoWeekday'); + +// ALIASES + +addUnitAlias('day', 'd'); +addUnitAlias('weekday', 'e'); +addUnitAlias('isoWeekday', 'E'); + +// PRIORITY +addUnitPriority('day', 11); +addUnitPriority('weekday', 11); +addUnitPriority('isoWeekday', 11); + +// PARSING + +addRegexToken('d', match1to2); +addRegexToken('e', match1to2); +addRegexToken('E', match1to2); +addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); +}); +addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); +}); +addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); +}); + +addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } +}); + +addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); +}); + +// HELPERS + +function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; +} + +function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; +} + +// LOCALES + +var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); +function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; +} + +var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); +function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; +} + +var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); +function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; +} + +function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } +} + +function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } +} + +// MOMENTS + +function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } +} + +function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); +} + +function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } +} + +var defaultWeekdaysRegex = matchWord; +function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } +} + +var defaultWeekdaysShortRegex = matchWord; +function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } +} + +var defaultWeekdaysMinRegex = matchWord; +function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } +} + + +function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); +} + +// FORMATTING + +function hFormat() { + return this.hours() % 12 || 12; +} + +function kFormat() { + return this.hours() || 24; +} + +addFormatToken('H', ['HH', 2], 0, 'hour'); +addFormatToken('h', ['hh', 2], 0, hFormat); +addFormatToken('k', ['kk', 2], 0, kFormat); + +addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); +}); + +addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); +}); + +addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); +}); + +function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); +} + +meridiem('a', true); +meridiem('A', false); + +// ALIASES + +addUnitAlias('hour', 'h'); + +// PRIORITY +addUnitPriority('hour', 13); + +// PARSING + +function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; +} + +addRegexToken('a', matchMeridiem); +addRegexToken('A', matchMeridiem); +addRegexToken('H', match1to2); +addRegexToken('h', match1to2); +addRegexToken('k', match1to2); +addRegexToken('HH', match1to2, match2); +addRegexToken('hh', match1to2, match2); +addRegexToken('kk', match1to2, match2); + +addRegexToken('hmm', match3to4); +addRegexToken('hmmss', match5to6); +addRegexToken('Hmm', match3to4); +addRegexToken('Hmmss', match5to6); + +addParseToken(['H', 'HH'], HOUR); +addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; +}); +addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; +}); +addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; +}); +addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); +}); +addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); +}); + +// LOCALES + +function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); +} + +var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; +function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } +} + + +// MOMENTS + +// Setting the hour should keep the time, because the user explicitly +// specified which hour he wants. So trying to maintain the same hour (in +// a new timezone) makes sense. Adding/subtracting hours does not follow +// this rule. +var getSetHour = makeGetSet('Hours', true); + +// months +// week +// weekdays +// meridiem +var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse +}; + +// internal storage for locale config files +var locales = {}; +var localeFamilies = {}; +var globalLocale; + +function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; +} + +// pick the locale from the array +// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each +// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root +function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; +} + +function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; +} + +// This function will load locale and then set the global locale. If +// no arguments are passed in, it will simply return the current global +// locale key. +function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + } + + return globalLocale._abbr; +} + +function defineLocale (name, config) { + if (config !== null) { + var parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } +} + +function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; +} + +// returns locale data +function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); +} + +function listLocales() { + return keys(locales); +} + +function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; +} + +// Pick the first defined of two or three arguments. +function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; +} + +function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; +} + +// convert an array to a date. +// the array should mirror the parameters below +// note: all values past the year are optional and will default to the lowest possible value. +// [year, month, day , hour, minute, second, millisecond] +function configFromArray (config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== config._d.getDay()) { + getParsingFlags(config).weekdayMismatch = true; + } +} + +function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from beginning of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to beginning of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } +} + +// iso 8601 regex +// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) +var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; +var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + +var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + +var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] +]; + +// iso time formats and regexes +var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] +]; + +var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + +// date from iso format +function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } +} + +// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 +var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + +function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; +} + +function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; +} + +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); +} + +function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; +} + +var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; + +function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } +} + +// date and time from ref 2822 format +function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } +} + +// date from iso format or fallback +function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); +} + +hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/%20for%20more%20info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } +); + +// constant that refers to the ISO standard +hooks.ISO_8601 = function () {}; + +// constant that refers to the RFC 2822 form +hooks.RFC_2822 = function () {}; + +// date from string and format string +function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); +} + + +function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } +} + +// date from string and array of format strings +function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); +} + +function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); +} + +function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; +} + +function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; +} + +function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } +} + +function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); +} + +function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); +} + +var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } +); + +var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } +); + +// Pick a moment m from moments so that m[fn](other) is true for all +// other. This relies on the function fn to be transitive. +// +// moments should either be an array of moment objects or an array, whose +// first element is an array of moment objects. +function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; +} + +// TODO: Use [].sort instead? +function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); +} + +function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); +} + +var now = function () { + return Date.now ? Date.now() : +(new Date()); +}; + +var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + +function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; +} + +function isValid$1() { + return this._isValid; +} + +function createInvalid$1() { + return createDuration(NaN); +} + +function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); +} + +function isDuration (obj) { + return obj instanceof Duration; +} + +function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } +} + +// FORMATTING + +function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); +} + +offset('Z', ':'); +offset('ZZ', ''); + +// PARSING + +addRegexToken('Z', matchShortOffset); +addRegexToken('ZZ', matchShortOffset); +addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); +}); + +// HELPERS + +// timezone chunker +// '+10:00' > ['10', '00'] +// '-1530' > ['-15', '30'] +var chunkOffset = /([\+\-]|\d\d)/gi; + +function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; +} + +// Return a moment from input, that is local/utc/zone equivalent to model. +function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } +} + +function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; +} + +// HOOKS + +// This function will be called whenever a moment is mutated. +// It is intended to keep the offset in sync with the timezone. +hooks.updateOffset = function () {}; + +// MOMENTS + +// keepLocalTime = true means only change the timezone, without +// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> +// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset +// +0200, so we adjust the time as needed, to be valid. +// +// Keeping the time actually adds/subtracts (one hour) +// from the actual represented time. That is why we call updateOffset +// a second time. In case it wants us to change the offset again +// _changeInProgress == true case, then we have to adjust, because +// there is no such time in the given timezone. +function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } +} + +function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } +} + +function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); +} + +function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; +} + +function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; +} + +function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; +} + +function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); +} + +function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; +} + +function isLocal () { + return this.isValid() ? !this._isUTC : false; +} + +function isUtcOffset () { + return this.isValid() ? this._isUTC : false; +} + +function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; +} + +// ASP.NET json date format regex +var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + +// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html +// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere +// and further modified to allow for strings containing both week and day +var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + +function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; +} + +createDuration.fn = Duration.prototype; +createDuration.invalid = createInvalid$1; + +function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; +} + +function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; +} + +function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; +} + +// TODO: remove 'name' arg after deprecation is removed +function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; +} + +function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } +} + +var add = createAdder(1, 'add'); +var subtract = createAdder(-1, 'subtract'); + +function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; +} + +function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); +} + +function clone () { + return new Moment(this); +} + +function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } +} + +function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } +} + +function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); +} + +function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } +} + +function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); +} + +function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); +} + +function diff (input, units, asFloat) { + var that, + zoneDelta, + delta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); +} + +function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; +} + +hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; +hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + +function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); +} + +function toISOString() { + if (!this.isValid()) { + return null; + } + var m = this.clone().utc(); + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); +} + +/** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ +function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); +} + +function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); +} + +function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); +} + +function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } +} + +function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); +} + +// If passed a locale key, it will set the locale for this +// instance. Otherwise, it will return the locale configuration +// variables for this instance. +function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } +} + +var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } +); + +function localeData () { + return this._locale; +} + +function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; +} + +function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); +} + +function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); +} + +function unix () { + return Math.floor(this.valueOf() / 1000); +} + +function toDate () { + return new Date(this.valueOf()); +} + +function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; +} + +function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; +} + +function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; +} + +function isValid$2 () { + return isValid(this); +} + +function parsingFlags () { + return extend({}, getParsingFlags(this)); +} + +function invalidAt () { + return getParsingFlags(this).overflow; +} + +function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; +} + +// FORMATTING + +addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; +}); + +addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; +}); + +function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); +} + +addWeekYearFormatToken('gggg', 'weekYear'); +addWeekYearFormatToken('ggggg', 'weekYear'); +addWeekYearFormatToken('GGGG', 'isoWeekYear'); +addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + +// ALIASES + +addUnitAlias('weekYear', 'gg'); +addUnitAlias('isoWeekYear', 'GG'); + +// PRIORITY + +addUnitPriority('weekYear', 1); +addUnitPriority('isoWeekYear', 1); + + +// PARSING + +addRegexToken('G', matchSigned); +addRegexToken('g', matchSigned); +addRegexToken('GG', match1to2, match2); +addRegexToken('gg', match1to2, match2); +addRegexToken('GGGG', match1to4, match4); +addRegexToken('gggg', match1to4, match4); +addRegexToken('GGGGG', match1to6, match6); +addRegexToken('ggggg', match1to6, match6); + +addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); +}); + +addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); +}); + +// MOMENTS + +function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); +} + +function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); +} + +function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); +} + +function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); +} + +function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } +} + +function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; +} + +// FORMATTING + +addFormatToken('Q', 0, 'Qo', 'quarter'); + +// ALIASES + +addUnitAlias('quarter', 'Q'); + +// PRIORITY + +addUnitPriority('quarter', 7); + +// PARSING + +addRegexToken('Q', match1); +addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; +}); + +// MOMENTS + +function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); +} + +// FORMATTING + +addFormatToken('D', ['DD', 2], 'Do', 'date'); + +// ALIASES + +addUnitAlias('date', 'D'); + +// PRIOROITY +addUnitPriority('date', 9); + +// PARSING + +addRegexToken('D', match1to2); +addRegexToken('DD', match1to2, match2); +addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; +}); + +addParseToken(['D', 'DD'], DATE); +addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0], 10); +}); + +// MOMENTS + +var getSetDayOfMonth = makeGetSet('Date', true); + +// FORMATTING + +addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + +// ALIASES + +addUnitAlias('dayOfYear', 'DDD'); + +// PRIORITY +addUnitPriority('dayOfYear', 4); + +// PARSING + +addRegexToken('DDD', match1to3); +addRegexToken('DDDD', match3); +addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); +}); + +// HELPERS + +// MOMENTS + +function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); +} + +// FORMATTING + +addFormatToken('m', ['mm', 2], 0, 'minute'); + +// ALIASES + +addUnitAlias('minute', 'm'); + +// PRIORITY + +addUnitPriority('minute', 14); + +// PARSING + +addRegexToken('m', match1to2); +addRegexToken('mm', match1to2, match2); +addParseToken(['m', 'mm'], MINUTE); + +// MOMENTS + +var getSetMinute = makeGetSet('Minutes', false); + +// FORMATTING + +addFormatToken('s', ['ss', 2], 0, 'second'); + +// ALIASES + +addUnitAlias('second', 's'); + +// PRIORITY + +addUnitPriority('second', 15); + +// PARSING + +addRegexToken('s', match1to2); +addRegexToken('ss', match1to2, match2); +addParseToken(['s', 'ss'], SECOND); + +// MOMENTS + +var getSetSecond = makeGetSet('Seconds', false); + +// FORMATTING + +addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); +}); + +addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); +}); + +addFormatToken(0, ['SSS', 3], 0, 'millisecond'); +addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; +}); +addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; +}); +addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; +}); +addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; +}); +addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; +}); +addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; +}); + + +// ALIASES + +addUnitAlias('millisecond', 'ms'); + +// PRIORITY + +addUnitPriority('millisecond', 16); + +// PARSING + +addRegexToken('S', match1to3, match1); +addRegexToken('SS', match1to3, match2); +addRegexToken('SSS', match1to3, match3); + +var token; +for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); +} + +function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); +} + +for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); +} +// MOMENTS + +var getSetMillisecond = makeGetSet('Milliseconds', false); + +// FORMATTING + +addFormatToken('z', 0, 0, 'zoneAbbr'); +addFormatToken('zz', 0, 0, 'zoneName'); + +// MOMENTS + +function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; +} + +function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; +} + +var proto = Moment.prototype; + +proto.add = add; +proto.calendar = calendar$1; +proto.clone = clone; +proto.diff = diff; +proto.endOf = endOf; +proto.format = format; +proto.from = from; +proto.fromNow = fromNow; +proto.to = to; +proto.toNow = toNow; +proto.get = stringGet; +proto.invalidAt = invalidAt; +proto.isAfter = isAfter; +proto.isBefore = isBefore; +proto.isBetween = isBetween; +proto.isSame = isSame; +proto.isSameOrAfter = isSameOrAfter; +proto.isSameOrBefore = isSameOrBefore; +proto.isValid = isValid$2; +proto.lang = lang; +proto.locale = locale; +proto.localeData = localeData; +proto.max = prototypeMax; +proto.min = prototypeMin; +proto.parsingFlags = parsingFlags; +proto.set = stringSet; +proto.startOf = startOf; +proto.subtract = subtract; +proto.toArray = toArray; +proto.toObject = toObject; +proto.toDate = toDate; +proto.toISOString = toISOString; +proto.inspect = inspect; +proto.toJSON = toJSON; +proto.toString = toString; +proto.unix = unix; +proto.valueOf = valueOf; +proto.creationData = creationData; + +// Year +proto.year = getSetYear; +proto.isLeapYear = getIsLeapYear; + +// Week Year +proto.weekYear = getSetWeekYear; +proto.isoWeekYear = getSetISOWeekYear; + +// Quarter +proto.quarter = proto.quarters = getSetQuarter; + +// Month +proto.month = getSetMonth; +proto.daysInMonth = getDaysInMonth; + +// Week +proto.week = proto.weeks = getSetWeek; +proto.isoWeek = proto.isoWeeks = getSetISOWeek; +proto.weeksInYear = getWeeksInYear; +proto.isoWeeksInYear = getISOWeeksInYear; + +// Day +proto.date = getSetDayOfMonth; +proto.day = proto.days = getSetDayOfWeek; +proto.weekday = getSetLocaleDayOfWeek; +proto.isoWeekday = getSetISODayOfWeek; +proto.dayOfYear = getSetDayOfYear; + +// Hour +proto.hour = proto.hours = getSetHour; + +// Minute +proto.minute = proto.minutes = getSetMinute; + +// Second +proto.second = proto.seconds = getSetSecond; + +// Millisecond +proto.millisecond = proto.milliseconds = getSetMillisecond; + +// Offset +proto.utcOffset = getSetOffset; +proto.utc = setOffsetToUTC; +proto.local = setOffsetToLocal; +proto.parseZone = setOffsetToParsedOffset; +proto.hasAlignedHourOffset = hasAlignedHourOffset; +proto.isDST = isDaylightSavingTime; +proto.isLocal = isLocal; +proto.isUtcOffset = isUtcOffset; +proto.isUtc = isUtc; +proto.isUTC = isUtc; + +// Timezone +proto.zoneAbbr = getZoneAbbr; +proto.zoneName = getZoneName; + +// Deprecations +proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); +proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); +proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); +proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); +proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + +function createUnix (input) { + return createLocal(input * 1000); +} + +function createInZone () { + return createLocal.apply(null, arguments).parseZone(); +} + +function preParsePostFormat (string) { + return string; +} + +var proto$1 = Locale.prototype; + +proto$1.calendar = calendar; +proto$1.longDateFormat = longDateFormat; +proto$1.invalidDate = invalidDate; +proto$1.ordinal = ordinal; +proto$1.preparse = preParsePostFormat; +proto$1.postformat = preParsePostFormat; +proto$1.relativeTime = relativeTime; +proto$1.pastFuture = pastFuture; +proto$1.set = set; + +// Month +proto$1.months = localeMonths; +proto$1.monthsShort = localeMonthsShort; +proto$1.monthsParse = localeMonthsParse; +proto$1.monthsRegex = monthsRegex; +proto$1.monthsShortRegex = monthsShortRegex; + +// Week +proto$1.week = localeWeek; +proto$1.firstDayOfYear = localeFirstDayOfYear; +proto$1.firstDayOfWeek = localeFirstDayOfWeek; + +// Day of Week +proto$1.weekdays = localeWeekdays; +proto$1.weekdaysMin = localeWeekdaysMin; +proto$1.weekdaysShort = localeWeekdaysShort; +proto$1.weekdaysParse = localeWeekdaysParse; + +proto$1.weekdaysRegex = weekdaysRegex; +proto$1.weekdaysShortRegex = weekdaysShortRegex; +proto$1.weekdaysMinRegex = weekdaysMinRegex; + +// Hours +proto$1.isPM = localeIsPM; +proto$1.meridiem = localeMeridiem; + +function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); +} + +function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; +} + +// () +// (5) +// (fmt, 5) +// (fmt) +// (true) +// (true, 5) +// (true, fmt, 5) +// (true, fmt) +function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; +} + +function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); +} + +function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); +} + +function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); +} + +function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); +} + +function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); +} + +getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } +}); + +// Side effect imports +hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); +hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + +var mathAbs = Math.abs; + +function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; +} + +function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); +} + +// supports only 2.0-style add(1, 's') or add(duration) +function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); +} + +// supports only 2.0-style subtract(1, 's') or subtract(duration) +function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); +} + +function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } +} + +function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; +} + +function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; +} + +function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; +} + +function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } +} + +// TODO: Use this.as('ms')? +function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); +} + +function makeAs (alias) { + return function () { + return this.as(alias); + }; +} + +var asMilliseconds = makeAs('ms'); +var asSeconds = makeAs('s'); +var asMinutes = makeAs('m'); +var asHours = makeAs('h'); +var asDays = makeAs('d'); +var asWeeks = makeAs('w'); +var asMonths = makeAs('M'); +var asYears = makeAs('y'); + +function clone$1 () { + return createDuration(this); +} + +function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; +} + +function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; +} + +var milliseconds = makeGetter('milliseconds'); +var seconds = makeGetter('seconds'); +var minutes = makeGetter('minutes'); +var hours = makeGetter('hours'); +var days = makeGetter('days'); +var months = makeGetter('months'); +var years = makeGetter('years'); + +function weeks () { + return absFloor(this.days() / 7); +} + +var round = Math.round; +var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year +}; + +// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize +function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); +} + +function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); +} + +// This function allows you to set the rounding function for relative time strings +function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; +} + +// This function allows you to set a threshold for relative time strings +function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; +} + +function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); +} + +var abs$1 = Math.abs; + +function sign(x) { + return ((x > 0) - (x < 0)) || +x; +} + +function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); +} + +var proto$2 = Duration.prototype; + +proto$2.isValid = isValid$1; +proto$2.abs = abs; +proto$2.add = add$1; +proto$2.subtract = subtract$1; +proto$2.as = as; +proto$2.asMilliseconds = asMilliseconds; +proto$2.asSeconds = asSeconds; +proto$2.asMinutes = asMinutes; +proto$2.asHours = asHours; +proto$2.asDays = asDays; +proto$2.asWeeks = asWeeks; +proto$2.asMonths = asMonths; +proto$2.asYears = asYears; +proto$2.valueOf = valueOf$1; +proto$2._bubble = bubble; +proto$2.clone = clone$1; +proto$2.get = get$2; +proto$2.milliseconds = milliseconds; +proto$2.seconds = seconds; +proto$2.minutes = minutes; +proto$2.hours = hours; +proto$2.days = days; +proto$2.weeks = weeks; +proto$2.months = months; +proto$2.years = years; +proto$2.humanize = humanize; +proto$2.toISOString = toISOString$1; +proto$2.toString = toISOString$1; +proto$2.toJSON = toISOString$1; +proto$2.locale = locale; +proto$2.localeData = localeData; + +// Deprecations +proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); +proto$2.lang = lang; + +// Side effect imports + +// FORMATTING + +addFormatToken('X', 0, 0, 'unix'); +addFormatToken('x', 0, 0, 'valueOf'); + +// PARSING + +addRegexToken('x', matchSigned); +addRegexToken('X', matchTimestamp); +addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); +}); +addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); +}); + +// Side effect imports + + +hooks.version = '2.19.2'; + +setHookCallback(createLocal); + +hooks.fn = proto; +hooks.min = min; +hooks.max = max; +hooks.now = now; +hooks.utc = createUTC; +hooks.unix = createUnix; +hooks.months = listMonths; +hooks.isDate = isDate; +hooks.locale = getSetGlobalLocale; +hooks.invalid = createInvalid; +hooks.duration = createDuration; +hooks.isMoment = isMoment; +hooks.weekdays = listWeekdays; +hooks.parseZone = createInZone; +hooks.localeData = getLocale; +hooks.isDuration = isDuration; +hooks.monthsShort = listMonthsShort; +hooks.weekdaysMin = listWeekdaysMin; +hooks.defineLocale = defineLocale; +hooks.updateLocale = updateLocale; +hooks.locales = listLocales; +hooks.weekdaysShort = listWeekdaysShort; +hooks.normalizeUnits = normalizeUnits; +hooks.relativeTimeRounding = getSetRelativeTimeRounding; +hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; +hooks.calendarFormat = getCalendarFormat; +hooks.prototype = proto; + +return hooks; + +}))); diff --git a/basicsuite/ebike-ui/mostrecent.bson b/basicsuite/ebike-ui/mostrecent.bson new file mode 100644 index 0000000..5e9edea Binary files /dev/null and b/basicsuite/ebike-ui/mostrecent.bson differ diff --git a/basicsuite/ebike-ui/navigation.cpp b/basicsuite/ebike-ui/navigation.cpp new file mode 100644 index 0000000..067636e --- /dev/null +++ b/basicsuite/ebike-ui/navigation.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#include "navigation.h" +#include "mapbox.h" + +Navigation::Navigation(MapBox *mapbox, QObject *parent) + : QObject(parent) + , m_mapbox(mapbox) + , m_position(QGeoCoordinate(36.131961, -115.153048), QDateTime::currentDateTime()) + , m_zoomlevel(18) + , m_active(false) + , m_routeDirection(0) + , m_routePosition(m_position.coordinate()) +{ + m_position.setAttribute(QGeoPositionInfo::Direction, 0); +} + +void Navigation::setPosition(const QGeoPositionInfo &position) +{ + if (m_position != position) { + m_position = position; + emit positionChanged(m_position); + } +} + +void Navigation::setCoordinate(const QGeoCoordinate &coordinate) +{ + if (m_position.coordinate() != coordinate) { + m_position.setCoordinate(coordinate); + emit coordinateChanged(m_position.coordinate()); + } +} + +void Navigation::setDirection(qreal direction) +{ + if (qFuzzyCompare(m_position.attribute(QGeoPositionInfo::Direction), direction)) + return; + + m_position.setAttribute(QGeoPositionInfo::Direction, direction); + emit directionChanged(direction); +} + +void Navigation::setZoomLevel(qreal zoomlevel) +{ + if (qFuzzyCompare(m_zoomlevel, zoomlevel)) + return; + + m_zoomlevel = zoomlevel; + emit zoomLevelChanged(m_zoomlevel); +} + +void Navigation::setActive(bool active) +{ + if (m_active == active) + return; + + m_active = active; + emit activeChanged(m_active); +} diff --git a/basicsuite/ebike-ui/navigation.h b/basicsuite/ebike-ui/navigation.h new file mode 100644 index 0000000..6c9533f --- /dev/null +++ b/basicsuite/ebike-ui/navigation.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NAVIGATION_H +#define NAVIGATION_H + +#include +#include +#include +#include +#include + +#include + +class MapBox; + +class Navigation : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QGeoPositionInfo position READ position WRITE setPosition NOTIFY positionChanged) + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged) + Q_PROPERTY(qreal direction READ direction WRITE setDirection NOTIFY directionChanged) + Q_PROPERTY(qreal zoomlevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged) + Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) + Q_PROPERTY(qreal routeDirection READ routeDirection NOTIFY routeDirectionChanged) + Q_PROPERTY(QGeoCoordinate routePosition READ routePosition NOTIFY routePositionChanged) + +public: + explicit Navigation(MapBox *mapbox, QObject *parent = nullptr); + +public: + // Getters + const QGeoPositionInfo &position() const { return m_position; } + QGeoCoordinate coordinate() const { return m_position.coordinate(); } + qreal direction() const { return m_position.attribute(QGeoPositionInfo::Direction); } + qreal zoomLevel() const { return m_zoomlevel; } + bool active() const { return m_active; } + + qreal routeDirection() const { return m_routeDirection; } + QGeoCoordinate routePosition() const { return m_routePosition; } + + // Setters + void setPosition(const QGeoPositionInfo &position); + void setCoordinate(const QGeoCoordinate &coordinate); + void setDirection(qreal direction); + void setZoomLevel(qreal zoomlevel); + void setActive(bool active); + +signals: + void positionChanged(QGeoPositionInfo position); + void coordinateChanged(QGeoCoordinate coordinate); + void directionChanged(qreal direction); + void zoomLevelChanged(qreal zoomlevel); + void activeChanged(bool active); + + void routeDirectionChanged(qreal routeDirection); + void routePositionChanged(QGeoCoordinate routePosition); + +private: + MapBox *m_mapbox; + QGeoPositionInfo m_position; + qreal m_zoomlevel; + bool m_active; + + qreal m_routeDirection; + QGeoCoordinate m_routePosition; +}; + +#endif // NAVIGATION_H diff --git a/basicsuite/ebike-ui/preview_l.jpg b/basicsuite/ebike-ui/preview_l.jpg new file mode 100644 index 0000000..4cd0851 Binary files /dev/null and b/basicsuite/ebike-ui/preview_l.jpg differ diff --git a/basicsuite/ebike-ui/qml.qrc b/basicsuite/ebike-ui/qml.qrc new file mode 100644 index 0000000..810c477 --- /dev/null +++ b/basicsuite/ebike-ui/qml.qrc @@ -0,0 +1,107 @@ + + + qtquickcontrols2.conf + mainview.qml + NaviPage.qml + StatsPage.qml + MainPage.qml + BikeStyle/Colors.qml + BikeStyle/qmldir + SpeedView.qml + fonts/Montserrat-Medium.ttf + fonts/Montserrat-Bold.ttf + fonts/Montserrat-Light.ttf + fonts/Montserrat-Regular.ttf + StatsBox.qml + BikeStyle/UILayout.qml + NaviBox.qml + LightsBox.qml + ModeBox.qml + ClockView.qml + images/lights_off.png + images/lights_on.png + fonts/Teko-Bold.ttf + fonts/Teko-Light.ttf + fonts/Teko-Medium.ttf + fonts/Teko-Regular.ttf + MusicPlayer.qml + images/map-marker.png + images/trip.png + images/calories.png + images/nextsong.png + images/nextsong_pressed.png + images/play.png + images/play_pressed.png + images/prevsong.png + images/prevsong_pressed.png + images/speed.png + images/battery.png + images/assist.png + ConfigurationDrawer.qml + IconifiedTabButton.qml + fonts/fontawesome-webfont.ttf + GeneralTab.qml + ColumnSpacer.qml + BikeInfoTab.qml + TripChart.qml + images/top_curtain_drag.png + FpsItem.qml + images/spinner.png + images/checkmark.png + images/nav_left.png + images/nav_right.png + images/nav_straight.png + images/small_speedometer_arrow.png + images/map_locate.png + images/map_zoomin.png + images/map_zoomout.png + images/info.png + images/info_selected.png + images/list.png + images/list_selected.png + images/settings.png + images/settings_selected.png + ConfigurationItem.qml + images/curtain_up_arrow.png + NaviButton.qml + images/search.png + images/search_cancel.png + NaviGuide.qml + images/arrow_left.png + images/arrow_right.png + StatsRow.qml + images/fps_icon.png + images/curtain_shadow_handle.png + images/map_btn_shadow.png + images/map_destination.png + images/map_location_arrow.png + NaviTripInfo.qml + moment.js + images/small_speedometer_shadow.png + images/navigation_widget_shadow.png + images/small_input_box_shadow.png + images/nav_bear_l.png + images/nav_bear_r.png + images/nav_hard_l.png + images/nav_hard_r.png + images/nav_light_left.png + images/nav_light_right.png + images/nav_nodir.png + images/nav_uturn_l.png + images/nav_uturn_r.png + ViewTab.qml + images/pause.png + images/pause_pressed.png + images/ok.png + images/warning.png + images/bike-battery.png + images/bike-brakes.png + images/bike-chain.png + images/bike-frontwheel.png + images/bike-gears.png + images/bike-rearwheel.png + images/bike-light.png + ToggleSwitch.qml + images/blue_circle_gps_area.png + + diff --git a/basicsuite/ebike-ui/qtquickcontrols2.conf b/basicsuite/ebike-ui/qtquickcontrols2.conf new file mode 100644 index 0000000..1764b16 --- /dev/null +++ b/basicsuite/ebike-ui/qtquickcontrols2.conf @@ -0,0 +1,15 @@ +; This file can be edited to change the style of the application +; See Styling Qt Quick Controls 2 in the documentation for details: +; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html + +[Controls] +Style=Default + +[Universal] +Theme=Light +;Accent=Steel + +[Material] +Theme=Light +;Accent=BlueGrey +;Primary=BlueGray diff --git a/basicsuite/ebike-ui/socketclient.cpp b/basicsuite/ebike-ui/socketclient.cpp new file mode 100644 index 0000000..d40d268 --- /dev/null +++ b/basicsuite/ebike-ui/socketclient.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "socketclient.h" + +SocketClient::SocketClient(QObject *parent) + : QObject(parent) + , m_socket(new QLocalSocket(this)) +{ + // Connect socket signals + connect(m_socket, &QLocalSocket::connected, this, &SocketClient::connected); + connect(m_socket, &QLocalSocket::disconnected, this, &SocketClient::disconnected); + connect(m_socket, &QLocalSocket::readyRead, this, &SocketClient::readyRead); + + // Setup timer to try to reconnect after disconnect + m_connectionTimer.setInterval(5000); + connect(&m_connectionTimer, &QTimer::timeout, this, &SocketClient::reconnect); + connect(m_socket, &QLocalSocket::connected, &m_connectionTimer, &QTimer::stop); + connect(m_socket, &QLocalSocket::disconnected, + &m_connectionTimer, static_cast(&QTimer::start)); + connect(m_socket, static_cast(&QLocalSocket::error), + &m_connectionTimer, static_cast(&QTimer::start)); +} + +void SocketClient::connectToServer(const QString &servername) +{ + m_servername = servername; + reconnect(); +} + +void SocketClient::reconnect() +{ + qDebug("Connecting to server..."); + m_socket->connectToServer(m_servername); +} + +qint64 SocketClient::write(const QByteArray &data) +{ + return m_socket->write(data); +} + +/** + * @brief send a QByteArray to the server + * @param message + * + * Adds the length of the message as a header and sends the message to the server. + */ +void SocketClient::sendToServer(const QByteArray &message) +{ + // Prepend the message length + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << static_cast(message.size() + 4); + data.append(message); + + write(data); +} + +/** + * @brief send a Json object to the server + * @param message + * + * Sends a QJsonObject object to the server, encoded in Qt's internal binary format. + */ +void SocketClient::sendToServer(const QJsonObject &message) +{ + QJsonDocument doc(message); + sendToServer(doc.toBinaryData()); +} + +/** + * @brief reads incoming data from the server + * + * Parses only message headers and body as QByteArray, but does not care about + * the contents. All complete messages are processed at @see parseMessage. + */ +void SocketClient::readyRead() +{ + m_data += m_socket->readAll(); + + bool messagefound = true; + while (messagefound) { + messagefound = false; + // If we have at least some data + if (m_data.size() >= 4) { + // Extract message size + qint32 messagesize; + QDataStream stream(m_data.left(4)); + stream >> messagesize; + + // If we have enough data for at least one message + if (m_data.size() >= messagesize) { + // Extract actual message + QByteArray message = m_data.mid(4, messagesize - 4); + parseMessage(message); + // Drop necessary amount of bytes + m_data = m_data.mid(messagesize); + messagefound = true; // Try to parse another message + } + } + } +} + +/** + * @brief parse the contents of a QByteArray + * @param message + * + * Contents are parsed from QJsonDocument's binary data. This separation allows + * the format to be changed later on, if need be. + */ +void SocketClient::parseMessage(const QByteArray &message) +{ + // Parse message from raw format + QJsonDocument doc = QJsonDocument::fromBinaryData(message); + emit newMessage(doc.object()); +} diff --git a/basicsuite/ebike-ui/socketclient.h b/basicsuite/ebike-ui/socketclient.h new file mode 100644 index 0000000..dc100a2 --- /dev/null +++ b/basicsuite/ebike-ui/socketclient.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SOCKETCLIENT_H +#define SOCKETCLIENT_H + +#include +#include +#include +#include + +/** + * @brief The SocketClient class + * + * Socket container and message parser for client communications. + */ +class SocketClient : public QObject +{ + Q_OBJECT + +public: + explicit SocketClient(QObject *parent = nullptr); + +public: + QLocalSocket* socket(void) const { return m_socket; } + qint64 write(const QByteArray &data); + void sendToServer(const QByteArray &message); + void sendToServer(const QJsonObject &message); + +private: + void parseMessage(const QByteArray &message); + +signals: + void connected(); + void disconnected(); + + void newMessage(const QJsonObject &message); + +public slots: + void connectToServer(const QString &servername); + +private slots: + void reconnect(); + void readyRead(); + +private: + QLocalSocket *m_socket; + QString m_servername; + QTimer m_connectionTimer; + QByteArray m_data; +}; + +#endif // SOCKETCLIENT_H diff --git a/basicsuite/ebike-ui/suggestionsmodel.cpp b/basicsuite/ebike-ui/suggestionsmodel.cpp new file mode 100644 index 0000000..fa028f0 --- /dev/null +++ b/basicsuite/ebike-ui/suggestionsmodel.cpp @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +#include "suggestionsmodel.h" + +#define EBIKE_DEMO_MODE + +static const char mostRecentFilename[] = "mostrecent.bson"; + +SuggestionsModel::SuggestionsModel(QObject *parent) + : QAbstractListModel(parent) +{ + loadMostRecent(); +} + +SuggestionsModel::SuggestionsModel(const QJsonArray &suggestions, QObject *parent) + : QAbstractListModel(parent) + , m_suggestions(suggestions) +{ + loadMostRecent(); +} + +QVariant SuggestionsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + // Only horizontal header + if (orientation == Qt::Vertical) + return QVariant(); + + if (role == Qt::DisplayRole && section == 0) + return tr("Place"); + + return QAbstractListModel::headerData(section, orientation, role); +} + +int SuggestionsModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_suggestions.isEmpty() ? m_mostrecent.size() : m_suggestions.size(); +} + +QVariant SuggestionsModel::data(const QModelIndex &index, int role) const +{ + QJsonObject obj = get(index.row()); + if (role == Qt::DisplayRole) { + return obj.value("place_name").toVariant(); + } else if (role == PlaceNameRole) { + return obj.value("place_name").toVariant(); + } + + return QVariant(); +} + +QHash SuggestionsModel::roleNames() const +{ + QHash roles = QAbstractListModel::roleNames(); + roles[PlaceNameRole] = "placename"; + return roles; +} + +const QJsonObject SuggestionsModel::get(int index) const +{ + return m_suggestions.isEmpty() ? + m_mostrecent[index].toObject() : + m_suggestions[index].toObject(); +} + +void SuggestionsModel::setSuggestions(const QJsonArray &suggestions) +{ + beginResetModel(); + m_suggestions = suggestions; + endResetModel(); + emit emptyChanged(); +} + +void SuggestionsModel::clear() +{ + beginResetModel(); + m_suggestions = QJsonArray(); + endResetModel(); + emit emptyChanged(); +} + +void SuggestionsModel::addToMostRecent(const QJsonObject &place) +{ + Q_UNUSED(place) + // For the demo, do not add new most recent places +#ifndef EBIKE_DEMO_MODE + if (!m_mostrecent.contains(place)) + m_mostrecent.prepend(place); + if (m_mostrecent.size() > 3) + m_mostrecent.pop_back(); + saveMostRecent(); +#endif +} + +void SuggestionsModel::loadMostRecent() +{ + QDir dir(QCoreApplication::applicationDirPath()); + + // Load most recent places + QString mostRecentFilepath = dir.absoluteFilePath(mostRecentFilename); + QFile mostRecentFile(mostRecentFilepath); + if (mostRecentFile.open(QIODevice::ReadOnly)) { + QJsonDocument doc = QJsonDocument::fromBinaryData(mostRecentFile.readAll()); + m_mostrecent = doc.array(); + } +} + +void SuggestionsModel::saveMostRecent() const +{ + QDir dir(QCoreApplication::applicationDirPath()); + + // Load most recent places + QString mostRecentFilepath = dir.absoluteFilePath(mostRecentFilename); + QFile mostRecentFile(mostRecentFilepath); + if (mostRecentFile.open(QIODevice::WriteOnly)) { + QJsonDocument doc(m_mostrecent); + mostRecentFile.write(doc.toBinaryData()); + } +} diff --git a/basicsuite/ebike-ui/suggestionsmodel.h b/basicsuite/ebike-ui/suggestionsmodel.h new file mode 100644 index 0000000..5bf22b5 --- /dev/null +++ b/basicsuite/ebike-ui/suggestionsmodel.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SUGGESTIONSMODEL_H +#define SUGGESTIONSMODEL_H + +#include +#include +#include + +class SuggestionsModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(bool empty READ isEmpty RESET clear NOTIFY emptyChanged) + +public: + explicit SuggestionsModel(QObject *parent = nullptr); + explicit SuggestionsModel(const QJsonArray &suggestions, QObject *parent = nullptr); + enum SuggestionRoles { + PlaceNameRole = Qt::UserRole + 1 + }; + +public: + virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; + virtual int rowCount(const QModelIndex &parent) const; + virtual QVariant data(const QModelIndex &index, int role) const; + virtual QHash roleNames() const; + + Q_INVOKABLE const QJsonObject get(int index) const; + bool isEmpty() const { return m_suggestions.size() == 0; } + + void setSuggestions(const QJsonArray &suggestions); + Q_INVOKABLE void clear(); + + Q_INVOKABLE void addToMostRecent(const QJsonObject &place); + +private: + void loadMostRecent(); + void saveMostRecent() const; + +signals: + void emptyChanged(); + +private: + QJsonArray m_mostrecent; + QJsonArray m_suggestions; +}; + +#endif // SUGGESTIONSMODEL_H diff --git a/basicsuite/ebike-ui/tripdatamodel.cpp b/basicsuite/ebike-ui/tripdatamodel.cpp new file mode 100644 index 0000000..b74605f --- /dev/null +++ b/basicsuite/ebike-ui/tripdatamodel.cpp @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "datastore.h" +#include "tripdatamodel.h" + +#include + +TripDataModel::TripDataModel(DataStore *datastore, QObject *parent) + : QAbstractListModel(parent) + , m_datastore(datastore) + , m_refreshing(false) + , m_saving(false) +{ +} + +int TripDataModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_trips.count() + 1; // +1 for current trip +} + +QVariant TripDataModel::data(const QModelIndex &index, int role) const +{ + QJsonObject obj = get(index.row()); + if (role == DurationRole) + return obj.value("duration").toDouble(); // Seconds + else if (role == DistanceRole) + return m_datastore->convertDistance(obj.value("distance").toDouble()); + else if (role == CaloriesRole) + return obj.value("calories").toDouble(); + else if (role == MaxspeedRole) + return m_datastore->convertSpeed(obj.value("maxspeed").toDouble()); + else if (role == AvgspeedRole) + return m_datastore->convertSpeed(obj.value("distance").toDouble() / obj.value("duration").toDouble()); + else if (role == AscentRole) + return obj.value("ascent").toDouble(); + else if (role == StartTimeRole) + return obj.value("starttime").toDouble(); + + return QVariant(); +} + +QHash TripDataModel::roleNames() const +{ + QHash roles = QAbstractListModel::roleNames(); + roles[DurationRole] = "duration"; + roles[DistanceRole] = "distance"; + roles[CaloriesRole] = "calories"; + roles[MaxspeedRole] = "maxspeed"; + roles[AvgspeedRole] = "avgspeed"; + roles[AscentRole] = "ascent"; + roles[StartTimeRole] = "starttime"; + + return roles; +} + +void TripDataModel::setTrips(const QJsonArray &trips) +{ + beginResetModel(); + m_trips = trips; + endResetModel(); + m_refreshing = false; + emit refreshingChanged(m_refreshing); + emit refreshed(); +} + +void TripDataModel::addTrip(const QJsonObject &trip) +{ + // Always append at the beginning of the list, easy to calculate + int newRow = 0; + beginInsertRows(QModelIndex(), newRow, newRow); + m_trips.append(trip); + endInsertRows(); + emit tripDataSaved(newRow); +} + +const QJsonObject TripDataModel::get(int index) const +{ + return index == 0 ? m_current : m_trips.at(m_trips.count() - index).toObject(); +} + +void TripDataModel::refresh() +{ + m_refreshing = true; + emit refreshingChanged(m_refreshing); + m_datastore->getTrips(); +} + +void TripDataModel::endTrip() +{ + m_saving = true; + emit savingChanged(m_saving); + m_datastore->endTrip(); +} + +void TripDataModel::setCurrentTrip(const QJsonObject ¤t) +{ + m_current = current; + QModelIndex currentIndex = index(0); + emit dataChanged(currentIndex, currentIndex); +} diff --git a/basicsuite/ebike-ui/tripdatamodel.h b/basicsuite/ebike-ui/tripdatamodel.h new file mode 100644 index 0000000..56be84e --- /dev/null +++ b/basicsuite/ebike-ui/tripdatamodel.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the E-Bike demo project. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TRIPDATAMODEL_H +#define TRIPDATAMODEL_H + +#include +#include +#include + +class DataStore; + +class TripDataModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged) + Q_PROPERTY(bool saving READ saving NOTIFY savingChanged) + +public: + explicit TripDataModel(DataStore *datastore, QObject *parent = nullptr); + enum TripDataRoles { + DurationRole = Qt::UserRole + 1, + DistanceRole, + CaloriesRole, + MaxspeedRole, + AvgspeedRole, + AscentRole, + StartTimeRole + }; + +public: + virtual int rowCount(const QModelIndex &parent) const; + virtual QVariant data(const QModelIndex &index, int role) const; + virtual QHash roleNames() const; + + Q_INVOKABLE const QJsonObject get(int index) const; + + void setTrips(const QJsonArray &trips); + void addTrip(const QJsonObject &trip); + + bool refreshing() const { return m_refreshing; } + bool saving() const { return m_saving; } + +signals: + void refreshed(); + void refreshingChanged(bool refreshing); + void savingChanged(bool saving); + void tripDataSaved(int index); + +public slots: + void refresh(); + void endTrip(); + void setCurrentTrip(const QJsonObject ¤t); + +private: + DataStore *m_datastore; + QJsonArray m_trips; + QJsonObject m_current; + bool m_refreshing; + bool m_saving; +}; + +#endif // TRIPDATAMODEL_H diff --git a/basicsuite/enterprise-charts/BaseChart.qml b/basicsuite/enterprise-charts/BaseChart.qml new file mode 100644 index 0000000..27811b0 --- /dev/null +++ b/basicsuite/enterprise-charts/BaseChart.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtCharts 2.0 + +ChartView{ + id: chart + titleFont.family: appFont + titleFont.styleName: "SemiBold" + titleColor: "white" + legend.alignment: Qt.AlignBottom + legend.font.family: appFont + legend.labelColor: "white" + antialiasing: true + backgroundColor: "transparent" +} diff --git a/basicsuite/enterprise-charts/View1.qml b/basicsuite/enterprise-charts/View1.qml index 64aa78c..dad431b 100644 --- a/basicsuite/enterprise-charts/View1.qml +++ b/basicsuite/enterprise-charts/View1.qml @@ -53,31 +53,30 @@ import QtQuick 2.0 //![2] import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent property variant othersSlice: 0 + //![1] - ChartView { + BaseChart { id: chart title: "Top-5 car brand shares in Finland" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true - PieSeries { id: pieSeries - PieSlice { label: "Volkswagen"; value: 13.5 } - PieSlice { label: "Toyota"; value: 10.9 } - PieSlice { label: "Ford"; value: 8.6 } - PieSlice { label: "Skoda"; value: 8.2 } - PieSlice { label: "Volvo"; value: 6.8 } + PieSlice { label: "Volkswagen"; value: 13.5; color: _primaryGreen } + PieSlice { label: "Toyota"; value: 10.9; color: _mediumGreen } + PieSlice { label: "Ford"; value: 8.6; color: _darkGreen } + PieSlice { label: "Skoda"; value: 8.2; color: _primaryGrey } + PieSlice { label: "Volvo"; value: 6.8; color: _secondaryGrey } } } Component.onCompleted: { // You can also manipulate slices dynamically othersSlice = pieSeries.append("Others", 52.0); + othersSlice.color = mediumGrey; pieSeries.find("Volkswagen").exploded = true; } //![1] diff --git a/basicsuite/enterprise-charts/View10.qml b/basicsuite/enterprise-charts/View10.qml index adcd350..b61236f 100644 --- a/basicsuite/enterprise-charts/View10.qml +++ b/basicsuite/enterprise-charts/View10.qml @@ -51,21 +51,24 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Horizontal Stacked Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true HorizontalStackedBarSeries { axisY: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View11.qml b/basicsuite/enterprise-charts/View11.qml index 37c3d80..319e94a 100644 --- a/basicsuite/enterprise-charts/View11.qml +++ b/basicsuite/enterprise-charts/View11.qml @@ -51,21 +51,25 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Horizontal Percent Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true HorizontalPercentBarSeries { axisY: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View12.qml b/basicsuite/enterprise-charts/View12.qml index 39d8a13..bd40cbd 100644 --- a/basicsuite/enterprise-charts/View12.qml +++ b/basicsuite/enterprise-charts/View12.qml @@ -51,42 +51,39 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { id: chart title: "Production costs" - anchors.fill: parent legend.visible: false - antialiasing: true - + anchors.fill: parent PieSeries { id: pieOuter size: 0.96 holeSize: 0.7 - PieSlice { id: slice; label: "Alpha"; value: 19511; color: "#8AB846"; borderColor: "#163430" } - PieSlice { label: "Epsilon"; value: 11105; color: "#C0EEFF"; borderColor: "#3B391C" } - PieSlice { label: "Psi"; value: 9352; color: "#DF8939"; borderColor: "#13060C" } + + PieSlice { id: slice; label: "Alpha"; value: 19511; color: _primaryGreen; borderColor: "#163430" } + PieSlice { label: "Epsilon"; value: 11105; color: _primaryGrey; borderColor: "#3B391C" } + PieSlice { label: "Psi"; value: 9352; color: darkGrey2; borderColor: "#13060C" } } PieSeries { size: 0.7 id: pieInner holeSize: 0.25 + PieSlice { label: "Materials"; value: 10334; color: _mediumGreen; borderColor: "#163430" } + PieSlice { label: "Employee"; value: 3066; color: _darkGreen; borderColor: "#163430" } + PieSlice { label: "Logistics"; value: 6111; color: _mediumGreen; borderColor: "#163430" } - PieSlice { label: "Materials"; value: 10334; color: "#8AB846"; borderColor: "#163430" } - PieSlice { label: "Employee"; value: 3066; color: "#AAE356"; borderColor: "#163430" } - PieSlice { label: "Logistics"; value: 6111; color: "#99CC4E"; borderColor: "#163430" } - - PieSlice { label: "Materials"; value: 7371; color: "#C0EEFF"; borderColor: "#3B391C" } - PieSlice { label: "Employee"; value: 2443; color: "#C9FAFF"; borderColor: "#3B391C" } - PieSlice { label: "Logistics"; value: 1291; color: "#B0FAFF"; borderColor: "#3B391C" } + PieSlice { label: "Materials"; value: 7371; color: mediumGrey2; borderColor: "#3B391C" } + PieSlice { label: "Employee"; value: 2443; color: mediumGrey; borderColor: "#3B391C" } + PieSlice { label: "Logistics"; value: 1291; color: mediumGrey2; borderColor: "#3B391C" } - PieSlice { label: "Materials"; value: 4022; color: "#DF8939"; borderColor: "#13060C" } - PieSlice { label: "Employee"; value: 3998; color: "#FC9D42"; borderColor: "#13060C" } - PieSlice { label: "Logistics"; value: 1332; color: "#F2963F"; borderColor: "#13060C" } + PieSlice { label: "Materials"; value: 4022; color: _secondaryGrey; borderColor: "#13060C" } + PieSlice { label: "Employee"; value: 3998; color: darkGrey; borderColor: "#13060C" } + PieSlice { label: "Logistics"; value: 1332; color: _secondaryGrey; borderColor: "#13060C" } } } @@ -96,11 +93,15 @@ Rectangle { pieOuter.at(i).labelPosition = PieSlice.LabelOutside; pieOuter.at(i).labelVisible = true; pieOuter.at(i).borderWidth = 3; + pieOuter.at(i).labelColor = "white"; + pieOuter.at(i).labelFont = appFont; } for (var i = 0; i < pieInner.count; i++) { pieInner.at(i).labelPosition = PieSlice.LabelInsideNormal; pieInner.at(i).labelVisible = true; pieInner.at(i).borderWidth = 2; + pieInner.at(i).labelColor = "white"; + pieInner.at(i).labelFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View2.qml b/basicsuite/enterprise-charts/View2.qml index 8f136cc..8f201a6 100644 --- a/basicsuite/enterprise-charts/View2.qml +++ b/basicsuite/enterprise-charts/View2.qml @@ -51,17 +51,15 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Line" anchors.fill: parent - antialiasing: true - LineSeries { name: "LineSeries" + color: _primaryGreen XYPoint { x: 0; y: 0 } XYPoint { x: 1.1; y: 2.1 } XYPoint { x: 1.9; y: 3.3 } @@ -70,6 +68,13 @@ Rectangle { XYPoint { x: 3.4; y: 3.0 } XYPoint { x: 4.1; y: 3.3 } } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; + } } //![1] } diff --git a/basicsuite/enterprise-charts/View3.qml b/basicsuite/enterprise-charts/View3.qml index 8429050..3211e9e 100644 --- a/basicsuite/enterprise-charts/View3.qml +++ b/basicsuite/enterprise-charts/View3.qml @@ -51,17 +51,15 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Spline" anchors.fill: parent - antialiasing: true - SplineSeries { name: "SplineSeries" + color: _primaryGreen XYPoint { x: 0; y: 0.0 } XYPoint { x: 1.1; y: 3.2 } XYPoint { x: 1.9; y: 2.4 } @@ -70,6 +68,13 @@ Rectangle { XYPoint { x: 3.4; y: 2.3 } XYPoint { x: 4.1; y: 3.1 } } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; + } } //![1] } diff --git a/basicsuite/enterprise-charts/View4.qml b/basicsuite/enterprise-charts/View4.qml index ac3ea56..442d231 100644 --- a/basicsuite/enterprise-charts/View4.qml +++ b/basicsuite/enterprise-charts/View4.qml @@ -51,15 +51,12 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "NHL All-Star Team Players" anchors.fill: parent - antialiasing: true - ValueAxis { id: valueAxis min: 2000 @@ -70,8 +67,8 @@ Rectangle { AreaSeries { name: "Russian" - color: "#FFD52B1E" - borderColor: "#FF0039A5" + color: mediumGrey2 + borderColor: _darkGreen borderWidth: 3 axisX: valueAxis upperSeries: LineSeries { @@ -93,8 +90,8 @@ Rectangle { AreaSeries { name: "Swedish" - color: "#AF005292" - borderColor: "#AFFDCA00" + color: lightGrey + borderColor: _mediumGreen borderWidth: 3 axisX: valueAxis upperSeries: LineSeries { @@ -115,8 +112,8 @@ Rectangle { AreaSeries { name: "Finnish" - color: "#00357F" - borderColor: "#FEFEFE" + color: _secondaryGrey + borderColor: _primaryGreen borderWidth: 3 axisX: valueAxis upperSeries: LineSeries { @@ -134,5 +131,12 @@ Rectangle { XYPoint { x: 2011; y: 1 } } } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; + } } } diff --git a/basicsuite/enterprise-charts/View5.qml b/basicsuite/enterprise-charts/View5.qml index f1005c3..be7794b 100644 --- a/basicsuite/enterprise-charts/View5.qml +++ b/basicsuite/enterprise-charts/View5.qml @@ -51,18 +51,16 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Scatters" anchors.fill: parent - antialiasing: true - ScatterSeries { id: scatter1 name: "Scatter1" + color: _primaryGreen XYPoint { x: 1.5; y: 1.5 } XYPoint { x: 1.5; y: 1.6 } XYPoint { x: 1.57; y: 1.55 } @@ -74,6 +72,7 @@ Rectangle { ScatterSeries { name: "Scatter2" + color: _primaryGrey //![1] XYPoint { x: 2.0; y: 2.0 } XYPoint { x: 2.0; y: 2.1 } @@ -82,5 +81,12 @@ Rectangle { XYPoint { x: 2.4; y: 2.7 } XYPoint { x: 2.67; y: 2.65 } } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; + } } } diff --git a/basicsuite/enterprise-charts/View6.qml b/basicsuite/enterprise-charts/View6.qml index 6f29bf9..a104b8a 100644 --- a/basicsuite/enterprise-charts/View6.qml +++ b/basicsuite/enterprise-charts/View6.qml @@ -51,22 +51,25 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true - BarSeries { id: mySeries axisX: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View7.qml b/basicsuite/enterprise-charts/View7.qml index c8b6654..78e5350 100644 --- a/basicsuite/enterprise-charts/View7.qml +++ b/basicsuite/enterprise-charts/View7.qml @@ -51,22 +51,24 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Stacked Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true - StackedBarSeries { id: mySeries axisX: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View8.qml b/basicsuite/enterprise-charts/View8.qml index fbb30e3..803b6cd 100644 --- a/basicsuite/enterprise-charts/View8.qml +++ b/basicsuite/enterprise-charts/View8.qml @@ -51,21 +51,24 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Percent Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true - PercentBarSeries { axisX: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/View9.qml b/basicsuite/enterprise-charts/View9.qml index 23bc818..a85711e 100644 --- a/basicsuite/enterprise-charts/View9.qml +++ b/basicsuite/enterprise-charts/View9.qml @@ -51,21 +51,24 @@ import QtQuick 2.0 import QtCharts 2.0 -Rectangle { +Item { anchors.fill: parent - //![1] - ChartView { + BaseChart { title: "Horizontal Bar series" anchors.fill: parent - legend.alignment: Qt.AlignBottom - antialiasing: true - HorizontalBarSeries { axisY: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] } - BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] } - BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] } - BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] } + BarSet { label: "Bob"; color: _primaryGreen; values: [2, 2, 3, 4, 5, 6] } + BarSet { label: "Susan"; color: _primaryGrey; values: [5, 1, 2, 4, 1, 7] } + BarSet { label: "James"; color: _secondaryGrey; values: [3, 5, 8, 13, 5, 8] } + } + + Component.onCompleted: { + axes[0].labelsColor = "white"; + axes[1].labelsColor = "white"; + axes[0].labelsFont = appFont; + axes[1].labelsFont = appFont; } } //![1] diff --git a/basicsuite/enterprise-charts/demo.xml b/basicsuite/enterprise-charts/demo.xml new file mode 100644 index 0000000..938e13c --- /dev/null +++ b/basicsuite/enterprise-charts/demo.xml @@ -0,0 +1,9 @@ + + + + +This demo presents different types of charts that are available from Qt Charts library. + +Qt Charts is part of the Qt Enterprise addons package which provides a set of easy to use chart components. It uses the Qt Graphics View Framework, therefore charts can be easily integrated to modern user interfaces. Qt Charts can be used as QWidgets, QGraphicsWidget, or QML types. + + diff --git a/basicsuite/enterprise-charts/enterprise-charts.pro b/basicsuite/enterprise-charts/enterprise-charts.pro index 7896c62..b71e6eb 100644 --- a/basicsuite/enterprise-charts/enterprise-charts.pro +++ b/basicsuite/enterprise-charts/enterprise-charts.pro @@ -4,6 +4,7 @@ include(../shared/shared.pri) b2qtdemo_deploy_defaults() content.files = \ + BaseChart.qml \ loader.qml \ main.qml \ View1.qml \ @@ -17,7 +18,7 @@ content.files = \ View6.qml \ View7.qml \ View8.qml \ - View9.qml + View9.qml \ content.path = $$DESTPATH diff --git a/basicsuite/enterprise-charts/main.qml b/basicsuite/enterprise-charts/main.qml index d29ed2d..02b4f8b 100644 --- a/basicsuite/enterprise-charts/main.qml +++ b/basicsuite/enterprise-charts/main.qml @@ -56,9 +56,18 @@ Rectangle { width: 600 height: 400 property bool sourceLoaded: false + color: _backgroundColor + + property string darkGrey: "#222840" + property string darkGrey2: "#53586b" + property string mediumGrey: "#6b7080" + property string mediumGrey2: "#848895" + property string lightGrey: "#b5b7bf" + ListView { id: root + objectName: "chartsListView" focus: true anchors.fill: parent snapMode: ListView.SnapOneItem @@ -112,6 +121,7 @@ Rectangle { color: "white" anchors.centerIn: parent text: "You can navigate between views using swipe or arrow keys" + font.family: appFont } Behavior on opacity { diff --git a/basicsuite/enterprise-charts/preview_l.jpg b/basicsuite/enterprise-charts/preview_l.jpg index 131cc8f..a298283 100644 Binary files a/basicsuite/enterprise-charts/preview_l.jpg and b/basicsuite/enterprise-charts/preview_l.jpg differ diff --git a/basicsuite/enterprise-dashboard/demo.xml b/basicsuite/enterprise-dashboard/demo.xml new file mode 100644 index 0000000..b8afaed --- /dev/null +++ b/basicsuite/enterprise-dashboard/demo.xml @@ -0,0 +1,7 @@ + + + + +The dashboard demo uses Qt Quick Extras to create a digital dashboard for a car. + + diff --git a/basicsuite/enterprise-flat-controls/demo.xml b/basicsuite/enterprise-flat-controls/demo.xml new file mode 100644 index 0000000..861d1e8 --- /dev/null +++ b/basicsuite/enterprise-flat-controls/demo.xml @@ -0,0 +1,7 @@ + + + + +The Flat Style Gallery example showcases the Qt Quick Controls. This demo combines both the standard Qt Quick Controls as well as the Qt Quick Extras both of which are using the new Flat style. The Flat style for Qt Quick Controls has a modern look and feel and is perfect for the touch driven interfaces commonly developed by device creators. + + diff --git a/basicsuite/enterprise-qtdatavis3d/demo.xml b/basicsuite/enterprise-qtdatavis3d/demo.xml new file mode 100644 index 0000000..df6102b --- /dev/null +++ b/basicsuite/enterprise-qtdatavis3d/demo.xml @@ -0,0 +1,7 @@ + + + + +Shows how to make a 3D surface plot, displaying three layers from three different height map images using Surface3D with Qt Quick. + + diff --git a/basicsuite/graphicaleffects/demo.xml b/basicsuite/graphicaleffects/demo.xml new file mode 100644 index 0000000..07d4fe4 --- /dev/null +++ b/basicsuite/graphicaleffects/demo.xml @@ -0,0 +1,9 @@ + + + + +This example shows the Qt Quick ShaderEffect type and the Qt Graphical Effects module. Qt Quick provides the ability to use inline GLSL in your Qt Quick applications to create stunning visual effects. + +However, as UIs typically reuse many of the same effects, the Qt Graphical Effects module provides a set of predefined, commonly used effects. This includes blur, drop-shadows, glow, blending, opacity masks, and more. + + diff --git a/basicsuite/graphicaleffects/graphicaleffects.pro b/basicsuite/graphicaleffects/graphicaleffects.pro index 2c51fe7..da9e8a3 100644 --- a/basicsuite/graphicaleffects/graphicaleffects.pro +++ b/basicsuite/graphicaleffects/graphicaleffects.pro @@ -17,7 +17,7 @@ content.files = \ effect_OpacityMask.qml \ effect_ThresholdMask.qml \ main.qml \ - images + images \ content.path = $$DESTPATH diff --git a/basicsuite/graphicaleffects/main.qml b/basicsuite/graphicaleffects/main.qml index 29bf3cc..eb6421c 100644 --- a/basicsuite/graphicaleffects/main.qml +++ b/basicsuite/graphicaleffects/main.qml @@ -73,12 +73,12 @@ Item { anchors.right: checkers.left anchors.top: parent.top anchors.bottom: parent.bottom - color: "black" + color: _backgroundColor } ListModel { id: listModel - ListElement { name: "Brignthness / Contrast"; file: "effect_BrightnessContrast.qml" } + ListElement { name: "Brightness / Contrast"; file: "effect_BrightnessContrast.qml" } ListElement { name: "Colorize"; file: "effect_Colorize.qml" } ListElement { name: "Displacement"; file: "effect_Displacement.qml" } ListElement { name: "Drop Shadow"; file: "effect_DropShadow.qml" } @@ -94,6 +94,7 @@ Item { ListView { id: list + objectName: "graphicsEffectsList" anchors.top: parent.top anchors.left: parent.left width: parent.width / 4 @@ -102,8 +103,6 @@ Item { clip: true focus: true - highlightMoveDuration: 0 - onCurrentItemChanged: { var entry = listModel.get(currentIndex); loader.source = entry.file; @@ -111,9 +110,7 @@ Item { model: listModel - highlight: Rectangle { - color: "steelblue" - } + delegate: Item { id: delegateRoot @@ -121,20 +118,13 @@ Item { width: list.width height: root.height * 0.05 - Rectangle { - width: parent.width - height: 3 - anchors.bottom: parent.bottom - gradient: Gradient { - GradientStop { position: 0; color: "transparent" } - GradientStop { position: 0.5; color: "lightgray" } - GradientStop { position: 1; color: "transparent" } - } - } + property bool isSelected: list.currentIndex == index Text { - color: "white" - font.pixelSize: parent.height * 0.5 + color: parent.isSelected ? _primaryGreen : "white" + font.pixelSize: parent.height * 0.625 + font.family: appFont + font.styleName: parent.isSelected ? "Bold" : "Regular" anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: -2 x: parent.width * 0.1 @@ -162,14 +152,14 @@ Item { var h = canvas.height; - ctx.fillStyle = "rgb(50, 50, 50)" + ctx.fillStyle = "rgb(58, 64, 85)" ctx.beginPath(); ctx.roundedRect(0, 0, w, h, w * 0.1, w * 0.1); ctx.fill(); var margin = canvas.padding; var segmentSize = 4 - ctx.strokeStyle = "gray" + ctx.strokeStyle = _primaryGrey ctx.beginPath(); ctx.moveTo(margin, margin); ctx.lineTo(margin, h-margin); @@ -189,7 +179,7 @@ Item { } Rectangle { - color: "red" + color: _primaryGreen width: parent.width / 20 height: width radius: width / 2 @@ -208,6 +198,7 @@ Item { color: "white" font.pixelSize: canvas.padding * 0.5 + font.family: appFont } Text { @@ -222,6 +213,7 @@ Item { + (loader.item != undefined && typeof loader.item.feedbackY != 'undefined' ? ": " + loader.item.feedbackY.toFixed(2) : ""); color: "white" font.pixelSize: canvas.padding * 0.5 + font.family: appFont } MouseArea { diff --git a/basicsuite/graphicaleffects/preview_l.jpg b/basicsuite/graphicaleffects/preview_l.jpg index fde1964..d5333c8 100644 Binary files a/basicsuite/graphicaleffects/preview_l.jpg and b/basicsuite/graphicaleffects/preview_l.jpg differ diff --git a/basicsuite/mediaplayer/Content.qml b/basicsuite/mediaplayer/Content.qml old mode 100755 new mode 100644 index aa31f09..00ad381 --- a/basicsuite/mediaplayer/Content.qml +++ b/basicsuite/mediaplayer/Content.qml @@ -85,6 +85,9 @@ Rectangle { Loader { id: effectLoader source: effectSource + onItemChanged: { + updateSource() + } } onWidthChanged: { @@ -99,11 +102,7 @@ Rectangle { onEffectSourceChanged: { effectLoader.source = effectSource - effectLoader.item.parent = root - effectLoader.item.targetWidth = root.width - effectLoader.item.targetHeight = root.height updateSource() - effectLoader.item.source = theSource } function init() { @@ -114,8 +113,13 @@ Rectangle { function updateSource() { theSource.sourceItem = videoContent.mediaSource == "" ? introBackground : videoContent - if (effectLoader.item) + if (effectLoader.item) { + effectLoader.item.parent = root + effectLoader.item.targetWidth = root.width + effectLoader.item.targetHeight = root.height effectLoader.item.anchors.fill = videoContent + effectLoader.item.source = theSource + } } function openVideo(path) { diff --git a/basicsuite/mediaplayer/ContentVideo.qml b/basicsuite/mediaplayer/ContentVideo.qml old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/ControlBar.qml b/basicsuite/mediaplayer/ControlBar.qml old mode 100755 new mode 100644 index 05d253e..cdf27f2 --- a/basicsuite/mediaplayer/ControlBar.qml +++ b/basicsuite/mediaplayer/ControlBar.qml @@ -53,8 +53,8 @@ import QtMultimedia 5.0 Rectangle { id: controlBar - height: 150 - color: "#88333333" + height: parent.height * 0.225 + color: _backgroundColor property MediaPlayer mediaPlayer: null property bool isMouseAbove: false @@ -73,13 +73,13 @@ Rectangle { volumeControl.volume = mediaPlayer.volume; } -// MouseArea { -// anchors.fill: controlBar -// hoverEnabled: true + MouseArea { + anchors.fill: controlBar + hoverEnabled: true -// onEntered: controlBar.isMouseAbove = true; -// onExited: controlBar.isMouseAbove = false; -// } + onEntered: controlBar.isMouseAbove = true; + onExited: controlBar.isMouseAbove = false; + } function statusString(stat) { @@ -103,48 +103,12 @@ Rectangle { return "UnknownStatus"; } -// Text { -// id: statusText -// anchors.left: parent.left -// anchors.bottom: parent.top -// anchors.bottomMargin: 12 -// font.pixelSize: 18 -// color: "white" -// text: "Status: " + statusString(mediaPlayer.status) -// } - -// Text { -// anchors.verticalCenter: statusText.verticalCenter -// anchors.left: statusText.right -// anchors.leftMargin: 16 -// font.pixelSize: 18 -// color: "white" -// text: Math.round(mediaPlayer.bufferProgress * 100.0) + "%" -// } - - VolumeControl { - id: volumeControl - anchors.verticalCenter: playbackControl.verticalCenter - anchors.left: controlBar.left - anchors.leftMargin: 15 - onVolumeChanged: mediaPlayer.volume = volume - - Component.onCompleted: { - volumeControl.volume = 0.5; - } - - Connections { - target: mediaPlayer - onVolumeChanged: volumeControl.volume = mediaPlayer.volume - } - } - //Playback Controls PlaybackControl { id: playbackControl - anchors.horizontalCenter: controlBar.horizontalCenter - anchors.bottom: seekControl.top - anchors.bottomMargin: 20 + anchors.left: controlBar.left + anchors.top: controlBar.top + anchors.bottom: controlBar.bottom onPlayButtonPressed: { if (isPlaying) { @@ -171,14 +135,37 @@ Rectangle { onStopButtonPressed: mediaPlayer.stop(); } + //Seek controls + SeekControl { + id: seekControl + anchors.bottom: controlBar.bottom + anchors.bottomMargin: controlBar.height * 0.1 + anchors.right: volumeControl.left + anchors.left: playbackControl.right + anchors.rightMargin: 15 + anchors.leftMargin: 15 + enabled: playbackControl.isPlaybackEnabled + + duration: mediaPlayer.duration + + onSeekValueChanged: { + mediaPlayer.seek(newPosition); + position = mediaPlayer.position; + } + + Component.onCompleted: { + seekable = mediaPlayer.seekable; + } + } + //Toolbar Controls Row { id: toolbarMenuButtons - anchors.right: controlBar.right + anchors.right: volumeControl.left anchors.rightMargin: 15 - anchors.verticalCenter: playbackControl.verticalCenter - spacing: 22 - + anchors.bottom: seekControl.top + spacing: itemMargin + height: parent.height * 0.275 ImageButton { id: fxButton imageSource: "images/FXButton.png" @@ -191,6 +178,7 @@ Rectangle { ImageButton { id: fileButton imageSource: "images/FileButton.png" + onClicked: { openFile(); } @@ -198,47 +186,29 @@ Rectangle { ImageButton { id: urlButton imageSource: "images/UrlButton.png" + onClicked: { openURL(); } } - } - -// ImageButton { -// id: fullscreenButton -// imageSource: "images/FullscreenButton.png" -// onClicked: { -// //Toggle fullscreen -// toggleFullScreen(); -// } -// checkable: true -// checked: applicationWindow.isFullScreen -// anchors.right: controlBar.right -// anchors.top: controlBar.top -// anchors.rightMargin: 15 -// anchors.topMargin: 15 -// } + ImageButton{ + id: infoButton - //Seek controls - SeekControl { - id: seekControl - anchors.bottom: controlBar.bottom - anchors.bottomMargin: 10 - anchors.right: controlBar.right - anchors.left: controlBar.left - anchors.rightMargin: 15 - anchors.leftMargin: 15 - enabled: playbackControl.isPlaybackEnabled - - duration: mediaPlayer.duration - - onSeekValueChanged: { - mediaPlayer.seek(newPosition); - position = mediaPlayer.position; + imageSource: "images/info_icon.svg" + onClicked: metadataView.opacity = 1 + visible: content.videoPlayer.mediaPlayer.status !== MediaPlayer.NoMedia && content.videoPlayer.mediaPlayer.status !== MediaPlayer.InvalidMedia } + } - Component.onCompleted: { - seekable = mediaPlayer.seekable; + VolumeControl { + id: volumeControl + anchors.bottom: parent.bottom + anchors.right: parent.right + onVolumeChanged: mediaPlayer.volume = volume + + Connections { + target: mediaPlayer + onVolumeChanged: volumeControl.volume = mediaPlayer.volume } } @@ -264,7 +234,6 @@ Rectangle { } onSeekableChanged: { - // console.log("seekableChanged: " + mediaPlayer.seekable); seekControl.seekable = mediaPlayer.seekable; } } diff --git a/basicsuite/mediaplayer/EffectSelectionPanel.qml b/basicsuite/mediaplayer/EffectSelectionPanel.qml old mode 100755 new mode 100644 index 4f29f50..9aee910 --- a/basicsuite/mediaplayer/EffectSelectionPanel.qml +++ b/basicsuite/mediaplayer/EffectSelectionPanel.qml @@ -51,8 +51,7 @@ import QtQuick 2.0 Rectangle { id: root - color: "#BB333333" - height: 78 + color: _backgroundColor property int itemHeight: 25 property string effectSource: "" property bool isMouseAbove: mouseAboveMonitor.containsMouse @@ -76,14 +75,14 @@ Rectangle { ListElement { name: "Glow"; source: "Effects/EffectGlow.qml" } ListElement { name: "Isolate"; source: "Effects/EffectIsolate.qml" } //ListElement { name: "Magnify"; source: "Effects/EffectMagnify.qml" } -// ListElement { name: "Page curl"; source: "Effects/EffectPageCurl.qml" } + // ListElement { name: "Page curl"; source: "Effects/EffectPageCurl.qml" } ListElement { name: "Pixelate"; source: "Effects/EffectPixelate.qml" } ListElement { name: "Posterize"; source: "Effects/EffectPosterize.qml" } -// ListElement { name: "Ripple"; source: "Effects/EffectRipple.qml" } + // ListElement { name: "Ripple"; source: "Effects/EffectRipple.qml" } ListElement { name: "Sepia"; source: "Effects/EffectSepia.qml" } ListElement { name: "Sharpen"; source: "Effects/EffectSharpen.qml" } ListElement { name: "Shockwave"; source: "Effects/EffectShockwave.qml" } -// ListElement { name: "Tilt shift"; source: "Effects/EffectTiltShift.qml" } + // ListElement { name: "Tilt shift"; source: "Effects/EffectTiltShift.qml" } ListElement { name: "Toon"; source: "Effects/EffectToon.qml" } ListElement { name: "Warhol"; source: "Effects/EffectWarhol.qml" } ListElement { name: "Wobble"; source: "Effects/EffectWobble.qml" } @@ -104,6 +103,7 @@ Rectangle { height: 0.8 * itemHeight text: name color: "white" + font.family: appFont } states: [ @@ -140,7 +140,7 @@ Rectangle { id: list anchors.fill: parent clip: true - anchors.margins: 14 + anchors.margins: itemMargin model: sources focus: root.visible && root.opacity && urlBar.opacity === 0 @@ -153,18 +153,20 @@ Rectangle { } delegate: Item { - height: 40 + height: itemHeight width: parent.width - Rectangle { + property bool isSelected: list.currentIndex == index + Text { + color: parent.isSelected ? _primaryGreen : "white" + text: name + anchors.centerIn: parent + font.pixelSize: defaultFontSize + font.family: appFont + font.styleName: parent.isSelected ? "Bold" : "Regular" + } + MouseArea { anchors.fill: parent - border.color: index == list.currentIndex ? "#44ffffff" : "transparent" - color: index == list.currentIndex ? "#22ffffff" : "transparent" - radius: 3 - Text { color: "white" ; text: name ; anchors.centerIn: parent; font.pixelSize: 20 } - MouseArea { - anchors.fill: parent - onClicked: list.currentIndex = index - } + onClicked: list.currentIndex = index } } } diff --git a/basicsuite/mediaplayer/FileBrowser.qml b/basicsuite/mediaplayer/FileBrowser.qml index 5ffe130..a111177 100644 --- a/basicsuite/mediaplayer/FileBrowser.qml +++ b/basicsuite/mediaplayer/FileBrowser.qml @@ -50,11 +50,12 @@ import QtQuick 2.0 import Qt.labs.folderlistmodel 2.0 import QtQuick.Controls 1.4 +import QtDeviceUtilities.QtButtonImageProvider 1.0 Item { id: fileBrowser - property string folder: "file:///data/videos" + property string folder: VideosLocation signal fileSelected(string file) @@ -77,7 +78,7 @@ Item { Rectangle { id: root - color: "white" + color: _backgroundColor property alias folder: folders.folder FolderListModel { @@ -110,7 +111,8 @@ Item { wrapMode: Text.WrapAtWordBoundaryOrAnywhere text: fileName font.pixelSize: parent.height * .1 - color: view.currentIndex === index ? "#80c342" : "#46484a" + font.family: appFont + color: mouseRegion.pressed ? _primaryGreen : "white" elide: Text.ElideRight } @@ -182,16 +184,17 @@ Item { Rectangle { width: parent.width; height: 70 - color: "#f6f6f6" + color: _backgroundColor id: titleBar - Button { + QtButton { id: backButton text: qsTr("Back") anchors.left: parent.left anchors.leftMargin: parent.width * .05 anchors.verticalCenter: parent.verticalCenter onClicked: up() + fillColor: _primaryGreen } Text { @@ -203,28 +206,28 @@ Item { anchors.bottom: parent.bottom text: String(folders.folder).replace("file://", "") - color: "#46484a" + color: "white" elide: Text.ElideLeft verticalAlignment: Text.AlignVCenter font.pixelSize: backButton.height * .8 + font.family: appFont } - Button { + QtButton { id: cancelButton text: qsTr("Cancel") - checkable: true - checked: true anchors.right: parent.right anchors.rightMargin: parent.width * .05 anchors.verticalCenter: parent.verticalCenter onClicked: fileBrowser.selectFile("") + fillColor: _primaryGreen } Rectangle { width: parent.width anchors.bottom: parent.bottom height: 2 - color: "#e4e4e4" + color: _primaryGrey } } diff --git a/basicsuite/mediaplayer/ImageButton.qml b/basicsuite/mediaplayer/ImageButton.qml old mode 100755 new mode 100644 index 31bd315..66888ef --- a/basicsuite/mediaplayer/ImageButton.qml +++ b/basicsuite/mediaplayer/ImageButton.qml @@ -49,6 +49,7 @@ ****************************************************************************/ import QtQuick 2.0 +import QtGraphicalEffects 1.0 Item { id: root @@ -73,15 +74,17 @@ Item { visible: true opacity: pressed ? 0.6 : 1 smooth: true + height: toolbarMenuButtons.height + width: height } -// ColorOverlay { -// id: glowEffect -// anchors.fill: image -// source: image -// color: pressed ? "#22000000" : checked ? "orange" : "white" -// visible: checked || hover || pressed -// } + ColorOverlay { + id: glowEffect + anchors.fill: image + source: image + color: pressed ? "#22000000" : checked ? _primaryGreen : "white" + visible: checked || hover || pressed + } MouseArea { id: mouseArea diff --git a/basicsuite/mediaplayer/MetadataView.qml b/basicsuite/mediaplayer/MetadataView.qml index e85df5e..34b53b4 100644 --- a/basicsuite/mediaplayer/MetadataView.qml +++ b/basicsuite/mediaplayer/MetadataView.qml @@ -48,6 +48,7 @@ ** ****************************************************************************/ import QtQuick 2.0 +import QtMultimedia 5.0 Rectangle { id: root @@ -62,10 +63,12 @@ Rectangle { Rectangle { height: column.height + 30 width: 500 - color: "#BB222222" + color: _backgroundColor + opacity: 0.9 anchors.centerIn: parent anchors.verticalCenterOffset: -50 - + border.color: _primaryGrey + border.width: 2 Column { id: column @@ -80,6 +83,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.mediaType !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -88,6 +92,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.title !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -96,6 +101,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.leadPerformer !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -104,6 +110,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.contributingArtist !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -112,6 +119,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.albumTitle !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -120,6 +128,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.albumArtist !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -128,6 +137,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.author !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -136,6 +146,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.composer !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -144,6 +155,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.writer !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -152,6 +164,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.genre !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -160,6 +173,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.trackNumber !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -168,6 +182,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.year !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -176,6 +191,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.duration !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -184,6 +200,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.resolution !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -192,6 +209,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.audioBitRate !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -200,6 +218,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.videoBitRate !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } @@ -208,6 +227,7 @@ Rectangle { visible: mediaPlayer && mediaPlayer.metaData.date !== undefined color: "white" font.pixelSize: 24 + font.family: appFont width: parent.width wrapMode: Text.WordWrap } diff --git a/basicsuite/mediaplayer/ParameterPanel.qml b/basicsuite/mediaplayer/ParameterPanel.qml index bc6a73e..b67381a 100644 --- a/basicsuite/mediaplayer/ParameterPanel.qml +++ b/basicsuite/mediaplayer/ParameterPanel.qml @@ -51,11 +51,10 @@ import QtQuick 2.0 Rectangle { id: root - height: view.model.count * sliderHeight - color: "#BB333333" + color: _backgroundColor property color lineColor: "black" property real spacing: 10 - property real sliderHeight: 50 + property real sliderHeight: height * 0.4 property bool isMouseAbove: mouseAboveMonitor.containsMouse property ListModel model: ListModel { } @@ -82,24 +81,26 @@ Rectangle { anchors { top: parent.top bottom: parent.bottom - leftMargin: 15 + leftMargin: itemMargin left: parent.left } horizontalAlignment: Text.AlignRight verticalAlignment: Text.AlignVCenter - font.pixelSize: 20 + font.pixelSize: defaultFontSize font.capitalization: Font.Capitalize - width: 90 + font.family: appFont + width: root.width * 0.2 + fontSizeMode: Text.Fit } - Slider { + PlayerSlider { anchors { verticalCenter: text.verticalCenter verticalCenterOffset: 3 left: text.right - leftMargin: 20 + leftMargin: itemMargin right: parent.right - rightMargin: 20 + rightMargin: itemMargin } value: model.value onValueChanged: view.model.setProperty(index, "value", value) diff --git a/basicsuite/mediaplayer/PlaybackControl.qml b/basicsuite/mediaplayer/PlaybackControl.qml old mode 100755 new mode 100644 index 66c1c92..99b1d5c --- a/basicsuite/mediaplayer/PlaybackControl.qml +++ b/basicsuite/mediaplayer/PlaybackControl.qml @@ -49,11 +49,13 @@ ****************************************************************************/ import QtQuick 2.0 +import QtDeviceUtilities.QtButtonImageProvider 1.0 Row { + anchors.leftMargin: parent.width * 0.02 id: root - spacing: 26 - height: playButton.height + spacing: parent.width * 0.02 + height: parent.height property bool isPlaybackEnabled: false property bool isPlaying: false @@ -64,46 +66,42 @@ Row { signal stopButtonPressed() //Playback Controls - ImageButton { - id: rateReverseButton - enabled: isPlaybackEnabled - imageSource: "images/RateButtonReverse.png" - anchors.verticalCenter: root.verticalCenter - onClicked: { - reverseButtonPressed(); + QtButton{ + id: playPauseButton + width: controlBar.width * 0.06 + height: width + anchors.bottom: parent.bottom + anchors.bottomMargin: root.spacing + fillColor: _primaryGreen + Image{ + anchors.centerIn: parent + width: parent.width * 0.5 + height: width + source: !isPlaying ? "images/play_icon.svg" : "images/pause_icon.svg" + sourceSize.width: parent.width + sourceSize.height: parent.height } - } - ImageButton { - id: playButton - enabled: isPlaybackEnabled - imageSource: !isPlaying ? "images/PlayButton.png" : "images/PauseButton.png" - anchors.verticalCenter: root.verticalCenter -// anchors.right: rateForwardButton.left -// anchors.rightMargin: 10 onClicked: { playButtonPressed(); } } -// Rectangle{ -// enabled: isPlaybackEnabled -// color: "white" -// opacity: enabled ? 1 : 0.3 -// width: playButton.width -// height: width -// anchors.verticalCenter: root.verticalCenter -// MouseArea { -// anchors.fill: parent -// onClicked: stopButtonPressed(); -// } -// } - - ImageButton { - id: rateForwardButton - enabled: isPlaybackEnabled - imageSource: "images/RateButtonForward.png" - anchors.verticalCenter: root.verticalCenter + QtButton{ + id: stopButton + width: controlBar.width * 0.06 + height: width + anchors.bottom: parent.bottom + anchors.bottomMargin: root.spacing + fillColor: _primaryGreen + Image{ + anchors.centerIn: parent + width: parent.width * 0.5 + height: width + source: "images/stop_icon.svg" + sourceSize.width: parent.width + sourceSize.height: parent.height + } onClicked: { - forwardButtonPressed(); + stopButtonPressed(); } } } diff --git a/basicsuite/mediaplayer/Slider.qml b/basicsuite/mediaplayer/PlayerSlider.qml similarity index 92% rename from basicsuite/mediaplayer/Slider.qml rename to basicsuite/mediaplayer/PlayerSlider.qml index 0cacbc7..0ec52b5 100644 --- a/basicsuite/mediaplayer/Slider.qml +++ b/basicsuite/mediaplayer/PlayerSlider.qml @@ -51,8 +51,7 @@ import QtQuick 2.0 Item { id: slider - - height: handleBack.height + height: handle.height // value is read/write. property real value: 0 property real maximum: 1 @@ -81,8 +80,9 @@ Item { id: background width: slider.width anchors.verticalCenter: slider.verticalCenter - height: 2 - color: "#666666" + height: 5 + color: _primaryGrey + radius: 2 MouseArea { id: backgroundMouse @@ -119,29 +119,19 @@ Item { anchors.right: handle.right anchors.rightMargin: handle.width / 2 visible: slider.enabled - color: "#98c66c" + color: "white" + radius: 2 } Rectangle { - id: handleBack + id: handle width: 40 height: width radius: width / 2 - color: "#8898c66c" + color: _primaryGreen antialiasing: true anchors.centerIn: handle - visible: handle.visible - } - - Rectangle { - id: handle - width: 14 - height: width - radius: width / 2 - antialiasing: true - color: "#98c66c" - anchors.verticalCenter: background.verticalCenter - visible: slider.enabled + visible: true } } diff --git a/basicsuite/mediaplayer/SeekControl.qml b/basicsuite/mediaplayer/SeekControl.qml old mode 100755 new mode 100644 index a7ca93f..16987f7 --- a/basicsuite/mediaplayer/SeekControl.qml +++ b/basicsuite/mediaplayer/SeekControl.qml @@ -48,11 +48,11 @@ ** ****************************************************************************/ import QtQuick 2.0 +import QtQuick.Controls 2.2 Item { id: root - height: seekSlider.height - + height: parent.height * 0.5 property int position: 0 property int duration: 0 property bool seekable: false @@ -62,29 +62,15 @@ Item { signal seekValueChanged(int newPosition) onPositionChanged: { - elapsedText.text = formatTime(position); seekSlider.value = position; } - onDurationChanged: { - remainingText.text = formatTime(duration); - } - - Text { - id: elapsedText - anchors.verticalCenter: seekSlider.verticalCenter - anchors.left: root.left - text: "00:00" - font.pixelSize: 20 - color: "#cccccc" - } - - Slider { + PlayerSlider { id: seekSlider - anchors.leftMargin: 30 - anchors.rightMargin: 30 - anchors.left: elapsedText.right - anchors.right: remainingText.left + anchors.leftMargin: parent.width * 0.02 + anchors.rightMargin: parent.width * 0.02 + anchors.left: parent.left + anchors.right: parent.right anchors.verticalCenter: root.verticalCenter mutable: root.seekable enabled: root.enabled @@ -98,15 +84,6 @@ Item { } } - Text { - id: remainingText - anchors.verticalCenter: seekSlider.verticalCenter - anchors.right: root.right - text: "00:00" - font.pixelSize: 20 - color: "#cccccc" - } - function formatTime(time) { time = time / 1000 var hours = Math.floor(time / 3600); diff --git a/basicsuite/mediaplayer/UrlBar.qml b/basicsuite/mediaplayer/UrlBar.qml index dbaa8d0..73e9cc5 100644 --- a/basicsuite/mediaplayer/UrlBar.qml +++ b/basicsuite/mediaplayer/UrlBar.qml @@ -48,6 +48,7 @@ ** ****************************************************************************/ import QtQuick 2.0 +import QtQuick.Controls 2.0 Rectangle { id: root @@ -76,54 +77,39 @@ Rectangle { text: "Enter URL" color: "white" font.pixelSize: 20 + font.family: appFont } - BorderImage { - id: urlBar - source: "images/ControlBar.png" - border.top: 12 - border.bottom: 12 - border.left: 12 - border.right: 12 + TextField { + id: urlInput height: 70 - anchors.centerIn: parent - anchors.verticalCenterOffset: -170 width: 600 + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: height * 0.45 + color: "white" + text: "" + placeholderText: "http://" + font.family: appFont + font.styleName: "Light" + background: Rectangle { + color: _backgroundColor + opacity: 0.8 + border.color: _primaryGrey + border.width: 2 + } + onAccepted: root.urlAccepted(urlInput.text); + } - Rectangle { + Rectangle { + anchors.right: urlBar.left + anchors.rightMargin: 32 + anchors.verticalCenter: urlBar.verticalCenter + height: 70 + width: 70 + color: _primaryGrey + MouseArea { anchors.fill: parent - anchors.margins: 16 - color: "#66ffffff" - border.color: "#bbffffff" - radius: 2 - antialiasing: true - - TextInput { - id: urlInput - selectionColor: "#aaffffff" - selectedTextColor: "black" - selectByMouse: true - anchors.fill: parent - anchors.margins: 5 - font.pixelSize: 24 - color: "black" - text: "http://" - onAccepted: root.urlAccepted(urlInput.text); - - } + onClicked: { urlInput.text = ""; urlInput.paste(); } } } - -// Rectangle { -// anchors.right: urlBar.left -// anchors.rightMargin: 32 -// anchors.verticalCenter: urlBar.verticalCenter -// height: 70 -// width: 70 -// color: "gray" -// MouseArea { -// anchors.fill: parent -// onClicked: { urlInput.text = ""; urlInput.paste(); } -// } -// } } diff --git a/basicsuite/mediaplayer/VolumeControl.qml b/basicsuite/mediaplayer/VolumeControl.qml old mode 100755 new mode 100644 index f2bd427..ab8bec8 --- a/basicsuite/mediaplayer/VolumeControl.qml +++ b/basicsuite/mediaplayer/VolumeControl.qml @@ -49,46 +49,110 @@ ****************************************************************************/ import QtQuick 2.0 +import QtDeviceUtilities.QtButtonImageProvider 1.0 +import QtQuick.Controls 2.2 Item { id: root - width: 210 - height: volumeUp.height - + width: parent.width * 0.1 + height: parent.height property alias volume: volumeSlider.value - + property bool muted: root.volume == 0.0 + property bool volumeItemUp: volumeItem.y == (volumeItem.height + volumeItem.height * 0.05) //Volume Controls - ImageButton { - id: volumeDown - imageSource: "images/VolumeDown.png" - anchors.verticalCenter: root.verticalCenter - anchors.left: root.left - scale: 1.4 + QtButton{ + id: toggleVolumeButton + width: controlBar.width * 0.06 + height: width + anchors.bottom: parent.bottom + anchors.bottomMargin: controlBar.width * 0.02 + anchors.horizontalCenter: parent.horizontalCenter + fillColor: _primaryGreen + + Image{ + anchors.centerIn: parent + width: parent.width * 0.5 + height: width + source: !muted ? "images/volume_icon.svg" : "images/mute_icon.svg" + sourceSize.width: parent.width + sourceSize.height: parent.height + } onClicked: { - root.volume = 0.0; + if (volumeItem.opacity == 0) + volumeItem.opacity = 1; + else if (volumeItem.opacity > 0) + volumeItem.opacity = 0; + + if (volumeItem.y === 0) + volumeItem.y -= (volumeItem.height + itemMargin); + else if (volumeItem !== 0) + volumeItem.y = 0; } } - Slider { - id: volumeSlider - anchors.left: volumeDown.right - anchors.leftMargin: 22 - anchors.rightMargin: 22 - anchors.right: volumeUp.left - maximum: 1.0 - minimum: 0.0 - anchors.verticalCenter: root.verticalCenter - anchors.verticalCenterOffset: 1 - } - ImageButton { - id: volumeUp - imageSource: "images/VolumeUp.png" - anchors.verticalCenter: root.verticalCenter - anchors.verticalCenterOffset: 1 - anchors.right: root.right - scale: 1.4 - onClicked: { - root.volume = 1.0 + Item{ + id: volumeItem + height: applicationWindow.height * 0.4 + anchors.right: toggleVolumeButton.left //? + opacity: 0 + y: 0 + z: -1000 + QtButton{ + id: muteVolumeButton + width: controlBar.width * 0.06 + height: width + anchors.bottom: parent.bottom + fillColor: _primaryGrey + borderColor: "transparent" + Image{ + anchors.centerIn: parent + width: parent.width * 0.5 + height: parent.height * 0.5 + source: "images/mute_icon.svg" + sourceSize.width: parent.width + sourceSize.height: parent.height + } + onClicked: { + root.volume = 0.0 + } } + + Slider { + id: volumeSlider + anchors.bottom: muteVolumeButton.top + anchors.bottomMargin: itemMargin + anchors.top: parent.top + anchors.horizontalCenter: muteVolumeButton.horizontalCenter + orientation: Qt.Vertical + + background: Rectangle{ + id: sliderBackground + x: volumeSlider.leftPadding + volumeSlider.availableWidth / 2 - width / 2 + y: volumeSlider.bottomPadding + implicitWidth: 5 + implicitHeight: 200 + height: volumeSlider.availableHeight + width: implicitWidth + radius: 2 + color: "white" + Rectangle{ + height: volumeSlider.visualPosition * parent.height + width: parent.width + color: _primaryGrey + radius: 2 + } + } + handle: Rectangle{ + x: volumeSlider.leftPadding + volumeSlider.availableWidth / 2 - width / 2 + y: volumeSlider.bottomPadding + volumeSlider.visualPosition * (volumeSlider.availableHeight - height) + width: sliderBackground.width * 7 + height: width + radius: height * 0.5 + color: _primaryGreen + } + } + + Behavior on opacity { NumberAnimation { duration: 100 } } + Behavior on y { NumberAnimation { duration: 100 } } } } diff --git a/basicsuite/mediaplayer/demo.xml b/basicsuite/mediaplayer/demo.xml new file mode 100644 index 0000000..dd5cf2b --- /dev/null +++ b/basicsuite/mediaplayer/demo.xml @@ -0,0 +1,9 @@ + + + + +The Media Player example demonstrates the use of media playback features provided by Qt Multimedia with Qt Quick. + +It can play content either from a file or a network source, both videos and music. + + diff --git a/basicsuite/mediaplayer/images/FullscreenButton.png b/basicsuite/mediaplayer/images/FullscreenButton.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/PlaybackSlider.png b/basicsuite/mediaplayer/images/PlaybackSlider.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/SliderHandle.png b/basicsuite/mediaplayer/images/SliderHandle.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/SliderProgress.png b/basicsuite/mediaplayer/images/SliderProgress.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/VolumeDown.png b/basicsuite/mediaplayer/images/VolumeDown.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/VolumeUp.png b/basicsuite/mediaplayer/images/VolumeUp.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/back_icon.svg b/basicsuite/mediaplayer/images/back_icon.svg new file mode 100644 index 0000000..6034bd7 --- /dev/null +++ b/basicsuite/mediaplayer/images/back_icon.svg @@ -0,0 +1 @@ +back_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/bluetooth_icon.svg b/basicsuite/mediaplayer/images/bluetooth_icon.svg new file mode 100644 index 0000000..5dfaa97 --- /dev/null +++ b/basicsuite/mediaplayer/images/bluetooth_icon.svg @@ -0,0 +1 @@ +bluetooth_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/close_icon.svg b/basicsuite/mediaplayer/images/close_icon.svg new file mode 100644 index 0000000..c98fe51 --- /dev/null +++ b/basicsuite/mediaplayer/images/close_icon.svg @@ -0,0 +1 @@ +close_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/header_toggle_icon.svg b/basicsuite/mediaplayer/images/header_toggle_icon.svg new file mode 100644 index 0000000..06d0b6a --- /dev/null +++ b/basicsuite/mediaplayer/images/header_toggle_icon.svg @@ -0,0 +1 @@ +header_toggle_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/info_icon.svg b/basicsuite/mediaplayer/images/info_icon.svg new file mode 100644 index 0000000..64d24c0 --- /dev/null +++ b/basicsuite/mediaplayer/images/info_icon.svg @@ -0,0 +1 @@ +info_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/language_icon.svg b/basicsuite/mediaplayer/images/language_icon.svg new file mode 100644 index 0000000..f1235c5 --- /dev/null +++ b/basicsuite/mediaplayer/images/language_icon.svg @@ -0,0 +1 @@ +language_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/mute_icon.svg b/basicsuite/mediaplayer/images/mute_icon.svg new file mode 100644 index 0000000..2ffd61f --- /dev/null +++ b/basicsuite/mediaplayer/images/mute_icon.svg @@ -0,0 +1 @@ +mute_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/pause_icon.svg b/basicsuite/mediaplayer/images/pause_icon.svg new file mode 100644 index 0000000..04000f9 --- /dev/null +++ b/basicsuite/mediaplayer/images/pause_icon.svg @@ -0,0 +1 @@ +pause_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/play_icon.svg b/basicsuite/mediaplayer/images/play_icon.svg new file mode 100644 index 0000000..ab27771 --- /dev/null +++ b/basicsuite/mediaplayer/images/play_icon.svg @@ -0,0 +1 @@ +play_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/power_icon.svg b/basicsuite/mediaplayer/images/power_icon.svg new file mode 100644 index 0000000..b922c0e --- /dev/null +++ b/basicsuite/mediaplayer/images/power_icon.svg @@ -0,0 +1 @@ +power_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/qt-logo.png b/basicsuite/mediaplayer/images/qt-logo.png old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/settings_icon.svg b/basicsuite/mediaplayer/images/settings_icon.svg new file mode 100644 index 0000000..7f5dbde --- /dev/null +++ b/basicsuite/mediaplayer/images/settings_icon.svg @@ -0,0 +1 @@ +settings_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/settingsmenu_launcher_icon.svg b/basicsuite/mediaplayer/images/settingsmenu_launcher_icon.svg new file mode 100644 index 0000000..479a79f --- /dev/null +++ b/basicsuite/mediaplayer/images/settingsmenu_launcher_icon.svg @@ -0,0 +1 @@ +settingsmenu_launcher_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/stop_icon.svg b/basicsuite/mediaplayer/images/stop_icon.svg new file mode 100644 index 0000000..2eeff5f --- /dev/null +++ b/basicsuite/mediaplayer/images/stop_icon.svg @@ -0,0 +1 @@ +stop_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/images/titlebar.sci b/basicsuite/mediaplayer/images/titlebar.sci old mode 100755 new mode 100644 diff --git a/basicsuite/mediaplayer/images/volume_icon.svg b/basicsuite/mediaplayer/images/volume_icon.svg new file mode 100644 index 0000000..12f944e --- /dev/null +++ b/basicsuite/mediaplayer/images/volume_icon.svg @@ -0,0 +1 @@ +volume_icon \ No newline at end of file diff --git a/basicsuite/mediaplayer/main.qml b/basicsuite/mediaplayer/main.qml old mode 100755 new mode 100644 index d1667bf..741309d --- a/basicsuite/mediaplayer/main.qml +++ b/basicsuite/mediaplayer/main.qml @@ -50,11 +50,16 @@ import QtQuick 2.0 import QtMultimedia 5.0 +import QtDeviceUtilities.QtButtonImageProvider 1.0 FocusScope { id: applicationWindow focus: true + property real buttonHeight: height * 0.05 + property real itemMargin: Math.min(width * 0.025, height * 0.025) + property real defaultFontSize: height * 0.0375 + MouseArea { id: mouseActivityMonitor anchors.fill: parent @@ -114,42 +119,57 @@ FocusScope { onOpenFX: { applicationWindow.openFX(); } - - onToggleFullScreen: { -// viewer.toggleFullscreen(); - } } - ParameterPanel { - id: parameterPanel - opacity: controlBar.opacity - visible: effectSelectionPanel.visible && model.count !== 0 - height: 116 - width: 500 + Rectangle { + id: effectsWrapper + color: "transparent" + Behavior on opacity { NumberAnimation { } } anchors { - bottomMargin: 15 + top: parent.top bottom: controlBar.top - right: effectSelectionPanel.left - rightMargin: 15 + bottomMargin: itemMargin + right: parent.right + left: parent.left } - } + visible: opacity > 0 + opacity: 0 - EffectSelectionPanel { - id: effectSelectionPanel - visible: false - opacity: controlBar.opacity - anchors { - bottom: controlBar.top - right: controlBar.right - // rightMargin: 15 - bottomMargin: 15 + ParameterPanel { + id: parameterPanel + opacity: controlBar.opacity * 0.9 + visible: effectSelectionPanel.visible && model.count !== 0 + height: parent.height * 0.15 + width: parent.width * 0.4 + anchors { + bottom: parent.bottom + right: effectSelectionPanel.left + rightMargin: itemMargin + } + z: 10 } - width: 250 - height: 350 - itemHeight: 80 - onEffectSourceChanged: { - content.effectSource = effectSource - parameterPanel.model = content.effect.parameters + + EffectSelectionPanel { + id: effectSelectionPanel + opacity: controlBar.opacity * 0.9 + width: parent.width * 0.225 + height: parent.height * 0.7 + anchors { + right: parent.right + bottom: parent.bottom + } + z: 10 + onEffectSourceChanged: { + content.effectSource = effectSource + parameterPanel.model = content.effect.parameters + } + itemHeight: height / 8 + } + + MouseArea{ + anchors.fill: parent + onClicked: effectsWrapper.opacity = 0 + enabled: effectsWrapper.opacity !== 0 } } @@ -165,35 +185,6 @@ FocusScope { } } - Rectangle { - anchors.right: parent.right - anchors.top: parent.top - anchors.rightMargin: 32 - anchors.topMargin: 32 - width: 40 - height: 40 - radius: width / 2 - color: infoMouser.pressed ? "#BB999999" : "#88444444" - antialiasing: true - visible: content.videoPlayer.mediaPlayer.status !== MediaPlayer.NoMedia && controlBar.state === "VISIBLE" - - Text { - anchors.centerIn: parent - text: "i" - font.italic: true - font.bold: true - color: "white" - font.pixelSize: 28 - } - - MouseArea { - id: infoMouser - anchors.fill: parent - anchors.margins: -10 - onClicked: metadataView.opacity = 1 - } - } - MetadataView { id: metadataView mediaPlayer: content.videoPlayer.mediaPlayer @@ -223,7 +214,6 @@ FocusScope { openFX(); return; } else if (event.key === Qt.Key_F && event.modifiers & Qt.ControlModifier) { -// viewer.toggleFullscreen(); return; } else if (event.key === Qt.Key_Up || event.key === Qt.Key_VolumeUp) { content.videoPlayer.mediaPlayer.volume = Math.min(1, content.videoPlayer.mediaPlayer.volume + 0.1); @@ -241,7 +231,6 @@ FocusScope { } return; } else if (applicationWindow.isFullScreen && event.key === Qt.Key_Escape) { -// viewer.toggleFullscreen(); return; } @@ -267,14 +256,10 @@ FocusScope { function init() { content.init() - content.openVideo("file:///data/videos/Qt_video_720p.webm"); + content.openVideo(DefaultVideoUrl); } function openVideo() { - //videoFileBrowser.show() - // var videoFile = viewer.openFileDialog(); - // if (videoFile != "") - // content.openVideo(videoFile); fileBrowser.show() } @@ -287,7 +272,7 @@ FocusScope { } function openFX() { - effectSelectionPanel.visible = !effectSelectionPanel.visible; + effectsWrapper.opacity = effectsWrapper.opacity === 0 ? 1 : 0 } function close() { diff --git a/basicsuite/mediaplayer/mediaplayer.pro b/basicsuite/mediaplayer/mediaplayer.pro index 4667caf..c56ba88 100644 --- a/basicsuite/mediaplayer/mediaplayer.pro +++ b/basicsuite/mediaplayer/mediaplayer.pro @@ -15,8 +15,8 @@ content.files = \ MetadataView.qml \ ParameterPanel.qml \ PlaybackControl.qml \ + PlayerSlider.qml \ SeekControl.qml \ - Slider.qml \ UrlBar.qml \ VolumeControl.qml \ Effects \ diff --git a/basicsuite/mediaplayer/preview_l.jpg b/basicsuite/mediaplayer/preview_l.jpg index f6cc262..98f528e 100644 Binary files a/basicsuite/mediaplayer/preview_l.jpg and b/basicsuite/mediaplayer/preview_l.jpg differ diff --git a/basicsuite/qt5-cinematicdemo/demo.xml b/basicsuite/qt5-cinematicdemo/demo.xml new file mode 100644 index 0000000..2886b75 --- /dev/null +++ b/basicsuite/qt5-cinematicdemo/demo.xml @@ -0,0 +1,9 @@ + + + + +The Qt 5 Cinematic Experience is a demo by "QUIt Coding". + +The demo shows off a number features of Qt Quick. A nicely styled list control of movie covers with lighting effects, particles and transitions. The information roll-down curvy curtain is implemented using inline GLSL in the QML file. The source code for this demo and more awesome looking Qt Quick examples are available from quitcoding.com. + + diff --git a/basicsuite/qtquickcontrols2/demo.xml b/basicsuite/qtquickcontrols2/demo.xml new file mode 100644 index 0000000..4d3b8b6 --- /dev/null +++ b/basicsuite/qtquickcontrols2/demo.xml @@ -0,0 +1,9 @@ + + + + +The gallery example is a simple application with a drawer menu that contains all the Qt Quick Controls 2. + +Each menu item opens a page that shows the graphical appearance of a control, allows you to interact with the control, and explains in which circumstances it is handy to use this control. + + diff --git a/basicsuite/qtquickcontrols2/gallery.cpp b/basicsuite/qtquickcontrols2/gallery.cpp new file mode 100644 index 0000000..f6c6f66 --- /dev/null +++ b/basicsuite/qtquickcontrols2/gallery.cpp @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication::setApplicationName("Gallery"); + QGuiApplication::setOrganizationName("QtProject"); + + // Do not set HighDpiScaling for emulator, see QTBUG-64815 + if (qEnvironmentVariableIsEmpty("QTGLESSTREAM_DISPLAY")) { + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + } + + QGuiApplication app(argc, argv); + + QIcon::setThemeName("gallery"); + + QSettings settings; + QString style = QQuickStyle::name(); + if (!style.isEmpty()) + settings.setValue("style", style); + else + QQuickStyle::setStyle(settings.value("style").toString()); + + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("availableStyles", QQuickStyle::availableStyles()); + engine.load(QUrl("qrc:/main.qml")); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20/back.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20/back.png new file mode 100644 index 0000000..db43e27 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20/back.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20/drawer.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20/drawer.png new file mode 100644 index 0000000..1e974ef Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20/drawer.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20/menu.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20/menu.png new file mode 100644 index 0000000..a10473d Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20/menu.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/back.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/back.png new file mode 100644 index 0000000..c55ab31 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/back.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/drawer.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/drawer.png new file mode 100644 index 0000000..eba3b6c Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/drawer.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/menu.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/menu.png new file mode 100644 index 0000000..649c2a0 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@2/menu.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/back.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/back.png new file mode 100644 index 0000000..b228eb8 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/back.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/drawer.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/drawer.png new file mode 100644 index 0000000..3584ed6 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/drawer.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/menu.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/menu.png new file mode 100644 index 0000000..9554b69 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@3/menu.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/back.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/back.png new file mode 100644 index 0000000..dd157e7 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/back.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/drawer.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/drawer.png new file mode 100644 index 0000000..60d93af Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/drawer.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/menu.png b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/menu.png new file mode 100644 index 0000000..187c171 Binary files /dev/null and b/basicsuite/qtquickcontrols2/icons/gallery/20x20@4/menu.png differ diff --git a/basicsuite/qtquickcontrols2/icons/gallery/index.theme b/basicsuite/qtquickcontrols2/icons/gallery/index.theme new file mode 100644 index 0000000..a1bcd5e --- /dev/null +++ b/basicsuite/qtquickcontrols2/icons/gallery/index.theme @@ -0,0 +1,24 @@ +[Icon Theme] +Name=Gallery +Comment=Qt Quick Controls 2 Gallery Example Icon Theme + +Directories=20x20,20x20@2,20x20@3,20x20@4 + +[20x20] +Size=20 +Type=Fixed + +[20x20@2] +Size=20 +Scale=2 +Type=Fixed + +[20x20@3] +Size=20 +Scale=3 +Type=Fixed + +[20x20@4] +Size=20 +Scale=4 +Type=Fixed diff --git a/basicsuite/qtquickcontrols2/images/arrow.png b/basicsuite/qtquickcontrols2/images/arrow.png new file mode 100644 index 0000000..d81accb Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrow.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrow@2x.png b/basicsuite/qtquickcontrols2/images/arrow@2x.png new file mode 100644 index 0000000..309c018 Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrow@2x.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrow@3x.png b/basicsuite/qtquickcontrols2/images/arrow@3x.png new file mode 100644 index 0000000..e146ecc Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrow@3x.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrow@4x.png b/basicsuite/qtquickcontrols2/images/arrow@4x.png new file mode 100644 index 0000000..b2ad27f Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrow@4x.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrows.png b/basicsuite/qtquickcontrols2/images/arrows.png new file mode 100644 index 0000000..d38b94a Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrows.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrows@2x.png b/basicsuite/qtquickcontrols2/images/arrows@2x.png new file mode 100644 index 0000000..69b9342 Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrows@2x.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrows@3x.png b/basicsuite/qtquickcontrols2/images/arrows@3x.png new file mode 100644 index 0000000..7703252 Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrows@3x.png differ diff --git a/basicsuite/qtquickcontrols2/images/arrows@4x.png b/basicsuite/qtquickcontrols2/images/arrows@4x.png new file mode 100644 index 0000000..66c1fac Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/arrows@4x.png differ diff --git a/basicsuite/qtquickcontrols2/images/qt-logo.png b/basicsuite/qtquickcontrols2/images/qt-logo.png new file mode 100644 index 0000000..90e6f90 Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/qt-logo.png differ diff --git a/basicsuite/qtquickcontrols2/images/qt-logo@2x.png b/basicsuite/qtquickcontrols2/images/qt-logo@2x.png new file mode 100644 index 0000000..22d111a Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/qt-logo@2x.png differ diff --git a/basicsuite/qtquickcontrols2/images/qt-logo@3x.png b/basicsuite/qtquickcontrols2/images/qt-logo@3x.png new file mode 100644 index 0000000..627746c Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/qt-logo@3x.png differ diff --git a/basicsuite/qtquickcontrols2/images/qt-logo@4x.png b/basicsuite/qtquickcontrols2/images/qt-logo@4x.png new file mode 100644 index 0000000..dc62286 Binary files /dev/null and b/basicsuite/qtquickcontrols2/images/qt-logo@4x.png differ diff --git a/basicsuite/qtquickcontrols2/main.qml b/basicsuite/qtquickcontrols2/main.qml new file mode 100644 index 0000000..473cdea --- /dev/null +++ b/basicsuite/qtquickcontrols2/main.qml @@ -0,0 +1,315 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 2.3 +import QtQuick.Controls.Material 2.1 +import QtQuick.Controls.Universal 2.1 +import Qt.labs.settings 1.0 + +Page { + id: window + width: 360 + height: 520 + visible: true + + Settings { + id: settings + property string style: "Default" + } + + Shortcut { + sequences: ["Esc", "Back"] + enabled: stackView.depth > 1 + onActivated: { + stackView.pop() + listView.currentIndex = -1 + } + } + + Shortcut { + sequence: "Menu" + onActivated: optionsMenu.open() + } + + header: ToolBar { + Material.foreground: "white" + + RowLayout { + spacing: 20 + anchors.fill: parent + + ToolButton { + icon.name: stackView.depth > 1 ? "back" : "drawer" + onClicked: { + if (stackView.depth > 1) { + stackView.pop() + listView.currentIndex = -1 + } else { + drawer.open() + } + } + } + + Label { + id: titleLabel + text: listView.currentItem ? listView.currentItem.text : "Gallery" + font.pixelSize: 20 + elide: Label.ElideRight + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + Layout.fillWidth: true + } + + ToolButton { + icon.name: "menu" + onClicked: optionsMenu.open() + + Menu { + id: optionsMenu + x: parent.width - width + transformOrigin: Menu.TopRight + + MenuItem { + text: "Settings" + onTriggered: settingsDialog.open() + } + MenuItem { + text: "About" + onTriggered: aboutDialog.open() + } + } + } + } + } + + Drawer { + id: drawer + width: Math.min(window.width, window.height) / 3 * 2 + height: window.height + interactive: stackView.depth === 1 + + ListView { + id: listView + + focus: true + currentIndex: -1 + anchors.fill: parent + + delegate: ItemDelegate { + width: parent.width + text: model.title + highlighted: ListView.isCurrentItem + onClicked: { + listView.currentIndex = index + stackView.push("pages/" + model.source) + drawer.close() + } + } + + model: ListModel { + ListElement { title: "BusyIndicator"; source: "BusyIndicatorPage.qml" } + ListElement { title: "Button"; source: "ButtonPage.qml" } + ListElement { title: "CheckBox"; source: "CheckBoxPage.qml" } + ListElement { title: "ComboBox"; source: "ComboBoxPage.qml" } + ListElement { title: "DelayButton"; source: "DelayButtonPage.qml" } + ListElement { title: "Dial"; source: "DialPage.qml" } + ListElement { title: "Dialog"; source: "DialogPage.qml" } + ListElement { title: "Delegates"; source: "DelegatePage.qml" } + ListElement { title: "Frame"; source: "FramePage.qml" } + ListElement { title: "GroupBox"; source: "GroupBoxPage.qml" } + ListElement { title: "PageIndicator"; source: "PageIndicatorPage.qml" } + ListElement { title: "ProgressBar"; source: "ProgressBarPage.qml" } + ListElement { title: "RadioButton"; source: "RadioButtonPage.qml" } + ListElement { title: "RangeSlider"; source: "RangeSliderPage.qml" } + ListElement { title: "ScrollBar"; source: "ScrollBarPage.qml" } + ListElement { title: "ScrollIndicator"; source: "ScrollIndicatorPage.qml" } + ListElement { title: "Slider"; source: "SliderPage.qml" } + ListElement { title: "SpinBox"; source: "SpinBoxPage.qml" } + ListElement { title: "StackView"; source: "StackViewPage.qml" } + ListElement { title: "SwipeView"; source: "SwipeViewPage.qml" } + ListElement { title: "Switch"; source: "SwitchPage.qml" } + ListElement { title: "TabBar"; source: "TabBarPage.qml" } + ListElement { title: "TextArea"; source: "TextAreaPage.qml" } + ListElement { title: "TextField"; source: "TextFieldPage.qml" } + ListElement { title: "ToolTip"; source: "ToolTipPage.qml" } + ListElement { title: "Tumbler"; source: "TumblerPage.qml" } + } + + ScrollIndicator.vertical: ScrollIndicator { } + } + } + + StackView { + id: stackView + anchors.fill: parent + + initialItem: Pane { + id: pane + + Image { + id: logo + width: pane.availableWidth / 2 + height: pane.availableHeight / 2 + anchors.centerIn: parent + anchors.verticalCenterOffset: -50 + fillMode: Image.PreserveAspectFit + source: "images/qt-logo.png" + } + + Label { + text: "Qt Quick Controls 2 provides a set of controls that can be used to build complete interfaces in Qt Quick." + anchors.margins: 20 + anchors.top: logo.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: arrow.top + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignVCenter + wrapMode: Label.Wrap + } + + Image { + id: arrow + source: "images/arrow.png" + anchors.left: parent.left + anchors.bottom: parent.bottom + } + } + } + + Dialog { + id: settingsDialog + x: Math.round((window.width - width) / 2) + y: Math.round(window.height / 6) + width: Math.round(Math.min(window.width, window.height) / 3 * 2) + modal: true + focus: true + title: "Settings" + + standardButtons: Dialog.Ok | Dialog.Cancel + onAccepted: { + settings.style = styleBox.displayText + settingsDialog.close() + } + onRejected: { + styleBox.currentIndex = styleBox.styleIndex + settingsDialog.close() + } + + contentItem: ColumnLayout { + id: settingsColumn + spacing: 20 + + RowLayout { + spacing: 10 + + Label { + text: "Style:" + } + + ComboBox { + id: styleBox + property int styleIndex: -1 + model: availableStyles + Component.onCompleted: { + styleIndex = find(settings.style, Qt.MatchFixedString) + if (styleIndex !== -1) + currentIndex = styleIndex + } + Layout.fillWidth: true + } + } + + Label { + text: "Restart required" + color: "#e41e25" + opacity: styleBox.currentIndex !== styleBox.styleIndex ? 1.0 : 0.0 + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignVCenter + Layout.fillWidth: true + Layout.fillHeight: true + } + } + } + + Dialog { + id: aboutDialog + modal: true + focus: true + title: "About" + x: (window.width - width) / 2 + y: window.height / 6 + width: Math.min(window.width, window.height) / 3 * 2 + contentHeight: aboutColumn.height + + Column { + id: aboutColumn + spacing: 20 + + Label { + width: aboutDialog.availableWidth + text: "The Qt Quick Controls 2 module delivers the next generation user interface controls based on Qt Quick." + wrapMode: Label.Wrap + font.pixelSize: 12 + } + + Label { + width: aboutDialog.availableWidth + text: "In comparison to the desktop-oriented Qt Quick Controls 1, Qt Quick Controls 2 " + + "are an order of magnitude simpler, lighter and faster, and are primarily targeted " + + "towards embedded and mobile platforms." + wrapMode: Label.Wrap + font.pixelSize: 12 + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/BusyIndicatorPage.qml b/basicsuite/qtquickcontrols2/pages/BusyIndicatorPage.qml new file mode 100644 index 0000000..3fbae0c --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/BusyIndicatorPage.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "BusyIndicator is used to indicate activity while content is being loaded," + + " or when the UI is blocked waiting for a resource to become available." + } + + BusyIndicator { + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/ButtonPage.qml b/basicsuite/qtquickcontrols2/pages/ButtonPage.qml new file mode 100644 index 0000000..7ebceb4 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ButtonPage.qml @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Button presents a push-button that can be pushed or clicked by the user. " + + "Buttons are normally used to perform an action, or to answer a question." + } + + ColumnLayout { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + Button { + text: "First" + Layout.fillWidth: true + } + Button { + id: button + text: "Second" + highlighted: true + Layout.fillWidth: true + } + Button { + text: "Third" + enabled: false + Layout.fillWidth: true + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/CheckBoxPage.qml b/basicsuite/qtquickcontrols2/pages/CheckBoxPage.qml new file mode 100644 index 0000000..a8a1692 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/CheckBoxPage.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "CheckBox presents an option button that can be toggled on or off. " + + "Check boxes are typically used to select one or more options from a set of options." + } + + Column { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + CheckBox { + text: "First" + checked: true + } + CheckBox { + text: "Second" + } + CheckBox { + text: "Third" + checked: true + enabled: false + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/ComboBoxPage.qml b/basicsuite/qtquickcontrols2/pages/ComboBoxPage.qml new file mode 100644 index 0000000..bc89e99 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ComboBoxPage.qml @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.2 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "ComboBox is a combined button and popup list. It presents " + + "a list of options to the user that occupies minimal screen space." + } + + ComboBox { + model: ["First", "Second", "Third"] + anchors.horizontalCenter: parent.horizontalCenter + } + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "ComboBox can be made \l editable. An editable combo box auto-" + + "completes its text based on what is available in the model." + } + + ComboBox { + editable: true + model: ListModel { + id: model + ListElement { text: "Banana" } + ListElement { text: "Apple" } + ListElement { text: "Coconut" } + } + onAccepted: { + if (find(editText) === -1) + model.append({text: editText}) + } + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/DelayButtonPage.qml b/basicsuite/qtquickcontrols2/pages/DelayButtonPage.qml new file mode 100644 index 0000000..974dcab --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/DelayButtonPage.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.2 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "DelayButton is a checkable button that incorporates a delay before the " + + "button is activated. This delay prevents accidental presses." + } + + DelayButton { + text: "DelayButton" + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/DelegatePage.qml b/basicsuite/qtquickcontrols2/pages/DelegatePage.qml new file mode 100644 index 0000000..bf07e1b --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/DelegatePage.qml @@ -0,0 +1,218 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.1 + +Pane { + padding: 0 + + property var delegateComponentMap: { + "ItemDelegate": itemDelegateComponent, + "SwipeDelegate": swipeDelegateComponent, + "CheckDelegate": checkDelegateComponent, + "RadioDelegate": radioDelegateComponent, + "SwitchDelegate": switchDelegateComponent + } + + Component { + id: itemDelegateComponent + + ItemDelegate { + text: labelText + width: parent.width + } + } + + Component { + id: swipeDelegateComponent + + SwipeDelegate { + id: swipeDelegate + text: labelText + width: parent.width + + Component { + id: removeComponent + + Rectangle { + color: SwipeDelegate.pressed ? "#333" : "#444" + width: parent.width + height: parent.height + clip: true + + SwipeDelegate.onClicked: view.model.remove(ourIndex) + + Label { + font.pixelSize: swipeDelegate.font.pixelSize + text: "Remove" + color: "white" + anchors.centerIn: parent + } + } + } + + swipe.left: removeComponent + swipe.right: removeComponent + } + } + + Component { + id: checkDelegateComponent + + CheckDelegate { + text: labelText + width: parent.width + } + } + + ButtonGroup { + id: radioButtonGroup + } + + Component { + id: radioDelegateComponent + + RadioDelegate { + text: labelText + ButtonGroup.group: radioButtonGroup + } + } + + Component { + id: switchDelegateComponent + + SwitchDelegate { + text: labelText + } + } + + ColumnLayout { + id: column + spacing: 40 + anchors.fill: parent + anchors.topMargin: 20 + + Label { + Layout.fillWidth: true + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Delegate controls are used as delegates in views such as ListView." + } + + ListView { + id: listView + Layout.fillWidth: true + Layout.fillHeight: true + clip: true + model: ListModel { + ListElement { type: "ItemDelegate"; text: "ItemDelegate" } + ListElement { type: "ItemDelegate"; text: "ItemDelegate" } + ListElement { type: "ItemDelegate"; text: "ItemDelegate" } + ListElement { type: "SwipeDelegate"; text: "SwipeDelegate" } + ListElement { type: "SwipeDelegate"; text: "SwipeDelegate" } + ListElement { type: "SwipeDelegate"; text: "SwipeDelegate" } + ListElement { type: "CheckDelegate"; text: "CheckDelegate" } + ListElement { type: "CheckDelegate"; text: "CheckDelegate" } + ListElement { type: "CheckDelegate"; text: "CheckDelegate" } + ListElement { type: "RadioDelegate"; text: "RadioDelegate" } + ListElement { type: "RadioDelegate"; text: "RadioDelegate" } + ListElement { type: "RadioDelegate"; text: "RadioDelegate" } + ListElement { type: "SwitchDelegate"; text: "SwitchDelegate" } + ListElement { type: "SwitchDelegate"; text: "SwitchDelegate" } + ListElement { type: "SwitchDelegate"; text: "SwitchDelegate" } + } + + section.property: "type" + section.delegate: Pane { + width: listView.width + height: sectionLabel.implicitHeight + 20 + + Label { + id: sectionLabel + text: section + anchors.centerIn: parent + } + } + + delegate: Loader { + id: delegateLoader + width: listView.width + sourceComponent: delegateComponentMap[text] + + property string labelText: text + property ListView view: listView + property int ourIndex: index + + // Can't find a way to do this in the SwipeDelegate component itself, + // so do it here instead. + ListView.onRemove: SequentialAnimation { + PropertyAction { + target: delegateLoader + property: "ListView.delayRemove" + value: true + } + NumberAnimation { + target: item + property: "height" + to: 0 + easing.type: Easing.InOutQuad + } + PropertyAction { + target: delegateLoader + property: "ListView.delayRemove" + value: false + } + } + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/DialPage.qml b/basicsuite/qtquickcontrols2/pages/DialPage.qml new file mode 100644 index 0000000..a8fa976 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/DialPage.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "The Dial is similar to a traditional dial knob that is found on devices such as " + + "stereos or industrial equipment. It allows the user to specify a value within a range." + } + + Dial { + value: 0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/DialogPage.qml b/basicsuite/qtquickcontrols2/pages/DialogPage.qml new file mode 100644 index 0000000..8bade21 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/DialogPage.qml @@ -0,0 +1,226 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.3 + +ScrollablePage { + id: page + + readonly property int buttonWidth: Math.max(button.implicitWidth, Math.min(button.implicitWidth * 2, page.availableWidth / 3)) + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Dialog is a popup that is mostly used for short-term tasks " + + "and brief communications with the user." + } + + Button { + text: "Message" + anchors.horizontalCenter: parent.horizontalCenter + width: buttonWidth + onClicked: messageDialog.open() + + Dialog { + id: messageDialog + + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + + title: "Message" + + Label { + text: "Lorem ipsum dolor sit amet..." + } + } + } + + Button { + id: button + text: "Confirmation" + anchors.horizontalCenter: parent.horizontalCenter + width: buttonWidth + onClicked: confirmationDialog.open() + + Dialog { + id: confirmationDialog + + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + parent: Overlay.overlay + + modal: true + title: "Confirmation" + standardButtons: Dialog.Yes | Dialog.No + + Column { + spacing: 20 + anchors.fill: parent + Label { + text: "The document has been modified.\nDo you want to save your changes?" + } + CheckBox { + text: "Do not ask again" + anchors.right: parent.right + } + } + } + } + + Button { + text: "Content" + anchors.horizontalCenter: parent.horizontalCenter + width: buttonWidth + onClicked: contentDialog.open() + + Dialog { + id: contentDialog + + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: Math.min(page.width, page.height) / 3 * 2 + contentHeight: logo.height * 2 + parent: Overlay.overlay + + modal: true + title: "Content" + standardButtons: Dialog.Close + + Flickable { + id: flickable + clip: true + anchors.fill: parent + contentHeight: column.height + + Column { + id: column + spacing: 20 + width: parent.width + + Image { + id: logo + width: parent.width / 2 + anchors.horizontalCenter: parent.horizontalCenter + fillMode: Image.PreserveAspectFit + source: "../images/qt-logo.png" + } + + Label { + width: parent.width + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc finibus " + + "in est quis laoreet. Interdum et malesuada fames ac ante ipsum primis " + + "in faucibus. Curabitur eget justo sollicitudin enim faucibus bibendum. " + + "Suspendisse potenti. Vestibulum cursus consequat mauris id sollicitudin. " + + "Duis facilisis hendrerit consectetur. Curabitur sapien tortor, efficitur " + + "id auctor nec, efficitur et nisl. Ut venenatis eros in nunc placerat, " + + "eu aliquam enim suscipit." + wrapMode: Label.Wrap + } + } + + ScrollIndicator.vertical: ScrollIndicator { + parent: contentDialog.contentItem + anchors.top: flickable.top + anchors.bottom: flickable.bottom + anchors.right: parent.right + anchors.rightMargin: -contentDialog.rightPadding + 1 + } + } + } + } + + Button { + text: "Input" + anchors.horizontalCenter: parent.horizontalCenter + width: buttonWidth + onClicked: inputDialog.open() + + Dialog { + id: inputDialog + + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + parent: Overlay.overlay + + focus: true + modal: true + title: "Input" + standardButtons: Dialog.Ok | Dialog.Cancel + + ColumnLayout { + spacing: 20 + anchors.fill: parent + Label { + elide: Label.ElideRight + text: "Please enter the credentials:" + Layout.fillWidth: true + } + TextField { + focus: true + placeholderText: "Username" + Layout.fillWidth: true + } + TextField { + placeholderText: "Password" + echoMode: TextField.PasswordEchoOnEdit + Layout.fillWidth: true + } + } + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/FramePage.qml b/basicsuite/qtquickcontrols2/pages/FramePage.qml new file mode 100644 index 0000000..a1d7d7f --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/FramePage.qml @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + readonly property int itemWidth: Math.max(button.implicitWidth, Math.min(button.implicitWidth * 3, page.availableWidth / 3 * 2)) + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Frame is used to layout a logical group of controls together, within a visual frame." + } + + Frame { + anchors.horizontalCenter: parent.horizontalCenter + + Column { + spacing: 20 + width: page.itemWidth + + RadioButton { + text: "First" + checked: true + width: parent.width + } + RadioButton { + id: button + text: "Second" + width: parent.width + } + RadioButton { + text: "Third" + width: parent.width + } + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/GroupBoxPage.qml b/basicsuite/qtquickcontrols2/pages/GroupBoxPage.qml new file mode 100644 index 0000000..bb332a8 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/GroupBoxPage.qml @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + readonly property int itemWidth: Math.max(button.implicitWidth, Math.min(button.implicitWidth * 3, page.availableWidth / 3 * 2)) + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "A GroupBox provides a frame, a title on top of it, and a logical group of controls within that frame." + } + + GroupBox { + title: "Title" + anchors.horizontalCenter: parent.horizontalCenter + + Column { + spacing: 20 + width: page.itemWidth + + RadioButton { + text: "First" + checked: true + width: parent.width + } + RadioButton { + id: button + text: "Second" + width: parent.width + } + RadioButton { + text: "Third" + width: parent.width + } + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/PageIndicatorPage.qml b/basicsuite/qtquickcontrols2/pages/PageIndicatorPage.qml new file mode 100644 index 0000000..ed35c07 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/PageIndicatorPage.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "PageIndicator is used to indicate the currently active page in a container of pages." + } + + PageIndicator { + count: 5 + currentIndex: 2 + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/ProgressBarPage.qml b/basicsuite/qtquickcontrols2/pages/ProgressBarPage.qml new file mode 100644 index 0000000..36bba90 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ProgressBarPage.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "ProgressBar indicates the progress of an operation. It can be set in an " + + "indeterminate mode to indicate that the length of the operation is unknown." + } + + ProgressBar { + id: bar + value: 0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + + ProgressBar { + indeterminate: true + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/RadioButtonPage.qml b/basicsuite/qtquickcontrols2/pages/RadioButtonPage.qml new file mode 100644 index 0000000..451caf5 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/RadioButtonPage.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "RadioButton presents an option button that can be toggled on or off. " + + "Radio buttons are typically used to select one option from a set of options." + } + + Column { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + RadioButton { + text: "First" + } + RadioButton { + text: "Second" + checked: true + } + RadioButton { + text: "Third" + enabled: false + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/RangeSliderPage.qml b/basicsuite/qtquickcontrols2/pages/RangeSliderPage.qml new file mode 100644 index 0000000..9e8d9a9 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/RangeSliderPage.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "RangeSlider is used to select a range specified by two values, by sliding each handle along a track." + } + + RangeSlider { + id: slider + first.value: 0.25 + second.value: 0.75 + anchors.horizontalCenter: parent.horizontalCenter + } + + RangeSlider { + orientation: Qt.Vertical + first.value: 0.25 + second.value: 0.75 + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/ScrollBarPage.qml b/basicsuite/qtquickcontrols2/pages/ScrollBarPage.qml new file mode 100644 index 0000000..aaa1d8e --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ScrollBarPage.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +Flickable { + id: flickable + + contentHeight: pane.height + + Pane { + id: pane + width: flickable.width + height: flickable.height * 1.25 + + Column { + id: column + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "ScrollBar is an interactive bar that can be used to scroll to a specific position. " + + "A scroll bar can be either vertical or horizontal, and can be attached to any Flickable, " + + "such as ListView and GridView." + } + + Image { + rotation: 90 + source: "../images/arrows.png" + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + ScrollBar.vertical: ScrollBar { } +} diff --git a/basicsuite/qtquickcontrols2/pages/ScrollIndicatorPage.qml b/basicsuite/qtquickcontrols2/pages/ScrollIndicatorPage.qml new file mode 100644 index 0000000..89b8bc1 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ScrollIndicatorPage.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +Flickable { + id: flickable + + contentHeight: pane.height + + Pane { + id: pane + width: flickable.width + height: flickable.height * 1.25 + + Column { + id: column + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "ScrollIndicator is a non-interactive indicator that indicates the current scroll position. " + + "A scroll indicator can be either vertical or horizontal, and can be attached to any Flickable, " + + "such as ListView and GridView." + } + + Image { + rotation: 90 + source: "../images/arrows.png" + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + ScrollIndicator.vertical: ScrollIndicator { } +} diff --git a/basicsuite/qtquickcontrols2/pages/ScrollablePage.qml b/basicsuite/qtquickcontrols2/pages/ScrollablePage.qml new file mode 100644 index 0000000..90bd014 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ScrollablePage.qml @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.0 + +Page { + id: page + + default property alias content: pane.contentItem + + Flickable { + anchors.fill: parent + contentHeight: pane.implicitHeight + flickableDirection: Flickable.AutoFlickIfNeeded + + Pane { + id: pane + width: parent.width + } + + ScrollIndicator.vertical: ScrollIndicator { } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/SliderPage.qml b/basicsuite/qtquickcontrols2/pages/SliderPage.qml new file mode 100644 index 0000000..9d941d0 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/SliderPage.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Slider is used to select a value by sliding a handle along a track." + } + + Slider { + id: slider + value: 0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + + Slider { + orientation: Qt.Vertical + value: 0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/SpinBoxPage.qml b/basicsuite/qtquickcontrols2/pages/SpinBoxPage.qml new file mode 100644 index 0000000..b063a37 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/SpinBoxPage.qml @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "SpinBox allows the user to choose an integer value by clicking the up or down indicator buttons, " + + "by pressing up or down on the keyboard, or by entering a text value in the input field." + } + + SpinBox { + id: box + value: 50 + anchors.horizontalCenter: parent.horizontalCenter + editable: true + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/StackViewPage.qml b/basicsuite/qtquickcontrols2/pages/StackViewPage.qml new file mode 100644 index 0000000..45884a7 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/StackViewPage.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +StackView { + id: stackView + initialItem: page + + Component { + id: page + + Pane { + id: pane + width: parent ? parent.width : 0 // TODO: fix null parent on destruction + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "StackView provides a stack-based navigation model which can be used with a set of interlinked pages. " + + "Items are pushed onto the stack as the user navigates deeper into the material, and popped off again " + + "when he chooses to go back." + } + + Button { + id: button + text: "Push" + anchors.horizontalCenter: parent.horizontalCenter + width: Math.max(button.implicitWidth, Math.min(button.implicitWidth * 2, pane.availableWidth / 3)) + onClicked: stackView.push(page) + } + + Button { + text: "Pop" + enabled: stackView.depth > 1 + width: Math.max(button.implicitWidth, Math.min(button.implicitWidth * 2, pane.availableWidth / 3)) + anchors.horizontalCenter: parent.horizontalCenter + onClicked: stackView.pop() + } + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/SwipeViewPage.qml b/basicsuite/qtquickcontrols2/pages/SwipeViewPage.qml new file mode 100644 index 0000000..d09ac50 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/SwipeViewPage.qml @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +Pane { + id: pane + + SwipeView { + id: view + currentIndex: 1 + anchors.fill: parent + + Repeater { + model: 3 + + Pane { + width: view.width + height: view.height + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "SwipeView provides a navigation model that simplifies horizontal paged scrolling. " + + "The page indicator on the bottom shows which is the presently active page." + } + + Image { + source: "../images/arrows.png" + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + } + } + + PageIndicator { + count: view.count + currentIndex: view.currentIndex + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + } +} diff --git a/basicsuite/qtquickcontrols2/pages/SwitchPage.qml b/basicsuite/qtquickcontrols2/pages/SwitchPage.qml new file mode 100644 index 0000000..d894ed5 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/SwitchPage.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Switch is an option button that can be dragged or toggled on or off. " + + "Switches are typically used to select between two states." + } + + Column { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + Switch { + text: "First" + } + Switch { + text: "Second" + checked: true + } + Switch { + text: "Third" + enabled: false + } + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/TabBarPage.qml b/basicsuite/qtquickcontrols2/pages/TabBarPage.qml new file mode 100644 index 0000000..16200fc --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/TabBarPage.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +Page { + id: page + + SwipeView { + id: swipeView + anchors.fill: parent + currentIndex: tabBar.currentIndex + + Repeater { + model: 3 + + Pane { + width: swipeView.width + height: swipeView.height + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "TabBar is a bar with icons or text which allows the user" + + "to switch between different subtasks, views, or modes." + } + + Image { + source: "../images/arrows.png" + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + } + } + + footer: TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + + TabButton { + text: "First" + } + TabButton { + text: "Second" + } + TabButton { + text: "Third" + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/TextAreaPage.qml b/basicsuite/qtquickcontrols2/pages/TextAreaPage.qml new file mode 100644 index 0000000..d83096d --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/TextAreaPage.qml @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "TextArea is a multi-line text editor." + } + + TextArea { + width: Math.max(implicitWidth, Math.min(implicitWidth * 3, pane.availableWidth / 3)) + anchors.horizontalCenter: parent.horizontalCenter + + wrapMode: TextArea.Wrap + text: "TextArea\n...\n...\n..." + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/TextFieldPage.qml b/basicsuite/qtquickcontrols2/pages/TextFieldPage.qml new file mode 100644 index 0000000..959d968 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/TextFieldPage.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "TextField is a single-line text editor." + } + + TextField { + id: field + placeholderText: "TextField" + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/ToolTipPage.qml b/basicsuite/qtquickcontrols2/pages/ToolTipPage.qml new file mode 100644 index 0000000..bc2aa81 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/ToolTipPage.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "A tool tip is a short piece of text that informs the user of a control's function." + } + + Button { + text: "Tip" + anchors.horizontalCenter: parent.horizontalCenter + + ToolTip.timeout: 5000 + ToolTip.visible: pressed + ToolTip.text: "This is a tool tip." + } + } +} diff --git a/basicsuite/qtquickcontrols2/pages/TumblerPage.qml b/basicsuite/qtquickcontrols2/pages/TumblerPage.qml new file mode 100644 index 0000000..bc0aa24 --- /dev/null +++ b/basicsuite/qtquickcontrols2/pages/TumblerPage.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 2.1 + +ScrollablePage { + id: page + + Column { + spacing: 40 + width: parent.width + + Label { + width: parent.width + wrapMode: Label.Wrap + horizontalAlignment: Qt.AlignHCenter + text: "Tumbler is used to select a value by spinning a wheel." + } + + Tumbler { + model: 10 + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/basicsuite/qtquickcontrols2/preview_l.jpg b/basicsuite/qtquickcontrols2/preview_l.jpg new file mode 100644 index 0000000..c840e8e Binary files /dev/null and b/basicsuite/qtquickcontrols2/preview_l.jpg differ diff --git a/basicsuite/qtquickcontrols2/qtquickcontrols2.conf b/basicsuite/qtquickcontrols2/qtquickcontrols2.conf new file mode 100644 index 0000000..da1a8f4 --- /dev/null +++ b/basicsuite/qtquickcontrols2/qtquickcontrols2.conf @@ -0,0 +1,8 @@ +[Material] +Primary=#41cd52 +Accent=#41cd52 +Theme=System + +[Universal] +Accent=#41cd52 +Theme=System diff --git a/basicsuite/qtquickcontrols2/qtquickcontrols2.pro b/basicsuite/qtquickcontrols2/qtquickcontrols2.pro new file mode 100644 index 0000000..a0ecaf5 --- /dev/null +++ b/basicsuite/qtquickcontrols2/qtquickcontrols2.pro @@ -0,0 +1,17 @@ +TARGET = qtquickcontrols2 + +include(../shared/shared.pri) +b2qtdemo_deploy_defaults() + +content.files = \ + $$PWD/main.qml \ + $$PWD/qtquickcontrols2.conf \ + $$PWD/images \ + $$PWD/icons \ + $$PWD/pages + +content.path = $$DESTPATH + +OTHER_FILES += $${content.files} + +INSTALLS += target content diff --git a/basicsuite/qtwebbrowser/demo.xml b/basicsuite/qtwebbrowser/demo.xml new file mode 100644 index 0000000..020afa7 --- /dev/null +++ b/basicsuite/qtwebbrowser/demo.xml @@ -0,0 +1,9 @@ + + + + +This example demonstrates the use of Qt WebEngine with Qt Quick. + +Demo can be used to browse the internet (working network connection required) or run the offline web page demos. + + diff --git a/basicsuite/qtwebbrowser/preview_l.jpg b/basicsuite/qtwebbrowser/preview_l.jpg index e96d576..d4ddedc 100644 Binary files a/basicsuite/qtwebbrowser/preview_l.jpg and b/basicsuite/qtwebbrowser/preview_l.jpg differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser deleted file mode 160000 index c86bb8a..0000000 --- a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c86bb8a400f79be205025598310926df5d01c7bc diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/.qmake.conf b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/.qmake.conf new file mode 100644 index 0000000..1451dad --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/.qmake.conf @@ -0,0 +1,4 @@ +VERSION = 1.0.0 + +# Set up documentation targets +CONFIG += prepare_docs qt_docs_targets diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.FDL b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.FDL new file mode 100644 index 0000000..938bb8d --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.FDL @@ -0,0 +1,450 @@ + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.GPLv3 b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.GPLv3 new file mode 100644 index 0000000..0c0f8e1 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/LICENSE.GPLv3 @@ -0,0 +1,686 @@ + GNU GENERAL PUBLIC LICENSE + + The Qt Toolkit is Copyright (C) 2016 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + You may use, distribute and copy the Qt GUI Toolkit under the terms of + GNU Lesser General Public License version 3. That license references + the General Public License version 3, that is displayed below. Other + portions of the Qt Toolkit may be licensed directly under this license. + +------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/doc.pro b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/doc.pro new file mode 100644 index 0000000..3966427 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/doc.pro @@ -0,0 +1,14 @@ +TEMPLATE = aux + +build_online_docs: \ + QMAKE_DOCS = $$PWD/online/qtwebbrowser.qdocconf +else: \ + QMAKE_DOCS = $$PWD/qtwebbrowser.qdocconf + +DISTFILES += \ + $$PWD/src/qtwebbrowser.qdoc \ + $$PWD/src/external-resources.qdoc \ + $$PWD/qtwebbrowser-project.qdocconf \ + $$PWD/qtwebbrowser.qdocconf \ + $$PWD/online/qtwebbrowser.qdocconf \ + $$PWD/images/src/block-diagram.qmodel diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/block-diagram.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/block-diagram.png new file mode 100644 index 0000000..50dec11 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/block-diagram.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/bookmarks.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/bookmarks.png new file mode 100644 index 0000000..5796891 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/bookmarks.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/html5test.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/html5test.png new file mode 100644 index 0000000..4d71ac0 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/html5test.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/inputhelp.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/inputhelp.png new file mode 100644 index 0000000..cd310ba Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/inputhelp.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/menubar.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/menubar.png new file mode 100644 index 0000000..943dc25 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/menubar.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/pageselection.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/pageselection.png new file mode 100644 index 0000000..67e216d Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/pageselection.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/settings.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/settings.png new file mode 100644 index 0000000..069d477 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/settings.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/src/block-diagram.qmodel b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/src/block-diagram.qmodel new file mode 100644 index 0000000..7a78937 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/src/block-diagram.qmodel @@ -0,0 +1,496 @@ + + + + {f35988a9-6bcf-4b28-9496-6d2bda6b4b59} + + + + + + + + {0076d7ae-ef4b-45eb-8cfb-6ab04beb9d0c} + + + block-diagram + + + + + + + {a8c8ed99-0062-4b4c-935d-1076b1886ea3} + + + + + + + + + + {a8c8ed99-0062-4b4c-935d-1076b1886ea3} + + + block-diagram + + + + + + + + + + + + {31670797-833f-490c-a1a7-96027da776ae} + + + {35301846-40c1-4814-8279-27e504981b6d} + Qt WebBrowser + x:200;y:210 + x:-80;y:-30;w:160;h:60 + false + 0 + true + + + + + + + + + + + + + {4d899821-3971-40fd-ac87-fb15d951bd03} + + + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + Qt Quick + x:475;y:300 + x:-80;y:-30;w:160;h:60 + false + 0 + + + + + + + + + + + + + {26ba5615-d61d-4d53-bc8a-a23fb5d92543} + + + {152e2926-742b-4266-a67d-0badd705cd90} + Qt WebEngine + x:475;y:210 + x:-80;y:-30;w:160;h:60 + false + 0 + + + + + + + + + + + + + {f68aba0c-bb1c-45e9-9f3e-ec530e272d7d} + + + {a6df659c-bbb2-4109-b0e6-60918263837d} + Qt VirtualKeyboard + x:200;y:300 + x:-80;y:-30;w:160;h:60 + false + 0 + + + + + + + + + + + + + {9ecae4ad-a91b-4afb-b852-9513ef0db2bd} + + + {a2469a49-9150-43c6-95f9-46a9df37d5a2} + {31670797-833f-490c-a1a7-96027da776ae} + {4d899821-3971-40fd-ac87-fb15d951bd03} + + + + + + + + + + + + + {efba6948-7090-4bbc-ae78-1ff87ad47bbf} + + + {74e1c3d1-48e0-4f6e-98c7-5775be6ff115} + {31670797-833f-490c-a1a7-96027da776ae} + {26ba5615-d61d-4d53-bc8a-a23fb5d92543} + + + + + + + + + + + + + {12376e90-4be9-4a93-befe-fb2c7523e6c8} + + + {c0b38869-5ee2-4ceb-a90c-f1f0e8958253} + {31670797-833f-490c-a1a7-96027da776ae} + {f68aba0c-bb1c-45e9-9f3e-ec530e272d7d} + + + + + + + + + + + + + {92a27c93-ee2c-45d9-acd5-e64b320e5c02} + + + {80706f71-fbfb-4a87-b090-6384b2226b55} + {26ba5615-d61d-4d53-bc8a-a23fb5d92543} + {4d899821-3971-40fd-ac87-fb15d951bd03} + + + + + + + + + + + + + {d177f4d0-a1af-48ac-96af-1ca71308d9f1} + + + {e736c99c-a627-4731-a8dc-0a14f8b48354} + {f68aba0c-bb1c-45e9-9f3e-ec530e272d7d} + {4d899821-3971-40fd-ac87-fb15d951bd03} + + + + + + + + 1464094346159 + Components + + + + + + + + + + {19c62089-bf53-411a-b533-1418ec5c160d} + + + + + + + + {19c62089-bf53-411a-b533-1418ec5c160d} + + + New Package + + + + + + + + + + {37e5fedf-65dc-4f96-ad9e-294c5abc5aa0} + + + + + + + + {37e5fedf-65dc-4f96-ad9e-294c5abc5aa0} + + + ew Package + + + + + + + + + + {35301846-40c1-4814-8279-27e504981b6d} + + + + + + + + {35301846-40c1-4814-8279-27e504981b6d} + + + Qt WebBrowser + + + + + + + {a2469a49-9150-43c6-95f9-46a9df37d5a2} + + + + + + + + {a2469a49-9150-43c6-95f9-46a9df37d5a2} + + + {35301846-40c1-4814-8279-27e504981b6d} + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + + + + + + + + + + {74e1c3d1-48e0-4f6e-98c7-5775be6ff115} + + + + + + + + {74e1c3d1-48e0-4f6e-98c7-5775be6ff115} + + + {35301846-40c1-4814-8279-27e504981b6d} + {152e2926-742b-4266-a67d-0badd705cd90} + + + + + + + + + + {c0b38869-5ee2-4ceb-a90c-f1f0e8958253} + + + + + + + + {c0b38869-5ee2-4ceb-a90c-f1f0e8958253} + + + {35301846-40c1-4814-8279-27e504981b6d} + {a6df659c-bbb2-4109-b0e6-60918263837d} + + + + + + + + + + + + + + + + + + + + + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + + + + + + + + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + + + Qt Quick + + + + + + + + + + {152e2926-742b-4266-a67d-0badd705cd90} + + + + + + + + {152e2926-742b-4266-a67d-0badd705cd90} + + + Qt WebEngine + + + + + + + {80706f71-fbfb-4a87-b090-6384b2226b55} + + + + + + + + {80706f71-fbfb-4a87-b090-6384b2226b55} + + + {152e2926-742b-4266-a67d-0badd705cd90} + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + + + + + + + + + + + + + + + + + + + + + {a6df659c-bbb2-4109-b0e6-60918263837d} + + + + + + + + {a6df659c-bbb2-4109-b0e6-60918263837d} + + + Qt VirtualKeyboard + + + + + + + {e736c99c-a627-4731-a8dc-0a14f8b48354} + + + + + + + + {e736c99c-a627-4731-a8dc-0a14f8b48354} + + + {a6df659c-bbb2-4109-b0e6-60918263837d} + {0b5ebe96-6859-435b-a13a-e1520b3feeb5} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/virtualkeyboard.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/virtualkeyboard.png new file mode 100644 index 0000000..ad40d3f Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/virtualkeyboard.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/webbrowser.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/webbrowser.png new file mode 100644 index 0000000..b111dcd Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/images/webbrowser.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/online/qtwebbrowser.qdocconf b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/online/qtwebbrowser.qdocconf new file mode 100644 index 0000000..9aff055 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/online/qtwebbrowser.qdocconf @@ -0,0 +1,16 @@ +include(../qtwebbrowser-project.qdocconf) + +HTML.footer = \ + " \n" \ + "

\n" \ + " © 2017 The Qt Company Ltd.\n" \ + " Documentation contributions included herein are the copyrights of\n" \ + " their respective owners. " \ + " The documentation provided herein is licensed under the terms of the" \ + " GNU Free Documentation" \ + " License version 1.3 as published by the Free Software Foundation. " \ + " Qt and respective logos are trademarks of The Qt Company Ltd " \ + " in Finland and/or other countries worldwide. All other trademarks are property\n" \ + " of their respective owners.

\n" + +include($QT_INSTALL_DOCS/global/qt-html-templates-online.qdocconf) diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser-project.qdocconf b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser-project.qdocconf new file mode 100644 index 0000000..3fe897c --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser-project.qdocconf @@ -0,0 +1,36 @@ +project = "QtWebBrowser" +description = "Qt WebBrowser Manual" + +sourcedirs += src +imagedirs += images + +sources.fileextensions = "*.qdoc" + +qhp.projects = QtWebBrowser +qhp.QtWebBrowser.file = qtwebbrowser.qhp +qhp.QtWebBrowser.namespace = org.qt-project.qtwebbrowser.$$QT_VERSION_TAG +qhp.QtWebBrowser.virtualFolder = qtwebbrowser +qhp.QtWebBrowser.indexTitle = Qt WebBrowser +qhp.QtWebBrowser.filterAttributes = qtwebbrowser +qhp.QtWebBrowser.customFilters.QtWebBrowser.name = Qt WebBrowser $QT_VERSION +qhp.QtWebBrowser.customFilters.QtWebBrowser.filterAttributes = qtwebbrowser $QT_VERSION +qhp.QtWebBrowser.indexRoot = + +qhp.QtWebBrowser.subprojects = manual +qhp.QtWebBrowser.subprojects.manual.indexTitle = Qt WebBrowser +qhp.QtWebBrowser.subprojects.manual.title = Qt WebBrowser +qhp.QtWebBrowser.subprojects.manual.type = manual + +#indexes += $QT_INSTALL_DOCS/qtlocation/qtlocation.index \ +# $QT_INSTALL_DOCS/qtquick/qtquick.index \ +# $QT_INSTALL_DOCS/qtvirtualkeyboard/qtvirtualkeyboard.index \ +# $QT_INSTALL_DOCS/qtwebengine/qtwebengine.index + +depends += qtquick qtlocation qtwebengine qtvirtualkeyboard + +# Doxygen compatibility commands +macro.see = "\\sa" +macro.function = "\\fn" + +navigation.homepage = "Qt WebBrowser Manual" +buildversion = "Qt WebBrowser $QT_VERSION" diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser.qdocconf b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser.qdocconf new file mode 100644 index 0000000..383d83a --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/qtwebbrowser.qdocconf @@ -0,0 +1,2 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults-offline.qdocconf) +include(qtwebbrowser-project.qdocconf) diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/external-resources.qdoc b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/external-resources.qdoc new file mode 100644 index 0000000..8a5cc00 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/external-resources.qdoc @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \externalpage https://www.chromium.org/ + \title Chromium Project +*/ + +/*! + \externalpage https://www.google.com/ + \title Google +*/ + +/*! + \externalpage https://doc.qt.io/qt-5/qtwebengine-debugging.html + \title Qt WebEngine Debugging and Profiling +*/ + +/* + This prevents autolinking of each occurrence of 'WebEngine' + To link to the WebEngine QML type, use explicit linking: + \l [QML] WebEngine + \sa {QtWebEngine::}{WebEngine} +*/ +/*! +\externalpage nolink +\title WebEngine +\internal +*/ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/qtwebbrowser.qdoc b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/qtwebbrowser.qdoc new file mode 100644 index 0000000..08496a0 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/doc/src/qtwebbrowser.qdoc @@ -0,0 +1,185 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! +\page qtwebbrowser-index.html + +\title Qt WebBrowser + +The Qt WebBrowser (codename \c{Roadtrip}) is a browser for embedded +devices developed using the capabilities of Qt and \l{Qt WebEngine}. +Using recent \l{Chromium Project}{Chromium}, it features up-to-date +HTML technologies behind a minimal but slick touch-friendly +user interface written in \l{Qt Quick}. + +\image webbrowser.png + +\section1 User Interface + +The user interface of the browser is designed for embedded devices +using a touch screen. It uses flat icons and minimalistic transitions to +provide a contemporary look and feel. + +All central actions are conveniently accessible in the menu bar at the +top. When the user scrolls down a page, the menu bar disappears to +leave more screen space for content. It appears again if +the user scrolls upwards. + +\image menubar.png + +The \uicontrol Back button (1) and \uicontrol Forward button (2) navigate +through the history of pages already visited. +The input bar (3) allows the user to type and edit URL's, +or search for text. It also allows to reload a page, or stop a page currently +loading. +Pages can be bookmarked with the \uicontrol Bookmark button (6), +the bookmarked pages are accessible through the \uicontrol Home button (4). +The \uicontrol Pages button (5) allows the user to manage the pages +currently opened. The \uicontrol Settings button (7) brings up a view of +the current settings. + +\section2 Opening Pages + +The input bar supports typing in either a full URL or a query +that is automatically passed to \l{Google}. Url suggestions of visited pages +matching the text are suggested during typing. The current text can be +cleared by pressing the \uicontrol Cancel button on the right. + +\image inputhelp.png + +When the user finishes editing, a blue line serves as a progress indicator +for the page currently loading. The loading can be stopped by pressing +the \uicontrol Cancel button. After the page finished loading +this button is replaced by a \uicontrol Reload button, that forces a reload +of the page when pressed. + +\section2 Page Scrolling + +The view of the page can be moved around by pressing and moving a finger. + +\section2 Page Zooming + +Zoom in or out a particular section of the page by pinching fingers. + +\section2 Bookmark Management + +Individual pages can be bookmarked by pressing the \uicontrol Bookmark +button. By pressing the same button again the page is removed from the +bookmarks. + +The \uicontrol Home button lets the user browse the bookmarked pages +in a multi-page grid. Each page is represented by its name and icon, +if available. + +\image bookmarks.png + +\section2 Page Management + +The \uicontrol Pages button enables the user to open new pages and to +switch between them using the Carousel UI pattern: + +\image pageselection.png + +The number of pages that can be opened simultaneously is intentionally +limited to 10. + +\section2 User Settings + +A settings page is available by pressing the \uicontrol Settings button. +The page contains options for enabling a \e {private browsing} mode +that does not leave traces in the history and cookies. + +\image settings.png + +\section2 Virtual Keyboard + +The integrated \l{Qt Virtual Keyboard} +slides in whenever text input is required. It enables typing text in a +great variety of different languages. + +\image virtualkeyboard.png + +\section1 Features + +Qt WebEngine leverages \l{Chromium Project}{Chromium} to provide +a state-of-the art, high performance HTML5 web engine. + +\image html5test.png + +\section2 Video and Audio + +Chromium and therefore Qt WebEngine directly +integrate with OS services to access video and audio devices. +After the user acknowledges access to them, solutions using WebRTC, such as +video and audio conferencing, work out-of-the-box, provided that the +required codecs are available. + +\section2 Location Information + +Qt WebEngine uses \l {Qt Location} to provide pages with location +information. Again, the users have to explicitly give their consent to each +page attempting to access this information. + +\section2 Fullscreen Mode + +Videos can be played in fullscreen mode. + +\section1 Developer Features + +\section2 Developer Tools + +Qt WebEngine supports remotely accessing the built-in Chromium Developer +Tools. This allows debugging and optimizing individual pages on the device. + +For more information, see the \l{Qt WebEngine} documentation on +\l{Qt WebEngine Debugging and Profiling}{Debugging and Profiling}. + +\section2 Simulation of Touch Input + +While the Qt WebBrowser is optimized for touch devices, +it can also be tested on all the desktop operating systems. +Keyboard and mouse input works out of the box. Touch input +can be simulated by using several mouse buttons +while pressing the \c Ctrl key. + +\section1 Platform Requirements + +Qt WebBrowser requires the \l{Qt WebEngine}, +\l{Qt Quick} and +\l{Qt Virtual Keyboard} modules in version 5.7 or +newer. + +\image block-diagram.png + +At minimum 1 GB of RAM is advised to provide a seamless experience +for different pages. Depending on the exact configuration and the +pages visited this can be further optimized. + +Qt Quick and Qt WebEngine use OpenGL for rendering. Best performance +therefore requires dedicated graphics hardware with drivers supporting +OpenGL. +*/ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage.png new file mode 100644 index 0000000..cf7c69c Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage_DeleteBookmarks.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage_DeleteBookmarks.png new file mode 100644 index 0000000..95441e4 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/00_HomePage_DeleteBookmarks.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing.png new file mode 100644 index 0000000..d93a211 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Bookmark.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Bookmark.png new file mode 100644 index 0000000..0b880b8 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Bookmark.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Loading.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Loading.png new file mode 100644 index 0000000..016b7f7 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Loading.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_NoKb.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_NoKb.png new file mode 100644 index 0000000..e330c6c Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_NoKb.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Private.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Private.png new file mode 100644 index 0000000..50d1115 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_Browsing_Private.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox+Bookmark.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox+Bookmark.png new file mode 100644 index 0000000..1d11050 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox+Bookmark.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox.png new file mode 100644 index 0000000..eec1ae1 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/01_URLbox.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Link.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Link.png new file mode 100644 index 0000000..7edffa0 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Link.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Text.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Text.png new file mode 100644 index 0000000..476fcbc Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_Text.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_URL.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_URL.png new file mode 100644 index 0000000..861e774 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/02_Selection_URL.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_1.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_1.png new file mode 100644 index 0000000..80a9a77 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_1.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_10+.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_10+.png new file mode 100644 index 0000000..58c833e Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_10+.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_2.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_2.png new file mode 100644 index 0000000..f4da8ae Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_2.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_3.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_3.png new file mode 100644 index 0000000..4d89730 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_3.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_4.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_4.png new file mode 100644 index 0000000..c4c74a0 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_4.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5+.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5+.png new file mode 100644 index 0000000..ccfc920 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5+.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5.png new file mode 100644 index 0000000..451dec4 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_5.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_New.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_New.png new file mode 100644 index 0000000..08ef407 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/03_Tabs_New.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/04_Settings.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/04_Settings.png new file mode 100644 index 0000000..0de35da Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/04_Settings.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/Bookmarks_Button.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/Bookmarks_Button.png new file mode 100644 index 0000000..83849d3 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/Bookmarks_Button.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowserFunctions.xlsx b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowserFunctions.xlsx new file mode 100644 index 0000000..037813a Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowserFunctions.xlsx differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowser_Specs.pdf b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowser_Specs.pdf new file mode 100644 index 0000000..8f77fe5 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/mockups/LightWebBrowser_Specs.pdf differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/qtwebbrowser.pro b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/qtwebbrowser.pro new file mode 100644 index 0000000..619a237 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/qtwebbrowser.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS = \ + doc \ + src + +requires(qtHaveModule(webengine)) + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.cpp b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.cpp new file mode 100644 index 0000000..f48325d --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.cpp @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "appengine.h" + +#include +#include +#include +#include + +AppEngine::AppEngine(QObject *parent) + : QObject(parent) + , m_settings(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) % QDir::separator() % "settings.ini", QSettings::IniFormat, this) +{ + foreach (const QString &arg, QCoreApplication::arguments().mid(1)) { + if (arg.startsWith('-')) + continue; + const QUrl url(http://github.com/arg); + if (url.isValid()) { + m_initialUrl = url.toString(); + break; + } + } +} + +QString AppEngine::settingsPath() +{ + return m_settings.fileName(); +} + +QString AppEngine::initialUrl() const +{ + return m_initialUrl; +} + +QUrl AppEngine::fromUserInput(const QString& userInput) +{ + QFileInfo fileInfo(userInput); + if (fileInfo.exists()) + return QUrl::fromLocalFile(fileInfo.absoluteFilePath()); + return QUrl::fromUserInput(userInput); +} + +bool AppEngine::isUrl(const QString& userInput) +{ + if (userInput.startsWith(QStringLiteral("www.")) + || userInput.startsWith(QStringLiteral("http")) + || userInput.startsWith(QStringLiteral("ftp")) + || userInput.contains(QStringLiteral("://")) + || userInput.endsWith(QStringLiteral(".com"))) + return true; + return false; +} + +QString AppEngine::domainFromString(const QString& urlString) +{ + return QUrl::fromUserInput(urlString).host(); +} + +QString AppEngine::fallbackColor() +{ + static QList colors = QList() << QStringLiteral("#46a2da") + << QStringLiteral("#18394c") + << QStringLiteral("#ff8c0a") + << QStringLiteral("#5caa15"); + static int index = -1; + if (++index == colors.count()) + index = 0; + return colors[index]; +} + +QString AppEngine::restoreSetting(const QString &name, const QString &defaultValue) +{ + return m_settings.value(name, defaultValue).toString(); +} + +void AppEngine::saveSetting(const QString &name, const QString &value) +{ + m_settings.setValue(name, value); +} + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.h b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.h new file mode 100644 index 0000000..c5ad20e --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/appengine.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef APPENGINE_H +#define APPENGINE_H + +#include +#include +#include +#include +#include +#include + +namespace utils { +inline bool isTouchEvent(const QEvent* event) +{ + switch (event->type()) { + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + return true; + default: + return false; + } +} + +inline bool isMouseEvent(const QEvent* event) +{ + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::MouseMove: + case QEvent::MouseButtonRelease: + case QEvent::MouseButtonDblClick: + return true; + default: + return false; + } +} + +} + +class AppEngine : public QObject { + Q_OBJECT + + Q_PROPERTY(QString settingsPath READ settingsPath FINAL CONSTANT) + Q_PROPERTY(QString initialUrl READ initialUrl FINAL CONSTANT) + +public: + AppEngine(QObject *parent = 0); + + QString settingsPath(); + QString initialUrl() const; + + Q_INVOKABLE bool isUrl(const QString& userInput); + Q_INVOKABLE QUrl fromUserInput(const QString& userInput); + Q_INVOKABLE QString domainFromString(const QString& urlString); + Q_INVOKABLE QString fallbackColor(); + Q_INVOKABLE QString restoreSetting(const QString &name, const QString &defaultValue = QString()); + Q_INVOKABLE void saveSetting(const QString &name, const QString &value); + +private: + QSettings m_settings; + QString m_initialUrl; +}; + +#endif // APPENGINE_H diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/main.cpp b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/main.cpp new file mode 100644 index 0000000..e21440a --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/main.cpp @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "appengine.h" +#include "navigationhistoryproxymodel.h" +#include "touchtracker.h" + +#if defined(DESKTOP_BUILD) +#include "touchmockingapplication.h" +#endif + +#include +#include +#include +#include +#include + +static QObject *engine_factory(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(engine); + Q_UNUSED(scriptEngine); + AppEngine *eng = new AppEngine(); + return eng; +} + +int main(int argc, char **argv) +{ + qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); + + //do not use any plugins installed on the device + qputenv("QML2_IMPORT_PATH", QByteArray()); + + // We use touch mocking on desktop and apply all the mobile switches. + QByteArrayList args = QByteArrayList() + << QByteArrayLiteral("--enable-embedded-switches") + << QByteArrayLiteral("--log-level=0"); + const int count = args.size() + argc; + QVector qargv(count); + + qargv[0] = argv[0]; + for (int i = 0; i < args.size(); ++i) + qargv[i + 1] = args[i].data(); + for (int i = args.size() + 1; i < count; ++i) + qargv[i] = argv[i - args.size()]; + + int qAppArgCount = qargv.size(); + +#if defined(DESKTOP_BUILD) + TouchMockingApplication app(qAppArgCount, qargv.data()); +#else + QGuiApplication app(qAppArgCount, qargv.data()); +#endif + + qmlRegisterType("WebBrowser", 1, 0, "SearchProxyModel"); + qmlRegisterType("WebBrowser", 1, 0, "TouchTracker"); + qmlRegisterSingletonType("WebBrowser", 1, 0, "AppEngine", engine_factory); + + QtWebEngine::initialize(); + + app.setOrganizationName("The Qt Company"); + app.setOrganizationDomain("qt.io"); + app.setApplicationName("qtwebbrowser"); + + QQuickView view; + view.setTitle("Qt WebBrowser"); + view.setFlags(Qt::Window | Qt::WindowTitleHint); + view.setResizeMode(QQuickView::SizeRootObjectToView); + view.setColor(Qt::black); + view.setSource(QUrl("qrc:///qml/Main.qml")); + + QObject::connect(view.engine(), SIGNAL(quit()), &app, SLOT(quit())); + +#if defined(DESKTOP_BUILD) + view.show(); + if (view.size().isEmpty()) + view.setGeometry(0, 0, 800, 600); +#else + view.showFullScreen(); +#endif + + app.exec(); +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.cpp b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.cpp new file mode 100644 index 0000000..a124f76 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "navigationhistoryproxymodel.h" + +NavigationHistoryProxyModel::NavigationHistoryProxyModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ + +} + +bool NavigationHistoryProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + + // Use UrlRole and TitleRole instead of DisplayRole + return (sourceModel()->data(index, Qt::UserRole + 1).toString().contains(filterRegExp()) + || sourceModel()->data(index, Qt::UserRole + 2).toString().contains(filterRegExp())); +} + +void NavigationHistoryProxyModel::setEnabled(bool enabled) +{ + if (dynamicSortFilter() == enabled) + return; + setDynamicSortFilter(enabled); + emit enabledChanged(); +} + +QString NavigationHistoryProxyModel::searchString() const +{ + return m_searchString; +} + +void NavigationHistoryProxyModel::setSearchString(const QString &pattern) +{ + if (m_searchString == pattern) + return; + + m_searchString = pattern; + setFilterRegExp(QRegExp(pattern, Qt::CaseInsensitive, QRegExp::FixedString)); + emit searchStringChanged(); +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.h b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.h new file mode 100644 index 0000000..f12cd06 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/navigationhistoryproxymodel.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NAVIGATIONHISTORYPROXYMODEL_H +#define NAVIGATIONHISTORYPROXYMODEL_H + +#include +#include +#include + +class NavigationHistoryProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT + + Q_PROPERTY(QAbstractItemModel * target READ sourceModel WRITE setSourceModel) + Q_PROPERTY(QString searchString READ searchString WRITE setSearchString NOTIFY searchStringChanged) + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) + +public: + explicit NavigationHistoryProxyModel(QObject *parent = 0); + + + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + + bool enabled() const { return dynamicSortFilter(); } + void setEnabled(bool enabled); + + void setTarget(QAbstractItemModel *t); + + QString searchString() const ; + void setSearchString(const QString &pattern); + +signals: + void searchStringChanged(); + void enabledChanged(); + +private: + QString m_searchString; +}; + +#endif // NAVIGATIONHISTORYPROXYMODEL_H diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/BrowserWindow.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/BrowserWindow.qml new file mode 100644 index 0000000..7f4d332 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/BrowserWindow.qml @@ -0,0 +1,465 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtWebEngine 1.1 + +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls.Private 1.0 +import QtQuick.Dialogs 1.2 + +import "assets" +import WebBrowser 1.0 +import "Utils.js" as Utils + +Item { + id: browserWindow + + property Item currentWebView: { + return tabView.get(tabView.currentIndex) ? tabView.get(tabView.currentIndex).item.webView : null + } + + property string googleSearchQuery: "https://www.google.com/search?sourceid=qtbrowser&ie=UTF-8&q=" + + property int toolBarSize: 80 + property string uiColor: settingsView.privateBrowsingEnabled ? "#3a4055" : "#09102b" + + property string uiSeparatorColor: "#9d9faa" + + property string toolBarSeparatorColor: "#9d9faa" + + property string toolBarFillColor: settingsView.privateBrowsingEnabled ? "#3a4055" : "#09102b" + + property string buttonPressedColor: "#41cd52" + property string emptyBackgroundColor: "#09102b" + property string uiHighlightColor: "#41cd52" + property string inactivePagerColor: "#bcbdbe" + property string textFieldStrokeColor: "#9d9faa" + property string placeholderColor: "#a0a1a2" + property string iconOverlayColor: "#0e202c" + property string iconStrokeColor: "#9d9faa" + property string defaultFontFamily: appFont + + property int gridViewPageItemCount: 8 + property int gridViewMaxBookmarks: 3 * gridViewPageItemCount + property int tabViewMaxTabs: 10 + property int animationDuration: 200 + property int velocityThreshold: 400 + property int velocityY: 0 + property real touchY: 0 + property real touchReference: 0 + property bool touchGesture: false + + width: 1024 + height: 600 + visible: true + + Action { + shortcut: "Ctrl+D" + onTriggered: { + downloadView.visible = !downloadView.visible + } + } + + Action { + id: focus + shortcut: "Ctrl+L" + onTriggered: { + navigation.addressBar.forceActiveFocus(); + navigation.addressBar.selectAll(); + } + } + Action { + shortcut: "Ctrl+R" + onTriggered: { + if (currentWebView) + currentWebView.reload() + navigation.addressBar.forceActiveFocus() + } + } + Action { + id: newTabAction + shortcut: "Ctrl+T" + onTriggered: { + tabView.get(tabView.currentIndex).item.webView.takeSnapshot() + var tab = tabView.createEmptyTab() + + if (!tab) + return + + navigation.addressBar.selectAll(); + tabView.makeCurrent(tabView.count - 1) + navigation.addressBar.forceActiveFocus() + } + } + Action { + shortcut: "Ctrl+W" + onTriggered: tabView.remove(tabView.currentIndex) + } + + UIToolBar { + id: tabEditToolBar + + source: "icons/Btn_Add.png" + indicator: tabView.count + + anchors { + left: parent.left + right: parent.right + top: navigation.top + } + + visible: opacity != 0.0 + opacity: tabView.viewState == "list" ? 1.0 : 0.0 + onDoneClicked: tabView.viewState = "page" + onOptionClicked: newTabAction.trigger() + } + + UIToolBar { + id: settingsToolBar + z: 5 + title: qsTr("Settings") + visible: opacity != 0.0 + + anchors { + left: parent.left + right: parent.right + top: navigation.top + } + + onDoneClicked: { + settingsView.save() + settingsView.state = "disabled" + } + } + + UIToolBar { + id: fullScreenBar + z: 6 + title: qsTr("Leave Full Screen Mode") + visible: opacity != 0.0 + opacity: tabView.viewState == "fullscreen" ? 1.0 : 0.0 + anchors { + left: parent.left + right: parent.right + top: navigation.top + } + onDoneClicked: { + navigation.webView.triggerWebAction(WebEngineView.ExitFullScreen); + } + } + + NavigationBar { + id: navigation + + anchors { + left: parent.left + right: parent.right + } + } + Rectangle{ + anchors.bottom: navigation.bottom + anchors.left: navigation.left + anchors.right: navigation.right + height: 2 + color: "#9d9faa" + } + + PageView { + id: tabView + interactive: { + if (sslDialog.visible || homeScreen.state != "disabled" || urlDropDown.state == "enabled" || settingsView.state == "enabled") + return false + return true + } + + anchors { + top: navigation.bottom + left: parent.left + right: parent.right + } + + height: inputPanel.y + + Component.onCompleted: { + var tab = createEmptyTab() + + if (!tab) + return + + navigation.webView = tab.webView + var url = AppEngine.initialUrl + + navigation.load(); + } + onCurrentIndexChanged: { + if (!tabView.get(tabView.currentIndex)) + return + navigation.webView = tabView.get(tabView.currentIndex).item.webView + } + } + + QtObject{ + id: acceptedCertificates + + property var acceptedUrls : [] + + function shouldAutoAccept(certificateError){ + var domain = AppEngine.domainFromString(certificateError.url) + return acceptedUrls.indexOf(domain) >= 0 + } + } + + MessageDialog { + id: sslDialog + + property var certErrors: [] + property var currentError: null + visible: certErrors.length > 0 + icon: StandardIcon.Warning + standardButtons: StandardButton.No | StandardButton.Yes + title: "Server's certificate not trusted" + text: "Do you wish to continue?" + detailedText: "If you wish so, you may continue with an unverified certificate. " + + "Accepting an unverified certificate means " + + "you may not be connected with the host you tried to connect to.\n" + + "Do you wish to override the security check and continue?" + onYes: { + var cert = certErrors.shift() + var domain = AppEngine.domainFromString(cert.url) + acceptedCertificates.acceptedUrls.push(domain) + cert.ignoreCertificateError() + presentError() + } + onNo: reject() + onRejected: reject() + + function reject(){ + certErrors.shift().rejectCertificate() + presentError() + } + function enqueue(error){ + currentError = error + certErrors.push(error) + presentError() + } + function presentError(){ + informativeText = "SSL error from URL\n\n" + currentError.url + "\n\n" + currentError.description + "\n" + } + } + + Rectangle { + id: urlDropDown + color: "white" + visible: navigation.visible + + property string searchString: navigation.addressBar.text + + anchors { + left: parent.left + right: parent.right + top: navigation.bottom + } + + state: "disabled" + + states: [ + State { + name: "enabled" + PropertyChanges { + target: urlDropDown + height: browserWindow.height - toolBarSize - 3 + } + }, + State { + name: "disabled" + PropertyChanges { + target: urlDropDown + height: 0 + } + } + ] + + Rectangle { + anchors.fill: parent + color: emptyBackgroundColor + } + + SearchProxyModel { + id: proxy + target: navigation.webView.navigationHistory.items + searchString: urlDropDown.searchString + enabled: urlDropDown.state == "enabled" + } + + ListView { + id: historyList + property int remainingHeight: Math.min((historyList.count + 1) * toolBarSize, inputPanel.y - toolBarSize - 3) + model: proxy + clip: true + boundsBehavior: Flickable.StopAtBounds + footerPositioning: ListView.InlineFooter + visible: urlDropDown.state == "enabled" + + anchors { + top: parent.top + left: parent.left + right: parent.right + } + height: remainingHeight + delegate: Rectangle { + id: wrapper + width: historyList.width + height: toolBarSize + color: "#09102b" + MouseArea { + anchors.fill: parent + onClicked: { + if (!url) + return + navigation.webView.url = url + navigation.webView.forceActiveFocus() + } + } + + Column { + width: parent.width - 60 + height: parent.height + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + } + Text { + property string highlightTitle: title ? title : "" + height: wrapper.height / 2 + width: parent.width + elide: Text.ElideRight + verticalAlignment: Text.AlignBottom + anchors{ + leftMargin: 30 + rightMargin: 30 + } + id: titleLabel + font.family: defaultFontFamily + font.pixelSize: 23 + color: "white" + text: Utils.highlight(highlightTitle, urlDropDown.searchString) + } + Text { + property string highlightUrl: url ? url : "" + height: wrapper.height / 2 - 1 + width: parent.width + elide: Text.ElideRight + verticalAlignment: Text.AlignTop + font.family: defaultFontFamily + font.pixelSize: 23 + color: "white" //uiColor + text: Utils.highlight(highlightUrl, urlDropDown.searchString) + } + Rectangle { + anchors.horizontalCenter: parent.horizontalCenter + width: historyList.width + height: 1 + color: iconStrokeColor + } + } + } + footer: Rectangle { + z: 5 + width: historyList.width + height: toolBarSize + color: "#09102b" + MouseArea { + anchors.fill: parent + onClicked: { + var string = urlDropDown.searchString + var constructedUrl = "" + if (AppEngine.isUrl(string)) { + constructedUrl = AppEngine.fromUserInput(string) + } else { + constructedUrl = AppEngine.fromUserInput(googleSearchQuery + string) + } + navigation.webView.url = constructedUrl + navigation.webView.forceActiveFocus() + } + } + Row { + height: parent.height + Rectangle { + id: searchIcon + height: parent.height + width: height + color: "transparent" + Image { + anchors.centerIn: parent + source: "assets/icons/Btn_Search.png" + } + } + Text { + id: searchText + height: parent.height + width: historyList.width - searchIcon.width - 30 + elide: Text.ElideRight + text: urlDropDown.searchString + verticalAlignment: Text.AlignVCenter + font.family: defaultFontFamily + font.pixelSize: 23 + color: "white" + } + } + } + } + + transitions: Transition { + PropertyAnimation { property: "height"; duration: animationDuration; easing.type : Easing.InSine } + } + } + + HomeScreen { + id: homeScreen + height: parent.height - toolBarSize + anchors { + top: navigation.bottom + left: parent.left + right: parent.right + } + } + + SettingsView { + id: settingsView + height: parent.height - toolBarSize + anchors { + top: navigation.bottom + left: parent.left + right: parent.right + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/CustomSwitch.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/CustomSwitch.qml new file mode 100644 index 0000000..e25a84e --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/CustomSwitch.qml @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import QtDeviceUtilities.QtButtonImageProvider 1.0 +import QtQuick.Controls 2.1 + +Switch { + id: control + + property alias indicatorWidth: indicatorImg.width + property alias indicatorHeight: indicatorImg.height + property string switchTextColor: "#3b4155" + + indicator: Image { + id: indicatorImg + width: 200 + height: 75 + sourceSize: Qt.size(width, height) + anchors.horizontalCenter: control.horizontalCenter + y: parent.height / 2 - height / 2 + source: "image://QtButton/10/#848895/transparent" + Text { + id: offText + anchors.left: parent.left + anchors.leftMargin: parent.width * 0.075 + anchors.verticalCenter: parent.verticalCenter + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + fontSizeMode: Text.Fit + minimumPixelSize: 1 + font.pixelSize: parent.height * 0.55 + color: switchTextColor + text: "OFF" + font.family: defaultFontFamily + } + Text { + id: onText + anchors.right: parent.right + anchors.rightMargin: parent.width * 0.1 + anchors.verticalCenter: parent.verticalCenter + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + fontSizeMode: Text.Fit + minimumPixelSize: 1 + font.pixelSize: parent.height * 0.55 + color: switchTextColor + text: "ON" + font.family: defaultFontFamily + } + + Binding { + target: qtHandle + property: "x" + value: control.checked ? indicatorImg.width - qtHandle.width - indicatorImg.width * 0.025 : indicatorImg.width * 0.025 + when: !mousearea.drag.active + } + + MouseArea { + anchors.fill: parent + onClicked: control.checked = !control.checked + } + + QtButton { + id: qtHandle + anchors.verticalCenter: parent.verticalCenter + width: parent.width * 0.475 + height: parent.height * 0.9 + fillColor: control.checked ? buttonPressedColor : toolBarSeparatorColor + text: control.checked ? "ON" : "OFF" + borderColor: "transparent" + Behavior on x { + NumberAnimation { duration: 50 } + } + + MouseArea { + id: mousearea + anchors.fill: parent + drag.target: qtHandle + drag.axis: Drag.XAxis + drag.minimumX: indicatorImg.width * 0.005 + drag.maximumX: indicatorImg.width - width - indicatorImg.width * 0.005 + + onClicked: { + control.checked = !control.checked + } + + onReleased: { + if (qtHandle.x > indicatorImg.width / 5 ) { + control.checked = true + } else { + control.checked = false + } + } + } + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/FeaturePermissionBar.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/FeaturePermissionBar.qml new file mode 100644 index 0000000..374c9d7 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/FeaturePermissionBar.qml @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtWebEngine 1.1 +import QtQuick.Layouts 1.0 + +import "assets" + +Rectangle { + property var requestedFeature; + property url securityOrigin; + property WebEngineView view; + + id: permissionBar + visible: false + height: 50 + + onRequestedFeatureChanged: { + message.text = securityOrigin + " wants to access " + message.textForFeature(requestedFeature); + } + + + RowLayout { + spacing: 0 + anchors { + fill: permissionBar + } + Rectangle { + color: uiColor + height: parent.height + Layout.fillWidth: true + + Text { + id: message + width: parent.width + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + anchors { + leftMargin: 15 + rightMargin: 15 + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + } + font.family: defaultFontFamily + font.pixelSize: 20 + color: "white" + function textForFeature(feature) { + if (feature === WebEngineView.MediaAudioCapture) + return "your microphone" + if (feature === WebEngineView.MediaVideoCapture) + return "your camera" + if (feature === WebEngineView.MediaAudioVideoCapture) + return "your camera and microphone" + if (feature === WebEngineView.Geolocation) + return "your position" + } + } + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + + UIButton { + id: acceptButton + implicitHeight: permissionBar.height + implicitWidth: toolBarSize + buttonText: "Accept" + textSize: 18 + Layout.alignment: Qt.AlignRight + onClicked: { + view.grantFeaturePermission(securityOrigin, requestedFeature, true); + permissionBar.visible = false; + } + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + + UIButton { + buttonText: "Deny" + textSize: 18 + implicitHeight: permissionBar.height + implicitWidth: toolBarSize + Layout.alignment: Qt.AlignRight + onClicked: { + view.grantFeaturePermission(securityOrigin, requestedFeature, false); + permissionBar.visible = false + } + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/HomeScreen.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/HomeScreen.qml new file mode 100644 index 0000000..6b53f55 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/HomeScreen.qml @@ -0,0 +1,595 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import WebBrowser 1.0 +import "assets" + +Rectangle { + id: homeScreen + property int padding: 60 + property int cellSize: width / 5 - padding + property alias messageBox: messageBox + property alias count: gridView.count + property alias currentIndex: gridView.currentIndex + color: "#09102b" + function set(i) { + var p = (i - i % gridViewPageItemCount) / gridViewPageItemCount + gridView.contentX = p * gridView.page + } + + state: "enabled" + onStateChanged: { + if (state == "enabled" && !gridView.count) + messageBox.state = "empty" + } + + signal add(string title, string url, string iconUrl, string fallbackColor) + onAdd: { + if (listModel.count === gridViewMaxBookmarks) { + navigation.refresh() + messageBox.state = "full" + state = "enabled" + homeScreen.forceActiveFocus() + return + } + var icon = url.indexOf("qt.io") != -1 ? "assets/icons/qt.png" : iconUrl + var element = { "title": title, "url": url, "iconUrl": icon, "fallbackColor": fallbackColor } + listModel.append(element) + set(listModel.count - 1) + } + + signal remove(string url, int idx) + onRemove: { + var index = idx < 0 ? contains(url) : idx + if (index < 0) + return + + listModel.remove(index) + gridView.forceLayout() + navigation.refresh() + if (!listModel.count) + messageBox.state = "empty" + } + + function get(index) { + return listModel.get(index) + } + + function contains(url) { + for (var idx = 0; idx < listModel.count; ++idx) { + if (listModel.get(idx).url === url) + return idx; + } + return -1; + } + + states: [ + State { + name: "enabled" + AnchorChanges { + target: homeScreen + anchors.top: navigation.bottom + } + }, + State { + name: "disabled" + AnchorChanges { + target: homeScreen + anchors.top: homeScreen.parent.bottom + } + }, + State { + name: "edit" + } + ] + + transitions: Transition { + AnchorAnimation { duration: animationDuration; easing.type : Easing.InSine } + } + + ListModel { + id: listModel + property string defaultBookmarks: "[{\"fallbackColor\":\"#46a2da\",\"iconUrl\":\"assets/icons/qt.png\",\"title\":\"Qt - Home\",\"url\":\"http://www.qt.io//"},{\"fallbackColor\":\"#18394c\",\"iconUrl\":\"http://www.topgear.com/sites/all/themes/custom/tg/apple-touch-icon-144x144.png/",\"title\":\"Top Gear\",\"url\":\"http://www.topgear.com//"},{\"fallbackColor\":\"#46a2da\",\"iconUrl\":\"https://duckduckgo.com/assets/icons/meta/DDG-iOS-icon_152x152.png/",\"title\":\"DuckDuckGo\",\"url\":\"https://duckduckgo.com//"},{\"fallbackColor\":\"#ff8c0a\",\"iconUrl\":\"http://s.blogsmithmedia.com/www.engadget.com/assets/images/favicon-160x160.png/",\"title\":\"Engadget | Technology News, Advice and Features\",\"url\":\"http://www.engadget.com//"},{\"fallbackColor\":\"#ff8c0a\",\"iconUrl\":\"https://www.openstreetmap.org/assets/favicon-194x194-32cdac24b02b88e09f0639bb92c760b2.png/",\"title\":\"OpenStreetMap\",\"url\":\"https://www.openstreetmap.org//"},{\"fallbackColor\":\"#5caa15\",\"iconUrl\":\"http://www.redditstatic.com/icon.png/",\"title\":\"reddit: the front page of the internet\",\"url\":\"http://www.reddit.com//"}]" + + Component.onCompleted: { + listModel.clear() + var string = AppEngine.restoreSetting("bookmarks", defaultBookmarks) + if (!string) + return + var list = JSON.parse(string) + for (var i = 0; i < list.length; ++i) { + listModel.append(list[i]) + } + navigation.refresh() + } + Component.onDestruction: { + var list = [] + for (var i = 0; i < listModel.count; ++i) { + list[i] = listModel.get(i) + } + AppEngine.saveSetting("bookmarks", JSON.stringify(list)) + } + } + + GridView { + id: gridView + + onCountChanged: { + if (!count) + messageBox.state = "empty" + else + messageBox.state = "disabled" + } + + property real dragStart: 0 + property real page: 4 * cellWidth + + anchors.fill: parent + model: listModel + cellWidth: homeScreen.cellSize + homeScreen.padding + cellHeight: cellWidth + flow: GridView.FlowTopToBottom + boundsBehavior: Flickable.StopAtBounds + maximumFlickVelocity: 0 + contentHeight: parent.height + + MouseArea { + z: -1 + enabled: homeScreen.state == "edit" + anchors.fill: parent + onClicked: homeScreen.state = "enabled" + } + + rightMargin: { + var margin = (parent.width - 4 * gridView.cellWidth - homeScreen.padding) / 2 + var padding = gridView.page - Math.round(gridView.count % gridViewPageItemCount / 2) * gridView.cellWidth + + if (padding == gridView.page) + return margin + + return margin + padding + } + + anchors { + topMargin: toolBarSize + leftMargin: (parent.width - 4 * gridView.cellWidth + homeScreen.padding) / 2 + } + + Behavior on contentX { + NumberAnimation { duration: 1.5 * animationDuration; easing.type : Easing.InSine} + } + + function snapToPage() { + if (dragging) { + dragStart = contentX + return + } + if (dragStart == 2 * page && contentX < 2 * page) { + contentX = page + return + } + if (dragStart == page) { + if (contentX < page) { + contentX = 0 + return + } + if (page < contentX) { + contentX = 2 * page + return + } + } + if (dragStart == 0 && 0 < contentX) { + contentX = page + return + } + contentX = 0 + } + + onDraggingChanged: snapToPage() + delegate: Rectangle { + id: square + property string iconColor: "#f6f6f6" + width: homeScreen.cellSize + height: width + border.color: iconStrokeColor + border.width: 1 + + Rectangle { + id: bg + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + margins: 1 + } + state: "fallback" + width: square.width - 2 + height: width + states: [ + State { + name: "fallback" + PropertyChanges { + target: square + color: fallbackColor + } + PropertyChanges { + target: bg + color: square.color + } + }, + State { + name: "normal" + PropertyChanges { + target: square + color: iconColor + } + PropertyChanges { + target: bg + color: square.color + } + } + ] + + Image { + id: icon + smooth: true + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + topMargin: width < bg.width ? 15 : 0 + } + width: { + if (!icon.sourceSize.width) + return 0 + if (icon.sourceSize.width < 100) + return 32 + + return bg.width + } + height: width + source: iconUrl + onStatusChanged: { + switch (status) { + case Image.Null: + case Image.Loading: + case Image.Error: + bg.state = "fallback" + break + case Image.Ready: + bg.state = "normal" + break + } + } + } + Text { + function cleanup(string) { + var t = string.replace("-", " ") + .replace("|", " ").replace(",", " ") + .replace(/\s\s+/g, "\n") + return t + } + + visible: icon.width != bg.width + text: cleanup(title) + font.family: defaultFontFamily + font.pixelSize: 18 + color: bg.state == "fallback" ? "white" : "black" + anchors { + top: icon.bottom + bottom: parent.bottom + left: parent.left + right: parent.right + leftMargin: 15 + rightMargin: 15 + bottomMargin: 15 + } + maximumLineCount: 3 + elide: Text.ElideRight + wrapMode: Text.Wrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + + Rectangle { + id: overlay + visible: opacity != 0.0 + anchors.fill: parent + color: iconOverlayColor + opacity: { + if (iconMouse.pressed) { + if (homeScreen.state != "edit") + return 0.1 + return 0.4 + } + if (homeScreen.state == "edit") + return 0.3 + return 0.0 + } + } + MouseArea { + id: iconMouse + anchors.fill: parent + onPressAndHold: { + if (homeScreen.state == "edit") { + homeScreen.state = "enabled" + return + } + homeScreen.state = "edit" + } + onClicked: { + if (homeScreen.state == "edit") { + homeScreen.state = "enabled" + return + } + navigation.load(url) + } + } + Rectangle { + enabled: homeScreen.state == "edit" + opacity: enabled ? 1.0 : 0.0 + width: image.sourceSize.width + height: image.sourceSize.height - 2 + radius: width / 2 + color: iconOverlayColor + anchors { + horizontalCenter: parent.right + verticalCenter: parent.top + } + Image { + id: image + opacity: { + if (deleteButton.pressed) + return 0.70 + return 1.0 + } + anchors { + top: parent.top + left: parent.left + } + source: "assets/icons/Btn_Delete.png" + MouseArea { + id: deleteButton + anchors.fill: parent + onClicked: { + mouse.accepted = true + remove(url, index) + } + } + } + Behavior on opacity { + NumberAnimation { duration: animationDuration } + } + } + } + } + Rectangle { + width: homeScreen.cellSize - homeScreen.padding / 2 - 10 + anchors { + left: parent.left + top: parent.top + bottom: parent.bottom + } + MouseArea { + enabled: homeScreen.state == "edit" + anchors.fill: parent + onClicked: homeScreen.state = "enabled" + } + color: "#09102b" + } + Rectangle { + width: homeScreen.cellSize - homeScreen.padding / 2 - 10 + anchors { + right: parent.right + top: parent.top + bottom: parent.bottom + } + MouseArea { + enabled: homeScreen.state == "edit" + anchors.fill: parent + onClicked: homeScreen.state = "enabled" + } + color: "#09102b" + } + Row { + id: pageIndicator + spacing: 20 + anchors { + bottomMargin: 40 + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + Repeater { + model: { + var c = gridView.count % gridViewPageItemCount + if (c > 0) + c = 1 + return Math.floor(gridView.count / gridViewPageItemCount) + c + } + delegate: Rectangle { + property bool active: index * gridView.page <= gridView.contentX && gridView.contentX < (index + 1) * gridView.page + width: 10 + height: width + radius: width / 2 + color: !active ? inactivePagerColor : uiColor + anchors.verticalCenter: parent.verticalCenter + MouseArea { + anchors.fill: parent + onClicked: gridView.contentX = index * gridView.page + } + } + } + } + + Rectangle { + id: messageBox + color: "white" + anchors.fill: parent + + Rectangle { + id: error + visible: messageBox.state != "empty" + height: childrenRect.height + anchors { + top: parent.top + left: parent.left + right: parent.right + topMargin: 50 + } + Image { + id: errorIcon + source: "assets/icons/Error_Icon.png" + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + } + } + Text { + anchors { + topMargin: 30 + top: errorIcon.bottom + horizontalCenter: parent.horizontalCenter + } + font.family: defaultFontFamily + font.pixelSize: message.font.pixelSize + text: "Oops!..." + color: iconOverlayColor + } + } + + Text { + id: message + anchors { + top: error.bottom + horizontalCenter: parent.horizontalCenter + } + color: iconOverlayColor + font.family: defaultFontFamily + font.pixelSize: 28 + verticalAlignment: Text.AlignTop + horizontalAlignment: Text.AlignHCenter + } + + Rectangle { + color: parent.color + anchors { + top: message.bottom + bottom: parent.bottom + left: parent.left + right: parent.right + bottomMargin: 70 + } + UIButton { + color: uiColor + implicitWidth: 180 + implicitHeight: 70 + buttonText: "OK" + visible: messageBox.state != "empty" + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + } + onClicked: { + if (messageBox.state == "tabsfull") { + homeScreen.state = "disabled" + tabView.viewState = "list" + return + } + if (messageBox.state == "full") { + messageBox.state = "disabled" + homeScreen.state = "edit" + return + } + } + } + } + + state: "disabled" + + states: [ + State { + name: "disabled" + PropertyChanges { + target: messageBox + visible: false + } + }, + State { + name: "empty" + PropertyChanges { + target: message + text: qsTr("No bookmarks have been saved so far.") + } + PropertyChanges { + target: messageBox + color: emptyBackgroundColor + visible: true + } + PropertyChanges { + target: error + anchors.topMargin: 30 + } + PropertyChanges { + target: navigation + state: "enabled" + } + }, + State { + name: "full" + PropertyChanges { + target: message + text: qsTr("24 bookmarks is the maximum limit.\nTo bookmark a new page you must delete a bookmark first.") + } + PropertyChanges { + target: messageBox + visible: true + } + PropertyChanges { + target: navigation + state: "enabled" + } + }, + State { + name: "tabsfull" + PropertyChanges { + target: message + text: qsTr("10 open tabs is the maximum limit.\nTo open a new tab you must close another one first.") + } + PropertyChanges { + target: messageBox + visible: true + } + PropertyChanges { + target: navigation + state: "enabled" + } + } + ] + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Keyboard.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Keyboard.qml new file mode 100644 index 0000000..9ea7f71 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Keyboard.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.VirtualKeyboard 2.0 + +InputPanel { + id: inputPanel + property int windowHeight: 0 + property int animationDuration: 0 + + y: windowHeight + anchors { + left: parent.left + right: parent.right + } + states: State { + name: "visible" + when: Qt.inputMethod.visible + PropertyChanges { + target: inputPanel + y: windowHeight - inputPanel.height + } + } + transitions: Transition { + from: "" + to: "visible" + reversible: true + NumberAnimation { + properties: "y" + duration: animationDuration + easing.type: Easing.InOutQuad + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Main.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Main.qml new file mode 100644 index 0000000..653b435 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Main.qml @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 + +Item { + BrowserWindow{ + id: root + anchors.fill: parent + Keyboard{ + id: inputPanel + windowHeight: root.height + animationDuration: root.animationDuration + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/MockTouchPoint.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/MockTouchPoint.qml new file mode 100644 index 0000000..b47525c --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/MockTouchPoint.qml @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: mockTouchPoint + + property bool pressed: false + property int pointId: 0 + + Image { + source: "assets/icons/touchpoint.png" + x: -(width / 2) + y: -(height / 2) + height: parent.height + width: parent.width + opacity: parent.pressed ? 0.6 : 0.0 + + Behavior on opacity { + NumberAnimation { duration: 200 } + } + + Text { + text: mockTouchPoint.pointId + anchors.centerIn: parent + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/NavigationBar.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/NavigationBar.qml new file mode 100644 index 0000000..8edbf77 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/NavigationBar.qml @@ -0,0 +1,422 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.2 +import WebBrowser 1.0 + +import "assets" + +ToolBar { + id: root + + property alias addressBar: urlBar + property Item webView: null + + onWebViewChanged: { + + } + + visible: opacity != 0.0 + opacity: tabView.viewState == "page" ? 1.0 : 0.0 + + function load(url) { + if (url) + webView.url = url + homeScreen.state = "disabled" + } + + function refresh() { + if (urlBar.text == "") + bookmarksButton.bookmarked = false + else + bookmarksButton.bookmarked = homeScreen.contains(urlBar.text) !== -1 + } + + state: "enabled" + + style: ToolBarStyle { + background: Rectangle { + color: uiColor + implicitHeight: toolBarSize + 3 + } + padding { + left: 0 + right: 0 + top: 0 + bottom: 0 + } + } + + Behavior on y { + NumberAnimation { duration: animationDuration } + } + + states: [ + State { + name: "enabled" + PropertyChanges { + target: root + y: 0 + } + }, + State { + name: "tracking" + PropertyChanges { + target: root + y: { + var diff = touchReference - touchY + + if (velocityY > velocityThreshold) { + if (diff > 0) + return -root.height + else + return 0 + } + + if (!touchGesture || diff == 0) { + if (y < -root.height / 2) + return -root.height + else + return 0 + } + + if (diff > root.height) + return -root.height + + if (diff > 0) { + if (y == -root.height) + return -root.height + return -diff + } + + // diff < 0 + + if (y == 0) + return 0 + + diff = Math.abs(diff) + if (diff >= root.height) + return 0 + + return -root.height + diff + } + } + }, + State { + name: "disabled" + PropertyChanges { + target: root + y: -root.height + } + } + ] + + RowLayout { + height: toolBarSize + anchors { + top: parent.top + right: parent.right + left: parent.left + } + spacing: 0 + + UIButton { + id: backButton + source: "icons/Btn_Back.png" + color: uiColor + highlightColor: buttonPressedColor + onClicked: webView.goBack() + enabled: webView && webView.canGoBack + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: forwardButton + source: "icons/Btn_Forward.png" + color: uiColor + highlightColor: buttonPressedColor + onClicked: webView.goForward() + enabled: webView && webView.canGoForward + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + Rectangle { + Layout.fillWidth: true + implicitWidth: 10 + height: parent.height + color: uiColor + } + TextField { + id: urlBar + Layout.fillWidth: true + text: webView ? webView.url : "" + activeFocusOnPress: true + inputMethodHints: Qt.ImhUrlCharactersOnly | Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase + placeholderText: qsTr("Search or type a URL") + + onActiveFocusChanged: { + if (activeFocus) { + urlBar.selectAll() + root.state = "enabled" + homeScreen.state = "disabled" + urlDropDown.state = "enabled" + } else { + urlDropDown.state = "disabled" + root.state = "tracking" + } + } + + UIButton { + id: reloadButton + state: cancelButton.visible ? "edit" : "load" + states: [ + State { + name: "load" + PropertyChanges { + target: reloadButton + source: webView && webView.loading ? "icons/Btn_Clear.png" : "icons/Btn_Reload.png" + height: 54 + } + }, + State { + name: "edit" + PropertyChanges { + target: reloadButton + source: "icons/Btn_Clear.png" + height: 45 + visible: urlBar.text != "" + } + } + ] + height: 54 + width: height + color: "transparent" + highlightColor: "#eeeeee" + radius: width / 2 + anchors { + rightMargin: 1 + right: parent.right + verticalCenter: addressBar.verticalCenter; + } + onClicked: { + if (state == "load") { + webView.loading ? webView.stop() : webView.reload() + webView.forceActiveFocus() + return + } + urlBar.selectAll() + urlBar.remove(urlBar.selectionStart, urlBar.selectionEnd) + } + } + style: TextFieldStyle { + textColor: "white" + font.family: defaultFontFamily + font.pixelSize: 28 + selectionColor: uiHighlightColor + selectedTextColor: "white" + placeholderTextColor: placeholderColor + background: Rectangle { + implicitWidth: 514 + implicitHeight: 56 + border.color: textFieldStrokeColor + color: "#09102b" + border.width: 2 + } + padding { + left: 15 + right: reloadButton.width + } + } + onAccepted: { + webView.url = AppEngine.fromUserInput(text) + homeScreen.state = "disabled" + tabView.viewState = "page" + } + + onTextChanged: refresh() + onEditingFinished: { + selectAll() + webView.forceActiveFocus() + } + } + Rectangle { + visible: !cancelButton.visible + Layout.fillWidth: true + implicitWidth: 10 + height: parent.height + color: uiColor + } + + UIButton { + id: cancelButton + color: uiColor + visible: urlDropDown.state === "enabled" + highlightColor: buttonPressedColor + Text { + color: "white" + anchors.centerIn: parent + text: "Cancel" + font.family: defaultFontFamily + font.pixelSize: 28 + } + implicitWidth: 120 + onClicked: { + urlDropDown.state = "disabled" + webView.forceActiveFocus() + } + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: homeButton + source: "icons/Btn_Home.png" + color: uiColor + highlightColor: buttonPressedColor + onClicked: { + if (homeScreen.state == "disabled" || homeScreen.state == "edit") { + homeScreen.messageBox.state = "disabled" + homeScreen.state = "enabled" + homeScreen.forceActiveFocus() + } else if (homeScreen.state != "disabled") { + homeScreen.state = "disabled" + } + } + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: pageViewButton + source: "icons/Btn_Tabs.png" + color: uiColor + highlightColor: buttonPressedColor + onClicked: { + if (tabView.viewState == "list") { + tabView.viewState = "page" + } else { + tabView.get(tabView.currentIndex).item.webView.takeSnapshot() + homeScreen.state = "disabled" + tabView.viewState = "list" + } + } + Text { + anchors { + centerIn: parent + verticalCenterOffset: 4 + } + + text: tabView.count + font.family: defaultFontFamily + font.pixelSize: 16 + font.weight: Font.DemiBold + color: "white" + } + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: bookmarksButton + color: uiColor + highlightColor: buttonPressedColor + enabled: urlBar.text != "" && !settingsView.privateBrowsingEnabled + property bool bookmarked: false + source: bookmarked ? "icons/Btn_Bookmark_Checked.png" : "icons/Btn_Bookmarks.png" + onClicked: { + if (!webView) + return + var icon = webView.loading ? "" : webView.icon + var idx = homeScreen.contains(webView.url.toString()) + if (idx !== -1) { + homeScreen.remove("", idx) + return + } + var count = homeScreen.count + homeScreen.add(webView.title, webView.url, icon, AppEngine.fallbackColor()) + if (count < homeScreen.count) + bookmarked = true + } + Component.onCompleted: refresh() + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: settingsButton + source: "icons/Btn_Settings.png" + color: uiColor + highlightColor: buttonPressedColor + onClicked: { + settingsView.state = "enabled" + } + } + } + ProgressBar { + id: progressBar + height: 3 + anchors { + left: parent.left + bottom: parent.bottom + right: parent.right + leftMargin: -10 + rightMargin: -10 + } + style: ProgressBarStyle { + background: Rectangle { + height: 3 + color: emptyBackgroundColor + } + progress: Rectangle { + //color: settingsView.privateBrowsingEnabled ? "#46a2da" : "#317198" + color: "#41cd52" + } + } + minimumValue: 0 + maximumValue: 100 + value: (webView && webView.loadProgress < 100) ? webView.loadProgress : 0 + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/PageView.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/PageView.qml new file mode 100644 index 0000000..b5b64b5 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/PageView.qml @@ -0,0 +1,682 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtWebEngine 1.1 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.2 +import QtGraphicalEffects 1.0 + +import WebBrowser 1.0 +import "assets" + +Rectangle { + id: root + + property int itemWidth: browserWindow.width / 2 + property int itemHeight: browserWindow.height / 2 + + property bool interactive: true + + property alias currentIndex: pathView.currentIndex + property alias count: pathView.count + + property string viewState: "page" + + onViewStateChanged: { + if (viewState == "page" || viewState == "fullscreen") + homeScreen.state = "disabled" + } + + property QtObject otrProfile: WebEngineProfile { + offTheRecord: true + } + + property QtObject defaultProfile: WebEngineProfile { + storageName: "YABProfile" + offTheRecord: false + } + + Component { + id: tabComponent + Rectangle { + id: tabItem + property alias webView: webEngineView + property alias title: webEngineView.title + + property var image: QtObject { + property var snapshot: null + property string url: "about:blank" + } + + visible: opacity != 0.0 + + Behavior on opacity { + NumberAnimation { duration: animationDuration } + } + + anchors.fill: parent + + Action { + shortcut: "Ctrl+F" + onTriggered: { + findBar.visible = !findBar.visible + if (findBar.visible) { + findTextField.forceActiveFocus() + } + } + } + + FeaturePermissionBar { + id: permBar + view: webEngineView + anchors { + left: parent.left + right: parent.right + top: parent.top + } + z: 3 + } + + WebEngineView { + id: webEngineView + + anchors { + fill: parent + top: permBar.bottom + } + + profile: settingsView.privateBrowsingEnabled ? otrProfile : defaultProfile + enabled: root.interactive + + function takeSnapshot() { + if (webEngineView.url == "" || webEngineView.url == "about:blank") { + tabItem.image.url = "about:blank" + tabItem.image.snapshot = null + return + } + + if (tabItem.image.url == webEngineView.url || tabItem.opacity != 1.0) + return + + tabItem.image.url = webEngineView.url + webEngineView.grabToImage(function(result) { + tabItem.image.snapshot = result; + console.log("takeSnapshot("+result.url+")") + }); + } + + // Trigger a refresh to check if the new url is bookmarked. + onUrlChanged: navigation.refresh() + + + settings.autoLoadImages: settingsView.autoLoadImages + settings.javascriptEnabled: !settingsView.javaScriptDisabled + + // This should be enabled as we can switch to Qt 5.6 (i.e. import QtWebEngine 1.2) + // settings.pluginsEnabled: settingsView.pluginsEnabled + + onLoadingChanged: { + if (loading) + navigation.state = "enabled" + } + + onCertificateError: { + if (!acceptedCertificates.shouldAutoAccept(error)){ + error.defer() + sslDialog.enqueue(error) + } else{ + error.ignoreCertificateError() + } + } + + onNewViewRequested: { + webEngineView.takeSnapshot() + var tab + if (!request.userInitiated) { + print("Warning: Blocked a popup window.") + return + } + + tab = tabView.createEmptyTab() + + if (!tab) + return + + if (request.destination == WebEngineView.NewViewInTab) { + pathView.positionViewAtIndex(tabView.count - 1, PathView.Center) + request.openIn(tab.webView) + } else if (request.destination == WebEngineView.NewViewInBackgroundTab) { + var index = pathView.currentIndex + request.openIn(tab.webView) + pathView.positionViewAtIndex(index, PathView.Center) + } else if (request.destination == WebEngineView.NewViewInDialog) { + request.openIn(tab.webView) + } else { + request.openIn(tab.webView) + } + } + + onFeaturePermissionRequested: { + permBar.securityOrigin = securityOrigin; + permBar.requestedFeature = feature; + permBar.visible = true; + } + + onFullScreenRequested: { + if (request.toggleOn) + viewState = "fullscreen" + else + viewState = "page" + request.accept() + } + } + + Desaturate { + id: desaturate + visible: desaturation != 0.0 + anchors.fill: webEngineView + source: webEngineView + desaturation: root.interactive ? 0.0 : 1.0 + + Behavior on desaturation { + NumberAnimation { duration: animationDuration } + } + } + + FastBlur { + id: blur + visible: radius != 0.0 + anchors.fill: desaturate + source: desaturate + radius: desaturate.desaturation * 25 + } + + TouchTracker { + id: tracker + enabled: root.interactive + target: webEngineView + anchors.fill: parent + onTouchYChanged: browserWindow.touchY = tracker.touchY + onYVelocityChanged: browserWindow.velocityY = yVelocity + onTouchBegin: { + browserWindow.touchY = tracker.touchY + browserWindow.velocityY = yVelocity + browserWindow.touchReference = tracker.touchY + browserWindow.touchGesture = true + navigation.state = "tracking" + } + onTouchEnd: { + browserWindow.velocityY = yVelocity + browserWindow.touchGesture = false + navigation.state = "tracking" + } + onScrollDirectionChanged: { + browserWindow.velocityY = 0 + browserWindow.touchReference = tracker.touchY + } + } + + Rectangle { + opacity: { + if (inputPanel.state === "visible") + return 0.0 + if (webEngineView.url == "" || webEngineView.url == "about:blank") + return 1.0 + return 0.0 + } + anchors.fill: parent + visible: opacity != 0.0 + color: "#09102b" + Image { + id: placeholder + y: placeholder.height - navigation.y + anchors.horizontalCenter: parent.horizontalCenter + source: "assets/icons/AppLogoColor.png" + } + Text { + id: label + anchors { + top: placeholder.bottom + topMargin: 20 + horizontalCenter: placeholder.horizontalCenter + } + font.family: defaultFontFamily + font.pixelSize: 28 + color: "white" + text: "Qt WebBrowser" + } + + Behavior on opacity { + NumberAnimation { duration: animationDuration } + } + } + + Rectangle { + id: findBar + anchors { + right: webEngineView.right + left: webEngineView.left + top: webEngineView.top + } + height: toolBarSize / 2 + 10 + visible: false + color: uiColor + + RowLayout { + spacing: 0 + anchors.fill: parent + Rectangle { + width: 5 + height: parent.height + color: uiColor + } + TextField { + id: findTextField + Layout.fillWidth: true + onAccepted: { + webEngineView.findText(text) + } + style: TextFieldStyle { + textColor: "black" + font.family: defaultFontFamily + font.pixelSize: 28 + selectionColor: uiHighlightColor + selectedTextColor: "black" + placeholderTextColor: placeholderColor + background: Rectangle { + implicitWidth: 514 + implicitHeight: toolBarSize / 2 + border.color: textFieldStrokeColor + border.width: 1 + } + } + } + Rectangle { + width: 5 + height: parent.height + color: uiColor + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: findBackwardButton + iconSource: "assets/icons/Btn_Back.png" + implicitHeight: parent.height + onClicked: webEngineView.findText(findTextField.text, WebEngineView.FindBackward) + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: findForwardButton + iconSource: "assets/icons/Btn_Forward.png" + implicitHeight: parent.height + onClicked: webEngineView.findText(findTextField.text) + } + Rectangle { + width: 1 + height: parent.height + color: uiSeparatorColor + } + UIButton { + id: findCancelButton + iconSource: "assets/icons/Btn_Clear.png" + implicitHeight: parent.height + onClicked: findBar.visible = false + } + } + } + } + } + + ListModel { + id: listModel + } + + function makeCurrent(index) { + viewState = "list" + pathView.positionViewAtIndex(index, PathView.Center) + viewState = "page" + } + + function createEmptyTab() { + var tab = add(tabComponent) + return tab + } + + function add(component) { + if (listModel.count === tabViewMaxTabs) { + homeScreen.messageBox.state = "tabsfull" + homeScreen.state = "enabled" + homeScreen.forceActiveFocus() + return null + } + + var element = {"item": null } + element.item = component.createObject(root, { "width": root.width, "height": root.height, "opacity": 0.0 }) + + if (element.item == null) { + console.log("PageView::add(): Error creating object"); + return + } + + listModel.append(element) + return element.item + } + + function remove(index) { + pathView.interactive = false + pathView.currentItem.state = "" + pathView.currentItem.visible = false + listModel.remove(index) + pathView.decrementCurrentIndex() + pathView.interactive = true + } + + function get(index) { + return listModel.get(index) + } + + Component { + id: delegate + + Rectangle { + id: wrapper + + parent: item + + property real visibility: 0.0 + property bool isCurrentItem: PathView.isCurrentItem + + visible: PathView.onPath && visibility != 0.0 + state: isCurrentItem ? root.viewState : "list" + + Behavior on scale { + NumberAnimation { duration: animationDuration } + } + + states: [ + State { + name: "page" + PropertyChanges { target: wrapper; width: root.width; height: root.height; visibility: 0.0 } + PropertyChanges { target: pathView; interactive: false } + PropertyChanges { target: item; opacity: 1.0 } + PropertyChanges { target: navigation; state: "enabled" } + }, + State { + name: "list" + PropertyChanges { target: wrapper; width: itemWidth; height: itemHeight; visibility: 1.0 } + PropertyChanges { target: pathView; interactive: true } + PropertyChanges { target: item; opacity: 0.0 } + }, + State { + name: "fullscreen" + PropertyChanges { target: wrapper; width: root.width; height: root.height; visibility: 0.0 } + PropertyChanges { target: pathView; interactive: false } + PropertyChanges { target: item; opacity: 1.0 } + PropertyChanges { target: navigation; state: "disabled" } + } + ] + + transitions: Transition { + ParallelAnimation { + PropertyAnimation { property: "visibility"; duration: animationDuration; easing.type : Easing.InSine } + PropertyAnimation { properties: "x,y"; duration: animationDuration; easing.type: Easing.InSine } + PropertyAnimation { properties: "width,height"; duration: animationDuration; easing.type: Easing.InSine } + } + } + + width: itemWidth; height: itemHeight + scale: { + if (pathView.count == 1) + return 1.0 + if (pathView.count < 4) + return isCurrentItem ? 1.0 : 0.5 + + if (isCurrentItem) + return 1.0 + + var index1 = pathView.currentIndex - 2 + var index2 = pathView.currentIndex - 1 + var index4 = (pathView.currentIndex + 1) % pathView.count + var index5 = (pathView.currentIndex + 2) % pathView.count + + if (index1 < 0) + index1 = pathView.count + index1 + if (index2 < 0) + index2 = pathView.count + index2 + + switch (index) { + case index1 : + return 0.25 + case index2: + return 0.5 + case index4: + return 0.5 + case index5: + return 0.25 + } + + return 0.25 + } + z: PathView.itemZ + + MouseArea { + enabled: pathView.interactive + anchors.fill: wrapper + onClicked: { + mouse.accepted = true + if (index < 0) + return + + if (index == pathView.currentIndex) { + if (root.viewState == "list") + root.viewState = "page" + return + } + pathView.currentIndex = index + } + } + Rectangle { + id: shadow + visible: false + property real size: 24 + anchors { + top: parent.top + topMargin: 9 + horizontalCenter: parent.horizontalCenter + } + color: iconOverlayColor + radius: size / 2 + width: snapshot.width + height: snapshot.height + } + GaussianBlur { + anchors.fill: shadow + source: shadow + radius: shadow.size + samples: shadow.size * 2 + opacity: 0.3 + transparentBorder: true + visible: wrapper.visibility == 1.0 + } + + Rectangle { + id: snapshot + color: uiColor + + Image { + source: { + if (!item.image.snapshot) + return "assets/icons/about_blank.png" + return item.image.snapshot.url + } + anchors.fill: parent + Rectangle { + enabled: index == pathView.currentIndex && !pathView.moving && !pathView.flicking && wrapper.visibility == 1.0 + opacity: enabled ? 1.0 : 0.0 + visible: wrapper.visibility == 1.0 && listModel.count > 1 + width: image.sourceSize.width + height: image.sourceSize.height - 2 + radius: width / 2 + color: iconOverlayColor + anchors { + horizontalCenter: parent.right + verticalCenter: parent.top + } + Image { + id: image + opacity: { + if (closeButton.pressed) + return 0.70 + return 1.0 + } + anchors { + top: parent.top + left: parent.left + } + source: "assets/icons/Btn_Delete.png" + MouseArea { + id: closeButton + anchors.fill: parent + onClicked: { + mouse.accepted = true + remove(pathView.currentIndex) + } + } + } + Behavior on opacity { + NumberAnimation { duration: animationDuration / 2 } + } + } + } + anchors.fill: wrapper + } + + Text { + anchors { + topMargin: -25 + top: parent.top + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + width: parent.width - image.width + elide: Text.ElideRight + text: item.title + font.pixelSize: 16 + font.family: defaultFontFamily + color: "white" + visible: wrapper.isCurrentItem && wrapper.visibility == 1.0 + } + } + } + + Rectangle { + color: "#09102b" + anchors.fill: parent + } + + PathView { + id: pathView + pathItemCount: 5 + anchors.fill: parent + model: listModel + delegate: delegate + highlightMoveDuration: animationDuration + highlightRangeMode: PathView.StrictlyEnforceRange + snapMode: PathView.SnapToItem + preferredHighlightBegin: 0.5 + preferredHighlightEnd: 0.5 + + dragMargin: itemHeight + + focus: pathView.interactive + + property real offset: 30 + + property real margin: { + if (count == 2) + return root.width / 4 - offset + if (count == 3) + return root.width / 8 + offset + if (count == 4) + return root.width / 8 - offset + + return offset + } + + property real middle: { + if (currentItem) + return (pathView.height / 2) - (currentItem.visibility * 50) + return (pathView.height / 2 - 50) + } + + path: Path { + startX: pathView.margin + startY: pathView.middle + + PathPercent { value: 0.0 } + PathAttribute { name: "itemZ"; value: 0 } + PathLine { + x: (pathView.width - itemWidth) / 2 + 106 + y: pathView.middle + } + PathPercent { value: 0.49 } + PathAttribute { name: "itemZ"; value: 6 } + + PathLine { relativeX: 0; relativeY: 0 } + + PathLine { + x: (pathView.width - itemWidth) / 2 + itemWidth - 106 + y: pathView.middle + } + PathPercent { value: 0.51 } + + PathLine { relativeX: 0; relativeY: 0 } + + PathAttribute { name: "itemZ"; value: 4 } + PathLine { + x: pathView.width - pathView.margin + y: pathView.middle + } + PathPercent { value: 1 } + PathAttribute { name: "itemZ"; value: 2 } + } + + Keys.onLeftPressed: decrementCurrentIndex() + Keys.onRightPressed: incrementCurrentIndex() + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/SettingsView.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/SettingsView.qml new file mode 100644 index 0000000..0b45801 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/SettingsView.qml @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import Qt.labs.settings 1.0 + +import WebBrowser 1.0 + +Rectangle { + id: root + color: "#09102b" + property bool privateBrowsingEnabled: appSettings[0].active + property bool httpDiskCacheEnabled: appSettings[1].active + property bool autoLoadImages: appSettings[2].active + property bool javaScriptDisabled: appSettings[3].active + // property bool pluginsEnabled: appSettings[4].active + + property var appSettings: [ + { "name": "Private Browsing", "active": false, "notify": function(v) { privateBrowsingEnabled = v; } }, + { "name": "Enable HTTP Disk Cache", "active": true, "notify": function(v) { httpDiskCacheEnabled = v; } }, + { "name": "Auto Load Images", "active": true, "notify": function(v) { autoLoadImages = v; } }, + { "name": "Disable JavaScript", "active": false, "notify": function(v) { javaScriptDisabled = v; } }, +// { "name": "Enable Plugins", "active": false, "notify": function(v) { pluginsEnabled = v; } } + ] + + function save() { + for (var i = 0; i < appSettings.length; ++i) { + var setting = appSettings[i] + + listModel.get(i).active = setting.active + // Do not persist private browsing mode + if (setting.name === "Private Browsing") + continue + AppEngine.saveSetting(setting.name, setting.active) + } + } + + Rectangle{ + color: toolBarSeparatorColor + height: 2 + anchors.top: root.top + anchors.right: root.right + anchors.left: root.left + z: 100 + } + + state: "disabled" + + states: [ + State { + name: "enabled" + AnchorChanges { + target: root + anchors.top: navigation.bottom + } + PropertyChanges { + target: settingsToolBar + opacity: 1.0 + } + }, + State { + name: "disabled" + AnchorChanges { + target: root + anchors.top: root.parent.bottom + } + PropertyChanges { + target: settingsToolBar + opacity: 0.0 + } + } + ] + + transitions: Transition { + AnchorAnimation { duration: animationDuration; easing.type : Easing.InSine } + } + + ListModel { + id: listModel + } + + ListView { + id: listView + anchors.fill: parent + model: listModel + delegate: Rectangle { + color: "transparent" + height: 100 + width: 560 + anchors.horizontalCenter: parent.horizontalCenter + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: defaultFontFamily + font.pixelSize: 28 + text: name + color: sw.enabled ? "white" : "#848895" + } + Rectangle { + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + } + CustomSwitch { + id: sw + onCheckedChanged: { + var setting = appSettings[index] + setting.active = checked + setting.notify(checked) + } + enabled: { + var ok = appSettings[index].name.indexOf("Disk Cache") < 0 + return ok || !privateBrowsingEnabled + } + anchors.centerIn: parent + checked: { + if (enabled) + return active + return false + } + /*style: SwitchStyle { + handle: Rectangle { + width: 42 + height: 42 + radius: height / 2 + color: "white" + border.color: control.checked ? "#5caa14" : "#9b9b9b" + border.width: 1 + } + + groove: Rectangle { + implicitWidth: 72 + height: 42 + radius: height / 2 + border.color: control.checked ? "#5caa14" : "#9b9b9b" + color: control.checked ? "#5cff14" : "white" + border.width: 1 + } + }*/ + } + } + } + + Component.onCompleted: { + for (var i = 0; i < appSettings.length; ++i) { + var setting = appSettings[i] + var active = JSON.parse(AppEngine.restoreSetting(setting.name, setting.active)) + if (setting.active !== active) { + setting.active = active + setting.notify(active) + } + listModel.append(setting) + } + listView.forceLayout() + } + Component.onDestruction: root.save() + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Utils.js b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Utils.js new file mode 100644 index 0000000..07ee41d --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/Utils.js @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +. pragma library + +function quote(str, delimiter) { + // discuss at: http://phpjs.org/functions/preg_quote/ + // original by: booeyOH + // improved by: Ates Goral (http://magnetiq.com) + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Brett Zamir (http://brett-zamir.me) + // bugfixed by: Onno Marsman + // example 1: preg_quote("$40"); + // returns 1: '\\$40' + // example 2: preg_quote("*RRRING* Hello?"); + // returns 2: '\\*RRRING\\* Hello\\?' + // example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); + // returns 3: '\\\\\\.\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:' + + return String(str) + .replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&'); +} + +function highlight( text, search ) +{ + return text.replace( new RegExp( "(" + quote( search ) + ")" , 'gi' ), "$1" ); +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIButton.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIButton.qml new file mode 100644 index 0000000..38d3e5a --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIButton.qml @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.2 + + +ToolButton { + id: root + implicitHeight: toolBarSize + implicitWidth: toolBarSize + + property alias buttonText: label.text + property alias textColor: label.color + property alias textSize: label.font.pixelSize + property string source: "" + property real radius: 0.0 + property string color: uiColor + property string highlightColor: buttonPressedColor + Text { + id: label + color: "white" + anchors.centerIn: parent + font.family: defaultFontFamily + font.pixelSize: 28 + } + style: ButtonStyle { + background: Rectangle { + opacity: root.enabled ? 1.0 : 0.3 + color: root.pressed || root.checked ? root.highlightColor : root.color + radius: root.radius + Image { + source: root.source + width: Math.min(sourceSize.width, root.width) + height: Math.min(sourceSize.height, root.height) + anchors.centerIn: parent + } + } + } +} + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIToolBar.qml b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIToolBar.qml new file mode 100644 index 0000000..caf4ec1 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/UIToolBar.qml @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import QtQuick.Layouts 1.0 + +ToolBar { + id: root + + property alias title: titleBox.text + property alias source: toolBarButton.source + property alias indicator: indicatorText.text + + property int indicatorWidth: 40 + property int indicatorHeight: 32 + + signal optionClicked() + signal doneClicked() + + height: navigation.height + + style: ToolBarStyle { + background: Rectangle { + color: toolBarFillColor + } + padding { + left: 0 + right: 0 + top: 0 + bottom: 0 + } + } + + RowLayout { + spacing: 0 + height: toolBarSize + anchors { + top: parent.top + right: parent.right + left: parent.left + } + Rectangle { + width: childrenRect.width + height: parent.height + color: toolBarFillColor + Text { + id: titleBox + visible: root.title !== "" + anchors { + leftMargin: visible ? 30 : 0 + left: parent.left + verticalCenter: parent.verticalCenter + } + color: "white" + font.pixelSize: 28 + font.family: defaultFontFamily + } + Rectangle { + visible: toolBarButton.visible && titleBox.visible + width: 1 + anchors { + top: parent.top + bottom: parent.bottom + } + color: toolBarSeparatorColor + } + UIButton { + id: toolBarButton + visible: root.source !== "" + color: toolBarFillColor + Component.onCompleted: toolBarButton.clicked.connect(root.optionClicked) + anchors.left: titleBox.right + } + } + Rectangle { + visible: toolBarButton.visible + width: 1 + height: parent.height + color: toolBarSeparatorColor + } + Rectangle { + width: indicatorWidth + height: parent.height + color: toolBarFillColor + } + Rectangle { + color: toolBarFillColor + Layout.fillWidth: true + height: parent.height + Rectangle { + visible: root.indicator !== "" + color: "transparent" + border.color: "white" + border.width: 2 + width: indicatorWidth + height: indicatorHeight + anchors.centerIn: parent + Text { + id: indicatorText + anchors.centerIn: parent + color: "white" + font.family: defaultFontFamily + font.pixelSize: 20 + } + } + } + Rectangle { + width: 1 + height: parent.height + color: toolBarSeparatorColor + } + UIButton { + id: doneButton + color: toolBarFillColor + buttonText: "Done" + implicitWidth: 120 + Component.onCompleted: doneButton.clicked.connect(root.doneClicked) + } + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoColor.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoColor.png new file mode 100644 index 0000000..2a49717 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoColor.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoGrey.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoGrey.png new file mode 100644 index 0000000..b2baae5 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/AppLogoGrey.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Add.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Add.png new file mode 100644 index 0000000..3c45c42 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Add.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Back.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Back.png new file mode 100644 index 0000000..562c9f6 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Back.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Checked.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Checked.png new file mode 100644 index 0000000..a6dbe6a Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Checked.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Indicator.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Indicator.png new file mode 100644 index 0000000..a8b8b6b Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmark_Indicator.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmarks.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmarks.png new file mode 100644 index 0000000..fc286cc Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Bookmarks.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Clear.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Clear.png new file mode 100644 index 0000000..1c9870a Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Clear.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Delete.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Delete.png new file mode 100644 index 0000000..2010838 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Delete.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Forward.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Forward.png new file mode 100644 index 0000000..e4c96f8 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Forward.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Home.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Home.png new file mode 100644 index 0000000..7358a59 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Home.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Reload.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Reload.png new file mode 100644 index 0000000..cff41cd Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Reload.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Search.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Search.png new file mode 100644 index 0000000..a6ef383 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Search.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Settings.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Settings.png new file mode 100644 index 0000000..33d7400 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Settings.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Tabs.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Tabs.png new file mode 100644 index 0000000..c007408 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Tabs.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Up.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Up.png new file mode 100644 index 0000000..f70a78d Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Btn_Up.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Error_Icon.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Error_Icon.png new file mode 100644 index 0000000..cf40696 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/Error_Icon.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/LightWebBrowser_Icons.svg b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/LightWebBrowser_Icons.svg new file mode 100644 index 0000000..fce4b40 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/LightWebBrowser_Icons.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/about_blank.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/about_blank.png new file mode 100644 index 0000000..6901b0b Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/about_blank.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/qt.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/qt.png new file mode 100644 index 0000000..6a22d2e Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/qt.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/touchpoint.png b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/touchpoint.png new file mode 100644 index 0000000..7649ee9 Binary files /dev/null and b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/qml/assets/icons/touchpoint.png differ diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/resources.qrc b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/resources.qrc new file mode 100644 index 0000000..451a67f --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/resources.qrc @@ -0,0 +1,37 @@ + + + qml/BrowserWindow.qml + qml/FeaturePermissionBar.qml + qml/MockTouchPoint.qml + qml/PageView.qml + qml/NavigationBar.qml + qml/HomeScreen.qml + qml/SettingsView.qml + qml/assets/UIButton.qml + qml/assets/UIToolBar.qml + qml/Utils.js + qml/assets/icons/Btn_Home.png + qml/assets/icons/Btn_Tabs.png + qml/assets/icons/Btn_Forward.png + qml/assets/icons/Btn_Back.png + qml/assets/icons/Btn_Reload.png + qml/assets/icons/Btn_Clear.png + qml/assets/icons/touchpoint.png + qml/assets/icons/Btn_Delete.png + qml/assets/icons/Btn_Bookmarks.png + qml/assets/icons/Btn_Bookmark_Checked.png + qml/assets/icons/Btn_Bookmark_Indicator.png + qml/assets/icons/Btn_Settings.png + qml/assets/icons/about_blank.png + qml/assets/icons/Btn_Add.png + qml/assets/icons/Btn_Up.png + qml/assets/icons/Btn_Search.png + qml/assets/icons/Error_Icon.png + qml/assets/icons/qt.png + qml/assets/icons/AppLogoColor.png + qml/assets/icons/AppLogoGrey.png + qml/Keyboard.qml + qml/Main.qml + qml/CustomSwitch.qml + + diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/src.pro b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/src.pro new file mode 100644 index 0000000..f076b73 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/src.pro @@ -0,0 +1,47 @@ +TARGET = qtwebbrowser + +CONFIG += c++11 +CONFIG -= app_bundle + +SOURCES = \ + appengine.cpp \ + main.cpp \ + navigationhistoryproxymodel.cpp \ + touchtracker.cpp + +HEADERS = \ + appengine.h \ + navigationhistoryproxymodel.h \ + touchtracker.h \ + +OTHER_FILES = \ + qml/assets/UIButton.qml \ + qml/assets/UIToolBar.qml \ + qml/ApplicationRoot.qml \ + qml/BrowserWindow.qml \ + qml/FeaturePermissionBar.qml \ + qml/MockTouchPoint.qml \ + qml/PageView.qml \ + qml/NavigationBar.qml \ + qml/HomeScreen.qml \ + qml/SettingsView.qml \ + qml/Keyboard.qml \ + qml/Window.qml + +QT += qml quick webengine + +RESOURCES += resources.qrc + +!cross_compile { + DEFINES += DESKTOP_BUILD + SOURCES += touchmockingapplication.cpp + HEADERS += touchmockingapplication.h + QT += gui-private + isEmpty(INSTALL_PREFIX): INSTALL_PREFIX=/usr/local/bin +} else { + # Path for Qt for Device Creation + isEmpty(INSTALL_PREFIX): INSTALL_PREFIX=/data/user/qt/qtwebbrowser-app +} + +target.path = $$INSTALL_PREFIX +INSTALLS += target diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.cpp b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.cpp new file mode 100644 index 0000000..5b56fa8 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.cpp @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "touchmockingapplication.h" +#include "appengine.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace utils; + +static inline QRectF touchRectForPosition(QPointF centerPoint) +{ + QRectF touchRect(0, 0, 40, 40); + touchRect.moveCenter(centerPoint); + return touchRect; +} + +TouchMockingApplication::TouchMockingApplication(int& argc, char** argv) + : QGuiApplication(argc, argv) + , m_realTouchEventReceived(false) + , m_pendingFakeTouchEventCount(0) + , m_holdingControl(false) +{ +} + +bool TouchMockingApplication::notify(QObject* target, QEvent* event) +{ + // We try to be smart, if we received real touch event, we are probably on a device + // with touch screen, and we should not have touch mocking. + + if (!event->spontaneous() || m_realTouchEventReceived) + return QGuiApplication::notify(target, event); + + if (isTouchEvent(event)) { + if (m_pendingFakeTouchEventCount) + --m_pendingFakeTouchEventCount; + else + m_realTouchEventReceived = true; + return QGuiApplication::notify(target, event); + } + + QQuickView* window = qobject_cast(target); + if (!window) + return QGuiApplication::notify(target, event); + + m_holdingControl = QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier); + + if (event->type() == QEvent::KeyRelease && static_cast(event)->key() == Qt::Key_Control) { + foreach (int id, m_heldTouchPoints) + if (m_touchPoints.contains(id) && !QGuiApplication::mouseButtons().testFlag(Qt::MouseButton(id))) { + m_touchPoints[id].setState(Qt::TouchPointReleased); + m_heldTouchPoints.remove(id); + } else + m_touchPoints[id].setState(Qt::TouchPointStationary); + + sendTouchEvent(window, m_heldTouchPoints.isEmpty() ? QEvent::TouchEnd : QEvent::TouchUpdate, static_cast(event)->timestamp()); + } + + if (isMouseEvent(event)) { + const QMouseEvent* const mouseEvent = static_cast(event); + + QTouchEvent::TouchPoint touchPoint; + touchPoint.setPressure(1); + + QEvent::Type touchType = QEvent::None; + + switch (mouseEvent->type()) { + case QEvent::MouseButtonPress: + touchPoint.setId(mouseEvent->button()); + if (m_touchPoints.contains(touchPoint.id())) { + touchPoint.setState(Qt::TouchPointMoved); + touchType = QEvent::TouchUpdate; + } else { + touchPoint.setState(Qt::TouchPointPressed); + // Check if more buttons are held down than just the event triggering one. + if (mouseEvent->buttons() > mouseEvent->button()) + touchType = QEvent::TouchUpdate; + else + touchType = QEvent::TouchBegin; + } + break; + case QEvent::MouseMove: + if (!mouseEvent->buttons()) { + // We have to swallow the event instead of propagating it, + // since we avoid sending the mouse release events and if the + // Flickable is the mouse grabber it would receive the event + // and would move the content. + event->accept(); + return true; + } + touchType = QEvent::TouchUpdate; + touchPoint.setId(mouseEvent->buttons()); + touchPoint.setState(Qt::TouchPointMoved); + break; + case QEvent::MouseButtonRelease: + // Check if any buttons are still held down after this event. + if (mouseEvent->buttons()) + touchType = QEvent::TouchUpdate; + else + touchType = QEvent::TouchEnd; + touchPoint.setId(mouseEvent->button()); + touchPoint.setState(Qt::TouchPointReleased); + break; + case QEvent::MouseButtonDblClick: + // Eat double-clicks, their accompanying press event is all we need. + event->accept(); + return true; + default: + Q_ASSERT_X(false, "multi-touch mocking", "unhandled event type"); + } + + // A move can have resulted in multiple buttons, so we need check them individually. + if (touchPoint.id() & Qt::LeftButton) + updateTouchPoint(mouseEvent, touchPoint, Qt::LeftButton); + if (touchPoint.id() & Qt::MidButton) + updateTouchPoint(mouseEvent, touchPoint, Qt::MidButton); + if (touchPoint.id() & Qt::RightButton) + updateTouchPoint(mouseEvent, touchPoint, Qt::RightButton); + + if (m_holdingControl && touchPoint.state() == Qt::TouchPointReleased) { + // We avoid sending the release event because the Flickable is + // listening to mouse events and would start a bounce-back + // animation if it received a mouse release. + event->accept(); + return true; + } + + // Update states for all other touch-points + for (QHash::iterator it = m_touchPoints.begin(), end = m_touchPoints.end(); it != end; ++it) { + if (!(it.value().id() & touchPoint.id())) + it.value().setState(Qt::TouchPointStationary); + } + + Q_ASSERT(touchType != QEvent::None); + + if (!sendTouchEvent(window, touchType, mouseEvent->timestamp())) + return QGuiApplication::notify(target, event); + + event->accept(); + return true; + } + + return QGuiApplication::notify(target, event); +} + +void TouchMockingApplication::updateTouchPoint(const QMouseEvent* mouseEvent, QTouchEvent::TouchPoint touchPoint, Qt::MouseButton mouseButton) +{ + // Ignore inserting additional touch points if Ctrl isn't held because it produces + // inconsistent touch events and results in assers in the gesture recognizers. + if (!m_holdingControl && m_touchPoints.size() && !m_touchPoints.contains(mouseButton)) + return; + + if (m_holdingControl && touchPoint.state() == Qt::TouchPointReleased) { + m_heldTouchPoints.insert(mouseButton); + return; + } + + // Gesture recognition uses the screen position for the initial threshold + // but since the canvas translates touch events we actually need to pass + // the screen position as the scene position to deliver the appropriate + // coordinates to the target. + touchPoint.setRect(touchRectForPosition(mouseEvent->localPos())); + touchPoint.setSceneRect(touchRectForPosition(mouseEvent->screenPos())); + + if (touchPoint.state() == Qt::TouchPointPressed) + touchPoint.setStartScenePos(mouseEvent->screenPos()); + else { + const QTouchEvent::TouchPoint& oldTouchPoint = m_touchPoints[mouseButton]; + touchPoint.setStartScenePos(oldTouchPoint.startScenePos()); + touchPoint.setLastPos(oldTouchPoint.pos()); + touchPoint.setLastScenePos(oldTouchPoint.scenePos()); + } + + // Update current touch-point. + touchPoint.setId(mouseButton); + m_touchPoints.insert(mouseButton, touchPoint); +} + +bool TouchMockingApplication::sendTouchEvent(QQuickView* window, QEvent::Type type, ulong timestamp) +{ + static QTouchDevice* device = 0; + if (!device) { + device = new QTouchDevice; + device->setType(QTouchDevice::TouchScreen); + QWindowSystemInterface::registerTouchDevice(device); + } + + m_pendingFakeTouchEventCount++; + + const QList& currentTouchPoints = m_touchPoints.values(); + Qt::TouchPointStates touchPointStates = 0; + foreach (const QTouchEvent::TouchPoint& touchPoint, currentTouchPoints) + touchPointStates |= touchPoint.state(); + + QTouchEvent event(type, device, Qt::NoModifier, touchPointStates, currentTouchPoints); + event.setTimestamp(timestamp); + event.setAccepted(false); + + QGuiApplication::notify(window, &event); + + updateVisualMockTouchPoints(window,m_holdingControl ? currentTouchPoints : QList()); + + // Get rid of touch-points that are no longer valid + foreach (const QTouchEvent::TouchPoint& touchPoint, currentTouchPoints) { + if (touchPoint.state() == Qt::TouchPointReleased) + m_touchPoints.remove(touchPoint.id()); + } + + return event.isAccepted(); +} + +void TouchMockingApplication::updateVisualMockTouchPoints(QQuickView* window,const QList& touchPoints) +{ + if (touchPoints.isEmpty()) { + // Hide all touch indicator items. + foreach (QQuickItem* item, m_activeMockComponents.values()) + item->setProperty("pressed", false); + + return; + } + + foreach (const QTouchEvent::TouchPoint& touchPoint, touchPoints) { + QQuickItem* mockTouchPointItem = m_activeMockComponents.value(touchPoint.id()); + + if (!mockTouchPointItem) { + QQmlComponent touchMockPointComponent(window->engine(), QUrl("qrc:///qml/MockTouchPoint.qml")); + mockTouchPointItem = qobject_cast(touchMockPointComponent.create()); + Q_ASSERT(mockTouchPointItem); + m_activeMockComponents.insert(touchPoint.id(), mockTouchPointItem); + mockTouchPointItem->setProperty("pointId", QVariant(touchPoint.id())); + mockTouchPointItem->setParent(window->rootObject()); + mockTouchPointItem->setParentItem(window->rootObject()); + } + + QRectF touchRect = touchPoint.rect(); + mockTouchPointItem->setX(touchRect.center().x()); + mockTouchPointItem->setY(touchRect.center().y()); + mockTouchPointItem->setWidth(touchRect.width()); + mockTouchPointItem->setHeight(touchRect.height()); + mockTouchPointItem->setProperty("pressed", QVariant(touchPoint.state() != Qt::TouchPointReleased)); + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.h b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.h new file mode 100644 index 0000000..d6f13ec --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchmockingapplication.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TOUCHMOCKINGAPPLICATION_H +#define TOUCHMOCKINGAPPLICATION_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QQuickView; +class QQuickItem; +QT_END_NAMESPACE + +class TouchMockingApplication : public QGuiApplication +{ + Q_OBJECT + +public: + TouchMockingApplication(int &argc, char **argv); + + virtual bool notify(QObject *, QEvent *) override; + +private: + void updateTouchPoint(const QMouseEvent *, QTouchEvent::TouchPoint, Qt::MouseButton); + bool sendTouchEvent(QQuickView *, QEvent::Type, ulong timestamp); + void updateVisualMockTouchPoints(QQuickView *,const QList &touchPoints); + +private: + bool m_realTouchEventReceived; + int m_pendingFakeTouchEventCount; + + QPointF m_lastPos; + QPointF m_lastScreenPos; + QPointF m_startScreenPos; + + QHash m_touchPoints; + QSet m_heldTouchPoints; + QHash m_activeMockComponents; + + bool m_holdingControl; +}; + +#endif // TOUCHMOCKINGAPPLICATION_H diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.cpp b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.cpp new file mode 100644 index 0000000..bd0f132 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "touchtracker.h" +#include "appengine.h" + +#include + +using namespace utils; + +TouchTracker::TouchTracker(QQuickItem *parent) + : QQuickItem(parent) + , m_blockEvents(false) + , m_diff(0) + , m_previousY(0) + , m_target(0) + , m_delegate(0) +{ + m_startPoint.ts = 0; + m_currentPoint.ts = 0; +} + +QQuickItem *TouchTracker::target() const +{ + return m_target; +} + +void TouchTracker::setTarget(QQuickItem * target) +{ + m_target = target; + emit targetChanged(); +} + +int TouchTracker::xVelocity() const +{ + qreal pos = qAbs(m_startPoint.x() - m_currentPoint.x()); + qreal time = qAbs(m_startPoint.ts - m_currentPoint.ts); + return pos / time * 1000; +} + +int TouchTracker::yVelocity() const +{ + qreal pos = qAbs(m_startPoint.y() - m_currentPoint.y()); + qreal time = qAbs(m_startPoint.ts - m_currentPoint.ts); + return pos / time * 1000; +} + + +qreal TouchTracker::touchX() const +{ + return m_currentPoint.x(); +} + +qreal TouchTracker::touchY() const +{ + return m_currentPoint.y(); +} + +bool TouchTracker::blockEvents() const +{ + return m_blockEvents; +} + +void TouchTracker::setBlockEvents(bool shouldBlock) +{ + if (m_blockEvents == shouldBlock) + return; + m_blockEvents = shouldBlock; + emit blockEventsChanged(); +} + +bool TouchTracker::eventFilter(QObject *obj, QEvent *event) +{ + if (obj != m_delegate) + return QQuickItem::eventFilter(obj, event); + + if (event->type() == QEvent::Wheel) + return m_blockEvents; + + if (!isTouchEvent(event)) + return QQuickItem::eventFilter(obj, event); + + const QTouchEvent *touch = static_cast(event); + const QList &points = touch->touchPoints(); + m_previousY = m_currentPoint.y(); + m_currentPoint.pos = m_target->mapToScene(points.at(0).pos()); + m_currentPoint.ts = QDateTime::currentMSecsSinceEpoch(); + int currentDiff = m_previousY - m_currentPoint.y(); + + if ((currentDiff > 0 && m_diff < 0) || (currentDiff < 0 && m_diff > 0)) + emit scrollDirectionChanged(); + + m_diff = currentDiff; + + emit touchChanged(); + emit velocityChanged(); + + if (event->type() == QEvent::TouchEnd) + emit touchEnd(); + + return m_blockEvents; +} + +void TouchTracker::touchEvent(QTouchEvent * event) +{ + if (!m_target) { + if (!m_blockEvents) + QQuickItem::touchEvent(event); + + return; + } + + event->setAccepted(false); + + const QList &points = event->touchPoints(); + m_currentPoint.pos = m_target->mapToScene(points.at(0).pos()); + m_currentPoint.ts = QDateTime::currentMSecsSinceEpoch(); + + if (event->type() == QEvent::TouchBegin) { + m_startPoint = m_currentPoint; + emit touchBegin(); + } + + emit touchChanged(); + + // We have to find the delegate to be able to filter + // events from the WebEngineView. + // This is a hack and should preferably be made easier + // with the API in some way. + QQuickItem *child = m_target->childAt(m_currentPoint.x(), m_currentPoint.y()); + if (child && m_delegate != child) { + child->installEventFilter(this); + m_delegate = child; + } +} diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.h b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.h new file mode 100644 index 0000000..dfd2e61 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/src/touchtracker.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt WebBrowser application. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TOUCHTRACKER_H +#define TOUCHTRACKER_H + +#include +#include + +class TouchTracker : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(qreal touchX READ touchX NOTIFY touchChanged) + Q_PROPERTY(qreal touchY READ touchY NOTIFY touchChanged) + Q_PROPERTY(int xVelocity READ xVelocity NOTIFY velocityChanged) + Q_PROPERTY(int yVelocity READ yVelocity NOTIFY velocityChanged) + Q_PROPERTY(bool blockEvents READ blockEvents WRITE setBlockEvents NOTIFY blockEventsChanged) + Q_PROPERTY(QQuickItem* target READ target WRITE setTarget NOTIFY targetChanged) + + struct PositionInfo + { + QPointF pos; + qint64 ts; + qreal x() const { return pos.x(); } + qreal y() const { return pos.y(); } + }; + +public: + TouchTracker(QQuickItem *parent = 0); + + qreal touchX() const; + qreal touchY() const; + int xVelocity() const; + int yVelocity() const; + QQuickItem* target() const; + bool blockEvents() const; + void setBlockEvents(bool shouldBlock); + void setTarget(QQuickItem * target); + +signals: + void touchChanged(); + void blockEventsChanged(); + void targetChanged(); + void touchBegin(); + void touchEnd(); + void velocityChanged(); + void scrollDirectionChanged(); + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + void touchEvent(QTouchEvent *event) override; + +private: + bool m_blockEvents; + int m_diff; + int m_previousY; + PositionInfo m_startPoint; + PositionInfo m_currentPoint; + QQuickItem *m_target; + QQuickItem *m_delegate; +}; + +#endif // TOUCHTRACKER_H diff --git a/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/tests/tests.pro b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/tests/tests.pro new file mode 100644 index 0000000..9671085 --- /dev/null +++ b/basicsuite/qtwebbrowser/tqtc-qtwebbrowser/tests/tests.pro @@ -0,0 +1 @@ +TEMPLATE = subdirs diff --git a/basicsuite/shared/fonts.qrc b/basicsuite/shared/fonts.qrc new file mode 100644 index 0000000..ccc8864 --- /dev/null +++ b/basicsuite/shared/fonts.qrc @@ -0,0 +1,19 @@ + + + fonts/TitilliumWeb-Black.ttf + fonts/TitilliumWeb-Bold.ttf + fonts/TitilliumWeb-ExtraLight.ttf + fonts/TitilliumWeb-Light.ttf + fonts/TitilliumWeb-Regular.ttf + fonts/TitilliumWeb-SemiBold.ttf + fonts/ebike-fonts/fontawesome-webfont.ttf + fonts/ebike-fonts/Montserrat-Bold.ttf + fonts/ebike-fonts/Montserrat-Light.ttf + fonts/ebike-fonts/Montserrat-Medium.ttf + fonts/ebike-fonts/Montserrat-Regular.ttf + fonts/ebike-fonts/Teko-Bold.ttf + fonts/ebike-fonts/Teko-Light.ttf + fonts/ebike-fonts/Teko-Medium.ttf + fonts/ebike-fonts/Teko-Regular.ttf + + diff --git a/basicsuite/shared/fonts/TitilliumWeb-Black.ttf b/basicsuite/shared/fonts/TitilliumWeb-Black.ttf new file mode 100644 index 0000000..fc5c4b5 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-Black.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-Bold.ttf b/basicsuite/shared/fonts/TitilliumWeb-Bold.ttf new file mode 100644 index 0000000..0af0fe7 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-Bold.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-BoldItalic.ttf b/basicsuite/shared/fonts/TitilliumWeb-BoldItalic.ttf new file mode 100644 index 0000000..77425ea Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-BoldItalic.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-ExtraLight.ttf b/basicsuite/shared/fonts/TitilliumWeb-ExtraLight.ttf new file mode 100644 index 0000000..2b506ef Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-ExtraLight.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-ExtraLightItalic.ttf b/basicsuite/shared/fonts/TitilliumWeb-ExtraLightItalic.ttf new file mode 100644 index 0000000..c1be5ba Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-ExtraLightItalic.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-Italic.ttf b/basicsuite/shared/fonts/TitilliumWeb-Italic.ttf new file mode 100644 index 0000000..42f2c10 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-Italic.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-Light.ttf b/basicsuite/shared/fonts/TitilliumWeb-Light.ttf new file mode 100644 index 0000000..ca67971 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-Light.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-LightItalic.ttf b/basicsuite/shared/fonts/TitilliumWeb-LightItalic.ttf new file mode 100644 index 0000000..2ea724f Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-LightItalic.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-Regular.ttf b/basicsuite/shared/fonts/TitilliumWeb-Regular.ttf new file mode 100644 index 0000000..6da8219 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-Regular.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-SemiBold.ttf b/basicsuite/shared/fonts/TitilliumWeb-SemiBold.ttf new file mode 100644 index 0000000..dfdcdbe Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-SemiBold.ttf differ diff --git a/basicsuite/shared/fonts/TitilliumWeb-SemiBoldItalic.ttf b/basicsuite/shared/fonts/TitilliumWeb-SemiBoldItalic.ttf new file mode 100644 index 0000000..b68a669 Binary files /dev/null and b/basicsuite/shared/fonts/TitilliumWeb-SemiBoldItalic.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Montserrat-Bold.ttf b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Bold.ttf new file mode 100644 index 0000000..8e9a5f3 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Bold.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Montserrat-Light.ttf b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Light.ttf new file mode 100644 index 0000000..e66dc5b Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Light.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Montserrat-Medium.ttf b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Medium.ttf new file mode 100644 index 0000000..88d70b8 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Medium.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Montserrat-Regular.ttf b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Regular.ttf new file mode 100644 index 0000000..626355a Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Montserrat-Regular.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Teko-Bold.ttf b/basicsuite/shared/fonts/ebike-fonts/Teko-Bold.ttf new file mode 100644 index 0000000..d061824 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Teko-Bold.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Teko-Light.ttf b/basicsuite/shared/fonts/ebike-fonts/Teko-Light.ttf new file mode 100644 index 0000000..ec5194a Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Teko-Light.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Teko-Medium.ttf b/basicsuite/shared/fonts/ebike-fonts/Teko-Medium.ttf new file mode 100644 index 0000000..cc38086 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Teko-Medium.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/Teko-Regular.ttf b/basicsuite/shared/fonts/ebike-fonts/Teko-Regular.ttf new file mode 100644 index 0000000..3161e63 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/Teko-Regular.ttf differ diff --git a/basicsuite/shared/fonts/ebike-fonts/fontawesome-webfont.ttf b/basicsuite/shared/fonts/ebike-fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/basicsuite/shared/fonts/ebike-fonts/fontawesome-webfont.ttf differ diff --git a/basicsuite/shared/main.cpp b/basicsuite/shared/main.cpp index 3c21bf5..c6aefc3 100644 --- a/basicsuite/shared/main.cpp +++ b/basicsuite/shared/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of Qt for Device Creation. @@ -63,6 +63,10 @@ #include #include #include +#include +#include +#include +#include #if defined(USE_QTWEBENGINE) #include @@ -70,12 +74,26 @@ #include "engine.h" +static bool checkGlAvailability() +{ + QQuickWindow window; + return ((window.sceneGraphBackend() != "software") && + (window.sceneGraphBackend() != "softwarecontext")); +} + int main(int argc, char **argv) { //qputenv("QT_IM_MODULE", QByteArray("qtvkb")); + qputenv("QT_QUICK_CONTROLS_CONF", "/data/user/qt/qtquickcontrols2/qtquickcontrols2.conf"); + QIcon::setThemeName("gallery"); + QIcon::setThemeSearchPaths(QStringList() << "/data/user/qt/qtquickcontrols2/icons"); - QApplication app(argc, argv); + // Do not set HighDpiScaling for emulator, see QTBUG-64815 + if (qEnvironmentVariableIsEmpty("QTGLESSTREAM_DISPLAY")) { + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + } + QApplication app(argc, argv); #if defined(USE_QTWEBENGINE) // This is currently needed by all QtWebEngine applications using the HW accelerated QQuickWebView. @@ -84,6 +102,22 @@ int main(int argc, char **argv) QtWebEngine::initialize(); #endif + QFontDatabase::addApplicationFont(":/fonts/TitilliumWeb-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/TitilliumWeb-SemiBold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/TitilliumWeb-Bold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/TitilliumWeb-Black.ttf"); + + //For eBike demo + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Montserrat-Bold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Montserrat-Light.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Montserrat-Medium.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Montserrat-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Teko-Bold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Teko-Light.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Teko-Medium.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/Teko-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/ebike-fonts/fontawesome-webfont.ttf"); + QString path = app.applicationDirPath(); QPalette pal; @@ -114,10 +148,37 @@ int main(int argc, char **argv) QGuiApplication::setFont(font); } + // Material style can be set only for devices supporting GL + QSettings styleSettings; + QString style = styleSettings.value("style").toString(); + if (checkGlAvailability()) { + if (style.isEmpty() || style == "Default") + styleSettings.setValue("style", "Material"); + } else { + qDebug()<<"No GL available, skipping Material style"; + } + QQuickStyle::setStyle(styleSettings.value("style").toString()); + DummyEngine engine; QQmlApplicationEngine applicationengine; + QString appFont("TitilliumWeb"); applicationengine.rootContext()->setContextProperty("engine", &engine); + applicationengine.rootContext()->setContextProperty("appFont", appFont); + applicationengine.rootContext()->setContextProperty("availableStyles", QQuickStyle::availableStyles()); + + QSettings demoSettings("Boot2Qt-demos", "demoSettings"); + + applicationengine.rootContext()->setContextProperty("_backgroundColor", demoSettings.value("backgroundColor", "#09102b")); + applicationengine.rootContext()->setContextProperty("_primaryGreen", demoSettings.value("primaryGreen", "#41cd52")); + applicationengine.rootContext()->setContextProperty("_mediumGreen", demoSettings.value("mediumGreen", "#21be2b")); + applicationengine.rootContext()->setContextProperty("_darkGreen", demoSettings.value("darkGreen", "#17a81a")); + applicationengine.rootContext()->setContextProperty("_primaryGrey", demoSettings.value("primaryGrey", "#9d9faa")); + applicationengine.rootContext()->setContextProperty("_secondaryGrey", demoSettings.value("secondaryGrey", "#3a4055")); + + applicationengine.rootContext()->setContextProperty("VideosLocation", demoSettings.value("videosLocation", "file:///data/videos")); + applicationengine.rootContext()->setContextProperty("DefaultVideoUrl", demoSettings.value("defaultVideoUrl", "file:///data/videos/Qt+for+Designers+and+Developers.mp4")); + applicationengine.load(QUrl::fromLocalFile(path + "/SharedMain.qml")); app.exec(); diff --git a/basicsuite/shared/settings.js b/basicsuite/shared/settings.js new file mode 100644 index 0000000..8dcc976 --- /dev/null +++ b/basicsuite/shared/settings.js @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +.pragma library + +var backgroundColor = "#09102b" + +var primaryGreen = "#41cd52" +var mediumGreen = "#21be2b" +var darkGreen = "#17a81a" + +var primaryGrey = "#9d9faa" +var secondaryGrey = "#3a4055" + diff --git a/basicsuite/shared/settings.qrc b/basicsuite/shared/settings.qrc new file mode 100644 index 0000000..576a1e9 --- /dev/null +++ b/basicsuite/shared/settings.qrc @@ -0,0 +1,5 @@ + + + settings.js + + diff --git a/basicsuite/shared/shared.pri b/basicsuite/shared/shared.pri index bc1c222..9277275 100644 --- a/basicsuite/shared/shared.pri +++ b/basicsuite/shared/shared.pri @@ -1,12 +1,12 @@ # widget dependecy is required by QtCharts demo -QT += quick widgets +QT += quick widgets quickcontrols2 qtHaveModule(webengine) { DEFINES += USE_QTWEBENGINE QT += webengine } -DESTPATH = /data/user/$$TARGET +DESTPATH = /data/user/qt/$$TARGET target.path = $$DESTPATH SOURCES += $$PWD/main.cpp \ @@ -16,7 +16,9 @@ HEADERS += $$PWD/engine.h defineTest(b2qtdemo_deploy_defaults) { commonFiles.files = \ - ../shared/SharedMain.qml + ../shared/SharedMain.qml \ + preview_l.jpg \ + demo.xml commonFiles.path = $$DESTPATH OTHER_FILES += $${commonFiles.files} INSTALLS += commonFiles @@ -25,3 +27,22 @@ defineTest(b2qtdemo_deploy_defaults) { export(OTHER_FILES) export(INSTALLS) } + +DISTFILES += $$PWD/fonts/TitilliumWeb-Black.ttf \ + $$PWD/fonts/TitilliumWeb-Bold.ttf \ + $$PWD/fonts/TitilliumWeb-ExtraLight.ttf \ + $$PWD/fonts/TitilliumWeb-Light.ttf \ + $$PWD/fonts/TitilliumWeb-Regular.ttf \ + $$PWD/fonts/TitilliumWeb-SemiBold.ttf \ + $$PWD/fonts/ebike-fonts/fontawesome-webfont.ttf \ + $$PWD/fonts/ebike-fonts/Montserrat-Bold.ttf \ + $$PWD/fonts/ebike-fonts/Montserrat-Light.ttf \ + $$PWD/fonts/ebike-fonts/Montserrat-Medium.ttf \ + $$PWD/fonts/ebike-fonts/Montserrat-Regular.ttf \ + $$PWD/fonts/ebike-fonts/Teko-Bold.ttf \ + $$PWD/fonts/ebike-fonts/Teko-Light.ttf \ + $$PWD/fonts/ebike-fonts/Teko-Medium.ttf \ + $$PWD/fonts/ebike-fonts/Teko-Regular.ttf + +RESOURCES += \ + $$PWD/fonts.qrc diff --git a/basicsuite/textinput/demo.xml b/basicsuite/textinput/demo.xml new file mode 100644 index 0000000..fadfc67 --- /dev/null +++ b/basicsuite/textinput/demo.xml @@ -0,0 +1,9 @@ + + + + +This example illustrates how to handle input on touch devices. + +Qt for Device Creation comes with Qt Virtual Keyboard - a framework that consists of a C++ backend with support for custom input methods, as well as a reference keyboard front end implemented in QML, supporting multiple languages. + + diff --git a/doc/b2qt-demos.qdoc b/doc/b2qt-demos.qdoc index b147df2..856089a 100644 --- a/doc/b2qt-demos.qdoc +++ b/doc/b2qt-demos.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of Qt for Device Creation. @@ -50,7 +50,7 @@ /*! \page index.html - \title Qt 5.7 for Device Creation Examples and Demos + \title Qt 5.13.2 for Device Creation Examples and Demos \SDK has a number of examples and demos. These are included in the \B2Q images, available in the launcher that is run by default at @@ -63,32 +63,20 @@ */ /*! - \example basicsuite/about-b2qt - \title About Qt for Device Creation + \example basicsuite/ebike-ui + \title e-bike Demo \ingroup b2qt-demos - \brief Displays information about Qt for Device Creation. + \brief An E-bike instrument cluster concept. - \image b2qt-demo-about-b2qt.jpg + \image b2qt-demo-ebike-ui.jpg - A demo that provides an introduction to what Qt for Device Creation is all about. -*/ - -/*! - \example basicsuite/camera - \title Camera - \ingroup b2qt-demos - \brief Demonstrates using camera in a QML application. - - \image b2qt-demo-camera.jpg + An E-bike instrument cluster concept designed and implemented by Qt. - This example demonstrates the use of the camera features provided by Qt Multimedia with - Qt Quick. - - Demo can be used to take pictures. Files are saved inside the \c {/data/images/} folder - and can be then viewed with the \l {Photo Gallery} demo application. + The entire concept is a testament that Qt brings the HMI designers and Software engineers together + by using the same tools, allowing them to fast prototyping through collaborative workflow. + In addition to that, Qt is optimized for running on low end SoC even the ones that don't have GPU acceleration + for graphics. - Camera parameters such as flash mode, scene mode or white balance can be changed. The - availability of parameters depends on what the camera driver provides. */ /*! @@ -119,40 +107,6 @@ It can play from a file or from a network source, both videos and music. */ -/*! - \example basicsuite/canvas3d-planets - \title Qt Canvas3D Planets - \ingroup b2qt-demos - \brief Demonstrates the usage of Qt Canvas 3D, a WebGL-like API for QML, and popular JavaScript frameworks like three.js. - - \image b2qt-demo-canvas3d-planets.jpg - - The demo uses Qt Quick and Canvas 3D in combination with \l{http://threejs.org/}{three.js}, - \l{https://github.com/jeromeetienne/threex.planets}{threex.planets}, and Qt Quick - Controls. Tapping on a planet changes the view and moves to the chosen planet. Use the sliders - to adjust the zoom levels and viewing distance. Tapping outside the controls moves the focus - back to the solar view. -*/ - -/*! - \example basicsuite/qt5-cinematicdemo - \title Qt 5 Cinematic Demo - \ingroup b2qt-demos - \brief A cool demonstration of the graphical prowess of Qt 5 and Qt Quick 2. - - \image b2qt-demo-qt5-cinematicdemo.jpg - - The Qt5 Cinematic Experience is a demo by "QUIt Coding", a small group of talented individuals - enjoying software development with cutting edge technologies. They are official members of the - Qt Ambassador Program. - - The demo shows off a number features of Qt Quick 2.0. A nicely styled list control of movie - covers with lighting effects, particles and transitions. The information roll-down curvy - curtain is implemented using inline GLSL in the QML file. - - More awesome looking Qt Quick examples are available from \l {http://quitcoding.com}. -*/ - /*! \example basicsuite/textinput \title Text Input @@ -181,49 +135,16 @@ */ /*! - \example basicsuite/enterprise-dashboard - \title Dashboard - \ingroup b2qt-demos - \brief A car dashboard created using Qt Quick Enterprise Controls. - - \image b2qt-demo-enterprise-dashboard.jpg - - This example project demonstrates using several CircularGauge controls to create a car dashboard. -*/ - -/*! - \example basicsuite/enterprise-qtdatavis3d - \title Qt Data Visualization - \ingroup b2qt-demos - \brief An interactive showcase for Qt Data Visualization 3D. - - \image b2qt-demo-enterprise-qtdatavis3d.jpg - - This example demonstrates how to use the Qt Data Visualization module to display 3D data visualizations in QML. -*/ - -/*! - \example basicsuite/enterprise-gallery - \title Enterprise Controls Gallery - \ingroup b2qt-demos - \brief An interactive showcase for Qt Quick Enterprise Controls. - - \image b2qt-demo-enterprise-gallery.jpg - - This example project demonstrates the various UI controls provided by Qt Quick Enterprise Controls. -*/ - -/*! - \example basicsuite/enterprise-flat-controls - \title Enterprise Flat Controls + \example basicsuite/qtquickcontrols2 + \title Qt Quick Controls 2 - Gallery \ingroup b2qt-demos - \brief The Flat Style Gallery example showcases the Qt Quick Controls. + \brief A gallery of controls. - \image b2qt-demo-enterprise-flat-controls.jpg + \image b2qt-demo-qtquickcontrols2.jpg - This demo combines both the standard Quick Controls as well as the Qt Quick Enterprise Controls - both of which are using the new Flat style. The Flat style for Qt Quick Controls has a modern - look and feel and is perfect for the touch driven interfaces commonly developed by device creators. + The gallery example is a simple application with a drawer menu that contains all the Qt Quick Controls 2. Each + menu item opens a page that shows the graphical appearance of a control, allows you to interact with the control, + and explains in which circumstances it is handy to use this control. */ /*! diff --git a/doc/b2qt-demos.qdocconf b/doc/b2qt-demos.qdocconf index d3cca4f..a7dc3c7 100644 --- a/doc/b2qt-demos.qdocconf +++ b/doc/b2qt-demos.qdocconf @@ -5,8 +5,8 @@ outputencoding = UTF-8 sourceencoding = UTF-8 project = QtforDeviceCreationDemos -description = Qt 5.7 for Device Creation Examples and Demos -version = 5.7.0 +description = Qt 5.13.2 for Device Creation Examples and Demos +version = 5.13.2 sourcedirs = . imagedirs += images @@ -21,9 +21,9 @@ exampledirs = .. qhp.projects = QtforDeviceCreationDemos qhp.QtforDeviceCreationDemos.file = b2qt-demos.qhp -qhp.QtforDeviceCreationDemos.namespace = com.digia.b2qt-demos.570 +qhp.QtforDeviceCreationDemos.namespace = org.qt-project.b2qt-demos.5132 qhp.QtforDeviceCreationDemos.virtualFolder = b2qt-demos -qhp.QtforDeviceCreationDemos.indexTitle = Qt 5.7 for Device Creation Examples and Demos +qhp.QtforDeviceCreationDemos.indexTitle = Qt 5.13.2 for Device Creation Examples and Demos qhp.QtforDeviceCreationDemos.indexRoot = qhp.QtforDeviceCreationDemos.subprojects = demos @@ -35,4 +35,4 @@ manifestmeta.b2qt.names = "QtforDeviceCreationDemos/*" macro.B2Q = "Boot to Qt" macro.SDK = "Qt for Device Creation" -navigation.landingpage = "Qt 5.7 for Device Creation Examples and Demos" +navigation.landingpage = "Qt 5.13.2 for Device Creation Examples and Demos" diff --git a/doc/images/b2qt-demo-advancedcustommaterial.jpg b/doc/images/b2qt-demo-advancedcustommaterial.jpg new file mode 100644 index 0000000..cbd6500 Binary files /dev/null and b/doc/images/b2qt-demo-advancedcustommaterial.jpg differ diff --git a/doc/images/b2qt-demo-ebike-ui.jpg b/doc/images/b2qt-demo-ebike-ui.jpg new file mode 100644 index 0000000..570e609 Binary files /dev/null and b/doc/images/b2qt-demo-ebike-ui.jpg differ diff --git a/doc/images/b2qt-demo-enterprise-charts.jpg b/doc/images/b2qt-demo-enterprise-charts.jpg deleted file mode 120000 index e2f9e6c..0000000 --- a/doc/images/b2qt-demo-enterprise-charts.jpg +++ /dev/null @@ -1 +0,0 @@ -../../basicsuite/enterprise-charts/preview_l.jpg \ No newline at end of file diff --git a/doc/images/b2qt-demo-enterprise-charts.jpg b/doc/images/b2qt-demo-enterprise-charts.jpg new file mode 100644 index 0000000..b472087 Binary files /dev/null and b/doc/images/b2qt-demo-enterprise-charts.jpg differ diff --git a/doc/images/b2qt-demo-graphicaleffects.jpg b/doc/images/b2qt-demo-graphicaleffects.jpg deleted file mode 120000 index 5a092e2..0000000 --- a/doc/images/b2qt-demo-graphicaleffects.jpg +++ /dev/null @@ -1 +0,0 @@ -../../basicsuite/graphicaleffects/preview_l.jpg \ No newline at end of file diff --git a/doc/images/b2qt-demo-graphicaleffects.jpg b/doc/images/b2qt-demo-graphicaleffects.jpg new file mode 100644 index 0000000..da1255b Binary files /dev/null and b/doc/images/b2qt-demo-graphicaleffects.jpg differ diff --git a/doc/images/b2qt-demo-mediaplayer.jpg b/doc/images/b2qt-demo-mediaplayer.jpg deleted file mode 120000 index cce5a00..0000000 --- a/doc/images/b2qt-demo-mediaplayer.jpg +++ /dev/null @@ -1 +0,0 @@ -../../basicsuite/mediaplayer/preview_l.jpg \ No newline at end of file diff --git a/doc/images/b2qt-demo-mediaplayer.jpg b/doc/images/b2qt-demo-mediaplayer.jpg new file mode 100644 index 0000000..d61efbc Binary files /dev/null and b/doc/images/b2qt-demo-mediaplayer.jpg differ diff --git a/doc/images/b2qt-demo-qtquickcontrols2.jpg b/doc/images/b2qt-demo-qtquickcontrols2.jpg new file mode 100644 index 0000000..89a4fcb Binary files /dev/null and b/doc/images/b2qt-demo-qtquickcontrols2.jpg differ diff --git a/doc/images/b2qt-demo-qtwebbrowser.jpg b/doc/images/b2qt-demo-qtwebbrowser.jpg deleted file mode 120000 index 13dea2f..0000000 --- a/doc/images/b2qt-demo-qtwebbrowser.jpg +++ /dev/null @@ -1 +0,0 @@ -../../basicsuite/qtwebbrowser/preview_l.jpg \ No newline at end of file diff --git a/doc/images/b2qt-demo-qtwebbrowser.jpg b/doc/images/b2qt-demo-qtwebbrowser.jpg new file mode 100644 index 0000000..c63de25 Binary files /dev/null and b/doc/images/b2qt-demo-qtwebbrowser.jpg differ diff --git a/tradeshow/iot-sensortag/README b/tradeshow/iot-sensortag/README new file mode 100644 index 0000000..8c83e7e --- /dev/null +++ b/tradeshow/iot-sensortag/README @@ -0,0 +1,11 @@ +This is a work-in-progress project targeted for Embedded World conference 2017. With the application you can read sensor information and publish it to the Microsoft Azure cloud service for clients to read it. There is three form factors supported for the client device, and the correct form factor is automatically determined by the screen dimensions. + +Data is published to the cloud when the application is run either in sensor or mock mode. + +Usage: SensorTagDemo --source[=cloud] + +--source cloud sensor data is read from cloud + sensor sensor data is read from a Bluetooth sensor + mock sensor data is read from a mock data provider + +You can also set the environment variable QT_IOS_DEMO_NO_FULLSCREEN to force the application not to go to fullscreen mode. In this case the application is drawn in a window with dimensions specific to the selected screen form factor. Note: this setting is mainly intended for development purposes. diff --git a/tradeshow/iot-sensortag/SensorTagDemo.pro b/tradeshow/iot-sensortag/SensorTagDemo.pro new file mode 100644 index 0000000..7393afc --- /dev/null +++ b/tradeshow/iot-sensortag/SensorTagDemo.pro @@ -0,0 +1,151 @@ +TEMPLATE = app + +QT += \ + bluetooth \ + core \ + charts \ + gui \ + network \ + qml \ + quick \ + widgets + +CONFIG += c++11 +DEFINES += QT_NO_FOREACH + +# Specify UI layout to use: UI_SMALL or UI_WATCH +DEFINES += UI_SMALL + +# To overcome the bug QTBUG-58648, uncomment this define +# Needed at least for RPi3 and iMX +#CONFIG += DEPLOY_TO_FS + +win32|linux|android:!qnx { + CONFIG += BLUETOOTH_HOST +} else { + message(Unsupported target platform) +} + +# For using MQTT upload enable this config. +# This enables both, host and client mode +CONFIG += UPDATE_TO_MQTT_BROKER + +# For using Azure cloud connectivity enable +# this config. This enabled both, host and +# client mode +# CONFIG += UPDATE_TO_AZURE + +win32:!contains(CONFIG, UPDATE_TO_MQTT_BROKER) { + WASTORAGE_PATH = $$(WASTORAGE_LOCATION) + isEmpty(WASTORAGE_PATH): message("Location for Azure Storage libs unknown. Please specify WASTORAGE_LOCATION") + CPPRESTSDK_PATH = $$(CPPRESTSDK_LOCATION) + isEmpty(CPPRESTSDK_PATH): message("Location for CppRest library unknown. Please specify CPPREST_LOCATION") + + INCLUDEPATH += $$WASTORAGE_PATH/build/native/include \ + $$WASTORAGE_PATH/build/native/include/was \ + $$WASTORAGE_PATH/build/native/include/wascore \ + $$CPPRESTSDK_PATH/build/native/include + LIBS += -L$$WASTORAGE_PATH/lib/native/v140/Win32/Release +} + +SOURCES += main.cpp \ + mockdataprovider.cpp \ + sensortagdataprovider.cpp \ + clouddataprovider.cpp \ + dataproviderpool.cpp \ + clouddataproviderpool.cpp \ + seriesstorage.cpp \ + mockdataproviderpool.cpp + +HEADERS += \ + sensortagdataprovider.h \ + mockdataprovider.h \ + clouddataprovider.h \ + cloudservice.h \ + dataproviderpool.h \ + clouddataproviderpool.h \ + bluetoothapiconstants.h \ + seriesstorage.h \ + mockdataproviderpool.h + +BLUETOOTH_HOST { + DEFINES += RUNS_AS_HOST + + SOURCES += \ + sensortagdataproviderpool.cpp \ + bluetoothdataprovider.cpp \ + demodataproviderpool.cpp \ + serviceinfo.cpp \ + bluetoothdevice.cpp + + HEADERS += \ + sensortagdataproviderpool.h \ + bluetoothdataprovider.h \ + demodataproviderpool.h \ + serviceinfo.h \ + bluetoothdevice.h +} + +UPDATE_TO_MQTT_BROKER { + CONFIG -= UPDATE_TO_AZURE + + !qtHaveModule(mqtt): error("Could not find MQTT module for Qt version") + QT += mqtt + DEFINES += MQTT_UPLOAD + + SOURCES += mqttupdate.cpp \ + mqttdataproviderpool.cpp \ + mqttdataprovider.cpp + HEADERS += mqttupdate.h \ + mqttdataproviderpool.h \ + mqttdataprovider.h +} + +UPDATE_TO_AZURE { + SOURCES += cloudupdate.cpp + HEADERS += cloudupdate.h + DEFINES += AZURE_UPLOAD + # For Azure libs + win32 { + LIBS += -lwastorage + } else { + LIBS += -lboost_system -lcrypto -lssl -lcpprest -lazurestorage + QMAKE_CXXFLAGS += -fpermissive + QMAKE_CXXFLAGS += -fexceptions + } + QMAKE_CXXFLAGS_EXCEPTIONS_OFF = +} + +RESOURCES += base.qrc + +android: ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources + +contains(DEFINES, UI_SMALL) { + !DEPLOY_TO_FS: RESOURCES += uismall.qrc + uiVariant.files = resources/small +} else:contains(DEFINES, UI_WATCH) { + !DEPLOY_TO_FS: RESOURCES += uiwatch.qrc + uiVariant.files = resources/watch +} else: error("No layout specified") + +uiVariant.path = /opt/$${TARGET}/resources + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET} +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + android-sources/AndroidManifest.xml + +DEPLOY_TO_FS { + message("Files will be deployed to the file system") + DEFINES += DEPLOY_TO_FS + + baseFiles.files = resources/base + baseFiles.path = /opt/$${TARGET}/resources + INSTALLS += baseFiles uiVariant +} diff --git a/tradeshow/iot-sensortag/android-sources/AndroidManifest.xml b/tradeshow/iot-sensortag/android-sources/AndroidManifest.xml new file mode 100644 index 0000000..a40a59c --- /dev/null +++ b/tradeshow/iot-sensortag/android-sources/AndroidManifest.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tradeshow/iot-sensortag/base.qrc b/tradeshow/iot-sensortag/base.qrc new file mode 100644 index 0000000..db038ef --- /dev/null +++ b/tradeshow/iot-sensortag/base.qrc @@ -0,0 +1,26 @@ + + + resources/base/BaseChart.qml + resources/base/ChartPage.qml + resources/base/HumidityChart.qml + resources/base/LightChart.qml + resources/base/LocationPage.qml + resources/base/MagnetometerChart.qml + resources/base/main.qml + resources/base/ObjectTemperatureChart.qml + resources/base/TemperatureChart.qml + resources/base/TopToolbar.qml + resources/base/CircularGauge.qml + resources/base/GyroChart.qml + resources/base/AccelChart.qml + resources/base/SensorSettings.qml + resources/base/CloudSettings.qml + resources/base/fonts/titilliumweb/TitilliumWeb-Bold.ttf + resources/base/fonts/titilliumweb/TitilliumWeb-Regular.ttf + resources/base/fonts/titilliumweb/TitilliumWeb-SemiBold.ttf + resources/base/images/bg_blue.jpg + resources/base/RotationPage.qml + resources/base/AltitudeChart.qml + resources/base/BlinkingIcon.qml + + diff --git a/tradeshow/iot-sensortag/bluetoothapiconstants.h b/tradeshow/iot-sensortag/bluetoothapiconstants.h new file mode 100644 index 0000000..8e0672a --- /dev/null +++ b/tradeshow/iot-sensortag/bluetoothapiconstants.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHAPICONSTANTS_H +#define BLUETOOTHAPICONSTANTS_H + +// NOTE! This file should only contain defines, no implementation + +// These service UUIDs come from the Texas Intruments SensorTag Bluetooth LE API specification +#define IRTEMPERATURESENSOR_SERVICE_UUID "f000aa00-0451-4000-b000-000000000000" +#define BAROMETER_SERVICE_UUID "f000aa40-0451-4000-b000-000000000000" +#define HUMIDITYSENSOR_SERVICE_UUID "f000aa20-0451-4000-b000-000000000000" +#define LIGHTSENSOR_SERVICE_UUID "f000aa70-0451-4000-b000-000000000000" +#define MOTIONSENSOR_SERVICE_UUID "f000aa80-0451-4000-b000-000000000000" + +/* Timeouts (values between 100ms and 2500ms allowed by API specification. + * API values are passed in hex as strings and multiplied by 10 in SensorTag. + * These values can be modifed as needed by performance. + * Keep defines and strings in sync! + */ +#define SENSORTAG_SLOW_TIMER_TIMEOUT_MS 1000 /* 1 second */ +#define SENSORTAG_SLOW_TIMER_TIMEOUT_STR "64" /* 64hex -> 100 -> 1000ms */ +#define SENSORTAG_MEDIUM_TIMER_TIMEOUT_MS 500 /* 500ms */ +#define SENSORTAG_MEDIUM_TIMER_TIMEOUT_STR "32" /* 32hex -> 50 -> 500ms */ +#define SENSORTAG_RAPID_TIMER_TIMEOUT_MS 100 /* 100ms */ +#define SENSORTAG_RAPID_TIMER_TIMEOUT_STR "0A" /* A(hex) -> 10 -> 100ms */ + +// These modifiers come from the Texas Intruments SensorTag Bluetooth LE API specification +#define GYROSCOPE_API_READING_MULTIPLIER (500.0 / 65536.0) +#define ACCELOMETER_API_READING_MULTIPLIER (8.0 / 32768.0) +#define HUMIDITY_API_READING_MULTIPLIER (100.0 / 65536.0) +#define IR_TEMPERATURE_API_READING_DIVIDER 128.0 +#define BAROMETER_API_READING_DIVIDER 100 + +// These are parameters from the Texas Intruments SensorTag Bluetooth LE API specification +#define START_MEASUREMENT_STR "01" /* 01 start, 00 stop */ +#define DISABLE_NOTIF_STR "0000" /* 0100 enable, 0000 disable */ +#define ENABLE_NOTIF_STR "0100" /* 0100 enable, 0000 disable */ +#define MOVEMENT_ENABLE_SENSORS_BITMASK_VALUE "7F02" /* see below */ +//Enable motion axis: 0b0000_0010_0111_1111 = 0x7F 0x02 (all sensors, 8G, no wake on motion) +//bits of first byte: +//MPU9250_GYROSCOPE = 0b0000_0111 all 3 xyz axes, 1 bit per axis +//MPU9250_ACCELEROMETER = 0b0011_1000 all 3 xyz axes, 1 bit per axis +//MPU9250_MAGNETOMETER = 0b0100_0000 all 3 xyz axes with one bit +//MPU9250_WAKEONMOTION = 0b1000_0000 enables wake on motion +//bits of second byte (only 2 bits used) Accelerometer range in G +//MPU9250_ACCELEROMETER_RANGE_0 =0b0000_0000 = 2 G +//MPU9250_ACCELEROMETER_RANGE_1 =0b0000_0001 = 4 G +//MPU9250_ACCELEROMETER_RANGE_2 =0b0000_0010 = 8 G (default) +//MPU9250_ACCELEROMETER_RANGE_3 =0b0000_0011 = 16 G + +#endif // BLUETOOTHAPICONSTANTS_H diff --git a/tradeshow/iot-sensortag/bluetoothdataprovider.cpp b/tradeshow/iot-sensortag/bluetoothdataprovider.cpp new file mode 100644 index 0000000..3c81d92 --- /dev/null +++ b/tradeshow/iot-sensortag/bluetoothdataprovider.cpp @@ -0,0 +1,298 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "bluetoothdataprovider.h" +#include +#include "bluetoothapiconstants.h" + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +#define SAMPLE_COUNT_FOR_ZERO_ALTITUDE 10 + +BluetoothDataProvider::BluetoothDataProvider(const QBluetoothDeviceInfo &id, QObject *parent) + : SensorTagDataProvider(id.address().toString(), parent) + , m_info(id) + , m_btDevice(nullptr) + , m_smaSamples(0) + , m_zeroAltitudeSamples(0) + , gyroscopeX_calibration(0) + , gyroscopeY_calibration(0) + , gyroscopeZ_calibration(0) +{ + m_state = NotFound; + intervalRotation = SENSORTAG_RAPID_TIMER_TIMEOUT_MS; +} + +BluetoothDataProvider::~BluetoothDataProvider() +{ + if (m_btDevice) + delete m_btDevice; +} + +bool BluetoothDataProvider::startDataFetching() +{ + qCDebug(boot2QtDemos) << Q_FUNC_INFO << " :" << m_btDevice; + + m_btDevice = new BluetoothDevice(m_info); + + connect(m_btDevice, &BluetoothDevice::statusUpdated, this, [=](const QString& statusMsg) { + qCDebug(boot2QtDemos) << id() << "----------" << statusMsg; + }); + connect(m_btDevice, &BluetoothDevice::stateChanged, + this, &BluetoothDataProvider::updateState); + connect(m_btDevice, &BluetoothDevice::temperatureChanged, + this, &BluetoothDataProvider::temperatureReceived); + connect(m_btDevice, &BluetoothDevice::barometerChanged, + this, &BluetoothDataProvider::barometerReceived); + connect(m_btDevice, &BluetoothDevice::humidityChanged, + this, &BluetoothDataProvider::humidityReceived); + connect(m_btDevice, &BluetoothDevice::lightIntensityChanged, + this, &BluetoothDataProvider::lightIntensityReceived); + connect(m_btDevice, &BluetoothDevice::motionChanged, + this, &BluetoothDataProvider::motionReceived); + startServiceScan(); + + return true; +} + +void BluetoothDataProvider::endDataFetching() +{ + // BluetoothDevice is not capable of restarting + qCDebug(boot2QtDemos) << Q_FUNC_INFO << " :" << m_btDevice; + m_btDevice->disconnectFromDevice(); + setState(Scanning); + + m_btDevice->deleteLater(); + m_btDevice = nullptr; +} + +void BluetoothDataProvider::startServiceScan() +{ + qCDebug(boot2QtDemos) << Q_FUNC_INFO << m_btDevice; + if (m_btDevice) { + setState(Scanning); + m_btDevice->scanServices(); + } +} + +void BluetoothDataProvider::temperatureReceived(double newAmbientTemperature, + double newObjectTemperature) +{ + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + irAmbientTemperature = newAmbientTemperature; + emit infraredAmbientTemperatureChanged(); + irObjectTemperature = newObjectTemperature; + emit infraredObjectTemperatureChanged(); +} + +void BluetoothDataProvider::barometerReceived(double temperature, double barometer) +{ + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + barometerCelsiusTemperature = temperature; + emit barometerCelsiusTemperatureChanged(); + barometerTemperatureAverage = (temperature + m_smaSamples * barometerTemperatureAverage) + / (m_smaSamples + 1); + m_smaSamples++; + emit barometerCelsiusTemperatureAverageChanged(); + // Use a limited number of samples. It will eventually give wrong avg values, + // but this is just a demo... + if (m_smaSamples > 10000) + m_smaSamples = 0; + barometerHPa = barometer; + emit barometer_hPaChanged(); + + recalibrateZeroAltitude(); + calculateZeroAltitude(); +} + +void BluetoothDataProvider::humidityReceived(double humidity) +{ + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + this->humidity = humidity; + emit relativeHumidityChanged(); +} +void BluetoothDataProvider::lightIntensityReceived(double lightIntensity) +{ + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + lightIntensityLux = lightIntensity; + emit lightIntensityChanged(); +} + +float BluetoothDataProvider::countRotationDegrees(double degreesPerSecond, quint64 milliseconds) +{ + const quint32 mseconds = milliseconds; + const float seconds = ((float)mseconds)/float(1000); + return ((float)degreesPerSecond) * seconds; +} + +void BluetoothDataProvider::motionReceived(const MotionSensorData &data) +{ + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + latestData = data; + gyroscopeX_degPerSec = data.gyroScope_x - gyroscopeX_calibration; + gyroscopeY_degPerSec = data.gyroScope_y - gyroscopeY_calibration; + gyroscopeZ_degPerSec = data.gyroScope_z - gyroscopeZ_calibration; + emit gyroscopeDegPerSecChanged(); + + rotation_x += countRotationDegrees(gyroscopeX_degPerSec, data.msSincePreviousData); + rotation_y += countRotationDegrees(gyroscopeY_degPerSec, data.msSincePreviousData); + rotation_z += countRotationDegrees(gyroscopeZ_degPerSec, data.msSincePreviousData); + + if (rotation_x > 360) + rotation_x -= 360; + else if (rotation_x < 0) + rotation_x += 360; + if (rotation_y > 360) + rotation_y -= 360; + else if (rotation_y < 0) + rotation_y += 360; + if (rotation_z > 360) + rotation_z -= 360; + else if (rotation_z < 0) + rotation_z += 360; + emit rotationXChanged(); + emit rotationYChanged(); + emit rotationZChanged(); + accelometerX = data.accelometer_x; + accelometerY = data.accelometer_y; + accelometerZ = data.accelometer_z; + emit accelometerChanged(); + magnetometerMicroT_xAxis = data.magnetometer_x; + magnetometerMicroT_yAxis = data.magnetometer_y; + magnetometerMicroT_zAxis = data.magnetometer_z; + emit magnetometerMicroTChanged(); + // Signal that all values have changed, for easier + // value change handling in clients + emit rotationValuesChanged(); +} + +QString BluetoothDataProvider::sensorType() const +{ + return QString("Bluetooth data"); +} + +QString BluetoothDataProvider::versionString() const +{ + return QString("1.1"); +} + +void BluetoothDataProvider::updateState() +{ + if (!m_btDevice) + return; + + switch (m_btDevice->state()) { + case BluetoothDevice::Disconnected: + break; + case BluetoothDevice::Scanning: + setState(Scanning); + break; + case BluetoothDevice::Connected: + setState(Connected); + break; + case BluetoothDevice::Error: + setState(Error); + break; + default: + break; + } +} + +void BluetoothDataProvider::reset() +{ + qCDebug(boot2QtDemos) << "Reset bluetooth data provider"; + + rotation_x = 0; + rotation_y = 0; + rotation_z = 0; + gyroscopeX_calibration = latestData.gyroScope_x; + gyroscopeY_calibration = latestData.gyroScope_y; + gyroscopeZ_calibration = latestData.gyroScope_z; + emit rotationXChanged(); + emit rotationYChanged(); + emit rotationZChanged(); + + // Forces recalculation of zero altitude + m_zeroAltitudeSamples = 0; + pressureAtZeroAltitude = 0; +} + +void BluetoothDataProvider::recalibrateZeroAltitude() +{ + if (m_zeroAltitudeSamples < SAMPLE_COUNT_FOR_ZERO_ALTITUDE) { + pressureAtZeroAltitude = (barometerHPa + + m_zeroAltitudeSamples * pressureAtZeroAltitude) + / (m_zeroAltitudeSamples + 1); + m_zeroAltitudeSamples++; + } +} + +void BluetoothDataProvider::unbindDevice() +{ + if (m_btDevice) { + delete m_btDevice; + m_btDevice = 0; + setState(NotFound); + } +} + +BluetoothDevice *BluetoothDataProvider::device() +{ + return m_btDevice; +} diff --git a/tradeshow/iot-sensortag/bluetoothdataprovider.h b/tradeshow/iot-sensortag/bluetoothdataprovider.h new file mode 100644 index 0000000..5c28725 --- /dev/null +++ b/tradeshow/iot-sensortag/bluetoothdataprovider.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDATAPROVIDER_H +#define BLUETOOTHDATAPROVIDER_H + +#include "sensortagdataprovider.h" +#include "sensortagdataproviderpool.h" +#include +#include +#include +#include + +class BluetoothDataProvider : public SensorTagDataProvider +{ + Q_OBJECT +public: + BluetoothDataProvider(const QBluetoothDeviceInfo &id, QObject *parent = 0); + + virtual ~BluetoothDataProvider(); + + bool startDataFetching() override; + void endDataFetching() override; + QString sensorType() const; + QString versionString() const; + + void unbindDevice(); + BluetoothDevice *device(); + +public slots: + void startServiceScan(); + + void temperatureReceived(double newAmbientTemperature, double newObjectTemperature); + void barometerReceived(double temperature, double barometer); + void humidityReceived(double humidity); + void lightIntensityReceived(double lightIntensity); + void motionReceived(const MotionSensorData &data); + +protected: + void reset() override; + virtual void recalibrateZeroAltitude(); + +private: + void updateState(); + float countRotationDegrees(double degreesPerSecond, quint64 milliseconds); + QBluetoothDeviceInfo m_info; + BluetoothDevice *m_btDevice; + int m_smaSamples; + int m_zeroAltitudeSamples; + float gyroscopeX_calibration; + float gyroscopeY_calibration; + float gyroscopeZ_calibration; + MotionSensorData latestData; +}; + +#endif // BLUETOOTHDATAPROVIDER_H diff --git a/tradeshow/iot-sensortag/bluetoothdevice.cpp b/tradeshow/iot-sensortag/bluetoothdevice.cpp new file mode 100644 index 0000000..2ede116 --- /dev/null +++ b/tradeshow/iot-sensortag/bluetoothdevice.cpp @@ -0,0 +1,639 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "bluetoothdevice.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "bluetoothapiconstants.h" + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +typedef struct { + qint16 gyrox; + qint16 gyroy; + qint16 gyroz; + qint16 accelx; + qint16 accely; + qint16 accelz; + qint16 magnetomx; + qint16 magnetomy; + qint16 magnetomz; +} movement_data_t; + +BluetoothDevice::BluetoothDevice() + : m_controller(0) + , m_irTemperatureService(0) + , m_baroService(0) + , m_humidityService(0) + , m_lightService(0) + , m_motionService(0) + , m_deviceState(DeviceState::Disconnected) + , m_temperatureMeasurementStarted(false) + , m_barometerMeasurementStarted(false) + , m_humidityMeasurementStarted(false) + , m_lightIntensityMeasurementStarted(false) + , m_motionMeasurementStarted(false) +{ + m_lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); + statusUpdated("Device created"); + + m_serviceDetailsTimer = new QTimer(this); + m_serviceDetailsTimer->setInterval(5000); + m_serviceDetailsTimer->setSingleShot(true); + connect(m_serviceDetailsTimer, &QTimer::timeout, [=]() { + qCDebug(boot2QtDemos) << "Service details timer timeout. No more services details found"; + if (isDeviceReady()) + setState(Connected); + else + setState(Disconnected); + }); +} + +BluetoothDevice::BluetoothDevice(const QBluetoothDeviceInfo &d) + : BluetoothDevice() +{ + m_deviceInfo = d; +} + +BluetoothDevice::~BluetoothDevice() +{ + if (m_controller) { + m_controller->disconnect(); + delete m_controller; + } +} + +QString BluetoothDevice::getAddress() const +{ +#if defined(Q_OS_DARWIN) + // On Apple platforms we do not have addresses, + // only unique UUIDs generated by Core Bluetooth. + return m_deviceInfo.deviceUuid().toString(); +#else + return m_deviceInfo.address().toString(); +#endif +} + +QString BluetoothDevice::getName() const +{ + return m_deviceInfo.name(); +} + +void BluetoothDevice::scanServices() +{ + setState(Scanning); + if (!m_controller) { + statusUpdated("(Connecting to device...)"); + // Connecting signals and slots for connecting to LE services. + m_controller = new QLowEnergyController(m_deviceInfo); + connect(m_controller, &QLowEnergyController::connected, + this, &BluetoothDevice::deviceConnected); + connect(m_controller, QOverload::of(&QLowEnergyController::error), + this, &BluetoothDevice::errorReceived); + connect(m_controller, &QLowEnergyController::disconnected, + this, &BluetoothDevice::deviceDisconnected); + connect(m_controller, &QLowEnergyController::serviceDiscovered, + this, &BluetoothDevice::addLowEnergyService); + connect(m_controller, &QLowEnergyController::discoveryFinished, + this, &BluetoothDevice::serviceScanDone); + + m_controller->setRemoteAddressType(QLowEnergyController::PublicAddress); + } + m_controller->connectToDevice(); +} + +void BluetoothDevice::addLowEnergyService(const QBluetoothUuid &serviceUuid) +{ + if (serviceUuid == QBluetoothUuid(QLatin1String(IRTEMPERATURESENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found infrared temperature service."; + m_irTemperatureService = m_controller->createServiceObject(serviceUuid); + if (!m_irTemperatureService) { + qWarning() << "Could not create infrared temperature service object."; + return; + } + connect(m_irTemperatureService, &QLowEnergyService::stateChanged, + this, &BluetoothDevice::temperatureDetailsDiscovered); + connect(m_irTemperatureService, &QLowEnergyService::characteristicChanged, + this, &BluetoothDevice::updateTemperature); + m_irTemperatureService->discoverDetails(); + } else if (serviceUuid == QBluetoothUuid(QLatin1String(BAROMETER_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found barometer service."; + m_baroService = m_controller->createServiceObject(serviceUuid); + if (!m_baroService) { + qWarning() << "Could not create barometer service object."; + return; + } + connect(m_baroService, &QLowEnergyService::stateChanged, + this, &BluetoothDevice::barometerDetailsDiscovered); + connect(m_baroService, &QLowEnergyService::characteristicChanged, + this, &BluetoothDevice::updatePressure); + m_baroService->discoverDetails(); + } else if (serviceUuid == QBluetoothUuid(QLatin1String(HUMIDITYSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found humidity service."; + m_humidityService = m_controller->createServiceObject(serviceUuid); + if (!m_humidityService) { + qWarning() << "Could not create humidity service object."; + return; + } + connect(m_humidityService, &QLowEnergyService::stateChanged, + this, &BluetoothDevice::humidityDetailsDiscovered); + connect(m_humidityService, &QLowEnergyService::characteristicChanged, + this, &BluetoothDevice::updateHumidity); + m_humidityService->discoverDetails(); + } else if (serviceUuid == QBluetoothUuid(QLatin1String(LIGHTSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found light service."; + m_lightService = m_controller->createServiceObject(serviceUuid); + if (!m_lightService) { + qWarning() << "Could not create light service object."; + return; + } + connect(m_lightService, &QLowEnergyService::stateChanged, + this, &BluetoothDevice::lightIntensityDetailsDiscovered); + connect(m_lightService, &QLowEnergyService::characteristicChanged, + this, &BluetoothDevice::updateLight); + m_lightService->discoverDetails(); + } else if (serviceUuid == QBluetoothUuid(QLatin1String(MOTIONSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found motion service."; + m_motionService = m_controller->createServiceObject(serviceUuid); + if (!m_motionService) { + qWarning() << "Could not create motion service object."; + return; + } + connect(m_motionService, &QLowEnergyService::stateChanged, + this, &BluetoothDevice::motionDetailsDiscovered); + connect(m_motionService, &QLowEnergyService::characteristicChanged, + this, &BluetoothDevice::updateMotionValue); + m_motionService->discoverDetails(); + } else { + qCDebug(boot2QtDemos) << "Found unhandled service with id" << serviceUuid << "."; + } +} + +void BluetoothDevice::serviceScanDone() +{ + statusUpdated("(Service scan done!)"); + qCDebug(boot2QtDemos) << "ServiceScan done."; + if (!m_irTemperatureService) + qCDebug(boot2QtDemos) << "Infrared temperature service not found."; + + if (!m_baroService) + qCDebug(boot2QtDemos) << "Barometer service not found."; + + if (!m_humidityService) + qCDebug(boot2QtDemos) << "Humidity service not found."; + + if (!m_lightService) + qCDebug(boot2QtDemos) << "Light service not found."; + + if (!m_motionService) + qCDebug(boot2QtDemos) << "Motion service not found."; + + m_serviceDetailsTimer->start(); +} + +void BluetoothDevice::temperatureDetailsDiscovered(QLowEnergyService::ServiceState newstate) +{ + if (newstate == QLowEnergyService::ServiceDiscovered) { + connect(m_irTemperatureService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - temperature"; + }); + + connect(m_irTemperatureService, QOverload::of(&QLowEnergyService::error), + [=](QLowEnergyService::ServiceError newError) { + qCDebug(boot2QtDemos) << "error while writing - temperature:" << newError; + }); + + // data characteristic + QLowEnergyCharacteristic characteristic = m_irTemperatureService->characteristic( + QBluetoothUuid(QLatin1String("f000aa01-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + const QLowEnergyDescriptor notificationDescriptor = characteristic.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (notificationDescriptor.isValid()) + m_irTemperatureService->writeDescriptor(notificationDescriptor, QByteArray::fromHex(ENABLE_NOTIF_STR)); + } + + // configuration characteristic + characteristic = m_irTemperatureService->characteristic( + QBluetoothUuid(QLatin1String("f000aa02-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) + m_irTemperatureService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); + + // timeout characteristic + characteristic = m_irTemperatureService->characteristic( + QBluetoothUuid(QLatin1String("f000aa03-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + m_irTemperatureService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_SLOW_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 1 second + } + + m_temperatureMeasurementStarted = true; + updateServiceDetails(); + } +} + +void BluetoothDevice::barometerDetailsDiscovered(QLowEnergyService::ServiceState newstate) { + if (newstate == QLowEnergyService::ServiceDiscovered) { + connect(m_baroService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - barometer"; + }); + + connect(m_baroService, QOverload::of(&QLowEnergyService::error), + [=](QLowEnergyService::ServiceError newError) { + qCDebug(boot2QtDemos) << "error while writing - barometer:" << newError; + }); + + // data characteristic + QLowEnergyCharacteristic characteristic = m_baroService->characteristic( + QBluetoothUuid(QLatin1String("f000aa41-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + const QLowEnergyDescriptor notificationDescriptor = characteristic.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (notificationDescriptor.isValid()) + m_baroService->writeDescriptor(notificationDescriptor, QByteArray::fromHex(ENABLE_NOTIF_STR)); + } + + // configuration characteristic + characteristic = m_baroService->characteristic( + QBluetoothUuid(QLatin1String("f000aa42-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) + m_baroService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); + + // timeout characteristic + characteristic = m_baroService->characteristic( + QBluetoothUuid(QLatin1String("f000aa44-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + m_baroService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_MEDIUM_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 500 ms + } + + m_barometerMeasurementStarted = true; + updateServiceDetails(); + } +} + +void BluetoothDevice::humidityDetailsDiscovered(QLowEnergyService::ServiceState newstate) +{ + if (newstate == QLowEnergyService::ServiceDiscovered) { + connect(m_humidityService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - humidity"; + }); + + connect(m_humidityService, QOverload::of(&QLowEnergyService::error), + [=](QLowEnergyService::ServiceError newError) { + qCDebug(boot2QtDemos) << "error while writing - humidity:" << newError; + }); + + // data characteristic + QLowEnergyCharacteristic characteristic = m_humidityService->characteristic( + QBluetoothUuid(QLatin1String("f000aa21-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + const QLowEnergyDescriptor notificationDescriptor = characteristic.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (notificationDescriptor.isValid()) + m_humidityService->writeDescriptor(notificationDescriptor, QByteArray::fromHex(ENABLE_NOTIF_STR)); + } + + // configuration characteristic + characteristic = m_humidityService->characteristic( + QBluetoothUuid(QLatin1String("f000aa22-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) + m_humidityService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); + + // timeout characteristic + characteristic = m_humidityService->characteristic( + QBluetoothUuid(QLatin1String("f000aa23-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + m_humidityService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_SLOW_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 500 ms + } + + m_humidityMeasurementStarted = true; + updateServiceDetails(); + } +} + +void BluetoothDevice::lightIntensityDetailsDiscovered(QLowEnergyService::ServiceState newstate) +{ + if (newstate == QLowEnergyService::ServiceDiscovered) { + connect(m_lightService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - light intensity"; + }); + + connect(m_lightService, QOverload::of(&QLowEnergyService::error), + [=](QLowEnergyService::ServiceError newError) { + qCDebug(boot2QtDemos) << "error while writing - light intensity:" << newError; + }); + + // data characteristic + QLowEnergyCharacteristic characteristic = m_lightService->characteristic( + QBluetoothUuid(QLatin1String("f000aa71-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + const QLowEnergyDescriptor notificationDescriptor = characteristic.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (notificationDescriptor.isValid()) + m_lightService->writeDescriptor(notificationDescriptor, QByteArray::fromHex(ENABLE_NOTIF_STR)); + } + + // configuration characteristic + characteristic = m_lightService->characteristic( + QBluetoothUuid(QLatin1String("f000aa72-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) + m_lightService->writeCharacteristic(characteristic, QByteArray::fromHex(START_MEASUREMENT_STR), QLowEnergyService::WriteWithResponse); + + // timeout characteristic + characteristic = m_lightService->characteristic( + QBluetoothUuid(QLatin1String("f000aa73-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + m_lightService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_MEDIUM_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); // Period 500 ms + } + + m_lightIntensityMeasurementStarted = true; + updateServiceDetails(); + } +} + +void BluetoothDevice::motionDetailsDiscovered(QLowEnergyService::ServiceState newstate) +{ + // reset the time once more before we start to receive measurements. + m_lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); + + if (newstate == QLowEnergyService::ServiceDiscovered) { + connect(m_motionService, &QLowEnergyService::characteristicWritten, [=]() { + qCDebug(boot2QtDemos) << "Wrote Characteristic - gyro"; + }); + + connect(m_motionService, QOverload::of(&QLowEnergyService::error), + [=](QLowEnergyService::ServiceError newError) { + qCDebug(boot2QtDemos) << "error while writing - gyro:" << newError; + }); + + // data characteristic + QLowEnergyCharacteristic characteristic = m_motionService->characteristic( + QBluetoothUuid(QLatin1String("f000aa81-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + const QLowEnergyDescriptor notificationDescriptor = characteristic.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (notificationDescriptor.isValid()) + m_motionService->writeDescriptor(notificationDescriptor, QByteArray::fromHex(ENABLE_NOTIF_STR)); + } + + // configuration characteristic + characteristic = m_motionService->characteristic( + QBluetoothUuid(QLatin1String("f000aa82-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) + m_motionService->writeCharacteristic(characteristic, QByteArray::fromHex(MOVEMENT_ENABLE_SENSORS_BITMASK_VALUE), QLowEnergyService::WriteWithResponse); + + // timeout characteristic + characteristic = m_motionService->characteristic( + QBluetoothUuid(QLatin1String("f000aa83-0451-4000-b000-000000000000"))); + if (characteristic.isValid()) { + m_motionService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_RAPID_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse); + } + m_motionMeasurementStarted = true; + updateServiceDetails(); + } +} + +void BluetoothDevice::updateTemperature(const QLowEnergyCharacteristic &, const QByteArray &value) +{ + irTemperatureReceived(value); +} + +void BluetoothDevice::updatePressure(const QLowEnergyCharacteristic &, const QByteArray &value) +{ + barometerReceived(value); +} + +void BluetoothDevice::updateHumidity(const QLowEnergyCharacteristic &, const QByteArray &value) +{ + humidityReceived(value); +} + +void BluetoothDevice::updateLight(const QLowEnergyCharacteristic &, const QByteArray &value) +{ + lightIntensityReceived(value); +} + +void BluetoothDevice::updateMotionValue(const QLowEnergyCharacteristic &, const QByteArray &value) +{ + motionReceived(value); +} + +void BluetoothDevice::setState(BluetoothDevice::DeviceState state) +{ + if (m_deviceState != state) { + m_deviceState = state; + emit stateChanged(); + } +} + +double BluetoothDevice::convertIrTemperatureAPIReadingToCelsius(quint16 rawReading) +{ + // Compute and filter final value according to TI Bluetooth LE API + const float SCALE_LSB = 0.03125; + int it = (int)((rawReading) >> 2); + float t = (float)it; + return t * SCALE_LSB; +} + +bool BluetoothDevice::isDeviceReady() const +{ + if (m_temperatureMeasurementStarted + || m_barometerMeasurementStarted + || m_humidityMeasurementStarted + || m_lightIntensityMeasurementStarted + || m_motionMeasurementStarted) { + return true; + } + return false; +} + +void BluetoothDevice::updateServiceDetails() +{ + if (m_temperatureMeasurementStarted + && m_barometerMeasurementStarted + && m_humidityMeasurementStarted + && m_lightIntensityMeasurementStarted + && m_motionMeasurementStarted) { + qCDebug(boot2QtDemos) << "Service details timer stop. All service details found"; + m_serviceDetailsTimer->stop(); + setState(Connected); + } else { + m_serviceDetailsTimer->start(); + } +} + +void BluetoothDevice::irTemperatureReceived(const QByteArray &value) +{ + const unsigned int rawObjectTemperature = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); + const double objectTemperature = convertIrTemperatureAPIReadingToCelsius(rawObjectTemperature); + const unsigned int rawAmbientTemperature = (((quint8)value.at(1)) << 8) + ((quint8)value.at(0)); + const double ambientTemperature = convertIrTemperatureAPIReadingToCelsius(rawAmbientTemperature); + emit temperatureChanged(ambientTemperature, objectTemperature); +} + +void BluetoothDevice::barometerReceived(const QByteArray &value) +{ + //Merge bytes + unsigned int temperature_raw; + unsigned int barometer_raw; + if (value.length() == 6) { + temperature_raw = (((quint8)value.at(2)) << 16) + (((quint8)value.at(1)) << 8) + ((quint8)value.at(0)); + barometer_raw = (((quint8)value.at(5)) << 16) + (((quint8)value.at(4)) << 8) + ((quint8)value.at(3)); + } else { + temperature_raw = (((quint8)value.at(1)) << 8) + ((quint8)value.at(0)); + barometer_raw = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); + } + + double temperature = static_cast(temperature_raw); + temperature /= BAROMETER_API_READING_DIVIDER; + + double barometer = static_cast(barometer_raw); + barometer /= BAROMETER_API_READING_DIVIDER; + emit barometerChanged(temperature, barometer); +} + +void BluetoothDevice::humidityReceived(const QByteArray &value) +{ + //Merge bytes + unsigned int humidity_raw = (((quint8)value.at(3)) << 8) + ((quint8)value.at(2)); + double humidity = static_cast(humidity_raw); + humidity = humidity * HUMIDITY_API_READING_MULTIPLIER; + emit humidityChanged(humidity); +} + +void BluetoothDevice::lightIntensityReceived(const QByteArray &value) +{ + //Merge bytes + uint16_t lightIntensity_raw; + lightIntensity_raw = (((quint8)value.at(1)) << 8) + ((quint8)value.at(0)); + uint16_t e, m; + m = lightIntensity_raw & 0x0FFF; + e = (lightIntensity_raw & 0xF000) >> 12; + + // Compute and final value according to TI Bluetooth LE API + double lightIntensity = ((double)m) * (0.01 * (double)qPow(2.0,(qreal)e)); + emit lightIntensityChanged(lightIntensity); +} + +void BluetoothDevice::motionReceived(const QByteArray &value) +{ + static MotionSensorData data; + data.msSincePreviousData = m_lastMilliseconds; + m_lastMilliseconds = QDateTime::currentMSecsSinceEpoch(); + data.msSincePreviousData = m_lastMilliseconds - data.msSincePreviousData; + movement_data_t values; + quint8* writePtr = (quint8*)(&values); + + for (int i = 0; i < 18; ++i) { + *writePtr = (quint8)value.at(i); + writePtr++; + } + + // Data is in little endian. Fix here if needed. + + //Convert gyroscope and accelometer readings to proper units + data.gyroScope_x = double(values.gyrox) * GYROSCOPE_API_READING_MULTIPLIER; + data.gyroScope_y = double(values.gyroy) * GYROSCOPE_API_READING_MULTIPLIER; + data.gyroScope_z = double(values.gyroz) * GYROSCOPE_API_READING_MULTIPLIER; + // Accelometer at 8G + data.accelometer_x = double(values.accelx) * ACCELOMETER_API_READING_MULTIPLIER; + data.accelometer_y = double(values.accely) * ACCELOMETER_API_READING_MULTIPLIER; + data.accelometer_z = double(values.accelz) * ACCELOMETER_API_READING_MULTIPLIER; + data.magnetometer_x = double(values.magnetomx); + data.magnetometer_y = double(values.magnetomy); + data.magnetometer_z = double(values.magnetomz); + emit motionChanged(data); +} + +void BluetoothDevice::deviceConnected() +{ + if (isDeviceReady()) { + setState(Connected); + } else { + setState(DeviceState::Scanning); + statusUpdated("(Discovering services...)"); + m_controller->discoverServices(); + } +} + +void BluetoothDevice::errorReceived(QLowEnergyController::Error /*error*/) +{ + setState(DeviceState::Error); + statusUpdated(QString("Error: %1)").arg(m_controller->errorString())); +} + +void BluetoothDevice::disconnectFromDevice() +{ + // UI always expects disconnect() signal when calling this signal + // TODO what is really needed is to extend state() to a multi value + // and thus allowing UI to keep track of controller progress in addition to + // device scan progress + + if (m_controller->state() != QLowEnergyController::UnconnectedState) + m_controller->disconnectFromDevice(); + else + deviceDisconnected(); +} + +void BluetoothDevice::deviceDisconnected() +{ + statusUpdated("Disconnect from device"); + setState(BluetoothDevice::Disconnected); +} + +BluetoothDevice::DeviceState BluetoothDevice::state() const +{ + return m_deviceState; +} diff --git a/tradeshow/iot-sensortag/bluetoothdevice.h b/tradeshow/iot-sensortag/bluetoothdevice.h new file mode 100644 index 0000000..5f114ea --- /dev/null +++ b/tradeshow/iot-sensortag/bluetoothdevice.h @@ -0,0 +1,183 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDEVICE_H +#define BLUETOOTHDEVICE_H + +#include "serviceinfo.h" + +#include +#include +#include +#include +#include +#include +#include + +class MotionSensorData +{ +public: + double gyroScope_x{}; + double gyroScope_y{}; + double gyroScope_z{}; + double accelometer_x{}; + double accelometer_y{}; + double accelometer_z{}; + double magnetometer_x{}; + double magnetometer_y{}; + double magnetometer_z{}; + quint64 msSincePreviousData{}; +}; + +typedef enum CharacteristicType { + temperatureCharacteristic = 0, + humidityCharacteristic, + barometerCharacteristic, + motionCharacteristic, + lightCharacteristic +} CharacteristicType; + +class SensorTagDataProvider; + +class BluetoothDevice: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString deviceName READ getName CONSTANT) + Q_PROPERTY(QString deviceAddress READ getAddress CONSTANT) + Q_PROPERTY(DeviceState state READ state NOTIFY stateChanged) + +public: + enum DeviceState { + Disconnected = 0, + Scanning, + Connected, + Error + }; + Q_ENUM(DeviceState) + + BluetoothDevice(); + BluetoothDevice(const QBluetoothDeviceInfo &d); + ~BluetoothDevice(); + + QString getAddress() const; + QString getName() const; + + DeviceState state() const; + +signals: + void updateChanged(); + void stateChanged(); + void temperatureChanged(double ambientTemperature, double objectTemperature); + void barometerChanged(double temperature, double barometer); + void humidityChanged(double humidity); + void lightIntensityChanged(double intensity); + void motionChanged(MotionSensorData data); + void statusUpdated(QString statusMsg); + +public slots: + void scanServices(); + void disconnectFromDevice(); + void temperatureDetailsDiscovered(QLowEnergyService::ServiceState newstate); + void barometerDetailsDiscovered(QLowEnergyService::ServiceState newstate); + void humidityDetailsDiscovered(QLowEnergyService::ServiceState newstate); + void lightIntensityDetailsDiscovered(QLowEnergyService::ServiceState newstate); + void motionDetailsDiscovered(QLowEnergyService::ServiceState newstate); + +private slots: + // QLowEnergyController realted + void addLowEnergyService(const QBluetoothUuid &uuid); + void deviceConnected(); + void errorReceived(QLowEnergyController::Error); + void serviceScanDone(); + void deviceDisconnected(); + + // QLowEnergyService related + void updateTemperature(const QLowEnergyCharacteristic &info, + const QByteArray &value); + void updatePressure(const QLowEnergyCharacteristic &info, + const QByteArray &value); + void updateHumidity(const QLowEnergyCharacteristic &info, + const QByteArray &value); + void updateLight(const QLowEnergyCharacteristic &info, + const QByteArray &value); + void updateMotionValue(const QLowEnergyCharacteristic &info, + const QByteArray &value); + +private: + void setState(DeviceState state); + +private: + void irTemperatureReceived(const QByteArray &value); + void barometerReceived(const QByteArray &value); + void humidityReceived(const QByteArray &value); + void lightIntensityReceived(const QByteArray &value); + void motionReceived(const QByteArray &value); + double convertIrTemperatureAPIReadingToCelsius(quint16 rawReading); + bool isDeviceReady() const; + void updateServiceDetails(); + + QLowEnergyController *m_controller; + QLowEnergyService *m_irTemperatureService; + QLowEnergyService *m_baroService; + QLowEnergyService *m_humidityService; + QLowEnergyService *m_lightService; + QLowEnergyService *m_motionService; + DeviceState m_deviceState; + bool m_temperatureMeasurementStarted; + bool m_barometerMeasurementStarted; + bool m_humidityMeasurementStarted; + bool m_lightIntensityMeasurementStarted; + bool m_motionMeasurementStarted; + quint64 m_lastMilliseconds; + QBluetoothDeviceInfo m_deviceInfo; + SensorTagDataProvider *m_dataProvider; + QTimer *m_serviceDetailsTimer; +}; + +#endif // BLUETOOTHBLUETOOTHDEVICE_H diff --git a/tradeshow/iot-sensortag/clouddataprovider.cpp b/tradeshow/iot-sensortag/clouddataprovider.cpp new file mode 100644 index 0000000..aa5a26c --- /dev/null +++ b/tradeshow/iot-sensortag/clouddataprovider.cpp @@ -0,0 +1,262 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "clouddataprovider.h" + +#include +#include +#include + +#define MAJOR_VERSION_NUMBER 1 +#define MINOR_VERSION_NUMBER 1 +#define CLOUD_DATA_POLL_INTERVAL_MS 1000 /* 1 second update interval */ +#ifndef QT_NO_SSL +static QString dataFetchUrl = "https://ottoryynanenqt.blob.core.windows.net/btsensortagreadings/sensorTagReadings.txt"; +#else +static QString dataFetchUrl = "http://ottoryynanenqt.blob.core.windows.net/btsensortagreadings/sensorTagReadings.txt"; +#endif + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +CloudDataProvider::CloudDataProvider(QString id, QObject *parent) + : SensorTagDataProvider(id, parent) + , reply(nullptr) +{ + intervalRotation = CLOUD_DATA_POLL_INTERVAL_MS; + connect(&qnam, &QNetworkAccessManager::authenticationRequired, + this, &CloudDataProvider::slotAuthenticationRequired); +#ifndef QT_NO_SSL + connect(&qnam, &QNetworkAccessManager::sslErrors, + this, &CloudDataProvider::sslErrors); +#endif +} + +bool CloudDataProvider::startDataFetching() +{ + setState(Connected); + pollTimer = new QTimer(this); + connect(pollTimer, &QTimer::timeout, this, &CloudDataProvider::pollTimerExpired); + pollTimer->start(CLOUD_DATA_POLL_INTERVAL_MS); + return true; +} + +void CloudDataProvider::endDataFetching() +{ + httpRequestAborted = true; + reply->abort(); +} + +void CloudDataProvider::parseReceivedText() +{ + QList dataList = dataFetched.split('\n'); + if (dataList[2] != "Version:") { + qWarning() << Q_FUNC_INFO << "Invalid file header:" << dataList[2]; + return; + } + + QList versionNumberList = dataList[3].split('.'); + const int dataMajorVersion = QString(versionNumberList[0]).toInt(); + const int dataMinorVersion = QString(versionNumberList[1]).toInt(); + if ((MAJOR_VERSION_NUMBER < dataMajorVersion) || // Major version not supported OR + ((MAJOR_VERSION_NUMBER == dataMajorVersion) && // Major version OK but + (MINOR_VERSION_NUMBER < dataMinorVersion))) { // Minor version not supported + qWarning() << Q_FUNC_INFO << "Version" << dataList[3] << "not supported by version" + << QString::number(MAJOR_VERSION_NUMBER)+"."+QString::number(MINOR_VERSION_NUMBER); + return; + } + // Header OK, parse data. + bool gyroscopeReadingGot = false; + bool accelometerReadingGot = false; + bool magnetometerReadingGot = false; + bool rotationReadingsGot = false; + for (int stringIndex = 4; stringIndex < (dataList.length() - 1); stringIndex += 2) { + const QString headerText(dataList[stringIndex]); + const double doubleValue = QString(dataList[stringIndex + 1]).toDouble(); + const float floatValue = QString(dataList[stringIndex + 1]).toFloat(); + /* NOTE: We emit the signals even if value is unchanged. + * Otherwise the scrolling graphs in UI will not scroll. + */ + if ("Humid:" == headerText) { + humidity = doubleValue; + emit relativeHumidityChanged(); + } else if ("Temp(Ambient):" == headerText) { + irAmbientTemperature = doubleValue; + emit infraredAmbientTemperatureChanged(); + } else if ("Temp(Object):" == headerText) { + irObjectTemperature = doubleValue; + emit infraredObjectTemperatureChanged(); + } else if ("Light:" == headerText) { + lightIntensityLux = doubleValue; + emit lightIntensityChanged(); + } else if ("Temp(Baro):" == headerText) { + barometerCelsiusTemperature = doubleValue; + emit barometerCelsiusTemperatureChanged(); + } else if ("hPa:" == headerText) { + barometerHPa = doubleValue; + emit barometer_hPaChanged(); + } else if ("gyroX:" == headerText) { + gyroscopeReadingGot = true; + gyroscopeX_degPerSec = floatValue; + } else if ("gyroY:" == headerText) { + gyroscopeReadingGot = true; + gyroscopeY_degPerSec = floatValue; + } else if ("gyroZ:" == headerText) { + gyroscopeReadingGot = true; + gyroscopeZ_degPerSec = floatValue; + } else if ("AccX:" == headerText) { + accelometerReadingGot = true; + accelometerX = floatValue; + } else if ("AccY:" == headerText) { + accelometerReadingGot = true; + accelometerY = floatValue; + } else if ("AccZ:" == headerText) { + accelometerReadingGot = true; + accelometerZ = floatValue; + } else if ("MagnX:" == headerText) { + magnetometerReadingGot = true; + magnetometerMicroT_xAxis = floatValue; + } else if ("MagnY:" == headerText) { + magnetometerReadingGot = true; + magnetometerMicroT_yAxis = floatValue; + } else if ("MagnZ:" == headerText) { + magnetometerReadingGot = true; + magnetometerMicroT_zAxis = floatValue; + } else if ("RotX:" == headerText) { + rotation_x = floatValue; + rotationReadingsGot = true; + emit rotationXChanged(); + } else if ("RotY:" == headerText) { + rotation_y = floatValue; + rotationReadingsGot = true; + emit rotationYChanged(); + } else if ("RotZ:" == headerText) { + rotation_z = floatValue; + rotationReadingsGot = true; + emit rotationZChanged(); + } else { + qCDebug(boot2QtDemos) << "Unsupported Header:" << headerText; + } + } + if (gyroscopeReadingGot) + emit gyroscopeDegPerSecChanged(); + if (accelometerReadingGot) + emit accelometerChanged(); + if (magnetometerReadingGot) + emit magnetometerMicroTChanged(); + if (rotationReadingsGot) + emit rotationValuesChanged(); +} + +void CloudDataProvider::pollTimerExpired() +{ + if (!reply) { + httpRequestAborted = false; + dataFetched.clear(); + reply = qnam.get(QNetworkRequest(QUrl(dataFetchUrl))); + connect(reply, &QNetworkReply::finished, this, &CloudDataProvider::httpFinished); + connect(reply, &QIODevice::readyRead, this, &CloudDataProvider::httpReadyRead); + } else { + qWarning() << "Attempt to fetch before previous http request was completed."; + } +} + +void CloudDataProvider::httpFinished() +{ + if (httpRequestAborted) { + qCDebug(boot2QtDemos) << "http request aborted."; + return; + } + if (reply->error()) { + qWarning() << "Failed to fetch data," << reply->errorString(); + return; + } + + parseReceivedText(); + reply->deleteLater(); + reply = nullptr; +} + +void CloudDataProvider::httpReadyRead() +{ + // this slot gets called every time the QNetworkReply has new data. + // We read all of its new data and write it into the file. + // That way we use less RAM than when reading it at the finished() + // signal of the QNetworkReply + dataFetched += reply->readAll(); +} + +#ifndef QT_NO_SSL +void CloudDataProvider::sslErrors(QNetworkReply *, const QList &errors) +{ + QString errorString; + for (const QSslError &error : errors) { + if (!errorString.isEmpty()) + errorString += '\n'; + errorString += error.errorString(); + } + + qWarning() << "Ignoring SSL Error(s):" << errorString; + reply->ignoreSslErrors(); +} +#endif + +void CloudDataProvider::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator) +{ + Q_UNUSED(authenticator); +} + +QString CloudDataProvider::sensorType() const +{ + return QString("cloud data"); +} + +QString CloudDataProvider::versionString() const +{ + return QString::number(MAJOR_VERSION_NUMBER) + "." + QString::number(MINOR_VERSION_NUMBER); +} diff --git a/tradeshow/iot-sensortag/clouddataprovider.h b/tradeshow/iot-sensortag/clouddataprovider.h new file mode 100644 index 0000000..ccfbeed --- /dev/null +++ b/tradeshow/iot-sensortag/clouddataprovider.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CLOUDDATAPROVIDER_H +#define CLOUDDATAPROVIDER_H + +#include "sensortagdataprovider.h" +#include +#include +#include +#include + +class QTimer; + +class CloudDataProvider : public SensorTagDataProvider +{ + Q_OBJECT +public: + explicit CloudDataProvider(QString id, QObject *parent = 0); + + bool startDataFetching(); + void endDataFetching(); + QString sensorType() const; + QString versionString() const; +public slots: + void pollTimerExpired(); + +private slots: + void httpFinished(); + void httpReadyRead(); + void slotAuthenticationRequired(QNetworkReply *, QAuthenticator *); +#ifndef QT_NO_SSL + void sslErrors(QNetworkReply *, const QList &errors); +#endif +protected: + void reset() {} +private: + void parseReceivedText(); + + QTimer *pollTimer; + QNetworkAccessManager qnam; + QNetworkReply *reply; + bool httpRequestAborted; + QByteArray dataFetched; +}; +#endif // CLOUDDATAPROVIDER_H diff --git a/tradeshow/iot-sensortag/clouddataproviderpool.cpp b/tradeshow/iot-sensortag/clouddataproviderpool.cpp new file mode 100644 index 0000000..5b69803 --- /dev/null +++ b/tradeshow/iot-sensortag/clouddataproviderpool.cpp @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "clouddataproviderpool.h" +#include "clouddataprovider.h" + +CloudDataProviderPool::CloudDataProviderPool(QObject *parent) + : DataProviderPool(parent) +{ + m_poolName = "Cloud"; +} + +void CloudDataProviderPool::startScanning() +{ + qDeleteAll(m_dataProviders); + m_dataProviders.clear(); + m_dataProviders.push_back(new CloudDataProvider("CLOUD_PROVIDER", this)); + + emit providerConnected("MS_AZURE_CLOUD"); + emit providersUpdated(); + emit dataProvidersChanged(); + emit scanFinished(); +} diff --git a/tradeshow/iot-sensortag/clouddataproviderpool.h b/tradeshow/iot-sensortag/clouddataproviderpool.h new file mode 100644 index 0000000..3a13a19 --- /dev/null +++ b/tradeshow/iot-sensortag/clouddataproviderpool.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CLOUDDATAPROVIDERPOOL_H +#define CLOUDDATAPROVIDERPOOL_H + +#include "dataproviderpool.h" + +class CloudDataProvider; + +class CloudDataProviderPool : public DataProviderPool +{ +public: + explicit CloudDataProviderPool(QObject *parent = 0); + + void startScanning() override; +}; + +#endif // CLOUDDATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/cloudservice.h b/tradeshow/iot-sensortag/cloudservice.h new file mode 100644 index 0000000..35a9f8e --- /dev/null +++ b/tradeshow/iot-sensortag/cloudservice.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CLOUDSERVICE_H +#define CLOUDSERVICE_H + +#define AZURE_ACCOUNT_NAME "ottoryynanenqt" +#define AZURE_ACCOUNT_KEY "XCZNDmLR7uLrBaO5p7sPGems8AMwNEmEM9AuDQE2cpMYgu3VikoJC0yGwh1KztU0vCCwDv17bIpDO8IpzPDBtw==" +#define CLOUD_BLOB_NAME "btsensortagreadings" +#define CLOUD_FILE_NAME "sensorTagReadings.txt" + +#endif // CLOUDSERVICE_H diff --git a/tradeshow/iot-sensortag/cloudupdate.cpp b/tradeshow/iot-sensortag/cloudupdate.cpp new file mode 100644 index 0000000..b43c097 --- /dev/null +++ b/tradeshow/iot-sensortag/cloudupdate.cpp @@ -0,0 +1,185 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "cloudupdate.h" +#include "cloudservice.h" +#include "dataproviderpool.h" +#include "sensortagdataprovider.h" +#include "demodataproviderpool.h" + +#include "was/storage_account.h" +#include "was/blob.h" + +#define ROUNDING_DECIMALS 2 +#define UPDATE_INTERVAL 1000 + +CloudUpdate::CloudUpdate(QObject *parent) + : QObject(parent) + , m_providerPool(0) + , m_provider(0) + , m_timerId(0) + , m_updateInterval(UPDATE_INTERVAL) +{ +} + +void CloudUpdate::setDataProviderPool(DataProviderPool *provider) +{ + m_providerPool = provider; + connect(m_providerPool, &DataProviderPool::currentProviderChanged, this, [=]() { + m_provider = m_providerPool->currentProvider(); + if (!m_provider) + stop(); + }); +} + +int CloudUpdate::updateInterval() const +{ + return m_updateInterval; +} + +void CloudUpdate::setUpdateInterval(int interval) +{ + m_updateInterval = interval; +} + +void CloudUpdate::restart() +{ + killTimer(m_timerId); + m_timerId = startTimer(m_updateInterval); +} + +void CloudUpdate::stop() +{ + killTimer(m_timerId); +} + +void CloudUpdate::timerEvent(QTimerEvent *event) +{ + Q_UNUSED(event); + + if (!m_provider) + return; + + writeToCloud(); +} + +void CloudUpdate::writeToCloud() +{ + if (!m_provider) { + qWarning("CloudUpdate: sensor data provider not set. Data not updated"); + return; + } + + // Define the connection-string with your values. + QByteArray accStr = QByteArrayLiteral("DefaultEndpointsProtocol=https;AccountName="); + accStr += AZURE_ACCOUNT_NAME; + accStr += QByteArrayLiteral(";AccountKey="); + accStr += AZURE_ACCOUNT_KEY; +#ifndef Q_OS_WIN + const utility::string_t storage_connection_string(U(accStr.data())); +#else + const utility::string_t storage_connection_string(reinterpret_cast(QString(accStr).utf16())); +#endif + azure::storage::cloud_blob_container container; + + try { + azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string); + + // Create the blob client. + azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client(); + + // Retrieve a reference to a container. + container = blob_client.get_container_reference(U(CLOUD_BLOB_NAME)); + + // Create the container if it doesn't already exist. + container.create_if_not_exists(); + } + catch (const std::exception& e) + { + std::wcout << U("Error: ") << e.what() << std::endl; + } + + // Retrieve reference to a blob + azure::storage::cloud_block_blob blob = container.get_block_blob_reference(U(CLOUD_FILE_NAME)); + + QString sensorData = buildString(); +#ifndef Q_OS_WIN + blob.upload_text(U(sensorData.toLocal8Bit().data())); +#else + blob.upload_text(reinterpret_cast(sensorData.utf16())); +#endif +} + +QString CloudUpdate::buildString() const +{ + QString exportString; + exportString += QString("Type:\n%1\n").arg(m_provider->sensorType()); + exportString += QString("Version:\n%1\n").arg(m_provider->versionString()); + exportString += QString("Humid:\n%1\n").arg(m_provider->getRelativeHumidity(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(Ambient):\n%1\n").arg(m_provider->getInfraredAmbientTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(Object):\n%1\n").arg(m_provider->getInfraredObjectTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Light:\n%1\n").arg(m_provider->getLightIntensityLux(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("Temp(Baro):\n%1\n").arg(m_provider->getBarometerCelsiusTemperature(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("hPa:\n%1\n").arg(m_provider->getBarometer_hPa(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("gyroX:\n%1\n").arg(m_provider->getGyroscopeX_degPerSec(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("gyroY:\n%1\n").arg(m_provider->getGyroscopeY_degPerSec(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("gyroZ:\n%1\n").arg(m_provider->getGyroscopeZ_degPerSec(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("AccX:\n%1\n").arg(m_provider->getAccelometer_xAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("AccY:\n%1\n").arg(m_provider->getAccelometer_yAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("AccZ:\n%1\n").arg(m_provider->getAccelometer_zAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("MagnX:\n%1\n").arg(m_provider->getMagnetometerMicroT_xAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("MagnY:\n%1\n").arg(m_provider->getMagnetometerMicroT_yAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("MagnZ:\n%1\n").arg(m_provider->getMagnetometerMicroT_zAxis(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("RotX:\n%1\n").arg(m_provider->getRotationX(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("RotY:\n%1\n").arg(m_provider->getRotationY(), 0, 'f', ROUNDING_DECIMALS); + exportString += QString("RotZ:\n%1").arg(m_provider->getRotationZ(), 0, 'f', ROUNDING_DECIMALS); + + return exportString; +} diff --git a/tradeshow/iot-sensortag/cloudupdate.h b/tradeshow/iot-sensortag/cloudupdate.h new file mode 100644 index 0000000..f6026ce --- /dev/null +++ b/tradeshow/iot-sensortag/cloudupdate.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CLOUDUPDATE_H +#define CLOUDUPDATE_H + +#include + +class DataProviderPool; +class SensorTagDataProvider; + +class CloudUpdate : public QObject +{ +public: + explicit CloudUpdate(QObject *parent = 0); + + void setDataProviderPool(DataProviderPool *provider); + + int updateInterval() const; + void setUpdateInterval(int interval); + void restart(); + void stop(); + +protected: + void timerEvent(QTimerEvent *event); + + virtual void writeToCloud(); + +private: + QString buildString() const; + +protected: + DataProviderPool *m_providerPool; + +private: + SensorTagDataProvider *m_provider; + int m_timerId; + int m_updateInterval; +}; + +#endif // CLOUDUPDATE_H diff --git a/tradeshow/iot-sensortag/dataproviderpool.cpp b/tradeshow/iot-sensortag/dataproviderpool.cpp new file mode 100644 index 0000000..66d9480 --- /dev/null +++ b/tradeshow/iot-sensortag/dataproviderpool.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "dataproviderpool.h" + +DataProviderPool::DataProviderPool(QObject *parent) + : QObject(parent) + , m_currentProvider(nullptr) + , m_currentProviderIndex(-1) +{ +} + +DataProviderPool::DataProviderPool(QString poolName, QObject *parent) + : QObject(parent) + , m_poolName(poolName) + , m_currentProvider(nullptr) + , m_currentProviderIndex(-1) +{ + +} + +void DataProviderPool::startScanning() +{ +} + +void DataProviderPool::stopScanning() +{ + emit scanFinished(); +} + +void DataProviderPool::disconnectProvider(const QString &id) +{ + Q_UNUSED(id) +} + +QQmlListProperty DataProviderPool::dataProviders() +{ + return QQmlListProperty(this, m_dataProviders); +} + +SensorTagDataProvider *DataProviderPool::providerForCloud() const +{ + return 0; +} + +SensorTagDataProvider *DataProviderPool::currentProvider() const +{ + return m_currentProvider; +} + +int DataProviderPool::currentProviderIndex() const +{ + return m_currentProviderIndex; +} + +void DataProviderPool::setCurrentProviderIndex(int currentProviderIndex) +{ + if (m_currentProviderIndex == currentProviderIndex) + return; + + m_currentProviderIndex = currentProviderIndex; + m_currentProvider = m_dataProviders.at(m_currentProviderIndex); + emit currentProviderIndexChanged(m_currentProviderIndex); + emit currentProviderChanged(m_currentProvider); +} diff --git a/tradeshow/iot-sensortag/dataproviderpool.h b/tradeshow/iot-sensortag/dataproviderpool.h new file mode 100644 index 0000000..e060758 --- /dev/null +++ b/tradeshow/iot-sensortag/dataproviderpool.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DATAPROVIDERPOOL_H +#define DATAPROVIDERPOOL_H + +#include +#include + +#include "sensortagdataprovider.h" + +class DataProviderPool : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQmlListProperty dataProviders READ dataProviders NOTIFY dataProvidersChanged) + Q_PROPERTY(SensorTagDataProvider* currentProvider READ currentProvider NOTIFY currentProviderChanged) + Q_PROPERTY(int currentProviderIndex READ currentProviderIndex WRITE setCurrentProviderIndex NOTIFY currentProviderIndexChanged) + Q_PROPERTY(QString name MEMBER m_poolName CONSTANT) + +public: + Q_INVOKABLE virtual void startScanning(); + Q_INVOKABLE virtual void stopScanning(); + Q_INVOKABLE virtual void disconnectProvider(const QString &id); + Q_INVOKABLE virtual SensorTagDataProvider *currentProvider() const; + Q_INVOKABLE virtual int currentProviderIndex() const; + + QQmlListProperty dataProviders(); + + virtual SensorTagDataProvider *providerForCloud() const; + + +public slots: + void setCurrentProviderIndex(int currentProviderIndex); + +signals: + void providerConnected(QString id); + void providerDisconnected(QString id); + void providerInError(QString id); + void providersUpdated(); + void scanStarted(); + void scanFinished(); + void providerForCloudChanged(); + void dataProvidersChanged(); + void currentProviderChanged(SensorTagDataProvider* currentProvider); + void currentProviderIndexChanged(int currentProviderIndex); + +protected: + explicit DataProviderPool(QObject *parent = 0); + DataProviderPool(QString poolName, QObject *parent = 0); + +protected: + QList m_dataProviders; + QString m_poolName; + SensorTagDataProvider *m_currentProvider; + int m_currentProviderIndex; +}; + +#endif // DATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/demodataproviderpool.cpp b/tradeshow/iot-sensortag/demodataproviderpool.cpp new file mode 100644 index 0000000..4689a1c --- /dev/null +++ b/tradeshow/iot-sensortag/demodataproviderpool.cpp @@ -0,0 +1,309 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "demodataproviderpool.h" +#include "mockdataprovider.h" +#include "bluetoothdataprovider.h" + +#include + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +DemoCloudProvider::DemoCloudProvider(QObject *parent) + : SensorTagDataProvider(parent) +{ +} + +void DemoCloudProvider::setDataProviders(const QList &dataProviders) +{ + m_dataProviders = dataProviders; +} + +QString DemoCloudProvider::sensorType() const +{ + if (m_dataProviders.length()) + return m_dataProviders.at(0)->sensorType(); + else + return QString(); +} + +QString DemoCloudProvider::versionString() const +{ + if (m_dataProviders.length()) + return m_dataProviders.at(0)->versionString(); + else + return QString(); +} + +double DemoCloudProvider::getRelativeHumidity() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Humidity) + return p->getRelativeHumidity(); + } + return 0; +} + +double DemoCloudProvider::getInfraredAmbientTemperature() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::AmbientTemperature) + return p->getInfraredAmbientTemperature(); + } + return 0; +} + +double DemoCloudProvider::getInfraredObjectTemperature() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::ObjectTemperature) + return p->getInfraredObjectTemperature(); + } + return 0; +} + +double DemoCloudProvider::getLightIntensityLux() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Light) + return p->getLightIntensityLux(); + } + return 0; +} + +double DemoCloudProvider::getBarometerCelsiusTemperature() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::AirPressure) + return p->getBarometerCelsiusTemperature(); + } + return 0; +} + +double DemoCloudProvider::getBarometerTemperatureAverage() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::AirPressure) + return p->getBarometerTemperatureAverage(); + } + return 0; +} + +double DemoCloudProvider::getBarometer_hPa() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::AirPressure) + return p->getBarometer_hPa(); + } + return 0; +} + +float DemoCloudProvider::getGyroscopeX_degPerSec() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getGyroscopeX_degPerSec(); + } + return 0; +} + +float DemoCloudProvider::getGyroscopeY_degPerSec() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getGyroscopeY_degPerSec(); + } + return 0; +} + +float DemoCloudProvider::getGyroscopeZ_degPerSec() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getGyroscopeZ_degPerSec(); + } + return 0; +} + +float DemoCloudProvider::getAccelometer_xAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Accelometer) + return p->getAccelometer_xAxis(); + } + return 0; +} + +float DemoCloudProvider::getAccelometer_yAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Accelometer) + return p->getAccelometer_yAxis(); + } + return 0; +} + +float DemoCloudProvider::getAccelometer_zAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Accelometer) + return p->getAccelometer_zAxis(); + } + return 0; +} + +float DemoCloudProvider::getMagnetometerMicroT_xAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getMagnetometerMicroT_xAxis(); + } + return 0; +} + +float DemoCloudProvider::getMagnetometerMicroT_yAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getMagnetometerMicroT_yAxis(); + } + return 0; +} + +float DemoCloudProvider::getMagnetometerMicroT_zAxis() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Magnetometer) + return p->getMagnetometerMicroT_zAxis(); + } + return 0; +} + +float DemoCloudProvider::getRotationX() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Rotation) + return p->getRotationX(); + } + return 0; +} + +float DemoCloudProvider::getRotationY() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Rotation) + return p->getRotationY(); + } + return 0; +} + +float DemoCloudProvider::getRotationZ() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Rotation) + return p->getRotationZ(); + } + return 0; +} + +float DemoCloudProvider::getAltitude() const +{ + for (SensorTagDataProvider *p: qAsConst(m_dataProviders)) { + if (p->tagType() & SensorTagDataProvider::Altitude) + return p->getAltitude(); + } + return 0; +} + + +DemoDataProviderPool::DemoDataProviderPool(QObject *parent) + : SensorTagDataProviderPool("Demo", parent) + , m_mockData(false) + , m_cloudProvider(0) + , m_initialized(false) +{ +} + +void DemoDataProviderPool::startScanning() +{ + qDeleteAll(m_dataProviders); + m_dataProviders.clear(); + + MockDataProvider* p = new MockDataProvider("MOCK_PROVIDER_1", this); + p->setTagType(SensorTagDataProvider::ObjectTemperature | SensorTagDataProvider::AmbientTemperature | SensorTagDataProvider::Rotation); + m_dataProviders.push_back(p); + p = new MockDataProvider("MOCK_PROVIDER_2", this); + p->setTagType(SensorTagDataProvider::Humidity | SensorTagDataProvider::Light | SensorTagDataProvider::Accelometer); + m_dataProviders.push_back(p); + p = new MockDataProvider("MOCK_PROVIDER_3", this); + p->setTagType(SensorTagDataProvider::Magnetometer | SensorTagDataProvider::AirPressure); + m_dataProviders.push_back(p); + for (int i=0; i < m_dataProviders.length(); i++) + emit providerConnected(p->id()); + // Stop scanning as we already have a provider + finishScanning(); + + SensorTagDataProviderPool::startScanning(); +} + +void DemoDataProviderPool::finishScanning() +{ + emit dataProvidersChanged(); + emit scanFinished(); +} + +void DemoDataProviderPool::setMockDataMode(bool mode) +{ + m_mockData = mode; +} + +SensorTagDataProvider *DemoDataProviderPool::providerForCloud() const +{ + return m_cloudProvider; +} diff --git a/tradeshow/iot-sensortag/demodataproviderpool.h b/tradeshow/iot-sensortag/demodataproviderpool.h new file mode 100644 index 0000000..b6b6b53 --- /dev/null +++ b/tradeshow/iot-sensortag/demodataproviderpool.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DEMODATAPROVIDERPOOL_H +#define DEMODATAPROVIDERPOOL_H + +#include "sensortagdataproviderpool.h" + +class CloudUpdate; + +class DemoDataProviderPool : public SensorTagDataProviderPool +{ + Q_OBJECT +public: + explicit DemoDataProviderPool(QObject *parent = 0); + + void startScanning() override; + + SensorTagDataProvider *providerForCloud() const override; + void setMockDataMode(bool mode); + +protected: + void finishScanning() override; + +private: + bool m_mockData; + SensorTagDataProvider *m_cloudProvider; + bool m_initialized; +}; + +// Internal class to provide sensor data for cloud update from demo setup +class DemoCloudProvider : public SensorTagDataProvider +{ + Q_OBJECT +public: + explicit DemoCloudProvider(QObject *parent); + + void setDataProviders(const QList &dataProviders); + + QString sensorType() const override; + QString versionString() const override; + + double getRelativeHumidity() const override; + double getInfraredAmbientTemperature() const override; + double getInfraredObjectTemperature() const override; + double getLightIntensityLux() const override; + double getBarometerCelsiusTemperature() const override; + double getBarometerTemperatureAverage() const override; + double getBarometer_hPa() const override; + float getGyroscopeX_degPerSec() const override; + float getGyroscopeY_degPerSec() const override; + float getGyroscopeZ_degPerSec() const override; + float getAccelometer_xAxis() const override; + float getAccelometer_yAxis() const override; + float getAccelometer_zAxis() const override; + float getMagnetometerMicroT_xAxis() const override; + float getMagnetometerMicroT_yAxis() const override; + float getMagnetometerMicroT_zAxis() const override; + float getRotationX() const override; + float getRotationY() const override; + float getRotationZ() const override; + float getAltitude() const override; + + QList m_dataProviders; +}; + +#endif // DEMODATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/main.cpp b/tradeshow/iot-sensortag/main.cpp new file mode 100644 index 0000000..34cdcfc --- /dev/null +++ b/tradeshow/iot-sensortag/main.cpp @@ -0,0 +1,213 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#if defined(RUNS_AS_HOST) +#include "bluetoothdataprovider.h" +#include "sensortagdataprovider.h" +#include "sensortagdataproviderpool.h" +#include "demodataproviderpool.h" +#endif +#include "clouddataprovider.h" +#include "clouddataproviderpool.h" +#include "mockdataprovider.h" +#include "mockdataproviderpool.h" +#ifdef AZURE_UPLOAD +#include "cloudupdate.h" +#elif defined (MQTT_UPLOAD) +#include "mqttupdate.h" +#include "mqttdataprovider.h" +#include "mqttdataproviderpool.h" +#endif +#include "seriesstorage.h" + +#include +#include +#include +#include +#include +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) +Q_LOGGING_CATEGORY(boot2QtDemos, "boot2qt.demos.iot") + +QString loggingOutput; +QQuickWindow *loggingItem{nullptr}; +void handleMessageOutput(QtMsgType, const QMessageLogContext &, const QString &text) +{ + loggingOutput.prepend("\n"); + loggingOutput.prepend(text); + + loggingOutput.chop(loggingOutput.size() - 1024); + if (loggingItem) + loggingItem->setProperty("loggingOutput", loggingOutput); +} + +int main(int argc, char *argv[]) +{ + auto oldHandler = qInstallMessageHandler(handleMessageOutput); + + // QtChars mandate using QApplication as it uses the graphics view fw + QApplication app(argc, argv); + + QFontDatabase::addApplicationFont(QString::fromLatin1(":/resources/base/fonts/titilliumweb/TitilliumWeb-Regular.ttf")); + app.setFont(QFont("Titillium Web", 13)); + + DataProviderPool *remoteProviderPool = nullptr; + DataProviderPool *localProviderPool = nullptr; + SeriesStorage seriesStorage; + + QCommandLineParser parser; + parser.addOptions({{"fullscreen", "Fullscreen mode", "true | false"}}); + parser.addHelpOption(); + parser.process(app); + +#if defined(MQTT_UPLOAD) + remoteProviderPool = new MqttDataProviderPool; +#endif +#if defined(RUNS_AS_HOST) +// localProviderPool = new MockDataProviderPool; + localProviderPool = new DemoDataProviderPool; +#endif + seriesStorage.setDataProviderPool(remoteProviderPool); + + qmlRegisterType("SensorTag.DataProvider", 1, 0, "SensorTagData"); + qmlRegisterType("SensorTag.DataProvider", 1, 0, "DataProviderPool"); + qmlRegisterType("SensorTag.SeriesStorage", 1, 0, "SeriesStorage"); + +#if defined(RUNS_AS_HOST) && (defined(AZURE_UPLOAD) || defined(MQTT_UPLOAD)) +#if AZURE_UPLOAD + CloudUpdate update; +# else + MqttUpdate update; +# endif + + update.setDataProviderPool(localProviderPool); + update.restart(); +#endif + +#ifdef DEPLOY_TO_FS + QString namingScheme = QStringLiteral("file://") + qApp->applicationDirPath(); + qCDebug(boot2QtDemos) << "Loading resources from the directory" << namingScheme; +#else + QString namingScheme = QStringLiteral("qrc://"); + qCDebug(boot2QtDemos) << "Loading resources from a resource file"; +#endif + + QString mainFile; + QUrl styleFile; + QString uiVariant = QStringLiteral("small"); + bool fullScreen = +#ifdef Q_OS_ANDROID + true; +#else + false; +#endif + int appWidth = 1920; + int appHeight = 1080; + + QScreen* scr = qApp->screens().at(0); + + QByteArray sf = qgetenv("QT_SCREEN_SCALE_FACTORS"); + qCDebug(boot2QtDemos) << "screen dimensions" << scr->geometry().size(); + qCDebug(boot2QtDemos) << "Scale factor:" << sf.data(); + + QString addressString; + for (auto address : QNetworkInterface::allAddresses()) { + if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost) + && !address.toString().startsWith(QLatin1String("169"))) { + addressString.append(address.toString()); + addressString.append(QLatin1Char('/')); + } + } +#ifdef UI_WATCH + mainFile = namingScheme + QStringLiteral("/resources/watch/MainWatch.qml"); + styleFile = namingScheme + QStringLiteral("/resources/watch/StyleWatch.qml"); +#else + mainFile = namingScheme + QStringLiteral("/resources/small/MainSmall.qml"); + styleFile = namingScheme + QStringLiteral("/resources/small/StyleSmall.qml"); +#endif + qmlRegisterSingletonType(styleFile, "Style", 1,0, "Style"); + + if (qEnvironmentVariableIsSet("QT_IOS_DEMO_NO_FULLSCREEN")) { + qCDebug(boot2QtDemos) << "Application forced not to obey fullscreen setting"; + fullScreen = false; + } + + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("pathPrefix", namingScheme + +"/resources/" + uiVariant + "/images/"); +#ifdef DEPLOY_TO_FS + engine.load(QUrl::fromLocalFile(qApp->applicationDirPath() + QStringLiteral("/resources/base/main.qml"))); +#else + engine.load(QUrl(QStringLiteral("qrc:///resources/base/main.qml"))); +#endif + + QQuickWindow *item = qobject_cast(engine.rootObjects()[0]); + if (item) { + item->setWidth(appWidth); + item->setHeight(appHeight); + + if (fullScreen) + item->showFullScreen(); + + item->setProperty("localProviderPool", QVariant::fromValue(localProviderPool)); + item->setProperty("remoteProviderPool", QVariant::fromValue(remoteProviderPool)); + item->setProperty("contentFile", mainFile); + item->setProperty("seriesStorage", QVariant::fromValue(&seriesStorage)); + item->setProperty("addresses", addressString); + loggingItem = item; + } + int returnValue = app.exec(); + remoteProviderPool->stopScanning(); + + qInstallMessageHandler(oldHandler); + + return returnValue; +} diff --git a/tradeshow/iot-sensortag/mockdataprovider.cpp b/tradeshow/iot-sensortag/mockdataprovider.cpp new file mode 100644 index 0000000..d8eb309 --- /dev/null +++ b/tradeshow/iot-sensortag/mockdataprovider.cpp @@ -0,0 +1,252 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mockdataprovider.h" +#include + +#define MOCK_DATA_SLOW_REFRESH_INTERVAL_MS 1000 +#define MOCK_DATA_RAPID_REFRESH_INTERVAL_MS 200 + +MockDataProvider::MockDataProvider(QString id, QObject *parent) + : SensorTagDataProvider(id, parent) + , xAxisG(-0.02f) + , yAxisG(0.0f) + , zAxisG(0.02f) + , luxIncrease(100) + , rotationDegPerSecXIncrease(5) + , rotationDegPerSecYIncrease(7) + , rotationDegPerSecZIncrease(-9) + , m_smaSamples(0) +{ + intervalRotation = MOCK_DATA_RAPID_REFRESH_INTERVAL_MS; + humidity = 40; + irAmbientTemperature = 25; + irObjectTemperature = 25; + barometerCelsiusTemperature = 25; + barometerHPa = 1040; + pressureAtZeroAltitude = 1040; + accelometerX = 1; + accelometerZ = 0; + magnetometerMicroT_xAxis = 333; + magnetometerMicroT_yAxis = 666; + magnetometerMicroT_zAxis = 999; +} + +bool MockDataProvider::startDataFetching() +{ + // Mock data is immediately available + setState(Connected); + + qsrand(QDateTime::currentMSecsSinceEpoch() / 1000); + connect(&slowUpdateTimer, &QTimer::timeout, + this, &MockDataProvider::slowTimerExpired, Qt::UniqueConnection); + slowUpdateTimer.start(MOCK_DATA_SLOW_REFRESH_INTERVAL_MS); + connect(&rapidUpdateTimer, &QTimer::timeout, + this, &MockDataProvider::rapidTimerExpired, Qt::UniqueConnection); + rapidUpdateTimer.start(MOCK_DATA_RAPID_REFRESH_INTERVAL_MS); + return true; +} + +void MockDataProvider::endDataFetching() +{ + slowUpdateTimer.stop(); + rapidUpdateTimer.stop(); +} + +QString MockDataProvider::sensorType() const +{ + return QLatin1String("Mock data"); +} + +QString MockDataProvider::versionString() const +{ + return QLatin1String("1.1"); +} + +void MockDataProvider::slowTimerExpired() +{ + /* Emit the signals even if values are unchanged. + * Otherwise the scrolling graphs in UI will not scroll. */ + + // Humidity goes randomly up and down between 20% and 60% + humidity += static_cast((qrand() % 11)-5)/10; + if (humidity > 60) + humidity = 60; + if (humidity < 20) + humidity = 20; + emit relativeHumidityChanged(); + + // IR temperature goes randomly up OR down by half of a degree. So does barometer temperature. + if (qrand() % 2) + irAmbientTemperature -= 5; + else + irAmbientTemperature += 5; + if (irAmbientTemperature > 38) + irAmbientTemperature = 38; + if (irAmbientTemperature < 10) + irAmbientTemperature = 10; + emit infraredAmbientTemperatureChanged(); + irObjectTemperature = irAmbientTemperature + 2; + emit infraredObjectTemperatureChanged(); + if (qrand() % 2) + barometerCelsiusTemperature -= 0.5; + else + barometerCelsiusTemperature += 0.5; + if (barometerCelsiusTemperature > 38) + barometerCelsiusTemperature = 38; + if (barometerCelsiusTemperature < 15) + barometerCelsiusTemperature = 15; + emit barometerCelsiusTemperatureChanged(); + barometerTemperatureAverage = (barometerCelsiusTemperature + m_smaSamples * barometerTemperatureAverage) / (m_smaSamples + 1); + emit barometerCelsiusTemperatureAverageChanged(); + m_smaSamples++; + // Use a limited number of samples. It will eventually give wrong avg values, but this is just a demo... + if (m_smaSamples > 10000) + m_smaSamples = 0; + + // Light intensity switches between bright and dark (~0 and ~400) + lightIntensityLux += luxIncrease; + if (lightIntensityLux <= 0) + luxIncrease = 100; + if (lightIntensityLux >= 400) + luxIncrease = -100; + emit lightIntensityChanged(); + + // Air pressure goes between 1030 and 1050, in 0.05 steps + if (qrand() % 2) + barometerHPa -= 0.05; + else + barometerHPa += 0.05; + if (barometerHPa > 1050) + barometerHPa = 1050; + if (barometerHPa < 1030) + barometerHPa = 1030; + emit barometer_hPaChanged(); + + calculateZeroAltitude(); +} + +void MockDataProvider::rapidTimerExpired() +{ + //Rotate counter-clockwise around Z axis + accelometerX += xAxisG; + if (accelometerX < -1) { + xAxisG = xAxisG * -1; + accelometerX = -1; + } else if (accelometerX > 1) { + xAxisG = xAxisG * -1; + accelometerX = 1; + } + accelometerZ += zAxisG; + if (accelometerZ < -1) { + zAxisG = zAxisG * -1; + accelometerZ = -1; + } else if (accelometerZ > 1) { + zAxisG = zAxisG * -1; + accelometerZ = 1; + } + emit accelometerChanged(); + magnetometerMicroT_xAxis += 100; + magnetometerMicroT_yAxis += 100; + magnetometerMicroT_zAxis += 100; + if (magnetometerMicroT_xAxis > 1500) + magnetometerMicroT_xAxis -= 3000; + if (magnetometerMicroT_yAxis > 1500) + magnetometerMicroT_yAxis -= 3000; + if (magnetometerMicroT_zAxis > 1500) + magnetometerMicroT_zAxis -= 3000; + emit magnetometerMicroTChanged(); + + rotation_x += 1; + if (rotation_x > 360) + rotation_x -= 360; + rotation_y += 4; + if (rotation_y > 360) + rotation_y -= 360; + rotation_z += 9; + if (rotation_z > 360) + rotation_z -= 360; + emit rotationXChanged(); + emit rotationYChanged(); + emit rotationZChanged(); + // Signal that all values have changed, for easier + // value change handling in clients + emit rotationValuesChanged(); + + gyroscopeX_degPerSec += rotationDegPerSecXIncrease; + if ((gyroscopeX_degPerSec > 240) || + (gyroscopeX_degPerSec < -240)) + rotationDegPerSecXIncrease *= -1; + gyroscopeY_degPerSec += rotationDegPerSecYIncrease; + if ((gyroscopeY_degPerSec > 240) || + (gyroscopeY_degPerSec < -240)) + rotationDegPerSecYIncrease *= -1; + gyroscopeZ_degPerSec += rotationDegPerSecZIncrease; + if ((gyroscopeZ_degPerSec > 240) || + (gyroscopeZ_degPerSec < -240)) + rotationDegPerSecZIncrease *= -1; + emit gyroscopeDegPerSecChanged(); +} + +void MockDataProvider::startServiceScan() +{ +} + +void MockDataProvider::reset() +{ + rotation_x = 0; + rotation_y = 0; + rotation_z = 0; + emit rotationXChanged(); + emit rotationYChanged(); + emit rotationZChanged(); + + pressureAtZeroAltitude = 1040; +} diff --git a/tradeshow/iot-sensortag/mockdataprovider.h b/tradeshow/iot-sensortag/mockdataprovider.h new file mode 100644 index 0000000..361db2e --- /dev/null +++ b/tradeshow/iot-sensortag/mockdataprovider.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MOCKDATAPROVIDER_H +#define MOCKDATAPROVIDER_H + +#include "sensortagdataprovider.h" + +#include +#include +#include + +class MockDataProvider : public SensorTagDataProvider +{ + Q_OBJECT +public: + explicit MockDataProvider(QString id, QObject *parent = 0); + + bool startDataFetching(); + void endDataFetching(); + + QString sensorType() const; + QString versionString() const; + +public slots: + void slowTimerExpired(); + void rapidTimerExpired(); + void startServiceScan(); + +protected: + void reset() override; + +private: + QTimer slowUpdateTimer; + QTimer rapidUpdateTimer; + float xAxisG; + float yAxisG; + float zAxisG; + int luxIncrease; + int rotationDegPerSecXIncrease; + int rotationDegPerSecYIncrease; + int rotationDegPerSecZIncrease; + int m_smaSamples; +}; + +#endif // MOCKDATAPROVIDER_H diff --git a/tradeshow/iot-sensortag/mockdataproviderpool.cpp b/tradeshow/iot-sensortag/mockdataproviderpool.cpp new file mode 100644 index 0000000..6592e1b --- /dev/null +++ b/tradeshow/iot-sensortag/mockdataproviderpool.cpp @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "mockdataproviderpool.h" +#include "sensortagdataproviderpool.h" +#include "mockdataprovider.h" + +MockDataProviderPool::MockDataProviderPool(QObject *parent) + : DataProviderPool("Demo", parent) + , m_cloudProvider(0) +{ +} + +void MockDataProviderPool::startScanning() +{ + qDeleteAll(m_dataProviders); + m_dataProviders.clear(); + + MockDataProvider* p = new MockDataProvider("MOCK_PROVIDER_1", this); + p->setTagType(SensorTagDataProvider::ObjectTemperature | SensorTagDataProvider::AmbientTemperature | SensorTagDataProvider::Rotation); + m_dataProviders.push_back(p); + p = new MockDataProvider("MOCK_PROVIDER_2", this); + p->setTagType(SensorTagDataProvider::Humidity | SensorTagDataProvider::Light | SensorTagDataProvider::Accelometer); + m_dataProviders.push_back(p); + p = new MockDataProvider("MOCK_PROVIDER_3", this); + p->setTagType(SensorTagDataProvider::Magnetometer | SensorTagDataProvider::AirPressure | SensorTagDataProvider::Altitude); + m_dataProviders.push_back(p); + for (int i=0; i < m_dataProviders.length(); i++) + emit providerConnected(p->id()); + + // Stop scanning as we already have a provider + finishScanning(); +} + +void MockDataProviderPool::finishScanning() +{ + if (m_dataProviders.length()) { + // For mock data we have only one provider and + // it servers as the provider to the cloud, too + m_cloudProvider = m_dataProviders.at(0); + emit providerForCloudChanged(); + } + emit dataProvidersChanged(); + emit scanFinished(); +} + +SensorTagDataProvider *MockDataProviderPool::providerForCloud() const +{ + return m_cloudProvider; +} diff --git a/tradeshow/iot-sensortag/mockdataproviderpool.h b/tradeshow/iot-sensortag/mockdataproviderpool.h new file mode 100644 index 0000000..5f47ff5 --- /dev/null +++ b/tradeshow/iot-sensortag/mockdataproviderpool.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MOCKDATAPROVIDERPOOL_H +#define MOCKDATAPROVIDERPOOL_H + +#include "dataproviderpool.h" + +class MockDataProviderPool : public DataProviderPool +{ + Q_OBJECT +public: + explicit MockDataProviderPool(QObject *parent = 0); + + void startScanning() override; + + SensorTagDataProvider *providerForCloud() const override; + +protected: + void finishScanning(); + +private: + SensorTagDataProvider *m_cloudProvider; +}; + +#endif // MOCKDATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/mqttdataprovider.cpp b/tradeshow/iot-sensortag/mqttdataprovider.cpp new file mode 100644 index 0000000..17bafa0 --- /dev/null +++ b/tradeshow/iot-sensortag/mqttdataprovider.cpp @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mqttdataprovider.h" + +#include +#include +#include + +#define MAJOR_VERSION_NUMBER 1 +#define MINOR_VERSION_NUMBER 0 + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +MqttDataProvider::MqttDataProvider(QString id, QMqttClient *client, QObject *parent) + : SensorTagDataProvider(id, parent) + , m_client(client) + , m_subscription(nullptr) +{ + intervalRotation = 200; + + m_pollTimer = new QTimer(this); + m_pollTimer->setInterval(intervalRotation); + m_pollTimer->setSingleShot(false); + connect(m_pollTimer, &QTimer::timeout, this, &MqttDataProvider::dataTimeout); +} + +bool MqttDataProvider::startDataFetching() +{ + const QString subName = QString::fromLocal8Bit("sensors/%1/#").arg(m_id); + + m_subscription = m_client->subscribe(subName); + connect(m_subscription, &QMqttSubscription::messageReceived, + this, &MqttDataProvider::messageReceived); + return true; +} + +void MqttDataProvider::endDataFetching() +{ + if (m_subscription) { + disconnect(m_subscription, &QMqttSubscription::messageReceived, + this, &MqttDataProvider::messageReceived); + m_subscription->unsubscribe(); + m_subscription = nullptr; + } +} + +QString MqttDataProvider::sensorType() const +{ + return QString("mqtt data"); +} + +QString MqttDataProvider::versionString() const +{ + return QString::number(MAJOR_VERSION_NUMBER) + "." + QString::number(MINOR_VERSION_NUMBER); +} + +void MqttDataProvider::reset() +{ +} + +void MqttDataProvider::messageReceived(const QMqttMessage &msg) +{ + parseMessage(msg.payload(), msg.topic().name()); + if (!m_pollTimer->isActive()) + m_pollTimer->start(); +} + +void MqttDataProvider::parseMessage(const QString &content, const QString &topic) +{ + const QString msgType = topic.split(QLatin1Char('/')).last(); + if (msgType == QStringLiteral("type")) { + qDebug() << "Type: " << content; + } else if (msgType == QStringLiteral("version")) { + qDebug() << "Version: " << content; + } else if (msgType == QStringLiteral("humid")) { + bool ok; + const double v = content.toDouble(&ok); + if (ok) + humidity = v; + } else if (msgType == QStringLiteral("light")) { + bool ok; + const double v = content.toDouble(&ok); + if (ok) + lightIntensityLux = v; + } else if (msgType == QStringLiteral("temperature")) { + //ambient_object + QString streamContent = content; + QTextStream stream(&streamContent); + double ambient, object; + char c; + stream >> ambient >> c >> object; + + irAmbientTemperature = ambient; + irObjectTemperature = object; + } else if (msgType == QStringLiteral("barometer")) { + QString streamContent = content; + QTextStream stream(&streamContent); + double v1, v2; + char c; + stream >> v1 >> c >> v2; + barometerCelsiusTemperature = v1; + barometerHPa = v2; + } else if (msgType == QStringLiteral("gyro")) { + QString streamContent = content; + QTextStream stream(&streamContent); + double v1, v2, v3; + char c; + stream >> v1 >> c >> v2 >> c >> v3; + gyroscopeX_degPerSec = static_cast(v1); + gyroscopeY_degPerSec = static_cast(v2); + gyroscopeZ_degPerSec = static_cast(v3); + } else if (msgType == QStringLiteral("accel")) { + QString streamContent = content; + QTextStream stream(&streamContent); + double v1, v2, v3; + char c; + stream >> v1 >> c >> v2 >> c >> v3; + accelometerX = static_cast(v1); + accelometerY = static_cast(v2); + accelometerZ = static_cast(v3); + } else if (msgType == QStringLiteral("magnet")) { + QString streamContent = content; + QTextStream stream(&streamContent); + double v1, v2, v3; + char c; + stream >> v1 >> c >> v2 >> c >> v3; + magnetometerMicroT_xAxis = static_cast(v1); + magnetometerMicroT_yAxis = static_cast(v2); + magnetometerMicroT_zAxis = static_cast(v3); + } else if (msgType == QStringLiteral("rotation")) { + QString streamContent = content; + QTextStream stream(&streamContent); + double v1, v2, v3; + char c; + stream >> v1 >> c >> v2 >> c >> v3; + rotation_x = static_cast(v1); + rotation_y = static_cast(v2); + rotation_z = static_cast(v3); + } else if (msgType == QStringLiteral("altitude")) { + QString streamContent = content; + QTextStream stream(&streamContent); + float alt; + stream >> alt; + altitude = alt; + } else { + qWarning() << "Unknown sensor data received:" << topic; + } +} + +void MqttDataProvider::dataTimeout() +{ + emit relativeHumidityChanged(); + emit lightIntensityChanged(); + emit infraredAmbientTemperatureChanged(); + emit infraredObjectTemperatureChanged(); + emit barometerCelsiusTemperatureChanged(); + emit barometer_hPaChanged(); + emit gyroscopeDegPerSecChanged(); + emit accelometerChanged(); + emit magnetometerMicroTChanged(); + emit rotationXChanged(); + emit rotationYChanged(); + emit rotationZChanged(); + emit altitudeChanged(); + emit rotationValuesChanged(); +} diff --git a/tradeshow/iot-sensortag/mqttdataprovider.h b/tradeshow/iot-sensortag/mqttdataprovider.h new file mode 100644 index 0000000..53a4492 --- /dev/null +++ b/tradeshow/iot-sensortag/mqttdataprovider.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MQTTDATAPROVIDER_H +#define MQTTDATAPROVIDER_H + +#include "sensortagdataprovider.h" +#include +#include +#include +#include + +class QTimer; + +class MqttDataProvider : public SensorTagDataProvider +{ + Q_OBJECT +public: + explicit MqttDataProvider(QString id, QMqttClient *client, QObject *parent = nullptr); + + bool startDataFetching() override; + void endDataFetching() override; + QString sensorType() const override; + QString versionString() const override; + void reset() override; + +public slots: + void messageReceived(const QMqttMessage &msg); + void parseMessage(const QString &content, const QString &topic); + void dataTimeout(); + +private: + QTimer *m_pollTimer; + QMqttClient *m_client; + QMqttSubscription *m_subscription; +}; +#endif // MQTTDATAPROVIDER_H diff --git a/tradeshow/iot-sensortag/mqttdataproviderpool.cpp b/tradeshow/iot-sensortag/mqttdataproviderpool.cpp new file mode 100644 index 0000000..a7408eb --- /dev/null +++ b/tradeshow/iot-sensortag/mqttdataproviderpool.cpp @@ -0,0 +1,184 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mqttdataproviderpool.h" +#include "mqttdataprovider.h" + +#include +#include +#include + +MqttDataProviderPool::MqttDataProviderPool(QObject *parent) + : DataProviderPool(parent) + , m_client(new QMqttClient(this)) +{ + m_poolName = "Mqtt"; +} + +void MqttDataProviderPool::startScanning() +{ + emit providerConnected("MQTT_CLOUD"); + emit providersUpdated(); + emit dataProvidersChanged(); + + m_client->setHostname(MqttCredentials::getBroker()); + m_client->setPort(static_cast(MqttCredentials::getPort())); + m_client->setUsername(MqttCredentials::getUsername()); + m_client->setPassword(MqttCredentials::getPassword()); + + connect(m_client, &QMqttClient::connected, [this]() { + auto sub = m_client->subscribe(QLatin1String("sensors/active")); + connect(sub, &QMqttSubscription::messageReceived, this, &MqttDataProviderPool::deviceUpdate); + }); + connect(m_client, &QMqttClient::disconnected, []() { + qDebug() << "Pool client disconnected"; + }); + m_client->connectToHost(); +} + +void MqttDataProviderPool::deviceUpdate(const QMqttMessage &msg) +{ + static QSet knownDevices; + // Registration is: deviceName>Online + const QByteArrayList payload = msg.payload().split('>'); + const QString deviceName = payload.first(); + const QString deviceStatus = payload.at(1); + const QString subName = QString::fromLocal8Bit("sensors/%1/#").arg(deviceName); + + bool updateRequired = false; + if (deviceStatus == QLatin1String("Online")) { // new device + // Skip local items + if (deviceName.startsWith(QSysInfo::machineHostName())) + return; + + if (!knownDevices.contains(deviceName)) { + auto prov = new MqttDataProvider(deviceName, m_client, this); + prov->setState(SensorTagDataProvider::Connected); + m_dataProviders.push_back(prov); + if (m_currentProvider == nullptr) + setCurrentProviderIndex(m_dataProviders.size() - 1); + knownDevices.insert(deviceName); + updateRequired = true; + } + } else if (deviceStatus == QLatin1String("Offline")) { // device died + knownDevices.remove(deviceName); + updateRequired = true; + for (auto prov : m_dataProviders) { + if (prov->id() == deviceName) { + m_dataProviders.removeAll(prov); + break; + } + } + } + + if (updateRequired) { + emit providersUpdated(); + emit dataProvidersChanged(); + } +} + +namespace { + static QString gBroker; + static int gPort{0}; + static QString gUser; + static QString gPassword; + bool resolveCredentials() { + static bool resolved = false; + if (resolved) + return true; + + QFile f(QLatin1String("broker.json")); + if (!f.open(QIODevice::ReadOnly)) { + qDebug() << "Could not find or open broker.json"; + return false; + } + const QByteArray data = f.readAll(); + if (data.isEmpty()) { + qDebug() << "broker.json file empty"; + return false; + } + QJsonDocument doc = QJsonDocument::fromJson(data); + if (doc.isNull()) { + qDebug() << "broker.json does not contain valid data"; + return false; + } + gBroker = doc["broker"].toString(); + gPort = doc["port"].toInt(); + gUser = doc["user"].toString(); + gPassword = doc["password"].toString(); + qDebug() << "broker.json parsed. Using broker:" << gBroker << ":" << gPort; + resolved = true; + return true; + } +} + +QString MqttCredentials::getBroker() +{ + resolveCredentials(); + return gBroker; +} + +int MqttCredentials::getPort() +{ + resolveCredentials(); + return gPort; +} + +QString MqttCredentials::getUsername() +{ + resolveCredentials(); + return gUser; +} + +QString MqttCredentials::getPassword() +{ + resolveCredentials(); + return gPassword; +} diff --git a/tradeshow/iot-sensortag/mqttdataproviderpool.h b/tradeshow/iot-sensortag/mqttdataproviderpool.h new file mode 100644 index 0000000..3004757 --- /dev/null +++ b/tradeshow/iot-sensortag/mqttdataproviderpool.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MQTTDATAPROVIDERPOOL_H +#define MQTTDATAPROVIDERPOOL_H + +#include "dataproviderpool.h" +#include + +class MqttDataProvider; + +namespace MqttCredentials +{ + QString getBroker(); + int getPort(); + QString getUsername(); + QString getPassword(); +} + +class MqttDataProviderPool : public DataProviderPool +{ +public: + explicit MqttDataProviderPool(QObject *parent = nullptr); + + void startScanning() override; + +public Q_SLOTS: + void deviceUpdate(const QMqttMessage &msg); + +private: + QMqttClient *m_client; +}; + +#endif // MQTTDATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/mqttupdate.cpp b/tradeshow/iot-sensortag/mqttupdate.cpp new file mode 100644 index 0000000..921825e --- /dev/null +++ b/tradeshow/iot-sensortag/mqttupdate.cpp @@ -0,0 +1,382 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mqttupdate.h" +#include "cloudservice.h" +#include "dataproviderpool.h" +#include "sensortagdataprovider.h" +#include "demodataproviderpool.h" +#include "mqttdataproviderpool.h" + +#include +#include +#include + +#define ROUNDING_DECIMALS 2 +#define UPDATE_INTERVAL 100 + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +MqttUpdate::MqttUpdate(QObject *parent) + : QObject(parent) + , m_providerPool(nullptr) +#ifdef MQTT_TIMER_BASED_PUBLISH + , m_timerId(0) +#endif + , m_handler(nullptr) + , m_updateInterval(UPDATE_INTERVAL) +{ +} + +void MqttUpdate::setDataProviderPool(DataProviderPool *provider) +{ + m_providerPool = provider; + connect(m_providerPool, &DataProviderPool::currentProviderChanged, this, [=]() { + if (m_handler) + m_handler->deleteLater(); + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + if (!provider) + return; + + QString hostname = QSysInfo::machineHostName(); + if (hostname == QLatin1String("localhost")) { + hostname = QUuid::createUuid().toString(); + qCDebug(boot2QtDemos) << "localhost not unique. New ID:" << hostname; + } + + m_handler = new MqttEventHandler(hostname + QLatin1String(" - ") + provider->id()); + m_handler->m_providerPool = m_providerPool; + + connect(provider, &SensorTagDataProvider::gyroscopeDegPerSecChanged, m_handler, &MqttEventHandler::uploadGyro); + connect(provider, &SensorTagDataProvider::accelometerChanged, m_handler, &MqttEventHandler::uploadAccelerometer); + connect(provider, &SensorTagDataProvider::rotationXChanged, m_handler, &MqttEventHandler::uploadRotation); + connect(provider, &SensorTagDataProvider::infraredAmbientTemperatureChanged, m_handler, &MqttEventHandler::uploadTemperature); + connect(provider, &SensorTagDataProvider::magnetometerMicroTChanged, m_handler, &MqttEventHandler::uploadMagnetometer); + connect(provider, &SensorTagDataProvider::relativeHumidityChanged, m_handler, &MqttEventHandler::uploadHumidity); + connect(provider, &SensorTagDataProvider::lightIntensityChanged, m_handler, &MqttEventHandler::uploadLight); + connect(provider, &SensorTagDataProvider::barometer_hPaChanged, m_handler, &MqttEventHandler::uploadBarometer); + connect(provider, &SensorTagDataProvider::altitudeChanged, m_handler, &MqttEventHandler::uploadAltitude); + }); +} + +int MqttUpdate::updateInterval() const +{ + return m_updateInterval; +} + +void MqttUpdate::setUpdateInterval(int interval) +{ + m_updateInterval = interval; +} + +void MqttUpdate::restart() +{ +#ifdef MQTT_TIMER_BASED_PUBLISH + killTimer(m_timerId); + m_timerId = startTimer(m_updateInterval); +#endif +} + +void MqttUpdate::stop() +{ +#ifdef MQTT_TIMER_BASED_PUBLISH + killTimer(m_timerId); +#endif +} + +#ifndef MQTT_TIMER_BASED_PUBLISH + +inline bool ensureConnected(QMqttClient *client) +{ + if (client->state() == QMqttClient::Connected) + return true; + + if (client->state() == QMqttClient::Disconnected) { + qCDebug(boot2QtDemos) << "Disconnected, need to reconnect"; + client->connectToHost(); + } + + return false; // Connecting, nothing to do +} + +void MqttEventHandler::uploadGyro() +{ + if (!ensureConnected(m_client)) + return; + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString gyro = QString("%1_%2_%3") + .arg(double(provider->getGyroscopeX_degPerSec()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getGyroscopeY_degPerSec()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getGyroscopeZ_degPerSec()), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("gyro"), gyro.toLocal8Bit()); + } +} + +void MqttEventHandler::uploadTemperature() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString temperature = QString("%1_%2") + .arg(provider->getInfraredAmbientTemperature(), 0, 'f', ROUNDING_DECIMALS) + .arg(provider->getInfraredObjectTemperature(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("temperature"), temperature.toLocal8Bit()); + } +} + +void MqttEventHandler::uploadHumidity() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) + m_client->publish(m_topicPrefix + QLatin1String("humid"), + QString("%1").arg(provider->getRelativeHumidity(), 0, 'f', ROUNDING_DECIMALS).toLocal8Bit()); +} + +void MqttEventHandler::uploadLight() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) + m_client->publish(m_topicPrefix + QLatin1String("light"), + QString("%1").arg(provider->getLightIntensityLux(), 0, 'f', ROUNDING_DECIMALS).toLocal8Bit()); +} + +void MqttEventHandler::uploadAltitude() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) + m_client->publish(m_topicPrefix + QLatin1String("altitude"), + QString("%1").arg(double(provider->getAltitude()), 0, 'f', ROUNDING_DECIMALS).toLocal8Bit()); +} + +void MqttEventHandler::uploadBarometer() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString baro = QString("%1_%2") + .arg(provider->getBarometerCelsiusTemperature(), 0, 'f', ROUNDING_DECIMALS) + .arg(provider->getBarometer_hPa(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("barometer"), baro.toLocal8Bit()); + } +} + +void MqttEventHandler::uploadAccelerometer() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString accel = QString("%1_%2_%3") + .arg(double(provider->getAccelometer_xAxis()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getAccelometer_yAxis()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getAccelometer_zAxis()), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("accel"), accel.toLocal8Bit()); + } +} + +void MqttEventHandler::uploadMagnetometer() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString magnet = QString("%1_%2_%3") + .arg(double(provider->getMagnetometerMicroT_xAxis()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getMagnetometerMicroT_yAxis()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getMagnetometerMicroT_zAxis()), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("magnet"), magnet.toLocal8Bit()); + } +} + +void MqttEventHandler::uploadRotation() +{ + if (!ensureConnected(m_client)) + return; + + SensorTagDataProvider *provider = m_providerPool->currentProvider(); + + if (provider) { + const QString rotation = QString("%1_%2_%3") + .arg(double(provider->getRotationX()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getRotationY()), 0, 'f', ROUNDING_DECIMALS) + .arg(double(provider->getRotationZ()), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("rotation"), rotation.toLocal8Bit()); + } +} + +void MqttEventHandler::clientConnected() +{ + m_pingTimer.start(); +} + +void MqttEventHandler::sendAlive() +{ + m_client->publish(QLatin1String("sensors/active"), QString::fromLocal8Bit("%1>Online").arg(m_deviceName).toLocal8Bit(), 1); +} +#endif // !MQTT_TIMER_BASED_PUBLISH + +#ifdef MQTT_TIMER_BASED_PUBLISH +void MqttUpdate::timerEvent(QTimerEvent *event) +{ + Q_UNUSED(event); + + if (!m_provider) + return; + + writeToCloud(); +} + +void MqttUpdate::writeToCloud() +{ + if (!m_provider) { + qWarning("MqttUpdate: sensor data provider not set. Data not updated"); + return; + } + + if (m_client->state() == QMqttClient::Disconnected) { + qCDebug(boot2QtDemos) << "Disconnected, need to reconnect"; + m_client->connectToHost(); + } + if (m_client->state() == QMqttClient::Connected) { + static bool sendTypeVersion = true; + if (sendTypeVersion) { + m_client->publish(m_topicPrefix + QLatin1String("type"), m_provider->sensorType()); + m_client->publish(m_topicPrefix + QLatin1String("version"), m_provider->versionString()); + sendTypeVersion = false; + } + m_client->publish(m_topicPrefix + QLatin1String("humid"), + QString("%1").arg(m_provider->getRelativeHumidity(), 0, 'f', ROUNDING_DECIMALS)); + m_client->publish(m_topicPrefix + QLatin1String("light"), + QString("%1").arg(m_provider->getLightIntensityLux(), 0, 'f', ROUNDING_DECIMALS)); + + const QString temperature = QString("%1_%2").arg(m_provider->getInfraredAmbientTemperature(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getInfraredObjectTemperature(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("temperature"), temperature); + + const QString baro = QString("%1_%2").arg(m_provider->getBarometerCelsiusTemperature(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getBarometer_hPa(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("barometer"), baro); + + const QString gyro = QString("%1_%2_%3").arg(m_provider->getGyroscopeX_degPerSec(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getGyroscopeY_degPerSec(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getGyroscopeZ_degPerSec(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("gyro"), gyro); + + const QString accel = QString("%1_%2_%3").arg(m_provider->getAccelometer_xAxis(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getAccelometer_yAxis(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getAccelometer_zAxis(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("accel"), accel); + + const QString magnet = QString("%1_%2_%3").arg(m_provider->getMagnetometerMicroT_xAxis(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getMagnetometerMicroT_yAxis(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getMagnetometerMicroT_zAxis(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("magnet"), magnet); + + const QString rotation = QString("%1_%2_%3").arg(m_provider->getRotationX(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getRotationY(), 0, 'f', ROUNDING_DECIMALS) + .arg(m_provider->getRotationZ(), 0, 'f', ROUNDING_DECIMALS); + m_client->publish(m_topicPrefix + QLatin1String("rotation"), rotation); + } +} +#endif //MQTT_TIMER_BASED_PUBLISH + +MqttEventHandler::MqttEventHandler(const QString &name, QObject *parent) + : QObject(parent) +{ + m_deviceName = name; + m_topicPrefix = QString::fromLocal8Bit("sensors/%1/").arg(m_deviceName); + + m_pingTimer.setInterval(5000); + m_pingTimer.setSingleShot(false); + connect(&m_pingTimer, &QTimer::timeout, this, &MqttEventHandler::sendAlive); + + m_client = new QMqttClient; + m_client->setHostname(MqttCredentials::getBroker()); + m_client->setPort(static_cast(MqttCredentials::getPort())); + m_client->setUsername(MqttCredentials::getUsername()); + m_client->setPassword(MqttCredentials::getPassword()); + + m_client->setWillMessage(QString::fromLocal8Bit("%1>Offline").arg(m_deviceName).toLocal8Bit()); + m_client->setWillQoS(1); + m_client->setWillRetain(true); + m_client->setWillTopic(QString::fromLocal8Bit("sensors/active")); + connect(m_client, &QMqttClient::connected, this, &MqttEventHandler::clientConnected); +} + +MqttEventHandler::~MqttEventHandler() +{ + m_client->publish(QLatin1String("sensors/active"), + QString::fromLocal8Bit("%1>Offline").arg(m_deviceName).toLocal8Bit(), 1); +} diff --git a/tradeshow/iot-sensortag/mqttupdate.h b/tradeshow/iot-sensortag/mqttupdate.h new file mode 100644 index 0000000..8be5920 --- /dev/null +++ b/tradeshow/iot-sensortag/mqttupdate.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MQTTUPDATE_H +#define MQTTUPDATE_H + +#include +#include + +class DataProviderPool; +class SensorTagDataProvider; +class QMqttClient; + +//#define MQTT_TIMER_BASED_PUBLISH 1 + +class MqttEventHandler : public QObject +{ + Q_OBJECT +public: + explicit MqttEventHandler(const QString &name, QObject *parent = nullptr); + ~MqttEventHandler(); + DataProviderPool *m_providerPool; +public slots: + void uploadGyro(); + void uploadTemperature(); + void uploadHumidity(); + void uploadLight(); + void uploadAltitude(); + void uploadBarometer(); + void uploadAccelerometer(); + void uploadMagnetometer(); + void uploadRotation(); + + void clientConnected(); + void sendAlive(); + +private: + QString m_deviceName; + QString m_topicPrefix; + QMqttClient *m_client; + QTimer m_pingTimer; +}; + +class MqttUpdate : public QObject +{ + Q_OBJECT +public: + explicit MqttUpdate(QObject *parent = nullptr); + + void setDataProviderPool(DataProviderPool *provider); + + int updateInterval() const; + void setUpdateInterval(int interval); + void restart(); + void stop(); + +#ifdef MQTT_TIMER_BASED_PUBLISH +protected: + void timerEvent(QTimerEvent* event); + virtual void writeToCloud(); +#else +#endif + +protected: + DataProviderPool *m_providerPool; +private: + QThread *m_handlerThread; + MqttEventHandler *m_handler; + int m_updateInterval; +#ifdef MQTT_TIMER_BASED_PUBLISH + int m_timerId; +#endif +}; + +#endif // MQTTUPDATE_H diff --git a/tradeshow/iot-sensortag/resources/base/AccelChart.qml b/tradeshow/iot-sensortag/resources/base/AccelChart.qml new file mode 100644 index 0000000..d037ff1 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/AccelChart.qml @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import SensorTag.DataProvider 1.0 + +BaseChart { + + property real acceXValue: sensor ? sensor.accelometer_xAxis.toFixed(1) : 0 + property real acceYValue: sensor ? sensor.accelometer_yAxis.toFixed(1) : 0 + property real acceZValue: sensor ? sensor.accelometer_zAxis.toFixed(1) : 0 + + antialiasing: true + title: qsTr("Accelometer") + rightSide: true + + content: Item { + anchors.fill: parent + + Row { + id: itemRow + anchors.fill: parent + + Repeater { + + model: 3 + + Item { + height: itemRow.height + width: itemRow.width / 3 + Image { + id: accelometerOuter + + source: pathPrefix + "Accelometer/outer_ring.png" + anchors.centerIn: parent + + Image { + source: pathPrefix + "Accelometer/inner_ring.png" + anchors.centerIn: parent + } + + Text { + id: accelMainText + anchors.centerIn: parent + text: (index == 0) ? acceXValue : ((index == 1) ? acceYValue : acceZValue) + color: "white" + font.pixelSize: 26 + } + } + + Text { + anchors.horizontalCenter: accelometerOuter.horizontalCenter + anchors.top: accelometerOuter.bottom + anchors.topMargin: -18 + text: (index == 0) ? "X" : ((index == 1) ? "Y" : "Z") + color: "white" + font.pixelSize: 20 + } + } + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/AltitudeChart.qml b/tradeshow/iot-sensortag/resources/base/AltitudeChart.qml new file mode 100644 index 0000000..20a8a0e --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/AltitudeChart.qml @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import SensorTag.DataProvider 1.0 +import QtGraphicalEffects 1.0 + +BaseChart { + property real altitude: sensor ? sensor.altitude : 0 + property real altitudeRounded + property real maxAltitude + + readonly property real maxValueOnBar: 3 + + antialiasing: true + title: qsTr("Altitude") + + onClicked: { + if (sensor) { + maxAltitude = 0; + sensor.recalibrate(); + } + } + + onAltitudeChanged: { + altitudeRounded = Math.floor(altitude + 0.5).toFixed(0) + if (altitudeRounded > maxAltitude) + maxAltitude = altitudeRounded + } + + content: Item { + id: container + + anchors.fill: parent + + Image { + id: maxAltBar + + source: pathPrefix + "Altitude/Height_bar.png" + anchors.verticalCenter: gauge.verticalCenter + anchors.right: gauge.left + width: 10 + height: 100 + visible: false + } + + Item { + id: mask + + anchors.fill: maxAltBar + visible: false + + Rectangle { + width: parent.width + anchors.bottom: parent.bottom + height: maxAltitude ? (altitude / maxAltitude) * parent.height : 0 + } + } + + OpacityMask { + anchors.fill: maxAltBar + source: maxAltBar + maskSource: mask + } + + Image { + id: gauge + + source: pathPrefix + "Altitude/Altitude_base_gauge_outer.png" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + + Image { + source: pathPrefix + "Altitude/Altitude_base_gauge.png" + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 30 + + Column { + anchors.centerIn: parent + spacing: -10 + + Text { + id: pressureText + + text: altitudeRounded + horizontalAlignment: Text.AlignHCenter + color: "white" + font.pixelSize: 26 + } + + Text { + text: "m" + color: "white" + font.pixelSize: 16 + anchors.horizontalCenter: pressureText.horizontalCenter + } + } + } + + Text { + id: maxPressureText + + text: "Max\n" + maxAltitude + horizontalAlignment: Text.AlignHCenter + anchors.centerIn: parent + anchors.horizontalCenterOffset: 74 + color: "white" + font.pixelSize: 26 + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/BaseChart.qml b/tradeshow/iot-sensortag/resources/base/BaseChart.qml new file mode 100644 index 0000000..bc850fc --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/BaseChart.qml @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import Style 1.0 +import SensorTag.DataProvider 1.0 + +Item { + id: baseChart + + property var sensor: singleSensorSource + property string title + property alias contentItem: loader.item + property alias content: loader.sourceComponent + property bool rightSide: false + property alias titlePaneHeight: titleIcon.height + property bool hasData: baseChart.sensor ? baseChart.sensor.state === SensorTagData.Connected : false + property int sensorState: sensor ? sensor.state : SensorTagData.NotFound + + signal clicked + + onSensorStateChanged: { + if (sensorState === SensorTagData.Scanning) + sensorIcon.startBlinking(); + else + sensorIcon.stopBlinking(); + } + + Image { + id: titleIcon + visible: Style.uiStyle == "small" + anchors.top: parent.top + source: pathPrefix + "General/icon_sensor.png" + } + + Text { + color: "white" + text: title.toUpperCase() + font.pixelSize: Style.indicatorTitleFontSize + anchors.left: titleIcon.right + anchors.leftMargin: 14 + anchors.top: parent.top + anchors.topMargin: -8 + } + + Loader { + id: loader + + anchors.top: titleIcon.bottom + anchors.bottom: separator.bottom + anchors.bottomMargin: 16 + anchors.left: parent.left + anchors.right: parent.right + visible: sensorState === SensorTagData.Connected + } + + Item { + anchors.top: titleIcon.bottom + anchors.bottom: separator.bottom + anchors.bottomMargin: 16 + anchors.left: parent.left + anchors.right: parent.right + visible: sensorState === SensorTagData.Scanning || + sensorState === SensorTagData.Disconnected || + sensorState === SensorTagData.Error || + sensorState === SensorTagData.NotFound + + Column { + anchors.centerIn: parent + spacing: 20 + + BlinkingIcon { + id: sensorIcon + + source: pathPrefix + "Toolbar/icon_topbar_sensor.png" + anchors.horizontalCenter: parent.horizontalCenter + visible: sensorState === SensorTagData.Scanning + } + + Text { + id: stateText + + color: "white" + text: sensorState === SensorTagData.Scanning ? "Connecting to sensor..." + : sensorState === SensorTagData.Disconnected ? "Disconnected" + : sensorState === SensorTagData.NotFound ? "Device not found" + : "" + } + } + } + + Image { + id: separator + + source: pathPrefix + "General/separator.png" + anchors.bottom: parent.bottom + transform: Rotation { + origin.x: separator.width / 2 + origin.y: separator.height / 2 + axis.x: 0 + axis.y: 1 + axis.z: 0 + angle: rightSide ? 180 : 0 + } + visible: Style.uiStyle == "small" + } + + MouseArea { + anchors.fill: parent + onClicked: baseChart.clicked() + } +} diff --git a/tradeshow/iot-sensortag/resources/base/BlinkingIcon.qml b/tradeshow/iot-sensortag/resources/base/BlinkingIcon.qml new file mode 100644 index 0000000..fc29fc9 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/BlinkingIcon.qml @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 + +Image { + id: icon + + property bool activeBlink: false + + function startBlinking() { + if (!activeBlink) { + activeBlink = true; + mainWindow.startBlink(); + } + } + + function stopBlinking() { + if (activeBlink) { + activeBlink = false; + mainWindow.stopBlink(); + } + } + + opacity: activeBlink ? mainWindow.globalBlinkOpacity: 1 +} diff --git a/tradeshow/iot-sensortag/resources/base/ChartPage.qml b/tradeshow/iot-sensortag/resources/base/ChartPage.qml new file mode 100644 index 0000000..8a58246 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/ChartPage.qml @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 + +Flickable{ + id: view + + contentWidth: col.width + contentHeight: col.height + + Column { + id: col + width: view.width + + TemperatureChart{} + ObjectTemperatureChart{} + HumidityChart{} + LightChart{} + AirPressureChart{} + MagnetometerChart{} + } +} + diff --git a/tradeshow/iot-sensortag/resources/base/CircularGauge.qml b/tradeshow/iot-sensortag/resources/base/CircularGauge.qml new file mode 100644 index 0000000..431ee99 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/CircularGauge.qml @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 + +Item { + id: gauge + + property real min: 0 + property real max: 360 + property real value: 20 + property real stepCount: 18 + + property real increment: (max - min) / stepCount + property real prevValue: min + + property int currentColorSection + property var colorSections: ["ObjectTemperature/objTemp_display_obj_blue.png", + "ObjectTemperature/objTemp_display_obj_green.png", + "ObjectTemperature/objTemp_display_obj_orange.png", + "ObjectTemperature/objTemp_display_obj_red.png"] + + onValueChanged: { + currentColorSection = Math.floor((value - min) / (max - min) * 3); + if (currentColorSection < 0) + currentColorSection = 0; + + if (value > prevValue) { + prevValue = value; + rotateAnimation.from = 0; + rotateAnimation.to = 360; + rotateAnimation.start(); + } + else { + prevValue = value; + rotateAnimation.from = 360; + rotateAnimation.to = 0; + rotateAnimation.start(); + } + } + + width: bg.width + height: bg.height + + Image { + id: bg + + source: pathPrefix + "ObjectTemperature/objTemp_outer_inner_ring.png" + } + + Image { + id: fg + + anchors.centerIn: bg + source: pathPrefix + colorSections[currentColorSection] + } + + RotationAnimator { + id: rotateAnimation + + target: fg + duration: 500 + } +} diff --git a/tradeshow/iot-sensortag/resources/base/CloudSettings.qml b/tradeshow/iot-sensortag/resources/base/CloudSettings.qml new file mode 100644 index 0000000..1622ada --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/CloudSettings.qml @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import Style 1.0 + +Rectangle { + id: mainRect + + width: 360 + height: 252 + color: "black" + + Text { + id: titleText + color: "white" + text: "CLOUD SETTINGS" + font.pixelSize: Style.indicatorTitleFontSize + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 8 + } + + Image { + id: icon + anchors.top: titleText.bottom + anchors.horizontalCenter: parent.horizontalCenter + anchors.margins: 8 + source: pathPrefix + "Toolbar/Cloud_icon_settings.png" + } + + Text { + id: connectText + color: "white" + text: "CONNECTED TO" + font.pixelSize: 16 + anchors.left: parent.left + anchors.leftMargin: 40 + anchors.top: icon.bottom + anchors.topMargin: 32 + } + + Rectangle { + anchors.fill: addressText + color: "white" + } + + Text { + id: addressText + text: "Address to cloud..." + color: "black" + font.pixelSize: 16 + anchors.left: parent.left + anchors.leftMargin: 40 + anchors.right: parent.right + anchors.rightMargin: 20 + anchors.top: connectText.bottom + anchors.topMargin: 2 + } + + Image { + id: changeIcon + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + anchors.margins: 8 + source: pathPrefix + "Toolbar/Cloud_button_change_active.png" + } +} diff --git a/tradeshow/iot-sensortag/resources/base/GyroChart.qml b/tradeshow/iot-sensortag/resources/base/GyroChart.qml new file mode 100644 index 0000000..f09ef6b --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/GyroChart.qml @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtCharts 2.1 +import SensorTag.DataProvider 1.0 +import QtGraphicalEffects 1.0 +import QtQml 2.2 + +BaseChart { + id: gyroHolderRect + + // Replace with actual gyro properties + property int maxGyroReadings: 24 + + readonly property string xColor: "#15bdff" + readonly property string yColor: "white" + readonly property string zColor: "red" + readonly property color textColor: "white" + + onClicked: { + if (sensor) + sensor.recalibrate(); + } + + title: qsTr("Gyroscope") + rightSide: true + + content: Item { + anchors.fill: parent + + Connections { + target: mainWindow + onSeriesStorageChanged: { + if (seriesStorage) + seriesStorage.setGyroSeries(gyroSeriesX, gyroSeriesY, gyroSeriesZ); + } + } + + ChartView { + id: chartView + + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.bottomMargin: 25 + anchors.left: parent.left + anchors.leftMargin: -20 + anchors.right: parent.right + antialiasing: true + backgroundColor: "transparent" + legend.visible: false + margins.top: 0 + margins.right: 0 + + // Hide the value axis labels; labels are drawn separately. + ValueAxis { + id: valueAxisX + min: 0 + max: maxGyroReadings + 1 + visible: false + } + + ValueAxis { + id: valueAxisY + min: 0 + max: 360 + visible: false + } + SplineSeries { + id: gyroSeriesX + axisX: valueAxisX + axisY: valueAxisY + color: xColor + name: "Gyro X" + useOpenGL: true + width: 2 + } + SplineSeries { + id: gyroSeriesY + axisX: valueAxisX + axisY: valueAxisY + color: yColor + name: "Gyro Y" + useOpenGL: true + width: 2 + } + SplineSeries { + id: gyroSeriesZ + axisX: valueAxisX + axisY: valueAxisY + color: zColor + name: "Gyro Z" + useOpenGL: true + width: 2 + } + } + + Row { + id: xLabelRow + anchors.fill: parent + anchors.leftMargin: 16 + + Repeater { + model: 3 + + Item { + height: xLabelRow.height + width: xLabelRow.width / 3 + + Text { + id: coordText + text: (index == 0) ? "X" : ((index == 1) ? "Y" : "Z") + color: "white" + anchors.left: parent.left + anchors.bottom: parent.bottom + font.pixelSize: 26 + } + + Text { + text: sensor ? ((index == 0) ? sensor.rotationX.toFixed(0) : + ((index == 1) ? sensor.rotationY.toFixed(0) : + sensor.rotationZ.toFixed(0))) : + "" + color: (index == 0) ? xColor : ((index == 1) ? yColor : zColor) + anchors.left: coordText.right + anchors.leftMargin: 16 + anchors.bottom: parent.bottom + font.pixelSize: 26 + } + } + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/HumidityChart.qml b/tradeshow/iot-sensortag/resources/base/HumidityChart.qml new file mode 100644 index 0000000..163eb9d --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/HumidityChart.qml @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtCharts 2.1 +import SensorTag.DataProvider 1.0 + +BaseChart { + property int humiditySeriesIndex: 0 + property int maxNumOfHumiReadings: 30 + + antialiasing: true + title: qsTr("Humidity") + + content: Item { + anchors.fill: parent + + property real humidityValue: sensor ? sensor.relativeHumidity : 0 + property real maxHumi: 0 + property real minHumi: 100 + + onHumidityValueChanged: { + if (humidityValue > maxHumi) + maxHumi = humidityValue + + if (humidityValue < minHumi) + minHumi = humidityValue + } + + Image { + id: humidityMainImg + + source: pathPrefix + "Humidity/Hum_combined_all.png" + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.top: parent.top + anchors.topMargin: -8 + + Text { + id: humidityMainText + + anchors.centerIn: parent + anchors.horizontalCenterOffset: - 42 + color: "white" + text: humidityValue.toFixed(0) + font.pixelSize: 26 + } + } + + + Text { + anchors.left: humidityMainImg.right + anchors.top: humidityMainImg.top + anchors.topMargin: 27 + text: "Max\n" + maxHumi.toFixed(0) + " %" + lineHeight: 0.8 + color: "white" + font.pixelSize: 26 + } + + Text { + anchors.left: humidityMainImg.right + anchors.bottom: humidityMainImg.bottom + anchors.bottomMargin: 33 + text: "Min\n" + minHumi.toFixed(0) + " %" + lineHeight: 0.8 + color: "white" + font.pixelSize: 26 + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/LightChart.qml b/tradeshow/iot-sensortag/resources/base/LightChart.qml new file mode 100644 index 0000000..857a112 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/LightChart.qml @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import SensorTag.DataProvider 1.0 + +BaseChart { + height: view.height * 0.4 + width: view.width + antialiasing: true + title: qsTr("Light Intensity") + rightSide: true + + content: Item { + id: container + + anchors.fill: parent + + property alias lightText: lightMainText.text + property alias lightImg: brightnessImg + property real lightValue: sensor ? sensor.lightIntensityLux : 0 + property real maxLightValue: 1 + property real normalizedLightValue: 0 + + onLightValueChanged: { + contentItem.lightText = lightValue.toFixed(1) + + if (lightValue > maxLightValue) + maxLightValue = lightValue + + normalizedLightValue = lightValue / maxLightValue + lightImg.opacity = normalizedLightValue + } + + Image { + id: lightMainImg + + source: pathPrefix + "Light/light_base_gauge.png" + anchors.top: parent.top + anchors.topMargin: 16 + anchors.left: container.left + anchors.leftMargin: 12 + + Text { + id: lightMainText + + anchors.centerIn: parent + color: "white" + } + } + + Image { + id: brightnessImg + + source: pathPrefix + "Light/light_brightness.png" + anchors.right: parent.right + + Behavior on opacity { + OpacityAnimator { + duration: 500 + } + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/LocationPage.qml b/tradeshow/iot-sensortag/resources/base/LocationPage.qml new file mode 100644 index 0000000..e479ce2 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/LocationPage.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.6 +import QtPositioning 5.5 +import QtLocation 5.6 + +Rectangle { + id: locationMain + property string location: "Home" + property string address: "Home address" + + Plugin { + id: myPlugin + name: "osm" + //specify plugin parameters as necessary + //PluginParameter {...} + //PluginParameter {...} + //... + } + + GeocodeModel { + id: addressProvider + plugin: myPlugin + autoUpdate: false + onLocationsChanged: { + if (count) + locationMain.address = get(0).address.text; + else + console.log("no matches"); + } + } + + PositionSource { + id: positionProvider + updateInterval: 1000 + active: true + + onPositionChanged: { + var coord = positionProvider.position.coordinate; + addressProvider.query = coord; + addressProvider.update(); + locationMain.location = "Coordinate: N" + coord.latitude + " E" + coord.longitude; + console.log(locationMain.location); + } + } + Column { + anchors.left: parent.left + anchors.top: parent.top + Text { + text: locationMain.location + } + Text { + text: locationMain.address + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/MagnetometerChart.qml b/tradeshow/iot-sensortag/resources/base/MagnetometerChart.qml new file mode 100644 index 0000000..2b2ccac --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/MagnetometerChart.qml @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtCharts 2.1 +import SensorTag.DataProvider 1.0 +import QtGraphicalEffects 1.0 + +BaseChart { + id: magnetHolderRect + + property int maxNumOfMagnReadings: 24 + + readonly property string xColor: "#4db300" + readonly property string yColor: "white" + readonly property string zColor: "#f64405" + readonly property color textColor: "white" + + title: qsTr("Magnetometer") + rightSide: true + + content: Item { + anchors.fill: parent + + Connections { + target: mainWindow + onSeriesStorageChanged: { + if (seriesStorage) + seriesStorage.setMagnetoMeterSeries(magnSeriesX, magnSeriesY, magnSeriesZ); + } + } + + ChartView { + id: chartView + + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.bottomMargin: 25 + anchors.left: parent.left + anchors.leftMargin: -20 + anchors.right: parent.right + antialiasing: true + backgroundColor: "transparent" + legend.visible: false + margins.top: 0 + margins.right: 0 + + // Hide the value axis labels; labels are drawn separately. + ValueAxis { + id: valueAxisX + min: 0 + max: maxNumOfMagnReadings + 1 + visible: false + } + + ValueAxis { + id: valueAxisY + min: -2000 + max: 2000 + visible: false + } + + LineSeries { + id: magnSeriesX + axisX: valueAxisX + axisY: valueAxisY + color: xColor + name: "Magnet X" + useOpenGL: true + width: 2 + } + LineSeries { + id: magnSeriesY + axisX: valueAxisX + axisY: valueAxisY + color: yColor + name: "Magnet Y" + useOpenGL: true + width: 2 + } + LineSeries { + id: magnSeriesZ + axisX: valueAxisX + axisY: valueAxisY + color: zColor + name: "Magnet Z" + useOpenGL: true + width: 2 + } + } + + Row { + id: labelRow + anchors.fill: parent + anchors.leftMargin: 16 + + Repeater { + model: 3 + + Item { + height: labelRow.height + width: labelRow.width / 3 + + Text { + id: coordText + text: (index == 0) ? "X" : ((index == 1) ? "Y" : "Z") + color: (index == 0) ? xColor : ((index == 1) ? yColor : zColor) + anchors.left: parent.left + anchors.bottom: parent.bottom + font.pixelSize: 26 + } + + Text { + text: sensor ? ((index == 0) ? sensor.magnetometerMicroT_xAxis : + ((index == 1) ? sensor.magnetometerMicroT_yAxis : + sensor.magnetometerMicroT_zAxis) ) : + "" + color: "white" + anchors.left: coordText.right + anchors.leftMargin: 16 + anchors.bottom: parent.bottom + font.pixelSize: 26 + } + } + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml b/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml new file mode 100644 index 0000000..a594257 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/ObjectTemperatureChart.qml @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import SensorTag.DataProvider 1.0 + +BaseChart { + id: objTempHolderRect + + property real minValue: Number.MAX_VALUE + property real maxValue: Number.MIN_VALUE + property real value: sensor ? sensor.infraredObjectTemperature.toFixed(1) : 0 + + title: qsTr("Object Temperature") + + onValueChanged: { + if (minValue > value) + minValue = value + if (maxValue < value) + maxValue = value + } + + content: Item { + id: container + + anchors.fill: parent + + CircularGauge { + id: gauge + + min: 10 + max: 40 + value: objTempHolderRect.value + anchors.centerIn: parent + } + + Text { + text: (minValue !== Number.MAX_VALUE ? minValue : "--") + "\nLo" + lineHeight: 0.7 + width: 60 + horizontalAlignment: Text.Center + color: "white" + anchors.centerIn: gauge + anchors.horizontalCenterOffset: -120 + anchors.verticalCenterOffset: 60 + font.pixelSize: 26 + } + + Text { + text: value + color: "white" + anchors.centerIn: gauge + font.pixelSize: 26 + } + + Text { + text: "Hi\n" + (maxValue !== Number.MIN_VALUE ? maxValue : "--") + lineHeight: 0.8 + width: 60 + horizontalAlignment: Text.Center + color: "white" + anchors.centerIn: gauge + anchors.horizontalCenterOffset: 120 + anchors.verticalCenterOffset: -30 + font.pixelSize: 26 + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/RotationPage.qml b/tradeshow/iot-sensortag/resources/base/RotationPage.qml new file mode 100644 index 0000000..a153c80 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/RotationPage.qml @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import SensorTag.DataProvider 1.0 + +Item { + id: dialerRoot + + property var sensor : singleSensorSource + property var rotationUpdateInterval: sensor ? sensor.rotationUpdateInterval : 0 + + property int sensorState: sensor ? sensor.state : SensorTagData.Disconnected + + onSensorStateChanged: { + if (sensorState === SensorTagData.Scanning) + sensorIcon.startBlinking(); + else + sensorIcon.stopBlinking(); + } + + Item { + anchors.fill: parent + + visible: sensorState === SensorTagData.Connected + + Image { + id: ring + anchors.centerIn: parent + source: pathPrefix + "Gyro/gyro_outer.png" + } + Image { + id: outerRing + anchors.centerIn: parent + source: pathPrefix + "Gyro/gyro_ring3.png" + rotation: sensor ? sensor.rotationX : 0 + Behavior on rotation { + RotationAnimator { + easing.type: Easing.Linear + duration: rotationUpdateInterval + direction: RotationAnimation.Shortest + } + } + } + Image { + id: largeRing + anchors.centerIn: parent + source: pathPrefix + "Gyro/gyro_ring2.png" + rotation: sensor ? sensor.rotationY : 0 + Behavior on rotation { + RotationAnimator { + easing.type: Easing.Linear + duration: rotationUpdateInterval + direction: RotationAnimation.Shortest + } + } + } + Image { + id: mediumRing + anchors.centerIn: parent + source: pathPrefix + "Gyro/gyro_ring1.png" + rotation: sensor ? sensor.rotationZ : 0 + Behavior on rotation { + RotationAnimator { + easing.type: Easing.Linear + duration: rotationUpdateInterval + direction: RotationAnimation.Shortest + } + } + } + Image { + id: centerRing + anchors.centerIn: parent + source: pathPrefix + "Gyro/gyro_center.png" + } + } + + Item { + id: connectingNote + + anchors.fill: parent + visible: sensorState === SensorTagData.Scanning || + sensorState === SensorTagData.Disconnected || + sensorState === SensorTagData.Error || + sensorState === SensorTagData.NotFound + + Column { + anchors.centerIn: parent + spacing: 20 + + BlinkingIcon { + id: sensorIcon + + source: pathPrefix + "Toolbar/icon_topbar_sensor.png" + anchors.horizontalCenter: parent.horizontalCenter + visible: sensorState === SensorTagData.Scanning + } + + Text { + id: stateText + + color: "white" + text: sensorState === SensorTagData.Scanning ? "Connecting to sensor..." + : sensorState === SensorTagData.Disconnected ? "Disconnected" + : sensorState === SensorTagData.NotFound ? "Device not found" + : "" + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/SensorSettings.qml b/tradeshow/iot-sensortag/resources/base/SensorSettings.qml new file mode 100644 index 0000000..5302816 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/SensorSettings.qml @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import Style 1.0 +import SensorTag.DataProvider 1.0 + +Rectangle { + id: sourceSelector + property alias sensorCount : sensorListView.count + property color selectedBackgroundColor : "#15bdff" + property color deselectedBackgroundColor: "transparent" + + color: "transparent" + width: 800 + height: 800 + anchors.horizontalCenter: parent.horizontalCenter + + function createSensorConnection() { + clickBait.deactivate() + + var currentPool = getCurrentPool(); + if (currentPool.dataProviders[sensorListView.currentIndex] === singleSensorSource) { + console.log("Same data provider selected, nothing to change...") + return; + } + + if (singleSensorSource) + singleSensorSource.endDataFetching(); + // UI gets information about the intended setup of the + // sensor even though they have not been really discovered yet + if (currentPool) { + singleSensorSource = currentPool.dataProviders[sensorListView.currentIndex] + currentPool.currentProviderIndex = sensorListView.currentIndex + + seriesStorage.setDataProviderPool(currentPool); + seriesStorage.dataProviderPoolChanged(); + + singleSensorSource.startDataFetching() + } + } + + Image { + source: "images/bg_blue.jpg" + anchors.fill: parent + } + + Image { + id: separator + source: pathPrefix + "General/separator.png" + anchors.top: parent.top + width: parent.width + transform: Rotation { + origin.x: separator.width / 2 + origin.y: separator.height / 2 + angle: 180 + } + } + + Rectangle { + id: buttonRect + anchors.top: separator.bottom + anchors.margins: 20 + color: "transparent" + width: parent.width - 20 + height: 40 + + Rectangle { + border.color: "white" + color: localSelected ? sourceSelector.selectedBackgroundColor : sourceSelector.deselectedBackgroundColor + anchors.top: parent.top + anchors.left: parent.left + width: parent.width / 2 + height: 30 + Text { + text: "Local" + anchors.centerIn: parent + color: "white" + font.pixelSize: 26 + } + } + + Rectangle { + border.color: "white" + color: !localSelected ? sourceSelector.selectedBackgroundColor : sourceSelector.deselectedBackgroundColor + anchors.top: parent.top + anchors.right: parent.right + width: parent.width / 2 + height: 30 + Text { + text: "Remote" + anchors.centerIn: parent + color: "white" + font.pixelSize: 26 + } + } + + MouseArea { + anchors.fill: parent + onClicked: localSelected = !localSelected + } + } + + ListView { + id: sensorListView + model: localSelected ? (localProviderPool ? localProviderPool.dataProviders : 0) + : (remoteProviderPool ? remoteProviderPool.dataProviders : 0) + + width: buttonRect.width + anchors.top: buttonRect.bottom + anchors.bottom: connectButton.top + focus: true + clip: true + + delegate: Rectangle { + border.color: "white" + color: ListView.isCurrentItem ? sourceSelector.selectedBackgroundColor + : sourceSelector.deselectedBackgroundColor + radius: 5 + height: 30 + width: parent.width + Text { + text: providerId + anchors.centerIn: parent + color: "white" + font.pixelSize: 26 + } + MouseArea { + anchors.fill: parent + onClicked: sensorListView.currentIndex = index + onDoubleClicked: { + sensorListView.currentIndex = index + createSensorConnection() + } + } + } + } + + Rectangle { + id: connectButton + width: buttonRect.width / 2 + height: 30 + anchors.bottom: bottomSeparator.top + anchors.right: parent.right + color: sensorListView.currentIndex != -1 ? sourceSelector.selectedBackgroundColor : "transparent" + border.color: "white" + Text { + text: "Connect" + anchors.centerIn: parent + color: "white" + font.pixelSize: 26 + } + MouseArea { + id: connectButtonArea + anchors.fill: parent + enabled: sensorListView.currentIndex != -1 + onClicked: createSensorConnection() + } + } + + Image { + id: bottomSeparator + source: pathPrefix + "General/separator.png" + anchors.bottom: parent.bottom + width: parent.width + } +} diff --git a/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml b/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml new file mode 100644 index 0000000..7a90dea --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/TemperatureChart.qml @@ -0,0 +1,204 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtCharts 2.1 +import SensorTag.DataProvider 1.0 +import QtGraphicalEffects 1.0 + +BaseChart { + id: tempHolderRect + + property int maxNumOfTempReadings: 30 + property real minimum: 10 + property real maximum: 40 + + property real defaultAvgValue: (maximum + minimum) / 2 + property real minValue: defaultAvgValue + property real maxValue: defaultAvgValue + property real value: sensor ? sensor.infraredAmbientTemperature : 0 + + readonly property color legendColor: "white" + readonly property color chartColor: "#15bdff" + + onValueChanged: { + if (minValue > value) + minValue = value; + if (maxValue < value) + maxValue = value; + } + + title: qsTr("Ambient Temperature") + + content: Item { + anchors.fill: parent + + Connections { + target: mainWindow + onSeriesStorageChanged: { + if (seriesStorage) + seriesStorage.setTemperatureSeries(avgTempSeries); + } + } + + Item { + id: valueReading + + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + height: parent.height - 32 + width: reading.width + avgText.width + + Text { + id: highValue + + text: "Hi " + (maxValue !== Number.MIN_VALUE ? maxValue.toFixed(1) : "--") + lineHeight: 0.7 + width: contentWidth + height: contentHeight + horizontalAlignment: Text.Center + anchors.horizontalCenter: reading.horizontalCenter + anchors.top: parent.top + color: "white" + font.pixelSize: 26 + } + + Image { + id: reading + source: pathPrefix + "Accelometer/outer_ring.png" + anchors.verticalCenter: parent.verticalCenter + anchors.right: avgText.left + + Text { + anchors.centerIn: parent + text: sensor ? sensor.infraredAmbientTemperature.toFixed(1) : "" + color: "white" + font.pixelSize: 26 + } + } + + Text { + id: lowValue + + text: "Lo " + (minValue !== Number.MAX_VALUE ? minValue.toFixed(1) : "--") + lineHeight: 0.8 + width: contentWidth + horizontalAlignment: Text.Center + color: "white" + anchors.bottom: parent.bottom + anchors.horizontalCenter: reading.horizontalCenter + font.pixelSize: 26 + } + + Text { + id: avgText + text: "Avg\n" + (sensor ? sensor.barometerTemperatureAverage.toFixed(1) : "") + lineHeight: 0.8 + width: contentWidth + horizontalAlignment: Text.Center + color: "white" + anchors.right: parent.right + anchors.verticalCenter: reading.verticalCenter + font.pixelSize: 26 + } + } + + Image { + source: pathPrefix + "AmbientTemperature/temp_sensor.png" + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + } + + ChartView { + id: chartView + + anchors.top: valueReading.top + anchors.topMargin: 25 + height: reading.height + anchors.left: parent.left + anchors.leftMargin: 15 + anchors.right: valueReading.left + anchors.rightMargin: -27 + antialiasing: true + backgroundColor: "transparent" + legend.visible: false + margins.top: 0 + margins.bottom: 0 + margins.left: 0 + margins.right: 0 + + // Hide the value axis labels; labels are drawn separately. + ValueAxis { + id: valueAxisX + + min: 0 + max: maxNumOfTempReadings - 1 + visible: false + } + + ValueAxis { + id: valueAxisY + + min: minimum + max: maximum + visible: false + } + + LineSeries { + id: avgTempSeries + + axisX: valueAxisX + axisY: valueAxisY + color: chartColor + width: 2 + useOpenGL: true + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/base/TopToolbar.qml b/tradeshow/iot-sensortag/resources/base/TopToolbar.qml new file mode 100644 index 0000000..bb0ecf9 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/TopToolbar.qml @@ -0,0 +1,229 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import SensorTag.DataProvider 1.0 +import Style 1.0 + +Item { + id: topToolbar + + height: 100 + width: implicitWidth + + property alias topbar: topbar + property alias date: dateLabel + + SensorSettings { + id: sensorList + + x: sensorItem.x + y: topToolbar.height + width: Math.min(mainWindow.width, 800) + height: mainWindow.height - topToolbar.height + visible: true + } + + Image { + id: logWindow + source: "images/bg_blue.jpg" + x: sensorItem.x + y: topToolbar.height + width: Math.min(mainWindow.width, 600) + height: Math.min(mainWindow.height - topToolbar.height, 400) + anchors.horizontalCenter: parent.horizontalCenter + visible: false + Text { + clip: true + color: "white" + font.pixelSize: 26 + text: mainWindow.loggingOutput ? mainWindow.loggingOutput : "...debug..." + anchors.fill: parent + anchors.margins: 15 + } + } + + + Item { + id: sensorItem + height: topToolbar.height + anchors.top: parent.top + anchors.left: parent.left //cloudItem.right + anchors.leftMargin: 8 + width: sensorIcon.width + sensorButton.width + 3 * anchors.leftMargin + + Image { + id: sensorIcon + + width: 40 + height: 40 + anchors.top: parent.top + anchors.margins: 8 + source: pathPrefix + "Toolbar/icon_topbar_sensor.png" + + Text { + anchors.centerIn: parent + text: sensorList.sensorCount + color: "white" + font.pixelSize: Style.topToolbarSmallFontSize + } + } + + Text { + id: sensorButton + + color: "white" + text: "SENSORS" + font.pixelSize: Style.topToolbarSmallFontSize + anchors.verticalCenter: sensorIcon.verticalCenter + anchors.left: sensorIcon.right + anchors.margins: 8 + } + + MouseArea { + anchors.fill: parent + onClicked: clickBait.activate(sensorList) + } + } + + Text { + id: dateLabel + property bool showAddress : false + text: showAddress ? mainWindow.addresses : Qt.formatDateTime(new Date, "dddd, MMMM d, yyyy") + color: "white" + anchors.bottom: parent.bottom + anchors.bottomMargin: 16 + anchors.right: timeLabel.left + anchors.rightMargin: 16 + horizontalAlignment: Text.AlignRight + font.pixelSize: Style.topToolbarSmallFontSize + font.capitalization: Font.AllUppercase + visible: rotationMain.visible + MouseArea { + anchors.fill: parent + onClicked: parent.showAddress = !parent.showAddress + } + } + + Text { + id: timeLabel + text: Qt.formatTime(new Date, "HH:mm") + color: "white" + font.pixelSize: Style.topToolbarLargeFontSize + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + MouseArea { + anchors.fill: parent + onClicked: clickBait.activate(logWindow) + } + } + + Timer { + interval: 60000 // Update time once a minute + running: true + repeat: true + onTriggered: timeLabel.text = Qt.formatTime(new Date, "HH:mm") + } + + Text { + id: utcGmt + text: "UTC/GMT" + color: "white" + visible: dateLabel.visible + anchors.left: timeLabel.right + anchors.leftMargin: 16 + anchors.bottom: parent.bottom + anchors.bottomMargin: 16 + font.pixelSize: Style.topToolbarSmallFontSize + Component.onCompleted: { + var date = new Date + var offsetString = -date.getTimezoneOffset() / 60 + if (offsetString < 0) + text = text + "-" + else + text = text + "+" + text = text + offsetString + } + } + + Image { + id: topbar + anchors.bottom: parent.bottom + anchors.bottomMargin: -18 + source: pathPrefix + "Toolbar/topbar_all.png" + } + + MouseArea { + id: clickBait + + property var menu + + function activate(menuItem) { + menu = menuItem; + menuItem.visible = true; + menuItem.parent = clickBait; + } + + function deactivate() { + menu.parent = topToolbar; + menu.visible = false; + menu = null; + } + + width: main.width + height: main.height + enabled: menu ? true : false + onClicked: { + if (!childAt(mouseX, mouseY)) + deactivate(); + } + } + + Component.onCompleted: clickBait.activate(sensorList) +} diff --git a/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Bold.ttf b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Bold.ttf new file mode 100755 index 0000000..0af0fe7 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Bold.ttf differ diff --git a/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Regular.ttf b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Regular.ttf new file mode 100755 index 0000000..6da8219 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-Regular.ttf differ diff --git a/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-SemiBold.ttf b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-SemiBold.ttf new file mode 100755 index 0000000..dfdcdbe Binary files /dev/null and b/tradeshow/iot-sensortag/resources/base/fonts/titilliumweb/TitilliumWeb-SemiBold.ttf differ diff --git a/tradeshow/iot-sensortag/resources/base/images/bg_blue.jpg b/tradeshow/iot-sensortag/resources/base/images/bg_blue.jpg new file mode 100644 index 0000000..bff57e8 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/base/images/bg_blue.jpg differ diff --git a/tradeshow/iot-sensortag/resources/base/main.qml b/tradeshow/iot-sensortag/resources/base/main.qml new file mode 100644 index 0000000..6662522 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/base/main.qml @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.6 +import QtQuick.Controls 2.2 +import QtQuick.Window 2.0 +import SensorTag.DataProvider 1.0 +import SensorTag.SeriesStorage 1.0 +import Style 1.0 + +ApplicationWindow { + id: mainWindow + + property var singleSensorSource : null + property alias contentFile: contentLoader.source + property DataProviderPool localProviderPool + property DataProviderPool remoteProviderPool + property SeriesStorage seriesStorage + property real globalBlinkOpacity: 1.0 + property string addresses : "" + property bool localSelected : true + property var loggingOutput : null + + function getCurrentPool() { + if (localSelected) + return localProviderPool + else + return remoteProviderPool + } + + // Size defaults to the small display + width: Style.width + height: Style.height + visible: true + color: "black" + + Image { + source: "images/bg_blue.jpg" + anchors.fill: parent + } + + Loader { + id: contentLoader + visible: true + anchors.fill: parent + anchors.centerIn: parent + } + + function startBlink() { + flash.blinkers++; + } + + function stopBlink() { + flash.blinkers--; + } + + // Animation to allow synchronized + // blinking of BlinkingIcons + SequentialAnimation { + id: flash + + property int blinkers: 0 + + running: blinkers + loops: Animation.Infinite + alwaysRunToEnd: true + + PropertyAnimation { + target: mainWindow + property: "globalBlinkOpacity" + to: 0.3 + duration: 700 + } + + PropertyAnimation { + target: mainWindow + property: "globalBlinkOpacity" + to: 1 + duration: 700 + } + } +} diff --git a/tradeshow/iot-sensortag/resources/small/MainSmall.qml b/tradeshow/iot-sensortag/resources/small/MainSmall.qml new file mode 100644 index 0000000..7528b6b --- /dev/null +++ b/tradeshow/iot-sensortag/resources/small/MainSmall.qml @@ -0,0 +1,182 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.6 +import SensorTag.DataProvider 1.0 +import "../base" + +Item { + id: main + + function startRescan(sensor) { + // ### Only do this magic when a local device is connected +// if (sensor.state === SensorTagData.NotFound) +// dataProviderPool.startScanning(); +// else if (sensor.state === SensorTagData.Scanning) +// dataProviderPool.disconnectProvider(sensor.providerId) +// else if (sensor.state !== SensorTagData.Connected) +// sensor.startServiceScan(); + } + + anchors.fill: parent + + Component.onCompleted: { + localProviderPool.startScanning(); + remoteProviderPool.startScanning(); + } + + Column { + id: leftPane + + property int indicatorHeight: (height - 3 * spacing) / 4 + + anchors.left: parent.left + anchors.leftMargin: 8 + anchors.top: topToolbar.bottom + anchors.bottom: main.bottom + width: 360 + spacing: 16 + + TemperatureChart { + id: ambientTemp + + width: leftPane.width + height: leftPane.indicatorHeight + onClicked: main.startRescan(sensor) + } + + ObjectTemperatureChart { + id: objectTemp + + width: leftPane.width + height: leftPane.indicatorHeight + onClicked: main.startRescan(sensor) + } + + HumidityChart { + id: humidity + + width: leftPane.width + height: leftPane.indicatorHeight + onClicked: main.startRescan(sensor) + } + + AltitudeChart { + id: airPressure + + width: leftPane.width + height: leftPane.indicatorHeight + onClicked: main.startRescan(sensor) + } + } + + Column { + id: rightPane + + anchors.right: parent.right + anchors.rightMargin: 8 + anchors.top: topToolbar.bottom + anchors.bottom: main.bottom + width: 360 + spacing: 16 + + LightChart { + id: light + + width: rightPane.width + height: rightPane.height / 4 + onClicked: main.startRescan(sensor) + } + + MagnetometerChart { + id: magnetometer + + width: rightPane.width + height: rightPane.height * 0.3 - 30 + onClicked: main.startRescan(sensor) + } + + GyroChart { + id: rotation + + width: rightPane.width + height: rightPane.height * 0.3 - 60 + onClicked: main.startRescan(sensor) + } + + AccelChart { + id: accelometer + + width: rightPane.width + height: rightPane.height - light.height - magnetometer.height - rotation.height - 3 * rightPane.spacing + onClicked: main.startRescan(sensor) + } + } + + RotationPage { + id: rotationMain + + visible: main.width > (leftPane.width + rightPane.width + 800) + anchors.top: topToolbar.bottom + anchors.left: leftPane.right + anchors.leftMargin: 32 + anchors.right: rightPane.left + anchors.rightMargin: 32 + anchors.bottom: parent.bottom + onSensorChanged: if (sensor) sensor.recalibrate() + } + + TopToolbar { + id: topToolbar + + anchors.top: main.top + anchors.left: main.left + anchors.right: main.right + } +} diff --git a/tradeshow/iot-sensortag/resources/small/StyleSmall.qml b/tradeshow/iot-sensortag/resources/small/StyleSmall.qml new file mode 100644 index 0000000..aa19262 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/small/StyleSmall.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +pragma Singleton +import QtQuick 2.0 + +QtObject { + property int indicatorTitleFontSize: 22 + property int indicatorTitleSize: 41 + + property int topToolbarSmallFontSize: 20 + property int topToolbarLargeFontSize: 62 + + property int height: 1080 + property int width: 1920 + + property string uiStyle: "small" // "watch",... +} diff --git a/tradeshow/iot-sensortag/resources/small/images/Accelometer/inner_ring.png b/tradeshow/iot-sensortag/resources/small/images/Accelometer/inner_ring.png new file mode 100644 index 0000000..aeaa36a Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Accelometer/inner_ring.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Accelometer/outer_ring.png b/tradeshow/iot-sensortag/resources/small/images/Accelometer/outer_ring.png new file mode 100644 index 0000000..80cd670 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Accelometer/outer_ring.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge.png b/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge.png new file mode 100644 index 0000000..296079f Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge_outer.png b/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge_outer.png new file mode 100644 index 0000000..b47b140 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Altitude/Altitude_base_gauge_outer.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Altitude/Height_bar.png b/tradeshow/iot-sensortag/resources/small/images/Altitude/Height_bar.png new file mode 100644 index 0000000..aa2cab6 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Altitude/Height_bar.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_ring.png b/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_ring.png new file mode 100644 index 0000000..49f05c5 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_ring.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_sensor.png b/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_sensor.png new file mode 100644 index 0000000..5311ff7 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/AmbientTemperature/temp_sensor.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/General/icon_sensor.png b/tradeshow/iot-sensortag/resources/small/images/General/icon_sensor.png new file mode 100644 index 0000000..a1286e8 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/General/icon_sensor.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/General/separator.png b/tradeshow/iot-sensortag/resources/small/images/General/separator.png new file mode 100644 index 0000000..59fbb96 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/General/separator.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_center.png b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_center.png new file mode 100644 index 0000000..af0b982 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_center.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_outer.png b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_outer.png new file mode 100644 index 0000000..b42ac3f Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_outer.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring1.png b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring1.png new file mode 100644 index 0000000..6b37ff5 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring1.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring2.png b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring2.png new file mode 100644 index 0000000..eee5057 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring2.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring3.png b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring3.png new file mode 100644 index 0000000..a2a7357 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Gyro/gyro_ring3.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Humidity/Hum_combined_all.png b/tradeshow/iot-sensortag/resources/small/images/Humidity/Hum_combined_all.png new file mode 100644 index 0000000..074ec24 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Humidity/Hum_combined_all.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Light/light_base_gauge.png b/tradeshow/iot-sensortag/resources/small/images/Light/light_base_gauge.png new file mode 100644 index 0000000..c537f42 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Light/light_base_gauge.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Light/light_brightness.png b/tradeshow/iot-sensortag/resources/small/images/Light/light_brightness.png new file mode 100644 index 0000000..710be6c Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Light/light_brightness.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_blue.png b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_blue.png new file mode 100644 index 0000000..b19269e Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_blue.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_green.png b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_green.png new file mode 100644 index 0000000..72bedea Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_green.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_orange.png b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_orange.png new file mode 100644 index 0000000..6120949 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_orange.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_red.png b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_red.png new file mode 100644 index 0000000..721a21c Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_display_obj_red.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_outer_inner_ring.png b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_outer_inner_ring.png new file mode 100644 index 0000000..2a81b5e Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/ObjectTemperature/objTemp_outer_inner_ring.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_button_change_active.png b/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_button_change_active.png new file mode 100644 index 0000000..6ecc7d3 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_button_change_active.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_icon_settings.png b/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_icon_settings.png new file mode 100644 index 0000000..a3c8972 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Toolbar/Cloud_icon_settings.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_cloud.png b/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_cloud.png new file mode 100644 index 0000000..b443a48 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_cloud.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_sensor.png b/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_sensor.png new file mode 100644 index 0000000..c7ef624 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Toolbar/icon_topbar_sensor.png differ diff --git a/tradeshow/iot-sensortag/resources/small/images/Toolbar/topbar_all.png b/tradeshow/iot-sensortag/resources/small/images/Toolbar/topbar_all.png new file mode 100644 index 0000000..992318b Binary files /dev/null and b/tradeshow/iot-sensortag/resources/small/images/Toolbar/topbar_all.png differ diff --git a/tradeshow/iot-sensortag/resources/watch/MainWatch.qml b/tradeshow/iot-sensortag/resources/watch/MainWatch.qml new file mode 100644 index 0000000..89cd8d6 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/watch/MainWatch.qml @@ -0,0 +1,301 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 2.2 +import SensorTag.DataProvider 1.0 +import "../base" + +Item { + id: main + + function startRescan(sensor) { + // ### Only do this magic when a local device is connected +// if (sensor.state === SensorTagData.NotFound) +// dataProviderPool.startScanning(); +// else if (sensor.state === SensorTagData.Scanning) +// dataProviderPool.disconnectProvider(sensor.providerId) +// else if (sensor.state !== SensorTagData.Connected) +// sensor.startServiceScan(); + } + + anchors.fill: parent + + Component.onCompleted: { + localProviderPool.startScanning(); + remoteProviderPool.startScanning(); + } + + property int titleFontSize: 22 + + SwipeView { + id: swipePane + currentIndex: 5 + anchors.left: main.left + anchors.leftMargin: 8 + anchors.top: topToolbar.bottom + anchors.bottom: main.bottom + width: main.width + height: main.height + + Item { + RotationPage { + scale: 0.35 + width: swipePane.width + height: swipePane.height + } + } + + Item { + Text { + text: qsTr("Ambient Temperature") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + TemperatureChart { + id: ambientTemp + width: swipePane.width + height: swipePane.height + onClicked: main.startRescan(sensor) + scale: 0.85 + title: "" + } + } + + Item { + Text { + text: qsTr("Object Temperature") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + ObjectTemperatureChart { + id: objectTemp + anchors.fill: parent + anchors.leftMargin: -40 + onClicked: main.startRescan(sensor) + scale: 0.8 + title: "" + } + } + + Item { + Text { + text: qsTr("Humidity") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + HumidityChart { + id: humidity + onClicked: main.startRescan(sensor) + title: "" + scale: 0.80 + anchors.fill: parent + anchors.leftMargin: -40 + anchors.topMargin: 17 + } + } + + Item { + Text { + text: qsTr("Altitude") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + AltitudeChart { + id: airPressure + width: swipePane.width + height: swipePane.height + onClicked: main.startRescan(sensor) + title: "" + scale: 0.80 + } + } + + Item { + Text { + text: qsTr("Light Intensity") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + LightChart { + id: light + height: swipePane.height + width: swipePane.width*1.1 + scale: 0.70 + onClicked: main.startRescan(sensor) + title: "" + } + } + + Item { + Text { + text: qsTr("Magnetometer") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + MagnetometerChart { + id: magnetometer + width: swipePane.width + height: swipePane.height + onClicked: main.startRescan(sensor) + title: "" + } + } + + Item { + Text { + text: qsTr("Gyroscope") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + GyroChart { + id: rotation + width: swipePane.width + height: swipePane.height + onClicked: main.startRescan(sensor) + title: "" + } + } + + Item { + Text { + text: qsTr("Accelometer") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + AccelChart { + id: accelometer + width: swipePane.width + height: swipePane.height + onClicked: main.startRescan(sensor) + title: "" + } + } + + Item { + Text { + text: qsTr("About") + anchors.fill: parent + color: "white" + font.pixelSize: titleFontSize + } + + Rectangle { + id: aboutView + width: swipePane.width + height: swipePane.height + color: "transparent" + + ColumnLayout { + id: aboutLayout + width: parent.width * 0.8 + height: parent.width * 0.8 + anchors.centerIn: parent + + Image { + source: "images/BuiltWithQt.png" + fillMode: Image.PreserveAspectFit + width: parent.width + Layout.maximumWidth: parent.width - 20 + Layout.maximumHeight: 100 + Layout.alignment: Qt.AlignHCenter + } + + Text { + id: qtLinkLabel + color: "white" + text: "Visit us at http://qt.io" + Layout.alignment: Qt.AlignHCenter + font.pixelSize: Style.indicatorTitleSize + } + + Text { + color: "white" + text: "qt.io/demos/IoTScale" + Layout.alignment: Qt.AlignHCenter + font.pixelSize: Style.indicatorTitleSize + } + } + } + } + + } + + TopToolbar { + id: topToolbar + anchors.top: main.top + anchors.left: main.left + anchors.right: main.right + height: 48 + topbar.visible: false + date.visible: false + Image { + id: quit + source: "images/Toolbar/exit_button.png" + fillMode: Image.PreserveAspectFit + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 5 + scale: 0.7 + MouseArea { + anchors.fill: parent + onClicked: Qt.quit() + } + } + } +} diff --git a/tradeshow/iot-sensortag/resources/watch/StyleWatch.qml b/tradeshow/iot-sensortag/resources/watch/StyleWatch.qml new file mode 100644 index 0000000..857b0f1 --- /dev/null +++ b/tradeshow/iot-sensortag/resources/watch/StyleWatch.qml @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +pragma Singleton +import QtQuick 2.0 + +QtObject { + property int indicatorTitleFontSize: 22 + property int indicatorTitleSize: 20 + + property int topToolbarSmallFontSize: 10 + property int topToolbarLargeFontSize: 30 + + property int height: 320 + property int width: 320 + + property string uiStyle: "watch" +} diff --git a/tradeshow/iot-sensortag/resources/watch/images/BuiltWithQt.png b/tradeshow/iot-sensortag/resources/watch/images/BuiltWithQt.png new file mode 100644 index 0000000..7e56de7 Binary files /dev/null and b/tradeshow/iot-sensortag/resources/watch/images/BuiltWithQt.png differ diff --git a/tradeshow/iot-sensortag/resources/watch/images/Toolbar/exit_button.png b/tradeshow/iot-sensortag/resources/watch/images/Toolbar/exit_button.png new file mode 100644 index 0000000..06f2ebe Binary files /dev/null and b/tradeshow/iot-sensortag/resources/watch/images/Toolbar/exit_button.png differ diff --git a/tradeshow/iot-sensortag/sensortagdataprovider.cpp b/tradeshow/iot-sensortag/sensortagdataprovider.cpp new file mode 100644 index 0000000..409b95a --- /dev/null +++ b/tradeshow/iot-sensortag/sensortagdataprovider.cpp @@ -0,0 +1,280 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "sensortagdataprovider.h" + +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +#define DEFAULT_REFRESH_INTERVAL_MS 1000 + +/* + Constants used in hypsometric formula + + h = (AIR_PRESSURE_P0 / p) ^ PRESSURE_EXPONENT - 1) * (T + ZERO_TEMP) + --------------------------------------------------------------- + DIVIDER +*/ +#define AIR_PRESSURE_P0 1013.25 // in hPa +#define ZERO_TEMP 273.15 // in Kelvin +#define PRESSURE_EXPONENT (1 / 5.257) +#define DIVIDER 0.0065 + +SensorTagDataProvider::SensorTagDataProvider(QObject *parent) + : QObject(parent) + , pressureAtZeroAltitude(AIR_PRESSURE_P0) +{ +} + +SensorTagDataProvider::SensorTagDataProvider(QString id, QObject *parent) + : QObject(parent) + , humidity(0) + , irAmbientTemperature(0) + , irObjectTemperature(0) + , lightIntensityLux(0) + , barometerCelsiusTemperature(0) + , barometerTemperatureAverage(25) + , barometerHPa(0) + , gyroscopeX_degPerSec(0) + , gyroscopeY_degPerSec(0) + , gyroscopeZ_degPerSec(0) + , accelometerX(0) + , accelometerY(0) + , accelometerZ(0) + /* Object is not "walking in the air" so have one axis at 1G */ + , magnetometerMicroT_xAxis(-1) + , magnetometerMicroT_yAxis(0) + , magnetometerMicroT_zAxis(0) + , rotation_x(0) + , rotation_y(0) + , rotation_z(0) + , intervalRotation(DEFAULT_REFRESH_INTERVAL_MS) + , altitude(0) + , m_tagType(AmbientTemperature | ObjectTemperature | Humidity | AirPressure | Light | Magnetometer | Rotation | Accelometer | Altitude) + , m_id(id) + , m_state(NotFound) +{ +} + +QString SensorTagDataProvider::getRelativeHumidityString() const +{ + return QString::number(humidity) + QLatin1String("%"); +} + +double SensorTagDataProvider::getRelativeHumidity() const +{ + return humidity; +} + +double SensorTagDataProvider::getInfraredAmbientTemperature() const +{ + return irAmbientTemperature; +} + +double SensorTagDataProvider::getInfraredObjectTemperature() const +{ + return irObjectTemperature; +} + +QString SensorTagDataProvider::getLightIntensityLuxString() const +{ + return QString::number(lightIntensityLux) + QLatin1String(" Lux"); +} + +double SensorTagDataProvider::getLightIntensityLux() const +{ + return lightIntensityLux; +} + +double SensorTagDataProvider::getBarometerCelsiusTemperature() const +{ + return barometerCelsiusTemperature; +} + +QString SensorTagDataProvider::getBarometerCelsiusTemperatureString() const +{ + return QString::number(barometerCelsiusTemperature) + QString("\u00B0C"); +} + +double SensorTagDataProvider::getBarometerTemperatureAverage() const +{ + return barometerTemperatureAverage; +} + +QString SensorTagDataProvider::getBarometer_hPaString() const +{ + return QString::number(barometerHPa) + QLatin1String(" hPa"); +} + +double SensorTagDataProvider::getBarometer_hPa() const +{ + return barometerHPa; +} + +float SensorTagDataProvider::getGyroscopeX_degPerSec() const +{ + return gyroscopeX_degPerSec; +} + +float SensorTagDataProvider::getGyroscopeY_degPerSec() const +{ + return gyroscopeY_degPerSec; +} + +float SensorTagDataProvider::getGyroscopeZ_degPerSec() const +{ + return gyroscopeZ_degPerSec; +} + +float SensorTagDataProvider::getAccelometer_xAxis() const +{ + return accelometerX; +} + +float SensorTagDataProvider::getAccelometer_yAxis() const +{ + return accelometerY; +} + +float SensorTagDataProvider::getAccelometer_zAxis() const +{ + return accelometerZ; +} + +float SensorTagDataProvider::getMagnetometerMicroT_xAxis() const +{ + return magnetometerMicroT_xAxis; +} + +float SensorTagDataProvider::getMagnetometerMicroT_yAxis() const +{ + return magnetometerMicroT_yAxis; +} + +float SensorTagDataProvider::getMagnetometerMicroT_zAxis() const +{ + return magnetometerMicroT_zAxis; +} + +float SensorTagDataProvider::getRotationX() const +{ + return rotation_x; +} + +float SensorTagDataProvider::getRotationY() const +{ + return rotation_y; +} + +float SensorTagDataProvider::getRotationZ() const +{ + return rotation_z; +} + +int SensorTagDataProvider::getRotationUpdateInterval() const +{ + return intervalRotation; +} + +float SensorTagDataProvider::getAltitude() const +{ + return altitude; +} + +int SensorTagDataProvider::tagType() const +{ + return m_tagType; +} + +void SensorTagDataProvider::setTagType(int tagType) +{ + m_tagType = tagType; +} + +QString SensorTagDataProvider::id() const +{ + return m_id; +} + +SensorTagDataProvider::ProviderState SensorTagDataProvider::state() const +{ + return m_state; +} + +void SensorTagDataProvider::setState(SensorTagDataProvider::ProviderState state) +{ + if (state != m_state) { + m_state = state; + emit stateChanged(); + } +} + +void SensorTagDataProvider::reset() +{ + qCDebug(boot2QtDemos) << "Attempt to reset sensortag that doesn't have reset functionality implemented!"; +} + +void SensorTagDataProvider::recalibrate() +{ + reset(); +} + +void SensorTagDataProvider::calculateZeroAltitude() +{ + float newAltitude = (pow(pressureAtZeroAltitude + / barometerHPa, PRESSURE_EXPONENT) - 1) + * (barometerCelsiusTemperature + ZERO_TEMP) / DIVIDER; + if (newAltitude != altitude) { + altitude = newAltitude; + emit altitudeChanged(); + } +} diff --git a/tradeshow/iot-sensortag/sensortagdataprovider.h b/tradeshow/iot-sensortag/sensortagdataprovider.h new file mode 100644 index 0000000..f3a6dcb --- /dev/null +++ b/tradeshow/iot-sensortag/sensortagdataprovider.h @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef SENSORTAGDATAPROVIDER_H +#define SENSORTAGDATAPROVIDER_H + +#include +#include +#include +#include + +class SensorTagDataProvider : public QObject +{ + Q_OBJECT + Q_ENUMS(TagType) + Q_ENUMS(ProviderState) + Q_PROPERTY(ProviderState state READ state NOTIFY stateChanged) + Q_PROPERTY(QString name MEMBER m_name CONSTANT) + Q_PROPERTY(QString providerId MEMBER m_id CONSTANT) + Q_PROPERTY(QString relativeHumidityString READ getRelativeHumidityString NOTIFY relativeHumidityChanged) + Q_PROPERTY(double relativeHumidity READ getRelativeHumidity NOTIFY relativeHumidityChanged) + Q_PROPERTY(double infraredAmbientTemperature READ getInfraredAmbientTemperature NOTIFY infraredAmbientTemperatureChanged) + Q_PROPERTY(double infraredObjectTemperature READ getInfraredObjectTemperature NOTIFY infraredObjectTemperatureChanged) + Q_PROPERTY(QString lightIntensityLuxString READ getLightIntensityLuxString NOTIFY lightIntensityChanged) + Q_PROPERTY(double lightIntensityLux READ getLightIntensityLux NOTIFY lightIntensityChanged) + Q_PROPERTY(double barometerCelsiusTemperature READ getBarometerCelsiusTemperature NOTIFY barometerCelsiusTemperatureChanged) + Q_PROPERTY(QString barometerCelsiusTemperatureString READ getBarometerCelsiusTemperatureString NOTIFY barometerCelsiusTemperatureChanged) + Q_PROPERTY(QString barometer_hPaString READ getBarometer_hPaString NOTIFY barometer_hPaChanged) + Q_PROPERTY(double barometerTemperatureAverage READ getBarometerTemperatureAverage NOTIFY barometerCelsiusTemperatureAverageChanged) + Q_PROPERTY(double barometerHPa READ getBarometer_hPa NOTIFY barometer_hPaChanged) + Q_PROPERTY(float gyroscopeX_degPerSec READ getGyroscopeX_degPerSec NOTIFY gyroscopeDegPerSecChanged) + Q_PROPERTY(float gyroscopeY_degPerSec READ getGyroscopeY_degPerSec NOTIFY gyroscopeDegPerSecChanged) + Q_PROPERTY(float gyroscopeZ_degPerSec READ getGyroscopeZ_degPerSec NOTIFY gyroscopeDegPerSecChanged) + Q_PROPERTY(float accelometer_xAxis READ getAccelometer_xAxis NOTIFY accelometerChanged) + Q_PROPERTY(float accelometer_yAxis READ getAccelometer_yAxis NOTIFY accelometerChanged) + Q_PROPERTY(float accelometer_zAxis READ getAccelometer_zAxis NOTIFY accelometerChanged) + Q_PROPERTY(float magnetometerMicroT_xAxis READ getMagnetometerMicroT_xAxis NOTIFY magnetometerMicroTChanged) + Q_PROPERTY(float magnetometerMicroT_yAxis READ getMagnetometerMicroT_yAxis NOTIFY magnetometerMicroTChanged) + Q_PROPERTY(float magnetometerMicroT_zAxis READ getMagnetometerMicroT_zAxis NOTIFY magnetometerMicroTChanged) + Q_PROPERTY(float rotationX READ getRotationX NOTIFY rotationXChanged) + Q_PROPERTY(float rotationY READ getRotationY NOTIFY rotationYChanged) + Q_PROPERTY(float rotationZ READ getRotationZ NOTIFY rotationZChanged) + Q_PROPERTY(int rotationUpdateInterval READ getRotationUpdateInterval NOTIFY rotationUpdateIntervalChanged) + Q_PROPERTY(float altitude READ getAltitude NOTIFY altitudeChanged) + +public: + enum TagType { AmbientTemperature = 1 << 0, + ObjectTemperature = 1 << 1, + Humidity = 1 << 2, + AirPressure = 1 << 3, + Light = 1 << 4, + Magnetometer = 1 << 5, + Rotation = 1 << 6, + Accelometer = 1 << 7, + Altitude = 1 << 8 + }; + static const int tagTypeCount = 9; + enum ProviderState { + NotFound = 0, + Disconnected, + Scanning, + Connected, + Error + }; + + explicit SensorTagDataProvider(QObject *parent = 0); + SensorTagDataProvider(QString id, QObject *parent = 0); + + Q_INVOKABLE virtual bool startDataFetching() {return false;} + Q_INVOKABLE virtual void endDataFetching() {} + QString getRelativeHumidityString() const; + virtual double getRelativeHumidity() const; + virtual double getInfraredAmbientTemperature() const; + virtual double getInfraredObjectTemperature() const; + QString getLightIntensityLuxString() const; + virtual double getLightIntensityLux() const; + virtual double getBarometerCelsiusTemperature() const; + QString getBarometerCelsiusTemperatureString() const; + virtual double getBarometerTemperatureAverage() const; + QString getBarometer_hPaString() const; + virtual double getBarometer_hPa() const; + virtual float getGyroscopeX_degPerSec() const; + virtual float getGyroscopeY_degPerSec() const; + virtual float getGyroscopeZ_degPerSec() const; + virtual float getAccelometer_xAxis() const; + virtual float getAccelometer_yAxis() const; + virtual float getAccelometer_zAxis() const; + virtual float getMagnetometerMicroT_xAxis() const; + virtual float getMagnetometerMicroT_yAxis() const; + virtual float getMagnetometerMicroT_zAxis() const; + virtual float getRotationX() const; + virtual float getRotationY() const; + virtual float getRotationZ() const; + int getRotationUpdateInterval() const; + virtual float getAltitude() const; + + Q_INVOKABLE virtual int tagType() const; + void setTagType(int tagType); + virtual QString id() const; + ProviderState state() const; + void setState(ProviderState state); + + virtual QString providerName() const { return m_name;} + virtual QString sensorType() const { return QString();} + virtual QString versionString() const{ return QString();} + +public slots: + void recalibrate(); + +signals: + void stateChanged(); + void relativeHumidityChanged(); + void infraredAmbientTemperatureChanged(); + void infraredObjectTemperatureChanged(); + void lightIntensityChanged(); + void barometerCelsiusTemperatureChanged(); + void barometerCelsiusTemperatureAverageChanged(); + void barometer_hPaChanged(); + void gyroscopeDegPerSecChanged(); + void accelometerChanged(); + void magnetometerMicroTChanged(); + void rotationXChanged(); + void rotationYChanged(); + void rotationZChanged(); + void rotationValuesChanged(); + void rotationUpdateIntervalChanged(); + void altitudeChanged(); + +protected: + virtual void reset(); + virtual void calculateZeroAltitude(); + + double humidity; + double irAmbientTemperature; + double irObjectTemperature; + double lightIntensityLux; + double barometerCelsiusTemperature; + double barometerTemperatureAverage; + double barometerHPa; + float gyroscopeX_degPerSec; + float gyroscopeY_degPerSec; + float gyroscopeZ_degPerSec; + float accelometerX; + float accelometerY; + float accelometerZ; + float magnetometerMicroT_xAxis; + float magnetometerMicroT_yAxis; + float magnetometerMicroT_zAxis; + float rotation_x; + float rotation_y; + float rotation_z; + int intervalRotation; + float pressureAtZeroAltitude; + float altitude; + int m_tagType; + QString m_id; + QString m_name; + ProviderState m_state; +}; + +Q_DECLARE_METATYPE(SensorTagDataProvider::TagType) +Q_DECLARE_METATYPE(SensorTagDataProvider::ProviderState) + +#endif // SENSORTAGDATAPROVIDER_H diff --git a/tradeshow/iot-sensortag/sensortagdataproviderpool.cpp b/tradeshow/iot-sensortag/sensortagdataproviderpool.cpp new file mode 100644 index 0000000..3b66d90 --- /dev/null +++ b/tradeshow/iot-sensortag/sensortagdataproviderpool.cpp @@ -0,0 +1,183 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "bluetoothdataprovider.h" +#include "sensortagdataproviderpool.h" + +#include + +Q_DECLARE_LOGGING_CATEGORY(boot2QtDemos) + +SensorTagDataProviderPool::SensorTagDataProviderPool(QObject *parent) + : SensorTagDataProviderPool("SensorTag", parent) +{ +} + +SensorTagDataProviderPool::SensorTagDataProviderPool(QString poolName, QObject *parent) + : DataProviderPool(poolName, parent) +{ + m_discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); + connect(m_discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, + this, &SensorTagDataProviderPool::btDeviceFound); + connect(m_discoveryAgent, QOverload::of(&QBluetoothDeviceDiscoveryAgent::error), + this, &SensorTagDataProviderPool::deviceScanError); + connect(m_discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, + this, &SensorTagDataProviderPool::deviceDiscoveryFinished); +} + +void SensorTagDataProviderPool::startScanning() +{ + m_discoveryAgent->setLowEnergyDiscoveryTimeout(0); + m_discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod); + + if (m_discoveryAgent->isActive()) { + emit scanStarted(); + } +} + +void SensorTagDataProviderPool::disconnectProvider(const QString &id) +{ + SensorTagDataProvider *p = findProvider(id); + if (BluetoothDataProvider *btp = qobject_cast(findProvider(id))) + btp->unbindDevice(); + else if (p) + p->setState(SensorTagDataProvider::Disconnected); +} + +SensorTagDataProvider *SensorTagDataProviderPool::providerForCloud() const +{ + return m_providerForCloud; +} + +// Currently, return simply the first provider found. +// It might be better to somehow collect the results from +// all providers and combine them +void SensorTagDataProviderPool::updateProviderForCloud() +{ + if (m_dataProviders.length()) + m_providerForCloud = m_dataProviders.at(0); + else + m_providerForCloud = 0; + emit providerForCloudChanged(); +} + +void SensorTagDataProviderPool::deviceDiscoveryFinished() +{ + finishScanning(); + emit scanFinished(); +} + +void SensorTagDataProviderPool::finishScanning() +{ + updateProviderForCloud(); +} + +void SensorTagDataProviderPool::btDeviceFound(const QBluetoothDeviceInfo &info) +{ + if (info.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration) { + // all tags by TI have this naming convention + if (info.name().contains(QLatin1String("SensorTag")) && !m_knownDevices.contains(info)) { + qCDebug(boot2QtDemos) << "Found a new device:" << info.name(); + m_knownDevices.append(info); + BluetoothDataProvider *p = new BluetoothDataProvider(info, this); + m_dataProviders.push_back(p); + connect(p, &SensorTagDataProvider::stateChanged, + this, &SensorTagDataProviderPool::handleStateChange); + + emit dataProvidersChanged(); + + // Set initial state to Scanning for UI to be + // able to show "Connecting.." information + p->setState(SensorTagDataProvider::Scanning); + } + } +} + +void SensorTagDataProviderPool::handleStateChange() +{ + SensorTagDataProvider *provider = static_cast(sender()); + + switch (provider->state()) { + case SensorTagDataProvider::Disconnected: + updateProviderForCloud(); + emit providerDisconnected(provider->id()); + break; + case SensorTagDataProvider::Connected: + updateProviderForCloud(); + emit providerConnected(provider->id()); + break; + case SensorTagDataProvider::Error: + emit providerInError(provider->id()); + break; + default: + break; + } +} + +void SensorTagDataProviderPool::deviceScanError(QBluetoothDeviceDiscoveryAgent::Error error) +{ + if (error == QBluetoothDeviceDiscoveryAgent::PoweredOffError) + qCDebug(boot2QtDemos) << "The Bluetooth adaptor is powered off, power it on before doing discovery."; + else if (error == QBluetoothDeviceDiscoveryAgent::InputOutputError) + qCDebug(boot2QtDemos) << "Writing or reading from the device resulted in an error."; + else + qCDebug(boot2QtDemos) << "An unknown error has occurred."; + + emit scanFinished(); +} + +SensorTagDataProvider *SensorTagDataProviderPool::findProvider(QString id) const +{ + for (SensorTagDataProvider *p : m_dataProviders) { + if (id == p->id()) + return p; + } + return 0; +} diff --git a/tradeshow/iot-sensortag/sensortagdataproviderpool.h b/tradeshow/iot-sensortag/sensortagdataproviderpool.h new file mode 100644 index 0000000..6353d24 --- /dev/null +++ b/tradeshow/iot-sensortag/sensortagdataproviderpool.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef SENSORTAGDATAPROVIDERPOOL_H +#define SENSORTAGDATAPROVIDERPOOL_H + +#include "dataproviderpool.h" +#include "bluetoothdevice.h" + +#include +#include +#include +#include + +class SensorTagDataProviderPool : public DataProviderPool +{ + Q_OBJECT + +public: + explicit SensorTagDataProviderPool(QObject *parent = 0); + + void startScanning() override; + void disconnectProvider(const QString &id) override; + + SensorTagDataProvider *providerForCloud() const override; + +protected: + SensorTagDataProviderPool(QString poolName, QObject *parent = 0); + virtual void finishScanning(); + void updateProviderForCloud(); + +private slots: + void deviceDiscoveryFinished(); + void btDeviceFound(const QBluetoothDeviceInfo &info); + void handleStateChange(); + void deviceScanError(QBluetoothDeviceDiscoveryAgent::Error error); + +private: + SensorTagDataProvider *findProvider(QString id) const; + + QBluetoothDeviceDiscoveryAgent *m_discoveryAgent; + QList m_knownDevices; + SensorTagDataProvider *m_providerForCloud; +}; + +#endif // SENSORTAGDATAPROVIDERPOOL_H diff --git a/tradeshow/iot-sensortag/seriesstorage.cpp b/tradeshow/iot-sensortag/seriesstorage.cpp new file mode 100644 index 0000000..5c032d8 --- /dev/null +++ b/tradeshow/iot-sensortag/seriesstorage.cpp @@ -0,0 +1,195 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "seriesstorage.h" + +Q_DECLARE_METATYPE(QAbstractSeries *) +Q_DECLARE_METATYPE(QAbstractAxis *) + +inline void updatePoints(QList &list, int newIndex, float newValue, int maxItems) +{ + list.append(QPointF(newIndex, newValue)); + if (list.size() > maxItems) + list.removeFirst(); +} + +SeriesStorage::SeriesStorage(QObject *parent) : QObject(parent) +{ + for (int i = 0; i < 30; i++) + m_temperatureList.append(QPointF(i, 30)); +} + +void SeriesStorage::setDataProviderPool(DataProviderPool *pool) +{ + m_providerPool = pool; + if (!m_providerPool) + return; + connect(m_providerPool, &DataProviderPool::currentProviderIndexChanged, this, &SeriesStorage::dataProviderPoolChanged); +} + +void SeriesStorage::setTemperatureSeries(QAbstractSeries *series) +{ + m_temperature = qobject_cast(series); +} + +void SeriesStorage::setGyroSeries(QAbstractSeries *xSeries, QAbstractSeries *ySeries, QAbstractSeries *zSeries) +{ + m_gyroX = qobject_cast(xSeries); + m_gyroY = qobject_cast(ySeries); + m_gyroZ = qobject_cast(zSeries); +} + +void SeriesStorage::setMagnetoMeterSeries(QAbstractSeries *xSeries, QAbstractSeries *ySeries, QAbstractSeries *zSeries) +{ + m_magnetoX = qobject_cast(xSeries); + m_magnetoY = qobject_cast(ySeries); + m_magnetoZ = qobject_cast(zSeries); +} + +void SeriesStorage::dataProviderPoolChanged() +{ + m_gyroProvider = m_providerPool->currentProvider(); + if (m_gyroProvider) + connect(m_gyroProvider, &SensorTagDataProvider::rotationValuesChanged, + this, &SeriesStorage::changeRotationSeries, Qt::UniqueConnection); + + m_magnetoProvider = m_providerPool->currentProvider(); + if (m_magnetoProvider) + connect(m_magnetoProvider, &SensorTagDataProvider::magnetometerMicroTChanged, + this, &SeriesStorage::changeMagnetoSeries, Qt::UniqueConnection); + + m_temperatureProvider = m_providerPool->currentProvider(); + if (m_temperatureProvider) + connect(m_temperatureProvider, &SensorTagDataProvider::infraredAmbientTemperatureChanged, + this, &SeriesStorage::changeTemperatureSeries, Qt::UniqueConnection); +} + +void SeriesStorage::changeRotationSeries() +{ + if (!m_gyroX || !m_gyroY || !m_gyroZ) + return; + + static int gyroSeriesIndex = 0; + static const int maxGyroReadings = 24; + static int axisMin = 0; + static int axisMax = maxGyroReadings + 1; + + updatePoints(m_gyroListX, gyroSeriesIndex, m_gyroProvider->getRotationX(), maxGyroReadings); + m_gyroX->replace(m_gyroListX); + updatePoints(m_gyroListY, gyroSeriesIndex, m_gyroProvider->getRotationY(), maxGyroReadings); + m_gyroY->replace(m_gyroListY); + updatePoints(m_gyroListZ, gyroSeriesIndex, m_gyroProvider->getRotationZ(), maxGyroReadings); + m_gyroZ->replace(m_gyroListZ); + + if (gyroSeriesIndex >= maxGyroReadings) { + QAbstractAxis *axis = m_gyroX->attachedAxes().at(0); + axisMin++; + axisMax++; + axis->setRange(axisMin, axisMax); + } + gyroSeriesIndex++; +} + +void SeriesStorage::changeMagnetoSeries() +{ + if (!m_magnetoX || !m_magnetoY || !m_magnetoZ) + return; + + static int magneticSeriesIndex = 0; + static const int maxMagneticReadings = 24; + static int axisMin = 0; + static int axisMax = maxMagneticReadings; + + updatePoints(m_magnetoListX, magneticSeriesIndex, + m_magnetoProvider->getMagnetometerMicroT_xAxis(), maxMagneticReadings); + m_magnetoX->replace(m_magnetoListX); + updatePoints(m_magnetoListY, magneticSeriesIndex, + m_magnetoProvider->getMagnetometerMicroT_yAxis(), maxMagneticReadings); + m_magnetoY->replace(m_magnetoListY); + updatePoints(m_magnetoListZ, magneticSeriesIndex, + m_magnetoProvider->getMagnetometerMicroT_zAxis(), maxMagneticReadings); + m_magnetoZ->replace(m_magnetoListZ); + + if (magneticSeriesIndex >= maxMagneticReadings) { + QAbstractAxis *axis = m_magnetoX->attachedAxes().at(0); + axisMin++; + axisMax++; + axis->setRange(axisMin, axisMax); + } + magneticSeriesIndex++; +} + +void SeriesStorage::changeTemperatureSeries() +{ + if (!m_temperature) + return; + + static const int maxTemperatureReadings = 30; + static int temperatureSeriesIndex = maxTemperatureReadings; + static int axisMin = 0; + static int axisMax = maxTemperatureReadings - 1; + static const int defaultAvgValue = 25; + + m_temperatureList.removeLast(); + m_temperatureList.append(QPointF(temperatureSeriesIndex - 1, m_temperatureProvider->getInfraredAmbientTemperature())); + m_temperatureList.append(QPointF(temperatureSeriesIndex, defaultAvgValue)); + + if (m_temperatureList.size() >= maxTemperatureReadings) + m_temperatureList.removeFirst(); + + if (temperatureSeriesIndex >= maxTemperatureReadings) { + QAbstractAxis *axis = m_temperature->attachedAxes().at(0); + axisMin++; + axisMax++; + axis->setRange(axisMin, axisMax); + } + m_temperature->replace(m_temperatureList); + temperatureSeriesIndex++; +} diff --git a/tradeshow/iot-sensortag/seriesstorage.h b/tradeshow/iot-sensortag/seriesstorage.h new file mode 100644 index 0000000..5bc40bb --- /dev/null +++ b/tradeshow/iot-sensortag/seriesstorage.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef SERIESSTORAGE_H +#define SERIESSTORAGE_H + +#include "dataproviderpool.h" + +#include +#include + +QT_CHARTS_USE_NAMESPACE + +class SeriesStorage : public QObject +{ + Q_OBJECT +public: + explicit SeriesStorage(QObject *parent = nullptr); + + Q_INVOKABLE void setDataProviderPool(DataProviderPool *pool); + Q_INVOKABLE void setTemperatureSeries(QAbstractSeries *series); + Q_INVOKABLE void setGyroSeries(QAbstractSeries *xSeries, QAbstractSeries *ySeries, + QAbstractSeries *zSeries); + Q_INVOKABLE void setMagnetoMeterSeries(QAbstractSeries *xSeries, QAbstractSeries *ySeries, + QAbstractSeries *zSeries); +signals: + +public slots: + void dataProviderPoolChanged(); + + void changeRotationSeries(); + void changeMagnetoSeries(); + void changeTemperatureSeries(); + +private: + DataProviderPool *m_providerPool; + SensorTagDataProvider *m_temperatureProvider{0}; + SensorTagDataProvider *m_gyroProvider{0}; + SensorTagDataProvider *m_magnetoProvider{0}; + QSplineSeries *m_gyroX{0}; + QSplineSeries *m_gyroY{0}; + QSplineSeries *m_gyroZ{0}; + QLineSeries *m_magnetoX{0}; + QLineSeries *m_magnetoY{0}; + QLineSeries *m_magnetoZ{0}; + QLineSeries *m_temperature{0}; + QList m_gyroListX; + QList m_gyroListY; + QList m_gyroListZ; + QList m_magnetoListX; + QList m_magnetoListY; + QList m_magnetoListZ; + QList m_temperatureList; + +}; + +#endif // SERIESSTORAGE_H diff --git a/tradeshow/iot-sensortag/serviceinfo.cpp b/tradeshow/iot-sensortag/serviceinfo.cpp new file mode 100644 index 0000000..686e8f6 --- /dev/null +++ b/tradeshow/iot-sensortag/serviceinfo.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "serviceinfo.h" + +ServiceInfo::ServiceInfo() +{ +} + +ServiceInfo::ServiceInfo(QLowEnergyService *service): + m_service(service) +{ + m_service->setParent(this); +} + +QLowEnergyService *ServiceInfo::service() const +{ + return m_service; +} + +QString ServiceInfo::getName() const +{ + if (!m_service) + return QString(); + + return m_service->serviceName(); +} + +QString ServiceInfo::getType() const +{ + if (!m_service) + return QString(); + + QString result; + if (m_service->type() & QLowEnergyService::PrimaryService) + result += QStringLiteral("primary"); + else + result += QStringLiteral("secondary"); + + if (m_service->type() & QLowEnergyService::IncludedService) + result += QStringLiteral(" included"); + + result.prepend('<').append('>'); + + return result; +} + +QString ServiceInfo::getUuid() const +{ + if (!m_service) + return QString(); + + const QBluetoothUuid uuid = m_service->serviceUuid(); + bool success = false; + const quint16 result16 = uuid.toUInt16(&success); + if (success) + return QStringLiteral("0x") + QString::number(result16, 16); + + const quint32 result32 = uuid.toUInt32(&success); + if (success) + return QStringLiteral("0x") + QString::number(result32, 16); + + return uuid.toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')); +} diff --git a/tradeshow/iot-sensortag/serviceinfo.h b/tradeshow/iot-sensortag/serviceinfo.h new file mode 100644 index 0000000..e6c1e51 --- /dev/null +++ b/tradeshow/iot-sensortag/serviceinfo.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef SERVICEINFO_H +#define SERVICEINFO_H + +#include + +class ServiceInfo: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString serviceName READ getName NOTIFY serviceChanged) + Q_PROPERTY(QString serviceUuid READ getUuid NOTIFY serviceChanged) + Q_PROPERTY(QString serviceType READ getType NOTIFY serviceChanged) +public: + ServiceInfo(); + ServiceInfo(QLowEnergyService *service); + QLowEnergyService *service() const; + QString getUuid() const; + QString getName() const; + QString getType() const; + +Q_SIGNALS: + void serviceChanged(); + +private: + QLowEnergyService *m_service; +}; + +#endif // SERVICEINFO_H diff --git a/tradeshow/iot-sensortag/uismall.qrc b/tradeshow/iot-sensortag/uismall.qrc new file mode 100644 index 0000000..1d18373 --- /dev/null +++ b/tradeshow/iot-sensortag/uismall.qrc @@ -0,0 +1,33 @@ + + + resources/small/StyleSmall.qml + resources/small/MainSmall.qml + resources/small/images/General/icon_sensor.png + resources/small/images/General/separator.png + resources/small/images/Light/light_base_gauge.png + resources/small/images/Light/light_brightness.png + resources/small/images/Toolbar/icon_topbar_sensor.png + resources/small/images/Toolbar/topbar_all.png + resources/small/images/Toolbar/icon_topbar_cloud.png + resources/small/images/Accelometer/inner_ring.png + resources/small/images/Accelometer/outer_ring.png + resources/small/images/AmbientTemperature/temp_ring.png + resources/small/images/AmbientTemperature/temp_sensor.png + resources/small/images/Toolbar/Cloud_button_change_active.png + resources/small/images/Toolbar/Cloud_icon_settings.png + resources/small/images/ObjectTemperature/objTemp_display_obj_blue.png + resources/small/images/ObjectTemperature/objTemp_display_obj_green.png + resources/small/images/ObjectTemperature/objTemp_display_obj_orange.png + resources/small/images/ObjectTemperature/objTemp_display_obj_red.png + resources/small/images/ObjectTemperature/objTemp_outer_inner_ring.png + resources/small/images/Humidity/Hum_combined_all.png + resources/small/images/Altitude/Height_bar.png + resources/small/images/Altitude/Altitude_base_gauge.png + resources/small/images/Altitude/Altitude_base_gauge_outer.png + resources/small/images/Gyro/gyro_center.png + resources/small/images/Gyro/gyro_ring1.png + resources/small/images/Gyro/gyro_ring2.png + resources/small/images/Gyro/gyro_ring3.png + resources/small/images/Gyro/gyro_outer.png + + diff --git a/tradeshow/iot-sensortag/uiwatch.qrc b/tradeshow/iot-sensortag/uiwatch.qrc new file mode 100644 index 0000000..5167663 --- /dev/null +++ b/tradeshow/iot-sensortag/uiwatch.qrc @@ -0,0 +1,35 @@ + + + resources/watch/MainWatch.qml + resources/watch/StyleWatch.qml + resources/watch/images/Toolbar/exit_button.png + resources/small/images/General/icon_sensor.png + resources/small/images/General/separator.png + resources/small/images/Light/light_base_gauge.png + resources/small/images/Light/light_brightness.png + resources/small/images/Toolbar/icon_topbar_sensor.png + resources/small/images/Toolbar/topbar_all.png + resources/small/images/Toolbar/icon_topbar_cloud.png + resources/small/images/Accelometer/inner_ring.png + resources/small/images/Accelometer/outer_ring.png + resources/small/images/AmbientTemperature/temp_ring.png + resources/small/images/AmbientTemperature/temp_sensor.png + resources/small/images/Toolbar/Cloud_button_change_active.png + resources/small/images/Toolbar/Cloud_icon_settings.png + resources/small/images/ObjectTemperature/objTemp_display_obj_blue.png + resources/small/images/ObjectTemperature/objTemp_display_obj_green.png + resources/small/images/ObjectTemperature/objTemp_display_obj_orange.png + resources/small/images/ObjectTemperature/objTemp_display_obj_red.png + resources/small/images/ObjectTemperature/objTemp_outer_inner_ring.png + resources/small/images/Humidity/Hum_combined_all.png + resources/small/images/Altitude/Height_bar.png + resources/small/images/Altitude/Altitude_base_gauge.png + resources/small/images/Altitude/Altitude_base_gauge_outer.png + resources/small/images/Gyro/gyro_center.png + resources/small/images/Gyro/gyro_ring1.png + resources/small/images/Gyro/gyro_ring2.png + resources/small/images/Gyro/gyro_ring3.png + resources/small/images/Gyro/gyro_outer.png + resources/watch/images/BuiltWithQt.png + + diff --git a/tradeshow/knx-demo/2d-knx-demo/demo.pro b/tradeshow/knx-demo/2d-knx-demo/demo.pro new file mode 100644 index 0000000..f5473de --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/demo.pro @@ -0,0 +1,53 @@ +TEMPLATE = app + +!qtHaveModule(quick) { + error("Missing module Qt Quick. Cannot build the Qt KNX demo.") +} + +QT += qml quick knx knx-private +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += main.cpp \ + qmlknxdemo.cpp \ + etsdevelopmentboard.cpp \ + demodatapoint.cpp + +RESOURCES += qml.qrc + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + +target.path = $$[QT_INSTALL_EXAMPLES]/knx/demo +INSTALLS += target + +android { + DISTFILES += \ + android/AndroidManifest.xml \ + android/gradle/wrapper/gradle-wrapper.jar \ + android/gradlew \ + android/res/values/libs.xml \ + android/build.gradle \ + android/gradle/wrapper/gradle-wrapper.properties \ + android/gradlew.bat \ + boardModel.qml +} + +HEADERS += \ + qmlknxdemo.h \ + demodatapoint.h \ + utils.h \ + etsdevelopmentboard.h diff --git a/tradeshow/knx-demo/2d-knx-demo/demodatapoint.cpp b/tradeshow/knx-demo/2d-knx-demo/demodatapoint.cpp new file mode 100644 index 0000000..710a6e0 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/demodatapoint.cpp @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "demodatapoint.h" + +#include +#include +#include +#include +#include + +const QKnxByteArray DemoDataPoint::BytesOn { 0x01 }; +const QKnxByteArray DemoDataPoint::BytesOff { 0x00 }; + +bool DemoSwitchDataPoint::updateDataPointState(const QKnxLinkLayerFrame &frame) +{ + m_switch.setBytes(frame.tpdu().data(), 0, 1); + return true; +} + +void DemoSwitchDataPoint::uiToggle() +{ + if (isOn()) + m_switch.setValue(QKnxSwitch::State::Off); + else + m_switch.setValue(QKnxSwitch::State::On); +} + +bool DemoSwitchDataPoint::isOn() const +{ + return m_switch.value() == QKnxSwitch::State::On; +} + +QKnxByteArray DemoSwitchDataPoint::bytes() const +{ + if (isOn()) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +bool DemoColorLed::updateDataPointState(const QKnxLinkLayerFrame &frame) +{ + bool notifyUI = false; + numMsgConfirmation++; + if (frame.messageCode() == QKnxLinkLayerFrame::MessageCode::DataConfirmation) { + // response to request from UI + // wait for three color confirmation to signal UI + if (numMsgConfirmation == 3) + notifyUI = true; + } else if (frame.messageCode() == QKnxLinkLayerFrame::MessageCode::DataIndication) { + // response to request from Board + notifyUI = true; + } + + QKnxSwitch dpt; + dpt.setBytes(frame.tpdu().data(), 0, 1); + int value = (dpt.value() == QKnxSwitch::State::On ? 255 : 0); + + auto dstAddress = frame.destinationAddress(); + if (dstAddress == QKnxAddress::createGroup(0, 0, 12)) + m_stateColor.setRed(value); + + else if (dstAddress == QKnxAddress::createGroup(0, 0, 13)) + m_stateColor.setGreen(value); + + else if (dstAddress == QKnxAddress::createGroup(0, 0, 14)) + m_stateColor.setBlue(value); + + if (notifyUI) { + numMsgConfirmation = 0; + emit colorChange(m_stateColor); + } + return false; +} + +QKnxByteArray DemoColorLed::redBytes() const +{ + if (m_stateColor.red() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QKnxByteArray DemoColorLed::greenBytes() const +{ + if (m_stateColor.green() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QKnxByteArray DemoColorLed::blueBytes() const +{ + if (m_stateColor.blue() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QColor DemoColorLed::currentColor() const +{ + return m_stateColor; +} + +void DemoColorLed::setCurrentColor(QColor color) +{ + m_stateColor = color; +} + +bool DemoColorLed::isOn() const +{ + return (m_stateColor != Qt::black); +} + +bool DemoRockerDataPoint::updateDataPointState(const QKnxLinkLayerFrame &frame) +{ + auto bytes = frame.serviceInformation(); + QString s = QByteArray((const char *) bytes.constData(), bytes.size()).mid(20, 4); + bool ok; + setPosition(s.toInt(&ok, 16)); + emit rockerChange(m_position); + return false; +} + +void DemoBlindDataPoint::chooseTimeoutHandle(bool blindUp) +{ + if (blindUp) { + disconnect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindDown); + connect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindUp); + } else { + disconnect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindUp); + connect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindDown); + } +} + +bool DemoBlindDataPoint::updateDataPointState(const QKnxLinkLayerFrame &frame) +{ + auto tpdu = frame.tpdu(); + if (frame.destinationAddress().toString() == "1/0/0") { + stopBlind(); + + QKnx1Bit dpt; + dpt.setBytes(frame.tpdu().data(), 0, 1); + + chooseTimeoutHandle(dpt.bit()); + reenableTimer(); + } else if (frame.destinationAddress().toString() == "1/1/0") { + stopBlind(); + } + return false; +} + +void DemoBlindDataPoint::reenableTimer() +{ + if (!m_timer.isActive()) + m_timer.start(50); +} + +void DemoBlindDataPoint::moveBlindUp() +{ + if (m_position == 70) { + stopBlind(); + emit blindFullyUp(); + return; + } + ++m_position; + emit blindChange(m_position); +} + +void DemoBlindDataPoint::moveBlindDown() +{ + if (m_position > 0) { + --m_position; + emit blindChange(m_position); + return; + } + stopBlind(); + emit blindFullyDown(); +} + +void DemoBlindDataPoint::stopBlind() +{ + if (m_timer.isActive()) + m_timer.stop(); +} + +QKnxByteArray DemoBlindDataPoint::moveUpBytes() const +{ + // send a 0 to move up + return DemoDataPoint::BytesOff; +} + +QKnxByteArray DemoBlindDataPoint::moveDownBytes() const +{ + // send a 1 to move down + return DemoDataPoint::BytesOn; +} + +QKnxByteArray DemoBlindDataPoint::stopBytes() const +{ + // send a 1 to stop + return DemoDataPoint::BytesOn; +} diff --git a/tradeshow/knx-demo/2d-knx-demo/demodatapoint.h b/tradeshow/knx-demo/2d-knx-demo/demodatapoint.h new file mode 100644 index 0000000..1810203 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/demodatapoint.h @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DEMODATAPOINT_H +#define DEMODATAPOINT_H + +#include +#include +#include +#include + +class DemoDataPoint +{ +public: + virtual ~DemoDataPoint() = default; + + virtual QKnxByteArray bytes() const { return {}; } + virtual bool updateDataPointState(const QKnxLinkLayerFrame &frame) = 0; + + int position() const { return m_position; } + void setPosition(int pos) { m_position = pos; } + +protected: + int m_position { 0 }; + + static const QKnxByteArray BytesOn; + static const QKnxByteArray BytesOff; +}; + +class DemoSwitchDataPoint : public DemoDataPoint +{ +public: + DemoSwitchDataPoint() = default; + ~DemoSwitchDataPoint() override = default; + + QKnxByteArray bytes() const override; + bool updateDataPointState(const QKnxLinkLayerFrame &frame) override; + + void uiToggle(); + bool isOn() const; + +private: + QKnxSwitch m_switch; +}; + +class DemoColorLed : public QObject, public DemoDataPoint +{ + Q_OBJECT + +public: + DemoColorLed() = default; + ~DemoColorLed() override = default; + + bool updateDataPointState(const QKnxLinkLayerFrame &frame) override; + + QColor currentColor() const; + void setCurrentColor(QColor color); + + QKnxByteArray redBytes() const; + QKnxByteArray greenBytes() const; + QKnxByteArray blueBytes() const; + + bool isOn() const; + +Q_SIGNALS: + void colorChange(QColor color); + +private: + QColor m_stateColor; + quint8 numMsgConfirmation { 0 }; +}; + +class DemoRockerDataPoint : public QObject, public DemoDataPoint +{ + Q_OBJECT +public: + DemoRockerDataPoint() = default; + virtual ~DemoRockerDataPoint() override = default; + + bool updateDataPointState(const QKnxLinkLayerFrame &frame) override; + +Q_SIGNALS: + void rockerChange(int position); +}; + +class DemoBlindDataPoint : public QObject, public DemoDataPoint +{ + Q_OBJECT +public: + DemoBlindDataPoint() = default; + ~DemoBlindDataPoint() override = default; + + bool updateDataPointState(const QKnxLinkLayerFrame &frame) override; + + QKnxByteArray moveUpBytes() const; + QKnxByteArray moveDownBytes() const; + QKnxByteArray stopBytes() const; + +public slots: + void moveBlindUp(); + void moveBlindDown(); + void stopBlind(); + +Q_SIGNALS: + void blindChange(int position); + void blindFullyUp(); + void blindFullyDown(); + +private: + void chooseTimeoutHandle(bool blindUp); + void reenableTimer(); + QTimer m_timer; +}; + +#endif // DEMODATAPOINT_H diff --git a/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.cpp b/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.cpp new file mode 100644 index 0000000..c8a3ccb --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "etsdevelopmentboard.h" +#include "demodatapoint.h" + +EtsDevelopmentBoard::EtsDevelopmentBoard() +{ + //e1-e6 + quint8 indexMapKey = 1; + for (quint8 i = 1; i < 7 ; ++i) // small white leds + addDevice(indexMapKey++, 0, 0, i, QSharedPointer::create()); + //e7-e8 + auto blindDataPoint = QSharedPointer::create(); + addDevice(7, 1, 0, 0, blindDataPoint); // blind up/down + //skip e8 (because e7 and e8 are the same) + addDevice(8, 1, 0, 0, blindDataPoint); // blind up/down + //indexMapKey++; + //e9 red led + addDevice(9, 0, 0, 7, QSharedPointer::create()); + //e10 red led + addDevice(10, 0, 0, 8, QSharedPointer::create()); + //e11 red led + addDevice(11, 0, 0, 9, QSharedPointer::create()); + //e12 red led + addDevice(12, 0, 0, 10, QSharedPointer::create()); + // e13 + auto colorLed = QSharedPointer::create(); + addDevice(13, 0, 0, 12, colorLed); // left Red + addDevice(13, 0, 0, 13, colorLed); // left Green + addDevice(13, 0, 0, 14, colorLed); // left Blue + // e14 + addDevice(14, 0, 0, 11, QSharedPointer::create()); // right white + addDevice(15, 2, 0, 0, QSharedPointer::create()); // Rocker + // e16 turn off blind up/down + addDevice(16, 1, 1, 0, blindDataPoint); +} + +DemoDataPoint *EtsDevelopmentBoard::getGroupObject(int idx) const +{ + return m_dataPoints.value(idx).dpt.data(); +} + +DemoDataPoint *EtsDevelopmentBoard::getGroupObject(const QKnxAddress &address) const +{ + return getGroupObject(getIndex(address)); +} + +int EtsDevelopmentBoard::getIndex(const QKnxAddress &address) const +{ + return m_addressToDataPoints.value(address); +} + +QKnxAddress EtsDevelopmentBoard::getAddress(int idx) const +{ + return m_dataPoints.value(idx).address; +} + +bool EtsDevelopmentBoard::exists(const QKnxAddress &address) const +{ + return m_addressToDataPoints.contains(address); +} + +DemoRockerDataPoint *EtsDevelopmentBoard::getRocker() const +{ + return static_cast(getGroupObject(DeviceNumbers::ROCKER)); +} + +DemoBlindDataPoint *EtsDevelopmentBoard::getBlind() const +{ + return static_cast(getGroupObject(DeviceNumbers::E7)); +} + +DemoColorLed *EtsDevelopmentBoard::getColorLed() const +{ + return static_cast(getGroupObject(DeviceNumbers::COLORLED)); +} + +void EtsDevelopmentBoard::addDevice(quint8 key, quint8 mainGroup, quint16 middleGroup, + quint8 subGroup, const QSharedPointer &dpt) +{ + auto address = QKnxAddress::createGroup(mainGroup, middleGroup, subGroup); + + if (!m_dataPoints.contains(key)) + m_dataPoints.insert(key, { address, dpt }); + + if (!m_addressToDataPoints.contains(address)) + m_addressToDataPoints.insert(address, key); +} diff --git a/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.h b/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.h new file mode 100644 index 0000000..e95c701 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/etsdevelopmentboard.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ETSDEVELOPMENTBOARD_H +#define ETSDEVELOPMENTBOARD_H + +#include "demodatapoint.h" + +#include +#include +#include + +class EtsDevelopmentBoard +{ +public: + enum DeviceNumbers + { + E7 = 7, // blind control up + E8 = 8, // blind control down + COLORLED = 13, + MIDDLE_RIGHT = 14, + ROCKER = 15, + E16 = 16, // blind control down + }; + EtsDevelopmentBoard(); + + DemoDataPoint *getGroupObject(int idx) const; + DemoDataPoint *getGroupObject(const QKnxAddress &address) const; + + int getIndex(const QKnxAddress &address) const; + QKnxAddress getAddress(int idx) const; + + bool exists(const QKnxAddress &address) const; + + inline int size() const { return m_dataPoints.size(); }; + + DemoRockerDataPoint *getRocker() const; + DemoBlindDataPoint *getBlind() const; + DemoColorLed *getColorLed() const; + +private: + void addDevice(quint8 key, quint8 mainGroup, quint16 middleGroup, quint8 subGroup, + const QSharedPointer &dpt); + + struct HashNode { + QKnxAddress address; + QSharedPointer dpt; + }; + QHash m_dataPoints; + QHash m_addressToDataPoints; +}; + +#endif diff --git a/tradeshow/knx-demo/2d-knx-demo/images/ArrowDown.png b/tradeshow/knx-demo/2d-knx-demo/images/ArrowDown.png new file mode 100644 index 0000000..0606ccc Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/ArrowDown.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/ArrowUp.png b/tradeshow/knx-demo/2d-knx-demo/images/ArrowUp.png new file mode 100644 index 0000000..ad4fb59 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/ArrowUp.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/Qt-logo-medium.png b/tradeshow/knx-demo/2d-knx-demo/images/Qt-logo-medium.png new file mode 100644 index 0000000..7d42da6 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/Qt-logo-medium.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/blind.png b/tradeshow/knx-demo/2d-knx-demo/images/blind.png new file mode 100644 index 0000000..fc78346 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/blind.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/blindCover.png b/tradeshow/knx-demo/2d-knx-demo/images/blindCover.png new file mode 100644 index 0000000..ae7c752 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/blindCover.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/clock.png b/tradeshow/knx-demo/2d-knx-demo/images/clock.png new file mode 100644 index 0000000..f5fb2af Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/clock.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/e10View.png b/tradeshow/knx-demo/2d-knx-demo/images/e10View.png new file mode 100644 index 0000000..b3df098 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/e10View.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/e1View.png b/tradeshow/knx-demo/2d-knx-demo/images/e1View.png new file mode 100644 index 0000000..99b8804 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/e1View.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/e2View.png b/tradeshow/knx-demo/2d-knx-demo/images/e2View.png new file mode 100644 index 0000000..578a2a1 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/e2View.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/e3e4View.png b/tradeshow/knx-demo/2d-knx-demo/images/e3e4View.png new file mode 100644 index 0000000..d8e97b9 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/e3e4View.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/e5e6View.png b/tradeshow/knx-demo/2d-knx-demo/images/e5e6View.png new file mode 100644 index 0000000..e2e81fd Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/e5e6View.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/icon_light.png b/tradeshow/knx-demo/2d-knx-demo/images/icon_light.png new file mode 100644 index 0000000..e59ef79 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/icon_light.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/off.png b/tradeshow/knx-demo/2d-knx-demo/images/off.png new file mode 100644 index 0000000..ee01cf7 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/off.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/on_green.png b/tradeshow/knx-demo/2d-knx-demo/images/on_green.png new file mode 100644 index 0000000..3b7e47e Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/on_green.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/on_orange.png b/tradeshow/knx-demo/2d-knx-demo/images/on_orange.png new file mode 100644 index 0000000..ebc0044 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/on_orange.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/quit_icon.png b/tradeshow/knx-demo/2d-knx-demo/images/quit_icon.png new file mode 100644 index 0000000..7b022a3 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/quit_icon.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/rainbow.png b/tradeshow/knx-demo/2d-knx-demo/images/rainbow.png new file mode 100644 index 0000000..b426d37 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/rainbow.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/settings_icon.png b/tradeshow/knx-demo/2d-knx-demo/images/settings_icon.png new file mode 100644 index 0000000..c0ccb48 Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/settings_icon.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/stop_orange.png b/tradeshow/knx-demo/2d-knx-demo/images/stop_orange.png new file mode 100644 index 0000000..aea256b Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/stop_orange.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/temperature_symbol.png b/tradeshow/knx-demo/2d-knx-demo/images/temperature_symbol.png new file mode 100644 index 0000000..cad112f Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/temperature_symbol.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/images/topBar.png b/tradeshow/knx-demo/2d-knx-demo/images/topBar.png new file mode 100644 index 0000000..ba4cb1c Binary files /dev/null and b/tradeshow/knx-demo/2d-knx-demo/images/topBar.png differ diff --git a/tradeshow/knx-demo/2d-knx-demo/main.cpp b/tradeshow/knx-demo/2d-knx-demo/main.cpp new file mode 100644 index 0000000..f1c5fc5 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/main.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "qmlknxdemo.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + + qmlRegisterType("QmlKnxDemo", 1, 0, "QmlKnxDemo"); + engine.load(QUrl(QLatin1String("qrc:/ui/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + QString namingScheme = QStringLiteral("qrc://"); + engine.rootContext()->setContextProperty("pathPrefix", namingScheme + "/"); + return app.exec(); +} diff --git a/tradeshow/knx-demo/2d-knx-demo/qml.qrc b/tradeshow/knx-demo/2d-knx-demo/qml.qrc new file mode 100644 index 0000000..850bc0d --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/qml.qrc @@ -0,0 +1,43 @@ + + + qtquickcontrols2.conf + ui/main.qml + ui/KnxBoardLayout.qml + ui/components/KnxSwitch.qml + ui/components/BlindSimulationView.qml + ui/components/ColorSlider.qml + ui/components/E1LedView.qml + ui/components/E2LedView.qml + ui/components/E3E4LedView.qml + ui/components/E5E6LedView.qml + ui/components/E7E8LedView.qml + ui/components/E9LedView.qml + ui/components/E10LedView.qml + ui/components/E11LedView.qml + ui/components/E12LedView.qml + ui/components/E13LedView.qml + ui/components/E14LedView.qml + images/ArrowDown.png + images/ArrowUp.png + images/icon_light.png + images/topBar.png + images/settings_icon.png + images/quit_icon.png + images/e1View.png + images/e2View.png + images/e3e4View.png + images/e5e6View.png + images/e10View.png + images/temperature_symbol.png + images/clock.png + images/Qt-logo-medium.png + images/rainbow.png + images/on_green.png + images/off.png + images/blind.png + images/blindCover.png + images/on_orange.png + images/stop_orange.png + + + diff --git a/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.cpp b/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.cpp new file mode 100644 index 0000000..4215246 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.cpp @@ -0,0 +1,311 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "demodatapoint.h" +#include "qmlknxdemo.h" +#include "utils.h" + +#include +#include +#include + +namespace { + const double sliderSectionSize = 1 / 7.0; + using DeviceNumbers = EtsDevelopmentBoard::DeviceNumbers; +} + +QmlKnxDemo::QmlKnxDemo() + : m_tunnel(this) +{ + checkLightStatusOn(); + + if (auto blind = m_etsBoard.getBlind()) { + connect(blind, &DemoBlindDataPoint::blindChange, this, &QmlKnxDemo::blindPositionChange); + connect(blind, &DemoBlindDataPoint::blindFullyUp, this, &QmlKnxDemo::blindFullyUp); + connect(blind, &DemoBlindDataPoint::blindFullyDown, this, &QmlKnxDemo::blindFullyDown); + } + + if (auto rocker = m_etsBoard.getRocker()) + connect(rocker, &DemoRockerDataPoint::rockerChange, this, &QmlKnxDemo::rockerChange); + + if (auto colorLed = m_etsBoard.getColorLed()) + connect(colorLed, &DemoColorLed::colorChange, this, &QmlKnxDemo::colorLedChange); +} + +void QmlKnxDemo::toggleLight(int light) +{ + if (auto dpt = static_cast(m_etsBoard.getGroupObject(light))) { + dpt->uiToggle(); + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(light), dpt->bytes()); + } +} + +void QmlKnxDemo::colorSwitch(double value) +{ + QColor colorAtStart = colorState; + if (value < (sliderSectionSize / 2) && colorState != Qt::black) { + colorState = Qt::black; + } else if ((value > (sliderSectionSize / 2)) + && value < (3 * sliderSectionSize / 2) + && (colorState != Qt::white)) { + colorState = Qt::white; + } else if ((value > (3 * sliderSectionSize / 2)) + && value < (5 * sliderSectionSize / 2) + && (colorState != Qt::red)) { + colorState = Qt::red; + } else if ((value > (5 * sliderSectionSize / 2)) + && value < (7 * sliderSectionSize / 2) + && (colorState != Qt::magenta)) { + colorState = Qt::magenta; + } else if ((value > (7 * sliderSectionSize / 2)) + && value < (9 * sliderSectionSize / 2) + && (colorState != Qt::blue)) { + colorState = Qt::blue; + } else if ((value > (9 * sliderSectionSize / 2)) + && value < (11 * sliderSectionSize / 2) + && (colorState != Qt::cyan)) { + colorState = Qt::cyan; + } else if (value > (11 * sliderSectionSize / 2) + && value < (13 * sliderSectionSize / 2) + && (colorState != Qt::green)) { + colorState = Qt::green; + } else if (value > ((6 * sliderSectionSize) + (sliderSectionSize / 2)) + && (colorState != Qt::yellow)) { + colorState = Qt::yellow; + } + + if (colorAtStart != colorState) { + if (auto led = m_etsBoard.getColorLed()) { + led->setCurrentColor(colorState); + sendColorLedGroupValueWriteFrames(m_tunnel, led); + } + } +} + +void QmlKnxDemo::toggleMiddleRight() +{ + auto light = DeviceNumbers::MIDDLE_RIGHT; + if (auto dpt = static_cast(m_etsBoard.getGroupObject(light))) { + dpt->uiToggle(); + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(light), dpt->bytes()); + } +} + +void QmlKnxDemo::toggleMiddleLeft() +{ + if (auto led = m_etsBoard.getColorLed()) { + // set green color in dpt by default... + led->setCurrentColor(QColor(0, (!led->isOn() ? 255 : 0), 0)); + sendColorLedGroupValueWriteFrames(m_tunnel, led); + } +} + +QString QmlKnxDemo::getColor() const +{ + if (auto obj = m_etsBoard.getColorLed()) + return obj->currentColor().name(); + return {}; +} + +int QmlKnxDemo::getRockerPosition() const +{ + if (auto rocker = m_etsBoard.getRocker()) + return rocker->position(); + return 0; +} + +bool QmlKnxDemo::getLightState(int lightNum) const +{ + if (auto dpt = static_cast(m_etsBoard.getGroupObject(lightNum))) + return dpt->isOn(); + return false; +} + +int QmlKnxDemo::getBlindPosition() const +{ + if (auto blind = m_etsBoard.getBlind()) + return blind->position(); + return 0; +} + +void QmlKnxDemo::moveBlindUp() +{ + if (auto dpt = m_etsBoard.getBlind()) { + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(DeviceNumbers::E7), dpt->moveUpBytes(), + 0xac); + } +} + +void QmlKnxDemo::moveBlindDown() +{ + if (auto dpt = m_etsBoard.getBlind()) { + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(DeviceNumbers::E7), dpt->moveDownBytes(), + 0xac); + } +} + +void QmlKnxDemo::stopBlind() +{ + auto index = DeviceNumbers::E16; + if (auto dpt = static_cast(m_etsBoard.getGroupObject(index))) + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(index), dpt->stopBytes(), 0xac); +} + +void QmlKnxDemo::handleFrame(const QKnxLinkLayerFrame &frame) +{ + auto dstAdd = frame.destinationAddress().toString(); + + if (QKnxLinkLayerFrame::MessageCode::DataConfirmation == frame.messageCode() + || QKnxLinkLayerFrame::MessageCode::DataIndication == frame.messageCode()) { + // data indication come from pushing buttons on the Board + // data confirmation are responses to App UI requests + bool boardStateChanged = false; + const QKnxAddress dstAddress = frame.destinationAddress(); + if (m_etsBoard.exists(dstAddress)) + boardStateChanged = m_etsBoard.getGroupObject(dstAddress)->updateDataPointState(frame); + + if (boardStateChanged) + emit boardUpdate(m_etsBoard.getIndex(dstAddress)); + } +} + +static QHostAddress obtainLocalAddress() +{ + auto addresses = QNetworkInterface::allAddresses(); + for (auto address : qAsConst(addresses)) { + if (address.isLoopback() || address.protocol() != QAbstractSocket::IPv4Protocol) + continue; + return address; + } + return QHostAddress::LocalHost; // no local address found! +} + +QmlKnxTunnel::QmlKnxTunnel(QmlKnxDemo *demo) +{ + connect(&m_connection, &QKnxNetIpTunnel::stateChanged, + this, &QmlKnxTunnel::handleConnection); + connect(&m_connection, &QKnxNetIpTunnel::frameReceived, + demo, &QmlKnxDemo::handleFrame); + connect(&m_timer, &QTimer::timeout, this, &QmlKnxTunnel::send); + + auto newAddress = obtainLocalAddress(); + m_connection.setLocalAddress(newAddress); + m_discoveryAgent.setLocalAddress(newAddress); + + // Automatic KNXnet/Ip router discovery. Connects to first router found + static auto handleDiscoveredServer = [&](const QKnxNetIpServerInfo &info) { + if (!m_connected) { + m_ip = info.controlEndpointAddress(); + m_port = info.controlEndpointPort(); + // establish the knx tunnel + reconnect(); + m_connected = true; + } + }; + connect(&m_discoveryAgent, &QKnxNetIpServerDiscoveryAgent::deviceDiscovered, this, + handleDiscoveredServer); + autoDiscoverKnxServers(); +} + +void QmlKnxTunnel::sendFrame(const QKnxLinkLayerFrame &frame) +{ + if (frame.size() == 0) + return; + + if (m_frames.size() == 0) + m_timer.start(200); + m_frames.enqueue(frame); +} + +void QmlKnxTunnel::reconnect() +{ + m_connection.connectToHost(m_ip, m_port); +} + +void QmlKnxTunnel::autoDiscoverKnxServers() +{ + m_discoveryAgent.stop(); + m_discoveryAgent.start(); +} + +void QmlKnxTunnel::changeIp(const QString &ip, quint16 port) +{ + m_ip = QHostAddress(ip); + m_port = port; + m_connection.disconnectFromHost(); +} + +void QmlKnxTunnel::send() +{ + m_connection.sendFrame(m_frames.dequeue()); + if (m_frames.size() == 0) + m_timer.stop(); +} + +void QmlKnxTunnel::handleConnection(QKnxNetIpEndpointConnection::State state) +{ + switch (state) { + case QKnxNetIpEndpointConnection::State::Disconnected: + autoDiscoverKnxServers(); + break; + default: + break; + } +} + +void QmlKnxDemo::changeTunnelIp(const QString &ipStr, quint16 port) +{ + m_tunnel.changeIp(ipStr, port); +} + +void QmlKnxDemo::checkLightStatusOn() +{ + initBoard(m_etsBoard, m_tunnel); +} diff --git a/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.h b/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.h new file mode 100644 index 0000000..dd9b037 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/qmlknxdemo.h @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLKNXDEMO_H +#define QMLKNXDEMO_H + +#include "etsdevelopmentboard.h" + +#include +#include +#include +#include +#include +#include + +class QmlKnxDemo; +class QmlKnxTunnel : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QmlKnxTunnel) + +public: + QmlKnxTunnel(QmlKnxDemo *demo); + void sendFrame(const QKnxLinkLayerFrame &frame); + void changeIp(const QString &ip, quint16 port = 3671); + +public slots: + void handleConnection(QKnxNetIpEndpointConnection::State state); + void send(); + +private: + void reconnect(); + void autoDiscoverKnxServers(); + +private: + QQueue m_frames; + QKnxNetIpTunnel m_connection; + QKnxNetIpServerDiscoveryAgent m_discoveryAgent; + + QTimer m_timer; + QHostAddress m_ip; + quint16 m_port { 3671 }; + bool m_connected { false }; +}; + +class QmlKnxDemo : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QmlKnxDemo) + +public: + QmlKnxDemo(); + + Q_INVOKABLE void toggleMiddleRight(); + Q_INVOKABLE void toggleMiddleLeft(); + Q_INVOKABLE QString getColor() const; + Q_INVOKABLE int getRockerPosition() const; + Q_INVOKABLE int getBlindPosition() const; + Q_INVOKABLE bool getLightState(int lightNum) const; + + Q_INVOKABLE void moveBlindUp(); + Q_INVOKABLE void moveBlindDown(); + Q_INVOKABLE void stopBlind(); + + Q_INVOKABLE void colorSwitch(double value); + Q_INVOKABLE void toggleLight(int light); + + Q_INVOKABLE void changeTunnelIp(const QString &ipStr, quint16 port = 3671); + +Q_SIGNALS: + void boardUpdate(quint32 lightNum); + void blindPositionChange(int position); + void blindFullyDown(); + void blindFullyUp(); + void rockerChange(int position); + void colorLedChange(QColor color); + +public slots: + void handleFrame(const QKnxLinkLayerFrame &frame); + +private: + void checkLightStatusOn(); + +private: + QColor colorState; + QmlKnxTunnel m_tunnel; + EtsDevelopmentBoard m_etsBoard; +}; + +#endif diff --git a/tradeshow/knx-demo/2d-knx-demo/qtquickcontrols2.conf b/tradeshow/knx-demo/2d-knx-demo/qtquickcontrols2.conf new file mode 100644 index 0000000..1764b16 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/qtquickcontrols2.conf @@ -0,0 +1,15 @@ +; This file can be edited to change the style of the application +; See Styling Qt Quick Controls 2 in the documentation for details: +; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html + +[Controls] +Style=Default + +[Universal] +Theme=Light +;Accent=Steel + +[Material] +Theme=Light +;Accent=BlueGrey +;Primary=BlueGray diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/KnxBoardLayout.qml b/tradeshow/knx-demo/2d-knx-demo/ui/KnxBoardLayout.qml new file mode 100644 index 0000000..5fd5d3a --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/KnxBoardLayout.qml @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import QtQuick.Window 2.2 +import "components" + +Rectangle { + property real xScaleFactor: (width / Screen.width).toFixed(2) + + function toggleLight(num) + { + knxDemo.toggleLight(num); + } + + function enableBox(num, checked) + { + if (num == 1) + e1LedView.lightE1.on = checked; + else if (num == 2) + e2LedView.lightE2.on = checked; + else if (num == 3) + e3e4LedView.lightE3.on = checked; + else if (num == 4) + e3e4LedView.lightE4.on = checked; + else if (num == 5) + e5e6LedView.lightE5.on = checked; + else if (num == 6) + e5e6LedView.lightE6.on = checked; + else if (num == 7) + e7e8LedView.lightE7.on = checked; + else if (num == 8) + e7e8LedView.lightE8.on = checked; + else if (num == 9) + e9LedView.lightE9.on = checked; + else if (num == 10) + e10LedView.lightE10.on = checked; + else if (num == 11) + e11LedView.lightE11.on = checked; + else if (num == 12) + e12LedView.lightE12.on = checked; + else if (num == 14) + changeLedColor(middleRightLed.led, checked ? "Yellow" : "#394251"); + return; + } + + function changeColorLeftLed(color) + { + changeLedColor(middleLeftLed.led, color); + } + + function changeLedColor(led, color) + { + if (Qt.colorEqual(color, "black")) + led.color = "#394251"; + else + led.color = color; + } + + function rotateLogo(rocker) + { + logo.rotation = (rocker - 1000) * 360 / 1000; + } + + ColumnLayout { + anchors.fill: parent + spacing: 0 + RowLayout { + spacing: 0 + E1LedView { id: e1LedView } + E2LedView { id: e2LedView } + E3E4LedView { id: e3e4LedView } + } + RowLayout { + spacing: 0 + E5E6LedView { id: e5e6LedView } + E13LedView { id: middleLeftLed } + E12LedView { id: e12LedView } + E14LedView { id: middleRightLed } + E7E8LedView { id: e7e8LedView } + } + RowLayout { + spacing: 0 + E9LedView { id: e9LedView } + ColumnLayout { + spacing: 0 + ColorSlider {} + E10LedView { id: e10LedView } + } + E11LedView { id: e11LedView } + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/BlindSimulationView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/BlindSimulationView.qml new file mode 100644 index 0000000..11a0fbd --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/BlindSimulationView.qml @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtGraphicalEffects 1.0 + +Item { + signal endSimulation(); + + function goUp() + { + animUp.start(); + } + function goDown() + { + animDown.start(); + } + function pause() + { + if (animUp.running) + animUp.stop(); + if (animDown.running) + animDown.stop(); + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + color: "#272a33" + Image { + id: blind + width: 84 + source: pathPrefix + "images/blind.png" + anchors.top: parent.bottom + } + SequentialAnimation { + id: animUp + running: false + NumberAnimation { target: blind; property: "height"; from: blind.height; to: 30; duration: 4000 } + onRunningChanged: { + if (!running) + endSimulation() + } + } + SequentialAnimation { + id: animDown + running: false + NumberAnimation { target: blind; property: "height"; from: blind.height; to: blind.sourceSize.height; duration: 4000 } + onRunningChanged: { + if (!running) + endSimulation() + } + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/ColorSlider.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/ColorSlider.qml new file mode 100644 index 0000000..cf507c7 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/ColorSlider.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 100 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + Slider { + anchors.fill: parent + anchors.margins: 17 + onPressedChanged: knxDemo.colorSwitch(value) + handle: Rectangle { + x: parent.leftPadding + parent.visualPosition * (parent.availableWidth - width) + y: parent.topPadding + parent.availableHeight / 2 - height / 2 + color: hovered ? "#272a33" : "#686a75" + border.color: "gray" + border.width: 1 + implicitWidth: 24 + implicitHeight: 24 + radius: width * 0.2 + } + background: Image { + source: pathPrefix + "images/rainbow.png" + } + } +} + diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E10LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E10LedView.qml new file mode 100644 index 0000000..79345df --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E10LedView.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias lightE10: lightE10 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 100 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + KnxSwitch { + id: lightE10 + lightNumber: 10 + anchors.centerIn: parent + z: 1 + scale: xScaleFactor + } + Image { + anchors.fill: parent + anchors.margins: 10 + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/e10View.png" + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E11LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E11LedView.qml new file mode 100644 index 0000000..fd0eee7 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E11LedView.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias lightE11: lightE11 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 50 + Layout.preferredHeight: 100 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + RowLayout { + anchors.fill: parent + anchors.margins: 20 + Image { + id: clockSymbol + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: lightE11.left + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/clock.png" + } + KnxSwitch { + id: lightE11 + lightNumber: 11 + anchors.centerIn: parent + scale: xScaleFactor + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E12LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E12LedView.qml new file mode 100644 index 0000000..4b91eab --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E12LedView.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias lightE12: lightE12 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 70 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + ColumnLayout { + anchors.bottomMargin: height / 2 + anchors.topMargin: height / 2 + anchors.centerIn: parent + Image { + Layout.preferredWidth: 70 + Layout.preferredHeight: 70 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter: lightE12.horizontalCenter + source: pathPrefix + "images/icon_light.png" + } + KnxSwitch { + id: lightE12 + lightNumber: 12 + anchors.horizontalCenter: parent.horizontalCenter + scale: xScaleFactor + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E13LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E13LedView.qml new file mode 100644 index 0000000..9d0e937 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E13LedView.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias led: leftLed + color: "#272a33" + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumWidth: 100 + Layout.minimumHeight: 220 + border.width: 4 + border.color: "#686a75" + Rectangle { + id: leftLed + height: parent.height / 2 + width: parent.height / 2 + color: "#394251" + radius: 0.5 * width + border.color: "#686a75" + border.width: 2 + anchors.centerIn: parent + MouseArea { + anchors.fill: parent + onClicked: knxDemo.toggleMiddleLeft() + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E14LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E14LedView.qml new file mode 100644 index 0000000..85987d8 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E14LedView.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias led: rightLed + color: "#272a33" + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumWidth: 100 + Layout.minimumHeight: 220 + border.width: 4 + border.color: "#686a75" + Rectangle { + id: rightLed + height: parent.height / 2 + width: parent.height / 2 + color: "#394251" + radius: 0.5 * width + border.color: "#686a75" + border.width: 2 + anchors.centerIn: parent + MouseArea { + anchors.fill: parent + onClicked: toggleLight(14) + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E1LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E1LedView.qml new file mode 100644 index 0000000..6b676c2 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E1LedView.qml @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + color: "#272a33" + property alias lightE1: lightE1 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 400 + Layout.preferredHeight: 220 + border.width: 4 + border.color: "#686a75" + Image { + id: e1SchemeImg + source: pathPrefix + "images/e1View.png" + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: lightE1.left + fillMode: Image.PreserveAspectFit + } + KnxSwitch { + id: lightE1 + lightNumber:1 + anchors.verticalCenter: e1SchemeImg.verticalCenter + anchors.right: parent.right + scale: xScaleFactor + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E2LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E2LedView.qml new file mode 100644 index 0000000..f844141 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E2LedView.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + id: e2Scheme + property alias lightE2: lightE2 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 300 + Layout.preferredHeight: 220 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + Image { + id: e2SchemeImg + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: lightE2.left + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/e2View.png" + } + KnxSwitch { + id: lightE2 + lightNumber:2 + anchors.right: parent.right + anchors.verticalCenter: e2SchemeImg.verticalCenter + scale: xScaleFactor + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E3E4LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E3E4LedView.qml new file mode 100644 index 0000000..cc0f4f8 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E3E4LedView.qml @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + id: e3e4Scheme + property alias lightE3: lightE3 + property alias lightE4: lightE4 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 400 + Layout.preferredHeight: 220 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + KnxSwitch { + id: lightE3 + lightNumber: 3 + anchors.left: parent.left + anchors.right: e3e4SchemeImg.left + anchors.verticalCenter: e3e4SchemeImg.verticalCenter + scale: xScaleFactor + } + Image { + id: e3e4SchemeImg + anchors.left: lightE3.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: lightE4.left + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/e3e4View.png" + } + KnxSwitch { + id: lightE4 + lightNumber: 4 + width: 88 + anchors.right: parent.right + anchors.verticalCenter: e3e4SchemeImg.verticalCenter + scale: xScaleFactor + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E5E6LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E5E6LedView.qml new file mode 100644 index 0000000..564c050 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E5E6LedView.qml @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + id: e5e6Scheme + color: "#272a33" + property alias lightE5: lightE5 + property alias lightE6: lightE6 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 130 + Layout.preferredHeight: 220 + border.width: 4 + border.color: "#686a75" + Image { + id: e5e6SchemeImg + anchors.right: parent.righ + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: colSwitches.right + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/e5e6View.png" + } + ColumnLayout { + id: colSwitches + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.margins: 4 + KnxSwitch { + id: lightE5 + lightNumber: 5 + anchors.top: parent.top + scale: xScaleFactor + } + KnxSwitch { + id: lightE6 + lightNumber: 6 + anchors.bottom: parent.bottom + scale: xScaleFactor + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E7E8LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E7E8LedView.qml new file mode 100644 index 0000000..92be92f --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E7E8LedView.qml @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + color: "#272a33" + property alias lightE7: lightE7 + property alias lightE8: lightE8 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumWidth: 120 + Layout.minimumHeight: 220 + border.width: 4 + border.color: "#686a75" + BlindSimulationView { + id: simulation + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.topMargin: 20 + anchors.leftMargin: 10 + onEndSimulation: { + lightE7.on = false; + lightE8.on = false; + knxDemo.stopBlind(); + } + } + ColumnLayout { + id: blindControls + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + spacing: 0 + KnxSwitch { + id: lightE7 + lightNumber: 7 + scale: xScaleFactor + customSwitchAction: true + onUiClicked: { + lightE8.on = false; + simulation.pause(); + if (lightE7.on) { + simulation.goUp(); + knxDemo.moveBlindUp(); + } + } + } + KnxSwitch { + id: lightE8 + lightNumber: 8 + scale: xScaleFactor + customSwitchAction: true + onUiClicked: { + lightE7.on = false; + simulation.pause(); + if (lightE8.on) { + simulation.goDown(); + knxDemo.moveBlindDown(); + } + } + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/E9LedView.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/E9LedView.qml new file mode 100644 index 0000000..e384ea7 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/E9LedView.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Rectangle { + property alias lightE9: lightE9 + Layout.fillWidth: true + Layout.fillHeight: true + Layout.preferredWidth: 50 + Layout.preferredHeight: 100 + color: "#272a33" + border.width: 4 + border.color: "#686a75" + RowLayout { + anchors.fill: parent + anchors.margins: 20 + Image { + id: tempSymbol + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: lightE9.left + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/temperature_symbol.png" + } + KnxSwitch { + id: lightE9 + lightNumber: 9 + anchors.centerIn: parent + scale: xScaleFactor + } + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/components/KnxSwitch.qml b/tradeshow/knx-demo/2d-knx-demo/ui/components/KnxSwitch.qml new file mode 100644 index 0000000..f56bec8 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/components/KnxSwitch.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 + +Item { + width: 88 + height: 48 + property bool on: false + property int lightNumber: 0 + property bool customSwitchAction: false + + signal uiClicked(); + MouseArea { + anchors.fill: parent + onClicked: { + if (!customSwitchAction) + toggleLight(lightNumber); + on = !on; + uiClicked(); + } + } + Image { + id: imageOff + anchors.fill: parent + visible: on + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/on_green.png" + } + Image { + anchors.fill: parent + visible: !on + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/off.png" + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/ui/main.qml b/tradeshow/knx-demo/2d-knx-demo/ui/main.qml new file mode 100644 index 0000000..92399a8 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/ui/main.qml @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import QmlKnxDemo 1.0 + +ApplicationWindow { + id: mainWindow + visibility: "FullScreen" + width: 1280 + height: 800 + title: qsTr("KNX Demo") + + QmlKnxDemo { + id: knxDemo + onBoardUpdate: { + console.log("signal onBoardUpdate lightNum: " + lightNum) + knxBoard.enableBox(lightNum, getLightState(lightNum)); + } + onColorLedChange: knxBoard.changeColorLeftLed(color) + onRockerChange: { + logo.rotation = (position - 1000) * 360 / 1000; + } + } + + header: ToolBar { + height: mainWindow.height / 12 + width: parent.width + Layout.fillWidth: true + background: Image { + anchors.fill: parent + source: pathPrefix + "images/topBar.png" + } + Image { + id: logo + antialiasing: true + anchors.verticalCenter: title.verticalCenter + width: 45 + height: 33 + source: pathPrefix + "images/Qt-logo-medium.png" + } + Label { + id: title + color: "grey" + text: qsTr("Qt for automation KNX demo") + anchors.left: logo.right + anchors.verticalCenter: parent.verticalCenter + Layout.maximumWidth: mainWindow.width / 3 + } + ToolButton { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + width: logo.width * 0.8 + height: logo.width * 0.8 + contentItem: Image { + fillMode: Image.PreserveAspectFit + source: pathPrefix + "images/quit_icon.png" + MouseArea { + anchors.fill: parent + onClicked: Qt.quit(); + } + } + } + } + + KnxBoardLayout { + id: knxBoard + anchors.fill: parent + } +} diff --git a/tradeshow/knx-demo/2d-knx-demo/utils.h b/tradeshow/knx-demo/2d-knx-demo/utils.h new file mode 100644 index 0000000..16c0877 --- /dev/null +++ b/tradeshow/knx-demo/2d-knx-demo/utils.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef UTILS_H +#define UTILS_H + +#include "demodatapoint.h" + +#include +#include + +QKnxLinkLayerFrame createRequestFrame(const QKnxAddress &address, const QKnxTpdu &tpdu, + quint8 ctrl = 0xac, quint8 extCtrl = 0xe0) +{ + QKnxLinkLayerFrame frame(QKnxLinkLayerFrame::MessageCode::DataRequest); + frame.setMediumType(QKnx::MediumType::NetIP); + frame.setControlField(QKnxControlField(ctrl)); + frame.setExtendedControlField(QKnxExtendedControlField(extCtrl)); + frame.setSourceAddress({ QKnxAddress::Type::Group, 0 }); + frame.setDestinationAddress(address); + frame.setTpdu(tpdu); + return frame; +} + +void sendGroupValueWrite(QmlKnxTunnel &tunnel, const QKnxAddress &address, + const QKnxByteArray &data, quint8 ctrl = 0xa4, quint8 extCtrl = 0xe0) +{ + tunnel.sendFrame(createRequestFrame(address, + QKnxTpduFactory::Multicast::createGroupValueWriteTpdu(data), ctrl, extCtrl)); +} + +void sendColorLedGroupValueWriteFrames(QmlKnxTunnel &tunnel, const DemoColorLed *const dpt) +{ + if (dpt) { + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 12), + QKnxTpduFactory::Multicast::createGroupValueWriteTpdu(dpt->redBytes()))); + + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 13), + QKnxTpduFactory::Multicast::createGroupValueWriteTpdu(dpt->greenBytes()))); + + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 14), + QKnxTpduFactory::Multicast::createGroupValueWriteTpdu(dpt->blueBytes()))); + } +} + +void initBoard(EtsDevelopmentBoard &board, QmlKnxTunnel &tunnel) +{ + auto tpdu = QKnxTpduFactory::Multicast::createGroupValueReadTpdu(); + for (int i = 1; i <= board.size(); ++i) { + if (i >= 9 && i <= 12) + continue; // skip red leds readings because they are not indicating the state! + if ((i == 7) || (i == 8) || (i == 16)) + continue; // skip checking blinds state + + if (QKnxAddress::createGroup(0, 0, 12) == board.getAddress(i)) { + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 12), tpdu)); + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 13), tpdu)); + tunnel.sendFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 14), tpdu)); + } else { + tunnel.sendFrame(createRequestFrame(board.getAddress(i), tpdu, 0xa4)); + } + } +} + +#endif diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.ico b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.ico new file mode 100644 index 0000000..41756e8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5585eea1337687eaefa2223edded680963f45bee56a971c94d11603ee4aaf696 +size 108337 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.pro b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.pro new file mode 100644 index 0000000..e70f4e4 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.pro @@ -0,0 +1,73 @@ +TEMPLATE = app + +# Control KNX board with the demo +CONFIG += KNX_BOARD ALEXA_WEMO +#CONFIG += ALEXA_WEMO + +KNX_BOARD { + requires(qtHaveModule(knx)) + requires(qtHaveModule(network)) + DEFINES += KNX_BACKEND + + QT += knx + CONFIG += c++11 +} + +QT += qml quick + +target.path = $$[QT_INSTALL_EXAMPLES]/studio3d/$$TARGET +INSTALLS += target + +SOURCES += main.cpp \ + housemodel.cpp + +HEADERS += \ + housemodel.h + +RESOURCES += HomeAutom.qrc + +OTHER_FILES += qml/HomeAutom/* + +RC_ICONS += HomeAutom.ico + +KNX_BOARD { + SOURCES += \ + qmlknxdemo.cpp \ + etsdevelopmentboard.cpp \ + demodatapoint.cpp + + HEADERS += \ + qmlknxdemo.h \ + demodatapoint.h \ + utils.h \ + etsdevelopmentboard.h +} + +ALEXA_WEMO { + SOURCES += \ + qupnpservice.cpp \ + qupnprootdevice.cpp \ + qvirtualbelkinwemo.cpp \ + qminimalhttpserver.cpp + + HEADERS += \ + qupnpservice.h \ + qupnprootdevice.h \ + qvirtualbelkinwemo.h \ + qminimalhttpserver.h + + QT += xml +} + +QML_IMPORT_PATH = $$PWD/qml/imports + +DISTFILES += \ + android/AndroidManifest.xml \ + android/gradle/wrapper/gradle-wrapper.jar \ + android/gradlew \ + android/res/values/libs.xml \ + android/build.gradle \ + android/gradle/wrapper/gradle-wrapper.properties \ + android/gradlew.bat + +#ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.qrc b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.qrc new file mode 100644 index 0000000..ca9c557 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/HomeAutom.qrc @@ -0,0 +1,54 @@ + + + qml/images/QtSymbol.png + qml/HomeAutom/main.qml + qml/HomeAutom/HomeView.qml + qml/HomeAutom/SplashScreen.qml + qml/HomeAutom/MainMenu.qml + qml/HomeAutom/TempSlider.qml + qml/HomeAutom/SliderControl.qml + qml/HomeAutom/LightSlider.qml + qml/HomeAutom/RoomLabel.qml + qml/HomeAutom/LightSwitch.qml + uip/houseStudio.uip + uip/maps/Ground.png + uip/maps/HouseGroundOpacitymap.png + uip/maps/HouseTexture.png + uip/maps/OpenfootageNET_Pinzgau-512.hdr + uip/maps/Roof.png + uip/models/HeatAreas/meshes/Heat_Entrance HeatAreas.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_BathRoom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_BedRoom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_DressRoom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_LivingRoom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_MasterBedroom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_Sauna.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_StoreRoom.mesh + uip/models/HeatAreas/meshes/HeatAreas Heat_Toilet.mesh + uip/models/HeatAreas/HeatAreas.import + uip/models/House/meshes/Ground.mesh + uip/models/House/meshes/House.mesh + uip/models/House/meshes/Roof.mesh + uip/models/House/meshes/Windows.mesh + uip/models/House/House.import + uip/models/Light/Light.import + uip/House/meshes/house1.mesh + uip/House/meshes/roof1.mesh + uip/maps/BathroomLightmap.png + uip/maps/BedRoomLightmap.png + uip/maps/EntranceLightmap.png + uip/maps/LivingRoomLightMap.png + uip/maps/MasterBedroomLightmap.png + uip/models/RoomLights/RoomLights.import + uip/models/RoomLights/meshes/BathroomLightmap.mesh + uip/models/RoomLights/meshes/BedroomLightmap.mesh + uip/models/RoomLights/meshes/EntranceLightmap.mesh + uip/models/RoomLights/meshes/LivingroomLightMap.mesh + uip/models/RoomLights/meshes/MasterbedroomLightmap.mesh + qml/images/icon_light.png + qml/images/icon_temp.png + uip/maps/HouseTexture.jpg + qml/imports/Style/qmldir + qml/imports/Style/Style.qml + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.cpp new file mode 100644 index 0000000..95c82a8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.cpp @@ -0,0 +1,246 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "demodatapoint.h" + +#include +#include +#include +#include +#include +#include + +const QByteArray DemoDataPoint::BytesOn = QByteArray::fromHex("0x1"); +const QByteArray DemoDataPoint::BytesOff = QByteArray::fromHex("0x0"); + +bool DemoSwitchDataPoint::updateDataPointState(const QKnxTunnelFrame &frame) +{ + auto str = frame.serviceInformation().bytes().toHex(); + m_state = (str[str.size() - 1] == '1'); + return true; +} + +void DemoSwitchDataPoint::uiToggle() +{ + m_state = !m_state; +} + +bool DemoSwitchDataPoint::isOn() const +{ + return m_state; +} + +QByteArray DemoSwitchDataPoint::bytes() const +{ + if (m_state) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +bool DemoColorLed::updateDataPointState(const QKnxTunnelFrame &frame) +{ + bool notifyUI = false; + numMsgConfirmation++; + if (frame.messageCode() == QKnxCemiFrame::MessageCode::DataConfirmation) { + // response to request from UI + // wait for three color confirmation to signal UI + if (numMsgConfirmation == 3) + notifyUI = true; + } else if (frame.messageCode() == QKnxCemiFrame::MessageCode::DataIndication) { + // response to request from Board + notifyUI = true; + } + + QKnxSwitch dpt; + dpt.setBytes(frame.npdu().data(), 0, 1); + int value = (dpt.value() == QKnxSwitch::State::On ? 255 : 0); + + auto dstAddress = frame.destinationAddress(); + if (dstAddress == QKnxAddress::createGroup(0, 0, 12)) + m_stateColor.setRed(value); + + else if (dstAddress == QKnxAddress::createGroup(0, 0, 13)) + m_stateColor.setGreen(value); + + else if (dstAddress == QKnxAddress::createGroup(0, 0, 14)) + m_stateColor.setBlue(value); + + if (notifyUI) { + numMsgConfirmation = 0; + emit colorChange(m_stateColor); + } + return false; +} + +QByteArray DemoColorLed::redBytes() const +{ + if (m_stateColor.red() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QByteArray DemoColorLed::greenBytes() const +{ + if (m_stateColor.green() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QByteArray DemoColorLed::blueBytes() const +{ + if (m_stateColor.blue() > 0) + return DemoDataPoint::BytesOn; + return DemoDataPoint::BytesOff; +} + +QColor DemoColorLed::currentColor() const +{ + return m_stateColor; +} + +void DemoColorLed::setCurrentColor(QColor color) +{ + m_stateColor = color; +} + +bool DemoColorLed::isOn() const +{ + return (m_stateColor != Qt::black); +} + +bool DemoRockerDataPoint::updateDataPointState(const QKnxTunnelFrame &frame) +{ + auto str = frame.serviceInformation().bytes().toHex(); + QString s = str.mid(20, 4); + bool ok; + setPosition(s.toInt(&ok, 16)); + emit rockerChange(m_position); + return false; +} + +void DemoBlindDataPoint::chooseTimeoutHandle(bool blindUp) +{ + if (blindUp) { + disconnect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindDown); + connect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindUp); + } else { + disconnect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindUp); + connect(&m_timer, &QTimer::timeout, this, &DemoBlindDataPoint::moveBlindDown); + } +} + +bool DemoBlindDataPoint::updateDataPointState(const QKnxTunnelFrame &frame) +{ + auto npdu = frame.npdu(); + if (frame.destinationAddress().toString() == "1/0/0") { + stopBlind(); + + QKnx1Bit dpt; + dpt.setBytes(frame.npdu().data(), 0, 1); + + chooseTimeoutHandle(dpt.bit()); + reenableTimer(); + } else if (frame.destinationAddress().toString() == "1/1/0") { + stopBlind(); + } + return false; +} + +void DemoBlindDataPoint::reenableTimer() +{ + if (!m_timer.isActive()) + m_timer.start(50); +} + +void DemoBlindDataPoint::moveBlindUp() +{ + if (m_position == 70) { + stopBlind(); + emit blindFullyUp(); + return; + } + ++m_position; + emit blindChange(m_position); +} + +void DemoBlindDataPoint::moveBlindDown() +{ + if (m_position > 0) { + --m_position; + emit blindChange(m_position); + return; + } + stopBlind(); + emit blindFullyDown(); +} + +void DemoBlindDataPoint::stopBlind() +{ + if (m_timer.isActive()) + m_timer.stop(); +} + +QByteArray DemoBlindDataPoint::moveUpBytes() const +{ + // send a 0 to move up + return DemoDataPoint::BytesOff; +} + +QByteArray DemoBlindDataPoint::moveDownBytes() const +{ + // send a 1 to move down + return DemoDataPoint::BytesOn; +} + +QByteArray DemoBlindDataPoint::stopBytes() const +{ + // send a 1 to stop + return DemoDataPoint::BytesOn; +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.h new file mode 100644 index 0000000..5c465a2 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/demodatapoint.h @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DEMODATAPOINT_H +#define DEMODATAPOINT_H + +#include +#include +#include + +class DemoDataPoint +{ +public: + virtual ~DemoDataPoint() = default; + + virtual QByteArray bytes() const { return QByteArray(); } + virtual bool updateDataPointState(const QKnxTunnelFrame &frame) = 0; + + int position() const { return m_position; } + void setPosition(int pos) { m_position = pos; } + +protected: + int m_position { 0 }; + + static const QByteArray BytesOn; + static const QByteArray BytesOff; +}; + +class DemoSwitchDataPoint : public DemoDataPoint +{ +public: + DemoSwitchDataPoint() = default; + ~DemoSwitchDataPoint() override = default; + + QByteArray bytes() const override; + bool updateDataPointState(const QKnxTunnelFrame &frame) override; + + void uiToggle(); + bool isOn() const; + +private: + bool m_state; +}; + +class DemoColorLed : public QObject, public DemoDataPoint +{ + Q_OBJECT + +public: + DemoColorLed() = default; + ~DemoColorLed() override = default; + + bool updateDataPointState(const QKnxTunnelFrame &frame) override; + + QColor currentColor() const; + void setCurrentColor(QColor color); + + QByteArray redBytes() const; + QByteArray greenBytes() const; + QByteArray blueBytes() const; + + bool isOn() const; + +Q_SIGNALS: + void colorChange(QColor color); + +private: + QColor m_stateColor; + quint8 numMsgConfirmation { 0 }; +}; + +class DemoRockerDataPoint : public QObject, public DemoDataPoint +{ + Q_OBJECT +public: + DemoRockerDataPoint() = default; + virtual ~DemoRockerDataPoint() override = default; + + bool updateDataPointState(const QKnxTunnelFrame &frame) override; + +Q_SIGNALS: + void rockerChange(int position); +}; + +class DemoBlindDataPoint : public QObject, public DemoDataPoint +{ + Q_OBJECT +public: + DemoBlindDataPoint() = default; + ~DemoBlindDataPoint() override = default; + + bool updateDataPointState(const QKnxTunnelFrame &frame) override; + + QByteArray moveUpBytes() const; + QByteArray moveDownBytes() const; + QByteArray stopBytes() const; + +public slots: + void moveBlindUp(); + void moveBlindDown(); + void stopBlind(); + +Q_SIGNALS: + void blindChange(int position); + void blindFullyUp(); + void blindFullyDown(); + +private: + void chooseTimeoutHandle(bool blindUp); + void reenableTimer(); + QTimer m_timer; +}; + +#endif // DEMODATAPOINT_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.cpp new file mode 100644 index 0000000..b963fec --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "etsdevelopmentboard.h" +#include "demodatapoint.h" + +EtsDevelopmentBoard::EtsDevelopmentBoard() +{ + //e1-e6 + quint8 indexMapKey = 1; + for (quint8 i = 1; i < 7 ; ++i) // small white leds + addDevice(indexMapKey++, 0, 0, i, QSharedPointer::create()); + //e7-e8 + auto blindDataPoint = QSharedPointer::create(); + addDevice(7, 1, 0, 0, blindDataPoint); // blind up/down + //skip e8 (because e7 and e8 are the same) + addDevice(8, 1, 0, 0, blindDataPoint); // blind up/down + //indexMapKey++; + //e9 red led + addDevice(9, 0, 0, 7, QSharedPointer::create()); + //e10 red led + addDevice(10, 0, 0, 8, QSharedPointer::create()); + //e11 red led + addDevice(11, 0, 0, 9, QSharedPointer::create()); + //e12 red led + addDevice(12, 0, 0, 10, QSharedPointer::create()); + // e13 + auto colorLed = QSharedPointer::create(); + addDevice(13, 0, 0, 12, colorLed); // left Red + addDevice(13, 0, 0, 13, colorLed); // left Green + addDevice(13, 0, 0, 14, colorLed); // left Blue + // e14 + addDevice(14, 0, 0, 11, QSharedPointer::create()); // right white + addDevice(15, 2, 0, 0, QSharedPointer::create()); // Rocker + // e16 turn off blind up/down + addDevice(16, 1, 1, 0, blindDataPoint); +} + +DemoDataPoint *EtsDevelopmentBoard::getGroupObject(int idx) const +{ + return m_dataPoints.value(idx).dpt.data(); +} + +DemoDataPoint *EtsDevelopmentBoard::getGroupObject(const QKnxAddress &address) const +{ + return getGroupObject(getIndex(address)); +} + +int EtsDevelopmentBoard::getIndex(const QKnxAddress &address) const +{ + return m_addressToDataPoints.value(address); +} + +QKnxAddress EtsDevelopmentBoard::getAddress(int idx) const +{ + return m_dataPoints.value(idx).address; +} + +bool EtsDevelopmentBoard::exists(const QKnxAddress &address) const +{ + return m_addressToDataPoints.contains(address); +} + +DemoRockerDataPoint *EtsDevelopmentBoard::getRocker() const +{ + return static_cast(getGroupObject(DeviceNumbers::ROCKER)); +} + +DemoBlindDataPoint *EtsDevelopmentBoard::getBlind() const +{ + return static_cast(getGroupObject(DeviceNumbers::E7)); +} + +DemoColorLed *EtsDevelopmentBoard::getColorLed() const +{ + return static_cast(getGroupObject(DeviceNumbers::COLORLED)); +} + +void EtsDevelopmentBoard::addDevice(quint8 key, quint8 mainGroup, quint16 middleGroup, + quint8 subGroup, const QSharedPointer &dpt) +{ + auto address = QKnxAddress::createGroup(mainGroup, middleGroup, subGroup); + + if (!m_dataPoints.contains(key)) + m_dataPoints.insert(key, { address, dpt }); + + if (!m_addressToDataPoints.contains(address)) + m_addressToDataPoints.insert(address, key); +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.h new file mode 100644 index 0000000..7f6fbaa --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/etsdevelopmentboard.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ETSDEVELOPMENTBOARD_H +#define ETSDEVELOPMENTBOARD_H + +#include "demodatapoint.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE +inline uint qHash(const QKnxAddress &key, uint seed) +{ + return qHash(key.toString(), seed); +}; +QT_END_NAMESPACE + +class EtsDevelopmentBoard +{ +public: + enum DeviceNumbers + { + E7 = 7, // blind control up + E8 = 8, // blind control down + COLORLED = 13, + MIDDLE_RIGHT = 14, + ROCKER = 15, + E16 = 16, // blind control down + }; + EtsDevelopmentBoard(); + + DemoDataPoint *getGroupObject(int idx) const; + DemoDataPoint *getGroupObject(const QKnxAddress &address) const; + + int getIndex(const QKnxAddress &address) const; + QKnxAddress getAddress(int idx) const; + + bool exists(const QKnxAddress &address) const; + + inline int size() const { return m_dataPoints.size(); }; + + DemoRockerDataPoint *getRocker() const; + DemoBlindDataPoint *getBlind() const; + DemoColorLed *getColorLed() const; + +private: + void addDevice(quint8 key, quint8 mainGroup, quint16 middleGroup, quint8 subGroup, + const QSharedPointer &dpt); + + struct HashNode { + QKnxAddress address; + QSharedPointer dpt; + }; + QHash m_dataPoints; + QHash m_addressToDataPoints; +}; + +#endif diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.cpp new file mode 100644 index 0000000..a768217 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "housemodel.h" + +HouseModel::HouseModel(QObject *parent) : QAbstractListModel(parent) +{ + generateRooms(); +} + +QHash HouseModel::roleNames() const +{ + QHash roles; + roles[NameRole] = "name"; + roles[ItemRole] = "item"; + roles[TemperatureRole] = "temperature"; + roles[LightRole] = "light"; + roles[XPosRole] = "xPos"; + roles[YPosRole] = "yPos"; + + return roles; +} + +QVariant HouseModel::data(const QModelIndex &index, int role) const +{ + if (role == NameRole) + return m_rooms.at(index.row()).getName(); + else if (role == ItemRole) + return m_rooms.at(index.row()).getItem(); + else if (role == TemperatureRole) + return m_rooms.at(index.row()).getTemperature(); + else if (role == LightRole) + return m_rooms.at(index.row()).getLight(); + else if (role == XPosRole) + return m_rooms.at(index.row()).getXPos(); + else if (role == YPosRole) + return m_rooms.at(index.row()).getYPos(); + else return QVariant(); +} + +bool HouseModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid()) { + if (role == TemperatureRole) { + m_rooms[index.row()].setTemperature(value.toInt()); + emit dataChanged(index, index); + return true; + } else if (role == LightRole) { + m_rooms[index.row()].setLight(value.toDouble()); + emit dataChanged(index, index); + return true; + } + } + return false; +} + +int HouseModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_rooms.length(); +} + +bool HouseModel::removeRows(int row, int count, const QModelIndex &parent) +{ + Q_UNUSED(row) + Q_UNUSED(count) + Q_UNUSED(parent) + beginResetModel(); + m_rooms.clear(); + endResetModel(); + + return true; +} + +void HouseModel::addRoom(const QString &name, const QString &item, + int temperature, double light, int xPos, int yPos) +{ + int row = m_rooms.size(); + beginInsertRows(QModelIndex(), row, row); + m_rooms.insert(row, Room(name, item, temperature, light, xPos, yPos)); + endInsertRows(); +} + +void HouseModel::generateRooms() +{ + removeRows(0, m_rooms.length()); + // Position of labels is defined from the center point of window + addRoom(QStringLiteral("Living Room"), QStringLiteral("Livingroom"), 21, 0.8, 120, 200); + addRoom(QStringLiteral("Master Bedroom"), QStringLiteral("Masterbedroom"), 18, 0.8, -380, -290); + addRoom(QStringLiteral("Bedroom"), QStringLiteral("Bedroom"), 15, 0.0, -405, 170); + addRoom(QStringLiteral("Bath Room"), QStringLiteral("Bathroom"), 30, 1.0, -20, -320); +#if !defined(KNX_BACKEND) + addRoom(QStringLiteral("Entrance"), QStringLiteral("Entrance"), 20, 0.6, -450, -70); +#endif +} + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.h new file mode 100644 index 0000000..2ab134b --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/housemodel.h @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef HOUSEMODEL_H +#define HOUSEMODEL_H + +#include +#include +#include + +class Room +{ +public: + Room(const QString &name, const QString &item, + int temperature, double light, int x, int y) + : m_name(name) + , m_item(item) + , m_temperature(temperature) + , m_light(light) + , m_xPos(x) + , m_yPos(y) {} + + QString getName() const { return m_name; } + QString getItem() const { return m_item; } + int getTemperature() const { return m_temperature; } + int getXPos() const { return m_xPos; } + int getYPos() const { return m_yPos; } + void setTemperature(int temperature) { m_temperature = temperature; } + double getLight() const { return m_light; } + void setLight(double light) { m_light = light; } + void setXPos(int x) { m_xPos = x; } + void setYPos(int y) { m_xPos = y; } + +private: + QString m_name; + QString m_item; + int m_temperature; + double m_light; + int m_xPos; + int m_yPos; +}; + +class HouseModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum RoomRoles { + NameRole = 0, + ItemRole, + TemperatureRole, + LightRole, + XPosRole, + YPosRole + }; + + HouseModel(QObject *parent = 0); + virtual QHash roleNames() const; + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + void addRoom(const QString &name, const QString &item, + int temperature, double light, int xPos, int yPos); + +private: + void generateRooms(); + + QList m_rooms; +}; + +#endif // HOUSEMODEL_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/images/home-automation-demo.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/images/home-automation-demo.png new file mode 100644 index 0000000..f6de49c --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/images/home-automation-demo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d9ac8b11e7dc4ed02a3199671477bc9d094be805d454b518a7594534613b41f +size 3526749 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/main.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/main.cpp new file mode 100644 index 0000000..a6239a6 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/main.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "housemodel.h" +#if defined(KNX_BACKEND) +#include "qmlknxdemo.h" +#endif +#define ALEXA_WEMO +#if defined(ALEXA_WEMO) +#include "qvirtualbelkinwemo.h" +#endif + +// Uncomment for 1280x900 window +//#define FIXEDWINDOW + +int applyFontRatio(const int value, const int ratioFont) +{ + return int(value * ratioFont); +} + +int applyRatio(const int value, const int ratio) +{ + return qMax(2, int(value * ratio)); +} + +void setupWemoToKnx(QmlKnxDemo *m_knxBackend) +{ +#if defined(ALEXA_WEMO) + static quint16 nextPort = 52000; + static QVector devices; + static QObject parent; + static QVirtualBelkinWeMo livingRoom(nullptr, "Livingroom"); + static QVirtualBelkinWeMo masterbedroom(nullptr, "Master bedroom"); + static QVirtualBelkinWeMo bedroom(nullptr, "Bedroom"); + static QVirtualBelkinWeMo bathroom(nullptr, "Bathroom"); + static QVirtualBelkinWeMo all(nullptr, "all"); + + devices.push_back(&livingRoom); + devices.push_back(&masterbedroom); + devices.push_back(&bedroom); + devices.push_back(&bathroom); + devices.push_back(&all); + + livingRoom.startListening(nextPort++); + masterbedroom.startListening(nextPort++); + bedroom.startListening(nextPort++); + bathroom.startListening(nextPort++); + all.startListening(nextPort++); + + qDebug () << "11111 Connecting services!"; + for (int lightNum = 0; lightNum < devices.size(); ++lightNum) { + if (lightNum == (devices.size()-1)) + { + QObject::connect(dynamic_cast(devices[lightNum]->getService("")), &QUPnPBooleanService::stateChanged, [m_knxBackend](bool state){ + for (int i = 1; i <= 4; ++i) { + if (m_knxBackend->getLightState(i) != state) + m_knxBackend->toggleLight(i); + } + m_knxBackend->changeRoom(0); + }); + + break; + } + QObject::connect(dynamic_cast(devices[lightNum]->getService("")), &QUPnPBooleanService::stateChanged, [lightNum, m_knxBackend](bool state){ + if (m_knxBackend->getLightState(lightNum+1) != state) + m_knxBackend->toggleLight(lightNum+1); + m_knxBackend->changeRoom(lightNum+1); + qDebug () << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Switching light! "<< lightNum+1 <<"state "<< (state ? "true":"false") << " light_state:" << m_knxBackend->getLightState(lightNum+1); + }); + QObject::connect(dynamic_cast(devices[lightNum]->getService("")), &QUPnPBooleanService::stateChangeFailed, [lightNum](){ + qDebug () << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Switching light FAILEDDD! "<< lightNum+1; + }); + } + +// QUPnPRootDevice rootdev(nullptr, "Qt UPnP to KNX Bridge"); +// QUPnPBooleanService *service = new QUPnPBooleanServiceProxy(&rootdev, dynamic_cast(devices[0]->getService("")), "SwitchPower"); +// rootdev.addService(service); +// rootdev.startListening(nextPort++); +#else + Q_UNUSED(m_knxBackend) +#endif + return; +} + + +int main(int argc, char *argv[]) +{ +////#if defined(Q_OS_MACOS) +// QSurfaceFormat openGLFormat; +// openGLFormat.setRenderableType(QSurfaceFormat::OpenGL); +// openGLFormat.setProfile(QSurfaceFormat::CoreProfile); +// openGLFormat.setMajorVersion(3); +// openGLFormat.setMinorVersion(0); + +// //openGLFormat.setStencilBufferSize(8); +// QSurfaceFormat::setDefaultFormat(openGLFormat); +////#endif + + QGuiApplication app(argc, argv); + + // Define size variants for scaling + qreal refDpi = 96.; + qreal refWidth = 1280.; + qreal refHeight = 900.; + QRect rect = QGuiApplication::primaryScreen()->geometry(); + qreal width = rect.width(); + qreal height = rect.height(); + qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch(); + qreal widthRatio = width / refWidth; + qreal heightRatio = height / refHeight; + qreal ratioFont = qMin(height * dpi / (refDpi * refHeight), width * dpi / (refDpi * refWidth)); + if (widthRatio < 1.) + widthRatio = 1; + if (heightRatio < 1.) + heightRatio = 1; + if (ratioFont < 1.) + ratioFont = 1; + +#ifdef FIXEDWINDOW + width = refWidth; + height = refHeight; + widthRatio = 1; + heightRatio = 1; + ratioFont = 1; +#endif + + QQmlPropertyMap sizesMap; + sizesMap.insert(QStringLiteral("screenHeight"), QVariant(height)); + sizesMap.insert(QStringLiteral("screenWidth"), QVariant(width)); + sizesMap.insert(QStringLiteral("fontSize"), QVariant(applyFontRatio(26, ratioFont))); + sizesMap.insert(QStringLiteral("controlHeight"), QVariant(applyFontRatio(64, ratioFont))); + sizesMap.insert(QStringLiteral("labelMouseMargin"), QVariant(applyRatio(20, widthRatio))); + sizesMap.insert(QStringLiteral("controlMargin"), QVariant(applyRatio(20, widthRatio))); + sizesMap.insert(QStringLiteral("controlBorderWidth"), QVariant(applyRatio(3, widthRatio))); + sizesMap.insert(QStringLiteral("sliderMaxWidth"), QVariant(applyRatio(300, widthRatio))); + + QQuickView viewer; + + viewer.engine()->addImportPath(QStringLiteral(":/qml/imports")); + +#ifndef Q_OS_ANDROID + // Hack to get self build working. + // Also needs the Qt3DStudio\bin directory in run environment path. + viewer.engine()->addImportPath(QStringLiteral("C:/Qt/Tools/Qt3DStudio/qml")); +#endif + +#if defined(KNX_BACKEND) + qmlRegisterUncreatableType("QmlKnxDemo", 1, 0, "QmlKnxDemo", "Not instantiated from QML"); + QmlKnxDemo *m_knxBackend = new QmlKnxDemo; + viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), m_knxBackend); + setupWemoToKnx(m_knxBackend); +#else + viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), nullptr); +#endif + + HouseModel *m_houseModel = new HouseModel; + viewer.engine()->rootContext()->setContextProperty(QStringLiteral("houseModel"), m_houseModel); + + viewer.engine()->rootContext()->setContextProperty(QStringLiteral("sizesMap"), &sizesMap); + viewer.engine()->rootContext()->setContextProperty(QStringLiteral("heightRatio"), heightRatio); + + viewer.setSource(QUrl(QStringLiteral("qrc:/main.qml"))); + + viewer.setTitle(QStringLiteral("Qt 3D Studio Home Automation Demo")); + viewer.setResizeMode(QQuickView::SizeViewToRootObject); +#ifdef FIXEDWINDOW + viewer.setMinimumSize(QSize(width, height)); + viewer.setMaximumSize(QSize(width, height)); + viewer.show(); +#else + viewer.showFullScreen(); +#endif + + return app.exec(); +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.cpp new file mode 100644 index 0000000..629c8c7 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qalexatoknx.h" +#include "mainwindow.h" + +QAlexaToKnx::QAlexaToKnx(MainWindow *target, QString name) + : QUPnPBooleanService(target) +{ + this->m_target = target; + this->identifier = name; +} + +bool QAlexaToKnx::doSetState(bool state) +{ + m_target->append(identifier + " changed state to " + (state?"TRUE":"FALSE")); + return true; +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.h new file mode 100644 index 0000000..2b3c9d1 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qalexatoknx.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QALEXATOKNX_H +#define QALEXATOKNX_H + +#include "qupnpservice.h" + +class MainWindow; + +class QAlexaToKnx : public QUPnPBooleanService //QVirtualBelkinWeMo +{ + Q_OBJECT + MainWindow *m_target; +public: + QAlexaToKnx(MainWindow *target, QString name); +protected: + bool doSetState(bool state) override; +}; + +#endif // QALEXATOKNX_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.cpp new file mode 100644 index 0000000..bef2161 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.cpp @@ -0,0 +1,281 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qminimalhttpserver.h" + +QMinimalHttpServer::QMinimalHttpServer(QObject *parent) + : QObject(parent) +{ + connect(&tcpServer, &QTcpServer::newConnection, this, &QMinimalHttpServer::onNewTcpConnection); +} + +QMinimalHttpServer::~QMinimalHttpServer() +{ +} + +void QMinimalHttpServer::addFile(QString filename, QByteArray &data, QString mimetype) +{ + filename = filename.toUpper(); // ensure case insensitivity + if (!filename.startsWith("/")) + filename = QStringLiteral("/") + filename; + + httpFiles[filename] = data; + if (mimetype == "") { + QMimeDatabase db; + QList types = db.mimeTypesForFileName(filename); + if (types.size() > 0) + mimetype = types[0].name(); + } + httpFileMimeTypes[filename] = mimetype; +} + +void QMinimalHttpServer::onNewTcpConnection() +{ + for (QTcpSocket* socket = tcpServer.nextPendingConnection(); socket; socket = tcpServer.nextPendingConnection()) { + #ifdef QT_DEBUG + qDebug() << "QMinimalHttpServer::connected " << socket->peerAddress().toString() << ":" << socket->peerPort(); + #endif + + connect(socket, &QTcpSocket::readyRead, [this, socket](){ + this->onTcpDataReceived(socket); + }); + connect(socket, &QTcpSocket::disconnected, [this, socket](){ + #ifdef QT_DEBUG + qDebug() << "QMinimalHttpServer::disconnected " << socket->peerAddress().toString() << ":" << socket->peerPort(); + #endif + //emit this->disconnected(socket); + }); + } +} + +void QMinimalHttpServer::onTcpDataReceived(QTcpSocket *socket) +{ + QByteArray data = socket->readAll(); + #ifdef QT_DEBUG + qDebug() << "QMinimalHttpServer::onTcpDataReceived " << data; + #endif + this->processTcpData(data, socket); +} + +void QMinimalHttpServer::processTcpData(const QByteArray &data, QTcpSocket *socket) +{ + QStringList lines = QString::fromUtf8(data).split("\r\n"); + QStringList request = lines[0].split(" ", QString::SkipEmptyParts); + QString responseHead = QStringLiteral("HTTP/1.1 200 OK\r\n"); + QByteArray responseBody; + int status = 200; + + QString filename = request[1].toUpper(); + if (!filename.startsWith("/")) + filename = QStringLiteral("/") + filename; + filename = filename.replace("%20", " "); + + if (request[0].toUpper() == "GET") { + if (httpFiles.contains(filename)) { + responseBody = httpFiles[filename]; + responseHead += QStringLiteral("content-type: ") + httpFileMimeTypes[filename] + "\r\n"; + } else if (this->processHttpGetRequest(filename, responseHead, responseBody)) { + // in this case, everything must be done inside processGetRequest + } else { + responseHead = "HTTP/1.0 404 Not Found\r\n"; + status = 404; + } + + } else if (request[0].toUpper() == "POST") { + + // find and validate "Content-Length:" header + int contentLength = -1; + int i = 0; + for (; i < lines.size(); i++) { + if (lines[i].startsWith("Content-Length:", Qt::CaseInsensitive)) + contentLength = lines[i].mid(15).trimmed().toInt(); + if (lines[i].trimmed()=="") + break; + } + if (contentLength < 0) { + responseHead = "HTTP/1.0 411 Length Required\r\n"; + status = 411; + } else if (contentLength > maxPostRequestContentLength) { + responseHead = "HTTP/1.0 413 Payload Too Large\r\n"; + status = 413; + } + + // get the requests body + int postBodyOffset = -1; + for (int i = 0; postBodyOffset < 0 && i < data.size()-4; i++) + if (data[i] == '\r' && data[i+1] == '\n' && data[i+2] == '\r' && data[i+3] == '\n') + postBodyOffset = i+4; + QByteArray postBody; + if (0 <= postBodyOffset && postBodyOffset < data.size()) + postBody = data.mid(postBodyOffset); + + // multi-part message, wait for more packets + while (status == 200 && postBody.size() < contentLength) { + if (socket->waitForReadyRead(2000)) { + QByteArray moreData = socket->readAll(); + #ifdef QT_DEBUG + qDebug() << "QMinimalHttpServer::processTcpData MORE DATA:" << moreData; + #endif + postBody.append(moreData); + } else { + responseHead = "HTTP/1.0 408 Request Timeout\r\n"; + status = 408; + } + } + + // call the handler + if (status == 200) + status = this->processHttpPostRequest(filename, postBody, responseHead, responseBody); + + } else if (request[0].toUpper() == "SUBSCRIBE") { + this->processHttpSubscribeRequest(filename, lines, responseHead, responseBody); + } else if (request[0].toUpper() == "UNSUBSCRIBE") { + this->processHttpUnsubscribeRequest(filename, lines, responseHead, responseBody); + } + + + responseHead += QStringLiteral( + "content-length: ") + QString::number(responseBody.size()) + "\r\n" + "last-modified: Tue, 23 Jan 2018 15:54:00 GMT\r\n" + "date: " + DateRfc7231() + "\r\n" + "connection: close\r\n"; + + #ifdef QT_DEBUG + qDebug() << "QMinimalHttpServer::processTcpData" << responseHead << responseBody; + #endif + + socket->write((responseHead+"\r\n").toUtf8()); + socket->write(responseBody); +} + +/***************************************************************************\ + * Overrides of this method may add headers and set the responseBody. * + * returning true means that the request has successfully been processed * + * returning false means that the (overridden) method could not deliver * + * a response, so then a 404 will be sent. * +\***************************************************************************/ +bool QMinimalHttpServer::processHttpGetRequest(QString urlUpper, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(urlUpper); + Q_UNUSED(responseHead); + Q_UNUSED(responseBody); + return false; +} + +/***************************************************************************\ + * Overrides of this method may add headers and set the responseBody. * + * return value should be an HTTP status code corresponding to the * + * status that is set in the responseHead. * + * Since the method is only invoked if the status was 200 before, * + * returning 200 is valid in cases where responseHead is not changed * +\***************************************************************************/ +int QMinimalHttpServer::processHttpPostRequest(QString urlUpper, QByteArray &postBody, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(urlUpper); + Q_UNUSED(postBody); + Q_UNUSED(responseBody); + responseHead = "HTTP/1.0 403 Forbidden\r\n"; + return 403; +} + +int QMinimalHttpServer::processHttpSubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(urlUpper); + Q_UNUSED(requestLines); + Q_UNUSED(responseBody); + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; +} + +int QMinimalHttpServer::processHttpUnsubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(urlUpper); + Q_UNUSED(requestLines); + Q_UNUSED(responseBody); + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; +} + + + +void QMinimalHttpServer::startListening(quint16 port) +{ + if (isListening()) + return; + tcpServer.listen(QHostAddress::Any, port); +} + +void QMinimalHttpServer::stopListening() +{ + if (!isListening()) + return; + tcpServer.close(); +} + +bool QMinimalHttpServer::isListening() +{ + return tcpServer.isListening(); +} + +QString QMinimalHttpServer::DateRfc7231(const QDateTime &date) +{ + static const QString daysEn[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + static const QString monthsEn[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + QString sDate = daysEn[ date.date().dayOfWeek() - 1 ] + + date.toString(", dd ") + + monthsEn[ date.date().month() - 1 ] + + date.toString(" yyyy HH:mm::ss") + + " GMT"; + return std::move(sDate); +} +QString QMinimalHttpServer::DateRfc7231() +{ + return std::move(DateRfc7231(QDateTime::currentDateTimeUtc())); +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.h new file mode 100644 index 0000000..5b573e9 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qminimalhttpserver.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMINIMALHTTPSERVER_H +#define QMINIMALHTTPSERVER_H + +#include +#include +#include +#include +#include +#include + +class QMinimalHttpServer : public QObject +{ + Q_OBJECT +protected: + QTcpServer tcpServer; + QMap httpFiles; + QMap httpFileMimeTypes; + int maxPostRequestContentLength = INT_MAX; + + void onNewTcpConnection(); + void onTcpDataReceived(QTcpSocket *socket); + virtual void processTcpData(const QByteArray &data, QTcpSocket *socket); + virtual bool processHttpGetRequest(QString urlUpper, QString &responseHead, QByteArray &responseBody); + virtual int processHttpPostRequest(QString urlUpper, QByteArray &postBody, QString &responseHead, QByteArray &responseBody); + virtual int processHttpSubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody); + virtual int processHttpUnsubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody); + + static QString DateRfc7231(const QDateTime &date); + static QString DateRfc7231(); + +public: + explicit QMinimalHttpServer(QObject *parent = nullptr); + virtual ~QMinimalHttpServer(); + Q_DISABLE_COPY(QMinimalHttpServer) + + void addFile(QString filename, QByteArray &data, QString mimetype = QString()); + void startListening(quint16 port = 0); + void stopListening(); + bool isListening(); +}; + +#endif // QMINIMALHTTPSERVER_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/HomeView.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/HomeView.qml new file mode 100644 index 0000000..2dd9dd7 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/HomeView.qml @@ -0,0 +1,401 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import QtQuick.Controls 2.3 +import QtStudio3D 1.0 + +Item { + id: home + + property real red: 0 + property real blue: 255 + property real green: 0 + property real light: 0 + + property string currentTempAttribute: "" + property string currentLightAttribute: "" + + Timer { + id: goToHomeTimer + interval: 30000 + running: false + repeat: false + + onTriggered: presentation.goToSlide("Scene", "BackToInitialView") + } + + Timer { + id: showMenuTimer + interval: 1000 + running: false + repeat: false + + onTriggered: mainMenu.visible = true + } + + signal studio3DPresentationReady() + + function getRoomName(index) { + var name; + if (index === 0) + name = "BackToInitialView" + else if (index === 1) + name = "Livingroom" + else if (index === 2) + name = "Masterbedroom" + else if (index === 3) + name = "Bedroom" + else if (index === 4) + name = "Bathroom" + return name + } + + // + // Qt 3D Studio presentation + // + Studio3D { + anchors.fill: parent + + ViewerSettings { + scaleMode: ViewerSettings.ScaleModeFill + } + + Presentation { + id: presentation + source: "qrc:/uip/houseStudio.uip" + + SceneElement { + id: scene + elementPath: "Scene" + onCurrentSlideNameChanged: { + var lightNum = 0 + var startTimer = false; + if (currentSlideName === "Livingroom") { + currentTempAttribute = "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_LivingRoom.HeatAreas_Heat_LivingRoom.Heat_LivingRoomSG" + currentLightAttribute = "Scene.3D.RoomLights.LivingroomLightMap.House" + livingRoomHeat.goToTime(2) + masterBedroomHeat.goToTime(0) + bedroomHeat.goToTime(0) + bathRoomHeat.goToTime(0) + entranceHeat.goToTime(0) + sliderToolbar.visible = true + lightNum = 1 + } else if (currentSlideName === "Masterbedroom") { + currentTempAttribute = "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_MasterBedroom.HeatAreas_Heat_MasterBedroom.Heat_MasterBedroomSG" + currentLightAttribute = "Scene.3D.RoomLights.MasterbedroomLightmap.House" + livingRoomHeat.goToTime(0) + masterBedroomHeat.goToTime(2) + bedroomHeat.goToTime(0) + bathRoomHeat.goToTime(0) + entranceHeat.goToTime(0) + sliderToolbar.visible = true + lightNum = 2 + } else if (currentSlideName === "Bedroom") { + currentTempAttribute = "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_BedRoom.HeatAreas_Heat_BedRoom.Heat_BedRoomSG" + currentLightAttribute = "Scene.3D.RoomLights.BedroomLightmap.House" + livingRoomHeat.goToTime(0) + masterBedroomHeat.goToTime(0) + bedroomHeat.goToTime(2) + bathRoomHeat.goToTime(0) + entranceHeat.goToTime(0) + sliderToolbar.visible = true + lightNum = 3 + } else if (currentSlideName === "Bathroom") { + currentTempAttribute = "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_BathRoom.HeatAreas_Heat_BathRoom.Heat_BathRoomSG" + currentLightAttribute = "Scene.3D.RoomLights.BathroomLightmap.House" + livingRoomHeat.goToTime(0) + masterBedroomHeat.goToTime(0) + bedroomHeat.goToTime(0) + bathRoomHeat.goToTime(2) + entranceHeat.goToTime(0) + sliderToolbar.visible = true + lightNum = 4 + } else if (currentSlideName === "Entrance") { + currentTempAttribute = "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_Entrance.Heat_Entrance_HeatAreas.Heat_EntranceSG" + currentLightAttribute = "Scene.3D.RoomLights.EntranceLightmap.House" + livingRoomHeat.goToTime(0) + masterBedroomHeat.goToTime(0) + bedroomHeat.goToTime(0) + bathRoomHeat.goToTime(0) + entranceHeat.goToTime(2) + sliderToolbar.visible = true + } else if (currentSlideName === "FloorPlan") { + livingRoomHeat.goToTime(0) + masterBedroomHeat.goToTime(0) + bedroomHeat.goToTime(0) + bathRoomHeat.goToTime(0) + entranceHeat.goToTime(0) + startTimer = true; + sliderToolbar.visible = false + } else { + sliderToolbar.visible = false + } + + if (currentSlideName === "FloorPlan") { + if (previousSlideName === "InitialView") + mainMenu.visible = true + else + showMenuTimer.start() + } else { + if (showMenuTimer.running) + showMenuTimer.stop() + mainMenu.visible = false + } + + if (startTimer) + goToHomeTimer.start() + else if (goToHomeTimer.running) + goToHomeTimer.stop() + + presentation.setAttribute(currentTempAttribute, "diffuse.r", red) + presentation.setAttribute(currentTempAttribute, "diffuse.g", green) + presentation.setAttribute(currentTempAttribute, "diffuse.b", blue) + presentation.setAttribute(currentLightAttribute, "opacity", light) + + if (knxBackend) { + lightControlLoader.item.lightNum = lightNum + lightControlLoader.item.updateLight(knxBackend.getLightState(lightNum)) + tempSlider.setPositionByColor(knxBackend.getColor()) + console.log("<<<<<<<<<<<<<<<<<<<1") + } + } + } + + SceneElement { + id: livingRoomHeat + elementPath: "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_LivingRoom" + } + SceneElement { + id: masterBedroomHeat + elementPath: "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_MasterBedroom" + } + SceneElement { + id: bedroomHeat + elementPath: "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_BedRoom" + } + SceneElement { + id: bathRoomHeat + elementPath: "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_BathRoom" + } + SceneElement { + id: entranceHeat + elementPath: "Scene.3D.HeatAreas.Group_HeatAreas.HeatAreas_Heat_Entrance" + } + } + + // Once https://bugreports.qt.io/browse/QT3DS-414 is solved uncomment the following lines. +// onPresentationReady: { +// if (presentationReady) +// home.studio3DPresentationReady() +// } + + } + + Connections { + target: knxBackend + onRoomChanged: presentation.goToSlide("Scene", getRoomName(roomId)) + onBoardUpdate: { + console.log("signal onBoardUpdate lightNum: " + lightNum) + if (lightNum > 0 + && lightNum < 5 + && lightControlLoader.item.lightNum == lightNum + && knxBackend.getLightState(lightNum) != lightControlLoader.item.checked) { + var oldValue = houseModel.data(houseModel.index(lightNum - 1, 0), 3) + houseModel.setData(houseModel.index(lightNum - 1, 0), !oldValue, 3) + lightControlLoader.item.value = houseModel.data(houseModel.index(lightNum - 1, 0), 3) + lightControlLoader.item.updateLight(knxBackend.getLightState(lightNum)) + console.log("lightControlLoader: " + lightControlLoader.item.value) + } + } + onColorLedChange: { + var sliderColor = Qt.rgba(tempSlider.redColor, tempSlider.greenColor, tempSlider.blueColor, 1) + if (!Qt.colorEqual(sliderColor, color)) + tempSlider.setPositionByColor(color) + } +// knxBoard.changeColorLeftLed(color) +// onRockerChange: { +// logo.rotation = (position - 1000) * 360 / 1000; +// } + } + + MouseArea { + id: mouseArea + property bool disableMouseEvents: false + anchors.fill: parent + onClicked: { + if (!disableMouseEvents) { + if (scene.currentSlideName === "BackToInitialView") { + presentation.goToSlide("Scene", "InitialView") + disableMouse(2200) + } else if (scene.currentSlideName === "FloorPlan") { + presentation.goToSlide("Scene", "BackToInitialView") + disableMouse(2100) + } else if (scene.currentSlideName !== "InitialView") { + presentation.goToSlide("Scene", "FloorPlan") + disableMouse(1000) + } + } + } + + function disableMouse(animationDuration) { + disableMouseEvents = true + mouseTimer.interval = animationDuration + mouseTimer.start() + } + + Timer { + id: mouseTimer + interval: 1000 + running: false + repeat: false + + onTriggered: mouseArea.disableMouseEvents = false + } + } + + // + // Room label items + // + MainMenu { + id: mainMenu + + property int currentIndex: -1 + + visible: false + anchors.fill: parent + + onCurrentMenuItemChanged: { + presentation.goToSlide("Scene", currentItem) + + // Store temperature and light to model before changing the slider value + if (currentIndex != -1) { + houseModel.setData(houseModel.index(currentIndex, 0), tempSlider.currentValue, 2) + houseModel.setData(houseModel.index(currentIndex, 0), lightControlLoader.item.currentValue, 3) + } + currentIndex = index + var temp = houseModel.data(houseModel.index(index, 0), 2) + tempSlider.value = (temp - 15) / 15 + lightControlLoader.item.value = houseModel.data(houseModel.index(index, 0), 3) + } + } + + // + // Toolbar for Sliders + // + Item { + id: sliderToolbar + anchors.bottom: parent.bottom + height: tempSlider.height + anchors.horizontalCenter: parent.horizontalCenter + width: lightControlLoader.width + sizesMap.controlMargin + tempSlider.width + + visible: false + + Loader { + id: lightControlLoader + source: knxBackend ? "LightSwitch.qml" : "LightSlider.qml" + asynchronous: true + anchors.bottom: parent.bottom + anchors.bottomMargin: sizesMap.controlMargin + anchors.left: parent.left + width: knxBackend ? (sizesMap.controlHeight * 2) : (mainMenu.width / 3) + } + + Connections { + target: lightControlLoader.item + onLightValueChanged: { + var newLightValue = lightControlLoader.item.lightValue * 100 + home.light = newLightValue + presentation.setAttribute(currentLightAttribute, "opacity", newLightValue) + + } + } + + TempSlider { + id: tempSlider + anchors.bottom: parent.bottom + anchors.bottomMargin: sizesMap.controlMargin + anchors.right: parent.right + width: mainMenu.width / 3 + + onRedColorChanged: { + home.red = redColor + presentation.setAttribute(currentTempAttribute, "diffuse.r", redColor) + } + onBlueColorChanged: { + home.blue = blueColor + presentation.setAttribute(currentTempAttribute, "diffuse.b", blueColor) + } + + onGreenColorChanged: { + home.green = greenColor + presentation.setAttribute(currentTempAttribute, "diffuse.g", greenColor) + } + + onEconomyChanged: { + if (knxBackend) { + // Toggle red light based on temperature changes + // The initial state of red lights on the board needs to be based on the default temperatures + var lightNum = 0 + if (scene.currentSlideName === "Livingroom") + lightNum = 9 + else if (scene.currentSlideName === "Masterbedroom") + lightNum = 10 + else if (scene.currentSlideName === "Bedroom") + lightNum = 11 + else if (scene.currentSlideName === "Bathroom") + lightNum = 12 + //knxBackend.toggleLight(lightNum) + } + } + } + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSlider.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSlider.qml new file mode 100644 index 0000000..8f00abd --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSlider.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 + +SliderControl { + id: lightSlider + + property real lightValue: lightSlider.position + + sliderColor: "black" + currentValue: lightValue.toFixed(1) + + text: currentValue * 100 + "%" + iconSource: "qml/images/icon_light.png" + + onPositionChanged: { + setNewLightColor() + } + + function setNewLightColor() { + // From black to white + var newColorValue = lightSlider.position * 255 + sliderColor = rgbToHex(newColorValue, newColorValue, newColorValue) + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSwitch.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSwitch.qml new file mode 100644 index 0000000..86fe602 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/LightSwitch.qml @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import QtQuick.Controls 2.3 +import Style 1.0 + +Item { + id: lightSwitch + property real value: control.checked ? 1.0 : 0.0 + property real lightValue: control.position + property real currentValue: lightValue.toFixed(1) + property real lightNum: 0 + + width: sizesMap.controlHeight * 2 + height: sizesMap.controlHeight + sliderText.height + function updateLight(state) { + control.checked = state + } + + Text { + id: sliderText + anchors.bottom: control.top + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + font.pixelSize: sizesMap.fontSize + color: Style.textColor + font.bold: true + style: Text.Outline + styleColor: Style.sliderBackgroundColor + } + + Switch { + id: control + width: lightSwitch.width + height: sizesMap.controlHeight + + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.margins: sizesMap.controlMargin / 2 + onClicked: { + console.log('Clicked on ligth!'+ lightNum) + knxBackend.toggleLight(lightNum) + } + indicator: Rectangle { + implicitWidth: sizesMap.controlHeight * 2 + implicitHeight: sizesMap.controlHeight + x: control.leftPadding + y: control.topPadding + control.availableHeight / 2 - height / 2 + radius: height / 2 + color: control.checked ? Style.sliderSelectionColor : Style.sliderBackgroundColor + border.color: Style.backgroundColor + border.width: sizesMap.controlBorderWidth + opacity: control.enabled ? 1 : 0.3 + + Rectangle { + x: control.checked ? parent.width - width : 0 + width: sizesMap.controlHeight + height: sizesMap.controlHeight + radius: height / 2 + antialiasing: true + color: Style.backgroundColor + opacity: control.enabled ? 1 : 0.3 + Image { + id: handleItemIcon + anchors.fill: parent + fillMode: Image.PreserveAspectFit + anchors.margins: sizesMap.controlMargin / 2 + anchors.centerIn: parent + source: "qml/images/icon_light.png" + } + } + } + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/MainMenu.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/MainMenu.qml new file mode 100644 index 0000000..dcbb281 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/MainMenu.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import Style 1.0 + +Item { + id: menuItem + property int horizontalScreenCenter: main.width / 2 + property int verticalScreenCenter: main.height / 2 + + signal currentMenuItemChanged(int index, string currentItem) + + Repeater { + id: mainListView + model: houseModel + delegate: listElement + } + + // Delegate for items in list view + Component { + id: listElement + + RoomLabel { + // Position is defined in the model relative to the center of the screen. + // Scale the label position here. + x: menuItem.horizontalScreenCenter + (heightRatio * xPos) - sizesMap.labelMouseMargin + y: menuItem.verticalScreenCenter + (heightRatio * yPos) - sizesMap.labelMouseMargin + text: name + onRoomLabelClicked: currentMenuItemChanged(index, item) + } + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/RoomLabel.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/RoomLabel.qml new file mode 100644 index 0000000..f948917 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/RoomLabel.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import Style 1.0 + +Item { + id: roomLabel + + // Provide bigger mouse area for label than the visual label is + + property alias text: roomText.text + + signal roomLabelClicked + + height: sizesMap.controlHeight + width: labelRect.width + sizesMap.labelMouseMargin * 2 + + Rectangle { + id: labelRect + width: roomText.width + sizesMap.controlMargin * 2 + height: roomText.height + sizesMap.controlMargin + anchors.centerIn: parent + color: Style.sliderBackgroundColor + radius: width / 2 + border.color: Style.backgroundColor + border.width: sizesMap.controlBorderWidth + + Text { + id: roomText + anchors.centerIn: parent + font.pixelSize: sizesMap.fontSize + color: Style.textColor + } + } + + MouseArea { + anchors.fill: parent + onClicked: roomLabelClicked() + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SliderControl.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SliderControl.qml new file mode 100644 index 0000000..14c6f5d --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SliderControl.qml @@ -0,0 +1,150 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import QtQuick.Controls 2.1 +import Style 1.0 + +Item { + id: sliderControl + signal moved(real position) + + property alias position: control.position + property alias value: control.value + property alias text: sliderText.text + property alias iconSource: handleItemIcon.source + + property color sliderColor + property real currentValue: 0 + + width: sizesMap.sliderMaxWidth + height: sizesMap.controlHeight + sliderText.height + + Text { + id: sliderText + anchors.bottom: control.top + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + font.pixelSize: sizesMap.fontSize + color: Style.textColor + font.bold: true + style: Text.Outline + styleColor: Style.sliderBackgroundColor + } + + Slider { + id: control + + width: sliderControl.width + height: sizesMap.controlHeight + + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.margins: sizesMap.controlMargin / 2 + + onMoved: parent.moved(position) + + background: Rectangle { + x: control.leftPadding + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: sizesMap.sliderMaxWidth + implicitHeight: sizesMap.controlHeight + width: control.availableWidth + height: implicitHeight + color: Style.sliderBackgroundColor + radius: height / 2 + border.color: Style.backgroundColor + border.width: sizesMap.controlBorderWidth + opacity: control.enabled ? 1 : 0.3 + + Rectangle { + width: handleItem.x + handleItem.width - 5 + height: parent.height + color: Style.sliderSelectionColor + border.color: Style.backgroundColor + border.width: sizesMap.controlBorderWidth + radius: height / 2 + } + } + + handle: Rectangle { + id: handleItem + x: control.leftPadding + control.visualPosition * (control.availableWidth - width) + y: control.topPadding + control.availableHeight / 2 - height / 2 + implicitWidth: sizesMap.controlHeight + implicitHeight: sizesMap.controlHeight + radius: height / 2 + antialiasing: true + color: Style.backgroundColor + opacity: control.enabled ? 1 : 0.3 + Image { + id: handleItemIcon + anchors.fill: parent + fillMode: Image.PreserveAspectFit + anchors.margins: sizesMap.controlMargin / 2 + anchors.centerIn: parent + + } + } + } + + function rgbToHex(red, green, blue) { + // Based on http://www.javascripter.net/faq/rgbtohex.htm + return "#" + toHex(red) + toHex(green) + toHex(blue) + } + + function toHex(n) { + if (isNaN(n)) + return "00" + n = Math.max(0, Math.min(n, 255)) + return "0123456789ABCDEF".charAt((n - n % 16) / 16) + + "0123456789ABCDEF".charAt(n % 16) + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SplashScreen.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SplashScreen.qml new file mode 100644 index 0000000..94df270 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/SplashScreen.qml @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import Style 1.0 + +Rectangle { + anchors.fill: parent + color: Style.backgroundColor + + Image { + anchors.centerIn: parent + source: "qrc:/qml/images/QtSymbol.png" + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/TempSlider.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/TempSlider.qml new file mode 100644 index 0000000..8220669 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/TempSlider.qml @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 + +SliderControl { + id: tempSlider + property real redColor + property real blueColor + property real greenColor + property bool economy: currentValue < 22 ? true : false + + currentValue: 15 + sliderColor: "#0000ff" + + text: currentValue + "°" + iconSource: "qml/images/icon_temp.png" + + onPositionChanged: { + updateCurrentTemp() + setNewTempColor() + } + + onMoved: { + var position = 0.6; + if (currentValue > 17 && currentValue < 26) + position = 0.45; + else if (currentValue >= 26) + position = 0.30; + knxBackend.colorSwitch(position) + console.log('moved color slider!'+ position) + } + + function setPositionByColor(color) + { + if (Qt.colorEqual(color, "magenta")) { + value = 0.5 + } + else if (Qt.colorEqual(color, "red")) { + value = 1 + } + else if (Qt.colorEqual(color, "blue")) { + value = 0 + } + } + + function updateCurrentTemp() { + // Temperature range from 15 to 30 + // Slider range form 0 to 1 + var newTempValue = 15 + 15 * tempSlider.position + tempSlider.currentValue = newTempValue.toFixed(0) + } + + function setNewTempColor() { + var position = tempSlider.position * 100 + // From blue to red + var r = Math.floor((255 * Math.sqrt(Math.sin(position * Math.PI / 200)))) + var b = Math.floor((255 * Math.sqrt(Math.cos(position * Math.PI / 200)))) + var g = 0 + redColor = r / 255 + blueColor = b / 255 + greenColor = 0 + sliderColor = rgbToHex(r, g, b) + + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/main.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/main.qml new file mode 100644 index 0000000..ca42332 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/HomeAutom/main.qml @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.8 +import Style 1.0 + +// Main Item +Item { + id: main + width: sizesMap.screenWidth + height: sizesMap.screenHeight + + // onPresentationReady() signal should be restored to 3D studio code so that we can hide + // the splashscreen without a timer, https://bugreports.qt.io/browse/QT3DS-414 + Timer { + id: showSplashScreenTimer + interval: 1000 + running: false + repeat: false + + onTriggered: hideSplashScreen() + } + + Loader { + id: appLoader + anchors.fill: parent + visible: false +// asynchronous: true // https://bugreports.qt.io/browse/QTBUG-50992 + } + + Connections { + target: appLoader.item + onStudio3DPresentationReady: hideSplashScreen() + } + + Timer { + interval: 5000 + running: true + repeat: true + onTriggered: knxBackend.reconnect() + } + + SplashScreen { + id: splashScreenLoader + visible: true + anchors.fill: parent + Component.onCompleted: { + appLoader.setSource("HomeView.qml") + showSplashScreenTimer.start() + } + } + + function hideSplashScreen() { + if (appLoader.status === Loader.Ready) { + splashScreenLoader.visible = false + appLoader.visible = true + } + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/QtSymbol.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/QtSymbol.png new file mode 100644 index 0000000..3c867cd --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/QtSymbol.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc885612c701d0b610bebe156dcb4b9d819a1ad6681465a53392705fed2b9d90 +size 4541 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_light.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_light.png new file mode 100644 index 0000000..2b35771 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00eec2e449fdc77fb81df23a8959bb83804ebd366f313014a36eb0bb81e5a740 +size 1210 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_temp.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_temp.png new file mode 100644 index 0000000..a82320b --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/images/icon_temp.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32584803b4e6fdfb4000954d88056b81f25ae849afdc64f112124ddd95243252 +size 1207 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/Style.qml b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/Style.qml new file mode 100644 index 0000000..451d231 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/Style.qml @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +pragma Singleton + +import QtQuick 2.8 + +QtObject { + + // Theme colors to be used through out whole system + readonly property color backgroundColor: "white" + readonly property color textColor: "white" + readonly property color sliderToolbarTextColor: "white" + readonly property color sliderToolbarRaisedTextColor: "black" + readonly property color menuBackgroundColor: "gray" + readonly property color menuSelectedItemColor: "#80bfff" + readonly property color sliderBackgroundColor: "#595959" + readonly property color sliderSelectionColor: "#a6a6a6" + + readonly property int visibilityAnimatorDuration: 500 +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/qmldir b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/qmldir new file mode 100644 index 0000000..858dcaf --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qml/imports/Style/qmldir @@ -0,0 +1,2 @@ +module Style +singleton Style 1.0 Style.qml diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.cpp new file mode 100644 index 0000000..b6e3d50 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.cpp @@ -0,0 +1,362 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "demodatapoint.h" +#include "qmlknxdemo.h" +#include "utils.h" + +#include +#include +#include +#include +#include + +namespace { + const double sliderSectionSize = 1 / 7.0; + using DeviceNumbers = EtsDevelopmentBoard::DeviceNumbers; +} + +QmlKnxDemo::QmlKnxDemo() + : m_tunnel(this) +{ + checkLightStatusOn(); + + if (auto blind = m_etsBoard.getBlind()) { + connect(blind, &DemoBlindDataPoint::blindChange, this, &QmlKnxDemo::blindPositionChange); + connect(blind, &DemoBlindDataPoint::blindFullyUp, this, &QmlKnxDemo::blindFullyUp); + connect(blind, &DemoBlindDataPoint::blindFullyDown, this, &QmlKnxDemo::blindFullyDown); + } + + if (auto rocker = m_etsBoard.getRocker()) + connect(rocker, &DemoRockerDataPoint::rockerChange, this, &QmlKnxDemo::rockerChange); + + if (auto colorLed = m_etsBoard.getColorLed()) + connect(colorLed, &DemoColorLed::colorChange, this, &QmlKnxDemo::colorLedChange); +} + +void QmlKnxDemo::toggleLight(int light) +{ + if (auto dpt = static_cast(m_etsBoard.getGroupObject(light))) { + dpt->uiToggle(); + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(light), dpt->bytes()); + } +} + +void QmlKnxDemo::colorSwitch(double value) +{ + QColor colorAtStart = colorState; + if (value < (sliderSectionSize / 2) + && colorState != Qt::black) + colorState = Qt::black; + + else if ((value > (sliderSectionSize / 2)) + && value < (3 * sliderSectionSize / 2) + && (colorState != Qt::white)) + colorState = Qt::white; + + else if ((value > (3 * sliderSectionSize / 2)) + && value < (5 * sliderSectionSize / 2) + && (colorState != Qt::red)) + colorState = Qt::red; + + else if ((value > (5 * sliderSectionSize / 2)) + && value < (7 * sliderSectionSize / 2) + && (colorState != Qt::magenta)) + colorState = Qt::magenta; + + else if ((value > (7 * sliderSectionSize / 2)) + && value < (9 * sliderSectionSize / 2) + && (colorState != Qt::blue)) + colorState = Qt::blue; + + else if ((value > (9 * sliderSectionSize / 2)) + && value < (11 * sliderSectionSize / 2) + && (colorState != Qt::cyan)) + colorState = Qt::cyan; + + else if (value > (11 * sliderSectionSize / 2) + && value < (13 * sliderSectionSize / 2) + && (colorState != Qt::green)) + colorState = Qt::green; + + else if (value > ((6 * sliderSectionSize) + (sliderSectionSize / 2)) + && (colorState != Qt::yellow)) + colorState = Qt::yellow; + + if (colorAtStart != colorState) { + if (auto led = m_etsBoard.getColorLed()) { + led->setCurrentColor(colorState); + sendColorLedGroupValueWriteFrames(m_tunnel, led); + } + } +} + +void QmlKnxDemo::toggleMiddleRight() +{ + auto light = DeviceNumbers::MIDDLE_RIGHT; + if (auto dpt = static_cast(m_etsBoard.getGroupObject(light))) { + dpt->uiToggle(); + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(light), dpt->bytes()); + } +} + +void QmlKnxDemo::toggleMiddleLeft() +{ + auto led = m_etsBoard.getColorLed(); + if (!led) + return; + + if (!led->isOn()) { + // set green color in dpt by default... + led->setCurrentColor(QColor(0, 255, 0)); + // send request to ets board + sendColorLedGroupValueWriteFrames(m_tunnel, led); + } else { + led->setCurrentColor(QColor(0, 0, 0)); + sendColorLedGroupValueWriteFrames(m_tunnel, led); + } +} + +QString QmlKnxDemo::getColor() const +{ + if (auto obj = m_etsBoard.getColorLed()) + return obj->currentColor().name(); + return {}; +} + +int QmlKnxDemo::getRockerPosition() const +{ + if (auto rocker = m_etsBoard.getRocker()) + return rocker->position(); + return 0; +} + +bool QmlKnxDemo::getLightState(int lightNum) const +{ + if (auto dpt = static_cast(m_etsBoard.getGroupObject(lightNum))) + return dpt->isOn(); + return false; +} + +int QmlKnxDemo::getBlindPosition() const +{ + if (auto blind = m_etsBoard.getBlind()) + return blind->position(); + return 0; +} + +void QmlKnxDemo::moveBlindUp() +{ + if (auto dpt = m_etsBoard.getBlind()) { + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(DeviceNumbers::E7), dpt->moveUpBytes(), + 0xac); + } +} + +void QmlKnxDemo::moveBlindDown() +{ + if (auto dpt = m_etsBoard.getBlind()) { + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(DeviceNumbers::E7), dpt->moveDownBytes(), + 0xac); + } +} + +void QmlKnxDemo::stopBlind() +{ + auto index = DeviceNumbers::E16; + if (auto dpt = static_cast(m_etsBoard.getGroupObject(index))) + sendGroupValueWrite(m_tunnel, m_etsBoard.getAddress(index), dpt->stopBytes(), 0xac); +} + +void QmlKnxDemo::handleFrame(const QKnxTunnelFrame &frame) +{ + auto str = frame.serviceInformation().bytes().toHex(); + auto dstAdd = frame.destinationAddress().toString(); + + if (QKnxCemiFrame::MessageCode::DataConfirmation == frame.messageCode() + || QKnxCemiFrame::MessageCode::DataIndication == frame.messageCode()) { + // data indication come from pushing buttons on the Board + // data confirmation are responses to App UI requests + bool boardStateChanged = false; + const QKnxAddress dstAddress = frame.destinationAddress(); + if (m_etsBoard.exists(dstAddress)) + boardStateChanged = m_etsBoard.getGroupObject(dstAddress)->updateDataPointState(frame); + + if (boardStateChanged) + emit boardUpdate(m_etsBoard.getIndex(dstAddress)); + } +} + +static QHostAddress obtainLocalAddress() +{ + auto addresses = QNetworkInterface::allAddresses(); + for (auto address : qAsConst(addresses)) { + if (address.isLoopback() || address.protocol() != QAbstractSocket::IPv4Protocol) + continue; + qDebug() << "using IP " << address; + return address; + } + qDebug() << "using loopback IP!!!"; + return QHostAddress::LocalHost; // no local address found! +} + +QmlKnxTunnel::QmlKnxTunnel(QmlKnxDemo *demo) +{ + connect(&m_connection, &QKnxNetIpTunnelConnection::stateChanged, + this, &QmlKnxTunnel::handleConnection); + connect(&m_connection, &QKnxNetIpTunnelConnection::receivedTunnelFrame, + demo, &QmlKnxDemo::handleFrame); + connect(&m_timer, &QTimer::timeout, this, &QmlKnxTunnel::send); + auto newAddress = obtainLocalAddress(); + m_connection.setLocalAddress(newAddress); + m_discoveryAgent.setLocalAddress(newAddress); + m_ip.setAddress("192.168.1.50"); + m_port = 3671; + reconnect(); + qDebug() << " m_ip" << m_ip; + // Automatic KNXnet/Ip router discovery. Connects to first router found + static auto handleDiscoveredServer = [&](const QKnxNetIpServerInfo &info) { + if (!m_connected) { + m_ip = info.controlEndpointAddress(); + m_port = info.controlEndpointPort(); + // establish the knx tunnel + reconnect(); + m_connected = true; + } + }; + connect(&m_discoveryAgent, &QKnxNetIpServerDiscoveryAgent::deviceDiscovered, this, + handleDiscoveredServer); + autoDiscoverKnxServers(); +} + +void QmlKnxTunnel::sendTunnelFrame(const QKnxCemiFrame &frame) +{ + if (frame.size() == 0) + return; + + if (m_frames.size() == 0) + m_timer.start(200); + m_frames.enqueue(frame); +} + +void QmlKnxTunnel::reconnect() +{ + m_connection.connectToHost(m_ip, m_port); +} + +void QmlKnxTunnel::autoDiscoverKnxServers() +{ + if (m_connection.state() != m_connection.Connected) { + m_discoveryAgent.stop(); + m_connected = false; + m_discoveryAgent.start(); + } +} + +void QmlKnxTunnel::changeIp(const QString &ip, quint16 port) +{ + m_ip = ip; + m_port = port; + m_connection.disconnectFromHost(); +} + +void QmlKnxTunnel::send() +{ + m_connection.sendTunnelFrame(m_frames.dequeue()); + if (m_frames.size() == 0) + m_timer.stop(); +} + +void QmlKnxTunnel::handleConnection(QKnxNetIpEndpointConnection::State state) +{ + switch (state) { + case QKnxNetIpEndpointConnection::State::Disconnected: + autoDiscoverKnxServers(); + break; + default: + break; + } +} + +void QmlKnxDemo::changeTunnelIp(const QString &ipStr, quint16 port) +{ + m_tunnel.changeIp(ipStr, port); +} + +void QmlKnxDemo::changeRoom(int roomId) +{ + currentRoom = roomId; + emit roomChanged(currentRoom); +} + +void QmlKnxDemo::checkLightStatusOn() +{ + initBoard(m_etsBoard, m_tunnel); +} + +void QmlKnxDemo::test() +{ + static int c = 0; + if (c == 0) + emit colorLedChange(QColor("blue")); + else if (c==1) + emit colorLedChange(QColor("magenta")); + else if (c==2) { + emit colorLedChange(QColor("green")); + c = 0; + return; + } + c++; +} + +void QmlKnxDemo::reconnect() +{ + m_tunnel.reconnect(); +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.h new file mode 100644 index 0000000..d4dc45c --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qmlknxdemo.h @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLKNXDEMO_H +#define QMLKNXDEMO_H + +#include "etsdevelopmentboard.h" + +#include +#include +#include +#include +#include +#include + +class QmlKnxDemo; +class QmlKnxTunnel : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QmlKnxTunnel) + +public: + QmlKnxTunnel(QmlKnxDemo *demo); + void sendTunnelFrame(const QKnxCemiFrame &frame); + void changeIp(const QString &ip, quint16 port = 3671); + void autoDiscoverKnxServers(); + void reconnect(); +public slots: + void handleConnection(QKnxNetIpEndpointConnection::State state); + void send(); + +private: + + + QQueue m_frames; + QKnxNetIpTunnelConnection m_connection; + QKnxNetIpServerDiscoveryAgent m_discoveryAgent; + + QTimer m_timer; + QHostAddress m_ip; + quint16 m_port { 3671 }; + bool m_connected { false }; +}; + +class QmlKnxDemo : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QmlKnxDemo) + +public: + QmlKnxDemo(); + + Q_INVOKABLE void toggleMiddleRight(); + Q_INVOKABLE void toggleMiddleLeft(); + Q_INVOKABLE QString getColor() const; + Q_INVOKABLE int getRockerPosition() const; + Q_INVOKABLE int getBlindPosition() const; + Q_INVOKABLE bool getLightState(int lightNum) const; + + Q_INVOKABLE void moveBlindUp(); + Q_INVOKABLE void moveBlindDown(); + Q_INVOKABLE void stopBlind(); + + Q_INVOKABLE void colorSwitch(double value); + Q_INVOKABLE void toggleLight(int light); + + Q_INVOKABLE void test(); + Q_INVOKABLE void reconnect(); + Q_INVOKABLE void changeTunnelIp(const QString &ipStr, quint16 port = 3671); + + Q_INVOKABLE void changeRoom(int roomId); + +Q_SIGNALS: + void boardUpdate(quint32 lightNum); + void blindPositionChange(int position); + void blindFullyDown(); + void blindFullyUp(); + void rockerChange(int position); + void colorLedChange(QColor color); + void roomChanged(int roomId); + +public slots: + void handleFrame(const QKnxTunnelFrame &frame); + +private: + void checkLightStatusOn(); + +private: + QColor colorState; + QmlKnxTunnel m_tunnel; + EtsDevelopmentBoard m_etsBoard; + int currentRoom = { 0 }; +}; + +#endif diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.cpp new file mode 100644 index 0000000..933fe40 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.cpp @@ -0,0 +1,459 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qupnprootdevice.h" +#include +#include + +// 239.255.255.250:1900 is the IANA reserved UPnP multicast address. +const QHostAddress QUPnPRootDevice::multicastAddress("239.255.255.250"); +const quint16 QUPnPRootDevice::multicastPort = 1900; + +QList QUPnPRootDevice::allUPnPRootDevices; + +QUPnPRootDevice::QUPnPRootDevice(QObject *parent, const QString &name, const QString &searchTarget) + : QMinimalHttpServer(parent) +{ + allUPnPRootDevices.push_back(this); + + static bool didRandomize = false; + if (!didRandomize) + qsrand(QTime::currentTime().msec()); + didRandomize = true; + + foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) + if (address.protocol() == QAbstractSocket::IPv4Protocol + && address != QHostAddress(QHostAddress::LocalHost)) + this->localIpAddress = address.toString(); + + this->searchTarget = searchTarget; + this->product = name; + this->uuid = createUuid(name); + connect(&udpSocket, &QUdpSocket::readyRead, this, &QUPnPRootDevice::onUdpDataReceived); +} + +QUPnPRootDevice::~QUPnPRootDevice() +{ + stopListening(); + allUPnPRootDevices.removeAll(this); +} + +void QUPnPRootDevice::stopAllUPnPRootDevices() +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::stopAllUPnPRootDevices"; + #endif + for (QUPnPRootDevice* dev : allUPnPRootDevices) + dev->stopListening(); +} + +QString QUPnPRootDevice::getUPnPxml() +{ + /* + urn:schemas-upnp-org:device:DimmableLight:1 + UPnP-to-KNX Bridge + UPnP-to-KNX Bridge + 0.1 + https://qt.io + 0.1 + + */ + + QString upnp_xml = QStringLiteral( + "" + "" + "" + "1" + "0" + "" + "" + "upnp:rootdevice" + "") + this->product + "" + "" + this->manufacturer + "" + "" + this->manufacturerURL + "" + "" + this->product + "" + "0.1" + "uuid:" + this->uuid + ""; + + // icons + if (icons.size() > 0) { + upnp_xml += ""; + for (QString iconKey : icons.keys()) { + QImage icon = icons[iconKey]; + upnp_xml += QStringLiteral( + "") + + "" + httpFileMimeTypes[iconKey] + "" + "" + QString::number(icon.width()) + "" + "" + QString::number(icon.height()) + "" + "" + QString::number(icon.depth()) + "" + "" + iconKey + "" + ""; + } + upnp_xml += ""; + } + + // services + if (services.size() > 0) { + upnp_xml += ""; + for (auto service : services) + upnp_xml += service->upnpServiceListEntry(); + upnp_xml += ""; + } + + upnp_xml += + "" + ""; + + return upnp_xml; +} + +QUPnPService *QUPnPRootDevice::getService(const QString &urlUpper) +{ + QString serviceKey; + if (urlUpper.startsWith("/") && urlUpper.endsWith("/CONTROL")) + serviceKey = urlUpper.mid(1, urlUpper.size() - 9); + else if (urlUpper.startsWith("/") && urlUpper.endsWith("/EVENTS")) + serviceKey = urlUpper.mid(1, urlUpper.size() - 8); + else if (urlUpper.startsWith("/") && urlUpper.endsWith("/SCPD.XML")) + serviceKey = urlUpper.mid(1, urlUpper.size() - 10); + + if (serviceKey != "" && services.contains(serviceKey)) + return services[serviceKey]; + return nullptr; +} + +void QUPnPRootDevice::onUdpDataReceived() +{ + QHostAddress senderAddress; + quint16 senderPort; + while (udpSocket.hasPendingDatagrams()) { + //udpSocket.readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); + QNetworkDatagram datagram = udpSocket.receiveDatagram(int(udpSocket.pendingDatagramSize())); + senderAddress = datagram.senderAddress(); + senderPort = datagram.senderPort(); +#ifdef QT_DEBUG + QString sdatagram = QString::fromUtf8(datagram.data()); + if (!sdatagram.contains("ST: urn:dial-multiscreen-org:") + && !sdatagram.contains("ST:urn:schemas-upnp-org:device:InternetGatewayDevice:") + && !sdatagram.contains("ST: urn:schemas-upnp-org:device:InternetGatewayDevice:") + && !sdatagram.contains("ST:urn:schemas-upnp-org:device:MediaRenderer:") + && !sdatagram.contains("ST:urn:schemas-upnp-org:device:MediaServer:") + && !sdatagram.contains("NOTIFY * HTTP/") + //&& !sdatagram.contains("") + ) { + qDebug() << "QUPnPRootDevice::onUdpDataReceived " << sdatagram; + qDebug() << "QUPnPRootDevice::onUdpDataReceived ip and port:" << senderAddress << senderPort; + } + #endif + processUdpData(QString::fromUtf8(datagram.data()), senderAddress, senderPort); + } +} + +void QUPnPRootDevice::processUdpData(const QString &data, QHostAddress senderAddress, quint16 senderPort) +{ + if (!data.startsWith("M-SEARCH") + || !data.contains("MAN: \"ssdp:discover\"", Qt::CaseInsensitive) + || ( !data.contains("ST: ssdp:all", Qt::CaseInsensitive) + && !data.contains("ST: upnp:rootdevice", Qt::CaseInsensitive) + && !data.contains(QStringLiteral("ST: ") + this->searchTarget, Qt::CaseInsensitive))) + return; + + // SSDP Requests should not be answered immediately, because the sender of the + // request might get many results and might run on weak hardware. + int responseDelay = 1000; // milliseconds + QStringList lines = data.split("\r\n"); + for (QString line : lines) { + if (line.startsWith("MX:", Qt::CaseInsensitive)) + responseDelay = 1000 * line.mid(3).trimmed().toInt(); + } + if (responseDelay > 0) + responseDelay = qrand() % responseDelay; + + QTimer::singleShot(responseDelay, [this, senderAddress, senderPort](){ + QString message = QStringLiteral( + "HTTP/1.1 200 OK\r\n" + "LOCATION: http://") + localIpAddress + ":" + QString::number(tcpServer.serverPort()) + "/upnp.xml\r\n" + "EXT:\r\n" + "USN: uuid:" + this->uuid + "::" + this->searchTarget + "\r\n" + "SERVER: " + QSysInfo::productType() + "/" + QSysInfo::productVersion() + " UPnP/1.0 " + product + "/" + version + "\r\n" + "CACHE-CONTROL: max-age=86400\r\n" + "ST: " + this->searchTarget + "\r\n" + "DATE: " + DateRfc7231() + "\r\n" + "CONTENT-LENGTH: 0\r\n" + "\r\n"; + + QUdpSocket responseSocket; + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::processUdpData senderIp:" << senderAddress << message; + #endif + responseSocket.writeDatagram(message.toUtf8(), senderAddress, senderPort); + }); +} + +bool QUPnPRootDevice::processHttpGetRequest(QString urlUpper, QString &responseHead, QByteArray &responseBody) +{ + if (urlUpper == "/UPNP.XML") + { + responseBody = this->getUPnPxml().toUtf8(); + responseHead += "content-type: text/xml; charset=utf-8\r\n"; + return true; + } + else + { + QUPnPService *service = getService(urlUpper); + if (service) { + responseBody = service->getScpd().toUtf8(); + responseHead += QStringLiteral( + "content-type: text/xml; charset=utf-8\r\n" + "server: ") + QSysInfo::productType() + "/" + QSysInfo::productVersion() + " UPnP/1.0 " + product + "/" + version + "\r\n"; + return true; + } + } + return QMinimalHttpServer::processHttpGetRequest(urlUpper, responseHead, responseBody); +} + +int QUPnPRootDevice::processHttpPostRequest(QString urlUpper, QByteArray &postBody, QString &responseHead, QByteArray &responseBody) +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::processHttpPostRequest"; + qDebug() << postBody; + #endif + + QUPnPService *service = getService(urlUpper); + if (!service) { + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; + } + + QDomDocument doc; + QString errorMsg; int errorLine; int errorColumn; + if (!doc.setContent(postBody, true, &errorMsg, &errorLine, &errorColumn)) { + #ifdef QT_DEBUG + qDebug() << "doc.setContent failed (" << errorLine << ":" << errorColumn << ") " << errorMsg; + #endif + responseHead = "HTTP/1.0 400 Bad Request\r\n"; + return 400; + } + + QDomElement envelope = doc.documentElement(); + QDomNodeList bodies = envelope.elementsByTagNameNS("http://schemas.xmlsoap.org/soap/envelope/", "Body"); + for (int bodyIdx = 0; bodyIdx < bodies.size(); bodyIdx++) { + + QString actionName; + + // iterate the RPC calls in the envelope + QDomNodeList RPCs = bodies.at(bodyIdx).toElement().childNodes(); + for (int RPCIdx = 0; RPCIdx < RPCs.size(); RPCIdx++) { + if (!RPCs.at(RPCIdx).isElement()) + continue; + + actionName = RPCs.at(RPCIdx).toElement().localName(); + + // collect parameters + QMap actionParameters; + QDomNodeList params = RPCs.at(RPCIdx).toElement().childNodes(); + for (int paramIdx = 0; paramIdx < params.size(); paramIdx++) { + if (!params.at(paramIdx).isElement()) + continue; + + QString paramName = params.at(paramIdx).toElement().localName(); + QString paramValue = ""; + // get paramValue + QDomNodeList paramChildren = params.at(paramIdx).toElement().childNodes(); + for (int paramChildIdx = 0; paramChildIdx < paramChildren.size(); paramChildIdx++) + if (paramChildren.at(paramChildIdx).isText()) + paramValue = paramChildren.at(paramChildIdx).toText().data(); + + actionParameters[paramName] = paramValue; + } + + // execute the RPC call + return service->executeRemoteProcedureCall(actionName, actionParameters, responseHead, responseBody); + + } + } + + return QMinimalHttpServer::processHttpPostRequest(urlUpper, postBody, responseHead, responseBody); +} + +int QUPnPRootDevice::processHttpSubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::processHttpSubscribeRequest"; + #endif + + QUPnPService *service = getService(urlUpper); + if (!service) { + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; + } + + return service->processHttpSubscribeRequest(requestLines, responseHead, responseBody); +} + +int QUPnPRootDevice::processHttpUnsubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::processHttpUnsubscribeRequest"; + #endif + + QUPnPService *service = getService(urlUpper); + if (!service) { + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; + } + + return service->processHttpUnsubscribeRequest(requestLines, responseHead, responseBody); +} + +QString QUPnPRootDevice::createUuid(const QString &base) +{ + QString uuid; + if (base == QString()) { + uuid = QUuid::createUuid().toString(); // random uuid + uuid = uuid.mid(1, uuid.length()-2); // remove leading { and trailing } + } else { + uuid = QString(QCryptographicHash::hash(base.toUtf8(),QCryptographicHash::Sha1).toHex()); + } + + return uuid; +} + +void QUPnPRootDevice::startListening(quint16 port) +{ + if (isListening()) + return; + + QMinimalHttpServer::startListening(port); + + udpSocket.bind(QHostAddress::AnyIPv4, multicastPort, QUdpSocket::ReuseAddressHint); + udpSocket.joinMulticastGroup(multicastAddress); + + // notify network via multicast + QString message = QStringLiteral( + "NOTIFY * HTTP/1.1\r\n" + "HOST: ") + multicastAddress.toString() + ":" + QString::number(multicastPort) + "\r\n" + "CACHE-CONTROL: max-age=86400\r\n" + "LOCATION: http://" + localIpAddress + ":" + QString::number(tcpServer.serverPort()) + "/upnp.xml\r\n" + "SERVER: " + QSysInfo::productType() + "/" + QSysInfo::productVersion() + " UPnP/1.0 " + product + "/" + version + "\r\n" + "NTS: ssdp:alive\r\n" + "NT: " + this->searchTarget + "\r\n" + "USN: uuid:" + this->uuid + "::" + this->searchTarget + "\r\n" + "\r\n"; + QUdpSocket aliveSocket; + aliveSocket.setSocketOption(QAbstractSocket::MulticastTtlOption, 4); + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::startListening " << message; + #endif + aliveSocket.writeDatagram(message.toUtf8(), multicastAddress, multicastPort); +} + +void QUPnPRootDevice::stopListening() +{ + if (!isListening()) + return; + + // notify network via multicast + QString message = QStringLiteral( + "NOTIFY * HTTP/1.1\r\n" + "HOST: ") + multicastAddress.toString() + ":" + QString::number(multicastPort) + "\r\n" + "NT: " + this->searchTarget + "\r\n" + "NTS: ssdp:byebye\r\n" + "USN: uuid:" + this->uuid + "::" + this->searchTarget + "\r\n" + "SERVER: " + QSysInfo::productType() + "/" + QSysInfo::productVersion() + " UPnP/1.0 " + product + "/" + version + "\r\n" + "DATE: " + DateRfc7231() + "\r\n" + "CONTENT-LENGTH: 0\r\n" + "\r\n"; + QUdpSocket byebyeSocket; + byebyeSocket.setSocketOption(QAbstractSocket::MulticastTtlOption, 4); + #ifdef QT_DEBUG + qDebug() << "QUPnPRootDevice::stopListening " << message; + #endif + byebyeSocket.writeDatagram(message.toUtf8(), multicastAddress, multicastPort); + + udpSocket.leaveMulticastGroup(multicastAddress); + udpSocket.close(); + QMinimalHttpServer::stopListening(); +} + +void QUPnPRootDevice::addIcon(const QString &filename) +{ + QFileInfo info(filename); + QString nameonly = QString("/") + info.fileName().toUpper(); + + QFile file(filename); + file.open(QFile::ReadOnly); + QByteArray data = file.readAll(); + file.close(); + this->addFile(nameonly, data); + + QImage img; + img.load(filename); + icons[nameonly] = img; + + if (isListening()) { + stopListening(); + startListening(); + } +} + +void QUPnPRootDevice::addService(QUPnPService *service) +{ + QString id = service->identifier.toUpper(); + if (this->services.contains(id)) + return; + service->rootdevice = this; + this->services[id] = service; + + if (isListening()) { + stopListening(); + startListening(); + } +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.h new file mode 100644 index 0000000..10d47ad --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnprootdevice.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QUPNPROOTDEVICE_H +#define QUPNPROOTDEVICE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qminimalhttpserver.h" +#include "qupnpservice.h" + +class QUPnPRootDevice : public QMinimalHttpServer +{ + Q_OBJECT + friend class QUPnPService; + friend class MainWindow; + +private: + static QList allUPnPRootDevices; + +protected: + QString manufacturer = "The Qt Company GmbH"; + QString manufacturerURL = "https://qt.io/"; + QString product = "Qt UPnP-to-KNX Bridge"; + QString version = "0.1"; + QString uuid = ""; + QString searchTarget = "upnp:rootdevice"; + QMap icons; + QMap services; + + QString localIpAddress = ""; + QUdpSocket udpSocket; + virtual QString getUPnPxml(); + virtual QUPnPService *getService(const QString &urlUpper); + void onUdpDataReceived(); + virtual void processUdpData(const QString &data, QHostAddress senderAddress, quint16 senderPort); + bool processHttpGetRequest(QString urlUpper, QString &responseHead, QByteArray &responseBody) override; + int processHttpPostRequest(QString urlUpper, QByteArray &postBody, QString &responseHead, QByteArray &responseBody) override; + int processHttpSubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) override; + int processHttpUnsubscribeRequest(QString urlUpper, QStringList &requestLines, QString &responseHead, QByteArray &responseBody) override; + + static const QHostAddress multicastAddress; + static const quint16 multicastPort; + static QString createUuid(const QString &base = QString()); + +public: + explicit QUPnPRootDevice(QObject *parent, const QString &searchTarget, const QString &name = "upnp:rootdevice"); + ~QUPnPRootDevice(); + + void startListening(quint16 port = 0); + void stopListening(); + void addIcon(const QString &filename); + void addService(QUPnPService* service); + static void stopAllUPnPRootDevices(); + +signals: + +}; + +#endif // QUPNPROOTDEVICE_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.cpp new file mode 100644 index 0000000..6e09ed7 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.cpp @@ -0,0 +1,367 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qupnpservice.h" +#include "qupnprootdevice.h" + +QUPnPService::QUPnPService(QObject *parent, QString identifier) + : QObject(parent) +{ + this->identifier = identifier; +} + +QUPnPService::~QUPnPService() +{ +} + +QString QUPnPService::upnpServiceListEntry() +{ + return QStringLiteral( + "" + "urn:schemas-upnp-org:service:") + identifier + ":1" + //"urn:upnp-org:serviceId:" + identifier + ":1" + "" + identifier + "" + "/" + identifier + "/scpd.xml" + "/" + identifier + "/Control" + "/" + identifier + "/Events" + ""; +} + +int QUPnPService::executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(actionName); + Q_UNUSED(actionParams); + Q_UNUSED(responseHead); + Q_UNUSED(responseBody); + responseHead = "HTTP/1.0 404 Not Found\r\n"; + return 404; +} + +int QUPnPService::processHttpSubscribeRequest(QStringList &lines, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(responseBody); + #ifdef QT_DEBUG + qDebug() << "QUPnPService::processHttpSubscribeRequest"; + #endif + + QUPnPServiceSubscription subscription; + QString timeout = "0"; + for (int i = 1; i < lines.size(); i++) { + if (lines.at(i).startsWith("CALLBACK:", Qt::CaseInsensitive)) { + QString url = lines.at(i).mid(9).trimmed(); + if (url.startsWith("<") && url.endsWith(">")) + url = url.mid(1, url.size()-2); + subscription.url = QUrl(url); + } else if (lines.at(i).startsWith("TIMEOUT:", Qt::CaseInsensitive)) { + timeout = lines.at(i).mid(8).trimmed(); + } else if (lines.at(i).startsWith("SID:", Qt::CaseInsensitive)) { + // renewing a subscription + subscription.uuid = lines.at(i).mid(4).trimmed(); + } + } + + if (timeout.startsWith("SECOND-", Qt::CaseInsensitive)) + timeout = timeout.mid(7).trimmed(); + bool ok = false; + int iTimeout = timeout.toInt(&ok); + subscription.timeoutTime = QDateTime::currentDateTime().addSecs(iTimeout); + + if (!ok || !subscription.url.isValid()) { + responseHead = "HTTP/1.0 400 Bad Request\r\n"; + return 400; + } + + // no SID header => new subscription => new SID + if (subscription.uuid == "") { + subscription.uuid = QUuid::createUuid().toString(); + subscription.uuid = QStringLiteral("uuid:") + subscription.uuid.mid(1, subscription.uuid.size()-2); + + subscriptions[subscription.uuid] = subscription; + + // delay the notification so that the "HTTP/1.1 200 OK" message comes first + QString uuid = subscription.uuid; + QTimer::singleShot(50, [uuid, this](){ + if (subscriptions.contains(uuid)) + onNewSubscriber(subscriptions[uuid]); + }); + + } else { + // only update the timeout. seq and url must stay the same, uuid would stay the same anyways + if (subscriptions.contains(subscription.uuid)) { + responseHead = "HTTP/1.0 412 Precondition Failed\r\n"; + return 412; + } + subscriptions[subscription.uuid].timeoutTime = subscription.timeoutTime; + } + + responseHead = responseHead + + "SERVER: " + QSysInfo::productType() + "/" + QSysInfo::productVersion() + " UPnP/1.0 " + rootdevice->product + "/" + rootdevice->version + "\r\n" + + "SID: " + subscription.uuid + "\r\n" + + "TIMEOUT: Second-" + QString::number(iTimeout) + "\r\n"; + + return 200; +} + +int QUPnPService::processHttpUnsubscribeRequest(QStringList &lines, QString &responseHead, QByteArray &responseBody) +{ + Q_UNUSED(responseBody); + #ifdef QT_DEBUG + qDebug() << "QUPnPService::processHttpUnsubscribeRequest"; + #endif + + // find SID: header + QString SubscriptionUuid; + for (int i = 1; i < lines.size(); i++) + if (lines.at(i).startsWith("SID:", Qt::CaseInsensitive)) + SubscriptionUuid = lines.at(i).mid(4).trimmed(); + if (SubscriptionUuid == "" || !subscriptions.contains(SubscriptionUuid)) { + responseHead = "HTTP/1.0 412 Precondition Failed\r\n"; + return 412; + } + + subscriptions.remove(SubscriptionUuid); + return 200; +} + +bool QUPnPService::notifySubscriber(QUPnPServiceSubscription &subscription, const QString &propertyName, const QString &propertyValue) +{ + QByteArray notificationBody = (QStringLiteral( + "" + "" + "<") + propertyName + ">" + propertyValue + "" + "" + "").toUtf8(); + + QString notification = QStringLiteral( + "NOTIFY ") + subscription.url.path() + " HTTP/1.1\r\n" + "HOST: " + subscription.url.host(); + if (subscription.url.port() > 0) + notification += QStringLiteral(":") + QString::number(subscription.url.port()); + notification += "\r\n" + "CONTENT-TYPE: text/xml; charset=utf-8\r\n" + "NT: upnp:event\r\n" + "NTS: upnp:propchange\r\n" + "CONTENT-LENGTH: " + QString::number(notificationBody.size()) + "\r\n" + "SID: " + subscription.uuid + "\r\n" + "SEQ: " + QString::number(subscription.sequenceNumber) + "\r\n" + "CONNECTION: close\r\n" + "\r\n"; + + if (subscription.sequenceNumber >= UINT_MAX) + subscription.sequenceNumber = 1; // not 0! + else + subscription.sequenceNumber++; + + QByteArray message = notification.toUtf8(); + message.append(notificationBody); + #ifdef QT_DEBUG + qDebug() << "QUPnPService::notifySubscriber: " << message; + #endif + + QTcpSocket notificationSocket; + notificationSocket.connectToHost(subscription.url.host(), subscription.url.port(80)); + if (!notificationSocket.waitForConnected(10000)) { + qDebug() << "QUPnPService::notifySubscriber: ERROR could not connect to host"; + return false; + } + + notificationSocket.write(message); + notificationSocket.waitForReadyRead(30000); // See UPnP specification, chapter 4.2.1 + #ifdef QT_DEBUG + qDebug() << "QUPnPService::notifySubscriber RESPONSE: " << message; + #endif + return true; +} + +void QUPnPService::notifyPropertyChanged(const QString &propertyName, const QString &propertyValue) +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPService::notifyPropertyChanged"; + #endif + QDateTime now = QDateTime::currentDateTime(); + QList expiredSubscriptions; + + for (QString subscriptionKey : subscriptions.keys()) { + QUPnPServiceSubscription &subscription = subscriptions[subscriptionKey]; + bool mustRemove = true; + if (now <= subscription.timeoutTime) + mustRemove = !notifySubscriber(subscription, propertyName, propertyValue); + if (mustRemove) + expiredSubscriptions.push_back(subscriptionKey); + } + + for (QString expiredKey : expiredSubscriptions) + subscriptions.remove(expiredKey); +} + + + +QUPnPBooleanService::QUPnPBooleanService(QObject *parent, QString identifier) + : QUPnPService(parent, identifier) +{ +} + +bool QUPnPBooleanService::doSetState(bool state) +{ +// if (state == this->state) +// return false; + this->state = state; + return true; +} + +void QUPnPBooleanService::setState(bool state) +{ + if (doSetState(state)) { + notifyPropertyChanged("state", state?"1":"0"); + emit this->stateChanged(state); + } else { + emit this->stateChangeFailed(); + } +} + +bool QUPnPBooleanService::getState() +{ + return state; +} + +QString QUPnPBooleanService::getScpd() +{ + return QStringLiteral( + "" + "" + "1" + "0" + "" + + "" + "" + "setState" + "" + "" + "newState" + "state" + "in" + "" + "" + "" + "" + + "" + "" + "state" + "boolean" + "") + (getState()?"1":"0") + "" + "" + "" + ""; +} + +int QUPnPBooleanService::executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody) +{ + #ifdef QT_DEBUG + qDebug() << "QUPnPBooleanService::executeRemoteProcedureCall"; + #endif + + bool ok = false; + int newStateValue = actionParams["newState"].toInt(&ok); + if (actionName.toUpper() != "SETSTATE" || newStateValue < 0 || 1 < newStateValue || !ok) { + responseHead = "HTTP/1.0 400 Bad Request\r\n"; + return 400; + } + + this->setState(newStateValue == 1); + responseHead = QStringLiteral( + "HTTP/1.0 200 OK\r\n" + "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"); + responseBody = (QStringLiteral( + "" + "" + "" + "" + "" + "").toUtf8(); + return 200; +} + +void QUPnPBooleanService::onNewSubscriber(QUPnPServiceSubscription &subscription) +{ + this->notifySubscriber(subscription, "state", getState()?"1":"0"); +} + + + +QUPnPBooleanServiceProxy::QUPnPBooleanServiceProxy(QObject *parent, QUPnPBooleanService *target, QString identifier) + : QUPnPBooleanService(parent, identifier) + , m_target(target) +{ + if (target) { + connect(target, &QUPnPBooleanService::stateChanged, [this](bool state){ + this->notifyPropertyChanged("state", state?"1":"0"); + emit stateChanged(state); + }); + connect(target, &QUPnPBooleanService::stateChangeFailed, [this](){ + emit stateChangeFailed(); + }); + } +} + +void QUPnPBooleanServiceProxy::setState(bool state) +{ + if (m_target) + m_target->setState(state); +} + +bool QUPnPBooleanServiceProxy::getState() +{ + if (!m_target) + return false; + return m_target->getState(); +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.h new file mode 100644 index 0000000..fa3f51a --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qupnpservice.h @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QUPNPSERVICE_H +#define QUPNPSERVICE_H + +#include +#include +#include + + +class QUPnPServiceSubscription +{ + friend class QUPnPService; + QString uuid; + QUrl url; + QDateTime timeoutTime; + quint32 sequenceNumber = 0; +}; +class QUPnPRootDevice; + +class QUPnPService : public QObject +{ + Q_OBJECT + friend class QUPnPRootDevice; + friend class QVirtualBelkinWeMo; + +protected: + QUPnPRootDevice *rootdevice; + QString identifier; + QMap subscriptions; + virtual QString upnpServiceListEntry(); + virtual QString getScpd() = 0; + virtual int executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody); + virtual int processHttpSubscribeRequest(QStringList &requestLines, QString &responseHead, QByteArray &responseBody); + virtual int processHttpUnsubscribeRequest(QStringList &requestLines, QString &responseHead, QByteArray &responseBody); + void notifyPropertyChanged(const QString &propertyName, const QString &propertyValue); + bool notifySubscriber(QUPnPServiceSubscription &subscription, const QString &propertyName, const QString &propertyValue); + virtual void onNewSubscriber(QUPnPServiceSubscription &subscription) = 0; + +public: + explicit QUPnPService(QObject *parent = nullptr, QString identifier=QString()); + virtual ~QUPnPService(); + Q_DISABLE_COPY(QUPnPService) +}; + + +class QUPnPBooleanService : public QUPnPService +{ + Q_OBJECT + +protected: + bool state = false; + virtual bool doSetState(bool state); + QString getScpd() override; + int executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody) override; + void onNewSubscriber(QUPnPServiceSubscription &subscription) override; + +public: + explicit QUPnPBooleanService(QObject *parent = nullptr, QString identifier=QString()); + virtual void setState(bool state); + virtual bool getState(); + +signals: + void stateChanged(bool newState); + void stateChangeFailed(); +}; + + +class QUPnPBooleanServiceProxy : public QUPnPBooleanService +{ + Q_OBJECT + +protected: + QUPnPBooleanService *m_target; + +public: + explicit QUPnPBooleanServiceProxy(QObject *parent, QUPnPBooleanService *target, QString identifier=QString()); + void setState(bool state) override; + bool getState() override; +}; + +#endif // QUPNPSERVICE_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.cpp b/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.cpp new file mode 100644 index 0000000..cb92db8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.cpp @@ -0,0 +1,237 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// Parts of this work are derived from makermusings fauxmo, see +// http://www.makermusings.com/2015/07/18/virtual-wemo-code-for-amazon-echo/ +// https://github.com/makermusings/fauxmo +// commit 54e00be77552fba7b177866f55cf89d017c57dc6 +// provided under the terms of + +/**************************************************************************** +The MIT License (MIT) + +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +****************************************************************************/ + +#include "qvirtualbelkinwemo.h" +#include "qupnpservice.h" + + +QVirtualBelkinWeMo::QVirtualBelkinWeMo(QObject *parent, const QString &name) + : QUPnPRootDevice(parent, name, QStringLiteral("urn:Belkin:device:**")) +{ + this->service = new QVirtualBelkinWeMoService(this); + this->addService(this->service); + +} + +QString QVirtualBelkinWeMo::getUPnPxml() +{ + QString upnp_xml = QStringLiteral( + "" + "" + "" + "urn:Belkin:device:")+ deviceType +":1" + "" + this->product + "" + "Belkin International Inc." + "Emulated Socket" + "3.1415" + "uuid:Socket-1_0-" + this->uuid + ""; + + // icons + if (icons.size() > 0) { + upnp_xml += ""; + for (QString iconKey : icons.keys()) { + QImage icon = icons[iconKey]; + upnp_xml += QStringLiteral( + "") + + "" + httpFileMimeTypes[iconKey] + "" + "" + QString::number(icon.width()) + "" + "" + QString::number(icon.height()) + "" + "" + QString::number(icon.depth()) + "" + "" + iconKey + "" + ""; + } + upnp_xml += ""; + } + + // services + if (services.size() > 0) { + upnp_xml += ""; + for (auto service : services) + upnp_xml += service->upnpServiceListEntry(); + upnp_xml += ""; + } + + upnp_xml += + "" + ""; + + return upnp_xml; +} + +QUPnPService *QVirtualBelkinWeMo::getService(const QString &urlUpper) +{ + Q_UNUSED(urlUpper); + return service; +} + +QVirtualBelkinWeMoService::QVirtualBelkinWeMoService(QObject *parent) + : QUPnPBooleanService(parent, "SwitchPower") +{ + +} + +QString QVirtualBelkinWeMoService::upnpServiceListEntry() +{ + return QStringLiteral( + "" + "urn:schemas-upnp-org:service:SwitchPower:1" + "") + identifier + "" + "/" + identifier + "/scpd.xml" + "/upnp/control" + ""; +} + +QString QVirtualBelkinWeMoService::getScpd() +{ + return QStringLiteral( + "" + "" + "1" + "0" + "" + + "" + "" + "SetBinaryState" + "" + "" + "BinaryState" + "state" + "in" + "" + "" + "" + + "" + "GetBinaryState" + "" + "" + "BinaryState" + "state" + "out" + "" + "" + "" + "" + + "" + "" + "state" + "boolean" + "") + (getState()?"1":"0") + "" + "" + "" + ""; +} + +int QVirtualBelkinWeMoService::executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody) +{ + #ifdef QT_DEBUG + qDebug() << "QVirtualBelkinWeMoService::executeRemoteProcedureCall " << actionName << actionParams; + #endif + + if (actionName.toUpper() == "SETBINARYSTATE") { + bool ok = false; + int newStateValue = actionParams["BinaryState"].toInt(&ok); + if (newStateValue < 0 || 1 < newStateValue || !ok) { + responseHead = "HTTP/1.0 400 Bad Request\r\n"; + return 400; + } + + this->setState(newStateValue == 1); + } else if (actionName.toUpper() != "GETBINARYSTATE") { + responseHead = "HTTP/1.0 400 Bad Request\r\n"; + return 400; + } + + responseHead = QStringLiteral( + "HTTP/1.0 200 OK\r\n" + "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"); + responseBody = (QStringLiteral( + "" + "" + "" + "" + (getState() ? "1" : "0") + "" + "" + "" + "").toUtf8(); + return 200; +} diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.h new file mode 100644 index 0000000..852444c --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/qvirtualbelkinwemo.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QVIRTUALBELKINWEMO_H +#define QVIRTUALBELKINWEMO_H + +#include "qupnprootdevice.h" + +class QVirtualBelkinWeMoService : public QUPnPBooleanService +{ + Q_OBJECT + +protected: + QString upnpServiceListEntry(); + QString getScpd(); + int executeRemoteProcedureCall(QString actionName, QMap &actionParams, QString &responseHead, QByteArray &responseBody) override; + +public: + explicit QVirtualBelkinWeMoService(QObject *parent = nullptr); +}; + +class QVirtualBelkinWeMo : public QUPnPRootDevice +{ + Q_OBJECT + friend class MainWindow; +private: + +protected: + QVirtualBelkinWeMoService *service; + QString getUPnPxml() override; + + +public: + QVirtualBelkinWeMo(QObject *parent, const QString &name); + QUPnPService *getService(const QString &urlUpper) override; + QString deviceType = "controllee"; +}; + +#endif // QVIRTUALBELKINWEMO_H diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/readme.md b/tradeshow/knx-demo/3d-Alexa-knx-demo/readme.md new file mode 100644 index 0000000..48553f5 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/readme.md @@ -0,0 +1,15 @@ +# Qt 3D Studio Home Automation Demo + +This demo application is created with Qt 3D Studio and Qt Quick. +It uses a Qt 3D presentation (.uip file) to show what home automation application could look like. +The demo has controls to change lighting and temperature (represented as color) of the rooms. + +![Home Automation Demo](/HomeAutomation/images/home-automation-demo.png) + +The application is designed to be used with Pixel C, but it also has basic scaling in place. +By default the screen size is used as the main application window size. Uncommenting FIXEDWINDOW +definition from main.cpp will force the main application window to be of size 1280x900. + +Config variable KNX_BOARD can be used to compile the application so that it controls the +KNX board. + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/House.import b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/House.import new file mode 100644 index 0000000..d1aad35 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/House.import @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\houseShape.png + .\maps\houseShape.png + + + Heat_BathRoom + .\meshes\Heat_BathRoom.mesh + + + Heat_Sauna + .\meshes\Heat_Sauna.mesh + + + Heat_BedRoom + .\meshes\Heat_BedRoom.mesh + + + Ground + .\meshes\Ground.mesh + + + Heat_Toilet + .\meshes\Heat_Toilet.mesh + + + Heat_StoreRoom + .\meshes\Heat_StoreRoom.mesh + + + Heat_LivingRoom + .\meshes\Heat_LivingRoom.mesh + + + house1 + .\meshes\house1.mesh + + + Heat_DressRoom + .\meshes\Heat_DressRoom.mesh + + + Windows + .\meshes\Windows.mesh + + + Heat_MasterBedroom + .\meshes\Heat_MasterBedroom.mesh + + + roof1 + .\meshes\roof1.mesh + + + Heat_Entrance + .\meshes\Heat_Entrance.mesh + + + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/maps/houseShape.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/maps/houseShape.png new file mode 100644 index 0000000..41707e1 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/maps/houseShape.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f51993d6c61e765bda9ec72e716512ada65dd95a3bad97518648448b85263ac6 +size 4005995 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Ground.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Ground.mesh new file mode 100644 index 0000000..fc4f211 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Ground.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c4af427e71594fd244ae2b5d712c662e337a42cb05c372df3a770d4bad49a44 +size 580 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BathRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BathRoom.mesh new file mode 100644 index 0000000..4feca59 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BathRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f39301d0409dba0ed768afbd284127ea71a88b1be5a40a5d872bc358a4d28e4 +size 944 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BedRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BedRoom.mesh new file mode 100644 index 0000000..ded60ae --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_BedRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800b8155ee25712ad65a4529617b10a4d350fd3f8352a8940dbed0aac4afa004 +size 584 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_DressRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_DressRoom.mesh new file mode 100644 index 0000000..6f1c335 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_DressRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0a8e5bcf3fafbe637e7f50e7f7929979da52f8c687392ce64dbcb54329528eb +size 588 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Entrance.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Entrance.mesh new file mode 100644 index 0000000..4d2ad7d --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Entrance.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c59c5d3eb5ea7ff8fdd83e77ed87a0241f72fce9c05f1be23e6246ac23b98dd9 +size 584 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_LivingRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_LivingRoom.mesh new file mode 100644 index 0000000..6ba80a8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_LivingRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f460eb3b33365d287ec7d6e07d05203ff7f4d1076ffc667847daabe29726519 +size 2376 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_MasterBedroom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_MasterBedroom.mesh new file mode 100644 index 0000000..ebea101 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_MasterBedroom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75060f0f0e828a43ff95594c58fde213c50f08fad09e2fc1442cbce61004fa0d +size 852 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Sauna.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Sauna.mesh new file mode 100644 index 0000000..6e6e089 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Sauna.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b3cdd7103b6ad0582242f991f82e66d7f40f871174ab41ba16f7d5e2df1f1c3 +size 580 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_StoreRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_StoreRoom.mesh new file mode 100644 index 0000000..53d7234 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_StoreRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d7260110eac2557697a9021ac0a1b287969fce3aa0fa041f5b7ad66684abcc2 +size 588 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Toilet.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Toilet.mesh new file mode 100644 index 0000000..2c9efe1 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Heat_Toilet.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03fbf8872237fa58910e8d92b674ef6061f7d24f6741f5038b35796edabc2ddb +size 580 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Windows.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Windows.mesh new file mode 100644 index 0000000..a36ec89 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/Windows.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:667333174e964b7cb50738c62abe5013d94e77dc7d8f503cacdcffb09ae97b0c +size 4592 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/house1.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/house1.mesh new file mode 100644 index 0000000..ed2da37 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/house1.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c4dca286b17a72672cc317de811befd0ec5ba183514ecd5e88db00e2dd15375 +size 284484 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/roof1.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/roof1.mesh new file mode 100644 index 0000000..3f77b0c --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/House/meshes/roof1.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13f329118e118749595ac1751e7de7bf45eb1bcc058bf95b2f420f367a9c5774 +size 19180 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/houseStudio.uip b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/houseStudio.uip new file mode 100644 index 0000000..f64204e --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/houseStudio.uip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc30878cd2956d3007ca060c3e40e0d7454b218453c92a0caf8c3c6c0d22cf01 +size 279 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BathroomLightmap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BathroomLightmap.png new file mode 100644 index 0000000..94be8b5 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BathroomLightmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dd6647023eee217a16ef63c8418ff29bab5005f77e9e0153c46fdc42cfe5ae0 +size 203590 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BedRoomLightmap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BedRoomLightmap.png new file mode 100644 index 0000000..7602e32 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/BedRoomLightmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c7713b2b823a6d46f14459dfa8b9db2f9efe8928e869474b241e0b36ec7394b +size 70519 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/EntranceLightmap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/EntranceLightmap.png new file mode 100644 index 0000000..c4b4d44 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/EntranceLightmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5afdc5d67400592ae384d5c1c91d1ec3487181455ec445cb88015312b78ce08 +size 41621 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Ground.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Ground.png new file mode 100644 index 0000000..a0440f7 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Ground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0488d336670f297721d8fa05ba9048b7b9cebe889cd4e712fe46c6e938063b +size 77518 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseGroundOpacitymap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseGroundOpacitymap.png new file mode 100644 index 0000000..ac42dbb --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseGroundOpacitymap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ab5cf08c8d3e75e0ef547402d0327232ff4210c19fd3d6cb2806f04f2dfc6c6 +size 76323 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.jpg b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.jpg new file mode 100644 index 0000000..fa9d021 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa9683142d3954dc32a6bf9307f860d45bed3b7e9d983d5051b54219cf43fe42 +size 3459775 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.png new file mode 100644 index 0000000..316661d --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/HouseTexture.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:071d192dd3f95d31ae042ae64dfcb02e56da64237587466420a5a8dec1a0f7ce +size 14132813 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/LivingRoomLightMap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/LivingRoomLightMap.png new file mode 100644 index 0000000..8e9b7d1 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/LivingRoomLightMap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:520dbc10ec404e7c83a4b52c6533a5a8dafbbbb74082bdb053156a270af6f6df +size 552205 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/MasterBedroomLightmap.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/MasterBedroomLightmap.png new file mode 100644 index 0000000..3b0acb1 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/MasterBedroomLightmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92e32450eaf3ff1519da5e4e3ff274a46921f8e35a296f9a9d67cb34c47e4d41 +size 113642 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/OpenfootageNET_Pinzgau-512.hdr b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/OpenfootageNET_Pinzgau-512.hdr new file mode 100644 index 0000000..2fd25a6 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/OpenfootageNET_Pinzgau-512.hdr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0baf00208f32e5f037c2f9433b3ae3cc27e244160bbc8a321f716acbf15747e +size 416212 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Roof.png b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Roof.png new file mode 100644 index 0000000..60f27f8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/maps/Roof.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e8c888be1ac45994fa43824b10003d5e140a9fc9e998e333401ffddf13c280d +size 107095 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/HeatAreas.import b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/HeatAreas.import new file mode 100644 index 0000000..72ddff0 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/HeatAreas.import @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HeatAreas Heat_LivingRoom + meshes\HeatAreas Heat_LivingRoom.mesh + + + Heat_Entrance HeatAreas + meshes\Heat_Entrance HeatAreas.mesh + + + HeatAreas Heat_Sauna + meshes\HeatAreas Heat_Sauna.mesh + + + HeatAreas Heat_Toilet + meshes\HeatAreas Heat_Toilet.mesh + + + HeatAreas Heat_StoreRoom + meshes\HeatAreas Heat_StoreRoom.mesh + + + HeatAreas Heat_BedRoom + meshes\HeatAreas Heat_BedRoom.mesh + + + HeatAreas Heat_MasterBedroom + meshes\HeatAreas Heat_MasterBedroom.mesh + + + HeatAreas Heat_DressRoom + meshes\HeatAreas Heat_DressRoom.mesh + + + HeatAreas Heat_BathRoom + meshes\HeatAreas Heat_BathRoom.mesh + + + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BathRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BathRoom.mesh new file mode 100644 index 0000000..df02c6f --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BathRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e18aead7ab11e9be5eb9558a7547a901ba1e058e849e7c67267cde84673c3332 +size 1072 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BedRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BedRoom.mesh new file mode 100644 index 0000000..c1dbfb4 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_BedRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51cdbbe7e30f4e45754c9d3341063fb2cb8b4bd219a036496ca979274516143e +size 596 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_DressRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_DressRoom.mesh new file mode 100644 index 0000000..d4a85f8 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_DressRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:222446510da9bcbeb6c742d25d17ad86db760439d43981aca9aa387e91ba3d51 +size 600 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_LivingRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_LivingRoom.mesh new file mode 100644 index 0000000..99b0236 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_LivingRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5021ff6b3834d26ba635bec3a38444d2db5a9a341d9047b95870c4a3d3d83df0 +size 3064 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_MasterBedroom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_MasterBedroom.mesh new file mode 100644 index 0000000..d20100b --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_MasterBedroom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a695743b3441e9eaa444503c5e353b7ad5ad24217ed70aa7ffc383e35533b471 +size 1080 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Sauna.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Sauna.mesh new file mode 100644 index 0000000..e77e3e7 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Sauna.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6afa17f05c26b53bee94c92a54c32a9090d9f0f0374fa8e3d855ba55d54b8373 +size 592 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_StoreRoom.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_StoreRoom.mesh new file mode 100644 index 0000000..4c88238 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_StoreRoom.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7bfb1f10bb45230c58895d941adbc044dd89436d2c486bc9ba38fdb5a0c58a4 +size 600 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Toilet.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Toilet.mesh new file mode 100644 index 0000000..aeb9ee2 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/HeatAreas Heat_Toilet.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbcd0d0c561a1f73188a3378339e81343ce77b2c9113ce063c5e555daecd4dea +size 596 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/Heat_Entrance HeatAreas.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/Heat_Entrance HeatAreas.mesh new file mode 100644 index 0000000..68af64c --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/HeatAreas/meshes/Heat_Entrance HeatAreas.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f391836bea853a31f21d460242f89028a6955f9bfa7466ab06961d780bfcbb27 +size 600 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/House.import b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/House.import new file mode 100644 index 0000000..4c87625 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/House.import @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + Roof + meshes\Roof.mesh + + + Ground + meshes\Ground.mesh + + + Windows + meshes\Windows.mesh + + + House + meshes\House.mesh + + + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Ground.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Ground.mesh new file mode 100644 index 0000000..36ac289 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Ground.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b25be4c0cded582c9aa0fc06fd53e0a5d70fb448f7f6a87fdc3982b20ea5cf6 +size 692 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/House.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/House.mesh new file mode 100644 index 0000000..2568ef3 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/House.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:080b2e1cadc82771c0e114ca75ea5340cce164d2b49f54cfaf251cb298052f01 +size 375532 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Roof.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Roof.mesh new file mode 100644 index 0000000..59a1889 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Roof.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d464763d1ad262ee9ec37c0e7649a2c0736db39b963fc16f909ab1b8b77fe059 +size 33324 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Windows.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Windows.mesh new file mode 100644 index 0000000..1c7cf65 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/House/meshes/Windows.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84defa65be6e62eb0ae63a42f33eb9982a3e741d71b72a775502e368252a57df +size 5048 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/Light/Light.import b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/Light/Light.import new file mode 100644 index 0000000..9deb049 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/Light/Light.import @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/RoomLights.import b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/RoomLights.import new file mode 100644 index 0000000..e39b9d5 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/RoomLights.import @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + BedroomLightmap + .\meshes\BedroomLightmap.mesh + + + EntranceLightmap + .\meshes\EntranceLightmap.mesh + + + BathroomLightmap + .\meshes\BathroomLightmap.mesh + + + LivingroomLightMap + .\meshes\LivingroomLightMap.mesh + + + MasterbedroomLightmap + .\meshes\MasterbedroomLightmap.mesh + + + + diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BathroomLightmap.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BathroomLightmap.mesh new file mode 100644 index 0000000..f850d88 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BathroomLightmap.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:645b3f16c5f782da28944cfb45251fe23dd96080ae86c0c1c5801e898eae52fc +size 16344 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BedroomLightmap.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BedroomLightmap.mesh new file mode 100644 index 0000000..61ce5d4 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/BedroomLightmap.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60f5a2c3f079add7486699a9712f2eca374a5bcd054be1386393f64bc7c28009 +size 16472 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/EntranceLightmap.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/EntranceLightmap.mesh new file mode 100644 index 0000000..13734ba --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/EntranceLightmap.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:762e6c6890b7162f0a7cb4f46d3d6f097595a2555412373460f9eb858ed38aa0 +size 12072 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/LivingroomLightMap.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/LivingroomLightMap.mesh new file mode 100644 index 0000000..2e9aed0 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/LivingroomLightMap.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f1727480055d9de07f96b7ee4b92fbceff3109b450c03612ab75180f83d772e +size 108380 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/MasterbedroomLightmap.mesh b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/MasterbedroomLightmap.mesh new file mode 100644 index 0000000..e6dfd73 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/uip/models/RoomLights/meshes/MasterbedroomLightmap.mesh @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:463612a790952c9c2ea9f6389ace48d31432db5e1bf3cd0936e034b632fba5b1 +size 18852 diff --git a/tradeshow/knx-demo/3d-Alexa-knx-demo/utils.h b/tradeshow/knx-demo/3d-Alexa-knx-demo/utils.h new file mode 100644 index 0000000..147e8d0 --- /dev/null +++ b/tradeshow/knx-demo/3d-Alexa-knx-demo/utils.h @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt 3D Studio Demos. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef UTILS_H +#define UTILS_H + +#include "demodatapoint.h" + +#include +#include + +QKnxTunnelFrame createRequestFrame(const QKnxAddress &address, const QKnxNpdu &npdu, + quint8 ctrl = 0xac, quint8 extCtrl = 0xe0) +{ + QKnxTunnelFrame frame(QKnxTunnelFrame::MessageCode::DataRequest); + frame.setControlField(QKnxControlField(ctrl)); + frame.setExtendedControlField(QKnxExtendedControlField(extCtrl)); + frame.setSourceAddress({ QKnxAddress::Type::Group, 0 }); + frame.setDestinationAddress(address); + frame.setNpdu(npdu); + return frame; +} + +void sendGroupValueWrite(QmlKnxTunnel &tunnel, const QKnxAddress &address, + const QByteArray &data, quint8 ctrl = 0xa4, quint8 extCtrl = 0xe0) +{ + tunnel.sendTunnelFrame(createRequestFrame(address, + QKnxNpduFactory::Multicast::createGroupValueWriteNpdu(data), ctrl, extCtrl)); +} + +void sendColorLedGroupValueWriteFrames(QmlKnxTunnel &tunnel, const DemoColorLed *const dpt) +{ + if (dpt) { + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 12), + QKnxNpduFactory::Multicast::createGroupValueWriteNpdu(dpt->redBytes()))); + + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 13), + QKnxNpduFactory::Multicast::createGroupValueWriteNpdu(dpt->greenBytes()))); + + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 14), + QKnxNpduFactory::Multicast::createGroupValueWriteNpdu(dpt->blueBytes()))); + } +} + +void initBoard(EtsDevelopmentBoard &board, QmlKnxTunnel &tunnel) +{ + auto npdu = QKnxNpduFactory::Multicast::createGroupValueReadNpdu(); + for (int i = 1; i <= board.size(); ++i) { + if (i >= 9 && i <= 12) + continue; // skip red leds readings because they are not indicating the state! + if ((i == 7) || (i == 8) || (i == 16)) + continue; // skip checking blinds state + + if (QKnxAddress::createGroup(0, 0, 12) == board.getAddress(i)) { + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 12), npdu)); + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 13), npdu)); + tunnel.sendTunnelFrame(createRequestFrame(QKnxAddress::createGroup(0, 0, 14), npdu)); + } else { + tunnel.sendTunnelFrame(createRequestFrame(board.getAddress(i), npdu, 0xa4)); + } + } +} + +#endif diff --git a/wayland/democompositor/.gitignore b/wayland/democompositor/.gitignore new file mode 100644 index 0000000..acd6488 --- /dev/null +++ b/wayland/democompositor/.gitignore @@ -0,0 +1,11 @@ +.obj/ +.moc/ +.rcc/ +*.sw? +Makefile +target_wrapper.sh + +Makefile.democompositor +democompositor +tests/applist/tst_applistmodel +tests/apps/tst_apps diff --git a/wayland/democompositor/apps/README b/wayland/democompositor/apps/README new file mode 100644 index 0000000..2f6fd77 --- /dev/null +++ b/wayland/democompositor/apps/README @@ -0,0 +1,22 @@ +A directory holding a list of applications. There is one JSON file +per launchable application. The content is inspired by the "Desktop +Entry Specification" of freedesktop.org. + +Application files need to be installed into any of the paths that +will be listed for QStandardPaths::DataLocation/apps. In the +case of the democompositor this can be +/usr/share/democompositor/apps. + +The content of the files must follow: + +Name Description Required JSON type +Type Type of entry. Currently only Yes String + Application is supported. +Version The version of the specification + addressed. Currently version 1 Yes Number +Icon The icon to use for display Yes String +Name A user displayable name Yes String +Id Reverse-DNS as unique application Id Yes String +Exec Application to execute to launch Yes String +Path The directory to search for the app No String +X-* Extensions to the specification No Any diff --git a/wayland/democompositor/apps/appentry.cpp b/wayland/democompositor/apps/appentry.cpp new file mode 100644 index 0000000..ce94cad --- /dev/null +++ b/wayland/democompositor/apps/appentry.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "appentry.h" + +AppEntry AppEntry::empty() +{ + QString empty; + return AppEntry{empty, empty, empty, empty, empty, empty, QVariantMap()}; +} diff --git a/wayland/democompositor/apps/appentry.h b/wayland/democompositor/apps/appentry.h new file mode 100644 index 0000000..bddc552 --- /dev/null +++ b/wayland/democompositor/apps/appentry.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma once + +#include +#include +#include + +/** + * A const representatation of an application entry. Members include + * executable name, path, icon and other information in the future. + */ +class AppEntry { + Q_GADGET + Q_PROPERTY(QString iconName MEMBER iconName CONSTANT) + Q_PROPERTY(QString appName MEMBER appName CONSTANT) + Q_PROPERTY(QString appId MEMBER appId CONSTANT) + Q_PROPERTY(QString executableName MEMBER executableName CONSTANT) + Q_PROPERTY(QString executablePath MEMBER executablePath CONSTANT) + Q_PROPERTY(QString sourceFileName MEMBER sourceFileName CONSTANT) + Q_PROPERTY(QVariantMap extensions MEMBER extensions CONSTANT) +public: + + QString iconName; + QString appName; + QString appId; + QString executableName; + QString executablePath; + QString sourceFileName; + QVariantMap extensions; + + static AppEntry empty(); +}; + +Q_DECLARE_METATYPE(AppEntry) diff --git a/wayland/democompositor/apps/applistmodel.cpp b/wayland/democompositor/apps/applistmodel.cpp new file mode 100644 index 0000000..dfcc378 --- /dev/null +++ b/wayland/democompositor/apps/applistmodel.cpp @@ -0,0 +1,221 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "applistmodel.h" +#include "appparser.h" +#include "applog.h" + +#include +#include + +static QHash modelRoles() +{ + QHash roles; + roles[AppListModel::App] = "appEntry"; + roles[AppListModel::IconName] = "iconName"; + roles[AppListModel::ApplicationName] = "applicationName"; + roles[AppListModel::ApplicationId] = "applicationId"; + roles[AppListModel::ExeuctableName] = "executableName"; + roles[AppListModel::ExecutablePath] = "executablePath"; + roles[AppListModel::SourceFileName] = "sourceFileName"; + return roles; +} + +QHash AppListModel::m_roles = modelRoles(); + +int AppListModel::rowCount(const QModelIndex& index) const +{ + if (index.isValid()) + return 0; + return m_rows.count(); +} + +QVariant AppListModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid() || index.parent().isValid()) + return QVariant(); + + auto entry = m_rows[index.row()]; + + switch (role) { + case App: + return QVariant::fromValue(entry); + case IconName: + return entry.iconName; + case ApplicationName: + return entry.appName; + case ApplicationId: + return entry.appId; + case ExeuctableName: + return entry.executableName; + case ExecutablePath: + return entry.executablePath; + case SourceFileName: + return entry.sourceFileName; + default: + qCWarning(apps) << "Unhandled role" << role; + return QVariant(); + } +} + +QHash AppListModel::roleNames() const +{ + return m_roles; +} + +/*! + * Returns true if the directory can be watched + * + * Parse all JSON application files from the given directory + * and monitor it for changes. + */ +bool AppListModel::addAndWatchDir(const QString& dirName) +{ + auto watcher = new QFileSystemWatcher(this); + connect(watcher, &QFileSystemWatcher::directoryChanged, this, &AppListModel::addDir); + auto res = watcher->addPath(dirName); + addDir(dirName); + + qCDebug(apps) << "addAndWatchDir" << dirName << "result: " << res; + return res; +} + +void AppListModel::addFile(const QString& fileName) +{ + beginResetModel(); + doAddFile(fileName); + endResetModel(); +} + +void AppListModel::addDir(const QString& dirName) +{ + QDirIterator dirIt(dirName, QDir::Files | QDir::NoDotAndDotDot | QDir::Readable); + + // We want to deal with the corner case of some files being + // removed. One option would have been to keep a marker bit + // inside the AppEntry but that might leak too much of the + // implementation to the outside. Let's keep a list of file + // names that came from the directory and remove items from + // the list as we re-parse them. Once we are done emit the + // signals. + QVector deletionCandidates = entriesWithPrefix(dirName); + + beginResetModel(); + while (dirIt.hasNext()) { + auto fileName = dirIt.next(); + if (!doAddFile(fileName)) + continue; + deletionCandidates.removeAll(fileName); + } + QVector removedApps = removeEntries(deletionCandidates); + endResetModel(); + + // Announce the apps we removed after the model has been updated + for (const auto& app : removedApps) { + qCDebug(apps) << "Going to remove entry for " << app.sourceFileName; + emit appRemoved(app); + } +} + +bool AppListModel::doAddFile(const QString& fileName) +{ + bool ok; + auto newEntry = AppParser::parseFile(fileName, &ok); + if (!ok) + return false; + + for (int i = 0; i < m_rows.count(); ++i) { + if (m_rows[i].sourceFileName == fileName) { + m_rows[i] = newEntry; + return true; + } + } + + m_rows.push_back(newEntry); + return true; +} + +QVector AppListModel::entriesWithPrefix(const QString& prefix) const +{ + QVector entries; + + for (const AppEntry& entry : m_rows) + if (entry.sourceFileName.startsWith(prefix)) + entries.push_back(entry.sourceFileName); + return entries; +} + +QVector AppListModel::removeEntries(const QVector& fileNames) +{ + QVector removedEntries(fileNames.size()); + + // Rare but quadratic. The actual removal. + for (const auto &toRemoveFile: fileNames) { + for (int i = 0; i < m_rows.size(); ++i) { + if (m_rows[i].sourceFileName != toRemoveFile) + continue; + removedEntries.append(m_rows[i]); + m_rows.removeAt(i); + break; + } + } + + return removedEntries; +} + +QVariant AppListModel::findApplicationId(const QString& appId) const +{ + for (const auto& entry : m_rows) { + if (entry.appId == appId) + return QVariant::fromValue(entry); + } + + return QVariant(); +} diff --git a/wayland/democompositor/apps/applistmodel.h b/wayland/democompositor/apps/applistmodel.h new file mode 100644 index 0000000..f2e61cc --- /dev/null +++ b/wayland/democompositor/apps/applistmodel.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma once + +#include "appentry.h" + +#include +#include + +/** + * A model that holds all available applications and + * exports them to a QML scene + */ +class AppListModel : public QAbstractListModel { + Q_OBJECT +public: + + enum Roles { + App = Qt::UserRole, + IconName, + ApplicationName, + ApplicationId, + ExeuctableName, + ExecutablePath, + SourceFileName, + }; + + int rowCount(const QModelIndex& parent) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex& index, int role) const Q_DECL_OVERRIDE; + QHash roleNames() const Q_DECL_OVERRIDE; + + Q_INVOKABLE QVariant findApplicationId(const QString& appId) const; + +Q_SIGNALS: + void appRemoved(const AppEntry& appEntry); + +public Q_SLOTS: + bool addAndWatchDir(const QString& dirName); + + void addFile(const QString& fileName); + void addDir(const QString& dirName); + +private: + QVector entriesWithPrefix(const QString& prefix) const; + QVector removeEntries(const QVector& sourceFileNames); + bool doAddFile(const QString& fileName); + + QVector m_rows; + static QHash m_roles; +}; diff --git a/wayland/democompositor/apps/applog.h b/wayland/democompositor/apps/applog.h new file mode 100644 index 0000000..b116530 --- /dev/null +++ b/wayland/democompositor/apps/applog.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma once + +#include + +Q_DECLARE_LOGGING_CATEGORY(apps) diff --git a/wayland/democompositor/apps/appparser.cpp b/wayland/democompositor/apps/appparser.cpp new file mode 100644 index 0000000..528cb8f --- /dev/null +++ b/wayland/democompositor/apps/appparser.cpp @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "appparser.h" +#include "applog.h" + +#include +#include +#include + +Q_LOGGING_CATEGORY(apps, "launcher.apps") + + +static QString doReadString(const QJsonValue& value, bool *ok) +{ + if (value.type() != QJsonValue::String) { + *ok = false; + return QString(); + } + return value.toString(); +} + +static int doReadInt(const QJsonValue& value, bool *ok) +{ + if (value.type() != QJsonValue::Double) { + *ok = false; + return 0; + } + return value.toInt(); +} + +static QString readString(const QJsonObject& object, const QString& key, bool *ok) +{ + return doReadString(object.value(key), ok); +} + +static QString readStringOptional(const QJsonObject& object, const QString& key, bool *ok) +{ + auto item = object.value(key); + if (item.type() == QJsonValue::Undefined) + return QString(); + return doReadString(item, ok); +} + +static int readInt(const QJsonObject& object, const QString& key, bool *ok) +{ + return doReadInt(object.value(key), ok); +} + +static QVariantMap readExtensions(const QJsonObject& object, const QString& prefixKey) +{ + QVariantMap map; + + for (auto it = object.constBegin(); it != object.constEnd(); ++it) { + if (!it.key().startsWith(prefixKey)) + continue; + map[it.key()] = it.value().toVariant(); + } + return map; +} + +AppEntry AppParser::parseData(const QByteArray& content, const QString& fileName, bool *ok) +{ + *ok = true; + QJsonParseError error; + + QJsonDocument doc = QJsonDocument::fromJson(content, &error); + if (error.error != QJsonParseError::NoError) { + qCWarning(apps) << "Failed to parse json: " << error.errorString(); + *ok = false; + return AppEntry::empty(); + } + + if (!doc.isObject()) { + qCWarning(apps) << "Parsed document is not an object"; + *ok = false; + return AppEntry::empty(); + } + + auto root = doc.object(); + + QString type = readString(root, QStringLiteral("Type"), ok); + if (type != QStringLiteral("Application")) { + qCWarning(apps) << "Unknown type" << type; + *ok = false; + } + + int version = readInt(root, QStringLiteral("Version"), ok); + if (version != 1) { + qCWarning(apps) << "Version number should be 1... Consider to fix that" << version; + } + + QString iconName = readString(root, QStringLiteral("Icon"), ok); + QString appName = readString(root, QStringLiteral("Name"), ok); + QString appId = readString(root, QStringLiteral("Id"), ok); + QString executableName = readString(root, QStringLiteral("Exec"), ok); + QString executablePath = readStringOptional(root, QStringLiteral("Path"), ok); + QVariantMap extensions = readExtensions(root, QStringLiteral("X-")); + if (!*ok) + return AppEntry::empty(); + + return AppEntry{iconName, appName, appId, executableName, executablePath, fileName, extensions}; +} + +AppEntry AppParser::parseFile(const QString& fileName, bool *ok) +{ + qCDebug(apps) << "Trying to parse" << fileName; + + QFile file(fileName); + if (!file.open(QFile::ReadOnly)) { + qCWarning(apps) << "Failed to open" << fileName; + *ok = false; + return AppEntry::empty(); + } + + auto entry = parseData(file.readAll(), fileName, ok); + file.close(); + if (!*ok) { + qCWarning(apps) << "Failed to parse" << fileName; + return AppEntry::empty(); + } + return entry; +} diff --git a/wayland/democompositor/apps/appparser.h b/wayland/democompositor/apps/appparser.h new file mode 100644 index 0000000..a6711b4 --- /dev/null +++ b/wayland/democompositor/apps/appparser.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma once + +#include "appentry.h" + +/** + * Parse a single application entry to an AppEntry. + */ +class AppParser { +public: + static AppEntry parseData(const QByteArray& content, const QString& fileName, bool *ok); + static AppEntry parseFile(const QString& fileName, bool *ok); +}; diff --git a/wayland/democompositor/apps/apps.pri b/wayland/democompositor/apps/apps.pri new file mode 100644 index 0000000..9b19060 --- /dev/null +++ b/wayland/democompositor/apps/apps.pri @@ -0,0 +1,11 @@ + +HEADERS += \ + apps/appentry.h \ + apps/applog.h \ + apps/applistmodel.h \ + apps/appparser.h + +SOURCES += \ + apps/appentry.cpp \ + apps/applistmodel.cpp \ + apps/appparser.cpp diff --git a/wayland/democompositor/democompositor.pro b/wayland/democompositor/democompositor.pro index 99b6f93..22b7d98 100644 --- a/wayland/democompositor/democompositor.pro +++ b/wayland/democompositor/democompositor.pro @@ -17,5 +17,12 @@ RESOURCES += democompositor.qrc HEADERS += \ processlauncher.h -INSTALLS += target +# include modules +include(apps/apps.pri) + +INSTALLS += target apps target.path = /data/user/$$TARGET + +# TODO. How does /data/user/$$TARGET map to QStandardPaths +apps.path = /data/user/$$TARGET/apps/ +apps.files = resources/apps/*.app diff --git a/wayland/democompositor/democompositor.qrc b/wayland/democompositor/democompositor.qrc index 940f04e..6e8bd54 100644 --- a/wayland/democompositor/democompositor.qrc +++ b/wayland/democompositor/democompositor.qrc @@ -6,15 +6,15 @@ qml/MyButton.qml qml/LaunchButton.qml qml/TimedButton.qml - images/quit.png - images/greendot.png - images/reddot.png - images/graydot.png - images/graydots.png - images/greendots.png - images/Icon_Clocks.png - images/Icon_Maps.png - images/Icon_RSS.png - images/Icon_StocQt.png + resources/images/quit.png + resources/images/greendot.png + resources/images/reddot.png + resources/images/graydot.png + resources/images/graydots.png + resources/images/greendots.png + resources/images/Icon_Clocks.png + resources/images/Icon_Maps.png + resources/images/Icon_RSS.png + resources/images/Icon_StocQt.png diff --git a/wayland/democompositor/democompositor_all.pro b/wayland/democompositor/democompositor_all.pro new file mode 100644 index 0000000..52ae399 --- /dev/null +++ b/wayland/democompositor/democompositor_all.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs +SUBDIRS = \ + democompositor.pro \ + tests/apps \ + tests/applist diff --git a/wayland/democompositor/main.cpp b/wayland/democompositor/main.cpp index a094a20..2b1279d 100644 --- a/wayland/democompositor/main.cpp +++ b/wayland/democompositor/main.cpp @@ -48,6 +48,8 @@ ** ****************************************************************************/ +#include +#include #include #include @@ -55,11 +57,14 @@ #include #include #include + +#include "apps/applistmodel.h" #include "processlauncher.h" static void registerTypes() { qmlRegisterType("com.theqtcompany.wlprocesslauncher", 1, 0, "ProcessLauncher"); + qmlRegisterType("com.theqtcompany.wlapplistmodel", 1, 0, "AppListModel"); } @@ -68,13 +73,38 @@ int main(int argc, char *argv[]) { qputenv("QT_QPA_EGLFS_HIDECURSOR", "1"); QGuiApplication app(argc, argv); + QGuiApplication::setApplicationName("democompositor"); + QGuiApplication::setApplicationVersion("1.0"); + + /* Parse options */ + QCommandLineParser parser; + parser.setApplicationDescription("Demo Compositor"); + parser.addHelpOption(); + parser.addVersionOption(); + + QCommandLineOption fontNameOpt(QStringList() << "f" << "font", + QCoreApplication::translate("main", "Default font to use"), + QCoreApplication::translate("main", "Name of the font"), + "Open Sans"); + parser.addOption(fontNameOpt); + QCommandLineOption fontNameSzeOpt(QStringList() << "s" << "size", + QCoreApplication::translate("main", "Default font size to use"), + QCoreApplication::translate("main", "Point size of the font"), + "12"); + parser.addOption(fontNameSzeOpt); + QCommandLineOption qmlUrlOpt(QStringList() << "o" << "open", + QCoreApplication::translate("main", "QML scene to open"), + QCoreApplication::translate("main", "URL"), + "qrc:///qml/main.qml"); + parser.addOption(qmlUrlOpt); + parser.process(app); - QFont f("Open Sans", 12.5); + QFont f(parser.value(fontNameOpt), parser.value(fontNameSzeOpt).toInt()); app.setFont(f); qputenv("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1"); registerTypes(); - QQmlApplicationEngine appEngine(QUrl("qrc:///qml/main.qml")); + QQmlApplicationEngine appEngine(QUrl(parser.value(qmlUrlOpt))); return app.exec(); } diff --git a/wayland/democompositor/processlauncher.cpp b/wayland/democompositor/processlauncher.cpp index a25fbd5..29e4d64 100644 --- a/wayland/democompositor/processlauncher.cpp +++ b/wayland/democompositor/processlauncher.cpp @@ -49,8 +49,22 @@ ****************************************************************************/ #include "processlauncher.h" +#include "apps/appentry.h" #include +#include + +Q_LOGGING_CATEGORY(procs, "launcher.procs") + +/* + * Two AppState's are equal if they are managing the same + * QProcess. It is assumed that no AppState survives beyond + * the QProcess. + */ +bool operator==(const AppState& lhs, const AppState& rhs) +{ + return lhs.process == rhs.process; +} WaylandProcessLauncher::WaylandProcessLauncher(QObject *parent) : QObject(parent) @@ -59,18 +73,114 @@ WaylandProcessLauncher::WaylandProcessLauncher(QObject *parent) WaylandProcessLauncher::~WaylandProcessLauncher() { + for (auto state : m_appStates) { + state.process->disconnect(state.finishedConn); + state.process->disconnect(state.errorOccurredConn); + state.process->disconnect(state.startedConn); + delete state.process; + } + m_appStates.clear(); +} + +QVariant WaylandProcessLauncher::appStateForPid(int pid) const +{ + for (auto state : m_appStates) { + if (state.process->pid() == pid) { + qCDebug(procs) << "Found state for" << pid << state.appEntry.executableName; + return QVariant::fromValue(state); + } + } + + qCDebug(procs) << "Couldn't find entry for" << pid; + return QVariant(); +} + +bool WaylandProcessLauncher::isRunning(const AppEntry& entry) const +{ + for (auto state : m_appStates) { + if (state.appEntry.sourceFileName == entry.sourceFileName) { + qCDebug(procs) << "AppEntry associated to a state" << entry.executableName; + return true; + } + } + + qCDebug(procs) << "AppEntry not associated to a state " << entry.executableName; + return false; +} + +void WaylandProcessLauncher::kill(const AppEntry& entry) +{ + for (auto state : m_appStates) { + if (state.appEntry.sourceFileName != entry.sourceFileName) + continue; + + qCDebug(procs) << "Killing process " << state.process->pid() << " for " << entry.sourceFileName; + state.process->kill(); + } } -void WaylandProcessLauncher::launch(const QString &program) +void WaylandProcessLauncher::stop(const AppEntry& entry, int ms) { + for (auto state : m_appStates) { + if (state.appEntry.sourceFileName != entry.sourceFileName) + continue; + + auto timer = new QTimer(state.process); + connect(timer, &QTimer::timeout, [entry, state, timer] { + qCDebug(procs) << "Sending SIGKILL " << state.process->pid() << " for " << entry.sourceFileName; + timer->deleteLater(); + state.process->kill(); + }); + timer->start(ms); + qCDebug(procs) << "Sending SIGTERM " << state.process->pid() << " for " << entry.sourceFileName; + state.process->terminate(); + } +} + +void WaylandProcessLauncher::launch(const AppEntry &entry) +{ + qCDebug(procs) << "Launching" << entry.executableName; + QProcess *process = new QProcess(this); - connect(process, static_cast(&QProcess::finished), - process, &QProcess::deleteLater); - connect(process, &QProcess::errorOccurred, &QProcess::deleteLater); + process->setProcessChannelMode(QProcess::ForwardedChannels); + + QMetaObject::Connection conn; + AppState state{process, entry, conn, conn, conn}; + m_appStates.push_back(state); + + /* handle potential errors and life cycle */ + state.finishedConn = connect(process, static_cast(&QProcess::finished), + [state, this](int exitCode, QProcess::ExitStatus status) { + qCDebug(procs) << "AppEntry finished" << state.appEntry.executableName << exitCode << status; + emit appFinished(state, exitCode, status); + m_appStates.removeOne(state); + state.process->deleteLater(); + }); + state.errorOccurredConn = connect(process, &QProcess::errorOccurred, + [state, this](QProcess::ProcessError err) { + qCDebug(procs) << "AppEntry error occurred" << state.appEntry.executableName << err; + + /* Maybe finished was already emitted. Let's not emit an error after that */ + if (!m_appStates.removeOne(state)) + return; + + if (err == QProcess::FailedToStart || err == QProcess::UnknownError) + emit appNotStarted(state); + state.process->deleteLater(); + }); + state.startedConn = connect(process, &QProcess::started, + [state, this]() { + qCDebug(procs) << "AppEntry started" << state.appEntry.executableName; + emit appStarted(state); + }); + + if (!entry.executablePath.isNull()) { + auto env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("PATH"), entry.executablePath); + process->setProcessEnvironment(env); + } QStringList arguments; arguments << "-platform" << "wayland"; - process->start(program, arguments); - + process->start(entry.executableName, arguments); } - diff --git a/wayland/democompositor/processlauncher.h b/wayland/democompositor/processlauncher.h index 261da6d..ae847e2 100644 --- a/wayland/democompositor/processlauncher.h +++ b/wayland/democompositor/processlauncher.h @@ -51,7 +51,29 @@ #ifndef PROCESSLAUNCHER_H #define PROCESSLAUNCHER_H +#include "apps/appentry.h" + #include +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(procs) + +/** + * Transient class. Do not keep AppState beyond the + * finished signal. + */ +class AppState { + Q_GADGET + Q_PROPERTY(QProcess *process MEMBER process CONSTANT) + Q_PROPERTY(AppEntry appEntry MEMBER appEntry CONSTANT) +public: + QProcess *process; + AppEntry appEntry; + QMetaObject::Connection finishedConn; + QMetaObject::Connection errorOccurredConn; + QMetaObject::Connection startedConn; +}; class WaylandProcessLauncher : public QObject { @@ -60,7 +82,22 @@ class WaylandProcessLauncher : public QObject public: explicit WaylandProcessLauncher(QObject *parent = 0); ~WaylandProcessLauncher(); - Q_INVOKABLE void launch(const QString &program); + Q_INVOKABLE void launch(const AppEntry &entry); + + Q_INVOKABLE QVariant appStateForPid(int pid) const; + Q_INVOKABLE bool isRunning(const AppEntry& entry) const; + Q_INVOKABLE void kill(const AppEntry& entry); + Q_INVOKABLE void stop(const AppEntry& entry, int timeout_ms); + +Q_SIGNALS: + void appStarted(const AppState &appState); + void appFinished(const AppState &appState, int exitCode, QProcess::ExitStatus exitStatus); + void appNotStarted(const AppState& appState); + +private: + QVector m_appStates; }; +Q_DECLARE_METATYPE(AppState) + #endif // PROCESSLAUNCHER_H diff --git a/wayland/democompositor/qml/Chrome.qml b/wayland/democompositor/qml/Chrome.qml index ea613fa..9c21cd1 100644 --- a/wayland/democompositor/qml/Chrome.qml +++ b/wayland/democompositor/qml/Chrome.qml @@ -65,6 +65,8 @@ Rectangle { property int marginWidth : 5 property int titlebarHeight : 5 + property var appEntry + function requestSize(w, h) { surfaceItem.requestSize(Qt.size(w - 2 * marginWidth, h - titlebarHeight - marginWidth)) } @@ -106,7 +108,7 @@ Rectangle { } ] - WaylandQuickItem { + ShellSurfaceItem { id: surfaceItem anchors.fill: parent @@ -116,13 +118,11 @@ Rectangle { property bool dead: false property bool valid: false property bool explicitlyHidden: false - property var shellSurface: ShellSurface { - } sizeFollowsSurface: false onSurfaceDestroyed: { - view.bufferLock = true; + bufferLocked = true; x = 0 y = 0 rootChrome.destroyAnimation.start(); diff --git a/wayland/democompositor/qml/LaunchButton.qml b/wayland/democompositor/qml/LaunchButton.qml index deb462c..80a057a 100644 --- a/wayland/democompositor/qml/LaunchButton.qml +++ b/wayland/democompositor/qml/LaunchButton.qml @@ -51,11 +51,14 @@ import QtQuick 2.6 MyButton { - property string executable + property var appEntry text.text: "Uninitialized" text.elide: Text.ElideRight text.maximumLineCount: 1 iconSize: 32 - onTriggered: launcher.launch(executable) + onTriggered: { + if (!launcher.isRunning(appEntry)) + launcher.launch(appEntry) + } } diff --git a/wayland/democompositor/qml/Screen.qml b/wayland/democompositor/qml/Screen.qml index 84c433e..65df18f 100644 --- a/wayland/democompositor/qml/Screen.qml +++ b/wayland/democompositor/qml/Screen.qml @@ -53,11 +53,13 @@ import QtQuick.Window 2.2 import QtWayland.Compositor 1.0 import com.theqtcompany.wlprocesslauncher 1.0 +import com.theqtcompany.wlapplistmodel 1.0 WaylandOutput { id: output property alias surfaceArea: background + property alias appLauncher: launcher property var windowList: [ ] property int hiddenWindowCount @@ -85,6 +87,17 @@ WaylandOutput { id: launcher } + AppListModel { + id: apps + onAppRemoved: { + console.log("Application was removed: " + appEntry.appName); + launcher.kill(appEntry); + } + } + + Component.onCompleted: { + apps.addAndWatchDir("/data/user/democompositor/apps/") + } Rectangle { id: curtain @@ -176,7 +189,7 @@ WaylandOutput { pressedColor: pressedCol text.maximumLineCount: 1 - text.text: modelData.shellSurface.title.length > 0 ? modelData.shellSurface.title : "Untitled" + text.text: winItem.appEntry == null ? "Untitled" : winItem.appEntry.appName text.elide: Text.ElideRight text.color: textCol onTriggered: { @@ -189,7 +202,9 @@ WaylandOutput { } onSlideTrigger: { //console.log("slide " + winItem + " : " + winItem.shellSurface.surface) - winItem.shellSurface.surface.client.close() + winItem.appEntry == null ? + winItem.shellSurface.surface.client.close() : + launcher.stop(winItem.appEntry, 5000); } } Rectangle { @@ -252,46 +267,20 @@ WaylandOutput { height: 5 width: 1 } - LaunchButton { - height: 60 - width: sidebar.width - 10 - buttonColor: backgroundCol - pressedColor: pressedCol - textColor: textCol - text.text: "Clocks" - executable: "./clocks" - icon.source: "qrc:/images/Icon_Clocks.png" - } - LaunchButton { - height: 60 - width: sidebar.width - 10 - buttonColor: backgroundCol - pressedColor: pressedCol - textColor: textCol - text.text: "RSS News" - executable: "./rssnews" - icon.source: "qrc:/images/Icon_RSS.png" - } - LaunchButton { - height: 60 - width: sidebar.width - 10 - buttonColor: backgroundCol - pressedColor: pressedCol - textColor: textCol - text.text: "StoQt" - executable: "./stocqt" - icon.source: "qrc:/images/Icon_StocQt.png" - } - LaunchButton { - height: 60 - width: sidebar.width - 10 - buttonColor: backgroundCol - pressedColor: pressedCol - textColor: textCol - text.text: "Maps" - executable: "./qml_location_mapviewer" - icon.source: "qrc:/images/Icon_Maps.png" + Repeater { + model: apps + + LaunchButton { + height: 60 + width: sidebar.width - 10 + buttonColor: backgroundCol + pressedColor: pressedCol + textColor: textCol + text.text: model.applicationName + appEntry: model.appEntry + icon.source: model.iconName + } } TimedButton { @@ -318,7 +307,7 @@ WaylandOutput { anchors.left: sidebar.right anchors.right: parent.right anchors.bottom: parent.bottom - enableWSCursor: false + windowSystemCursorEnabled: false Rectangle { id: background anchors.fill: parent diff --git a/wayland/democompositor/qml/main.qml b/wayland/democompositor/qml/main.qml index 8104db6..3947b52 100644 --- a/wayland/democompositor/qml/main.qml +++ b/wayland/democompositor/qml/main.qml @@ -57,6 +57,7 @@ WaylandCompositor { property var primarySurfacesArea: null Screen { + id: mainScreen compositor: comp } @@ -66,33 +67,22 @@ WaylandCompositor { } } - Component { - id: surfaceComponent - WaylandSurface { - } - } - - extensions: [ - Shell { - id: defaultShell - - - onCreateShellSurface: { - var item = chromeComponent.createObject(defaultOutput.surfaceArea, { "surface": surface } ); - item.shellSurface.initialize(defaultShell, surface, client, id); - } - - Component.onCompleted: { - initialize(); + WlShell { + id: defaultShell + onWlShellSurfaceCreated: { + const pid = shellSurface.surface.client.processId; + const appState = mainScreen.appLauncher.appStateForPid(pid); + var appEntry; + if (!appState) { + console.log("shellSurface of unknown application. Continuing. PID=" + pid); + } else { + console.log("shellSurface belonging to " + appState.appEntry.executableName); + appEntry = appState.appEntry; } + chromeComponent.createObject(defaultOutput.surfaceArea, { + "shellSurface": shellSurface, + "appEntry": appEntry } ); + defaultOutput.relayout(); } - ] - - onCreateSurface: { - var surface = surfaceComponent.createObject(comp, { } ); - surface.initialize(comp, client, id, version); - } - onSurfaceCreated: { - defaultOutput.relayout() } } diff --git a/wayland/democompositor/resources/apps/clock.app b/wayland/democompositor/resources/apps/clock.app new file mode 100644 index 0000000..6ddf0d2 --- /dev/null +++ b/wayland/democompositor/resources/apps/clock.app @@ -0,0 +1,12 @@ +{ + "Type": "Application", + "Version": 1, + "Icon": "qrc:/images/Icon_Clocks.png", + "Name": "Clocks", + "Id": "io.qt.clocks", + "Exec": "clocks", + "Path": "./", + "X-Fullscreen": true, + "X-Priority": 100, + "X-Screen": "left" +} diff --git a/wayland/democompositor/resources/apps/maps.app b/wayland/democompositor/resources/apps/maps.app new file mode 100644 index 0000000..0192e4b --- /dev/null +++ b/wayland/democompositor/resources/apps/maps.app @@ -0,0 +1,9 @@ +{ + "Type": "Application", + "Version": 1, + "Icon": "qrc:/images/Icon_Maps.png", + "Name": "Maps", + "Id": "io.qt.maps", + "Exec": "qml_location_mapviewer", + "Path": "./" +} diff --git a/wayland/democompositor/resources/apps/rss.app b/wayland/democompositor/resources/apps/rss.app new file mode 100644 index 0000000..d631cda --- /dev/null +++ b/wayland/democompositor/resources/apps/rss.app @@ -0,0 +1,9 @@ +{ + "Type": "Application", + "Version": 1, + "Icon": "qrc:/images/Icon_RSS.png", + "Name": "RSS News", + "Id": "io.qt.rssnews", + "Exec": "rssnews", + "Path": "./" +} diff --git a/wayland/democompositor/resources/apps/stocqt.app b/wayland/democompositor/resources/apps/stocqt.app new file mode 100644 index 0000000..692f9ce --- /dev/null +++ b/wayland/democompositor/resources/apps/stocqt.app @@ -0,0 +1,9 @@ +{ + "Type": "Application", + "Version": 1, + "Icon": "qrc:/images/Icon_StocQt.png", + "Name": "StoQt", + "Id": "io.qt.stoqt", + "Exec": "stocqt", + "Path": "./" +} diff --git a/wayland/democompositor/images/Icon_Clocks.png b/wayland/democompositor/resources/images/Icon_Clocks.png similarity index 100% rename from wayland/democompositor/images/Icon_Clocks.png rename to wayland/democompositor/resources/images/Icon_Clocks.png diff --git a/wayland/democompositor/images/Icon_Maps.png b/wayland/democompositor/resources/images/Icon_Maps.png similarity index 100% rename from wayland/democompositor/images/Icon_Maps.png rename to wayland/democompositor/resources/images/Icon_Maps.png diff --git a/wayland/democompositor/images/Icon_RSS.png b/wayland/democompositor/resources/images/Icon_RSS.png similarity index 100% rename from wayland/democompositor/images/Icon_RSS.png rename to wayland/democompositor/resources/images/Icon_RSS.png diff --git a/wayland/democompositor/images/Icon_StocQt.png b/wayland/democompositor/resources/images/Icon_StocQt.png similarity index 100% rename from wayland/democompositor/images/Icon_StocQt.png rename to wayland/democompositor/resources/images/Icon_StocQt.png diff --git a/wayland/democompositor/images/graydot.png b/wayland/democompositor/resources/images/graydot.png similarity index 100% rename from wayland/democompositor/images/graydot.png rename to wayland/democompositor/resources/images/graydot.png diff --git a/wayland/democompositor/images/graydots.png b/wayland/democompositor/resources/images/graydots.png similarity index 100% rename from wayland/democompositor/images/graydots.png rename to wayland/democompositor/resources/images/graydots.png diff --git a/wayland/democompositor/images/greendot.png b/wayland/democompositor/resources/images/greendot.png similarity index 100% rename from wayland/democompositor/images/greendot.png rename to wayland/democompositor/resources/images/greendot.png diff --git a/wayland/democompositor/images/greendots.png b/wayland/democompositor/resources/images/greendots.png similarity index 100% rename from wayland/democompositor/images/greendots.png rename to wayland/democompositor/resources/images/greendots.png diff --git a/wayland/democompositor/images/icon1.png b/wayland/democompositor/resources/images/icon1.png similarity index 100% rename from wayland/democompositor/images/icon1.png rename to wayland/democompositor/resources/images/icon1.png diff --git a/wayland/democompositor/images/icon2.png b/wayland/democompositor/resources/images/icon2.png similarity index 100% rename from wayland/democompositor/images/icon2.png rename to wayland/democompositor/resources/images/icon2.png diff --git a/wayland/democompositor/images/icon3.png b/wayland/democompositor/resources/images/icon3.png similarity index 100% rename from wayland/democompositor/images/icon3.png rename to wayland/democompositor/resources/images/icon3.png diff --git a/wayland/democompositor/images/icon4.png b/wayland/democompositor/resources/images/icon4.png similarity index 100% rename from wayland/democompositor/images/icon4.png rename to wayland/democompositor/resources/images/icon4.png diff --git a/wayland/democompositor/images/quit.png b/wayland/democompositor/resources/images/quit.png similarity index 100% rename from wayland/democompositor/images/quit.png rename to wayland/democompositor/resources/images/quit.png diff --git a/wayland/democompositor/images/reddot.png b/wayland/democompositor/resources/images/reddot.png similarity index 100% rename from wayland/democompositor/images/reddot.png rename to wayland/democompositor/resources/images/reddot.png diff --git a/wayland/democompositor/tests/applist/applist.pro b/wayland/democompositor/tests/applist/applist.pro new file mode 100644 index 0000000..e253b66 --- /dev/null +++ b/wayland/democompositor/tests/applist/applist.pro @@ -0,0 +1,17 @@ +TARGET = tst_applistmodel +QT = testlib +CONFIG += testcase + +INCLUDEPATH += ../../apps + +HEADERS += \ + ../../apps/appentry.h \ + ../../apps/applistmodel.h + +SOURCES += \ + ../../apps/appentry.cpp \ + ../../apps/appparser.cpp \ + ../../apps/applistmodel.cpp + +SOURCES += tst_applistmodel.cpp +RESOURCES += applist.qrc diff --git a/wayland/democompositor/tests/applist/applist.qrc b/wayland/democompositor/tests/applist/applist.qrc new file mode 100644 index 0000000..eb4d8da --- /dev/null +++ b/wayland/democompositor/tests/applist/applist.qrc @@ -0,0 +1,6 @@ + + + ../../resources/apps/clock.app + ../../resources/apps/maps.app + + diff --git a/wayland/democompositor/tests/applist/tst_applistmodel.cpp b/wayland/democompositor/tests/applist/tst_applistmodel.cpp new file mode 100644 index 0000000..921defc --- /dev/null +++ b/wayland/democompositor/tests/applist/tst_applistmodel.cpp @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "applistmodel.h" +#include "appentry.h" + +#include + +#include + +class tst_AppListModel : public QObject { + Q_OBJECT + +private Q_SLOTS: + void testNoDuplicates(); + void testRoles(); +}; + +void tst_AppListModel::testNoDuplicates() +{ + AppListModel model; + QCOMPARE(model.rowCount(QModelIndex()), 0); + model.addFile(":/app1.json"); + QCOMPARE(model.rowCount(QModelIndex()), 1); + model.addFile(":/app2.json"); + QCOMPARE(model.rowCount(QModelIndex()), 2); + model.addFile(":/app1.json"); + QCOMPARE(model.rowCount(QModelIndex()), 2); + model.addFile(":/app2.json"); +} + +void tst_AppListModel::testRoles() +{ + AppListModel model; + model.addFile(":/app1.json"); + + auto idx = model.index(1, 0); + QVERIFY(!idx.isValid()); + idx = model.index(0, 0); + QVERIFY(idx.isValid()); + + /* Check we get a full AppEntry back */ + auto var = idx.data(AppListModel::App); + QVERIFY(var.canConvert()); + auto app = var.value(); + QCOMPARE(app.sourceFileName, QStringLiteral(":/app1.json")); + + var = idx.data(AppListModel::IconName); + QCOMPARE(var.toString(), QStringLiteral("qrc:/images/Icon_Clocks.png")); + var = idx.data(AppListModel::ApplicationName); + QCOMPARE(var.toString(), QStringLiteral("Clocks")); + var = idx.data(AppListModel::ExeuctableName); + QCOMPARE(var.toString(), QStringLiteral("clocks")); + var = idx.data(AppListModel::ExecutablePath); + QCOMPARE(var.toString(), QStringLiteral("./")); + var = idx.data(AppListModel::SourceFileName); + QCOMPARE(var.toString(), QStringLiteral(":/app1.json")); +} + +QTEST_MAIN(tst_AppListModel) +#include "tst_applistmodel.moc" diff --git a/wayland/democompositor/tests/apps/apps.pro b/wayland/democompositor/tests/apps/apps.pro new file mode 100644 index 0000000..21a6cfe --- /dev/null +++ b/wayland/democompositor/tests/apps/apps.pro @@ -0,0 +1,15 @@ +TARGET = tst_apps +QT = testlib +CONFIG += testcase + +INCLUDEPATH += ../../apps + +HEADERS += \ + ../../apps/appentry.h + +SOURCES += \ + ../../apps/appentry.cpp \ + ../../apps/appparser.cpp + +SOURCES += tst_appparser.cpp +RESOURCES += apps.qrc diff --git a/wayland/democompositor/tests/apps/apps.qrc b/wayland/democompositor/tests/apps/apps.qrc new file mode 100644 index 0000000..a8a834b --- /dev/null +++ b/wayland/democompositor/tests/apps/apps.qrc @@ -0,0 +1,5 @@ + + + ../../resources/apps/clock.app + + diff --git a/wayland/democompositor/tests/apps/tst_appparser.cpp b/wayland/democompositor/tests/apps/tst_appparser.cpp new file mode 100644 index 0000000..38a459c --- /dev/null +++ b/wayland/democompositor/tests/apps/tst_appparser.cpp @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of Qt for Device Creation. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "appparser.h" + +class tst_AppParser : public QObject { + Q_OBJECT + +private Q_SLOTS: + void testValidVersion1_data(); + void testValidVersion1(); + + void testInvalid_data(); + void testInvalid(); + + void testFileOpen(); +}; + + +void tst_AppParser::testValidVersion1_data() +{ + QTest::addColumn("input"); + QTest::addColumn("icon"); + QTest::addColumn("name"); + QTest::addColumn("id"); + QTest::addColumn("exec"); + QTest::addColumn("path"); + + QTest::addRow("clock") + << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Id\":\"io.qt.clocks\",\"Exec\":\"clocks\"}") + << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("io.qt.clocks") << QStringLiteral("clocks") << QString(); + QTest::addRow("path") + << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Id\":\"io.qt.clocks\",\"Exec\":\"clocks\",\"Path\":\"P\"}") + << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("io.qt.clocks") << QStringLiteral("clocks") << QStringLiteral("P"); +} + +void tst_AppParser::testValidVersion1() +{ + QFETCH(QByteArray, input); + QFETCH(QString, icon); + QFETCH(QString, name); + QFETCH(QString, exec); + QFETCH(QString, path); + + bool ok = false; + auto entry = AppParser::parseData(input, QStringLiteral("dummy"), &ok); + QVERIFY(ok); +} + +void tst_AppParser::testInvalid_data() +{ + QTest::addColumn("input"); + QTest::addRow("no json") << QByteArray("12345"); + QTest::addRow("array") << QByteArray("[]"); + QTest::addRow("no content") << QByteArray("{}"); + QTest::addRow("empty") << QByteArray(""); +} + +void tst_AppParser::testInvalid() +{ + QFETCH(QByteArray, input); + + bool ok = true; + AppParser::parseData(input, QStringLiteral("dummy"), &ok); + QVERIFY(!ok); +} + +void tst_AppParser::testFileOpen() +{ + bool ok = true; + + AppParser::parseFile(":/can_not_exist_here.json", &ok); + QVERIFY(!ok); + + ok = false; + auto entry = AppParser::parseFile(":/app.json", &ok); + QVERIFY(ok); + QCOMPARE(entry.iconName, QStringLiteral("qrc:/images/Icon_Clocks.png")); + QCOMPARE(entry.appName, QStringLiteral("Clocks")); + QCOMPARE(entry.executableName, QStringLiteral("clocks")); + QCOMPARE(entry.executablePath, QStringLiteral("./")); + + // Look at extensions + QVERIFY(entry.extensions["X-Fullscreen"].canConvert(QMetaType::Bool)); + QCOMPARE(entry.extensions["X-Fullscreen"].toBool(), true); + QVERIFY(entry.extensions["X-Priority"].canConvert(QMetaType::Double)); + QCOMPARE(entry.extensions["X-Priority"].toInt(), 100); + QVERIFY(entry.extensions["X-Screen"].canConvert(QMetaType::QString)); + QCOMPARE(entry.extensions["X-Screen"].toString(), QStringLiteral("left")); +} + +QTEST_MAIN(tst_AppParser) +#include "tst_appparser.moc"