From a58486bff0c9ca78706f6d05482348e7f588502c Mon Sep 17 00:00:00 2001 From: tabidachinokaze Date: Wed, 26 Nov 2025 17:18:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=89=80=E6=9C=89=20orx=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 22 +- CNAME | 1 - CONTRIBUTING.md | 162 - LICENSE | 25 - README.md | 120 - android/build.gradle.kts | 4 +- .../ExampleInstrumentedTest.kt | 4 +- .../{orx => geotools}/ContoursManager.kt | 16 +- .../{orx => geotools}/ControllableArrow.kt | 4 +- .../{orx => geotools}/CoordinateGenerator.kt | 2 +- .../{orx => geotools}/DisplaySlopeResult.kt | 4 +- .../{orx => geotools}/EarthworkManager.kt | 2 +- .../icegps/{orx => geotools}/GridDisplay.kt | 2 +- .../com/icegps/{orx => geotools}/GridModel.kt | 2 +- .../icegps/{orx => geotools}/MainActivity.kt | 4 +- .../icegps/{orx => geotools}/MainViewModel.kt | 4 +- .../icegps/{orx => geotools}/PolygonTest.kt | 4 +- .../{orx => geotools}/PolylineManager.kt | 4 +- .../{orx => geotools}/RayCastingAlgorithm.kt | 2 +- .../icegps/{orx => geotools}/SimplePalette.kt | 2 +- .../catmullrom/CatmullRom.kt | 6 +- .../{orx => geotools}/color/ColorRGBa.kt | 2 +- .../colorbrewer2/ColorBrewer2.kt | 4 +- .../icegps/{orx => geotools}/ktx/ColorRGBa.kt | 4 +- .../icegps/{orx => geotools}/ktx/Context.kt | 2 +- .../icegps/{orx => geotools}/ktx/Vector2D.kt | 2 +- .../icegps/{orx => geotools}/ktx/Vector3D.kt | 2 +- .../marchingsquares/MarchingSquares.kt | 4 +- .../{orx => geotools}/ExampleUnitTest.kt | 2 +- build-logic/build.gradle.kts | 7 - build-logic/orx-convention/build.gradle.kts | 24 - .../extra/convention/CollectScreenShots.kt | 182 -- .../openrndr/extra/convention/EmbedShaders.kt | 67 - .../org/openrndr/extra/convention/Utils.kt | 21 - .../component-metadata-rule.gradle.kts | 4 - .../extra/convention/dokka.gradle.kts | 38 - .../extra/convention/kotlin-jvm.gradle.kts | 153 - .../kotlin-multiplatform.gradle.kts | 198 -- .../extra/convention/variant.gradle.kts | 5 - .../src/preload/kotlin/ApplicationPreload.kt | 14 - .../orx-variant-plugin/build.gradle.kts | 17 - .../src/main/kotlin/VariantPlugin.kt | 169 - build-logic/settings.gradle.kts | 29 - build-tools/xvfb-java.sh | 2 - build.gradle | 138 - demo-data/.gitignore | 1 - demo-data/cubemaps/garage_iem.dds | Bin 295040 -> 0 bytes demo-data/fonts/IBMPlexMono-Regular.ttf | Bin 113376 -> 0 bytes .../gltf-models/box-animated/BoxAnimated.glb | Bin 11944 -> 0 bytes demo-data/gltf-models/box/Box.glb | Bin 1664 -> 0 bytes demo-data/gltf-models/camera/Scene.glb | Bin 8172 -> 0 bytes .../gltf-models/directional-light/Scene.glb | Bin 20756 -> 0 bytes demo-data/gltf-models/duck/Duck.gltf | 219 -- demo-data/gltf-models/duck/Duck0.bin | Bin 102040 -> 0 bytes demo-data/gltf-models/duck/DuckCM.png | Bin 16302 -> 0 bytes demo-data/gltf-models/fox/Fox.glb | Bin 162872 -> 0 bytes .../gltf-models/irradiance-probes/model.glb | Bin 38368 -> 0 bytes demo-data/gltf-models/point-light/Scene.glb | Bin 5724 -> 0 bytes demo-data/gltf-models/spot-light/Scene.glb | Bin 7376 -> 0 bytes demo-data/gltf-models/suzanne/Suzanne.bin | Bin 590400 -> 0 bytes demo-data/gltf-models/suzanne/Suzanne.gltf | 193 -- .../gltf-models/suzanne/Suzanne_BaseColor.png | Bin 1161624 -> 0 bytes .../suzanne/Suzanne_MetallicRoughness.png | Bin 860478 -> 0 bytes demo-data/images/16-bit.png | Bin 35893 -> 0 bytes demo-data/images/image-001.dds | Bin 307328 -> 0 bytes demo-data/images/image-001.png | Bin 845975 -> 0 bytes demo-data/images/life-cover.jpg | Bin 51599 -> 0 bytes demo-data/images/peopleCity01.jpg | Bin 55523 -> 0 bytes demo-data/images/vw-beetle.jpg | Bin 27110 -> 0 bytes demo-data/obj-models/suzanne/Suzanne.mtl | 2 - demo-data/obj-models/suzanne/Suzanne.obj | 2066 ------------ demo-data/sounds/26777__junggle__btn402.mp3 | Bin 1462 -> 0 bytes demo-data/sounds/26777__junggle__btn402.txt | 8 - demo-data/words/adjectives.txt | 14 - demo-data/words/nouns.txt | 14 - demo-data/words/prepositions.txt | 14 - demo-data/words/words.txt | 14 - desktop/build.gradle.kts | 37 - .../src/jvmDemo/kotlin/DemoColorBrewer2.kt | 35 - desktop/src/jvmDemo/kotlin/DemoDelaunay03.kt | 654 ---- desktop/src/jvmDemo/kotlin/DemoDelaunay3D.kt | 267 -- desktop/src/jvmDemo/kotlin/FindContours.kt | 94 - .../kotlin/HeightmapVolcanoGenerator.kt | 373 --- dokka/images/logo-icon.svg | 2 - dokka/styles/extra.css | 4 - gradle.properties | 40 +- gradle/libs.versions.toml | 60 +- gradle/wrapper/gradle-wrapper.jar | Bin 43764 -> 45633 bytes gradlew | 5 +- gradlew.bat | 3 +- kotlin-js-store/yarn.lock | 2089 ------------- openrndr-demos/build.gradle.kts | 18 - .../src/demo/kotlin/Demo16BitPng.kt | 13 - .../src/demo/kotlin/DemoAnimation01.kt | 29 - .../src/demo/kotlin/DemoAsyncImages01.kt | 13 - .../src/demo/kotlin/DemoBillboardCircles01.kt | 65 - .../src/demo/kotlin/DemoCatmullRom01.kt | 32 - .../src/demo/kotlin/DemoCircleBatch01.kt | 18 - .../src/demo/kotlin/DemoCircleBatch02.kt | 43 - .../src/demo/kotlin/DemoCircleBatch03.kt | 30 - .../src/demo/kotlin/DemoClipping.kt | 43 - .../src/demo/kotlin/DemoColorBufferCopy01.kt | 14 - .../src/demo/kotlin/DemoComputeStyle01.kt | 97 - .../src/demo/kotlin/DemoComputeStyle02.kt | 83 - .../src/demo/kotlin/DemoComputeStyle03.kt | 88 - .../src/demo/kotlin/DemoComputeStyle04.kt | 107 - .../src/demo/kotlin/DemoComputeStyle05.kt | 97 - .../src/demo/kotlin/DemoComputeStyle06.kt | 93 - .../src/demo/kotlin/DemoComputeStyle07.kt | 120 - .../src/demo/kotlin/DemoComputeStyle08.kt | 128 - .../src/demo/kotlin/DemoComputeStyle09.kt | 80 - .../src/demo/kotlin/DemoComputeStyle10.kt | 88 - .../src/demo/kotlin/DemoComputeStyle20.kt | 61 - .../src/demo/kotlin/DemoContour01.kt | 19 - .../src/demo/kotlin/DemoContour02.kt | 41 - .../src/demo/kotlin/DemoContour03.kt | 42 - .../demo/kotlin/DemoContourIntersections01.kt | 37 - .../demo/kotlin/DemoContourIntersections02.kt | 44 - .../demo/kotlin/DemoContourIntersections03.kt | 35 - .../src/demo/kotlin/DemoContourNearest01.kt | 54 - .../src/demo/kotlin/DemoCubemap01.kt | 25 - .../src/demo/kotlin/DemoCubemap02.kt | 31 - .../src/demo/kotlin/DemoCubemap03.kt | 39 - .../src/demo/kotlin/DemoDDSImage01.kt | 13 - .../src/demo/kotlin/DemoGeometryShader01.kt | 30 - .../src/demo/kotlin/DemoImageLoadStore01.kt | 48 - .../src/demo/kotlin/DemoImageLoadStore02.kt | 24 - .../src/demo/kotlin/DemoImageLoadStore03.kt | 29 - .../src/demo/kotlin/DemoLineCapJoin.kt | 52 - .../src/demo/kotlin/DemoLineDash01.kt | 33 - .../src/demo/kotlin/DemoMouseCursor01.kt | 21 - .../src/demo/kotlin/DemoPointBatch01.kt | 22 - .../src/demo/kotlin/DemoScreenCapture01.kt | 42 - .../demo/kotlin/DemoShaderStorageBuffer01.kt | 53 - .../src/demo/kotlin/DemoTessShader01.kt | 50 - .../src/demo/kotlin/DemoTessShader02.kt | 49 - .../src/demo/kotlin/DemoTessShader03.kt | 55 - .../src/demo/kotlin/DemoTessShader04.kt | 67 - .../src/demo/kotlin/DemoVolumeTexture01.kt | 22 - .../demo/kotlin/DrawerNegativeDimensions.kt | 42 - .../src/demo/kotlin/DrawerRectangleBatch01.kt | 16 - .../src/demo/kotlin/DrawerRectangleBatch02.kt | 29 - .../src/demo/kotlin/DrawerRectangleBatch03.kt | 22 - .../src/demo/resources/shaders/gs-01.frag | 8 - .../src/demo/resources/shaders/gs-01.geom | 26 - .../src/demo/resources/shaders/gs-01.vert | 22 - .../src/demo/resources/shaders/ts-01.frag | 7 - .../src/demo/resources/shaders/ts-01.tesc | 16 - .../src/demo/resources/shaders/ts-01.tese | 34 - .../src/demo/resources/shaders/ts-01.vert | 15 - .../src/demo/resources/shaders/ts-02.frag | 7 - .../src/demo/resources/shaders/ts-02.geom | 21 - .../src/demo/resources/shaders/ts-02.tesc | 16 - .../src/demo/resources/shaders/ts-02.tese | 32 - .../src/demo/resources/shaders/ts-02.vert | 15 - .../src/demo/resources/shaders/ts-03.frag | 11 - .../src/demo/resources/shaders/ts-03.geom | 50 - .../src/demo/resources/shaders/ts-03.tesc | 17 - .../src/demo/resources/shaders/ts-03.tese | 48 - .../src/demo/resources/shaders/ts-03.vert | 16 - .../src/demo/resources/shaders/ts-04.frag | 11 - .../src/demo/resources/shaders/ts-04.geom | 77 - .../src/demo/resources/shaders/ts-04.tesc | 17 - .../src/demo/resources/shaders/ts-04.tese | 48 - .../src/demo/resources/shaders/ts-04.vert | 16 - orx-camera/README.md | 160 - orx-camera/build.gradle.kts | 35 - .../src/commonMain/kotlin/AxisHelper.kt | 78 - orx-camera/src/commonMain/kotlin/Camera2D.kt | 234 -- .../src/commonMain/kotlin/ChangeEvents.kt | 8 - .../src/commonMain/kotlin/GridHelper.kt | 56 - orx-camera/src/commonMain/kotlin/Orbital.kt | 67 - .../src/commonMain/kotlin/OrbitalCamera.kt | 459 --- .../src/commonMain/kotlin/OrbitalControls.kt | 151 - .../commonMain/kotlin/ParametricOrbital.kt | 106 - .../src/jvmDemo/kotlin/DemoCamera2D01.kt | 25 - .../src/jvmDemo/kotlin/DemoCamera2D02.kt | 64 - .../jvmDemo/kotlin/DemoCamera2DManual01.kt | 35 - .../jvmDemo/kotlin/DemoCamera2DManual02.kt | 70 - .../src/jvmDemo/kotlin/DemoOrbital01.kt | 39 - .../src/jvmDemo/kotlin/DemoOrbitalCamera01.kt | 69 - .../src/jvmDemo/kotlin/DemoOrbitalManual01.kt | 49 - .../jvmDemo/kotlin/DemoParametricOrbital01.kt | 46 - orx-color/README.md | 421 --- orx-color/build.gradle.kts | 50 - orx-color/src/commonMain/kotlin/Color.kt | 5 - .../kotlin/colormaps/ColormapPhrases.kt | 91 - .../colormaps/SpectralZucconiColormap.kt | 40 - .../kotlin/colormaps/TurboColormap.kt | 39 - .../kotlin/colormatrix/ColorTransforms.kt | 138 - .../kotlin/fettepalette/FettePalette.kt | 256 -- .../src/commonMain/kotlin/mixing/Spectral.kt | 612 ---- .../commonMain/kotlin/palettes/Classics.kt | 92 - .../kotlin/palettes/ColorSequence.kt | 143 - .../src/commonMain/kotlin/phrases/Phrases.kt | 88 - .../src/commonMain/kotlin/presets/Colors.kt | 140 - .../commonMain/kotlin/spaces/ColorHPLUVa.kt | 96 - .../commonMain/kotlin/spaces/ColorHSLUVa.kt | 203 -- .../commonMain/kotlin/spaces/ColorOKHSLa.kt | 143 - .../commonMain/kotlin/spaces/ColorOKHSVa.kt | 150 - .../commonMain/kotlin/spaces/ColorOKLABa.kt | 86 - .../commonMain/kotlin/spaces/ColorOKLCHa.kt | 81 - .../commonMain/kotlin/spaces/ColorXSLUVa.kt | 85 - .../src/commonMain/kotlin/spaces/OKHelpers.kt | 281 -- .../commonMain/kotlin/spaces/TypeAliases.kt | 21 - .../commonMain/kotlin/statistics/DeltaE.kt | 25 - .../commonMain/kotlin/statistics/Histogram.kt | 13 - .../kotlin/tools/ChromaColorExtensions.kt | 47 - .../kotlin/tools/ColorRGBaExtensions.kt | 198 -- orx-color/src/commonTest/kotlin/ColorTest.kt | 5 - .../colormaps/TestSpectralZucconi6Colormap.kt | 29 - .../kotlin/colormaps/TestTurboColormap.kt | 29 - .../commonTest/kotlin/mixing/TestSpectral.kt | 30 - .../commonTest/kotlin/spaces/TestHSLUVa.kt | 23 - .../commonTest/kotlin/spaces/TestOKHSLa.kt | 41 - .../commonTest/kotlin/spaces/TestOKHSVa.kt | 47 - .../commonTest/kotlin/spaces/TestOKLCHa.kt | 24 - .../commonTest/kotlin/spaces/TestXSLUVa.kt | 40 - .../kotlin/tools/TestChromaColorExtensions.kt | 29 - .../kotlin/tools/TestColorRGBaExtensions.kt | 76 - .../src/jvmDemo/kotlin/DemoColorPalette01.kt | 62 - .../src/jvmDemo/kotlin/DemoColorPalette02.kt | 36 - .../src/jvmDemo/kotlin/DemoColorPlane01.kt | 93 - .../src/jvmDemo/kotlin/DemoColorPlane02.kt | 77 - .../src/jvmDemo/kotlin/DemoColorSequence01.kt | 69 - orx-color/src/jvmDemo/kotlin/DemoDeltaE.kt | 37 - .../src/jvmDemo/kotlin/DemoFettePalette01.kt | 84 - .../src/jvmDemo/kotlin/DemoFettePalette02.kt | 75 - orx-color/src/jvmDemo/kotlin/DemoHSLUV01.kt | 50 - orx-color/src/jvmDemo/kotlin/DemoHSLUV02.kt | 46 - .../src/jvmDemo/kotlin/DemoHueTools01.kt | 39 - .../src/jvmDemo/kotlin/DemoMixSpectral01.kt | 35 - orx-color/src/jvmDemo/kotlin/DemoOKHSV01.kt | 36 - orx-color/src/jvmDemo/kotlin/DemoXSLUV01.kt | 59 - .../kotlin/colorRange/DemoColorRange01.kt | 47 - .../kotlin/colorRange/DemoColorRange02.kt | 38 - .../kotlin/colorRange/DemoColorRange03.kt | 60 - .../kotlin/colorRange/DemoColorRange04.kt | 98 - .../colormap/DemoSpectralZucconiColormap.kt | 37 - .../DemoSpectralZucconiColormapPhrase.kt | 33 - .../DemoSpectralZucconiColormapPlot.kt | 61 - .../kotlin/colormap/DemoTurboColormap.kt | 37 - .../colormap/DemoTurboColormapPhrase.kt | 33 - .../kotlin/colormap/DemoTurboColormapPlot.kt | 57 - .../kotlin/colormatrix/DemoColorMatrix01.kt | 38 - .../kotlin/colormatrix/DemoColorMatrix02.kt | 41 - .../kotlin/colormatrix/DemoColorMatrix03.kt | 44 - .../kotlin/colormatrix/DemoColorMatrix04.kt | 53 - .../kotlin/histogram/DemoHistogram01.kt | 59 - .../kotlin/histogram/DemoHistogram02.kt | 38 - .../kotlin/histogram/DemoHistogram03.kt | 32 - .../kotlin/src/statistics/Histogram.kt | 79 - orx-color/src/jvmTest/kotlin/TestMix.kt | 44 - orx-composition/README.md | 82 - orx-composition/build.gradle.kts | 26 - .../src/commonMain/kotlin/Composition.kt | 641 ---- .../commonMain/kotlin/CompositionDrawer.kt | 821 ----- .../kotlin/CompositionStyleSheet.kt | 434 --- .../src/commonMain/kotlin/DrawerExtensions.kt | 93 - .../commonMain/kotlin/ProgramExtensions.kt | 53 - .../src/commonTest/kotlin/TestComposition.kt | 40 - .../jvmDemo/kotlin/DemoCompositionDrawer01.kt | 39 - .../jvmDemo/kotlin/DemoCompositionDrawer02.kt | 32 - .../jvmDemo/kotlin/DemoCompositionDrawer03.kt | 42 - .../jvmDemo/kotlin/DemoCompositionDrawer04.kt | 61 - .../jvmDemo/kotlin/DemoCompositionDrawer05.kt | 43 - orx-compositor/README.md | 275 -- orx-compositor/build.gradle.kts | 28 - .../src/commonMain/kotlin/Compositor.kt | 396 --- .../src/jvmDemo/kotlin/DemoAside01.kt | 49 - .../src/jvmDemo/kotlin/DemoCompositor01.kt | 87 - .../src/jvmDemo/kotlin/DemoCompositor02.kt | 50 - orx-delegate-magic/README.md | 92 - orx-delegate-magic/build.gradle.kts | 26 - .../kotlin/aggregation/Aggregators.kt | 49 - .../kotlin/aggregation/ListAggregation.kt | 46 - .../kotlin/difference/PropertyDifferencer.kt | 30 - .../kotlin/dynamics/PropertySpringForcer.kt | 128 - .../kotlin/smoothing/PropertyFollower.kt | 163 - .../kotlin/smoothing/PropertySmoother.kt | 102 - .../kotlin/tracking/PropertyTracker.kt | 39 - .../src/jvmDemo/kotlin/DemoDifferencing01.kt | 38 - .../src/jvmDemo/kotlin/DemoFollowing01.kt | 59 - .../src/jvmDemo/kotlin/DemoSmoothing01.kt | 29 - .../src/jvmDemo/kotlin/DemoSpring01.kt | 32 - orx-depth-camera/build.gradle.kts | 15 - .../src/commonMain/kotlin/DepthCamera.kt | 72 - orx-easing/README.md | 105 - orx-easing/build.gradle.kts | 27 - orx-easing/src/commonMain/kotlin/Easing.kt | 347 -- .../src/jvmDemo/kotlin/DemoEasings01.kt | 78 - orx-envelopes/README.md | 24 - orx-envelopes/build.gradle.kts | 26 - orx-envelopes/src/commonMain/kotlin/ADSR.kt | 50 - .../src/commonMain/kotlin/Envelope.kt | 11 - .../src/commonMain/kotlin/MPPSynchronize.kt | 3 - .../src/commonMain/kotlin/Tracker.kt | 108 - .../src/jsMain/kotlin/MPPSynchronize.kt | 5 - .../src/jvmDemo/kotlin/DemoADSRTracker01.kt | 33 - .../src/jvmDemo/kotlin/DemoADSRTracker02.kt | 44 - .../src/jvmMain/kotlin/MPPSynchronize.kt | 7 - orx-expression-evaluator-typed/README.md | 13 - .../build.gradle.kts | 24 - .../kotlin/typed/CompiledFunctions.kt | 268 -- .../src/commonMain/kotlin/typed/Function0.kt | 18 - .../src/commonMain/kotlin/typed/Function1.kt | 210 -- .../src/commonMain/kotlin/typed/Function2.kt | 86 - .../src/commonMain/kotlin/typed/Function3.kt | 43 - .../src/commonMain/kotlin/typed/Function4.kt | 30 - .../kotlin/typed/MemberFunctions.kt | 83 - .../src/commonMain/kotlin/typed/Properties.kt | 92 - .../kotlin/typed/TypedExpressions.kt | 1091 ------- .../kotlin/typed/TypedExpressions.js.kt | 8 - .../kotlin/typed/TypedExpressions.jvm.kt | 15 - .../kotlin/typed/TestListLiteralExpression.kt | 24 - .../kotlin/typed/TestRangeExpression.kt | 72 - .../typed/TestTypedCompiledExpression.kt | 117 - .../kotlin/typed/TestTypedExpression.kt | 178 -- orx-expression-evaluator/.gitignore | 2 - orx-expression-evaluator/README.md | 100 - orx-expression-evaluator/build.gradle.kts | 56 - .../src/commonMain/antlr/KeyLangLexer.g4 | 71 - .../src/commonMain/antlr/KeyLangParser.g4 | 50 - .../commonMain/kotlin/CompiledFunctions.kt | 125 - .../commonMain/kotlin/ExpressionDelegate.kt | 40 - .../src/commonMain/kotlin/Expressions.kt | 488 --- .../kotlin/DemoExpressionEvaluator01.kt | 44 - .../kotlin/DemoExpressionEvaluator02.kt | 42 - .../jvmTest/kotlin/TestCompiledExpression.kt | 32 - .../jvmTest/kotlin/TestCompiledFunctions.kt | 29 - .../jvmTest/kotlin/TestExpressionDelegates.kt | 15 - .../jvmTest/kotlin/TestExpressionErrors.kt | 51 - .../src/jvmTest/kotlin/TestExpressions.kt | 198 -- .../src/jvmTest/kotlin/TestOperators.kt | 62 - orx-fcurve/README.md | 233 -- orx-fcurve/build.gradle.kts | 29 - .../src/commonMain/kotlin/CompoundFCurve.kt | 229 -- orx-fcurve/src/commonMain/kotlin/EFCurve.kt | 126 - orx-fcurve/src/commonMain/kotlin/FCurve.kt | 619 ---- .../src/commonMain/kotlin/FCurveModifier.kt | 200 -- .../src/commonMain/kotlin/MultiFCurve.kt | 39 - .../kotlin/MultiFCurveExtensions.kt | 39 - orx-fcurve/src/commonMain/kotlin/Roots.kt | 117 - .../src/commonTest/kotlin/TestEFCurve.kt | 68 - .../src/commonTest/kotlin/TestFCurve.kt | 41 - orx-fcurve/src/jvmDemo/kotlin/DemoFCurve01.kt | 17 - orx-fcurve/src/jvmDemo/kotlin/DemoFCurve02.kt | 26 - .../src/jvmDemo/kotlin/DemoFCurveSheet01.kt | 54 - .../src/jvmDemo/kotlin/DemoMultiFCurve01.kt | 28 - orx-fft/README.md | 15 - orx-fft/build.gradle.kts | 23 - orx-fft/src/commonMain/kotlin/FFT.kt | 225 -- orx-fft/src/commonMain/kotlin/HannWindow.kt | 9 - .../src/commonMain/kotlin/IdentityWindow.kt | 6 - .../src/commonMain/kotlin/WindowFunction.kt | 39 - orx-fft/src/jvmDemo/kotlin/DemoFFTShape01.kt | 156 - orx-fx/README.md | 457 --- orx-fx/build.gradle.kts | 42 - orx-fx/src/commonMain/kotlin/FilterTools.kt | 10 - orx-fx/src/commonMain/kotlin/Post.kt | 118 - .../src/commonMain/kotlin/antialias/FXAA.kt | 46 - .../commonMain/kotlin/blend/BlendFilters.kt | 127 - .../commonMain/kotlin/blend/BlendSpectral.kt | 82 - .../kotlin/blur/ApproximateGaussianBlur.kt | 85 - orx-fx/src/commonMain/kotlin/blur/Bloom.kt | 89 - orx-fx/src/commonMain/kotlin/blur/BoxBlur.kt | 65 - .../commonMain/kotlin/blur/DirectionalBlur.kt | 71 - .../src/commonMain/kotlin/blur/FrameBlur.kt | 61 - .../commonMain/kotlin/blur/GaussianBlur.kt | 49 - orx-fx/src/commonMain/kotlin/blur/HashBlur.kt | 165 - .../src/commonMain/kotlin/blur/LaserBlur.kt | 105 - orx-fx/src/commonMain/kotlin/blur/LineBlur.kt | 68 - orx-fx/src/commonMain/kotlin/blur/MipBloom.kt | 155 - orx-fx/src/commonMain/kotlin/blur/ZoomBlur.kt | 46 - .../kotlin/color/ChromaticAberration.kt | 46 - .../kotlin/color/ColorCorrection.kt | 44 - .../commonMain/kotlin/color/ColorLookup.kt | 32 - .../src/commonMain/kotlin/color/ColorMix.kt | 23 - .../commonMain/kotlin/color/Colorspaces.kt | 19 - orx-fx/src/commonMain/kotlin/color/Duotone.kt | 37 - .../kotlin/color/DuotoneGradient.kt | 50 - orx-fx/src/commonMain/kotlin/color/Invert.kt | 19 - orx-fx/src/commonMain/kotlin/color/LumaMap.kt | 33 - .../commonMain/kotlin/color/LumaOpacity.kt | 31 - .../commonMain/kotlin/color/LumaThreshold.kt | 37 - orx-fx/src/commonMain/kotlin/color/Pal.kt | 27 - .../src/commonMain/kotlin/color/Posterize.kt | 24 - orx-fx/src/commonMain/kotlin/color/Sepia.kt | 19 - .../commonMain/kotlin/color/SetBackground.kt | 25 - .../kotlin/color/SubtractConstant.kt | 14 - .../kotlin/colormap/ColormapFilter.kt | 26 - .../kotlin/colormap/GrayscaleColormap.kt | 12 - .../colormap/SpectralZucconiColormap.kt | 26 - .../kotlin/colormap/TurboColormap.kt | 25 - .../kotlin/composite/CompositeFilter.kt | 123 - .../commonMain/kotlin/distort/BlockRepeat.kt | 60 - .../kotlin/distort/DirectionalDisplace.kt | 55 - .../kotlin/distort/DisplaceBlend.kt | 62 - .../src/commonMain/kotlin/distort/Fisheye.kt | 41 - .../commonMain/kotlin/distort/FluidDistort.kt | 66 - .../src/commonMain/kotlin/distort/Lenses.kt | 50 - .../kotlin/distort/PerspectivePlane.kt | 61 - .../src/commonMain/kotlin/distort/Perturb.kt | 82 - .../kotlin/distort/PolarToRectangular.kt | 33 - .../kotlin/distort/RectangularToPolar.kt | 34 - .../commonMain/kotlin/distort/StackRepeat.kt | 54 - .../commonMain/kotlin/distort/StretchWaves.kt | 45 - .../commonMain/kotlin/distort/TapeNoise.kt | 57 - orx-fx/src/commonMain/kotlin/distort/Tiles.kt | 38 - .../commonMain/kotlin/distort/VideoGlitch.kt | 49 - orx-fx/src/commonMain/kotlin/distort/Wave.kt | 74 - .../src/commonMain/kotlin/dither/ADither.kt | 23 - .../commonMain/kotlin/dither/CMYKHalftone.kt | 80 - .../commonMain/kotlin/dither/Crosshatch.kt | 31 - .../commonMain/kotlin/dither/LumaHalftone.kt | 55 - .../kotlin/edges/CannyEdgeDetector.kt | 54 - orx-fx/src/commonMain/kotlin/edges/Contour.kt | 51 - .../src/commonMain/kotlin/edges/EdgesWork.kt | 63 - .../commonMain/kotlin/edges/LumaLaplacian.kt | 33 - .../src/commonMain/kotlin/edges/LumaSobel.kt | 33 - .../src/commonMain/kotlin/grain/FilmGrain.kt | 45 - .../src/commonMain/kotlin/math/MultiplyU.kt | 19 - .../src/commonMain/kotlin/math/MultiplyV.kt | 25 - orx-fx/src/commonMain/kotlin/math/Square.kt | 13 - .../commonMain/kotlin/patterns/Checkers.kt | 29 - .../commonMain/kotlin/shadow/DropShadow.kt | 78 - .../commonMain/kotlin/tonemap/ACESTonemap.kt | 18 - .../kotlin/tonemap/ReinhardTonemap.kt | 22 - .../kotlin/tonemap/Uncharted2Tonemap.kt | 21 - .../kotlin/transform/FlipVertically.kt | 10 - .../kotlin/DemoApproximateGaussianBlur01.kt | 39 - orx-fx/src/jvmDemo/kotlin/DemoBlend01.kt | 28 - orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt | 136 - .../jvmDemo/kotlin/DemoCannyEdgeDetector01.kt | 20 - .../src/jvmDemo/kotlin/DemoColorDuotone01.kt | 26 - .../kotlin/DemoColorDuotoneGradient01.kt | 34 - .../jvmDemo/kotlin/DemoColorPosterize01.kt | 22 - .../jvmDemo/kotlin/DemoColormapGrayscale.kt | 25 - .../kotlin/DemoColormapSpectralZucconi.kt | 26 - .../src/jvmDemo/kotlin/DemoColormapTurbo.kt | 25 - .../jvmDemo/kotlin/DemoCompositeFilter01.kt | 85 - orx-fx/src/jvmDemo/kotlin/DemoContour01.kt | 64 - .../jvmDemo/kotlin/DemoDirectionalBlur01.kt | 52 - .../kotlin/DemoDirectionalDisplace01.kt | 50 - .../kotlin/DemoDirectionalDisplace02.kt | 45 - .../src/jvmDemo/kotlin/DemoDistortLenses01.kt | 30 - .../kotlin/DemoDitherLumaHalftone01.kt | 29 - .../src/jvmDemo/kotlin/DemoFluidDistort01.kt | 34 - orx-fx/src/jvmDemo/kotlin/DemoLaserBlur01.kt | 57 - orx-fx/src/jvmDemo/kotlin/DemoOkLab01.kt | 25 - orx-fx/src/jvmDemo/kotlin/DemoPost01.kt | 36 - .../src/jvmDemo/kotlin/DemoSpectralBlend01.kt | 57 - orx-fx/src/shaders/glsl/antialias/fxaa.frag | 111 - orx-fx/src/shaders/glsl/blend/add.frag | 40 - orx-fx/src/shaders/glsl/blend/color-burn.frag | 48 - .../src/shaders/glsl/blend/color-dodge.frag | 50 - orx-fx/src/shaders/glsl/blend/darken.frag | 43 - .../shaders/glsl/blend/destination-atop.frag | 32 - .../shaders/glsl/blend/destination-in.frag | 30 - .../shaders/glsl/blend/destination-out.frag | 31 - orx-fx/src/shaders/glsl/blend/hard-light.frag | 44 - orx-fx/src/shaders/glsl/blend/lighten.frag | 44 - .../shaders/glsl/blend/multiply-contrast.frag | 37 - orx-fx/src/shaders/glsl/blend/multiply.frag | 46 - orx-fx/src/shaders/glsl/blend/normal.frag | 46 - orx-fx/src/shaders/glsl/blend/overlay.frag | 55 - .../src/shaders/glsl/blend/passthrough.frag | 25 - orx-fx/src/shaders/glsl/blend/screen.frag | 44 - .../src/shaders/glsl/blend/source-atop.frag | 32 - orx-fx/src/shaders/glsl/blend/source-in.frag | 31 - orx-fx/src/shaders/glsl/blend/source-out.frag | 31 - orx-fx/src/shaders/glsl/blend/spectral.frag | 209 -- orx-fx/src/shaders/glsl/blend/subtract.frag | 39 - orx-fx/src/shaders/glsl/blend/xor.frag | 32 - .../glsl/blur/approximate-gaussian-blur.frag | 36 - .../src/shaders/glsl/blur/bloom-combine.frag | 14 - .../shaders/glsl/blur/bloom-downscale.frag | 19 - .../src/shaders/glsl/blur/bloom-upscale.frag | 80 - orx-fx/src/shaders/glsl/blur/bloom.frag | 18 - orx-fx/src/shaders/glsl/blur/box-blur.frag | 69 - .../shaders/glsl/blur/directional-blur.frag | 46 - .../glsl/blur/directional-hash-blur.frag | 79 - orx-fx/src/shaders/glsl/blur/frame-blur.frag | 10 - .../src/shaders/glsl/blur/gaussian-blur.frag | 25 - orx-fx/src/shaders/glsl/blur/hash-blur.frag | 71 - orx-fx/src/shaders/glsl/blur/kawase-blur.frag | 23 - orx-fx/src/shaders/glsl/blur/laser-blur.frag | 36 - orx-fx/src/shaders/glsl/blur/zoom-blur.frag | 39 - .../glsl/color/chromatic-aberration.frag | 21 - .../shaders/glsl/color/color-correction.frag | 67 - .../src/shaders/glsl/color/color-lookup.frag | 40 - orx-fx/src/shaders/glsl/color/color-mix.frag | 18 - orx-fx/src/shaders/glsl/color/color-tint.frag | 9 - .../shaders/glsl/color/duotone-gradient.frag | 64 - orx-fx/src/shaders/glsl/color/duotone.frag | 35 - orx-fx/src/shaders/glsl/color/invert.frag | 14 - orx-fx/src/shaders/glsl/color/luma-map.frag | 15 - .../src/shaders/glsl/color/luma-opacity.frag | 15 - .../shaders/glsl/color/luma-threshold.frag | 16 - .../src/shaders/glsl/color/oklab-to-rgb.frag | 12 - orx-fx/src/shaders/glsl/color/pal.frag | 121 - orx-fx/src/shaders/glsl/color/posterize.frag | 24 - .../src/shaders/glsl/color/rgb-to-oklab.frag | 12 - .../src/shaders/glsl/color/rgb-to-ycbcr.frag | 16 - orx-fx/src/shaders/glsl/color/sepia.frag | 18 - .../shaders/glsl/color/set-background.frag | 10 - .../shaders/glsl/color/subtract-constant.frag | 9 - .../src/shaders/glsl/color/ycbcr-to-rgb.frag | 24 - .../glsl/colormap/grayscale-colormap.frag | 31 - .../colormap/spectral-zucconi-colormap.frag | 33 - .../shaders/glsl/colormap/turbo-colormap.frag | 33 - .../shaders/glsl/distort/block-repeat.frag | 41 - .../glsl/distort/directional-displace.frag | 37 - .../shaders/glsl/distort/displace-blend.frag | 42 - orx-fx/src/shaders/glsl/distort/fisheye.frag | 41 - .../shaders/glsl/distort/fluid-distort.frag | 71 - .../shaders/glsl/distort/horizontal-wave.frag | 30 - orx-fx/src/shaders/glsl/distort/lenses.frag | 34 - .../glsl/distort/perspective-plane.frag | 43 - orx-fx/src/shaders/glsl/distort/perturb.frag | 173 - .../glsl/distort/polar-to-rectangular.frag | 38 - .../glsl/distort/rectangular-to-polar.frag | 41 - .../shaders/glsl/distort/stack-repeat.frag | 38 - .../shaders/glsl/distort/stretch-waves.frag | 40 - .../src/shaders/glsl/distort/tape-noise.frag | 64 - orx-fx/src/shaders/glsl/distort/tiles.frag | 35 - orx-fx/src/shaders/glsl/distort/uvmap.frag | 9 - .../shaders/glsl/distort/vertical-wave.frag | 30 - .../shaders/glsl/distort/video-glitch.frag | 56 - orx-fx/src/shaders/glsl/dither/a-dither.frag | 49 - .../shaders/glsl/dither/cmyk-halftone.frag | 111 - .../src/shaders/glsl/dither/crosshatch.frag | 53 - .../shaders/glsl/dither/luma-halftone.frag | 62 - .../glsl/edges/canny-edge-detector.frag | 116 - orx-fx/src/shaders/glsl/edges/contour.frag | 51 - .../src/shaders/glsl/edges/edges-work-1.frag | 37 - .../src/shaders/glsl/edges/edges-work-2.frag | 38 - .../shaders/glsl/edges/luma-laplacian.frag | 62 - orx-fx/src/shaders/glsl/edges/luma-sobel.frag | 47 - orx-fx/src/shaders/glsl/grain/film-grain.frag | 107 - orx-fx/src/shaders/glsl/math/multiply-u.frag | 27 - orx-fx/src/shaders/glsl/math/multiply-v.frag | 28 - orx-fx/src/shaders/glsl/math/square.frag | 26 - .../src/shaders/glsl/patterns/checkers.frag | 49 - .../shaders/glsl/shadow/dropshadow-blend.frag | 12 - .../shaders/glsl/shadow/dropshadow-blur.frag | 28 - .../shaders/glsl/tonemap/aces-tonemap.frag | 25 - .../glsl/tonemap/reinhard-tonemap.frag | 33 - .../glsl/tonemap/uncharted2-tonemap.frag | 26 - .../glsl/transform/flip-vertically.frag | 10 - orx-gradient-descent/README.md | 35 - orx-gradient-descent/build.gradle.kts | 41 - .../src/commonMain/kotlin/GradientDescent.kt | 177 -- .../src/jvmMain/kotlin/DataBinding.kt | 90 - .../src/jvmMain/kotlin/GradientDescent.kt | 12 - .../src/jvmTest/kotlin/TestDot.kt | 26 - .../src/jvmTest/kotlin/TestGradient.kt | 41 - .../src/jvmTest/kotlin/TestMinimize.kt | 13 - .../src/jvmTest/kotlin/TestMinimizeModel.kt | 34 - .../src/jvmTest/kotlin/TestPlaceholder.kt | 8 - orx-hash-grid/README.md | 114 - orx-hash-grid/build.gradle.kts | 31 - .../src/commonMain/kotlin/HashGrid.kt | 254 -- .../src/commonMain/kotlin/HashGrid3D.kt | 269 -- .../src/jvmDemo/kotlin/DemoFilter01.kt | 30 - .../src/jvmDemo/kotlin/DemoFilter3D01.kt | 53 - .../src/jvmDemo/kotlin/DemoHashGrid01.kt | 42 - orx-image-fit/README.md | 103 - orx-image-fit/build.gradle.kts | 28 - .../src/commonMain/kotlin/ImageFit.kt | 187 -- .../src/jvmDemo/kotlin/DemoImageFit01.kt | 72 - .../src/jvmDemo/kotlin/DemoImageFitSub01.kt | 39 - orx-integral-image/README.md | 21 - orx-integral-image/build.gradle.kts | 10 - .../src/demo/kotlin/DemoFII01.kt | 46 - .../src/demo/kotlin/DemoFII02.kt | 85 - .../src/main/kotlin/FastIntegralImage.kt | 146 - .../src/main/kotlin/IntegralImage.kt | 80 - .../resources/shaders/gl3/integral-image.frag | 26 - orx-interval-tree/README.md | 25 - orx-interval-tree/build.gradle.kts | 3 - .../src/main/kotlin/IntervalTree.kt | 95 - orx-jumpflood/README.md | 277 -- orx-jumpflood/build.gradle.kts | 42 - .../src/commonMain/kotlin/ClusteredField.kt | 127 - .../src/commonMain/kotlin/DirectionalField.kt | 143 - .../src/commonMain/kotlin/DistanceField.kt | 107 - .../src/commonMain/kotlin/JumpFlood.kt | 190 -- .../src/commonMain/kotlin/draw/SDFDraw.kt | 38 - .../src/commonMain/kotlin/fx/InnerBevel.kt | 67 - .../src/commonMain/kotlin/fx/InnerGlow.kt | 80 - .../src/commonMain/kotlin/fx/Inpaint.kt | 74 - .../src/commonMain/kotlin/fx/OuterGlow.kt | 81 - .../src/commonMain/kotlin/fx/Skeleton.kt | 90 - .../commonMain/kotlin/fx/StraightSkeleton.kt | 92 - .../src/commonMain/kotlin/ops/SDFOps.kt | 104 - .../jvmDemo/kotlin/DemoDirectionField01.kt | 82 - .../jvmDemo/kotlin/DemoDirectionField02.kt | 55 - .../src/jvmDemo/kotlin/DemoDistanceField01.kt | 90 - .../src/jvmDemo/kotlin/DemoInnerGlow01.kt | 39 - .../src/jvmDemo/kotlin/DemoInnerGlow02.kt | 39 - .../src/jvmDemo/kotlin/DemoShapeSDF01.kt | 31 - .../src/jvmDemo/kotlin/DemoShapeSDF02.kt | 60 - .../src/jvmDemo/kotlin/DemoShapeSDF03.kt | 52 - .../src/jvmDemo/kotlin/DemoShapeSDF04.kt | 59 - .../src/jvmDemo/kotlin/DemoShapeSDF05.kt | 73 - .../src/jvmDemo/kotlin/DemoSkeleton01.kt | 44 - .../jvmDemo/kotlin/DemoStraightSkeleton01.kt | 44 - .../src/jvmDemo/kotlin/DemoVoronoi01.kt | 68 - .../src/jvmDemo/kotlin/DemoVoronoi02.kt | 56 - .../src/jvmDemo/kotlin/DemoVoronoi03.kt | 44 - orx-jumpflood/src/jvmDemo/resources/name.svg | 8 - orx-jumpflood/src/jvmMain/kotlin/ShapeSDF.kt | 90 - .../src/shaders/glsl/alpha-threshold.frag | 9 - .../src/shaders/glsl/contour-points.frag | 20 - .../src/shaders/glsl/encode-points.frag | 14 - .../src/shaders/glsl/encode-subpixel.frag | 122 - .../src/shaders/glsl/id-contours.frag | 25 - .../src/shaders/glsl/inner-bevel.frag | 55 - .../src/shaders/glsl/inner-glow.frag | 37 - orx-jumpflood/src/shaders/glsl/inpaint.frag | 47 - orx-jumpflood/src/shaders/glsl/jumpflood.frag | 38 - .../src/shaders/glsl/outer-glow.frag | 29 - .../src/shaders/glsl/pixel-direction.frag | 67 - .../src/shaders/glsl/pixel-distance.frag | 37 - orx-jumpflood/src/shaders/glsl/sdf-blend.frag | 13 - orx-jumpflood/src/shaders/glsl/sdf-onion.frag | 10 - orx-jumpflood/src/shaders/glsl/sdf-round.frag | 10 - .../shaders/glsl/sdf-smooth-difference.frag | 17 - .../shaders/glsl/sdf-smooth-intersection.frag | 17 - .../src/shaders/glsl/sdf-smooth-union.frag | 17 - .../src/shaders/glsl/sdf-stroke-fill.frag | 22 - orx-jumpflood/src/shaders/glsl/shape-sdf.frag | 109 - orx-jumpflood/src/shaders/glsl/skeleton.frag | 42 - .../src/shaders/glsl/straight-skeleton.frag | 46 - orx-jumpflood/src/shaders/glsl/threshold.frag | 9 - orx-jvm/build.gradle.kts | 3 - orx-jvm/orx-axidraw/README.md | 66 - orx-jvm/orx-axidraw/build.gradle.kts | 18 - .../src/demo/kotlin/DemoAxidraw01.kt | 59 - .../src/demo/kotlin/DemoAxidraw02.kt | 45 - .../src/demo/kotlin/DemoAxidraw03.kt | 44 - .../src/demo/kotlin/DemoAxidraw04.kt | 48 - .../src/demo/kotlin/DemoAxidraw05.kt | 46 - .../orx-axidraw/src/main/kotlin/Axidraw.kt | 506 --- orx-jvm/orx-axidraw/src/main/kotlin/SVG.kt | 122 - orx-jvm/orx-axidraw/src/main/kotlin/python.kt | 71 - orx-jvm/orx-boofcv/README.md | 80 - orx-jvm/orx-boofcv/build.gradle.kts | 10 - .../src/demo/kotlin/DemoContours01.kt | 79 - .../src/demo/kotlin/DemoResize01.kt | 35 - .../src/demo/kotlin/DemoResize02.kt | 34 - .../src/demo/kotlin/DemoSimplified01.kt | 118 - orx-jvm/orx-boofcv/src/main/kotlin/Binding.kt | 186 -- .../src/main/kotlin/ContourConversion.kt | 51 - .../orx-boofcv/src/main/kotlin/Distortion.kt | 70 - orx-jvm/orx-boofcv/src/main/kotlin/Drawing.kt | 83 - .../src/main/kotlin/ImageFlowConversion.kt | 33 - .../src/main/kotlin/MatrixConversion.kt | 19 - .../src/main/kotlin/PointConversion.kt | 11 - orx-jvm/orx-chataigne/README.md | 49 - orx-jvm/orx-chataigne/build.gradle.kts | 12 - .../timeline_example_chataigne.noisette | 1 - .../src/demo/kotlin/ChataigneOSCDemo.kt | 29 - .../src/main/kotlin/ChataigneOSC.kt | 55 - orx-jvm/orx-crash-handler/README.md | 3 - orx-jvm/orx-crash-handler/build.gradle.kts | 11 - .../src/demo/kotlin/DemoCrashHandler01.kt | 26 - .../src/main/kotlin/CrashHandler.kt | 49 - .../src/main/kotlin/Reporter.kt | 5 - .../src/main/kotlin/SlackReporter.kt | 141 - orx-jvm/orx-depth-camera-calibrator/README.md | 5 - .../build.gradle.kts | 11 - .../src/main/kotlin/DepthCameraCalibrator.kt | 267 -- orx-jvm/orx-dnk3/README.md | 117 - orx-jvm/orx-dnk3/build.gradle.kts | 24 - .../src/demo/kotlin/DemoAnimations01.kt | 54 - .../orx-dnk3/src/demo/kotlin/DemoCamera01.kt | 40 - orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL01.kt | 80 - orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL02.kt | 81 - .../src/demo/kotlin/DemoIrrProbe01.kt | 100 - .../orx-dnk3/src/demo/kotlin/DemoLights01.kt | 45 - .../orx-dnk3/src/demo/kotlin/DemoLights02.kt | 46 - .../orx-dnk3/src/demo/kotlin/DemoLights03.kt | 45 - .../orx-dnk3/src/demo/kotlin/DemoObject01.kt | 40 - .../orx-dnk3/src/demo/kotlin/DemoScene01.kt | 52 - .../orx-dnk3/src/demo/kotlin/DemoScene02.kt | 51 - .../orx-dnk3/src/demo/kotlin/DemoScene03.kt | 53 - .../src/demo/kotlin/DemoSegmentContours01.kt | 44 - .../src/demo/kotlin/DemoSkinning01.kt | 47 - orx-jvm/orx-dnk3/src/main/kotlin/Camera.kt | 47 - orx-jvm/orx-dnk3/src/main/kotlin/Entity.kt | 103 - orx-jvm/orx-dnk3/src/main/kotlin/Facet.kt | 158 - orx-jvm/orx-dnk3/src/main/kotlin/Feature.kt | 13 - orx-jvm/orx-dnk3/src/main/kotlin/Light.kt | 83 - orx-jvm/orx-dnk3/src/main/kotlin/Material.kt | 61 - .../orx-dnk3/src/main/kotlin/PBRMaterial.kt | 731 ----- orx-jvm/orx-dnk3/src/main/kotlin/Post.kt | 62 - .../orx-dnk3/src/main/kotlin/RenderPass.kt | 40 - orx-jvm/orx-dnk3/src/main/kotlin/Scene.kt | 95 - .../orx-dnk3/src/main/kotlin/SceneRenderer.kt | 341 -- .../src/main/kotlin/ShaderUtilities.kt | 237 -- orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt | 99 - .../src/main/kotlin/cubemap/CubemapFilter.kt | 189 -- .../main/kotlin/cubemap/CubemapPassthrough.kt | 6 - .../kotlin/cubemap/IrradianceConvolution.kt | 6 - .../main/kotlin/cubemap/SphericalHarmonics.kt | 187 -- .../src/main/kotlin/dsl/PBRMaterialBuilder.kt | 12 - .../src/main/kotlin/dsl/SceneBuilder.kt | 88 - .../src/main/kotlin/features/IrradianceSH.kt | 112 - .../main/kotlin/features/VoxelConeTracing.kt | 71 - orx-jvm/orx-dnk3/src/main/kotlin/gltf/Glb.kt | 47 - orx-jvm/orx-dnk3/src/main/kotlin/gltf/Gltf.kt | 438 --- .../src/main/kotlin/gltf/GltfScene.kt | 439 --- .../materials/IrradianceDebugMaterial.kt | 71 - .../kotlin/post/ScreenspaceReflections.kt | 36 - .../src/main/kotlin/post/SegmentContours.kt | 8 - .../main/kotlin/post/VolumetricIrradiance.kt | 47 - .../orx-dnk3/src/main/kotlin/query/Query.kt | 56 - .../src/main/kotlin/renderers/DryRenderer.kt | 8 - .../src/main/kotlin/renderers/PostRenderer.kt | 18 - .../renderers/SegmentContourRenderer.kt | 34 - .../src/main/kotlin/tools/MeshCollapse.kt | 98 - .../orx-dnk3/src/main/kotlin/tools/Skybox.kt | 84 - .../phrases/irradiance-sh/evaluate-sh.frag | 17 - .../phrases/irradiance-sh/fetch-sh.frag | 12 - .../phrases/irradiance-sh/fetch-sh0.frag | 4 - .../phrases/irradiance-sh/gather-sh.frag | 26 - .../phrases/irradiance-sh/gather-sh0.frag | 25 - .../irradiance-sh/grid-coordinates.frag | 15 - .../phrases/irradiance-sh/grid-index.frag | 4 - .../cubemap-filters/cubemap-passthrough.frag | 22 - .../irradiance-convolution.frag | 40 - .../cubemap-filters/spherical-harmonics.frag | 11 - .../shaders/screenspace-reflections.frag | 349 --- .../shaders/segment-contours-msaa-8.frag | 34 - .../resources/shaders/segment-contours.frag | 31 - .../shaders/volumetric-irradiance.frag | 57 - orx-jvm/orx-file-watcher/README.md | 37 - orx-jvm/orx-file-watcher/build.gradle.kts | 9 - .../src/main/kotlin/FileWatcher.kt | 127 - .../src/main/kotlin/FileWatcherDelegate.kt | 61 - orx-jvm/orx-git-archiver-gradle/README.md | 9 - .../orx-git-archiver-gradle/build.gradle.kts | 60 - .../src/main/kotlin/GitArchiveToMarkdown.kt | 59 - orx-jvm/orx-git-archiver/README.md | 22 - orx-jvm/orx-git-archiver/build.gradle.kts | 13 - .../src/demo/kotlin/GitArchiverDemo01.kt | 19 - .../src/main/kotlin/GitArchiver.kt | 67 - .../src/main/kotlin/JavaGit.kt | 34 - .../src/main/kotlin/NativeGit.kt | 62 - orx-jvm/orx-gui/README.md | 294 -- orx-jvm/orx-gui/build.gradle.kts | 18 - .../src/demo/kotlin/DemoAppearance01.kt | 52 - orx-jvm/orx-gui/src/demo/kotlin/DemoHide01.kt | 48 - .../src/demo/kotlin/DemoMultiWindow01.kt | 32 - .../src/demo/kotlin/DemoMultiWindow02.kt | 29 - .../orx-gui/src/demo/kotlin/DemoOptions01.kt | 45 - .../orx-gui/src/demo/kotlin/DemoOptions02.kt | 43 - orx-jvm/orx-gui/src/demo/kotlin/DemoPath01.kt | 38 - .../orx-gui/src/demo/kotlin/DemoPresets01.kt | 72 - .../src/demo/kotlin/DemoSideCanvas01.kt | 53 - .../orx-gui/src/demo/kotlin/DemoSimple01.kt | 53 - .../src/demo/kotlin/DemoXYParameter.kt | 41 - orx-jvm/orx-gui/src/main/kotlin/Gui.kt | 1226 -------- .../orx-gui/src/main/kotlin/WindowedGUI.kt | 78 - orx-jvm/orx-keyframer/README.md | 238 -- orx-jvm/orx-keyframer/build.gradle.kts | 14 - .../src/demo/kotlin/DemoEvelope01.kt | 18 - .../src/demo/kotlin/DemoFull01.kt | 22 - .../src/demo/kotlin/DemoScrub01.kt | 46 - .../src/demo/kotlin/DemoSimple01.kt | 18 - .../src/demo/kotlin/DemoSimple02.kt | 21 - .../demo/kotlin/DemoSimpleExpressions01.kt | 21 - .../src/demo/resources/demo-envelope-01.json | 25 - .../src/demo/resources/demo-full-01.json | 74 - .../src/demo/resources/demo-simple-01.json | 20 - .../src/demo/resources/demo-simple-02.json | 32 - .../resources/demo-simple-expressions-01.json | 30 - orx-jvm/orx-keyframer/src/main/kotlin/Key.kt | 75 - .../src/main/kotlin/KeyQuaternion.kt | 60 - .../src/main/kotlin/KeyVector3.kt | 58 - .../src/main/kotlin/Keyframer.kt | 468 --- .../src/test/kotlin/TestKeyframerChannel.kt | 37 - .../src/test/kotlin/TestKeyframerErrors.kt | 100 - .../resources/error-reporting/easing.json | 5 - .../resources/error-reporting/time-01.json | 5 - .../resources/error-reporting/time-02.json | 5 - .../resources/error-reporting/value-01.json | 7 - orx-jvm/orx-kinect-common/build.gradle.kts | 8 - .../src/main/kotlin/Kinect.kt | 140 - .../extra/kinect/depth-to-raw-normalized.frag | 19 - orx-jvm/orx-kinect-v1-demo/build.gradle.kts | 14 - .../main/kotlin/Kinect1Demo01BasicUseCase.kt | 26 - .../Kinect1Demo02MotionCaptureUseCase.kt | 111 - .../kotlin/Kinect1Demo03DepthToColorMaps.kt | 93 - .../main/kotlin/Kinect1Demo04SwitchOffLed.kt | 31 - .../kotlin/Kinect1Demo05MultipleDevices.kt | 32 - .../Kinect1Demo07NativeFreenectCommands.kt | 44 - .../main/kotlin/Kinect1Demo08LogLevelFlood.kt | 30 - .../kotlin/Kinect1Demo09RawDepthProcessing.kt | 49 - .../Kinect1Demo10DepthCameraCalibration.kt | 117 - .../src/main/resources/logback.xml | 13 - orx-jvm/orx-kinect-v1/README.md | 25 - orx-jvm/orx-kinect-v1/build.gradle.kts | 32 - .../orx-kinect-v1/src/main/kotlin/Kinect1.kt | 571 ---- .../kinect/v1/kinect1-depth-to-meters.frag | 23 - orx-jvm/orx-kotlin-parser/build.gradle.kts | 21 - .../src/main/antlr/KotlinLexer.g4 | 527 ---- .../src/main/antlr/KotlinParser.g4 | 926 ------ .../src/main/antlr/README.md | 1 - .../src/main/antlr/UnicodeClasses.g4 | 1649 ---------- .../src/main/kotlin/ExtractProgram.kt | 77 - .../src/main/kotlin/TreeUtils.kt | 49 - orx-jvm/orx-midi/README.md | 31 - orx-jvm/orx-midi/build.gradle.kts | 15 - .../src/demo/kotlin/DemoMidiBinding01.kt | 39 - .../src/demo/kotlin/DemoMidiConsole01.kt | 17 - .../orx-midi/src/main/kotlin/MidiBindings.kt | 381 --- .../orx-midi/src/main/kotlin/MidiConsole.kt | 77 - orx-jvm/orx-midi/src/main/kotlin/MidiEvent.kt | 120 - .../src/main/kotlin/MidiTransceiver.kt | 305 -- orx-jvm/orx-midi/src/test/kotlin/MidiTests.kt | 20 - .../src/test/kotlin/MidiTransceiverTest.kt | 118 - orx-jvm/orx-minim/README.md | 20 - orx-jvm/orx-minim/build.gradle.kts | 15 - .../src/demo/kotlin/DemoAdditive01.kt | 108 - .../orx-minim/src/demo/kotlin/DemoFFT01.kt | 35 - .../src/demo/kotlin/DemoPlaySound01.kt | 26 - orx-jvm/orx-minim/src/main/kotlin/Minim.kt | 21 - orx-jvm/orx-olive/README.md | 154 - orx-jvm/orx-olive/build.gradle.kts | 25 - .../orx-olive/src/demo/kotlin/DemoOlive01.kt | 44 - .../src/demo/kotlin/DemoOliveFromScript01.kt | 37 - .../src/demo/kotlin/DemoWindowedGUI01.kt | 60 - .../src/demo/kotlin/demo-olive-01.kts | 14 - orx-jvm/orx-olive/src/main/kotlin/Olive.kt | 213 -- .../orx-olive/src/main/kotlin/OliveProgram.kt | 57 - .../orx-olive/src/main/kotlin/Reloadable.kt | 57 - .../orx-olive/src/main/kotlin/Resources.kt | 29 - .../src/main/kotlin/ScriptGenerator.kt | 20 - .../main/kotlin/ScriptObjectLoaderJSR233.kt | 78 - .../src/main/kotlin/ScriptObjectLoaderKSH.kt | 49 - .../src/test/kotlin/TestLoadScript.kt | 16 - .../src/test/kotlin/TestLoadScriptKSH.kt | 14 - orx-jvm/orx-osc/README.md | 26 - orx-jvm/orx-osc/build.gradle.kts | 10 - orx-jvm/orx-osc/src/main/kotlin/OSC.kt | 83 - orx-jvm/orx-panel/README.md | 45 - orx-jvm/orx-panel/build.gradle.kts | 22 - .../demo/kotlin/DemoColorPickerButton01.kt | 33 - .../src/demo/kotlin/DemoHorizontalLayout01.kt | 77 - .../src/demo/kotlin/DemoVerticalLayout01.kt | 40 - .../src/demo/kotlin/DemoWatchDiv01.kt | 123 - .../src/demo/kotlin/DemoWatchObjectDiv01.kt | 68 - .../org/openrndr/panel/ControlManager.kt | 603 ---- .../kotlin/org/openrndr/panel/FontManager.kt | 27 - .../ObservableCopyOnWriteArrayList.kt | 31 - .../panel/collections/ObservableHashSet.kt | 36 - .../org/openrndr/panel/elements/Body.kt | 5 - .../org/openrndr/panel/elements/Button.kt | 108 - .../org/openrndr/panel/elements/Canvas.kt | 43 - .../openrndr/panel/elements/Colorpicker.kt | 172 - .../panel/elements/ColorpickerButton.kt | 156 - .../kotlin/org/openrndr/panel/elements/Div.kt | 43 - .../openrndr/panel/elements/DropdownButton.kt | 287 -- .../org/openrndr/panel/elements/Element.kt | 376 --- .../openrndr/panel/elements/EnvelopeButton.kt | 141 - .../openrndr/panel/elements/EnvelopeEditor.kt | 229 -- .../openrndr/panel/elements/LayoutBuilder.kt | 248 -- .../openrndr/panel/elements/SequenceEditor.kt | 213 -- .../org/openrndr/panel/elements/Slider.kt | 359 --- .../openrndr/panel/elements/SlidersVector.kt | 192 -- .../openrndr/panel/elements/TextElements.kt | 106 - .../org/openrndr/panel/elements/Textfield.kt | 167 - .../org/openrndr/panel/elements/Toggle.kt | 134 - .../openrndr/panel/elements/WatchListDiv.kt | 71 - .../openrndr/panel/elements/WatchObjectDiv.kt | 75 - .../panel/elements/WatchPropertyDiv.kt | 74 - .../org/openrndr/panel/elements/XYPad.kt | 264 -- .../org/openrndr/panel/hash/WatchHash.kt | 20 - .../org/openrndr/panel/layout/Layouter.kt | 281 -- .../org/openrndr/panel/style/DefaultStyles.kt | 210 -- .../org/openrndr/panel/style/Matcher.kt | 57 - .../org/openrndr/panel/style/Selector.kt | 145 - .../org/openrndr/panel/style/StyleSheet.kt | 245 -- .../org/openrndr/panel/tools/Tooltip.kt | 56 - .../main/resources/fonts/Roboto-Medium.ttf | Bin 162588 -> 0 bytes .../main/resources/fonts/Roboto-Regular.ttf | Bin 162876 -> 0 bytes .../panel/test/SelectorBuilderTest.kt | 57 - .../org/openrndr/panel/test/StyleSheetTest.kt | 18 - .../openrndr/panel/test/TestPlaceholder.kt | 10 - orx-jvm/orx-poisson-fill/README.md | 21 - orx-jvm/orx-poisson-fill/build.gradle.kts | 12 - .../src/demo/kotlin/DemoPoissonFill01.kt | 84 - .../src/demo/kotlin/DemoPoissonFill02.kt | 27 - .../src/main/kotlin/ConvolutionPyramid.kt | 140 - .../src/main/kotlin/LaplacianIntegrator.kt | 46 - .../src/main/kotlin/PoissonBlender.kt | 119 - .../src/main/kotlin/PoissonFiller.kt | 65 - .../shaders/gl3/poisson/alpha-to-bitmap.frag | 11 - .../shaders/gl3/poisson/blend-boundary.frag | 37 - .../shaders/gl3/poisson/blend-combine.frag | 46 - .../resources/shaders/gl3/poisson/clamp.frag | 25 - .../shaders/gl3/poisson/downscale.frag | 48 - .../shaders/gl3/poisson/fill-boundary.frag | 61 - .../shaders/gl3/poisson/fill-combine.frag | 21 - .../resources/shaders/gl3/poisson/filter.frag | 39 - .../shaders/gl3/poisson/laplacian.frag | 52 - .../gl3/poisson/passthrough-noalpha.frag | 20 - .../shaders/gl3/poisson/remove-alpha.frag | 18 - .../shaders/gl3/poisson/upscale.frag | 58 - orx-jvm/orx-processing/README.md | 30 - orx-jvm/orx-processing/build.gradle.kts | 15 - .../src/demo/kotlin/DemoPShape01.kt | 14 - .../src/demo/kotlin/DemoPShape02.kt | 26 - .../src/main/kotlin/PShapeExtensions.kt | 276 -- .../src/main/kotlin/PVectorExtensions.kt | 66 - orx-jvm/orx-rabbit-control/.gitignore | 1 - orx-jvm/orx-rabbit-control/README.md | 82 - orx-jvm/orx-rabbit-control/build.gradle.kts | 17 - .../src/demo/kotlin/DemoRabbitControl.kt | 72 - .../kotlin/DemoRabbitControlManualOverlay.kt | 51 - .../src/demo/kotlin/DemoRabbitHole.kt | 69 - .../src/main/kotlin/RabbitControlServer.kt | 288 -- .../rabbit-client/asset-manifest.json | 16 - .../main/resources/rabbit-client/favicon.ico | Bin 16958 -> 0 bytes .../main/resources/rabbit-client/index.html | 1 - .../resources/rabbit-client/manifest.json | 15 - ...nifest.8b50f7152eba97a8a3a748d36319a411.js | 50 - .../resources/rabbit-client/service-worker.js | 34 - .../static/css/1.a970d4a6.chunk.css | 2 - .../static/css/1.a970d4a6.chunk.css.map | 1 - .../static/css/main.6b57d6a6.chunk.css | 2 - .../static/css/main.6b57d6a6.chunk.css.map | 1 - .../static/js/1.ab137fd1.chunk.js | 2 - .../static/js/1.ab137fd1.chunk.js.map | 1 - .../static/js/main.3c08e7ef.chunk.js | 2 - .../static/js/main.3c08e7ef.chunk.js.map | 1 - .../static/js/runtime~main.4a686d48.js | 2 - .../static/js/runtime~main.4a686d48.js.map | 1 - .../static/media/icons-16.05f1cdad.eot | Bin 99032 -> 0 bytes .../static/media/icons-16.3c1c220e.woff | Bin 98904 -> 0 bytes .../static/media/icons-16.3cde8748.ttf | Bin 98828 -> 0 bytes .../static/media/icons-20.0a5c7651.eot | Bin 101708 -> 0 bytes .../static/media/icons-20.51ec31f3.ttf | Bin 101504 -> 0 bytes .../static/media/icons-20.cef8cdbb.woff | Bin 101580 -> 0 bytes orx-jvm/orx-realsense2/build.gradle.kts | 31 - .../src/demo/kotlin/DemoRS201.kt | 32 - .../src/demo/kotlin/DemoRS202.kt | 43 - .../src/demo/kotlin/DemoUnproject01.kt | 7 - .../src/main/kotlin/RS2Sensor.kt | 275 -- orx-jvm/orx-syphon/README.md | 98 - orx-jvm/orx-syphon/build.gradle.kts | 8 - orx-jvm/orx-syphon/preview.gif | Bin 760457 -> 0 bytes .../kotlin/ClientExampleSpecificServer.kt | 25 - .../src/demo/kotlin/DemoClient01.kt | 23 - .../src/demo/kotlin/DemoServer01.kt | 27 - .../src/demo/kotlin/DemoServer02.kt | 44 - .../src/main/kotlin/SyphonClient.kt | 67 - .../src/main/kotlin/SyphonServer.kt | 75 - .../src/main/kotlin/jsyphon/JSyphonClient.kt | 49 - .../src/main/kotlin/jsyphon/JSyphonImage.kt | 15 - .../src/main/kotlin/jsyphon/JSyphonNative.kt | 44 - .../src/main/kotlin/jsyphon/JSyphonServer.kt | 143 - .../main/kotlin/jsyphon/JSyphonServerList.kt | 13 - .../src/main/kotlin/jsyphon/Util.kt | 10 - .../resources/jsyphon-natives/Syphon-arm64 | Bin 281488 -> 0 bytes .../main/resources/jsyphon-natives/Syphon-x86 | Bin 184672 -> 0 bytes .../jsyphon-natives/libJSyphon-arm64.jnilib | Bin 98880 -> 0 bytes .../jsyphon-natives/libJSyphon-x86.jnilib | Bin 74112 -> 0 bytes orx-jvm/orx-video-profiles/README.md | 152 - orx-jvm/orx-video-profiles/build.gradle.kts | 8 - .../src/demo/kotlin/DemoGIF01.kt | 15 - .../src/demo/kotlin/DemoProres01.kt | 15 - .../src/demo/kotlin/DemoTIFF01.kt | 19 - .../src/main/kotlin/GIFProfile.kt | 20 - .../src/main/kotlin/H265Profile.kt | 76 - .../src/main/kotlin/PNGProfile.kt | 26 - .../src/main/kotlin/ProresProfile.kt | 35 - .../src/main/kotlin/TIFFProfile.kt | 25 - .../src/main/kotlin/WebpProfile.kt | 22 - orx-kdtree/README.md | 57 - orx-kdtree/build.gradle.kts | 23 - .../commonMain/kotlin/IterableExtensions.kt | 51 - orx-kdtree/src/commonMain/kotlin/KDTree.kt | 414 --- orx-kdtree/src/commonMain/kotlin/Mappers.kt | 67 - .../src/commonMain/kotlin/QuickSelect.kt | 48 - orx-kdtree/src/jsMain/kotlin/KDTree.kt | 71 - .../jvmDemo/kotlin/DemoKNearestNeighbour01.kt | 42 - .../jvmDemo/kotlin/DemoNearestNeighbour01.kt | 35 - .../src/jvmDemo/kotlin/DemoRangeQuery01.kt | 47 - orx-kdtree/src/jvmMain/kotlin/KDTree.kt | 80 - orx-marching-squares/README.md | 87 - orx-marching-squares/build.gradle.kts | 24 - .../src/commonMain/kotlin/MarchingSquares.kt | 160 - .../src/jvmDemo/kotlin/FindContours01.kt | 37 - .../src/jvmDemo/kotlin/FindContours02.kt | 33 - .../src/jvmDemo/kotlin/FindContours03.kt | 35 - .../src/jvmDemo/kotlin/FindContours04.kt | 48 - orx-math/README.md | 153 - orx-math/build.gradle.kts | 44 - orx-math/src/commonMain/kotlin/Math.kt | 3 - .../src/commonMain/kotlin/complex/Complex.kt | 444 --- .../kotlin/linearrange/LinearRange.kt | 175 -- .../src/commonMain/kotlin/matrix/Matrix.kt | 188 -- .../kotlin/matrix/MatrixCholesky.kt | 132 - .../commonMain/kotlin/matrix/SparseMatrix.kt | 757 ----- .../kotlin/matrix/SparseMatrixQR.kt | 148 - .../commonMain/kotlin/rbf/RbfInterpolator.kt | 138 - .../kotlin/simplexrange/SimplexRange.kt | 155 - .../kotlin/complex/ComplexAcoshTest.kt | 59 - .../kotlin/complex/ComplexAsinTest.kt | 49 - .../kotlin/complex/ComplexAsinhTest.kt | 61 - .../kotlin/complex/ComplexAtanhTest.kt | 74 - .../kotlin/complex/ComplexCoshTest.kt | 51 - .../kotlin/complex/ComplexLogTest.kt | 95 - .../kotlin/complex/ComplexSinhTest.kt | 51 - .../kotlin/complex/ComplexTanhTest.kt | 71 - .../commonTest/kotlin/complex/TestComplex.kt | 97 - .../kotlin/linearrange/TestLinearRange.kt | 54 - .../kotlin/matrix/SparseMatrixQRTest.kt | 123 - .../kotlin/matrix/SparseMatrixTest.kt | 270 -- .../kotlin/linearrange/DemoLinearRange02.kt | 58 - .../kotlin/linearrange/DemoLinearRange03.kt | 51 - .../kotlin/matrix/DemoLeastSquares01.kt | 65 - .../kotlin/matrix/DemoLeastSquares02.kt | 90 - .../jvmDemo/kotlin/rbf/RbfInterpolation01.kt | 131 - .../jvmDemo/kotlin/rbf/RbfInterpolation02.kt | 125 - .../simplexrange/DemoSimplexRange3D01.kt | 58 - orx-mesh-generators/README.md | 326 -- orx-mesh-generators/build.gradle.kts | 28 - .../src/commonMain/kotlin/Box.kt | 114 - .../src/commonMain/kotlin/Cap.kt | 175 -- .../src/commonMain/kotlin/Cylinder.kt | 141 - .../src/commonMain/kotlin/Dodecahedron.kt | 102 - .../src/commonMain/kotlin/Extrusion.kt | 359 --- .../src/commonMain/kotlin/ExtrusionMorphed.kt | 112 - .../src/commonMain/kotlin/ExtrusionScaled.kt | 117 - .../src/commonMain/kotlin/Helpers.kt | 112 - .../src/commonMain/kotlin/MeshGenerators.kt | 276 -- .../src/commonMain/kotlin/Plane.kt | 137 - .../src/commonMain/kotlin/Segment.kt | 108 - .../src/commonMain/kotlin/Sphere.kt | 127 - .../commonMain/kotlin/TriangleMeshBuilder.kt | 647 ---- .../src/commonMain/kotlin/decal/Decal.kt | 201 -- .../src/commonMain/kotlin/mesh/Box.kt | 72 - .../kotlin/normals/MeshDataNormals.kt | 63 - .../kotlin/tangents/MeshDataTangents.kt | 94 - .../src/jvmDemo/kotlin/DemoAll.kt | 82 - .../src/jvmDemo/kotlin/DemoBox.kt | 60 - .../src/jvmDemo/kotlin/DemoComplex01.kt | 55 - .../src/jvmDemo/kotlin/DemoComplex02.kt | 68 - .../src/jvmDemo/kotlin/DemoComplex03.kt | 95 - .../src/jvmDemo/kotlin/DemoComplex04.kt | 109 - .../src/jvmDemo/kotlin/DemoComplex05.kt | 52 - .../src/jvmDemo/kotlin/DemoComplex06.kt | 63 - .../src/jvmDemo/kotlin/DemoExtrude01.kt | 75 - .../src/jvmDemo/kotlin/DemoExtrude02.kt | 82 - .../src/jvmDemo/kotlin/DemoExtrude03.kt | 103 - .../src/jvmDemo/kotlin/DemoExtrude04.kt | 92 - .../src/jvmDemo/kotlin/DemoExtrude05.kt | 95 - .../src/jvmDemo/kotlin/DemoExtrude06.kt | 132 - .../src/jvmDemo/kotlin/decal/DemoDecal01.kt | 54 - .../src/jvmDemo/kotlin/decal/DemoDecal02.kt | 85 - .../jvmDemo/kotlin/tangents/DemoTangents01.kt | 51 - orx-mesh-noise/README.md | 66 - orx-mesh-noise/build.gradle.kts | 29 - .../src/commonMain/kotlin/Barycentric.kt | 64 - .../kotlin/IIndexedPolygonExtensions.kt | 24 - .../commonMain/kotlin/IMeshDataExtensions.kt | 273 -- .../src/commonMain/kotlin/WeightFunction.kt | 26 - .../src/jvmDemo/kotlin/DemoMeshNoise01.kt | 54 - .../src/jvmDemo/kotlin/DemoMeshNoise02.kt | 41 - .../src/jvmDemo/kotlin/DemoMeshNoise03.kt | 57 - .../kotlin/DemoNonUniformMeshNoise01.kt | 68 - orx-mesh/build.gradle.kts | 27 - .../src/commonMain/kotlin/CompoundMeshData.kt | 72 - .../kotlin/CompoundMeshDataExtensions.kt | 47 - .../src/commonMain/kotlin/IndexedPolygon.kt | 333 -- .../kotlin/IndexedPolygonExtensions.kt | 93 - orx-mesh/src/commonMain/kotlin/MeshData.kt | 244 -- .../commonMain/kotlin/MeshDataExtensions.kt | 287 -- orx-mesh/src/commonMain/kotlin/Point.kt | 47 - orx-mesh/src/commonMain/kotlin/Polygon.kt | 183 -- orx-mesh/src/commonMain/kotlin/VertexData.kt | 180 -- .../commonMain/kotlin/VertexDataExtensions.kt | 85 - orx-mesh/src/commonMain/kotlin/Wireframe.kt | 32 - .../jvmMain/kotlin/VertexBufferExtensions.kt | 61 - orx-module-catalog/build.gradle.kts | 146 - orx-no-clear/README.md | 66 - orx-no-clear/build.gradle.kts | 17 - orx-no-clear/src/commonMain/kotlin/NoClear.kt | 66 - .../src/jvmDemo/kotlin/DemoNoClear.kt | 77 - orx-noise/README.md | 558 ---- orx-noise/build.gradle.kts | 46 - orx-noise/src/commonMain/kotlin/Cell.kt | 92 - .../src/commonMain/kotlin/CubicNoise1D.kt | 14 - .../src/commonMain/kotlin/CubicNoise2D.kt | 45 - .../src/commonMain/kotlin/CubicNoise3D.kt | 66 - orx-noise/src/commonMain/kotlin/Distribute.kt | 27 - orx-noise/src/commonMain/kotlin/Fractal.kt | 786 ----- orx-noise/src/commonMain/kotlin/Functions.kt | 469 --- .../src/commonMain/kotlin/GaussianRandom.kt | 81 - orx-noise/src/commonMain/kotlin/GradCoord.kt | 132 - orx-noise/src/commonMain/kotlin/Gradient.kt | 72 - .../src/commonMain/kotlin/GradientPerturb.kt | 195 -- .../src/commonMain/kotlin/Interpolation.kt | 46 - orx-noise/src/commonMain/kotlin/MathUtils.kt | 6 - .../src/commonMain/kotlin/PerlinNoise1D.kt | 11 - .../src/commonMain/kotlin/PerlinNoise2D.kt | 36 - .../src/commonMain/kotlin/PerlinNoise3D.kt | 44 - .../src/commonMain/kotlin/PoissonDisk.kt | 97 - orx-noise/src/commonMain/kotlin/Polar.kt | 66 - orx-noise/src/commonMain/kotlin/Random.kt | 386 --- orx-noise/src/commonMain/kotlin/ShapeNoise.kt | 148 - .../src/commonMain/kotlin/SimplexNoise1D.kt | 3 - .../src/commonMain/kotlin/SimplexNoise2D.kt | 90 - .../src/commonMain/kotlin/SimplexNoise3D.kt | 122 - .../src/commonMain/kotlin/SimplexNoise4D.kt | 154 - orx-noise/src/commonMain/kotlin/UHash.kt | 41 - .../src/commonMain/kotlin/UniformRandom.kt | 453 --- .../src/commonMain/kotlin/ValueNoise1D.kt | 12 - .../src/commonMain/kotlin/ValueNoise2D.kt | 36 - .../src/commonMain/kotlin/ValueNoise3D.kt | 45 - orx-noise/src/commonMain/kotlin/Vector.kt | 19 - .../commonMain/kotlin/filters/CellNoise.kt | 73 - .../commonMain/kotlin/filters/HashNoise.kt | 50 - .../kotlin/filters/SimplexNoise3D.kt | 73 - .../commonMain/kotlin/filters/SpeckleNoise.kt | 57 - .../commonMain/kotlin/filters/ValueNoise.kt | 73 - .../commonMain/kotlin/filters/WorleyNoise.kt | 32 - .../kotlin/hammersley/Hammersley.kt | 75 - .../linearrange/LinearRangeExtensions.kt | 90 - .../src/commonMain/kotlin/phrases/UHash.kt | 125 - .../commonMain/kotlin/primitives/Boolean.kt | 25 - orx-noise/src/commonMain/kotlin/rseq/Rseq.kt | 67 - orx-noise/src/commonMain/kotlin/shapes/Box.kt | 75 - .../src/commonMain/kotlin/shapes/Circle.kt | 33 - .../src/commonMain/kotlin/shapes/Rectangle.kt | 64 - .../src/commonMain/kotlin/shapes/Triangle.kt | 86 - .../kotlin/simplexrange/ListExtensions.kt | 48 - .../simplexrange/SimplexRangeExtensions.kt | 110 - orx-noise/src/demo/kotlin/DemoShapeNoise.kt | 59 - .../src/jvmDemo/kotlin/DemoCubicNoise2D01.kt | 28 - .../kotlin/DemoFunctionalComposition01.kt | 36 - .../jvmDemo/kotlin/DemoGradientPerturb2D.kt | 41 - .../jvmDemo/kotlin/DemoGradientPerturb3D.kt | 41 - orx-noise/src/jvmDemo/kotlin/DemoScatter01.kt | 41 - orx-noise/src/jvmDemo/kotlin/DemoSimplex01.kt | 42 - .../src/jvmDemo/kotlin/DemoTriangleNoise01.kt | 36 - .../src/jvmDemo/kotlin/DemoValueNoise2D01.kt | 30 - .../src/jvmDemo/kotlin/glsl/DemoNoisesGLSL.kt | 72 - .../jvmDemo/kotlin/glsl/DemoNoisesGLSLGui.kt | 38 - .../jvmDemo/kotlin/glsl/DemoSimplexGLSL.kt | 53 - .../kotlin/hammersley/DemoHammersley2D01.kt | 26 - .../kotlin/hammersley/DemoHammersley3D01.kt | 42 - .../kotlin/hammersley/DemoHammersley4D01.kt | 45 - .../jvmDemo/kotlin/hash/DemoCircleHash01.kt | 41 - .../kotlin/hash/DemoRectangleHash01.kt | 35 - .../src/jvmDemo/kotlin/hash/DemoUHash01.kt | 34 - .../kotlin/linearrange/DemoLinearRange01.kt | 34 - .../kotlin/linearrange/DemoLinearRange02.kt | 35 - .../kotlin/phrases/DemoUHashPhrase01.kt | 38 - .../src/jvmDemo/kotlin/rseq/DemoRseq2D01.kt | 24 - .../src/jvmDemo/kotlin/rseq/DemoRseq3D01.kt | 42 - .../src/jvmDemo/kotlin/rseq/DemoRseq4D01.kt | 47 - .../simplexrange/DemoSimplexRange2D01.kt | 61 - .../simplexrange/DemoSimplexRange2D02.kt | 59 - .../simplexrange/DemoSimplexUniform01.kt | 91 - .../simplexrange/DemoSimplexUniform02.kt | 62 - orx-noise/src/jvmTest/kotlin/TestGradient.kt | 31 - orx-noise/src/jvmTest/kotlin/TestMathUtils.kt | 11 - .../src/jvmTest/kotlin/TestPlaceholder.kt | 8 - .../kotlin/TestVectorShortcutFunctions.kt | 93 - orx-noise/src/shaders/glsl/noise/cell.frag | 54 - orx-noise/src/shaders/glsl/noise/hash.frag | 29 - .../src/shaders/glsl/noise/simplex3D.frag | 139 - orx-noise/src/shaders/glsl/noise/speckle.frag | 33 - orx-noise/src/shaders/glsl/noise/value.frag | 52 - orx-noise/src/shaders/glsl/noise/worley.frag | 72 - orx-obj-loader/README.md | 87 - orx-obj-loader/build.gradle.kts | 22 - .../src/commonMain/kotlin/ObjReader.kt | 136 - .../src/commonMain/kotlin/ObjWriter.kt | 77 - .../src/jvmDemo/kotlin/DemoObjCompoundRW01.kt | 37 - .../src/jvmDemo/kotlin/DemoObjLoader01.kt | 41 - .../src/jvmDemo/kotlin/DemoObjSaver01.kt | 29 - .../src/jvmDemo/kotlin/DemoObjSaver02.kt | 42 - .../src/jvmDemo/kotlin/DemoWireframe01.kt | 72 - .../src/jvmMain/kotlin/OBJLoader.kt | 45 - orx-obj-loader/src/jvmMain/kotlin/OBJSaver.kt | 100 - orx-obj-loader/test-data/non-planar.obj | 240 -- orx-palette/README.md | 125 - orx-palette/build.gradle.kts | 28 - .../src/commonMain/kotlin/ColorBrewer2.kt | 2777 ----------------- .../src/jvmDemo/kotlin/DemoColorBrewer2_01.kt | 22 - .../src/jvmDemo/kotlin/DemoColorBrewer2_02.kt | 41 - .../src/jvmDemo/kotlin/DemoColorBrewer2_03.kt | 38 - .../src/jvmDemo/kotlin/DemoPaletteStudio01.kt | 31 - .../src/jvmDemo/kotlin/DemoPaletteStudio02.kt | 68 - orx-palette/src/jvmMain/kotlin/ColorUtils.kt | 14 - .../src/jvmMain/kotlin/PaletteStudio.kt | 255 -- .../palette/collections/collection-1.json | 602 ---- .../palette/collections/collection-2.json | 695 ----- .../palette/collections/collection-3.json | 702 ----- orx-parameters/README.md | 79 - orx-parameters/build.gradle.kts | 29 - .../src/commonMain/kotlin/Annotations.kt | 254 -- .../src/jsMain/kotlin/description.kt | 9 - .../src/jvmMain/kotlin/Annotations.kt | 164 - .../src/jvmTest/kotlin/TestAnnotations.kt | 144 - .../src/jvmTest/kotlin/TestPlaceholder.kt | 8 - orx-property-watchers/README.md | 21 - orx-property-watchers/build.gradle.kts | 35 - .../kotlin/PropertyWatcherDelegates.kt | 148 - .../jvmDemo/kotlin/DemoImagePathWatcher01.kt | 31 - .../jvmDemo/kotlin/DemoPropertyWatchers01.kt | 20 - .../src/jvmMain/kotlin/ImagePath.kt | 30 - orx-quadtree/README.md | 39 - orx-quadtree/build.gradle.kts | 26 - .../src/commonMain/kotlin/IQuadtree.kt | 53 - .../src/commonMain/kotlin/Quadtree.kt | 269 -- .../src/jvmDemo/kotlin/DemoQuadTree01.kt | 46 - .../src/jvmDemo/kotlin/DemoQuadTree02.kt | 73 - .../src/jvmMain/kotlin/ReadwriteQuadtree.kt | 50 - orx-shade-styles/README.md | 310 -- orx-shade-styles/build.gradle.kts | 33 - .../src/commonMain/kotlin/AngularGradient.kt | 75 - .../src/commonMain/kotlin/ColorspaceHelper.kt | 13 - .../commonMain/kotlin/HalfAngularGradient.kt | 76 - .../src/commonMain/kotlin/LinearGradient.kt | 122 - .../src/commonMain/kotlin/NPointGradient.kt | 34 - .../commonMain/kotlin/NPointLinearGradient.kt | 86 - .../commonMain/kotlin/NPointRadialGradient.kt | 66 - .../src/commonMain/kotlin/RadialGradient.kt | 117 - .../src/commonMain/kotlin/fills/FillEnums.kt | 45 - .../commonMain/kotlin/fills/clip/ClipBase.kt | 68 - .../kotlin/fills/clip/ClipBuilder.kt | 350 --- .../kotlin/fills/gradients/ConicGradient.kt | 106 - .../fills/gradients/EllipticalGradient.kt | 124 - .../kotlin/fills/gradients/GradientBase.kt | 156 - .../kotlin/fills/gradients/GradientBuilder.kt | 192 -- .../kotlin/fills/gradients/LinearGradient.kt | 74 - .../kotlin/fills/gradients/LumaGradient.kt | 79 - .../kotlin/fills/gradients/RadialGradient.kt | 105 - .../kotlin/fills/gradients/StellarGradient.kt | 110 - .../kotlin/fills/image/ImageFill.kt | 254 -- .../kotlin/fills/noise/NoiseBase.kt | 100 - .../kotlin/fills/noise/NoiseBuilder.kt | 257 -- .../kotlin/fills/patterns/PatternBase.kt | 90 - .../kotlin/fills/patterns/PatternBuilder.kt | 200 -- .../kotlin/spatial/HemisphereLight.kt | 22 - .../kotlin/spatial/VisualizeNormals.kt | 11 - .../src/jvmDemo/kotlin/clip/DemoClip01.kt | 61 - .../src/jvmDemo/kotlin/clip/DemoClip02.kt | 73 - .../src/jvmDemo/kotlin/clip/DemoClip03.kt | 68 - .../jvmDemo/kotlin/composed/DemoComposed01.kt | 52 - .../kotlin/gradients/DemoGradient01.kt | 87 - .../kotlin/gradients/DemoGradient02.kt | 84 - .../kotlin/gradients/DemoGradient03.kt | 40 - .../kotlin/gradients/DemoGradient04.kt | 58 - .../kotlin/gradients/DemoGradient05.kt | 49 - .../kotlin/gradients/DemoGradient06.kt | 52 - .../kotlin/gradients/DemoGradient07.kt | 51 - .../kotlin/gradients/DemoGradient08.kt | 54 - .../kotlin/gradients/DemoGradient09.kt | 58 - .../jvmDemo/kotlin/image/DemoImageFill01.kt | 27 - .../jvmDemo/kotlin/image/DemoImageFill02.kt | 38 - .../jvmDemo/kotlin/image/DemoImageFill03.kt | 32 - .../jvmDemo/kotlin/noise/DemoBlueNoise01.kt | 55 - .../src/jvmDemo/kotlin/noise/DemoSimplex01.kt | 64 - .../jvmDemo/kotlin/noise/DemoWhiteNoise01.kt | 40 - .../jvmDemo/kotlin/patterns/DemoPatterns01.kt | 64 - .../jvmDemo/kotlin/patterns/DemoPatterns02.kt | 38 - .../jvmDemo/kotlin/patterns/DemoPatterns03.kt | 62 - .../kotlin/spatial/DemoHemisphere01.kt | 40 - .../kotlin/spatial/DemoVisualizeNormals01.kt | 39 - orx-shader-phrases/README.md | 71 - orx-shader-phrases/build.gradle.kts | 33 - .../commonMain/kotlin/ShaderPreprocessor.kt | 136 - .../kotlin/noise/HilbertBlueNoisePhrases.kt | 61 - .../commonMain/kotlin/noise/KmhfPhrases.kt | 37 - .../src/commonMain/kotlin/noise/ModPhrases.kt | 21 - .../commonMain/kotlin/noise/PermutePhrases.kt | 29 - .../kotlin/noise/SimplexNoisePhrases.kt | 285 -- .../kotlin/noise/TaylorInvPhrases.kt | 25 - .../commonMain/kotlin/noise/UHashPhrases.kt | 117 - .../src/commonMain/kotlin/rbf/RbfPhrases.kt | 51 - .../src/commonMain/kotlin/sdf/SDFPhrases.kt | 135 - .../kotlin/spacefilling/HilbertPhrases.kt | 156 - .../src/jsMain/kotlin/ShaderPhraseBook.kt | 15 - .../src/jvmMain/kotlin/PhraseResource.kt | 24 - .../src/jvmMain/kotlin/ShaderPhraseBook.kt | 26 - .../kotlin/annotations/ShaderPhrases.kt | 9 - .../src/jvmTest/kotlin/TestFunctionNameRx.kt | 51 - .../src/jvmTest/kotlin/TestPlaceholder.kt | 8 - .../src/jvmTest/kotlin/TestShaderPhrase.kt | 21 - .../jvmTest/kotlin/TestShaderPhraseBook.kt | 26 - .../kotlin/TestShaderPhrasePreprocessing.kt | 41 - .../src/shaders/glsl/phraseHash21.shader | 3 - .../src/shaders/glsl/phraseHash33.shader | 6 - .../phraseProjectionToViewCoordinate.shader | 5 - .../glsl/phraseProjectionToViewDepth.shader | 5 - .../src/shaders/glsl/phraseSimplex31.shader | 22 - .../src/shaders/glsl/phraseTbnMatrix.shader | 5 - .../shaders/glsl/phraseValueNoise21.shader | 14 - .../glsl/phraseViewToProjectionDepth.shader | 5 - .../src/test/resources/from-url-test.frag | 2 - orx-shapes/README.md | 876 ------ orx-shapes/build.gradle.kts | 52 - orx-shapes/src/commonMain/kotlin/Shapes.kt | 1 - .../kotlin/adjust/ContourAdjuster.kt | 303 -- .../kotlin/adjust/ContourAdjusterEdge.kt | 191 -- .../adjust/ContourAdjusterExtensions.kt | 21 - .../kotlin/adjust/ContourAdjusterVertex.kt | 67 - .../commonMain/kotlin/adjust/ContourEdge.kt | 376 --- .../commonMain/kotlin/adjust/ContourVertex.kt | 257 -- .../kotlin/adjust/SegmentAdjustments.kt | 45 - .../kotlin/adjust/extensions/TangentAngle.kt | 19 - .../adjust/extensions/TangentAverage.kt | 22 - .../adjust/extensions/TangentReflection.kt | 39 - .../kotlin/alphashape/AlphaShape.kt | 229 -- .../kotlin/arrangement/Arrangement.kt | 389 --- .../kotlin/bezierpatches/BezierPatch.kt | 313 -- .../kotlin/bezierpatches/BezierPatch3D.kt | 291 -- .../kotlin/bezierpatches/BezierPatchDrawer.kt | 388 --- .../commonMain/kotlin/blend/ContourBlend.kt | 56 - .../commonMain/kotlin/blend/Path3DBlend.kt | 35 - .../blend/RectifiedContourExtensions.kt | 43 - .../kotlin/blend/RectifiedPath3DExtensions.kt | 42 - .../kotlin/blend/SegmentExtensions.kt | 60 - .../kotlin/blend/ShapeContourExtensions.kt | 26 - .../src/commonMain/kotlin/bounds/Bounds.kt | 33 - .../src/commonMain/kotlin/frames/Frames.kt | 84 - .../kotlin/frames/Path3DExtensions.kt | 37 - .../kotlin/hobbycurve/HobbyCurve.kt | 325 -- .../src/commonMain/kotlin/offset/Offset.kt | 268 -- .../kotlin/operators/BulgeContours.kt | 40 - .../kotlin/operators/ChamferCorners.kt | 171 - .../commonMain/kotlin/ordering/Hilbert2d.kt | 26 - .../commonMain/kotlin/ordering/Hilbert3d.kt | 26 - .../kotlin/ordering/ListVector2Extensions.kt | 75 - .../kotlin/ordering/ListVector3Extensions.kt | 92 - .../commonMain/kotlin/ordering/Morton2d.kt | 88 - .../commonMain/kotlin/ordering/Morton3d.kt | 156 - .../kotlin/ordering/MortonToHilbert2d.kt | 29 - .../kotlin/ordering/MortonToHilbert3d.kt | 57 - .../kotlin/path3d/Path3DExtensions.kt | 70 - .../kotlin/phrases/BezierPhraseBook.kt | 88 - .../src/commonMain/kotlin/primitives/Arc.kt | 59 - .../commonMain/kotlin/primitives/BoxGrid.kt | 101 - .../kotlin/primitives/BoxIntersection.kt | 30 - .../commonMain/kotlin/primitives/BoxPlace.kt | 45 - .../commonMain/kotlin/primitives/BoxSub.kt | 21 - .../kotlin/primitives/BoxSubtract.kt | 99 - .../commonMain/kotlin/primitives/Circle.kt | 38 - .../kotlin/primitives/CircleInversion.kt | 202 -- .../kotlin/primitives/CircleTangents.kt | 81 - .../src/commonMain/kotlin/primitives/Net.kt | 82 - .../commonMain/kotlin/primitives/Pulley.kt | 64 - .../kotlin/primitives/RectangleAdjacent.kt | 53 - .../kotlin/primitives/RectangleAlign.kt | 146 - .../kotlin/primitives/RectangleGrid.kt | 353 --- .../primitives/RectangleIntersection.kt | 27 - .../kotlin/primitives/RectanglePlace.kt | 38 - .../kotlin/primitives/RectangleSub.kt | 13 - .../kotlin/primitives/RectangleSubtract.kt | 76 - .../kotlin/primitives/RectangleTake.kt | 55 - .../kotlin/primitives/RegularPolygon.kt | 115 - .../kotlin/primitives/RegularStar.kt | 83 - .../kotlin/primitives/RoundedRectangle.kt | 69 - .../src/commonMain/kotlin/primitives/Tear.kt | 46 - .../kotlin/rectify/Path3DExtensions.kt | 10 - .../kotlin/rectify/RectifiedContour.kt | 55 - .../kotlin/rectify/RectifiedPath.kt | 142 - .../kotlin/rectify/RectifiedPath3D.kt | 28 - .../kotlin/rectify/ShapeContourExtensions.kt | 21 - .../src/commonMain/kotlin/simplify/Chaikin.kt | 93 - .../kotlin/simplify/RamerDouglasPeucker.kt | 45 - .../commonMain/kotlin/splines/CatmullRom.kt | 348 --- .../src/commonMain/kotlin/text/TextShapes.kt | 47 - .../src/commonMain/kotlin/tunni/README.md | 10 - .../src/commonMain/kotlin/tunni/Tunni.kt | 73 - .../tunni/TunniContourEdgeExtensions.kt | 61 - .../kotlin/utilities/FromContours.kt | 34 - .../commonMain/kotlin/utilities/FromPaths.kt | 34 - .../kotlin/utilities/InsertPoint.kt | 35 - .../commonMain/kotlin/utilities/SplitAt.kt | 112 - .../kotlin/utilities/WeldAscending.kt | 26 - .../src/commonTest/kotlin/TestCircleInvert.kt | 81 - .../kotlin/TestCircleInvertConformal.kt | 83 - .../src/commonTest/kotlin/TestHobbyCurve.kt | 19 - .../commonTest/kotlin/TestRectifiedContour.kt | 28 - .../kotlin/adjust/DemoAdjustContour01.kt | 41 - .../kotlin/adjust/DemoAdjustContour02.kt | 34 - .../kotlin/adjust/DemoAdjustContour03.kt | 54 - .../kotlin/adjust/DemoAdjustContour04.kt | 38 - .../kotlin/adjust/DemoAdjustContour05.kt | 47 - .../kotlin/adjust/DemoAdjustContour06.kt | 57 - .../kotlin/adjust/DemoAdjustContour07.kt | 49 - .../kotlin/adjust/DemoAdjustContour08.kt | 60 - .../kotlin/adjust/DemoAdjustContour09.kt | 87 - .../adjust/DemoAdjustContourContinue01.kt | 120 - .../kotlin/alphashape/DemoAlphaShape01.kt | 32 - .../kotlin/alphashape/DemoAlphaShape02.kt | 47 - .../kotlin/arrangement/DemoArrangement01.kt | 92 - .../kotlin/arrangement/DemoArrangement02.kt | 109 - .../kotlin/arrangement/DemoArrangement04.kt | 59 - .../kotlin/bezierpatch/DemoBezierPatch01.kt | 54 - .../kotlin/bezierpatch/DemoBezierPatch02.kt | 37 - .../kotlin/bezierpatch/DemoBezierPatch03.kt | 56 - .../kotlin/bezierpatch/DemoBezierPatch04.kt | 44 - .../kotlin/bezierpatch/DemoBezierPatch05.kt | 72 - .../kotlin/bezierpatch/DemoBezierPatch06.kt | 54 - .../bezierpatch/DemoBezierPatchDrawer01.kt | 44 - .../bezierpatch/DemoBezierPatchDrawer02.kt | 78 - .../bezierpatch/DemoBezierPatchDrawer03.kt | 89 - .../bezierpatch/DemoBezierPatchDrawer04.kt | 56 - .../kotlin/bezierpatch/DemoBezierPatches01.kt | 35 - .../kotlin/blend/DemoContourBlend01.kt | 37 - .../kotlin/blend/DemoContourBlend02.kt | 46 - .../src/jvmDemo/kotlin/frames/DemoFrames01.kt | 78 - .../kotlin/hobbycurve/DemoHobbyCurve01.kt | 32 - .../kotlin/hobbycurve/DemoHobbyCurve02.kt | 37 - .../kotlin/hobbycurve/DemoHobbyCurve03.kt | 29 - .../kotlin/hobbycurve/DemoHobbyCurve04.kt | 38 - .../kotlin/hobbycurve/DemoHobbyCurve05.kt | 38 - .../kotlin/hobbycurve/DemoHobbyCurve3D01.kt | 62 - .../kotlin/operators/DemoRoundCorners01.kt | 32 - .../kotlin/operators/DemoRoundCorners02.kt | 40 - .../kotlin/ordering/DemoHilbertOrder01.kt | 34 - .../kotlin/ordering/DemoHilbertOrder02.kt | 36 - .../kotlin/path3d/DemoPath3DProjection.kt | 43 - .../jvmDemo/kotlin/primitives/DemoArc01.kt | 32 - .../primitives/DemoCircleInversion01.kt | 19 - .../primitives/DemoCircleInversion02.kt | 54 - .../primitives/DemoCircleInversion03.kt | 63 - .../jvmDemo/kotlin/primitives/DemoNet01.kt | 42 - .../jvmDemo/kotlin/primitives/DemoPulley01.kt | 31 - .../primitives/DemoRectangleDistribute01.kt | 35 - .../DemoRectangleFitHorizontally.kt | 33 - .../kotlin/primitives/DemoRectangleGrid01.kt | 26 - .../kotlin/primitives/DemoRectangleGrid02.kt | 39 - .../kotlin/primitives/DemoRectangleGrid03.kt | 39 - .../primitives/DemoRectangleIntersection01.kt | 38 - .../primitives/DemoRectangleIrregularGrid.kt | 38 - .../DemoRectangleIrregularGrid02.kt | 47 - .../kotlin/primitives/DemoRectanglePlace01.kt | 38 - .../kotlin/primitives/DemoRegularPolygon.kt | 32 - .../kotlin/primitives/DemoRegularStar01.kt | 24 - .../kotlin/primitives/DemoRegularStar02.kt | 40 - .../kotlin/primitives/DemoRoundedRectangle.kt | 18 - .../jvmDemo/kotlin/primitives/DemoSplit01.kt | 30 - .../jvmDemo/kotlin/primitives/DemoTear01.kt | 29 - .../jvmDemo/kotlin/primitives/DemoTear02.kt | 42 - .../kotlin/rectify/DemoRectifiedContour01.kt | 30 - .../kotlin/rectify/DemoRectifiedContour02.kt | 33 - .../kotlin/rectify/DemoRectifiedContour03.kt | 32 - .../kotlin/rectify/DemoRectifiedContour04.kt | 27 - .../kotlin/rectify/DemoRectifiedPath3D01.kt | 46 - .../src/jvmDemo/kotlin/text/DemoText01.kt | 38 - .../kotlin/tunni/DemoTunniAdjuster01.kt | 29 - .../jvmDemo/kotlin/tunni/DemoTunniPoint01.kt | 31 - orx-shapes/src/jvmTest/kotlin/Assertions.kt | 8 - .../src/jvmTest/kotlin/TestAdjustContour.kt | 123 - .../src/jvmTest/kotlin/TestChamferCorners.kt | 155 - .../src/jvmTest/kotlin/TestRegularPolygon.kt | 45 - .../src/jvmTest/kotlin/TestRegularStar.kt | 45 - .../jvmTest/kotlin/TestRoundedRectangle.kt | 19 - orx-svg/README.md | 23 - orx-svg/build.gradle.kts | 38 - .../src/commonMain/kotlin/CSSColorNames.kt | 153 - orx-svg/src/commonMain/kotlin/SVGConstants.kt | 147 - .../src/commonMain/kotlin/ShapeExtensions.kt | 46 - orx-svg/src/jvmMain/kotlin/SVGElement.kt | 482 --- orx-svg/src/jvmMain/kotlin/SVGLoader.kt | 111 - orx-svg/src/jvmMain/kotlin/SVGParse.kt | 498 --- orx-svg/src/jvmMain/kotlin/SVGWriter.kt | 179 -- orx-temporal-blur/README.md | 58 - orx-temporal-blur/build.gradle.kts | 12 - .../src/demo/kotlin/DemoBasic01.kt | 15 - .../src/demo/kotlin/DemoColorShift01.kt | 32 - .../src/main/kotlin/TemporalBlur.kt | 281 -- orx-text-on-contour/README.md | 17 - orx-text-on-contour/build.gradle.kts | 22 - .../src/commonMain/kotlin/TextOnContour.kt | 271 -- .../src/jvmDemo/kotlin/DemoTextOnContour01.kt | 27 - orx-text-writer/README.md | 63 - orx-text-writer/build.gradle.kts | 23 - .../src/commonMain/kotlin/DrawerExtensions.kt | 16 - .../commonMain/kotlin/ProgramExtensions.kt | 14 - .../src/commonMain/kotlin/TextWriter.kt | 536 ---- .../src/jvmDemo/kotlin/DemoGlyphOutput01.kt | 68 - .../src/jvmDemo/kotlin/DemoTextWriter01.kt | 53 - .../src/jvmDemo/kotlin/DemoTextWriter02.kt | 29 - .../src/jvmDemo/kotlin/DemoTextWriter03.kt | 35 - orx-time-operators/README.md | 72 - orx-time-operators/build.gradle.kts | 9 - .../src/demo/kotlin/DemoEnvelope.kt | 38 - orx-time-operators/src/demo/kotlin/DemoLFO.kt | 36 - .../src/main/kotlin/Envelope.kt | 130 - orx-time-operators/src/main/kotlin/LFO.kt | 65 - .../src/main/kotlin/TimeOperators.kt | 23 - orx-timer/README.md | 80 - orx-timer/build.gradle.kts | 9 - orx-timer/src/demo/kotlin/DemoRepeat01.kt | 18 - orx-timer/src/demo/kotlin/DemoRepeat02.kt | 28 - orx-timer/src/demo/kotlin/DemoRepeat03.kt | 25 - orx-timer/src/demo/kotlin/DemoTimeOut01.kt | 17 - orx-timer/src/main/kotlin/Timer.kt | 23 - orx-triangulation/README.md | 127 - orx-triangulation/build.gradle.kts | 29 - .../src/commonMain/kotlin/Delaunator.kt | 596 ---- .../src/commonMain/kotlin/Delaunay.kt | 232 -- .../kotlin/DelaunayTriangulation.kt | 95 - .../src/commonMain/kotlin/DoubleDouble.kt | 340 -- .../src/commonMain/kotlin/Predicates.kt | 19 - .../src/commonMain/kotlin/SmoothScatter.kt | 120 - .../src/commonMain/kotlin/Voronoi.kt | 622 ---- .../src/commonMain/kotlin/VoronoiDiagram.kt | 93 - .../src/commonTest/kotlin/TestDelaunay.kt | 68 - .../src/commonTest/kotlin/TestVoronoi.kt | 18 - .../commonTest/kotlin/TestVoronoiDiagram.kt | 53 - .../src/jvmDemo/kotlin/DemoDelaunay01.kt | 47 - .../src/jvmDemo/kotlin/DemoDelaunay02.kt | 30 - .../src/jvmDemo/kotlin/DemoVoronoi01.kt | 43 - .../src/jvmDemo/kotlin/DemoVoronoi02.kt | 31 - .../src/jvmDemo/kotlin/DemoVoronoi03.kt | 41 - orx-turtle/README.md | 58 - orx-turtle/build.gradle.kts | 23 - .../src/commonMain/kotlin/NinjaTurtle.kt | 55 - orx-turtle/src/commonMain/kotlin/Turtle.kt | 96 - orx-turtle/src/jvmDemo/kotlin/DemoTurtle01.kt | 38 - orx-turtle/src/jvmDemo/kotlin/DemoTurtle02.kt | 26 - orx-turtle/src/jvmDemo/kotlin/DemoTurtle03.kt | 35 - orx-view-box/README.md | 63 - orx-view-box/build.gradle.kts | 32 - orx-view-box/src/commonMain/kotlin/ViewBox.kt | 303 -- .../src/jvmDemo/kotlin/DemoProxyProgram01.kt | 45 - .../src/jvmDemo/kotlin/DemoProxyProgram02.kt | 64 - .../src/jvmDemo/kotlin/DemoUpdate01.kt | 46 - .../src/jvmDemo/kotlin/DemoViewBox01.kt | 70 - settings.gradle.kts | 97 +- updateChangesTxt | 12 - 1545 files changed, 73 insertions(+), 126436 deletions(-) delete mode 100644 CNAME delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md rename android/src/androidTest/java/com/icegps/{orx => geotools}/ExampleInstrumentedTest.kt (85%) rename android/src/main/java/com/icegps/{orx => geotools}/ContoursManager.kt (97%) rename android/src/main/java/com/icegps/{orx => geotools}/ControllableArrow.kt (98%) rename android/src/main/java/com/icegps/{orx => geotools}/CoordinateGenerator.kt (97%) rename android/src/main/java/com/icegps/{orx => geotools}/DisplaySlopeResult.kt (98%) rename android/src/main/java/com/icegps/{orx => geotools}/EarthworkManager.kt (99%) rename android/src/main/java/com/icegps/{orx => geotools}/GridDisplay.kt (98%) rename android/src/main/java/com/icegps/{orx => geotools}/GridModel.kt (99%) rename android/src/main/java/com/icegps/{orx => geotools}/MainActivity.kt (98%) rename android/src/main/java/com/icegps/{orx => geotools}/MainViewModel.kt (96%) rename android/src/main/java/com/icegps/{orx => geotools}/PolygonTest.kt (98%) rename android/src/main/java/com/icegps/{orx => geotools}/PolylineManager.kt (97%) rename android/src/main/java/com/icegps/{orx => geotools}/RayCastingAlgorithm.kt (97%) rename android/src/main/java/com/icegps/{orx => geotools}/SimplePalette.kt (99%) rename android/src/main/java/com/icegps/{orx => geotools}/catmullrom/CatmullRom.kt (96%) rename android/src/main/java/com/icegps/{orx => geotools}/color/ColorRGBa.kt (99%) rename android/src/main/java/com/icegps/{orx => geotools}/colorbrewer2/ColorBrewer2.kt (99%) rename android/src/main/java/com/icegps/{orx => geotools}/ktx/ColorRGBa.kt (88%) rename android/src/main/java/com/icegps/{orx => geotools}/ktx/Context.kt (88%) rename android/src/main/java/com/icegps/{orx => geotools}/ktx/Vector2D.kt (96%) rename android/src/main/java/com/icegps/{orx => geotools}/ktx/Vector3D.kt (96%) rename android/src/main/java/com/icegps/{orx => geotools}/marchingsquares/MarchingSquares.kt (99%) rename android/src/test/java/com/icegps/{orx => geotools}/ExampleUnitTest.kt (91%) delete mode 100644 build-logic/build.gradle.kts delete mode 100644 build-logic/orx-convention/build.gradle.kts delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/CollectScreenShots.kt delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/EmbedShaders.kt delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/Utils.kt delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/component-metadata-rule.gradle.kts delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/dokka.gradle.kts delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts delete mode 100644 build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/variant.gradle.kts delete mode 100644 build-logic/orx-convention/src/preload/kotlin/ApplicationPreload.kt delete mode 100644 build-logic/orx-variant-plugin/build.gradle.kts delete mode 100644 build-logic/orx-variant-plugin/src/main/kotlin/VariantPlugin.kt delete mode 100644 build-logic/settings.gradle.kts delete mode 100755 build-tools/xvfb-java.sh delete mode 100644 demo-data/.gitignore delete mode 100644 demo-data/cubemaps/garage_iem.dds delete mode 100644 demo-data/fonts/IBMPlexMono-Regular.ttf delete mode 100644 demo-data/gltf-models/box-animated/BoxAnimated.glb delete mode 100644 demo-data/gltf-models/box/Box.glb delete mode 100644 demo-data/gltf-models/camera/Scene.glb delete mode 100644 demo-data/gltf-models/directional-light/Scene.glb delete mode 100644 demo-data/gltf-models/duck/Duck.gltf delete mode 100644 demo-data/gltf-models/duck/Duck0.bin delete mode 100644 demo-data/gltf-models/duck/DuckCM.png delete mode 100644 demo-data/gltf-models/fox/Fox.glb delete mode 100644 demo-data/gltf-models/irradiance-probes/model.glb delete mode 100644 demo-data/gltf-models/point-light/Scene.glb delete mode 100644 demo-data/gltf-models/spot-light/Scene.glb delete mode 100644 demo-data/gltf-models/suzanne/Suzanne.bin delete mode 100644 demo-data/gltf-models/suzanne/Suzanne.gltf delete mode 100644 demo-data/gltf-models/suzanne/Suzanne_BaseColor.png delete mode 100644 demo-data/gltf-models/suzanne/Suzanne_MetallicRoughness.png delete mode 100644 demo-data/images/16-bit.png delete mode 100644 demo-data/images/image-001.dds delete mode 100644 demo-data/images/image-001.png delete mode 100644 demo-data/images/life-cover.jpg delete mode 100644 demo-data/images/peopleCity01.jpg delete mode 100644 demo-data/images/vw-beetle.jpg delete mode 100644 demo-data/obj-models/suzanne/Suzanne.mtl delete mode 100644 demo-data/obj-models/suzanne/Suzanne.obj delete mode 100644 demo-data/sounds/26777__junggle__btn402.mp3 delete mode 100644 demo-data/sounds/26777__junggle__btn402.txt delete mode 100644 demo-data/words/adjectives.txt delete mode 100644 demo-data/words/nouns.txt delete mode 100644 demo-data/words/prepositions.txt delete mode 100644 demo-data/words/words.txt delete mode 100644 desktop/build.gradle.kts delete mode 100644 desktop/src/jvmDemo/kotlin/DemoColorBrewer2.kt delete mode 100644 desktop/src/jvmDemo/kotlin/DemoDelaunay03.kt delete mode 100644 desktop/src/jvmDemo/kotlin/DemoDelaunay3D.kt delete mode 100644 desktop/src/jvmDemo/kotlin/FindContours.kt delete mode 100644 desktop/src/jvmDemo/kotlin/HeightmapVolcanoGenerator.kt delete mode 100644 dokka/images/logo-icon.svg delete mode 100644 dokka/styles/extra.css delete mode 100644 kotlin-js-store/yarn.lock delete mode 100644 openrndr-demos/build.gradle.kts delete mode 100644 openrndr-demos/src/demo/kotlin/Demo16BitPng.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoAnimation01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoAsyncImages01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoBillboardCircles01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCatmullRom01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCircleBatch01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCircleBatch03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoClipping.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoColorBufferCopy01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle04.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle05.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle06.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle07.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle08.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle09.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle10.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoComputeStyle20.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContour01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContour02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContour03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContourIntersections01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContourIntersections02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContourIntersections03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoContourNearest01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCubemap01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCubemap02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoCubemap03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoDDSImage01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoGeometryShader01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoImageLoadStore01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoImageLoadStore02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoImageLoadStore03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoLineCapJoin.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoLineDash01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoMouseCursor01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoPointBatch01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoScreenCapture01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoShaderStorageBuffer01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoTessShader01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoTessShader02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoTessShader03.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoTessShader04.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DemoVolumeTexture01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DrawerNegativeDimensions.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DrawerRectangleBatch01.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DrawerRectangleBatch02.kt delete mode 100644 openrndr-demos/src/demo/kotlin/DrawerRectangleBatch03.kt delete mode 100644 openrndr-demos/src/demo/resources/shaders/gs-01.frag delete mode 100644 openrndr-demos/src/demo/resources/shaders/gs-01.geom delete mode 100644 openrndr-demos/src/demo/resources/shaders/gs-01.vert delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-01.frag delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-01.tesc delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-01.tese delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-01.vert delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-02.frag delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-02.geom delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-02.tesc delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-02.tese delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-02.vert delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-03.frag delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-03.geom delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-03.tesc delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-03.tese delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-03.vert delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-04.frag delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-04.geom delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-04.tesc delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-04.tese delete mode 100644 openrndr-demos/src/demo/resources/shaders/ts-04.vert delete mode 100644 orx-camera/README.md delete mode 100644 orx-camera/build.gradle.kts delete mode 100644 orx-camera/src/commonMain/kotlin/AxisHelper.kt delete mode 100644 orx-camera/src/commonMain/kotlin/Camera2D.kt delete mode 100644 orx-camera/src/commonMain/kotlin/ChangeEvents.kt delete mode 100644 orx-camera/src/commonMain/kotlin/GridHelper.kt delete mode 100644 orx-camera/src/commonMain/kotlin/Orbital.kt delete mode 100644 orx-camera/src/commonMain/kotlin/OrbitalCamera.kt delete mode 100644 orx-camera/src/commonMain/kotlin/OrbitalControls.kt delete mode 100644 orx-camera/src/commonMain/kotlin/ParametricOrbital.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoCamera2D01.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoCamera2D02.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual01.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual02.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoOrbital01.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoOrbitalCamera01.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoOrbitalManual01.kt delete mode 100644 orx-camera/src/jvmDemo/kotlin/DemoParametricOrbital01.kt delete mode 100644 orx-color/README.md delete mode 100644 orx-color/build.gradle.kts delete mode 100644 orx-color/src/commonMain/kotlin/Color.kt delete mode 100644 orx-color/src/commonMain/kotlin/colormaps/ColormapPhrases.kt delete mode 100644 orx-color/src/commonMain/kotlin/colormaps/SpectralZucconiColormap.kt delete mode 100644 orx-color/src/commonMain/kotlin/colormaps/TurboColormap.kt delete mode 100644 orx-color/src/commonMain/kotlin/colormatrix/ColorTransforms.kt delete mode 100644 orx-color/src/commonMain/kotlin/fettepalette/FettePalette.kt delete mode 100644 orx-color/src/commonMain/kotlin/mixing/Spectral.kt delete mode 100644 orx-color/src/commonMain/kotlin/palettes/Classics.kt delete mode 100644 orx-color/src/commonMain/kotlin/palettes/ColorSequence.kt delete mode 100644 orx-color/src/commonMain/kotlin/phrases/Phrases.kt delete mode 100644 orx-color/src/commonMain/kotlin/presets/Colors.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorHPLUVa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorHSLUVa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorOKHSLa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorOKHSVa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorOKLABa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorOKLCHa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/ColorXSLUVa.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/OKHelpers.kt delete mode 100644 orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt delete mode 100644 orx-color/src/commonMain/kotlin/statistics/DeltaE.kt delete mode 100644 orx-color/src/commonMain/kotlin/statistics/Histogram.kt delete mode 100644 orx-color/src/commonMain/kotlin/tools/ChromaColorExtensions.kt delete mode 100644 orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt delete mode 100644 orx-color/src/commonTest/kotlin/ColorTest.kt delete mode 100644 orx-color/src/commonTest/kotlin/colormaps/TestSpectralZucconi6Colormap.kt delete mode 100644 orx-color/src/commonTest/kotlin/colormaps/TestTurboColormap.kt delete mode 100644 orx-color/src/commonTest/kotlin/mixing/TestSpectral.kt delete mode 100644 orx-color/src/commonTest/kotlin/spaces/TestHSLUVa.kt delete mode 100644 orx-color/src/commonTest/kotlin/spaces/TestOKHSLa.kt delete mode 100644 orx-color/src/commonTest/kotlin/spaces/TestOKHSVa.kt delete mode 100644 orx-color/src/commonTest/kotlin/spaces/TestOKLCHa.kt delete mode 100644 orx-color/src/commonTest/kotlin/spaces/TestXSLUVa.kt delete mode 100644 orx-color/src/commonTest/kotlin/tools/TestChromaColorExtensions.kt delete mode 100644 orx-color/src/commonTest/kotlin/tools/TestColorRGBaExtensions.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoColorPlane01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoColorPlane02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoColorSequence01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoDeltaE.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoFettePalette01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoFettePalette02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoHSLUV01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoHSLUV02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoHueTools01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoMixSpectral01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoOKHSV01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/DemoXSLUV01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange03.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange04.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormap.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPhrase.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPlot.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormap.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPhrase.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPlot.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix03.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix04.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram01.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram02.kt delete mode 100644 orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram03.kt delete mode 100644 orx-color/src/jvmMain/kotlin/src/statistics/Histogram.kt delete mode 100644 orx-color/src/jvmTest/kotlin/TestMix.kt delete mode 100644 orx-composition/README.md delete mode 100644 orx-composition/build.gradle.kts delete mode 100644 orx-composition/src/commonMain/kotlin/Composition.kt delete mode 100644 orx-composition/src/commonMain/kotlin/CompositionDrawer.kt delete mode 100644 orx-composition/src/commonMain/kotlin/CompositionStyleSheet.kt delete mode 100644 orx-composition/src/commonMain/kotlin/DrawerExtensions.kt delete mode 100644 orx-composition/src/commonMain/kotlin/ProgramExtensions.kt delete mode 100644 orx-composition/src/commonTest/kotlin/TestComposition.kt delete mode 100644 orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer01.kt delete mode 100644 orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer02.kt delete mode 100644 orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer03.kt delete mode 100644 orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer04.kt delete mode 100644 orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer05.kt delete mode 100644 orx-compositor/README.md delete mode 100644 orx-compositor/build.gradle.kts delete mode 100644 orx-compositor/src/commonMain/kotlin/Compositor.kt delete mode 100644 orx-compositor/src/jvmDemo/kotlin/DemoAside01.kt delete mode 100644 orx-compositor/src/jvmDemo/kotlin/DemoCompositor01.kt delete mode 100644 orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt delete mode 100644 orx-delegate-magic/README.md delete mode 100644 orx-delegate-magic/build.gradle.kts delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/aggregation/Aggregators.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/aggregation/ListAggregation.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/difference/PropertyDifferencer.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/dynamics/PropertySpringForcer.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertyFollower.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertySmoother.kt delete mode 100644 orx-delegate-magic/src/commonMain/kotlin/tracking/PropertyTracker.kt delete mode 100644 orx-delegate-magic/src/jvmDemo/kotlin/DemoDifferencing01.kt delete mode 100644 orx-delegate-magic/src/jvmDemo/kotlin/DemoFollowing01.kt delete mode 100644 orx-delegate-magic/src/jvmDemo/kotlin/DemoSmoothing01.kt delete mode 100644 orx-delegate-magic/src/jvmDemo/kotlin/DemoSpring01.kt delete mode 100644 orx-depth-camera/build.gradle.kts delete mode 100644 orx-depth-camera/src/commonMain/kotlin/DepthCamera.kt delete mode 100644 orx-easing/README.md delete mode 100644 orx-easing/build.gradle.kts delete mode 100644 orx-easing/src/commonMain/kotlin/Easing.kt delete mode 100644 orx-easing/src/jvmDemo/kotlin/DemoEasings01.kt delete mode 100644 orx-envelopes/README.md delete mode 100644 orx-envelopes/build.gradle.kts delete mode 100644 orx-envelopes/src/commonMain/kotlin/ADSR.kt delete mode 100644 orx-envelopes/src/commonMain/kotlin/Envelope.kt delete mode 100644 orx-envelopes/src/commonMain/kotlin/MPPSynchronize.kt delete mode 100644 orx-envelopes/src/commonMain/kotlin/Tracker.kt delete mode 100644 orx-envelopes/src/jsMain/kotlin/MPPSynchronize.kt delete mode 100644 orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker01.kt delete mode 100644 orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker02.kt delete mode 100644 orx-envelopes/src/jvmMain/kotlin/MPPSynchronize.kt delete mode 100644 orx-expression-evaluator-typed/README.md delete mode 100644 orx-expression-evaluator-typed/build.gradle.kts delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/CompiledFunctions.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function0.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function1.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function2.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function3.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function4.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/MemberFunctions.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Properties.kt delete mode 100644 orx-expression-evaluator-typed/src/commonMain/kotlin/typed/TypedExpressions.kt delete mode 100644 orx-expression-evaluator-typed/src/jsMain/kotlin/typed/TypedExpressions.js.kt delete mode 100644 orx-expression-evaluator-typed/src/jvmMain/kotlin/typed/TypedExpressions.jvm.kt delete mode 100644 orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestListLiteralExpression.kt delete mode 100644 orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestRangeExpression.kt delete mode 100644 orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedCompiledExpression.kt delete mode 100644 orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedExpression.kt delete mode 100644 orx-expression-evaluator/.gitignore delete mode 100644 orx-expression-evaluator/README.md delete mode 100644 orx-expression-evaluator/build.gradle.kts delete mode 100644 orx-expression-evaluator/src/commonMain/antlr/KeyLangLexer.g4 delete mode 100644 orx-expression-evaluator/src/commonMain/antlr/KeyLangParser.g4 delete mode 100644 orx-expression-evaluator/src/commonMain/kotlin/CompiledFunctions.kt delete mode 100644 orx-expression-evaluator/src/commonMain/kotlin/ExpressionDelegate.kt delete mode 100644 orx-expression-evaluator/src/commonMain/kotlin/Expressions.kt delete mode 100644 orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator01.kt delete mode 100644 orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator02.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledExpression.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledFunctions.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionDelegates.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionErrors.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestExpressions.kt delete mode 100644 orx-expression-evaluator/src/jvmTest/kotlin/TestOperators.kt delete mode 100644 orx-fcurve/README.md delete mode 100644 orx-fcurve/build.gradle.kts delete mode 100644 orx-fcurve/src/commonMain/kotlin/CompoundFCurve.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/EFCurve.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/FCurve.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/FCurveModifier.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/MultiFCurve.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/MultiFCurveExtensions.kt delete mode 100644 orx-fcurve/src/commonMain/kotlin/Roots.kt delete mode 100644 orx-fcurve/src/commonTest/kotlin/TestEFCurve.kt delete mode 100644 orx-fcurve/src/commonTest/kotlin/TestFCurve.kt delete mode 100644 orx-fcurve/src/jvmDemo/kotlin/DemoFCurve01.kt delete mode 100644 orx-fcurve/src/jvmDemo/kotlin/DemoFCurve02.kt delete mode 100644 orx-fcurve/src/jvmDemo/kotlin/DemoFCurveSheet01.kt delete mode 100644 orx-fcurve/src/jvmDemo/kotlin/DemoMultiFCurve01.kt delete mode 100644 orx-fft/README.md delete mode 100644 orx-fft/build.gradle.kts delete mode 100644 orx-fft/src/commonMain/kotlin/FFT.kt delete mode 100644 orx-fft/src/commonMain/kotlin/HannWindow.kt delete mode 100644 orx-fft/src/commonMain/kotlin/IdentityWindow.kt delete mode 100644 orx-fft/src/commonMain/kotlin/WindowFunction.kt delete mode 100644 orx-fft/src/jvmDemo/kotlin/DemoFFTShape01.kt delete mode 100644 orx-fx/README.md delete mode 100644 orx-fx/build.gradle.kts delete mode 100644 orx-fx/src/commonMain/kotlin/FilterTools.kt delete mode 100644 orx-fx/src/commonMain/kotlin/Post.kt delete mode 100644 orx-fx/src/commonMain/kotlin/antialias/FXAA.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blend/BlendFilters.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/ApproximateGaussianBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/Bloom.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/BoxBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/DirectionalBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/FrameBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/GaussianBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/HashBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/LaserBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/LineBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/MipBloom.kt delete mode 100644 orx-fx/src/commonMain/kotlin/blur/ZoomBlur.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/ChromaticAberration.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/ColorCorrection.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/ColorLookup.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/ColorMix.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Colorspaces.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Duotone.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/DuotoneGradient.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Invert.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/LumaMap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/LumaOpacity.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/LumaThreshold.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Pal.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Posterize.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/Sepia.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/SetBackground.kt delete mode 100644 orx-fx/src/commonMain/kotlin/color/SubtractConstant.kt delete mode 100644 orx-fx/src/commonMain/kotlin/colormap/ColormapFilter.kt delete mode 100644 orx-fx/src/commonMain/kotlin/colormap/GrayscaleColormap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/colormap/SpectralZucconiColormap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/colormap/TurboColormap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/composite/CompositeFilter.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/BlockRepeat.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/DirectionalDisplace.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/DisplaceBlend.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/Fisheye.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/FluidDistort.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/Lenses.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/PerspectivePlane.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/Perturb.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/PolarToRectangular.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/RectangularToPolar.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/StackRepeat.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/StretchWaves.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/TapeNoise.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/Tiles.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/VideoGlitch.kt delete mode 100644 orx-fx/src/commonMain/kotlin/distort/Wave.kt delete mode 100644 orx-fx/src/commonMain/kotlin/dither/ADither.kt delete mode 100644 orx-fx/src/commonMain/kotlin/dither/CMYKHalftone.kt delete mode 100644 orx-fx/src/commonMain/kotlin/dither/Crosshatch.kt delete mode 100644 orx-fx/src/commonMain/kotlin/dither/LumaHalftone.kt delete mode 100644 orx-fx/src/commonMain/kotlin/edges/CannyEdgeDetector.kt delete mode 100644 orx-fx/src/commonMain/kotlin/edges/Contour.kt delete mode 100644 orx-fx/src/commonMain/kotlin/edges/EdgesWork.kt delete mode 100644 orx-fx/src/commonMain/kotlin/edges/LumaLaplacian.kt delete mode 100644 orx-fx/src/commonMain/kotlin/edges/LumaSobel.kt delete mode 100644 orx-fx/src/commonMain/kotlin/grain/FilmGrain.kt delete mode 100644 orx-fx/src/commonMain/kotlin/math/MultiplyU.kt delete mode 100644 orx-fx/src/commonMain/kotlin/math/MultiplyV.kt delete mode 100644 orx-fx/src/commonMain/kotlin/math/Square.kt delete mode 100644 orx-fx/src/commonMain/kotlin/patterns/Checkers.kt delete mode 100644 orx-fx/src/commonMain/kotlin/shadow/DropShadow.kt delete mode 100644 orx-fx/src/commonMain/kotlin/tonemap/ACESTonemap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/tonemap/ReinhardTonemap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/tonemap/Uncharted2Tonemap.kt delete mode 100644 orx-fx/src/commonMain/kotlin/transform/FlipVertically.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoApproximateGaussianBlur01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoBlend01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoCannyEdgeDetector01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColorDuotone01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColorDuotoneGradient01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColorPosterize01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColormapGrayscale.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColormapSpectralZucconi.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoColormapTurbo.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoCompositeFilter01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoContour01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoDirectionalBlur01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace02.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoDistortLenses01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoLaserBlur01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoOkLab01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoPost01.kt delete mode 100644 orx-fx/src/jvmDemo/kotlin/DemoSpectralBlend01.kt delete mode 100644 orx-fx/src/shaders/glsl/antialias/fxaa.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/add.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/color-burn.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/color-dodge.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/darken.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/destination-atop.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/destination-in.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/destination-out.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/hard-light.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/lighten.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/multiply-contrast.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/multiply.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/normal.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/overlay.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/passthrough.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/screen.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/source-atop.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/source-in.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/source-out.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/spectral.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/subtract.frag delete mode 100644 orx-fx/src/shaders/glsl/blend/xor.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/bloom-combine.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/bloom-downscale.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/bloom-upscale.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/bloom.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/box-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/directional-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/directional-hash-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/frame-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/gaussian-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/hash-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/kawase-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/laser-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/blur/zoom-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/color/chromatic-aberration.frag delete mode 100644 orx-fx/src/shaders/glsl/color/color-correction.frag delete mode 100644 orx-fx/src/shaders/glsl/color/color-lookup.frag delete mode 100644 orx-fx/src/shaders/glsl/color/color-mix.frag delete mode 100644 orx-fx/src/shaders/glsl/color/color-tint.frag delete mode 100644 orx-fx/src/shaders/glsl/color/duotone-gradient.frag delete mode 100644 orx-fx/src/shaders/glsl/color/duotone.frag delete mode 100644 orx-fx/src/shaders/glsl/color/invert.frag delete mode 100644 orx-fx/src/shaders/glsl/color/luma-map.frag delete mode 100644 orx-fx/src/shaders/glsl/color/luma-opacity.frag delete mode 100644 orx-fx/src/shaders/glsl/color/luma-threshold.frag delete mode 100644 orx-fx/src/shaders/glsl/color/oklab-to-rgb.frag delete mode 100644 orx-fx/src/shaders/glsl/color/pal.frag delete mode 100644 orx-fx/src/shaders/glsl/color/posterize.frag delete mode 100644 orx-fx/src/shaders/glsl/color/rgb-to-oklab.frag delete mode 100644 orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag delete mode 100644 orx-fx/src/shaders/glsl/color/sepia.frag delete mode 100644 orx-fx/src/shaders/glsl/color/set-background.frag delete mode 100644 orx-fx/src/shaders/glsl/color/subtract-constant.frag delete mode 100644 orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag delete mode 100644 orx-fx/src/shaders/glsl/colormap/grayscale-colormap.frag delete mode 100644 orx-fx/src/shaders/glsl/colormap/spectral-zucconi-colormap.frag delete mode 100644 orx-fx/src/shaders/glsl/colormap/turbo-colormap.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/block-repeat.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/directional-displace.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/displace-blend.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/fisheye.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/fluid-distort.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/horizontal-wave.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/lenses.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/perspective-plane.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/perturb.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/polar-to-rectangular.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/rectangular-to-polar.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/stack-repeat.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/stretch-waves.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/tape-noise.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/tiles.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/uvmap.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/vertical-wave.frag delete mode 100644 orx-fx/src/shaders/glsl/distort/video-glitch.frag delete mode 100644 orx-fx/src/shaders/glsl/dither/a-dither.frag delete mode 100644 orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag delete mode 100644 orx-fx/src/shaders/glsl/dither/crosshatch.frag delete mode 100644 orx-fx/src/shaders/glsl/dither/luma-halftone.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/contour.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/edges-work-1.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/edges-work-2.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/luma-laplacian.frag delete mode 100644 orx-fx/src/shaders/glsl/edges/luma-sobel.frag delete mode 100644 orx-fx/src/shaders/glsl/grain/film-grain.frag delete mode 100644 orx-fx/src/shaders/glsl/math/multiply-u.frag delete mode 100644 orx-fx/src/shaders/glsl/math/multiply-v.frag delete mode 100644 orx-fx/src/shaders/glsl/math/square.frag delete mode 100644 orx-fx/src/shaders/glsl/patterns/checkers.frag delete mode 100644 orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag delete mode 100644 orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag delete mode 100644 orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag delete mode 100644 orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag delete mode 100644 orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag delete mode 100644 orx-fx/src/shaders/glsl/transform/flip-vertically.frag delete mode 100644 orx-gradient-descent/README.md delete mode 100644 orx-gradient-descent/build.gradle.kts delete mode 100644 orx-gradient-descent/src/commonMain/kotlin/GradientDescent.kt delete mode 100644 orx-gradient-descent/src/jvmMain/kotlin/DataBinding.kt delete mode 100644 orx-gradient-descent/src/jvmMain/kotlin/GradientDescent.kt delete mode 100644 orx-gradient-descent/src/jvmTest/kotlin/TestDot.kt delete mode 100644 orx-gradient-descent/src/jvmTest/kotlin/TestGradient.kt delete mode 100644 orx-gradient-descent/src/jvmTest/kotlin/TestMinimize.kt delete mode 100644 orx-gradient-descent/src/jvmTest/kotlin/TestMinimizeModel.kt delete mode 100644 orx-gradient-descent/src/jvmTest/kotlin/TestPlaceholder.kt delete mode 100644 orx-hash-grid/README.md delete mode 100644 orx-hash-grid/build.gradle.kts delete mode 100644 orx-hash-grid/src/commonMain/kotlin/HashGrid.kt delete mode 100644 orx-hash-grid/src/commonMain/kotlin/HashGrid3D.kt delete mode 100644 orx-hash-grid/src/jvmDemo/kotlin/DemoFilter01.kt delete mode 100644 orx-hash-grid/src/jvmDemo/kotlin/DemoFilter3D01.kt delete mode 100644 orx-hash-grid/src/jvmDemo/kotlin/DemoHashGrid01.kt delete mode 100644 orx-image-fit/README.md delete mode 100644 orx-image-fit/build.gradle.kts delete mode 100644 orx-image-fit/src/commonMain/kotlin/ImageFit.kt delete mode 100644 orx-image-fit/src/jvmDemo/kotlin/DemoImageFit01.kt delete mode 100644 orx-image-fit/src/jvmDemo/kotlin/DemoImageFitSub01.kt delete mode 100644 orx-integral-image/README.md delete mode 100644 orx-integral-image/build.gradle.kts delete mode 100644 orx-integral-image/src/demo/kotlin/DemoFII01.kt delete mode 100644 orx-integral-image/src/demo/kotlin/DemoFII02.kt delete mode 100644 orx-integral-image/src/main/kotlin/FastIntegralImage.kt delete mode 100644 orx-integral-image/src/main/kotlin/IntegralImage.kt delete mode 100644 orx-integral-image/src/main/resources/shaders/gl3/integral-image.frag delete mode 100644 orx-interval-tree/README.md delete mode 100644 orx-interval-tree/build.gradle.kts delete mode 100644 orx-interval-tree/src/main/kotlin/IntervalTree.kt delete mode 100644 orx-jumpflood/README.md delete mode 100644 orx-jumpflood/build.gradle.kts delete mode 100644 orx-jumpflood/src/commonMain/kotlin/ClusteredField.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/DirectionalField.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/DistanceField.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/JumpFlood.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/draw/SDFDraw.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/InnerBevel.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/InnerGlow.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/Inpaint.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/OuterGlow.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/Skeleton.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/fx/StraightSkeleton.kt delete mode 100644 orx-jumpflood/src/commonMain/kotlin/ops/SDFOps.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField02.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoDistanceField01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow02.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF02.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF03.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF04.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF05.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoSkeleton01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoStraightSkeleton01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi01.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi02.kt delete mode 100644 orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi03.kt delete mode 100644 orx-jumpflood/src/jvmDemo/resources/name.svg delete mode 100644 orx-jumpflood/src/jvmMain/kotlin/ShapeSDF.kt delete mode 100644 orx-jumpflood/src/shaders/glsl/alpha-threshold.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/contour-points.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/encode-points.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/encode-subpixel.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/id-contours.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/inner-bevel.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/inner-glow.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/inpaint.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/jumpflood.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/outer-glow.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/pixel-direction.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/pixel-distance.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-blend.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-onion.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-round.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-smooth-difference.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-smooth-intersection.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-smooth-union.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/sdf-stroke-fill.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/shape-sdf.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/skeleton.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/straight-skeleton.frag delete mode 100644 orx-jumpflood/src/shaders/glsl/threshold.frag delete mode 100644 orx-jvm/build.gradle.kts delete mode 100644 orx-jvm/orx-axidraw/README.md delete mode 100644 orx-jvm/orx-axidraw/build.gradle.kts delete mode 100644 orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw01.kt delete mode 100644 orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw02.kt delete mode 100644 orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw03.kt delete mode 100644 orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw04.kt delete mode 100644 orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw05.kt delete mode 100644 orx-jvm/orx-axidraw/src/main/kotlin/Axidraw.kt delete mode 100644 orx-jvm/orx-axidraw/src/main/kotlin/SVG.kt delete mode 100644 orx-jvm/orx-axidraw/src/main/kotlin/python.kt delete mode 100644 orx-jvm/orx-boofcv/README.md delete mode 100644 orx-jvm/orx-boofcv/build.gradle.kts delete mode 100644 orx-jvm/orx-boofcv/src/demo/kotlin/DemoContours01.kt delete mode 100644 orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize01.kt delete mode 100644 orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize02.kt delete mode 100644 orx-jvm/orx-boofcv/src/demo/kotlin/DemoSimplified01.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/Binding.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/ContourConversion.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/Distortion.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/Drawing.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/ImageFlowConversion.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/MatrixConversion.kt delete mode 100644 orx-jvm/orx-boofcv/src/main/kotlin/PointConversion.kt delete mode 100644 orx-jvm/orx-chataigne/README.md delete mode 100644 orx-jvm/orx-chataigne/build.gradle.kts delete mode 100644 orx-jvm/orx-chataigne/resources/timeline_example_chataigne.noisette delete mode 100644 orx-jvm/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt delete mode 100644 orx-jvm/orx-chataigne/src/main/kotlin/ChataigneOSC.kt delete mode 100644 orx-jvm/orx-crash-handler/README.md delete mode 100644 orx-jvm/orx-crash-handler/build.gradle.kts delete mode 100644 orx-jvm/orx-crash-handler/src/demo/kotlin/DemoCrashHandler01.kt delete mode 100644 orx-jvm/orx-crash-handler/src/main/kotlin/CrashHandler.kt delete mode 100644 orx-jvm/orx-crash-handler/src/main/kotlin/Reporter.kt delete mode 100644 orx-jvm/orx-crash-handler/src/main/kotlin/SlackReporter.kt delete mode 100644 orx-jvm/orx-depth-camera-calibrator/README.md delete mode 100644 orx-jvm/orx-depth-camera-calibrator/build.gradle.kts delete mode 100644 orx-jvm/orx-depth-camera-calibrator/src/main/kotlin/DepthCameraCalibrator.kt delete mode 100644 orx-jvm/orx-dnk3/README.md delete mode 100644 orx-jvm/orx-dnk3/build.gradle.kts delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoCamera01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL02.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoIrrProbe01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights02.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights03.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoObject01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene02.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene03.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoSegmentContours01.kt delete mode 100644 orx-jvm/orx-dnk3/src/demo/kotlin/DemoSkinning01.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Camera.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Entity.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Facet.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Feature.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Light.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Material.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Post.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/RenderPass.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Scene.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapFilter.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapPassthrough.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/cubemap/IrradianceConvolution.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/cubemap/SphericalHarmonics.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/dsl/PBRMaterialBuilder.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/dsl/SceneBuilder.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/features/IrradianceSH.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/features/VoxelConeTracing.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/gltf/Glb.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/gltf/Gltf.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/materials/IrradianceDebugMaterial.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/post/ScreenspaceReflections.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/post/SegmentContours.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/post/VolumetricIrradiance.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/query/Query.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/renderers/DryRenderer.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/renderers/PostRenderer.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/renderers/SegmentContourRenderer.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/tools/MeshCollapse.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/kotlin/tools/Skybox.kt delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/evaluate-sh.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh0.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh0.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-coordinates.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-index.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/cubemap-passthrough.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/irradiance-convolution.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/spherical-harmonics.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours-msaa-8.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours.frag delete mode 100644 orx-jvm/orx-dnk3/src/main/resources/shaders/volumetric-irradiance.frag delete mode 100644 orx-jvm/orx-file-watcher/README.md delete mode 100644 orx-jvm/orx-file-watcher/build.gradle.kts delete mode 100644 orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcher.kt delete mode 100644 orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcherDelegate.kt delete mode 100644 orx-jvm/orx-git-archiver-gradle/README.md delete mode 100644 orx-jvm/orx-git-archiver-gradle/build.gradle.kts delete mode 100644 orx-jvm/orx-git-archiver-gradle/src/main/kotlin/GitArchiveToMarkdown.kt delete mode 100644 orx-jvm/orx-git-archiver/README.md delete mode 100644 orx-jvm/orx-git-archiver/build.gradle.kts delete mode 100644 orx-jvm/orx-git-archiver/src/demo/kotlin/GitArchiverDemo01.kt delete mode 100644 orx-jvm/orx-git-archiver/src/main/kotlin/GitArchiver.kt delete mode 100644 orx-jvm/orx-git-archiver/src/main/kotlin/JavaGit.kt delete mode 100644 orx-jvm/orx-git-archiver/src/main/kotlin/NativeGit.kt delete mode 100644 orx-jvm/orx-gui/README.md delete mode 100644 orx-jvm/orx-gui/build.gradle.kts delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoAppearance01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoHide01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow02.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoOptions01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoOptions02.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoPath01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoPresets01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoSideCanvas01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoSimple01.kt delete mode 100644 orx-jvm/orx-gui/src/demo/kotlin/DemoXYParameter.kt delete mode 100644 orx-jvm/orx-gui/src/main/kotlin/Gui.kt delete mode 100644 orx-jvm/orx-gui/src/main/kotlin/WindowedGUI.kt delete mode 100644 orx-jvm/orx-keyframer/README.md delete mode 100644 orx-jvm/orx-keyframer/build.gradle.kts delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoEvelope01.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoFull01.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoScrub01.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple01.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple02.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimpleExpressions01.kt delete mode 100644 orx-jvm/orx-keyframer/src/demo/resources/demo-envelope-01.json delete mode 100644 orx-jvm/orx-keyframer/src/demo/resources/demo-full-01.json delete mode 100644 orx-jvm/orx-keyframer/src/demo/resources/demo-simple-01.json delete mode 100644 orx-jvm/orx-keyframer/src/demo/resources/demo-simple-02.json delete mode 100644 orx-jvm/orx-keyframer/src/demo/resources/demo-simple-expressions-01.json delete mode 100644 orx-jvm/orx-keyframer/src/main/kotlin/Key.kt delete mode 100644 orx-jvm/orx-keyframer/src/main/kotlin/KeyQuaternion.kt delete mode 100644 orx-jvm/orx-keyframer/src/main/kotlin/KeyVector3.kt delete mode 100644 orx-jvm/orx-keyframer/src/main/kotlin/Keyframer.kt delete mode 100644 orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerChannel.kt delete mode 100644 orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerErrors.kt delete mode 100644 orx-jvm/orx-keyframer/src/test/resources/error-reporting/easing.json delete mode 100644 orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-01.json delete mode 100644 orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-02.json delete mode 100644 orx-jvm/orx-keyframer/src/test/resources/error-reporting/value-01.json delete mode 100644 orx-jvm/orx-kinect-common/build.gradle.kts delete mode 100644 orx-jvm/orx-kinect-common/src/main/kotlin/Kinect.kt delete mode 100644 orx-jvm/orx-kinect-common/src/main/resources/org/openrndr/extra/kinect/depth-to-raw-normalized.frag delete mode 100644 orx-jvm/orx-kinect-v1-demo/build.gradle.kts delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo01BasicUseCase.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo02MotionCaptureUseCase.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo03DepthToColorMaps.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo04SwitchOffLed.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo05MultipleDevices.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo07NativeFreenectCommands.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo08LogLevelFlood.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo09RawDepthProcessing.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo10DepthCameraCalibration.kt delete mode 100644 orx-jvm/orx-kinect-v1-demo/src/main/resources/logback.xml delete mode 100644 orx-jvm/orx-kinect-v1/README.md delete mode 100644 orx-jvm/orx-kinect-v1/build.gradle.kts delete mode 100644 orx-jvm/orx-kinect-v1/src/main/kotlin/Kinect1.kt delete mode 100644 orx-jvm/orx-kinect-v1/src/main/resources/org/openrndr/extra/kinect/v1/kinect1-depth-to-meters.frag delete mode 100644 orx-jvm/orx-kotlin-parser/build.gradle.kts delete mode 100755 orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinLexer.g4 delete mode 100644 orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinParser.g4 delete mode 100644 orx-jvm/orx-kotlin-parser/src/main/antlr/README.md delete mode 100644 orx-jvm/orx-kotlin-parser/src/main/antlr/UnicodeClasses.g4 delete mode 100644 orx-jvm/orx-kotlin-parser/src/main/kotlin/ExtractProgram.kt delete mode 100644 orx-jvm/orx-kotlin-parser/src/main/kotlin/TreeUtils.kt delete mode 100644 orx-jvm/orx-midi/README.md delete mode 100644 orx-jvm/orx-midi/build.gradle.kts delete mode 100644 orx-jvm/orx-midi/src/demo/kotlin/DemoMidiBinding01.kt delete mode 100644 orx-jvm/orx-midi/src/demo/kotlin/DemoMidiConsole01.kt delete mode 100644 orx-jvm/orx-midi/src/main/kotlin/MidiBindings.kt delete mode 100644 orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt delete mode 100644 orx-jvm/orx-midi/src/main/kotlin/MidiEvent.kt delete mode 100644 orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt delete mode 100644 orx-jvm/orx-midi/src/test/kotlin/MidiTests.kt delete mode 100644 orx-jvm/orx-midi/src/test/kotlin/MidiTransceiverTest.kt delete mode 100644 orx-jvm/orx-minim/README.md delete mode 100644 orx-jvm/orx-minim/build.gradle.kts delete mode 100644 orx-jvm/orx-minim/src/demo/kotlin/DemoAdditive01.kt delete mode 100644 orx-jvm/orx-minim/src/demo/kotlin/DemoFFT01.kt delete mode 100644 orx-jvm/orx-minim/src/demo/kotlin/DemoPlaySound01.kt delete mode 100644 orx-jvm/orx-minim/src/main/kotlin/Minim.kt delete mode 100644 orx-jvm/orx-olive/README.md delete mode 100644 orx-jvm/orx-olive/build.gradle.kts delete mode 100644 orx-jvm/orx-olive/src/demo/kotlin/DemoOlive01.kt delete mode 100644 orx-jvm/orx-olive/src/demo/kotlin/DemoOliveFromScript01.kt delete mode 100644 orx-jvm/orx-olive/src/demo/kotlin/DemoWindowedGUI01.kt delete mode 100644 orx-jvm/orx-olive/src/demo/kotlin/demo-olive-01.kts delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/Olive.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/OliveProgram.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/Reloadable.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/Resources.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/ScriptGenerator.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt delete mode 100644 orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderKSH.kt delete mode 100644 orx-jvm/orx-olive/src/test/kotlin/TestLoadScript.kt delete mode 100644 orx-jvm/orx-olive/src/test/kotlin/TestLoadScriptKSH.kt delete mode 100644 orx-jvm/orx-osc/README.md delete mode 100644 orx-jvm/orx-osc/build.gradle.kts delete mode 100644 orx-jvm/orx-osc/src/main/kotlin/OSC.kt delete mode 100644 orx-jvm/orx-panel/README.md delete mode 100644 orx-jvm/orx-panel/build.gradle.kts delete mode 100644 orx-jvm/orx-panel/src/demo/kotlin/DemoColorPickerButton01.kt delete mode 100644 orx-jvm/orx-panel/src/demo/kotlin/DemoHorizontalLayout01.kt delete mode 100644 orx-jvm/orx-panel/src/demo/kotlin/DemoVerticalLayout01.kt delete mode 100644 orx-jvm/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt delete mode 100644 orx-jvm/orx-panel/src/demo/kotlin/DemoWatchObjectDiv01.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/ControlManager.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/FontManager.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableCopyOnWriteArrayList.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableHashSet.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Body.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Button.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Canvas.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Colorpicker.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/ColorpickerButton.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Div.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/DropdownButton.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Element.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeButton.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeEditor.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/LayoutBuilder.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SequenceEditor.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Slider.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SlidersVector.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/TextElements.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Textfield.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Toggle.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchObjectDiv.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/XYPad.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/hash/WatchHash.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/layout/Layouter.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/DefaultStyles.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Matcher.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Selector.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/StyleSheet.kt delete mode 100644 orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/tools/Tooltip.kt delete mode 100644 orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Medium.ttf delete mode 100644 orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Regular.ttf delete mode 100644 orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/SelectorBuilderTest.kt delete mode 100644 orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/StyleSheetTest.kt delete mode 100644 orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/TestPlaceholder.kt delete mode 100644 orx-jvm/orx-poisson-fill/README.md delete mode 100644 orx-jvm/orx-poisson-fill/build.gradle.kts delete mode 100644 orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill02.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/main/kotlin/ConvolutionPyramid.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/main/kotlin/LaplacianIntegrator.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonBlender.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonFiller.kt delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/alpha-to-bitmap.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-boundary.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-combine.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/clamp.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/laplacian.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/passthrough-noalpha.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/remove-alpha.frag delete mode 100644 orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag delete mode 100644 orx-jvm/orx-processing/README.md delete mode 100644 orx-jvm/orx-processing/build.gradle.kts delete mode 100644 orx-jvm/orx-processing/src/demo/kotlin/DemoPShape01.kt delete mode 100644 orx-jvm/orx-processing/src/demo/kotlin/DemoPShape02.kt delete mode 100644 orx-jvm/orx-processing/src/main/kotlin/PShapeExtensions.kt delete mode 100644 orx-jvm/orx-processing/src/main/kotlin/PVectorExtensions.kt delete mode 100644 orx-jvm/orx-rabbit-control/.gitignore delete mode 100644 orx-jvm/orx-rabbit-control/README.md delete mode 100644 orx-jvm/orx-rabbit-control/build.gradle.kts delete mode 100644 orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControl.kt delete mode 100644 orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControlManualOverlay.kt delete mode 100644 orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt delete mode 100644 orx-jvm/orx-rabbit-control/src/main/kotlin/RabbitControlServer.kt delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/asset-manifest.json delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/favicon.ico delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/index.html delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/manifest.json delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/precache-manifest.8b50f7152eba97a8a3a748d36319a411.js delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/service-worker.js delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css.map delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css.map delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/1.ab137fd1.chunk.js delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/1.ab137fd1.chunk.js.map delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/main.3c08e7ef.chunk.js delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/main.3c08e7ef.chunk.js.map delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/runtime~main.4a686d48.js delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/runtime~main.4a686d48.js.map delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-16.05f1cdad.eot delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-16.3c1c220e.woff delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-16.3cde8748.ttf delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-20.0a5c7651.eot delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-20.51ec31f3.ttf delete mode 100644 orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/media/icons-20.cef8cdbb.woff delete mode 100644 orx-jvm/orx-realsense2/build.gradle.kts delete mode 100644 orx-jvm/orx-realsense2/src/demo/kotlin/DemoRS201.kt delete mode 100644 orx-jvm/orx-realsense2/src/demo/kotlin/DemoRS202.kt delete mode 100644 orx-jvm/orx-realsense2/src/demo/kotlin/DemoUnproject01.kt delete mode 100644 orx-jvm/orx-realsense2/src/main/kotlin/RS2Sensor.kt delete mode 100644 orx-jvm/orx-syphon/README.md delete mode 100644 orx-jvm/orx-syphon/build.gradle.kts delete mode 100644 orx-jvm/orx-syphon/preview.gif delete mode 100644 orx-jvm/orx-syphon/src/demo/kotlin/ClientExampleSpecificServer.kt delete mode 100644 orx-jvm/orx-syphon/src/demo/kotlin/DemoClient01.kt delete mode 100644 orx-jvm/orx-syphon/src/demo/kotlin/DemoServer01.kt delete mode 100644 orx-jvm/orx-syphon/src/demo/kotlin/DemoServer02.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/SyphonClient.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/SyphonServer.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/JSyphonClient.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/JSyphonImage.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/JSyphonNative.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/JSyphonServer.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/JSyphonServerList.kt delete mode 100644 orx-jvm/orx-syphon/src/main/kotlin/jsyphon/Util.kt delete mode 100755 orx-jvm/orx-syphon/src/main/resources/jsyphon-natives/Syphon-arm64 delete mode 100644 orx-jvm/orx-syphon/src/main/resources/jsyphon-natives/Syphon-x86 delete mode 100755 orx-jvm/orx-syphon/src/main/resources/jsyphon-natives/libJSyphon-arm64.jnilib delete mode 100644 orx-jvm/orx-syphon/src/main/resources/jsyphon-natives/libJSyphon-x86.jnilib delete mode 100644 orx-jvm/orx-video-profiles/README.md delete mode 100644 orx-jvm/orx-video-profiles/build.gradle.kts delete mode 100644 orx-jvm/orx-video-profiles/src/demo/kotlin/DemoGIF01.kt delete mode 100644 orx-jvm/orx-video-profiles/src/demo/kotlin/DemoProres01.kt delete mode 100644 orx-jvm/orx-video-profiles/src/demo/kotlin/DemoTIFF01.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/GIFProfile.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/H265Profile.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/PNGProfile.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/ProresProfile.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/TIFFProfile.kt delete mode 100644 orx-jvm/orx-video-profiles/src/main/kotlin/WebpProfile.kt delete mode 100644 orx-kdtree/README.md delete mode 100644 orx-kdtree/build.gradle.kts delete mode 100644 orx-kdtree/src/commonMain/kotlin/IterableExtensions.kt delete mode 100644 orx-kdtree/src/commonMain/kotlin/KDTree.kt delete mode 100644 orx-kdtree/src/commonMain/kotlin/Mappers.kt delete mode 100644 orx-kdtree/src/commonMain/kotlin/QuickSelect.kt delete mode 100644 orx-kdtree/src/jsMain/kotlin/KDTree.kt delete mode 100644 orx-kdtree/src/jvmDemo/kotlin/DemoKNearestNeighbour01.kt delete mode 100644 orx-kdtree/src/jvmDemo/kotlin/DemoNearestNeighbour01.kt delete mode 100644 orx-kdtree/src/jvmDemo/kotlin/DemoRangeQuery01.kt delete mode 100644 orx-kdtree/src/jvmMain/kotlin/KDTree.kt delete mode 100644 orx-marching-squares/README.md delete mode 100644 orx-marching-squares/build.gradle.kts delete mode 100644 orx-marching-squares/src/commonMain/kotlin/MarchingSquares.kt delete mode 100644 orx-marching-squares/src/jvmDemo/kotlin/FindContours01.kt delete mode 100644 orx-marching-squares/src/jvmDemo/kotlin/FindContours02.kt delete mode 100644 orx-marching-squares/src/jvmDemo/kotlin/FindContours03.kt delete mode 100644 orx-marching-squares/src/jvmDemo/kotlin/FindContours04.kt delete mode 100644 orx-math/README.md delete mode 100644 orx-math/build.gradle.kts delete mode 100644 orx-math/src/commonMain/kotlin/Math.kt delete mode 100644 orx-math/src/commonMain/kotlin/complex/Complex.kt delete mode 100644 orx-math/src/commonMain/kotlin/linearrange/LinearRange.kt delete mode 100644 orx-math/src/commonMain/kotlin/matrix/Matrix.kt delete mode 100644 orx-math/src/commonMain/kotlin/matrix/MatrixCholesky.kt delete mode 100644 orx-math/src/commonMain/kotlin/matrix/SparseMatrix.kt delete mode 100644 orx-math/src/commonMain/kotlin/matrix/SparseMatrixQR.kt delete mode 100644 orx-math/src/commonMain/kotlin/rbf/RbfInterpolator.kt delete mode 100644 orx-math/src/commonMain/kotlin/simplexrange/SimplexRange.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexAcoshTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexAsinTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexAsinhTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexAtanhTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexCoshTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexLogTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexSinhTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/ComplexTanhTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/complex/TestComplex.kt delete mode 100644 orx-math/src/commonTest/kotlin/linearrange/TestLinearRange.kt delete mode 100644 orx-math/src/commonTest/kotlin/matrix/SparseMatrixQRTest.kt delete mode 100644 orx-math/src/commonTest/kotlin/matrix/SparseMatrixTest.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/linearrange/DemoLinearRange02.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/linearrange/DemoLinearRange03.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/matrix/DemoLeastSquares01.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/matrix/DemoLeastSquares02.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/rbf/RbfInterpolation01.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/rbf/RbfInterpolation02.kt delete mode 100644 orx-math/src/jvmDemo/kotlin/simplexrange/DemoSimplexRange3D01.kt delete mode 100644 orx-mesh-generators/README.md delete mode 100644 orx-mesh-generators/build.gradle.kts delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Box.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Cap.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Cylinder.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Dodecahedron.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Extrusion.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/ExtrusionMorphed.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/ExtrusionScaled.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Helpers.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/MeshGenerators.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Plane.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Segment.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/Sphere.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/TriangleMeshBuilder.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/decal/Decal.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/mesh/Box.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/normals/MeshDataNormals.kt delete mode 100644 orx-mesh-generators/src/commonMain/kotlin/tangents/MeshDataTangents.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoAll.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoBox.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex01.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex02.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex03.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex04.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex05.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoComplex06.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude01.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude02.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude03.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude04.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude05.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/DemoExtrude06.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/decal/DemoDecal01.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/decal/DemoDecal02.kt delete mode 100644 orx-mesh-generators/src/jvmDemo/kotlin/tangents/DemoTangents01.kt delete mode 100644 orx-mesh-noise/README.md delete mode 100644 orx-mesh-noise/build.gradle.kts delete mode 100644 orx-mesh-noise/src/commonMain/kotlin/Barycentric.kt delete mode 100644 orx-mesh-noise/src/commonMain/kotlin/IIndexedPolygonExtensions.kt delete mode 100644 orx-mesh-noise/src/commonMain/kotlin/IMeshDataExtensions.kt delete mode 100644 orx-mesh-noise/src/commonMain/kotlin/WeightFunction.kt delete mode 100644 orx-mesh-noise/src/jvmDemo/kotlin/DemoMeshNoise01.kt delete mode 100644 orx-mesh-noise/src/jvmDemo/kotlin/DemoMeshNoise02.kt delete mode 100644 orx-mesh-noise/src/jvmDemo/kotlin/DemoMeshNoise03.kt delete mode 100644 orx-mesh-noise/src/jvmDemo/kotlin/DemoNonUniformMeshNoise01.kt delete mode 100644 orx-mesh/build.gradle.kts delete mode 100644 orx-mesh/src/commonMain/kotlin/CompoundMeshData.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/CompoundMeshDataExtensions.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/IndexedPolygon.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/IndexedPolygonExtensions.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/MeshData.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/MeshDataExtensions.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/Point.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/Polygon.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/VertexData.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/VertexDataExtensions.kt delete mode 100644 orx-mesh/src/commonMain/kotlin/Wireframe.kt delete mode 100644 orx-mesh/src/jvmMain/kotlin/VertexBufferExtensions.kt delete mode 100644 orx-module-catalog/build.gradle.kts delete mode 100644 orx-no-clear/README.md delete mode 100644 orx-no-clear/build.gradle.kts delete mode 100644 orx-no-clear/src/commonMain/kotlin/NoClear.kt delete mode 100644 orx-no-clear/src/jvmDemo/kotlin/DemoNoClear.kt delete mode 100644 orx-noise/README.md delete mode 100644 orx-noise/build.gradle.kts delete mode 100644 orx-noise/src/commonMain/kotlin/Cell.kt delete mode 100644 orx-noise/src/commonMain/kotlin/CubicNoise1D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/CubicNoise2D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/CubicNoise3D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Distribute.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Fractal.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Functions.kt delete mode 100644 orx-noise/src/commonMain/kotlin/GaussianRandom.kt delete mode 100644 orx-noise/src/commonMain/kotlin/GradCoord.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Gradient.kt delete mode 100644 orx-noise/src/commonMain/kotlin/GradientPerturb.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Interpolation.kt delete mode 100644 orx-noise/src/commonMain/kotlin/MathUtils.kt delete mode 100644 orx-noise/src/commonMain/kotlin/PerlinNoise1D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/PerlinNoise2D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/PerlinNoise3D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/PoissonDisk.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Polar.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Random.kt delete mode 100644 orx-noise/src/commonMain/kotlin/ShapeNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/SimplexNoise1D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/SimplexNoise2D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/SimplexNoise3D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/SimplexNoise4D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/UHash.kt delete mode 100644 orx-noise/src/commonMain/kotlin/UniformRandom.kt delete mode 100644 orx-noise/src/commonMain/kotlin/ValueNoise1D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/ValueNoise2D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/ValueNoise3D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/Vector.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/CellNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/HashNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/SimplexNoise3D.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/SpeckleNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/ValueNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/filters/WorleyNoise.kt delete mode 100644 orx-noise/src/commonMain/kotlin/hammersley/Hammersley.kt delete mode 100644 orx-noise/src/commonMain/kotlin/linearrange/LinearRangeExtensions.kt delete mode 100644 orx-noise/src/commonMain/kotlin/phrases/UHash.kt delete mode 100644 orx-noise/src/commonMain/kotlin/primitives/Boolean.kt delete mode 100644 orx-noise/src/commonMain/kotlin/rseq/Rseq.kt delete mode 100644 orx-noise/src/commonMain/kotlin/shapes/Box.kt delete mode 100644 orx-noise/src/commonMain/kotlin/shapes/Circle.kt delete mode 100644 orx-noise/src/commonMain/kotlin/shapes/Rectangle.kt delete mode 100644 orx-noise/src/commonMain/kotlin/shapes/Triangle.kt delete mode 100644 orx-noise/src/commonMain/kotlin/simplexrange/ListExtensions.kt delete mode 100644 orx-noise/src/commonMain/kotlin/simplexrange/SimplexRangeExtensions.kt delete mode 100644 orx-noise/src/demo/kotlin/DemoShapeNoise.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoCubicNoise2D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoFunctionalComposition01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoGradientPerturb2D.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoGradientPerturb3D.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoScatter01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoSimplex01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoTriangleNoise01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/DemoValueNoise2D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/glsl/DemoNoisesGLSL.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/glsl/DemoNoisesGLSLGui.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/glsl/DemoSimplexGLSL.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hammersley/DemoHammersley2D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hammersley/DemoHammersley3D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hammersley/DemoHammersley4D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hash/DemoCircleHash01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hash/DemoRectangleHash01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/hash/DemoUHash01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/linearrange/DemoLinearRange01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/linearrange/DemoLinearRange02.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/phrases/DemoUHashPhrase01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/rseq/DemoRseq2D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/rseq/DemoRseq3D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/rseq/DemoRseq4D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/simplexrange/DemoSimplexRange2D01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/simplexrange/DemoSimplexRange2D02.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/simplexrange/DemoSimplexUniform01.kt delete mode 100644 orx-noise/src/jvmDemo/kotlin/simplexrange/DemoSimplexUniform02.kt delete mode 100644 orx-noise/src/jvmTest/kotlin/TestGradient.kt delete mode 100644 orx-noise/src/jvmTest/kotlin/TestMathUtils.kt delete mode 100644 orx-noise/src/jvmTest/kotlin/TestPlaceholder.kt delete mode 100644 orx-noise/src/jvmTest/kotlin/TestVectorShortcutFunctions.kt delete mode 100644 orx-noise/src/shaders/glsl/noise/cell.frag delete mode 100644 orx-noise/src/shaders/glsl/noise/hash.frag delete mode 100644 orx-noise/src/shaders/glsl/noise/simplex3D.frag delete mode 100644 orx-noise/src/shaders/glsl/noise/speckle.frag delete mode 100644 orx-noise/src/shaders/glsl/noise/value.frag delete mode 100644 orx-noise/src/shaders/glsl/noise/worley.frag delete mode 100644 orx-obj-loader/README.md delete mode 100644 orx-obj-loader/build.gradle.kts delete mode 100644 orx-obj-loader/src/commonMain/kotlin/ObjReader.kt delete mode 100644 orx-obj-loader/src/commonMain/kotlin/ObjWriter.kt delete mode 100644 orx-obj-loader/src/jvmDemo/kotlin/DemoObjCompoundRW01.kt delete mode 100644 orx-obj-loader/src/jvmDemo/kotlin/DemoObjLoader01.kt delete mode 100644 orx-obj-loader/src/jvmDemo/kotlin/DemoObjSaver01.kt delete mode 100644 orx-obj-loader/src/jvmDemo/kotlin/DemoObjSaver02.kt delete mode 100644 orx-obj-loader/src/jvmDemo/kotlin/DemoWireframe01.kt delete mode 100644 orx-obj-loader/src/jvmMain/kotlin/OBJLoader.kt delete mode 100644 orx-obj-loader/src/jvmMain/kotlin/OBJSaver.kt delete mode 100644 orx-obj-loader/test-data/non-planar.obj delete mode 100644 orx-palette/README.md delete mode 100644 orx-palette/build.gradle.kts delete mode 100644 orx-palette/src/commonMain/kotlin/ColorBrewer2.kt delete mode 100644 orx-palette/src/jvmDemo/kotlin/DemoColorBrewer2_01.kt delete mode 100644 orx-palette/src/jvmDemo/kotlin/DemoColorBrewer2_02.kt delete mode 100644 orx-palette/src/jvmDemo/kotlin/DemoColorBrewer2_03.kt delete mode 100644 orx-palette/src/jvmDemo/kotlin/DemoPaletteStudio01.kt delete mode 100644 orx-palette/src/jvmDemo/kotlin/DemoPaletteStudio02.kt delete mode 100644 orx-palette/src/jvmMain/kotlin/ColorUtils.kt delete mode 100644 orx-palette/src/jvmMain/kotlin/PaletteStudio.kt delete mode 100644 orx-palette/src/jvmMain/resources/org/openrndr/extra/palette/collections/collection-1.json delete mode 100644 orx-palette/src/jvmMain/resources/org/openrndr/extra/palette/collections/collection-2.json delete mode 100644 orx-palette/src/jvmMain/resources/org/openrndr/extra/palette/collections/collection-3.json delete mode 100644 orx-parameters/README.md delete mode 100644 orx-parameters/build.gradle.kts delete mode 100644 orx-parameters/src/commonMain/kotlin/Annotations.kt delete mode 100644 orx-parameters/src/jsMain/kotlin/description.kt delete mode 100644 orx-parameters/src/jvmMain/kotlin/Annotations.kt delete mode 100644 orx-parameters/src/jvmTest/kotlin/TestAnnotations.kt delete mode 100644 orx-parameters/src/jvmTest/kotlin/TestPlaceholder.kt delete mode 100644 orx-property-watchers/README.md delete mode 100644 orx-property-watchers/build.gradle.kts delete mode 100644 orx-property-watchers/src/commonMain/kotlin/PropertyWatcherDelegates.kt delete mode 100644 orx-property-watchers/src/jvmDemo/kotlin/DemoImagePathWatcher01.kt delete mode 100644 orx-property-watchers/src/jvmDemo/kotlin/DemoPropertyWatchers01.kt delete mode 100644 orx-property-watchers/src/jvmMain/kotlin/ImagePath.kt delete mode 100644 orx-quadtree/README.md delete mode 100644 orx-quadtree/build.gradle.kts delete mode 100644 orx-quadtree/src/commonMain/kotlin/IQuadtree.kt delete mode 100644 orx-quadtree/src/commonMain/kotlin/Quadtree.kt delete mode 100644 orx-quadtree/src/jvmDemo/kotlin/DemoQuadTree01.kt delete mode 100644 orx-quadtree/src/jvmDemo/kotlin/DemoQuadTree02.kt delete mode 100644 orx-quadtree/src/jvmMain/kotlin/ReadwriteQuadtree.kt delete mode 100644 orx-shade-styles/README.md delete mode 100644 orx-shade-styles/build.gradle.kts delete mode 100644 orx-shade-styles/src/commonMain/kotlin/AngularGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/ColorspaceHelper.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/HalfAngularGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/LinearGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/NPointGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/NPointLinearGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/NPointRadialGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/RadialGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/FillEnums.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/clip/ClipBase.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/clip/ClipBuilder.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/ConicGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/EllipticalGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/GradientBase.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/GradientBuilder.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/LinearGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/LumaGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/RadialGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/gradients/StellarGradient.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/image/ImageFill.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/noise/NoiseBase.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/noise/NoiseBuilder.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/patterns/PatternBase.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/fills/patterns/PatternBuilder.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/spatial/HemisphereLight.kt delete mode 100644 orx-shade-styles/src/commonMain/kotlin/spatial/VisualizeNormals.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/clip/DemoClip01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/clip/DemoClip02.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/clip/DemoClip03.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/composed/DemoComposed01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient02.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient03.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient04.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient05.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient06.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient07.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient08.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/gradients/DemoGradient09.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/image/DemoImageFill01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/image/DemoImageFill02.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/image/DemoImageFill03.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/noise/DemoBlueNoise01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/noise/DemoSimplex01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/noise/DemoWhiteNoise01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/patterns/DemoPatterns01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/patterns/DemoPatterns02.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/patterns/DemoPatterns03.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/spatial/DemoHemisphere01.kt delete mode 100644 orx-shade-styles/src/jvmDemo/kotlin/spatial/DemoVisualizeNormals01.kt delete mode 100644 orx-shader-phrases/README.md delete mode 100644 orx-shader-phrases/build.gradle.kts delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/HilbertBlueNoisePhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/KmhfPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/ModPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/PermutePhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/SimplexNoisePhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/TaylorInvPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/noise/UHashPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/rbf/RbfPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/sdf/SDFPhrases.kt delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/spacefilling/HilbertPhrases.kt delete mode 100644 orx-shader-phrases/src/jsMain/kotlin/ShaderPhraseBook.kt delete mode 100644 orx-shader-phrases/src/jvmMain/kotlin/PhraseResource.kt delete mode 100644 orx-shader-phrases/src/jvmMain/kotlin/ShaderPhraseBook.kt delete mode 100644 orx-shader-phrases/src/jvmMain/kotlin/annotations/ShaderPhrases.kt delete mode 100644 orx-shader-phrases/src/jvmTest/kotlin/TestFunctionNameRx.kt delete mode 100644 orx-shader-phrases/src/jvmTest/kotlin/TestPlaceholder.kt delete mode 100644 orx-shader-phrases/src/jvmTest/kotlin/TestShaderPhrase.kt delete mode 100644 orx-shader-phrases/src/jvmTest/kotlin/TestShaderPhraseBook.kt delete mode 100644 orx-shader-phrases/src/jvmTest/kotlin/TestShaderPhrasePreprocessing.kt delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseHash21.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseHash33.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewCoordinate.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewDepth.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseSimplex31.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseTbnMatrix.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseValueNoise21.shader delete mode 100644 orx-shader-phrases/src/shaders/glsl/phraseViewToProjectionDepth.shader delete mode 100644 orx-shader-phrases/src/test/resources/from-url-test.frag delete mode 100644 orx-shapes/README.md delete mode 100644 orx-shapes/build.gradle.kts delete mode 100644 orx-shapes/src/commonMain/kotlin/Shapes.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourAdjuster.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourAdjusterEdge.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourAdjusterExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourAdjusterVertex.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourEdge.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/ContourVertex.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/SegmentAdjustments.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/extensions/TangentAngle.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/extensions/TangentAverage.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/adjust/extensions/TangentReflection.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/alphashape/AlphaShape.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/arrangement/Arrangement.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/bezierpatches/BezierPatch.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/bezierpatches/BezierPatch3D.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/bezierpatches/BezierPatchDrawer.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/ContourBlend.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/Path3DBlend.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/RectifiedContourExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/RectifiedPath3DExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/SegmentExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/blend/ShapeContourExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/bounds/Bounds.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/frames/Frames.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/frames/Path3DExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/hobbycurve/HobbyCurve.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/offset/Offset.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/operators/BulgeContours.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/operators/ChamferCorners.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/Hilbert2d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/Hilbert3d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/ListVector2Extensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/ListVector3Extensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/Morton2d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/Morton3d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/MortonToHilbert2d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/ordering/MortonToHilbert3d.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/path3d/Path3DExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/phrases/BezierPhraseBook.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/Arc.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/BoxGrid.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/BoxIntersection.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/BoxPlace.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/BoxSub.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/BoxSubtract.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/Circle.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/CircleInversion.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/CircleTangents.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/Net.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/Pulley.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleAdjacent.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleAlign.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleGrid.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleIntersection.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectanglePlace.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleSub.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleSubtract.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RectangleTake.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RegularPolygon.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RegularStar.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/RoundedRectangle.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/primitives/Tear.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/rectify/Path3DExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/rectify/RectifiedContour.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/rectify/RectifiedPath.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/rectify/RectifiedPath3D.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/rectify/ShapeContourExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/simplify/Chaikin.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/simplify/RamerDouglasPeucker.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/splines/CatmullRom.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/text/TextShapes.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/tunni/README.md delete mode 100644 orx-shapes/src/commonMain/kotlin/tunni/Tunni.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/tunni/TunniContourEdgeExtensions.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/utilities/FromContours.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/utilities/FromPaths.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/utilities/InsertPoint.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/utilities/SplitAt.kt delete mode 100644 orx-shapes/src/commonMain/kotlin/utilities/WeldAscending.kt delete mode 100644 orx-shapes/src/commonTest/kotlin/TestCircleInvert.kt delete mode 100644 orx-shapes/src/commonTest/kotlin/TestCircleInvertConformal.kt delete mode 100644 orx-shapes/src/commonTest/kotlin/TestHobbyCurve.kt delete mode 100644 orx-shapes/src/commonTest/kotlin/TestRectifiedContour.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour05.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour06.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour07.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour08.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContour09.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/adjust/DemoAdjustContourContinue01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/alphashape/DemoAlphaShape01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/alphashape/DemoAlphaShape02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/arrangement/DemoArrangement01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/arrangement/DemoArrangement02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/arrangement/DemoArrangement04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch05.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatch06.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatchDrawer01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatchDrawer02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatchDrawer03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatchDrawer04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/bezierpatch/DemoBezierPatches01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/blend/DemoContourBlend01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/blend/DemoContourBlend02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/frames/DemoFrames01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve05.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/hobbycurve/DemoHobbyCurve3D01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/operators/DemoRoundCorners01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/operators/DemoRoundCorners02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/ordering/DemoHilbertOrder01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/ordering/DemoHilbertOrder02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/path3d/DemoPath3DProjection.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoArc01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoCircleInversion01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoCircleInversion02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoCircleInversion03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoNet01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoPulley01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleDistribute01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleFitHorizontally.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleGrid01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleGrid02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleGrid03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleIntersection01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleIrregularGrid.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectangleIrregularGrid02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRectanglePlace01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRegularPolygon.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRegularStar01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRegularStar02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoRoundedRectangle.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoSplit01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoTear01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/primitives/DemoTear02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/rectify/DemoRectifiedContour01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/rectify/DemoRectifiedContour02.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/rectify/DemoRectifiedContour03.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/rectify/DemoRectifiedContour04.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/rectify/DemoRectifiedPath3D01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/text/DemoText01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/tunni/DemoTunniAdjuster01.kt delete mode 100644 orx-shapes/src/jvmDemo/kotlin/tunni/DemoTunniPoint01.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/Assertions.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/TestAdjustContour.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/TestChamferCorners.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/TestRegularPolygon.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/TestRegularStar.kt delete mode 100644 orx-shapes/src/jvmTest/kotlin/TestRoundedRectangle.kt delete mode 100644 orx-svg/README.md delete mode 100644 orx-svg/build.gradle.kts delete mode 100644 orx-svg/src/commonMain/kotlin/CSSColorNames.kt delete mode 100644 orx-svg/src/commonMain/kotlin/SVGConstants.kt delete mode 100644 orx-svg/src/commonMain/kotlin/ShapeExtensions.kt delete mode 100644 orx-svg/src/jvmMain/kotlin/SVGElement.kt delete mode 100644 orx-svg/src/jvmMain/kotlin/SVGLoader.kt delete mode 100644 orx-svg/src/jvmMain/kotlin/SVGParse.kt delete mode 100644 orx-svg/src/jvmMain/kotlin/SVGWriter.kt delete mode 100644 orx-temporal-blur/README.md delete mode 100644 orx-temporal-blur/build.gradle.kts delete mode 100644 orx-temporal-blur/src/demo/kotlin/DemoBasic01.kt delete mode 100644 orx-temporal-blur/src/demo/kotlin/DemoColorShift01.kt delete mode 100644 orx-temporal-blur/src/main/kotlin/TemporalBlur.kt delete mode 100644 orx-text-on-contour/README.md delete mode 100644 orx-text-on-contour/build.gradle.kts delete mode 100644 orx-text-on-contour/src/commonMain/kotlin/TextOnContour.kt delete mode 100644 orx-text-on-contour/src/jvmDemo/kotlin/DemoTextOnContour01.kt delete mode 100644 orx-text-writer/README.md delete mode 100644 orx-text-writer/build.gradle.kts delete mode 100644 orx-text-writer/src/commonMain/kotlin/DrawerExtensions.kt delete mode 100644 orx-text-writer/src/commonMain/kotlin/ProgramExtensions.kt delete mode 100644 orx-text-writer/src/commonMain/kotlin/TextWriter.kt delete mode 100644 orx-text-writer/src/jvmDemo/kotlin/DemoGlyphOutput01.kt delete mode 100644 orx-text-writer/src/jvmDemo/kotlin/DemoTextWriter01.kt delete mode 100644 orx-text-writer/src/jvmDemo/kotlin/DemoTextWriter02.kt delete mode 100644 orx-text-writer/src/jvmDemo/kotlin/DemoTextWriter03.kt delete mode 100644 orx-time-operators/README.md delete mode 100644 orx-time-operators/build.gradle.kts delete mode 100644 orx-time-operators/src/demo/kotlin/DemoEnvelope.kt delete mode 100644 orx-time-operators/src/demo/kotlin/DemoLFO.kt delete mode 100644 orx-time-operators/src/main/kotlin/Envelope.kt delete mode 100644 orx-time-operators/src/main/kotlin/LFO.kt delete mode 100644 orx-time-operators/src/main/kotlin/TimeOperators.kt delete mode 100644 orx-timer/README.md delete mode 100644 orx-timer/build.gradle.kts delete mode 100644 orx-timer/src/demo/kotlin/DemoRepeat01.kt delete mode 100644 orx-timer/src/demo/kotlin/DemoRepeat02.kt delete mode 100644 orx-timer/src/demo/kotlin/DemoRepeat03.kt delete mode 100644 orx-timer/src/demo/kotlin/DemoTimeOut01.kt delete mode 100644 orx-timer/src/main/kotlin/Timer.kt delete mode 100644 orx-triangulation/README.md delete mode 100644 orx-triangulation/build.gradle.kts delete mode 100644 orx-triangulation/src/commonMain/kotlin/Delaunator.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/Delaunay.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/DelaunayTriangulation.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/DoubleDouble.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/Predicates.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/SmoothScatter.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/Voronoi.kt delete mode 100644 orx-triangulation/src/commonMain/kotlin/VoronoiDiagram.kt delete mode 100644 orx-triangulation/src/commonTest/kotlin/TestDelaunay.kt delete mode 100644 orx-triangulation/src/commonTest/kotlin/TestVoronoi.kt delete mode 100644 orx-triangulation/src/commonTest/kotlin/TestVoronoiDiagram.kt delete mode 100644 orx-triangulation/src/jvmDemo/kotlin/DemoDelaunay01.kt delete mode 100644 orx-triangulation/src/jvmDemo/kotlin/DemoDelaunay02.kt delete mode 100644 orx-triangulation/src/jvmDemo/kotlin/DemoVoronoi01.kt delete mode 100644 orx-triangulation/src/jvmDemo/kotlin/DemoVoronoi02.kt delete mode 100644 orx-triangulation/src/jvmDemo/kotlin/DemoVoronoi03.kt delete mode 100644 orx-turtle/README.md delete mode 100644 orx-turtle/build.gradle.kts delete mode 100644 orx-turtle/src/commonMain/kotlin/NinjaTurtle.kt delete mode 100644 orx-turtle/src/commonMain/kotlin/Turtle.kt delete mode 100644 orx-turtle/src/jvmDemo/kotlin/DemoTurtle01.kt delete mode 100644 orx-turtle/src/jvmDemo/kotlin/DemoTurtle02.kt delete mode 100644 orx-turtle/src/jvmDemo/kotlin/DemoTurtle03.kt delete mode 100644 orx-view-box/README.md delete mode 100644 orx-view-box/build.gradle.kts delete mode 100644 orx-view-box/src/commonMain/kotlin/ViewBox.kt delete mode 100644 orx-view-box/src/jvmDemo/kotlin/DemoProxyProgram01.kt delete mode 100644 orx-view-box/src/jvmDemo/kotlin/DemoProxyProgram02.kt delete mode 100644 orx-view-box/src/jvmDemo/kotlin/DemoUpdate01.kt delete mode 100644 orx-view-box/src/jvmDemo/kotlin/DemoViewBox01.kt delete mode 100755 updateChangesTxt diff --git a/.gitignore b/.gitignore index 95af1b44..fe3b002d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,11 @@ -.idea/ -.gradle/ -out/ -target/ -build/ -*.iml/ -gradle.properties -/hs_err_pid*.log -/gui-parameters/ -/ShaderError.glsl -/.kotlin -/.lwjgl +*.iml +.gradle /local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/.kotlin \ No newline at end of file diff --git a/CNAME b/CNAME deleted file mode 100644 index b3c682ac..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -orx.openrndr.org \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index ce4b8fff..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,162 +0,0 @@ -# Contributing to ORX - -Thank you for your interest in contributing to ORX :-) - -This repository contains the OPENRNDR extras: a growing library of assorted data structures, algorithms and utilities to complement OPENRNDR. -Other repositories you can contribute to are the [core OPENRNDR](https://github.com/openrndr/openrndr/), -the [guide](https://github.com/openrndr/openrndr-guide/) and the [template](https://github.com/openrndr/openrndr-template/). - -Please read the [general information about contributing to OPENRNDR](https://github.com/openrndr/openrndr/blob/master/CONTRIBUTING.md). -This document focuses on specific details about the ORX repository. - -## How to build ORX - -[See the main readme](https://github.com/openrndr/orx/tree/master?tab=readme-ov-file#publish-and-use-local-builds-of-the-library-in-your-applications). - -## Overview - -There are two types of ORX extras: -- JVM only. Subfolders of `/orx-jvm/`. These run only on Desktop (not in web browsers). -- Multiplatform. Other `/orx-.../` folders. These run both on Desktop and web browsers. - -Each orx folder contains a `README.md`, a `build.gradle.kts` file and a `src` folder. -Please explore several orx directories to get a feel for how they look like. - -Gradle tasks are used to update the list of ORX'es in the root README.md, -and to update the list of demos in each ORX'es README.md. - -## Folder structure (JVM) - -``` -orx-magic/ -├── README.md -├── build.gradle.kts -└── src/ - ├── main/ - │ └── kotlin/ - │ └── Magic.kt - └── demo/ - └── kotlin/ - ├── DemoFoo01.kt - └── DemoBar01.kt -``` - -## Folder structure (multiplatform) - -``` -orx-magic/ -├── README.md -├── build.gradle.kts -└── src/ - ├── commonMain/kotlin/ - │ └── Magic.kt - ├── commonTest/kotlin/ - ├── jsMain/kotlin/ - ├── jsTest/kotlin/ - ├── jvmDemo/kotlin/ - │ ├── DemoFoo01.kt - │ └── DemoBar01.kt - ├── jvmMain/kotlin/ - └── jvmTest/kotlin/ -``` -Note that inside `src` only `commonMain` is required. - - -## ORX README.md - -Assuming you are creating an orx called `magic`, the readme should be formatted as follows: - -``` -# orx-magic - -One or more lines including a short description to display on the root README.md. -One or more lines including a short description to display on the root README.md. -One or more lines including a short description to display on the root README.md. - -Main content describing the usage of orx-magic goes here -... - - -``` - -1. Start with a markdown header with the name of the orx followed by an empty line. -2. One or more lines with a brief description to show on the root `README.md`, followed by an empty line. - (The `buildMainReadme` Gradle task will extract this description and update the root `README.md`). -3. A detailed description (a guide) of how to use the orx, possibly with code examples in code fences like - ```` - ```kotlin - //code example - ``` - ```` -4. If the orx includes demos (more below), running the `CollectScreenShots` Gradle task will append `` - to the readme followed by a list of automatically generated screenshots of the demos and links to their source code. - This is specially useful for orx'es that produce graphical output, but less so for orx'es that interface - with hardware (like `orx-midi`). - - -## ORX build.gradle.kts - -ORX `build.gradle.kts` files declare their dependencies and most follow the same structure. -Please explore various build files and find the simplest one that matches your use case. -Note that the JVM ones are somewhat simpler than the multiplatform ones. - -The `plugins` section includes either ``org.openrndr.extra.convention.`kotlin-multiplatform` `` or -``org.openrndr.extra.convention.`kotlin-jvm` `` depending on the orx type. - -### JVM - -The JVM build files declare separate dependencies for the orx itself (`implementation`) and for usage demos -(`demoImplementation`). -See an [example](https://github.com/openrndr/orx/blob/master/orx-jvm/orx-dnk3/build.gradle.kts). - -### Multiplatform - -The multiplatform build files may have blocks like `commonMain`, `commonTest`, `jvmTest`, `jvmDemo`, etc. to specify the dependencies for each case. See an [example](https://github.com/openrndr/orx/blob/master/orx-color/build.gradle.kts). - - -## I want to contribute to the documentation - -There are various places where you can contribute without writing code. It will be greatly -appreciated by others trying to learn about OPENRNDR. - -### Guide - -The [guide](https://guide.openrndr.org/) is the first contact with OPENRNDR for most users. -[Learn how to work on the guide](https://github.com/openrndr/openrndr-guide/blob/dev/contributing.md). - -### ORX API page - -The [ORX API page](https://orx.openrndr.org/) needs some love too. The content is automatically -extracted from comments written in ORX's source code. It goes like this: - -1. Fork the [ORX repo](https://github.com/openrndr/orx/), then clone your fork (so you - have a copy on your computer) and get familiar with OPENRNDR and ORX. -2. Find an undocumented section at https://orx.openrndr.org you want to explain. -3. Find the corresponding Kotlin file in your cloned repo and add missing comments. Read about - the [suggested style](https://developers.google.com/style). -4. Generate the API website locally to verify your changes look correct by running the following - command: `./gradlew dokkaGenerate -Dorg.gradle.jvmargs=-Xmx1536M`. This will create the - html documentation under `build/dokka/html/`. -5. Open the `build/dokka/html/index.html` in your web browser. If something looks off - tweak your comments. Note: the sidebar will be empty unless viewed through a web server. - You can launch one by running `python3 -m http.server --bind 127.0.0.1` in the html folder. -7. To continue improving the API go back to step 3, otherwise send a Pull Requests from your fork. - - -## Demos - -ORX'es often include a `jvmDemo` folder. This folder should contain small programs demonstrating -how the ORX can be used. When the build system runs the -[`CollectScreenShots`](buildSrc/src/main/kotlin/CollectScreenShots.kt) task, -the `SingleScreenshot()` extension will be injected into each program found inside the `jvmDemo` -folder, then executed. A PNG screenshot is saved and pushed into the [`media`](https://github.com/openrndr/orx/tree/media) brach. Finally, links to those PNG images are inserted into the README.md file of each ORX, -together with a link to the source code that produced the screenshot. - -This serves two purposes: it can be useful for the user to see images of what the ORX can produce, -while it can also be usefu to detect breaking changes (in case the demo fails to run, or produces a -blank image). - -## Gradle tasks - -* `CollectScreenShots` -* `buildMainReadme` diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ab2fa95f..00000000 --- a/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSD 2-Clause License - -Copyright (c) 2019, OPENRNDR -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. 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. - -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 HOLDER 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. diff --git a/README.md b/README.md deleted file mode 100644 index 845a2dc9..00000000 --- a/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# ORX (OPENRNDR EXTRA) - -[![ORX maven badge](https://img.shields.io/maven-central/v/org.openrndr.extra/orx-noise-jvm?style=flat&color=%23FFC0CB -)](https://mvnrepository.com/artifact/org.openrndr.extra) - -A growing library of assorted data structures, algorithms and utilities to -complement [OPENRNDR](https://github.com/openrndr/openrndr). -Multiplatform, unless they deal with hardware or depend on binary libraries. Those are JVM-only. - -Find an auto-generated API documentation page at https://orx.openrndr.org/. - -## Usage - -To make use of these extensions clone the [OPENRNDR template](https://github.com/openrndr/openrndr-template), uncomment the ones you need in its [build.gradle.kts](https://github.com/openrndr/openrndr-template/blob/master/build.gradle.kts) file, and reload Gradle. Cloning this repo is optional but useful to run the demos in each ORX folder, to study the source code, and to contribute to existing or new ORX'es. - - - -## Multiplatform - -| name                                     | description | -| --- | --- | -| [`orx-camera`](orx-camera/) | 2D and 3D cameras controllable via mouse and keyboard. | -| [`orx-color`](orx-color/) | Color spaces, palettes, histograms, named colors. | -| [`orx-composition`](orx-composition/) | Shape composition library | -| [`orx-compositor`](orx-compositor/) | Toolkit to make composite (layered) images using blend modes and filters. | -| [`orx-delegate-magic`](orx-delegate-magic/) | Collection of magical property delegators. For tracking variable change or interpolate towards the value of a variable. | -| [`orx-easing`](orx-easing/) | Easing functions for smooth animation or non-linear interpolation. | -| [`orx-envelopes`](orx-envelopes/) | ADSR (Attack, Decay, Sustain, Release) envelopes and tools. | -| [`orx-expression-evaluator`](orx-expression-evaluator/) | Tools to evaluate strings containing mathematical expressions. | -| [`orx-expression-evaluator-typed`](orx-expression-evaluator-typed/) | Tools to evaluate strings containing typed mathematical expressions. | -| [`orx-fcurve`](orx-fcurve/) | FCurves are 1 dimensional function curves constructed from 2D bezier functions. They are often used to control a property over time. `x` values don't have any units, but they often represent a duration in seconds. | -| [`orx-fft`](orx-fft/) | Simple forward and inverse FFT routine | -| [`orx-fx`](orx-fx/) | Ready-to-use GPU-based visual effects or filters. Most include [orx-parameters](https://github.com/openrndr/orx/tree/master/orx-parameters) annotations so they can be easily controlled via orx-gui. | -| [`orx-gradient-descent`](orx-gradient-descent/) | Finds equation inputs that output a minimum value: easy to use gradient descent based minimizer. | -| [`orx-hash-grid`](orx-hash-grid/) | 2D space partitioning for fast point queries. | -| [`orx-image-fit`](orx-image-fit/) | Draws an image ensuring it fits or covers the specified `Rectangle`. | -| [`orx-integral-image`](orx-integral-image/) | CPU and GPU-based implementation for integral images (summed area tables) | -| [`orx-interval-tree`](orx-interval-tree/) | For querying a data set containing time segments (start time and end time) when we need all entries containing a specific time value. Useful when creating a timeline. | -| [`orx-jumpflood`](orx-jumpflood/) | Calculates distance or direction fields from an image. GPU accelerated, 2D. Results are provided as an image. | -| [`orx-kdtree`](orx-kdtree/) | Fast search of points closest to the queried point in a data set. 2D, 3D and 4D. | -| [`orx-marching-squares`](orx-marching-squares/) | Tools for extracting contours from functions | -| [`orx-math`](orx-math/) | Mathematical utilities, including complex numbers, linear ranges, simplex ranges, matrices and radial basis functions (RBF). | -| [`orx-mesh-generators`](orx-mesh-generators/) | 3D-mesh generating functions and DSL. | -| [`orx-mesh-noise`](orx-mesh-noise/) | Generate random samples on the surface of a mesh ## Demos ### DemoMeshNoise01 | -| [`orx-no-clear`](orx-no-clear/) | Provides the classical "draw-without-clearing-the-screen" functionality. | -| [`orx-noise`](orx-noise/) | Randomness for every type of person: Perlin, uniform, value, simplex, fractal and many other types of noise. | -| [`orx-obj-loader`](orx-obj-loader/) | Simple loader and saver for Wavefront .obj 3D mesh files. | -| [`orx-palette`](orx-palette/) | Collections of color palettes and tools for interacting with them. | -| [`orx-parameters`](orx-parameters/) | Provides annotations and tools for turning Kotlin properties into introspectable parameters. Used by [`orx-gui`](../orx-jvm/orx-gui/README.md) to automatically generate user interfaces. | -| [`orx-property-watchers`](orx-property-watchers/) | Tools for setting up property watcher based pipelines | -| [`orx-quadtree`](orx-quadtree/) | A [Quadtree](https://en.wikipedia.org/wiki/Quadtree) is a spatial partioning tree structure meant to provide fast spatial queries such as nearest points within a range. | -| [`orx-shade-styles`](orx-shade-styles/) | Shader based fills and strokes, including various types of gradient fills. | -| [`orx-shader-phrases`](orx-shader-phrases/) | A library that provides a `#pragma import` statement for shaders. | -| [`orx-shapes`](orx-shapes/) | Collection of 2D shape generators and modifiers. | -| [`orx-svg`](orx-svg/) | SVG reader and writer library. | -| [`orx-temporal-blur`](orx-temporal-blur/) | Post-processing temporal-blur video effect. CPU intense, therefore not intended for use with the `ScreenRecorder` extension or other real-time uses. | -| [`orx-text-on-contour`](orx-text-on-contour/) | Writing texts on contours. | -| [`orx-text-writer`](orx-text-writer/) | Writing texts with layouts | -| [`orx-time-operators`](orx-time-operators/) | A collection of time-sensitive functions aimed at controlling raw data over-time, such as Envelope and LFO. | -| [`orx-timer`](orx-timer/) | Simple timer functionality providing `repeat`, to run code with a given interval and `timeOut`, to run code once after a given delay. | -| [`orx-triangulation`](orx-triangulation/) | **Delaunay** triangulation and **Voronoi** diagrams. | -| [`orx-turtle`](orx-turtle/) | Bezier (`ShapeContour`) backed [turtle graphics](https://en.wikipedia.org/wiki/Turtle_graphics). | -| [`orx-view-box`](orx-view-box/) | To create independent views inside one program window. | - -## JVM only - -| name                                     | description | -| --- | --- | -| [`orx-axidraw`](orx-jvm/orx-axidraw/) | GUI for configuring and plotting with an Axidraw pen-plotter. | -| [`orx-boofcv`](orx-jvm/orx-boofcv/) | Helper functions to ease working with the BoofCV computer vision library and its data types. | -| [`orx-chataigne`](orx-jvm/orx-chataigne/) | Expose variables to [Chataigne](http://benjamin.kuperberg.fr/chataigne/en) and any other applications that can interface with it. The current implementation makes use of the OSC protocol and supports `Double` and `ColorRGBa`. | -| [`orx-depth-camera-calibrator`](orx-jvm/orx-depth-camera-calibrator/) | Class to help callibrate depth and transformation matrices when using one or more depth cameras. | -| [`orx-dnk3`](orx-jvm/orx-dnk3/) | A scene graph based 3d renderer with support for Gltf based assets | -| [`orx-file-watcher`](orx-jvm/orx-file-watcher/) | Monitor files on disk and auto-reload them if they change. | -| [`orx-git-archiver`](orx-jvm/orx-git-archiver/) | An extension that hooks into `Program.requestAssets` to commit changed code to Git and provide filenames based on the commit hash. | -| [`orx-git-archiver-gradle`](orx-jvm/orx-git-archiver-gradle/) | A Gradle plugin that turns a git history and `screenshots` directory into a markdown file. | -| [`orx-gui`](orx-jvm/orx-gui/) | Automatic UI (sliders, buttons, etc.) generated from annotated classes and properties. Uses `orx-panel` and `orx-parameters`. | -| [`orx-keyframer`](orx-jvm/orx-keyframer/) | Create animated timelines by specifying properties and times in keyframes, then play it back at any speed (even backwards) automatically interpolating properties. Save, load, use mathematical expressions and callbacks. Powerful and highly reusable. | -| [`orx-kinect-v1`](orx-jvm/orx-kinect-v1/) | Support for the Kinect V1 RGB and depth cameras. | -| [`orx-midi`](orx-jvm/orx-midi/) | MIDI support for keyboards and controllers. Send and receive note and control change events. Bind inputs to variables. | -| [`orx-minim`](orx-jvm/orx-minim/) | Simplifies working with the Minim sound library. Provides sound synthesis and analysis. | -| [`orx-olive`](orx-jvm/orx-olive/) | Provides live coding functionality: updates a running OPENRNDR program when you save your changes. | -| [`orx-osc`](orx-jvm/orx-osc/) | Open Sound Control makes it possible to send and receive messages from other OSC enabled programs in the same or a different computer. Used to create multi-application or multi-device software. | -| [`orx-panel`](orx-jvm/orx-panel/) | The OPENRNDR UI toolkit. Provides buttons, sliders, text, a color picker and much more. HTML/CSS-like. | -| [`orx-poisson-fill`](orx-jvm/orx-poisson-fill/) | Post processing effect that fills transparent parts of the image interpolating the edge pixel colors. GPU-based. | -| [`orx-processing`](orx-jvm/orx-processing/) | orx-processing is a module designed to facilitate seamless type conversions between Processing's types and OPENRNDR's types. It provides utilities and methods that allow developers to integrate the two graphics frameworks effectively by bridging the gap between their respective data structures. | -| [`orx-rabbit-control`](orx-jvm/orx-rabbit-control/) | Creates a web-based remote UI to control your OPENRNDR program from a mobile device or a different computer. Alternative to `orx-gui`. | -| [`orx-syphon`](orx-jvm/orx-syphon/) | Send frames to- and from OPENRNDR to other applications in real time using _Syphon_ for Mac. | -| [`orx-video-profiles`](orx-jvm/orx-video-profiles/) | GIF, H265, PNG, Prores, TIFF and Webp `VideoWriterProfile`s for `ScreenRecorder` and `VideoWriter`. | - - -# Developer notes - -## Publish and use local builds of the library in your applications - -First, build and publish [OPENRNDR](https://github.com/openrndr/openrndr) to the local maven repository: - -Run (or import in IntelliJ IDEA and edit the run configuration). -```sh -# In openrndr repository -./gradlew publishToMavenLocal snapshot -``` - -This command will build and publish a snapshot of the next version of the library to your local maven repository. -The exact version will be shown in the console output during the build process. - -Now you can run the same command again but for this repository. - -```sh -# In orx repository -./gradlew publishToMavenLocal snapshot -``` - -It will automatically use the locally published snapshot of OPENRNDR for building ORX and will publish ORX to your local -maven repository with the same logic as before. - -Once that's done, you can use the local builds of OPENRNDR and ORX in -your [openrndr-template](https://github.com/openrndr/openrndr-template) by specifying the version that was published. - -Take a look at the [wiki](https://github.com/openrndr/openrndr/wiki/Building-OPENRNDR-and-ORX) for a more detailed walk-through. \ No newline at end of file diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 0dd296d4..4111140d 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -6,13 +6,13 @@ plugins { } android { - namespace = "com.icegps.orx" + namespace = "com.icegps.geotools" compileSdk { version = release(36) } defaultConfig { - applicationId = "com.icegps.orx" + applicationId = "com.icegps.geotools" minSdk = 28 targetSdk = 36 versionCode = 1 diff --git a/android/src/androidTest/java/com/icegps/orx/ExampleInstrumentedTest.kt b/android/src/androidTest/java/com/icegps/geotools/ExampleInstrumentedTest.kt similarity index 85% rename from android/src/androidTest/java/com/icegps/orx/ExampleInstrumentedTest.kt rename to android/src/androidTest/java/com/icegps/geotools/ExampleInstrumentedTest.kt index 2973c094..b9233505 100644 --- a/android/src/androidTest/java/com/icegps/orx/ExampleInstrumentedTest.kt +++ b/android/src/androidTest/java/com/icegps/geotools/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.icegps.orx", appContext.packageName) + assertEquals("com.icegps.geotools", appContext.packageName) } } \ No newline at end of file diff --git a/android/src/main/java/com/icegps/orx/ContoursManager.kt b/android/src/main/java/com/icegps/geotools/ContoursManager.kt similarity index 97% rename from android/src/main/java/com/icegps/orx/ContoursManager.kt rename to android/src/main/java/com/icegps/geotools/ContoursManager.kt index ba860cbc..541c54b2 100644 --- a/android/src/main/java/com/icegps/orx/ContoursManager.kt +++ b/android/src/main/java/com/icegps/geotools/ContoursManager.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import ColorBrewer2Type import android.content.Context @@ -7,13 +7,13 @@ import colorBrewer2Palettes import com.icegps.math.geometry.Rectangle import com.icegps.math.geometry.Vector2D import com.icegps.math.geometry.Vector3D -import com.icegps.orx.catmullrom.CatmullRomChain2 -import com.icegps.orx.ktx.area -import com.icegps.orx.ktx.toColorInt -import com.icegps.orx.ktx.toMapboxPoint -import com.icegps.orx.ktx.toast -import com.icegps.orx.marchingsquares.ShapeContour -import com.icegps.orx.marchingsquares.findContours +import com.icegps.geotools.catmullrom.CatmullRomChain2 +import com.icegps.geotools.ktx.area +import com.icegps.geotools.ktx.toColorInt +import com.icegps.geotools.ktx.toMapboxPoint +import com.icegps.geotools.ktx.toast +import com.icegps.geotools.marchingsquares.ShapeContour +import com.icegps.geotools.marchingsquares.findContours import com.icegps.shared.ktx.TAG import com.icegps.triangulation.DelaunayTriangulation import com.icegps.triangulation.Triangle diff --git a/android/src/main/java/com/icegps/orx/ControllableArrow.kt b/android/src/main/java/com/icegps/geotools/ControllableArrow.kt similarity index 98% rename from android/src/main/java/com/icegps/orx/ControllableArrow.kt rename to android/src/main/java/com/icegps/geotools/ControllableArrow.kt index 952ac154..dabb9cae 100644 --- a/android/src/main/java/com/icegps/orx/ControllableArrow.kt +++ b/android/src/main/java/com/icegps/geotools/ControllableArrow.kt @@ -1,8 +1,8 @@ -package com.icegps.orx +package com.icegps.geotools import com.icegps.math.geometry.Angle import com.icegps.math.geometry.Vector2D -import com.icegps.orx.ktx.toMapboxPoint +import com.icegps.geotools.ktx.toMapboxPoint import com.mapbox.geojson.Feature import com.mapbox.geojson.FeatureCollection import com.mapbox.geojson.LineString diff --git a/android/src/main/java/com/icegps/orx/CoordinateGenerator.kt b/android/src/main/java/com/icegps/geotools/CoordinateGenerator.kt similarity index 97% rename from android/src/main/java/com/icegps/orx/CoordinateGenerator.kt rename to android/src/main/java/com/icegps/geotools/CoordinateGenerator.kt index e4cae564..8fc533ad 100644 --- a/android/src/main/java/com/icegps/orx/CoordinateGenerator.kt +++ b/android/src/main/java/com/icegps/geotools/CoordinateGenerator.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import com.icegps.math.geometry.Angle import com.icegps.math.geometry.Vector3D diff --git a/android/src/main/java/com/icegps/orx/DisplaySlopeResult.kt b/android/src/main/java/com/icegps/geotools/DisplaySlopeResult.kt similarity index 98% rename from android/src/main/java/com/icegps/orx/DisplaySlopeResult.kt rename to android/src/main/java/com/icegps/geotools/DisplaySlopeResult.kt index 3f21e13d..3237be5a 100644 --- a/android/src/main/java/com/icegps/orx/DisplaySlopeResult.kt +++ b/android/src/main/java/com/icegps/geotools/DisplaySlopeResult.kt @@ -1,8 +1,8 @@ -package com.icegps.orx +package com.icegps.geotools import android.util.Log import com.icegps.math.geometry.Vector2D -import com.icegps.orx.ktx.toMapboxPoint +import com.icegps.geotools.ktx.toMapboxPoint import com.mapbox.geojson.Feature import com.mapbox.geojson.FeatureCollection import com.mapbox.geojson.Polygon diff --git a/android/src/main/java/com/icegps/orx/EarthworkManager.kt b/android/src/main/java/com/icegps/geotools/EarthworkManager.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/EarthworkManager.kt rename to android/src/main/java/com/icegps/geotools/EarthworkManager.kt index 7dc5cd00..0ed2eb67 100644 --- a/android/src/main/java/com/icegps/orx/EarthworkManager.kt +++ b/android/src/main/java/com/icegps/geotools/EarthworkManager.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import android.graphics.PointF import android.util.Log diff --git a/android/src/main/java/com/icegps/orx/GridDisplay.kt b/android/src/main/java/com/icegps/geotools/GridDisplay.kt similarity index 98% rename from android/src/main/java/com/icegps/orx/GridDisplay.kt rename to android/src/main/java/com/icegps/geotools/GridDisplay.kt index 1e1257d1..43b120a7 100644 --- a/android/src/main/java/com/icegps/orx/GridDisplay.kt +++ b/android/src/main/java/com/icegps/geotools/GridDisplay.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import com.icegps.common.helper.GeoHelper import com.icegps.math.geometry.Vector2D diff --git a/android/src/main/java/com/icegps/orx/GridModel.kt b/android/src/main/java/com/icegps/geotools/GridModel.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/GridModel.kt rename to android/src/main/java/com/icegps/geotools/GridModel.kt index eae4e661..300ad356 100644 --- a/android/src/main/java/com/icegps/orx/GridModel.kt +++ b/android/src/main/java/com/icegps/geotools/GridModel.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import com.icegps.math.geometry.Vector2D import com.icegps.math.geometry.Vector3D diff --git a/android/src/main/java/com/icegps/orx/MainActivity.kt b/android/src/main/java/com/icegps/geotools/MainActivity.kt similarity index 98% rename from android/src/main/java/com/icegps/orx/MainActivity.kt rename to android/src/main/java/com/icegps/geotools/MainActivity.kt index 91ee4fa1..144a0233 100644 --- a/android/src/main/java/com/icegps/orx/MainActivity.kt +++ b/android/src/main/java/com/icegps/geotools/MainActivity.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import android.os.Bundle import androidx.activity.enableEdgeToEdge @@ -10,8 +10,8 @@ import androidx.lifecycle.lifecycleScope import com.google.android.material.slider.RangeSlider import com.google.android.material.slider.Slider import com.icegps.common.helper.GeoHelper +import com.icegps.geotools.databinding.ActivityMainBinding import com.icegps.math.geometry.degrees -import com.icegps.orx.databinding.ActivityMainBinding import com.icegps.shared.model.GeoPoint import com.mapbox.geojson.Point import com.mapbox.maps.CameraOptions diff --git a/android/src/main/java/com/icegps/orx/MainViewModel.kt b/android/src/main/java/com/icegps/geotools/MainViewModel.kt similarity index 96% rename from android/src/main/java/com/icegps/orx/MainViewModel.kt rename to android/src/main/java/com/icegps/geotools/MainViewModel.kt index ccfba229..c33ff667 100644 --- a/android/src/main/java/com/icegps/orx/MainViewModel.kt +++ b/android/src/main/java/com/icegps/geotools/MainViewModel.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import android.app.Application import android.util.Log @@ -6,7 +6,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.icegps.common.helper.GeoHelper import com.icegps.math.geometry.Vector3D -import com.icegps.orx.ktx.toast +import com.icegps.geotools.ktx.toast import com.icegps.shared.SharedHttpClient import com.icegps.shared.SharedJson import com.icegps.shared.api.OpenElevation diff --git a/android/src/main/java/com/icegps/orx/PolygonTest.kt b/android/src/main/java/com/icegps/geotools/PolygonTest.kt similarity index 98% rename from android/src/main/java/com/icegps/orx/PolygonTest.kt rename to android/src/main/java/com/icegps/geotools/PolygonTest.kt index 6b1622a0..223f0635 100644 --- a/android/src/main/java/com/icegps/orx/PolygonTest.kt +++ b/android/src/main/java/com/icegps/geotools/PolygonTest.kt @@ -1,9 +1,9 @@ -package com.icegps.orx +package com.icegps.geotools import android.graphics.Color import com.icegps.common.helper.GeoHelper import com.icegps.math.geometry.Vector3D -import com.icegps.orx.ktx.toMapboxPoint +import com.icegps.geotools.ktx.toMapboxPoint import com.mapbox.geojson.Feature import com.mapbox.geojson.FeatureCollection import com.mapbox.geojson.LineString diff --git a/android/src/main/java/com/icegps/orx/PolylineManager.kt b/android/src/main/java/com/icegps/geotools/PolylineManager.kt similarity index 97% rename from android/src/main/java/com/icegps/orx/PolylineManager.kt rename to android/src/main/java/com/icegps/geotools/PolylineManager.kt index ec1a2a0f..6ae531e4 100644 --- a/android/src/main/java/com/icegps/orx/PolylineManager.kt +++ b/android/src/main/java/com/icegps/geotools/PolylineManager.kt @@ -1,9 +1,9 @@ -package com.icegps.orx +package com.icegps.geotools import android.graphics.Color import com.icegps.math.geometry.Line3D import com.icegps.math.geometry.Vector3D -import com.icegps.orx.ktx.toMapboxPoint +import com.icegps.geotools.ktx.toMapboxPoint import com.mapbox.geojson.Feature import com.mapbox.geojson.FeatureCollection import com.mapbox.geojson.LineString diff --git a/android/src/main/java/com/icegps/orx/RayCastingAlgorithm.kt b/android/src/main/java/com/icegps/geotools/RayCastingAlgorithm.kt similarity index 97% rename from android/src/main/java/com/icegps/orx/RayCastingAlgorithm.kt rename to android/src/main/java/com/icegps/geotools/RayCastingAlgorithm.kt index 2fff7006..bb81f3cb 100644 --- a/android/src/main/java/com/icegps/orx/RayCastingAlgorithm.kt +++ b/android/src/main/java/com/icegps/geotools/RayCastingAlgorithm.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import com.icegps.math.geometry.Vector2D import com.icegps.math.geometry.Vector3D diff --git a/android/src/main/java/com/icegps/orx/SimplePalette.kt b/android/src/main/java/com/icegps/geotools/SimplePalette.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/SimplePalette.kt rename to android/src/main/java/com/icegps/geotools/SimplePalette.kt index 2b1f55c0..9e41de09 100644 --- a/android/src/main/java/com/icegps/orx/SimplePalette.kt +++ b/android/src/main/java/com/icegps/geotools/SimplePalette.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import android.util.Log diff --git a/android/src/main/java/com/icegps/orx/catmullrom/CatmullRom.kt b/android/src/main/java/com/icegps/geotools/catmullrom/CatmullRom.kt similarity index 96% rename from android/src/main/java/com/icegps/orx/catmullrom/CatmullRom.kt rename to android/src/main/java/com/icegps/geotools/catmullrom/CatmullRom.kt index 3a093f77..90ac451f 100644 --- a/android/src/main/java/com/icegps/orx/catmullrom/CatmullRom.kt +++ b/android/src/main/java/com/icegps/geotools/catmullrom/CatmullRom.kt @@ -1,8 +1,8 @@ -package com.icegps.orx.catmullrom +package com.icegps.geotools.catmullrom import com.icegps.math.geometry.Vector2D -import com.icegps.orx.marchingsquares.Segment2D -import com.icegps.orx.marchingsquares.ShapeContour +import com.icegps.geotools.marchingsquares.Segment2D +import com.icegps.geotools.marchingsquares.ShapeContour import kotlin.math.min import kotlin.math.pow diff --git a/android/src/main/java/com/icegps/orx/color/ColorRGBa.kt b/android/src/main/java/com/icegps/geotools/color/ColorRGBa.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/color/ColorRGBa.kt rename to android/src/main/java/com/icegps/geotools/color/ColorRGBa.kt index cd53a619..1f667d36 100644 --- a/android/src/main/java/com/icegps/orx/color/ColorRGBa.kt +++ b/android/src/main/java/com/icegps/geotools/color/ColorRGBa.kt @@ -1,4 +1,4 @@ -package com.icegps.orx.color +package com.icegps.geotools.color import com.icegps.math.geometry.Vector3D import com.icegps.math.geometry.Vector4D diff --git a/android/src/main/java/com/icegps/orx/colorbrewer2/ColorBrewer2.kt b/android/src/main/java/com/icegps/geotools/colorbrewer2/ColorBrewer2.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/colorbrewer2/ColorBrewer2.kt rename to android/src/main/java/com/icegps/geotools/colorbrewer2/ColorBrewer2.kt index 72881db9..2c28d0b3 100644 --- a/android/src/main/java/com/icegps/orx/colorbrewer2/ColorBrewer2.kt +++ b/android/src/main/java/com/icegps/geotools/colorbrewer2/ColorBrewer2.kt @@ -1,5 +1,5 @@ -import com.icegps.orx.color.ColorRGBa -import com.icegps.orx.color.rgb +import com.icegps.geotools.color.ColorRGBa +import com.icegps.geotools.color.rgb /** * # ColorBrewer2 diff --git a/android/src/main/java/com/icegps/orx/ktx/ColorRGBa.kt b/android/src/main/java/com/icegps/geotools/ktx/ColorRGBa.kt similarity index 88% rename from android/src/main/java/com/icegps/orx/ktx/ColorRGBa.kt rename to android/src/main/java/com/icegps/geotools/ktx/ColorRGBa.kt index 05f8c638..a806bd01 100644 --- a/android/src/main/java/com/icegps/orx/ktx/ColorRGBa.kt +++ b/android/src/main/java/com/icegps/geotools/ktx/ColorRGBa.kt @@ -1,6 +1,6 @@ -package com.icegps.orx.ktx +package com.icegps.geotools.ktx -import com.icegps.orx.color.ColorRGBa +import com.icegps.geotools.color.ColorRGBa /** * @author tabidachinokaze diff --git a/android/src/main/java/com/icegps/orx/ktx/Context.kt b/android/src/main/java/com/icegps/geotools/ktx/Context.kt similarity index 88% rename from android/src/main/java/com/icegps/orx/ktx/Context.kt rename to android/src/main/java/com/icegps/geotools/ktx/Context.kt index 8dc5c8d3..14a919d0 100644 --- a/android/src/main/java/com/icegps/orx/ktx/Context.kt +++ b/android/src/main/java/com/icegps/geotools/ktx/Context.kt @@ -1,4 +1,4 @@ -package com.icegps.orx.ktx +package com.icegps.geotools.ktx import android.content.Context import android.widget.Toast diff --git a/android/src/main/java/com/icegps/orx/ktx/Vector2D.kt b/android/src/main/java/com/icegps/geotools/ktx/Vector2D.kt similarity index 96% rename from android/src/main/java/com/icegps/orx/ktx/Vector2D.kt rename to android/src/main/java/com/icegps/geotools/ktx/Vector2D.kt index 327f98e4..d9299900 100644 --- a/android/src/main/java/com/icegps/orx/ktx/Vector2D.kt +++ b/android/src/main/java/com/icegps/geotools/ktx/Vector2D.kt @@ -1,4 +1,4 @@ -package com.icegps.orx.ktx +package com.icegps.geotools.ktx import com.icegps.common.helper.GeoHelper import com.icegps.math.geometry.Vector2D diff --git a/android/src/main/java/com/icegps/orx/ktx/Vector3D.kt b/android/src/main/java/com/icegps/geotools/ktx/Vector3D.kt similarity index 96% rename from android/src/main/java/com/icegps/orx/ktx/Vector3D.kt rename to android/src/main/java/com/icegps/geotools/ktx/Vector3D.kt index 9dd4b0f4..235f5956 100644 --- a/android/src/main/java/com/icegps/orx/ktx/Vector3D.kt +++ b/android/src/main/java/com/icegps/geotools/ktx/Vector3D.kt @@ -1,4 +1,4 @@ -package com.icegps.orx.ktx +package com.icegps.geotools.ktx import com.icegps.common.helper.GeoHelper import com.icegps.math.geometry.Rectangle diff --git a/android/src/main/java/com/icegps/orx/marchingsquares/MarchingSquares.kt b/android/src/main/java/com/icegps/geotools/marchingsquares/MarchingSquares.kt similarity index 99% rename from android/src/main/java/com/icegps/orx/marchingsquares/MarchingSquares.kt rename to android/src/main/java/com/icegps/geotools/marchingsquares/MarchingSquares.kt index ea1e79e3..a1340035 100644 --- a/android/src/main/java/com/icegps/orx/marchingsquares/MarchingSquares.kt +++ b/android/src/main/java/com/icegps/geotools/marchingsquares/MarchingSquares.kt @@ -1,9 +1,9 @@ -package com.icegps.orx.marchingsquares +package com.icegps.geotools.marchingsquares import com.icegps.math.geometry.Rectangle import com.icegps.math.geometry.Vector2D import com.icegps.math.geometry.Vector2I -import com.icegps.orx.ktx.mix +import com.icegps.geotools.ktx.mix import kotlin.math.max import kotlin.math.min diff --git a/android/src/test/java/com/icegps/orx/ExampleUnitTest.kt b/android/src/test/java/com/icegps/geotools/ExampleUnitTest.kt similarity index 91% rename from android/src/test/java/com/icegps/orx/ExampleUnitTest.kt rename to android/src/test/java/com/icegps/geotools/ExampleUnitTest.kt index e7a921d3..f7addbd8 100644 --- a/android/src/test/java/com/icegps/orx/ExampleUnitTest.kt +++ b/android/src/test/java/com/icegps/geotools/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.icegps.orx +package com.icegps.geotools import org.junit.Test diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts deleted file mode 100644 index 8156a89b..00000000 --- a/build-logic/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - gradlePluginPortal() -} \ No newline at end of file diff --git a/build-logic/orx-convention/build.gradle.kts b/build-logic/orx-convention/build.gradle.kts deleted file mode 100644 index 127fc548..00000000 --- a/build-logic/orx-convention/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - `kotlin-dsl` -} - -val preload: SourceSet by project.sourceSets.creating - -repositories { - mavenCentral() - mavenLocal() -} -val libs = extensions.getByType().named("libs") -dependencies { - implementation(project(":orx-variant-plugin")) - implementation(libs.findLibrary("kotlin-gradle-plugin").get()) - implementation(libs.findLibrary("dokka-gradle-plugin").get()) - "preloadImplementation"(openrndr.application.core) - "preloadImplementation"(openrndr.orextensions) -} -kotlin { - compilerOptions { - freeCompilerArgs.add("-Xskip-metadata-version-check") - } -} -tasks.getByName("compileKotlin").dependsOn("compilePreloadKotlin") diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/CollectScreenShots.kt b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/CollectScreenShots.kt deleted file mode 100644 index d23059fd..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/CollectScreenShots.kt +++ /dev/null @@ -1,182 +0,0 @@ -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.FileCollection -import org.gradle.api.file.FileType -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* -import org.gradle.kotlin.dsl.register -import org.gradle.process.ExecOperations -import org.gradle.work.InputChanges -import java.io.File -import java.net.URLClassLoader -import javax.inject.Inject - -private class CustomClassLoader(parent: ClassLoader) : ClassLoader(parent) { - fun findClass(file: File): Class<*> = defineClass(null, file.readBytes(), 0, file.readBytes().size) -} - -abstract class CollectScreenshotsTask @Inject constructor() : DefaultTask() { - @get:InputDirectory - @get:PathSensitive(PathSensitivity.NAME_ONLY) - @get:SkipWhenEmpty - abstract val inputDir: DirectoryProperty - - @get:InputFiles - abstract val runtimeDependencies: Property - - @get:OutputDirectory - abstract val outputDir: DirectoryProperty - - @get:Input - @get:Optional - abstract val ignore: ListProperty - - @get:Inject - abstract val execOperations: ExecOperations - - @TaskAction - fun execute(inputChanges: InputChanges) { - val preloadClass = File(project.rootProject.projectDir, "build-logic/orx-convention/build/classes/kotlin/preload") - require(preloadClass.exists()) { - "preload class not found: '${preloadClass.absolutePath}'" - } - - // Execute demos and produce PNG files - inputChanges.getFileChanges(inputDir).forEach { change -> - if (change.fileType == FileType.DIRECTORY) return@forEach - if (change.file.extension == "class") { - var klassName = change.file.nameWithoutExtension - if (klassName.dropLast(2) in ignore.get()) { - return@forEach - } - try { - val cp = (runtimeDependencies.get().map { it.toURI().toURL() } + inputDir.get().asFile.toURI() - .toURL()).toTypedArray() - val ucl = URLClassLoader(cp) - val ccl = CustomClassLoader(ucl) - val tempClass = ccl.findClass(change.file) - klassName = tempClass.name - val klass = ucl.loadClass(klassName) - klass.getMethod("main") - } catch (e: NoSuchMethodException) { - return@forEach - } - - println("Collecting screenshot for $klassName") - val imageName = klassName.replace(".", "-") - val pngFile = "${outputDir.get().asFile}/$imageName.png" - - fun launchDemoProgram() { - execOperations.javaexec { - this.classpath += project.files(inputDir.get().asFile, preloadClass) - this.classpath += runtimeDependencies.get() - this.mainClass.set(klassName) - this.workingDir(project.rootProject.projectDir) - this.jvmArgs( - "-DtakeScreenshot=true", - "-DscreenshotPath=$pngFile", - "-Dorg.openrndr.exceptions=JVM", - "-Dorg.openrndr.gl3.debug=true", - "-Dorg.openrndr.gl3.delete_angle_on_exit=false" - ) - } - } - - // A. Create an empty image for quick tests - //File(pngFile).createNewFile() - - // B. Create an actual image by running a demo program - runCatching { - launchDemoProgram() - }.onFailure { - println("Retrying $klassName after error: ${it.message}") - Thread.sleep(5000) - launchDemoProgram() - } - } - } - - // List produced PNG images. - // Only executed if there are changes in the inputDir. - val demoImageBaseNames = outputDir.get().asFile.listFiles { file: File -> - file.extension == "png" - }!!.sortedBy { it.absolutePath.lowercase() }.map { it.nameWithoutExtension } - - // Update readme.md using the found PNG images - val readme = File(project.projectDir, "README.md") - if (readme.exists()) { - var readmeLines = readme.readLines().toMutableList() - val screenshotsLine = readmeLines.indexOfFirst { it == "" } - if (screenshotsLine != -1) { - readmeLines = readmeLines.subList(0, screenshotsLine) - } - readmeLines.add("") - readmeLines.add("## Demos") - - val isKotlinMultiplatform = project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform") - val demoModuleName = if (isKotlinMultiplatform) "jvmDemo" else "demo" - - for (demoImageBaseName in demoImageBaseNames) { - val projectPath = project.projectDir.relativeTo(project.rootDir) - - // val url = "" // for local testing - val url = "https://raw.githubusercontent.com/openrndr/orx/media/$projectPath/" - - val imagePath = demoImageBaseName.dropLast(2).replace("-", "/") - val ktFilePath = "src/$demoModuleName/kotlin/$imagePath.kt" - val ktFile = File("$projectPath/$ktFilePath") - - val description = if (ktFile.isFile) { - val codeLines = ktFile.readLines() - val main = codeLines.indexOfFirst { it.startsWith("fun main") } - val head = codeLines.take(main) - val start = head.indexOfLast { it.startsWith("/*") } - val end = head.indexOfLast { it.endsWith("*/") } - - if ((start < end) && (end < main)) { - codeLines.subList(start + 1, end).joinToString("\n") { line -> - val trimmed = line.trimStart(' ', '*') - if(trimmed.startsWith("@see")) "" else trimmed - } - } else { - println("/** comment */ missing in $projectPath/$ktFilePath") - "" - } - } else "" - - readmeLines.add( - """ - |### $imagePath - | - |$description - | - |![$demoImageBaseName](${url}images/$demoImageBaseName.png) - | - |[source code]($ktFilePath) - | - """.trimMargin() - ) - } - readme.delete() - readme.writeText(readmeLines.joinToString("\n")) - } - } -} - -object ScreenshotsHelper { - fun collectScreenshots( - project: Project, - sourceSet: SourceSet, - config: CollectScreenshotsTask.() -> Unit - ): CollectScreenshotsTask { - val task = project.tasks.register("collectScreenshots").get() - task.outputDir.set(project.file(project.projectDir.toString() + "/images")) - task.inputDir.set(File(project.layout.buildDirectory.get().asFile, "classes/kotlin/${sourceSet.name}")) - task.runtimeDependencies.set(sourceSet.runtimeClasspath) - task.config() - task.dependsOn(sourceSet.output) - return task - } -} diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/EmbedShaders.kt b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/EmbedShaders.kt deleted file mode 100644 index cba188c2..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/EmbedShaders.kt +++ /dev/null @@ -1,67 +0,0 @@ -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.FileType -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* -import org.gradle.work.ChangeType -import org.gradle.work.Incremental -import org.gradle.work.InputChanges -import org.gradle.workers.WorkerExecutor -import javax.inject.Inject - -abstract class EmbedShadersTask : DefaultTask() { - @get:Incremental - @get:PathSensitive(PathSensitivity.NAME_ONLY) - @get:InputDirectory - abstract val inputDir: DirectoryProperty - - @get:OutputDirectory - abstract val outputDir: DirectoryProperty - - @get:Input - abstract val defaultPackage: Property - - @get:Input - abstract val defaultVisibility: Property - - @get:Input - abstract val namePrefix: Property - - @Inject - abstract fun getWorkerExecutor(): WorkerExecutor - - init { - defaultVisibility.set("") - namePrefix.set("") - } - - @TaskAction - fun execute(inputChanges: InputChanges) { - - inputChanges.getFileChanges(inputDir).forEach { change -> - if (change.fileType == FileType.DIRECTORY) return@forEach - val name = "${namePrefix.get()}${change.file.nameWithoutExtension.replace("-", "_")}" - val targetFile = outputDir.file(change.normalizedPath.replace(".", "_") + ".kt").get().asFile - if (change.changeType == ChangeType.REMOVED) { - targetFile.delete() - } else { - val contents = change.file.readText() - val lines = contents.split("\n") - var packageStatement = "package ${defaultPackage.get()}\n" - val visibilityStatement = - if (defaultVisibility.get().isNotBlank()) "${defaultVisibility.get()} " else "" - - val r = Regex("#pragma package ([a-z.]+)") - for (line in lines) { - val m = r.find(line.trim()) - if (m != null) { - packageStatement = "package ${m.groupValues[1]}\n" - } - } - val text = - "${packageStatement}${visibilityStatement}const val $name = ${"\"\"\""}${contents}${"\"\"\""}" - targetFile.writeText(text) - } - } - } -} diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/Utils.kt b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/Utils.kt deleted file mode 100644 index eca448a1..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/Utils.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.openrndr.extra.convention - -import org.gradle.api.Project -import org.gradle.kotlin.dsl.named -import org.gradle.nativeplatform.MachineArchitecture -import org.gradle.nativeplatform.OperatingSystemFamily -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform - -val currentOperatingSystemName: String = DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName() -val currentArchitectureName: String = DefaultNativePlatform.getCurrentArchitecture().name - -fun Project.addHostMachineAttributesToRuntimeConfigurations() { - configurations.matching { - it.name.endsWith("runtimeClasspath", ignoreCase = true) - }.configureEach { - attributes { - attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(currentOperatingSystemName)) - attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(currentArchitectureName)) - } - } -} \ No newline at end of file diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/component-metadata-rule.gradle.kts b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/component-metadata-rule.gradle.kts deleted file mode 100644 index 18905da5..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/component-metadata-rule.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -package org.openrndr.extra.convention - -addHostMachineAttributesToRuntimeConfigurations() - diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/dokka.gradle.kts b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/dokka.gradle.kts deleted file mode 100644 index b0692cc4..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/dokka.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -package org.openrndr.extra.convention - -plugins { - id("org.jetbrains.dokka") -} - -repositories { - mavenCentral() -} - -dokka { - pluginsConfiguration.html { - customStyleSheets.from(rootProject.file("dokka/styles/extra.css")) - customAssets.from(rootProject.file("dokka/images/logo-icon.svg")) - } - dokkaSourceSets.configureEach { - skipDeprecated.set(false) - - val sourcesDirectory = try { - file("src/$name/kotlin", PathValidation.EXISTS) - } catch (_: InvalidUserDataException) { - return@configureEach - } - - // Specifies the location of the project source code on the Web. - // If provided, Dokka generates "source" links for each declaration. - sourceLink { - // Unix based directory relative path to the root of the project (where you execute gradle respectively). - localDirectory = sourcesDirectory - - // URL showing where the source code can be accessed through the web browser - remoteUrl("https://github.com/openrndr/orx/blob/master/${moduleName.get()}/src/$name/kotlin") - - // Suffix which is used to append the line number to the URL. Use #L for GitHub - remoteLineSuffix.set("#L") - } - } -} diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts deleted file mode 100644 index 7fab222f..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts +++ /dev/null @@ -1,153 +0,0 @@ -package org.openrndr.extra.convention - -import ScreenshotsHelper.collectScreenshots -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion - -val sharedLibs = extensions.getByType(VersionCatalogsExtension::class.java).named("sharedLibs") -val openrndr = extensions.getByType(VersionCatalogsExtension::class.java).named("openrndr") -val libs = extensions.getByType(VersionCatalogsExtension::class.java).named("libs") - -val shouldPublish = project.name !in setOf("openrndr-demos", "orx-git-archiver-gradle") - -plugins { - java - kotlin("jvm") - `maven-publish` apply false - id("org.openrndr.extra.convention.component-metadata-rule") - id("org.openrndr.extra.convention.dokka") - signing -} -if (shouldPublish) { - apply(plugin = "maven-publish") -} - -repositories { - mavenCentral() - mavenLocal() -} - -group = "org.openrndr.extra" - -val main: SourceSet by project.sourceSets.getting - -@Suppress("UNUSED_VARIABLE") -val demo: SourceSet by project.sourceSets.creating { - val skipDemos = setOf( - "openrndr-demos", - "orx-axidraw", - "orx-midi", - "orx-minim", - "orx-realsense2", - "orx-runway", - "orx-syphon", - "orx-video-profiles", - "orx-crash-handler" - ) - if (project.name !in skipDemos) { - collectScreenshots(project, this@creating) { } - } -} - -dependencies { - implementation(sharedLibs.findLibrary("kotlin-stdlib").get()) - implementation(sharedLibs.findLibrary("kotlin-logging").get()) - testImplementation(sharedLibs.findLibrary("kotlin-test").get()) - testRuntimeOnly(sharedLibs.findLibrary("slf4j-simple").get()) - "demoImplementation"(main.output.classesDirs + main.runtimeClasspath) - "demoImplementation"(openrndr.findLibrary("application-core").get()) - "demoImplementation"(openrndr.findLibrary("orextensions").get()) - - "demoRuntimeOnly"(openrndr.findLibrary("application-glfw").get()) - - "demoRuntimeOnly"(sharedLibs.findLibrary("slf4j-simple").get()) -} - -tasks { - @Suppress("UNUSED_VARIABLE") - val test by getting(Test::class) { - if (DefaultNativePlatform.getCurrentOperatingSystem().isMacOsX) { - allJvmArgs = allJvmArgs + "-XstartOnFirstThread" - } - useJUnitPlatform() - testLogging.exceptionFormat = TestExceptionFormat.FULL - } - - @Suppress("UNUSED_VARIABLE") - val javadoc by getting(Javadoc::class) { - options { - this as StandardJavadocDocletOptions - addBooleanOption("Xdoclint:none", true) - } - } - withType { - compilerOptions { - jvmTarget.set(JvmTarget.valueOf("JVM_${libs.findVersion("jvmTarget").get().displayName.replace(".", "_")}")) - freeCompilerArgs.add("-Xexpect-actual-classes") - freeCompilerArgs.add("-Xjdk-release=${libs.findVersion("jvmTarget").get().displayName}") - apiVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinApi").get().displayName.replace(".", "_")}")) - languageVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinLanguage").get().displayName.replace(".", "_")}")) - } - } -} - -java { - withJavadocJar() - withSourcesJar() - targetCompatibility = JavaVersion.valueOf("VERSION_${libs.findVersion("jvmTarget").get().displayName}") - sourceCompatibility = JavaVersion.valueOf("VERSION_${libs.findVersion("jvmTarget").get().displayName}") -} - -val isReleaseVersion = !(version.toString()).endsWith("SNAPSHOT") - -if (shouldPublish) { - publishing { - publications { - create("maven") { - from(components["java"]) - groupId = "org.openrndr.extra" - artifactId = project.name - description = project.name - versionMapping { - allVariants { - fromResolutionResult() - } - } - pom { - name.set(project.name) - description.set(project.name) - url.set("https://openrndr.org") - developers { - developer { - id.set("edwinjakobs") - name.set("Edwin Jakobs") - email.set("edwin@openrndr.org") - } - } - - licenses { - license { - name.set("BSD-2-Clause") - url.set("https://github.com/openrndr/orx/blob/master/LICENSE") - distribution.set("repo") - } - } - - scm { - connection.set("scm:git:git@github.com:openrndr/orx.git") - developerConnection.set("scm:git:ssh://github.com/openrndr/orx.git") - url.set("https://github.com/openrndr/orx") - } - } - } - } - } - - signing { - setRequired({ isReleaseVersion && gradle.taskGraph.hasTask("publish") }) - sign(publishing.publications) - } -} diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts deleted file mode 100644 index 60dd134b..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts +++ /dev/null @@ -1,198 +0,0 @@ -package org.openrndr.extra.convention - -import CollectScreenshotsTask - -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion -import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask -import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile - -val libs = extensions.getByType(VersionCatalogsExtension::class.java).named("libs") -val sharedLibs = extensions.getByType(VersionCatalogsExtension::class.java).named("sharedLibs") -val openrndr = extensions.getByType(VersionCatalogsExtension::class.java).named("openrndr") - -val shouldPublish = project.name !in setOf("openrndr-demos") - -plugins { - kotlin("multiplatform") - `maven-publish` apply false - id("org.openrndr.extra.convention.component-metadata-rule") - id("org.openrndr.extra.convention.dokka") - signing -} -if (shouldPublish) { - apply(plugin = "maven-publish") -} - -repositories { - mavenCentral() - mavenLocal() -} - -group = "org.openrndr.extra" - -tasks.withType> { - compilerOptions { - apiVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinApi").get().displayName.replace(".", "_")}")) - languageVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinLanguage").get().displayName.replace(".", "_")}")) - freeCompilerArgs.add("-Xexpect-actual-classes") - } -} - -tasks.withType().configureEach { - compilerOptions { - jvmTarget.set(JvmTarget.fromTarget(libs.findVersion("jvmTarget").get().displayName)) - freeCompilerArgs.add("-Xjdk-release=${libs.findVersion("jvmTarget").get().displayName}") - } -} - -kotlin { - jvm { - compilations { - val main by getting - - val demo by creating { - associateWith(main) - tasks.register("collectScreenshots") { - // since Kotlin 2.1.20 output.classesDirs no longer contains a single file - inputDir.set(output.classesDirs.filter { it.path.contains("classes/kotlin") }.singleFile) - runtimeDependencies.set(runtimeDependencyFiles) - outputDir.set(project.file(project.projectDir.toString() + "/images")) - dependsOn(compileTaskProvider) - } - dependencies { - runtimeOnly(openrndr.findLibrary("application-glfw").get()) - - } - } - } - testRuns["test"].executionTask { - useJUnitPlatform() - testLogging.exceptionFormat = TestExceptionFormat.FULL - } - - @OptIn(ExperimentalKotlinGradlePluginApi::class) - mainRun { - classpath(kotlin.jvm().compilations.getByName("demo").output.allOutputs) - classpath(kotlin.jvm().compilations.getByName("demo").configurations.runtimeDependencyConfiguration!!) - } - } - - js(IR) { - browser() - nodejs() - } - - sourceSets { - val commonMain by getting { - dependencies { - implementation(libs.findLibrary("kotlin-stdlib").get()) - implementation(sharedLibs.findLibrary("kotlin-logging").get()) - } - } - - val commonTest by getting { - dependencies { - implementation(libs.findLibrary("kotlin-test").get()) - } - } - - val jvmTest by getting { - dependencies { - runtimeOnly(sharedLibs.findBundle("jupiter").get()) - runtimeOnly(sharedLibs.findLibrary("slf4j.simple").get()) - } - } - - val jvmDemo by getting { - dependencies { - implementation(openrndr.findLibrary("application-core").get()) - implementation(openrndr.findLibrary("orextensions").get()) - runtimeOnly(openrndr.findLibrary("application-glfw").get()) - runtimeOnly(sharedLibs.findLibrary("slf4j-simple").get()) - } - } - } -} - -val isReleaseVersion = !(version.toString()).endsWith("SNAPSHOT") - -if (shouldPublish) { - publishing { - publications { - val fjdj = tasks.register("fakeJavaDocJar", Jar::class) { - archiveClassifier.set("javadoc") - } - named("js") { - this as MavenPublication - versionMapping { - allVariants { - fromResolutionOf("jsMainResolvableDependenciesMetadata") - } - } - } - named("jvm") { - this as MavenPublication - this.artifact(fjdj) - versionMapping { - allVariants { - fromResolutionOf("jvmMainResolvableDependenciesMetadata") - } - } - } - named("kotlinMultiplatform") { - this as MavenPublication - versionMapping { - allVariants { - fromResolutionOf("commonMainResolvableDependenciesMetadata") - } - } - } - all { - this as MavenPublication - pom { - name.set(project.name) - description.set(project.name) - url.set("https://openrndr.org") - developers { - developer { - id.set("edwinjakobs") - name.set("Edwin Jakobs") - email.set("edwin@openrndr.org") - } - } - - licenses { - license { - name.set("BSD-2-Clause") - url.set("https://github.com/openrndr/orx/blob/master/LICENSE") - distribution.set("repo") - } - } - - scm { - connection.set("scm:git:git@github.com:openrndr/orx.git") - developerConnection.set("scm:git:ssh://github.com/openrndr/orx.git") - url.set("https://github.com/openrndr/orx") - } - } - } - } - } - - signing { - setRequired({ isReleaseVersion && gradle.taskGraph.hasTask("publish") }) - sign(publishing.publications) - } -} - -tasks.withType().matching { it.name == "jvmRun" }.configureEach { - workingDir = rootDir - val os: OperatingSystem? = DefaultNativePlatform.getCurrentOperatingSystem() - if (os?.name == "Mac OS X") { - setJvmArgs(listOf("-XstartOnFirstThread")) - } -} diff --git a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/variant.gradle.kts b/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/variant.gradle.kts deleted file mode 100644 index 5630bc03..00000000 --- a/build-logic/orx-convention/src/main/kotlin/org/openrndr/extra/convention/variant.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -package org.openrndr.extra.convention - -plugins { - id("orx-variant") -} \ No newline at end of file diff --git a/build-logic/orx-convention/src/preload/kotlin/ApplicationPreload.kt b/build-logic/orx-convention/src/preload/kotlin/ApplicationPreload.kt deleted file mode 100644 index 36d52918..00000000 --- a/build-logic/orx-convention/src/preload/kotlin/ApplicationPreload.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.openrndr - -import org.openrndr.extensions.SingleScreenshot - -/** - * This [Preload] class is used by the [CollectScreenshots] task to inject the [SingleScreenshot] extension - */ -class Preload : ApplicationPreload() { - override fun onProgramSetup(program: Program) { - program.extend(SingleScreenshot()) { - this.outputFile = System.getProperty("screenshotPath") - } - } -} \ No newline at end of file diff --git a/build-logic/orx-variant-plugin/build.gradle.kts b/build-logic/orx-variant-plugin/build.gradle.kts deleted file mode 100644 index afb6774b..00000000 --- a/build-logic/orx-variant-plugin/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - mavenCentral() -} - - -gradlePlugin { - plugins { - create("orxVariants") { - id = "orx-variant" - implementationClass = "org.openrndr.extra.variant.plugin.VariantPlugin" - } - } -} \ No newline at end of file diff --git a/build-logic/orx-variant-plugin/src/main/kotlin/VariantPlugin.kt b/build-logic/orx-variant-plugin/src/main/kotlin/VariantPlugin.kt deleted file mode 100644 index 67441a88..00000000 --- a/build-logic/orx-variant-plugin/src/main/kotlin/VariantPlugin.kt +++ /dev/null @@ -1,169 +0,0 @@ -package org.openrndr.extra.variant.plugin - -import org.gradle.api.Action -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.Dependency -import org.gradle.api.attributes.Attribute -import org.gradle.api.attributes.Bundling -import org.gradle.api.attributes.Category -import org.gradle.api.attributes.LibraryElements -import org.gradle.api.attributes.Usage -import org.gradle.api.attributes.java.TargetJvmVersion -import org.gradle.api.component.AdhocComponentWithVariants -import org.gradle.api.model.ObjectFactory -import org.gradle.api.plugins.jvm.JvmComponentDependencies -import org.gradle.api.tasks.Nested -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.api.tasks.TaskContainer -import org.gradle.jvm.tasks.Jar -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.named -import org.gradle.language.jvm.tasks.ProcessResources -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform -import javax.inject.Inject - -fun arch(arch: String = System.getProperty("os.arch")): String { - return when (arch) { - "x86-64", "x86_64", "amd64" -> "x86-64" - "arm64", "aarch64" -> "aarch64" - else -> error("unsupported arch $arch") - } -} - -abstract class VariantContainer @Inject constructor( - @Inject val tasks: TaskContainer, - val apiElements: Configuration, - - val runtimeElements: Configuration, - val sourceSet: SourceSet -) { - - @Nested - abstract fun getDependencies(): JvmComponentDependencies - - fun Dependency.withClassifier(classifier: String): String { - return "$group:$name:$version:$classifier" - } - - /** - * Setup dependencies for this variant. - */ - fun dependencies(action: Action) { - action.execute(getDependencies()) - } - - /** - * Specify that this variant comes with a resource bundle. - */ - fun jar(action: Action) { - sourceSet.resources.srcDirs.add(sourceSet.java.srcDirs.first().parentFile.resolve("resources")) - sourceSet.resources.includes.add("**/*.*") - tasks.named(sourceSet.jarTaskName).configure { - include("**/*.*") - dependsOn(tasks.named(sourceSet.processResourcesTaskName)) - manifest { - //this.attributes() - } - this.from(sourceSet.resources.srcDirs) - } - runtimeElements.outgoing.artifact(tasks.named(sourceSet.jarTaskName)) - action.execute(Unit) - } -} - -abstract class VariantExtension( - @Inject val objectFactory: ObjectFactory, - @Inject val project: Project -) { - - fun platform(os: String, arch: String, f: VariantContainer.() -> Unit) { - val sourceSets = project.extensions.getByType(SourceSetContainer::class.java) - - val sourceSetArch = arch.replace("-", "_") - val nameMain = "${os}${sourceSetArch.capitalize()}Main" - val platformMain = sourceSets.create(nameMain) - val tasks = project.tasks - tasks.register(platformMain.jarTaskName, Jar::class.java) { - archiveClassifier.set("$os-$arch") - } - - val configurations = project.configurations - val objects = project.objects - - val main = sourceSets.getByName("main") - val mainApi = configurations.getByName(main.apiElementsConfigurationName) - val mainRuntimeOnly = configurations.getByName(main.runtimeElementsConfigurationName) - - mainApi.attributes { - val osAttribute = Attribute.of("org.gradle.native.operatingSystem", String::class.java) - attribute(osAttribute, "do_not_use_me") - } - - val platformMainRuntimeElements = configurations.create(platformMain.runtimeElementsConfigurationName) { - extendsFrom(mainRuntimeOnly, mainApi) - isCanBeResolved = false - isCanBeConsumed = true - val osAttribute = Attribute.of("org.gradle.native.operatingSystem", String::class.java) - val archAttribute = Attribute.of("org.gradle.native.architecture", String::class.java) - val typeAttribute = Attribute.of("org.jetbrains.kotlin.platform.type", String::class.java) - val environmentAttribute = Attribute.of("org.gradle.jvm.environment", String::class.java) - - attributes { - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) - attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) - attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL)) - - attribute(osAttribute, os) - attribute(archAttribute, arch) - attribute(typeAttribute, "jvm") - attribute(environmentAttribute, "standard-jvm") - } - outgoing.artifact(tasks.named(main.jarTaskName)) - outgoing.artifact(tasks.named(platformMain.jarTaskName)) - } - - val javaComponent = project.components.getByName("java") as AdhocComponentWithVariants - javaComponent.addVariantsFromConfiguration(platformMainRuntimeElements) { - platformMain.runtimeClasspath.files.add(platformMain.resources.srcDirs.first()) - } - - val variantContainer = objectFactory.newInstance( - VariantContainer::class.java, - platformMainRuntimeElements, - platformMainRuntimeElements, - platformMain - ) - variantContainer.f() - - platformMainRuntimeElements.dependencies.addAll(variantContainer.getDependencies().runtimeOnly.dependencies.get()) - - /* - Setup dependencies for current platform. This will make in-module tests and demos work. - */ - val currentOperatingSystemName: String = DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName() - val currentArchitectureName: String = arch() - - if (currentOperatingSystemName == os && currentArchitectureName == arch) { - project.dependencies { - add("testRuntimeOnly", platformMain.output) - add("demoRuntimeOnly", platformMain.output) - for (i in platformMainRuntimeElements.dependencies) { - add("testRuntimeOnly", i) - add("demoRuntimeOnly", i) - } - } - } - } -} - -class VariantPlugin : Plugin { - override fun apply(target: Project) { - val project = target - project.extensions.create("variants", VariantExtension::class.java) - } -} \ No newline at end of file diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts deleted file mode 100644 index f4ca4cd8..00000000 --- a/build-logic/settings.gradle.kts +++ /dev/null @@ -1,29 +0,0 @@ -include("orx-convention", "orx-variant-plugin") - -dependencyResolutionManagement { - repositories { - mavenCentral() - mavenLocal { - content { - includeGroup("org.openrndr") - } - } - } - - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - - // We use a regex to get the openrndr version from the primary catalog as there is no public Gradle API to parse catalogs. - val regEx = Regex("^openrndr[ ]*=[ ]*(?:\\{[ ]*require[ ]*=[ ]*)?\"(.*)\"[ ]*(?:\\})?", RegexOption.MULTILINE) - val openrndrVersion = regEx.find(File(rootDir,"../gradle/libs.versions.toml").readText())?.groupValues?.get(1) ?: error("can't find openrndr version") - create("sharedLibs") { - from("org.openrndr:openrndr-dependency-catalog:$openrndrVersion") - } - create("openrndr") { - from("org.openrndr:openrndr-module-catalog:$openrndrVersion") - } - } -} - diff --git a/build-tools/xvfb-java.sh b/build-tools/xvfb-java.sh deleted file mode 100755 index 2501403f..00000000 --- a/build-tools/xvfb-java.sh +++ /dev/null @@ -1,2 +0,0 @@ -#/bin/bash -xvfb-run -e /dev/stdout java "$@" diff --git a/build.gradle b/build.gradle index c2a58d8c..7b1ef2cc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,144 +1,6 @@ plugins { - alias(libs.plugins.nebula.release) - alias(libs.plugins.nmcp) - id("org.openrndr.extra.convention.dokka") alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.android.library) apply false } - -repositories { - mavenCentral() -} - -tasks.register('buildMainReadme') { - doFirst { - def subProjects = project.subprojects - //.findAll { !it.name.contains("kinect-common") && !it.name.contains - // ("kinect-v1-") } - - // Load README.md and find [begin, end] section to replace - def mainReadme = file("README.md") - def lines = mainReadme.readLines() - - def begin = lines.findIndexOf { it == "" } - def end = lines.findIndexOf { it == "" } - if (begin == -1 || end == -1) { - println("Comments for orx list generation not found in README.md!") - return - } - - def header = lines.subList(0, begin + 1) - def footer = lines.subList(end, lines.size()) - - def newReadme = [] - for (line in header) { - newReadme.add(line) - } - - // Search for the description at the top of the readme. - // Skip the hash character from the headline, then start - // on the next line and continue until the next empty line. - // Don't fall into Windows line breaks. - def descriptionRx = ~/(?s)#.*?\n(.+?)\n\r?\n/ - // Note: the readme needs an empty line after the description - - def orxMultiplatform = [] - def orxJVMOnly = [] - - // Build orx list - for (sub in subProjects) { - def orxReadmeFile = sub.file("README.md") - if (orxReadmeFile.exists()) { - def orxReadmeText = orxReadmeFile.getText() - orxReadmeText.find(descriptionRx) { - description -> - def trimmedDescription = description[1].trim() //.strip() supports unicode, java11 only - .replace("\n", " ").replace("\r", "") - def path = sub.path.substring(1).replace(":", "/") - if (path.startsWith("orx-jvm")) { - orxJVMOnly.add("| [`${sub.name}`]($path/) " + - "| $trimmedDescription |") - } else { - orxMultiplatform.add("| [`${sub.name}`]($path/) " + - "| $trimmedDescription |") - } - } - - } else { - println("${sub.name}/README.md not found!") - } - } - - newReadme.add("\n## Multiplatform\n") - newReadme.add("| name" + " " * 36 + " | description |") - newReadme.add("| --- | --- |") - newReadme.addAll(orxMultiplatform) - - newReadme.add("\n## JVM only\n") - newReadme.add("| name" + " " * 36 + " | description |") - newReadme.add("| --- | --- |") - newReadme.addAll(orxJVMOnly) - - for (line in footer) { - newReadme.add(line) - } - - // Write result - if (mainReadme.exists()) { - mainReadme.delete() - } - mainReadme.write(newReadme.join("\n")) - } -} -group = "org.openrndr.extra" -nmcpAggregation { - centralPortal { - username.set(findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME")) - password.set(findProperty("ossrhPassword") ?: System.getenv("OSSRH_PASSWORD")) - - // publish manually from the portal - publishingType = "USER_MANAGED" - } - - // Publish all projects that apply the 'maven-publish' plugin - publishAllProjectsProbablyBreakingProjectIsolation() -} -//nexusPublishing { -// repositories { -// sonatype { -// username.set(findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME")) -// password.set(findProperty("ossrhPassword") ?: System.getenv("OSSRH_PASSWORD")) -// nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) -// snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) -// } -// } -//} - -subprojects { - // Equivalent Kotlin is: tasks.register("dependenciesAll") { ... - tasks.register("dependenciesAll", DependencyReportTask) { - group = HelpTasksPlugin.HELP_GROUP - description = "Displays all dependencies, including subprojects." - } -} - -dependencies { - subprojects.findAll { - it.name.startsWith("orx-") && !it.name.contains("-catalog") - }.each { subproject -> - dokka(project(subproject.path)) - } -} -class SleepTask extends DefaultTask { - @TaskAction - void action() { - sleep(60 * 5 * 1000) - } -} -tasks.register("sleep", SleepTask) -gradle.buildFinished { - println("\n") - println("orx = \"${version}\"") -} \ No newline at end of file diff --git a/demo-data/.gitignore b/demo-data/.gitignore deleted file mode 100644 index d8406b36..00000000 --- a/demo-data/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**exported* diff --git a/demo-data/cubemaps/garage_iem.dds b/demo-data/cubemaps/garage_iem.dds deleted file mode 100644 index b2347974e792bec589d078e9b1c849c16e9d85af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295040 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

9*ppU-oXl9h6kEK0JU#+F!0?0 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 diff --git a/demo-data/gltf-models/box-animated/BoxAnimated.glb b/demo-data/gltf-models/box-animated/BoxAnimated.glb deleted file mode 100644 index 69481ec3caeb57428c806fdac08bfbe40d19ff55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11944 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 diff --git a/demo-data/gltf-models/directional-light/Scene.glb b/demo-data/gltf-models/directional-light/Scene.glb deleted file mode 100644 index 5145de2271c1609b43bafc5c5589c930875d1118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20756 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

iksGRw~vGH>9a+a}` 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 diff --git a/demo-data/gltf-models/fox/Fox.glb b/demo-data/gltf-models/fox/Fox.glb deleted file mode 100644 index a541b6f44849159c56020d6fc61bec28ea34393b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162872 zcmYe#32|d$U|_JQVPY__XJGIO_V=q+N-Qo;Em5+nR!YtoV9OHptr$LH%`&b z1zAL<@@)^Hc+qM02ym zG*fdk<20j0V>1ggv!rB*rH;kDOo8Q=@}^1>L?{9C#Mz{=NA<#Sw&YXC6%V7r51%{rj{#N z8R#e_=jRsW=cVSAgj5!!Dp{Et8kvCvOY=&UtPIVKEOeAgz!FMfuFl3vI!Z~EC8_>t zY2es0&{4|G%u}+8)-^QJGqp4_H?%M`GBLKWG&8Z#(KXOBG%_?dF)=qYvoJO^wzM!X z)X}xD&@-?!H83zVGBPkXFg7%b)lte#tWdIw#$trIg`TB>xuJ!HiJ_^fk-4#nj+vRB znURTwnUR^ffrX`oiAij&4yu<7L9Qp>OGfBkBFa2tkR@1y$OO$iLt_gg6Ld3;FoKbk zSTIpSH_wzNpunVFfHo0u6I zTbde~VMd!Nxt4~xI%9eP%``(}P&&pJ#z?*(#y}%8Q*bW9oz6%!(Ad(#1eB(zW}vCD zp%GOLG&3_HP+E}aWphh23#z)%(#Vp!kz#0I2Ffc`OgDyxmZsE=7EscrZoC+pm>Ezv zVhl|!jj0?n=0;}J%`b))rj}HW8B0qe>c)(bp^*u7W5&qH)SS98V`OY;Kw-?7QBV~a zW7LgkRe_PIkuinwj8;Dy6Ee>b(T2iVLmKFr8(0_{8yg!Mo0ypz8d?ynAwg9Tf#ii` zF>#fe1)=0cs)^=?gfc$KCYlf`l1VnvoKQ_ks)-f`22_q23nL2x8J}b~63qA{n`l9( zNG8=pOG84HCCMh55NgDbY$CXegs+J}qKTkx9DyR4WD|`E70D!gE|^ zLqkICOH$ovXhNvfPqK;TCIl)=LMEbBmX?H?z^LXCtS*g>3`nTnu+}nY)ujocv}j~X zxI<~EXJ`tpE)5J#O-u|eEKM=S0nqAwV4GnQ13 z8B2;|2Ccd@G$PdYM=i_<*O!Dl{ir6IDAmU5C_yF^GV}8wL-ffRpm~NI2&Wi4{9gnf ztS?C{N{39711@WGGoF73G&CmVie6Ye9pLl;5!f$|83F2XLvk|aQl5dsMoOPVkwm?#Xfr3%8C152_1 zjV=&yA(nJuL@+Ud+udjh!-!yN0{I+0`Yq7Ih{=BA)oS!5GTK@)-? z0hlMiQIAW%g@HMA^(@R2CI;ZKaAXtkdcx4q!WgvF3#0*NhM_5_X9W_0IRbBF7#doF zS2=++z>F|5GdD8(8SEl4BW2C%uP&Bg(%3)%uR(XyjB8>>KEjt zgH{kDtI!XmeMZT#ei8(o$$wB$0=^1&c#l@f% z^+}1vsm}R1`9&eA6(yxbsUWe;yp+@mB`bqk9i?2T9=F8gl6=T8a}i8CTujf@q899q z)Zz@N(-Dp^1X*5`nVVUXSq7C%EGa3XlXsN%XJJut}?YWFfjz}lCUr`wlFp{*D=tuFfcc;v@`;(Fg7+Y zHV2u8>MBDcJqxfW3@y!!EG!Moj6k7^9*E{TmO9}51kk8ViibGGDBb|HaRJRK26_gD z<|g0;xuDRnFf_0*(lOApw6wGUdEdaq%+%D#%n&1lj12Y6Oij&AO$;n7jbXuW0N#6H zWNK<=Xli6^Vr*`zV}R~F3*HvnxGz;Kqafw8f=pXiGhKUg{g_5siBF5xv_~Q$Vx*qV@m^5BLg!_6LV8jQ;dKxG}bdVH?uS|FgGHT_n3!1_8JU_|8iBW$n1lA0SQ=Sa7#bQHn1M2zp1FacrKP#Ck%@(ck*TEx z7FS#7nVFkg8XB9KnVOq}jMULJ(KE6%H#RXawlp>XB|< zC}p7f%Pqes73?i@G;e|8LeIe1+|bC>!qU>*+}OkdwC)F-*o+MgOfAg}O+XtYutck| zo`H#}p%F+4C~F{s7}aWz#JrSv1JLFlq~xRvO5#Qa#^xrVz%enmG&e8=hns1o;&11E18i5=5G?L<>A{ny@rC zGBdO^GBU6<0p(hdH3kL-78XXJ0?*LQ%*4dV!rT-j3|bCgVQyk+WN8ViaE*09WwMch zrGbHgnW3eDv89nYW=e*p33C$*0~0f_LC_>&Vq{=$Zf0y|Zlt3NP7{_E<_2b`*Q=4OVbCgzr) zrmKOaC1yB6(}SUfxuu1Lk%b|o8Zt4pv;?Joa|07Y14C0YEa?GMBSS-Qk%A~wkZN>8kUqHY zL2211H60u&7!?S}9R>!5=7#2`MnoYMm)-lyHG&L~*wONb|EG^9pEFoFZ z0+gXag*Ir3A~^XYIo}AS)`2-66o2Sd4x~|HY-V9#Vr*_XlP~%N>!FdmKFvU zCZ-lP&2i>> zmL^6PhK81Arj{n4rWR)E0)-3MF`$4!t2`hjl&Oiik%fhkrHQ41rGb$Ns5G@OHUs(E z)ZEb0z|0hz&8B+h=9ZSm7G{>_7KSF4CRh`g5y;8#U;(!aU?~i}1^_u+&(h4&($oUv z6$4WfQ)6&hZ)9R@WNu(!W^Q0=X=s7XEzs0tZfRs}Y60G32T4t!;sES46GLcSZ)R*} zWNBz>U~FlKk(fYv7t^Um@did%igjHBJxFS@0JX*pOpPookWv#Uc8x);70kjDlA0`x zjZHv_9NdJ&EGdmZEgDp}fMXEU+(s+vq50C(*u>Pt)YQV<%)-Ff(99SdnkJ^^mIju_ zp#7L;7LX>Ug@uKsrG&O-y&o%qdANQnIo%H?jn8Lxl@iT7dh}#mT98sgRx^hz03O!g`ek;65g( ziwF_V%mZzuPIb!6OYu!CDauR+^=3_Ul(InGLy!_99b+969a9}M9djKEQ18P)$Iwv6 z&`8J7SjW%=+@~|sF*FDD>fe?? zdgvgtk!Ft#bd-woON)|04zG=^RZviPW5dMYQE==OMy-g-pz67XAg4v zS(57XO?|b4-lsGtiG!I=6Bar+l-T4ru^lgUvMil7$4Df>X{CLu)7w?~4!o;_oa+6` zQPf}Cebj!bc8t>u>sA!=Pgp28dKP3ky?)|@qCR~Ci=%T-pp)7I9j6!P*%y{y(1g*1P76ln~tljmpd-^nc*<&cem5M zLLaBPGzmw8!WJj?_0CSmsy!X6FU)mftMGDa+D@*k#SWQ-B|0RwXgYo86*+_) z7iE3799(R;oeq1q99;5ntwZB)4kwQY`Gbu8K{BsXn4NS&-Gxw9P=6mQx4FuZU~`djZfbI9n~8HfFA`y9`%op=aYJ+hiPu6nXM+a#O>B{~ji zEt=tQ?c09Ga;-UsRJ_$3j1NzC^nJ7rMI6~oWOMF+JmXN5%;{vAEq{|f+?K#s4hxY@IxgbF!HvOaLsJ;WOJO_ z9ys(Yv2d!F6>viKuaY~LLU9|W1-^`gAIp}(=BpZMNX5*`NAgNQdad%ykk|uYMf~sSue7BWP5Shg{&S~ z&D`0{2VnIDa=0Ov56E$ioCfOFKc6jGtLK!XCFq3AMvgmVy=dwD0IaSt>%4XVRtJ4k zUwr^p?;xl12@4$#!0Mp%)%gct_0Fk1NB6_(8f3k=%sgSCa1d4prEg$42&;FH#b2D0 zKM1RX6wWR@0IPS{m?s>7)iou@N)N#5pyfU@4#4W2W7VDqVRcPin#4g^9fX|Uk=_5` z-5hv0Age*nv&ia^>mB6qME1+~(1!Zcolksrv0azV`%r5J@ zbpTdRA?rm>C&+b;_@RRRpgQQhM(aUjHgbAH){87I&p6=#tgb2ig5jZ4VB> z>K!F_u7j|;200v%)g$L+WWOV)Vd$YG9Lk07&=(*Uww32424)=NIIBgsd0YFUWZcS6zmz9=RMwW+U5$Y$kGl0l7Vi z+=fJE>pqotg!v0uFR~ku-HF^TMP?)0h1^d;W+R)4tQWaVL#vnJeM4k5$Yl<)dSo@o zh!Qf@gOq0@sy%tnlQi9ln45b$a-()?v=?DY;rnKn0v5KcfCy5 z(MG3-3rr6>H1Br^Y$Y6R*#KgUEWP*orzTA4zgzekgWmj*hnD z32|2^EgkVgmRt`Vx^kSHrk++lgsgXIvxVc2scuehtdAZZp0^zT?;VVU7%9$Z*}~ozE-;Se5=!6uC0y-ES^hU=InQJpT^*HD$v+* zy;r!?&+zpq>Z8qmI`}iUI(zBgH!ciB`0L@wJ)bSY_gr;be&rjWh@I> zJ@VKTvib{k+_MikOm>>HLB;8e^v~J%%le!y?e#%1AK9JA>XG}`$mS#W-;v#bY%lWo z7_wgE@idodG7kH`RygTyPD2?F^q&+r=dDed)4cR7l(9i%dvWPS&PRKG$vd)H`#O33 z;YA5IWcMJuAKA^wenECKvKr*{hMZ=Q^AvL0LoUNbxJ4b=UNSm8{5IhrvU=ovSK)HO zVa2hPj@mnt4g8!iowJI+0q zIg#859=}D-BglE`&N2?!XD+4SF-Bx@P#L2BF~NzWUKu6dA^Y)jucc#5+!sgQuU8Ku z`xm(``{nb<;bbVIQ~0~~gUI;~IX^x=DCqdY>AqtuKPSpKC$jq8`u81zr#^5@kQX|n z*}&u|mp9At$O4H&yLovW#p504)>4LInKA1Je1`) z-$CPBuj87(?1!{ZO>x+{exl>5CcZ<+ZbPnjkkx1Co^&`kXO5%4k<=kUo(B%pb<5|2$l-~s9$5{t`;qNM_AhdIW&T0Uku~JGW4eBWyW>u*YV_;3`gX4Ca6!e$xO>BY2Q`HA0pxh!=Aozv{qe*!j3F` za6snHJI7}$51{BpX=5Obmm=GX%tm%UvU{dgh{*nA_H#0L?|5id%0`ERi~uK_PpXHO zJ~`!Ju*BTy++H`7Ixhb!r(?F@Nynr!IfpKBe|Gp_sOWTRq3xkPWzP@5>JGV!+Yi9Z zvEx2}0A>y{ThHkG0c?6ziherm%;j>@@@qVVY!~tvGIGAYqQNRV!)T!+Giwscm^QLr zWcA2n+UXtJ9BLMbI{hwfIfQI4@|ZSqe+^kZvKr*Hhn!E5(?4?ki(GCXmnX>Kk6dmb zmy^h42(lVndXeoyE+3HVT;%c%x&B4A7g;Ye(ikstJ&SB6a-HZRrR}(DPN7pWKRZf2 zj;t3sts=J>kkc)we1?q^BDW8b>m%fP2ibh&dKtOQN3IL}Cn4%ht+OcaKLG2aA*(^w z+jvUxAgs^D8Ln^;)-OXI-#}&~k5M4&J+MRmAgs^j(7gWutY3!QUqfc2)eCUFG6E(C z4?YWVdL&Td7@Mqk@E@0$Q$b|`C?6e!wHc7x52pf+55oFK$a<&PiXMdZ^^oi6S{?0! zuznx1n~}wrHd`Eo_4|;;k;4snd=)uNk{v}4!uof};Ug!ico5dtL#`u`>m6jjM4SCQ z0PEi&>z(MNc903$*L(GH>H%2)4p}{NpAoqZLhjcfvq5DPENqeWB9D6@&mZA(19BON zT<;*e4OtvH96)gjtK*Qz-f`KBJhz1$4#?_VrpX+D^%Ifj#gOOkkmnST>n~(CAgf0< z6L~BMIjr{ll0OLRKO(ya+0D4Z5Lpefn~~Ena=u1RlgQ~-gj@6=te=QHwu!8_!sWsN zSU(ZDd_cAr*}ur~3yLpn^%`>j5v^W>=SSpxhg=VW$}U(x5jp=N=fTgtmIq<|L}dRW z`|+30qXV#hBJ%hxa-MyBQ1BqEpNMQe^88nw{`~{6ej>77t_G%qus-8iKCXkXe&SqS zo`b5;{v)y*^c?3Ofb|)X$1SyWPac5v2c-)h9Dwx!1$iDEP>1#nwXXIafb|E>MQ0v> z^+Ww$OgjMU8zRRw=bIk~V0}PjHz0=_vKnN)+NY)*fc0mQ?Lu|~a{0DozQ93PAJF`R z+Cfmi57akA9&cwW+j{`k2eduje*mNg)Hg({_u=BmWht_HWOI<+fLs@=6#YB^>qFTg z^}mq&T=`!)55oF!$aw*|PlsIRBG=={Y~*?$Sue61kmp{J?M2Ra$n`#Qn*>=s@?0>o z-t>-b2Vng;Q{*}nxs8qN2IO)Q*-YfR3AsK(u5*#qAlK1JQrZV${X68eikv=?(=({d zgw=7#^#XF;fn1j%*Oka_KrWM!>n!B*8M*#KR*!5ia=nIZ4zhY=zaZyvo4RrEy(JT>ptW<3%M>pt|O4sJaT!CJXeccN4(!Hd=S=mLrzP`Wf5}Og`6Ic;}N-> zL~germvzWyBAbI;7a-RW$o3+$k<${gUgWYAxtvGVi(GCam-EPeLDq|`9@$>xv03DP zG;;qMnTpd8DutcI3Vjq_6xFqk;4I*jqFEc zy~t~0kjIpe$B~fRqR8bHav6m@zJ%;%Tz)}TADgV`2pXdZt}FnJSHRiG@s4b!jDU$F zY2dvR-6ypcK@KbAxI?!W<}c)O1DTENFJ!&QenD2FvR>r*S(JHOr1@NAHz1E)BkM)(rz5wKklRAYY~=nvvR>qVItv{g=QY}cw`_ah#Yh*U^oDQ;H^9^vF61$7(fnT_-eW+RVR zAnQe*BS2o)ggn=b%toF&K-P;aj=Y`qQO|Wd9=1vm@(89;-n%#{sFVMqY<=|MVA!JhKMJ`L?Vm>x+=r z;k-7U=pekU+hN^0_Cv_#AnWb-7j<0t<)uULDegnem+v~%id?gu*2j4WSv=#esN<7K zz7Ba`m{HagA+JF~){AUD^4u=RjU^6~W?poNe9MZmRtni|$o3+ekG!@DS&iG?O%7of z3+!AN?j1z-?;OW|hoI1(drO!9KZvXbS$rRpsN%e&6OO<~Q5%=-Z_ZN4b6MB|hv%(VN9H*P+m| zbgxZWrz0}k+=|<==e^n9Ps=(Tb@sD4#(fsBKfhuZie6;DBkM&Lx5(mk?6h9uppe<_ zh-~Jncn-%2i}pHHCQL;MlTPl(4mKCk>~^j>i6V|1Cdht4HXqqcWH%$XZ;{)a$n8?( zJdV890y!Tcw{MZ#y~yotxbdIbZxr{>2 zcgX6I%|UhpvU=q50oe`6c^uhZWWC7w5jo!>=XYfF$l}Q6Ba0)K54g-n_6xGxkkuoH z1G3wY%LL@LQpouZxqLttM^2x}`4@RS1i9Qm&a=pQ8CQ9NJhp>eo*?HzWcMSx6WMLZ zZbr^W$axl7J#zj+whNc}$axmItU%81$ZTXa$aW!%BioDYPGt4SenB=LnT=c~BfAs1 ze|P`%mjkeRA9+p|xv%uvc;W$Ay^lN&k8Dn%zvw|&y^m}r^X0n-U~K@eyP^kS^**wC zWHXV~BhN=8o5^uw$pKiskL*t5d2nR&k===GCbAl2y>5Fq9e}j~<~a5rfYtlR;ef1W zK9lG{SiO&|9@#I*YLLSLnLSte-vL;?kL)&NHnJLvf_n#G?Ez#qvfGfu3VHroormEd ztlmeSA5odvdjM9~d!%hW0BZvv>wW9WauC)AC_Z-Y0Ic4R$$5AH)*i^$-FE=i1_*gS ze*o4V2uqm+XCtc-yWMzzzZ23PKz7@zc#eaxy4CPK-$A4{zyVkrAd6@20a(3{ zY$md}&VIIouzKIziu)j}J%CF+ayTHfk@Z?+@g9V=2aw&_$^G~MQoRokE97uH`gSSY z{m5=WHWS&+$mS!D;UJF@A&&*&%Gb#AcgW){$YVsvV=u^g5INr=n~$8=kj0V5k&x3Q za-Kpq6FJQzr)^|6AnQfWYslpZvR-6+kXF&VW+Imr$YvtD0ojkpdXd#5hY51NM$T)`vtTg6wAG{EM8wko6+lg)EM2FLM4x&hN-&4zf71UC3&X z*~o4~b_23rWHXWdh%AomHsmq~x!r}_PC#x~AhVI%Z^(L);~F^)AeUpvY-GP6>qV|F zkkbINn~~YbW}@kZ_eqi6iQMKyW+S&Vk^8gAZBFDq8gf`6vvKJ~ZUZB?>yXVvW+S(y zk@X_imB@3f$oT@9jT|P(dXeJ@Id3AHiOj~O7r9@L99GETiOfcx^F`K+>|bPYWcA2w zERI}WA?Gh-HgcLo){C5XkozFW`3TuB$bA{)ct?&S z$7Kdym zG8=iU16eO}n+LfqgzSD~HgY>3SugUO8gd&3d0q@zFR~hBy~uNX$n#~$VE-e0=o7WwB_s-u3FeL*B-Ls)aod{? zPH_Fb@jq-=Sh~XHor{$0mc6yMKh&vVm%GZz9wz_QE7R`O0YkgHHOY1-C!5%9o*rwL zepTHrzEZ$WYJY)!WVVLg@y2ZX9UCp}8WpSUliCYyANN|o-3N0AOdQ5PJ^#H;cfNyt z?nDv0Pci!TF#BQt{HZ5upZMF>UiPt=efm2~csR%{{bje%L*L#@^^Ki0pSHdI@(*@S z=ak{Jve6g23&|?>FmCGlPSUkhR zb@mAxyDxs4_AnY2PB3*vhJ5yKeq6UZWh!XT<@?HRf-sl;&y1IL=8pyJm45%QQ?rn@ zPn!S3&do*C-f`YvJBOuW_M2MX+EwqBw!d=e3tSz#z6wq@`=smN>@0TuvYRmPksXXL zQ~k|Oe*b&BrJob+&DQ_2>pz}i&(`?W?o@8F{r%s+?Y;!uw#{zJvCoa1XB+ar!u}@f zVq5n!8TJ>r#qE!`Jb>E|b1zIh}~FZ+28r>V9(Z=2p5N`Yx^Hy zKVg4`eP)P(J;%B%`>@@1_8+yf;WW$~nEpMs9(J#)x7t0omFnR|FP^)UOtvpu&92|90Q(fZVm_t*`%dtvghbO>`NEMEWmDckM8 zx(Ob?F#p2*$>+Dnj#GS+U2Kr4ty~Bq{lL-_EIeW6!O{=RTv#~5(g`fR!{R?xJi-24 zFROjp7k&GNt$FZxgvBc?{)7be?2B(C!qWpRzG3pPc>lUb+kQ7+D%_lkWL^8cYjWY~ z2Br_D4i>L4f1msJ!7eOij~$GLg)2-QtUQFZ3j`mx+VR)>+QDd8ISEq-t2bfwC9M4b zqtVsD!Uq;EC9@*!!)CGA!)RFf0aFL7k74$}?1#|_r7m`EY@YCX8R|OHtX&1GH(})}EZxJ(OPDw;f57Bn?HE`+3^NCopJC|`mVaS1tX@G^2TQ-O z`T$15^uf%7wL4(#URb*WM#Jh;m^v6ACJ$@B!f0513sV>U($IdXr>TARXMOvE^ZNEm z53TLPUu)Rs*xA{ynrC1SlZT1J!WkByfA74od!lD#52F{K*kt#@KpWl;%wT`7d_EqcmJoOJxu=1vJkt){ekvDvvlo#Nch;p_*nrec6QO> z@O}tPK5+@VUCA_Gdzid#f|6b8%2@ks*W0#f*^zMlF#BNgu=XQNKdk-v?wpsM_3~8v zm{XZ{rw-@A`!6tcO(h>~`8pC|u5S5lw^lUQ zuH(yZyHuHAJD5ByJ!#1Y*%wCX*u(q-3on>^=Z9^ylWz91-&DWO?$GZj`_2#3?W|Wu z+uP@}*%wL0!P5mS-N?Kav(K3tVGrXso|Ccvb3DjCU0vG#*2+dZn7iDZ*zFaj*}~m- zbJG{Q&MmQa8Lz(DJ=+v$2U71<9}lKM`fk4Bvv=F91n+n4%U)oYKC{$r^NbC4U%wmK zndtM|TNpmEH4x&n_X&7xd+;f*J*Uwj+hn&LcAv`M+wQw{(9XS#)y_C%uichataj2m zPwajdC))K0-?zILQD6s?*KXTvXKch_w?=ZK-6~B^yJq2yb`vt++Eyg)wu`*SYG<)$ zhuw|OtadPSVc`mMckXId``XEDb};|Jj%4RpZ5manasIlTUsFj z??(!KHL~+KXl$3e#>8%3{1;o5>HhW?<@oK5m-*Od-4nGhd+2We?=mZ#KK;ep{=+?1 zdzd;{J$K=fs-4U`XFHgApnNLyH3*(Rk4*h+>s%mX=l#mWp8txceajae`^D=W?3?=)`dz{@4ui-Go%(nj`-88-HQb1dxdR+ZXMxt(R7x3JvaqB-B5i$BZ0>R}$7PV>yL z&+|!#tDC7CXm4L^XAd(6)~|)7N2i%V_B@p;@P0E)9ZVk9Z}u?{v`=MpwuhMq>o>#t zT`+l=I4s_yd7jzLP0xYHKdk(Nm2oJUzq8Ls+_orE_$3Fmqt#BdlD5 zQhbuyP1gK7q<5m^)zgs%!F7yOg!Q@NyC6E?7AXD<`y83E5lL%7V)`P&o%P z7dD;*8()HzZ?N(SR$jr%5m@^cmcL>78diS5!rfG3mhI=~)^@P`01H=GzJY}ktX_cS zKUhA3sfX!@>4S;G$_H3JgUQ44H7viv?17Dcz~o`^22;0mPmz6-Oo~0v%MAOFo^bn| z4JGzvOXBR`w5HjM*u}%eVd_@xoMRW%u*0s++}qBo@*uq53TsEh+Ql$+VLMpuL{EOV z+aTv|7rC6tKJl1~-PGAUaGFcR(9UcUk3CEs%gNPt%v)dB6-KSFtC+RNPE6vI-R0I3 zaM~hupWP~#mv%69r?2+gUKjdgx6s|k*1Ge7-E@mdwhN9vvV)li<6mCLYVhzd6Rr-ng5`{=}?3 zh*T`Mu{n@$50j7kC}8hc%WQ8sgVny{I;TBs{0TO0aM)eM{=qjEdziT}d6+&}KLF;B zUezad$Nt{8gN-M_#+P93fY}cdXAIn6b6BGWUXQ`jBP<<$F|@b;Ueas#|GAI7>c$Ye zo9w>!8&>7n!PH$}8e|`OD+-=|Vg7)*4;Fs^s%O~we*R`Bw{o4`>$SZ0q7gIf?EiAx zTWx%9EAyJm9+tjf>52cNzb&IMi+z3P4;$O~-*zzhx4ZQ1V@jIr_!ckiX_@)eYdvv^iTowLHc3iQrj8|?0tew?DWN|>~*&k z+X-y8wzrFZZrl9F#=a~1sIABa8~fm@XSQlj!tL*i<=A!KO|!4pTv+~DJlWAc^6o3U){74I>#JDoVg2*233>L9 zUf#9K?9R8}wd9u_tp5+=bN()}pKZfvzc$C*{>leN``j>F`^ZDD>|o}8?#l;{vndq@ z+cW;o!D#o0ybQ8mHah`ce!<#JuyPMpUczWtc?wepGZ!{a2Qv?ro?zpExmH2;=YIs* z!{lM(fG~9#k-_#KIt$_Be=u`l<4Le_BA7Z@Ji_8H&otbgC%oJaRzAYgBP<>I3Y*#T zO1*-Yd$4o}OP4Ttm^h4vm4`5MVC5UET!ZBUSa}L7Ct>NK7oZVEWBX(4c1P9f?%ZIT14pRrq z&#?Rsa|cWvOde()te**MFT&c7Fd8F#BLMtQ`(hx3~AKjh9=VonVi%ZRTHJJMYp)+lH%waC*k_&o+}+wc5ed!Q2N+ z53v3RK8fJiFv=ww-9Pf*p*8^@m{UVD4MCHPhD9 z$H5NPZimq@cf-`d`uQ;T!Q2a@YihjglfEjX*XEMLI-4={Vt z-2szln!VYUr=->nM#I7rrcXL~zMWi`6TBS>YgfYPs~48pschA;hpB_{Vd)DN&oCNY z9jqS*6NjmT(Xey?QwJ-zVC{8S{Q#q3^#@EHY@7v_USa72M#I7%rViHcg@p$!oM7g` z@((OM!)Ta$VCrD*fR(#2aoD&3%s;SxD~u15hqdovG%S2z>R|T4?1$wu7!B+1z|_IU z#bD!Pu>LBHhV@rr>R{t#u<`{~-oR*>KA1Y#_#JFK57tkH(Xf6pOdYJf39Dyd^#qKD zwNGK{VC_vz9*t{;R z-2|gy^$<)Qtep$9AEpmRqpO3N1FPR)=E25+VeLg&`w>RN#_?e4VC@4~{RFF*VB>hO zdI;7Yfa!yctHA7m^-Ey=XIQ-s8!v{9i@@d|VC6DQ9HtIN!}2Li9gK#R>#+F;7!4a| zgQ{*mwr4{ReXgOdm`gj7C=nE8k$_7qI>>jE1$3Vd`Mx0Lws9n5_&KCFEXquHV3958h-cf;HV z8}EdvgSF#f>S6g9HeRp6&u)Lb@j86|05)FFz5R%t$n<7gn0lBx1|~N9_me7Y7wWLs zd%Zns1LK$FG1)IKF|dW{hs`VeC^%@xqM&DcgyW=Lk>q!{Jrh41wR<5v6F!dtvj=A0 z#SH@XHsANbomdb6W!)f4h{@*R~E~PIdv^jc~qegR|YSA0Oc2aQmR+o`#NVZEtXk+C8(5 zu)BJS1+K2+qm`YDKbLK)46|L%>vr3<#`kQ!Bin4l+#cI{{NaMDgSiu?zW@GjTbqOX zY~yEMw_TL92d;0zts}PTOApw>++Dk&$JV{5(ss^)5W6DNBDi@lcfj<+^vQKCvVD=$ zXuHZo(Ei!Fr?#+q4^|(t*POG{78QZdU%|$OVf81hK84lKuyh5}2U8DAPq6w6mfm6U z2U7=2N3eK@rE^&P!{lM<8kU}6=>cXx%v@M{gQZ`Xxv+EzGY@8tPrzxr*N+$4z|t=) z-NNKye3*Xp^b1R$u=EIX2h5)1-q-E8RfBC|?uDs?rCZoM20T4M(=Ut0Q6=lWl_XNgEgq%LlOZ597nkgV_hO2j&h~I^Uj{VmHh2j}0un!_qmd{UmeQ z+1`EiEnC>Q9jqNA`8e7B-10tKSbrU+-uQuw{qJXWwlIB*wz}D;Oub~Yx7fpe#c?xR zm^@5h9b>9}u9cH5YyO8rr5_8=3cqqvGyu%{I+@iDfZ#7S>W<8cRFqHvS0e+2i(0dcQ+sQ zx0fuFfZGFe2TZ&v)YD#Eu+`Q?DAAtdL(a!mwr+xj>*LK41Qtf>LZrlA>nPva0 z`k>vjXX*BH4DY~cn7H(fEPI~FyKsA=H@VrLslQ<75a4FNs^PVr>6H|F9;HooS2S|$ zKRIoJn^)iJV83hkKD&f7ZuX@oH`pm>yV_@5H~^Q2sfW3DpO}Mv?20pRbya;X_K5-K z>|pkR=CiNV9ftekDr5l(&SiHmH8R{;^ zmcC)>0cIY|9kBEUGY^)IVd)iS4$NHZzIc22l$$oNbPG$zFm*6}FnL%yhNVwfI)%p4dWX5P_aC;M+P>+EK9x!NBxTx|zS z_b@&z{lmmzG|V2DxiI@+=^W-R_v4B76FN4+(>W~N!|D@QdjnP;!)RFj15*bJM_9PR z@(YZHhgM|w$ox$|MXmoY3_9)DKu=*TE!^Zt!>R|4J z@nP~X8rFV*se_f%uyH(CI)~A)^bb=9eLjeX6FwF}l*}xRz1Rh5chB~ zuz>X=`~?wbVt|AX3j-?yI|CO3OdZ6P^iMa0(g!QlA29d9__*}J{0j>Y5MPjii2>$c z76vW`b_OQ6zhU74QU{4oNch0?!)S!O00YQ8gg8VO%zfzLiHJYa;uE0{Vm_&SCTOXE z>_1RB0dprT9MNf5IKkB63TIl2gW?F}b9M#}a5{$ZX>BiNxPd|qclm)x2dL^m=>;MJ z@&z^wlZBNl5WXlp-XMIKzd69EmWcrt9;BuReg@LgAIx9u(EP`Y<}O6Kg18fwZeZ?( z>7#Xgk!n7AdWX3empO>^Ai^NZfJg@j|3b=HSh<1-7f3k*(+>+zYDo zL+rtfchce&Q$NH;LgFxY!2FFKjxat<9jyGoO+);HE)T0Oxfmer2LugqCrmxe9#}d< z@FD8Z`IzRw?1#{>_=Bl~V98&(l>_^a$d<{t@pmrHVH!Qqx ziNnGXrVhp@m4@ku(WL69wtAR5U^KbrBjN`V?yz)%9xt$d3QQhG!`cV9>_?9m7#|XQ z$RxymboU_mu=D|;A+2eUeh44tUYI*!d>BngT#!Ks++HM}M%W7~Pl(rtZV$v9nEOCx zL3{;ap^M|P2Uh>UXh?2hVnDAKVd9AT24owkeTbiimCNY)5oRBZhM5mbAF%j?@nJM9 z-N5)Tbubzxj!whmVfqm?#Qg|9diw^(htcGzhs6ghU4dv&Od-lYh`9)oP`bt?4>JLh zK4AFOdMt&j882ZmwRCCICL6Ok3m8K z<_}oX zbQ+SrVf_J^dtv<&7$0U2EdRpzFdAJPJ^iE0!}#blET6*6MK^~KA7&m*9XcN-PA?kW zesn&u?tsNBdOC!~8~S(-OdTv=!1%cAgM~Lb4NE;R`!V^j^aGk0 z1~G8E3zLS}0}}_C3mWf$@rkEl=0JQ33s;zbKxTquVB)yUh24~g0Nuya|jP1 z4l7S#`e6AE#z$8Vi%<0UB~~1!4@SfE!DyH`qCAC_qc9p23QPf&xbh>qILushadPT;W5iI4oRYG`fBm zA0ZD38O;1nnmDYT2%}-`M`RjgB1|3@pRo8qr(yCi8rDunR|n&xtAnLiSop%yHB22$ zA36=w2UCYmqpOGUVd`M*7-DId`w-~?6iT4_0iA}V9GH3p4N-@%57G{Ywbv0ex;hvi zq8`?6htUZ0AnIV@2cu!`h0*BlL6`$EALb5B^$>r-SJj3jTl@kaW zGQI)pw<2gre-)t)!UvT*5EIe$LFCcZBh16D9?{-|)N8Q%0YPK02N3e;`q0(GN)k4~efA4phX>&HXV3#NLAILus_Jd6*c5#liQ z5E>NzAUk2|&}npk!1(CuV0@5S5DbZLT;?OhA?jf5KZH3DahN(7jjj&n9#}aAYsaF~ zFm*6-TdEVFneJ7V0;)&NE~8269deC1Rr8QCLiV>?D8=C zVESNu7)?kV(#inMV?fO3fzI#4#L@XMaTtwDo_KLcibI%(>JA=oY%ww5rXf0E_94{K zRvZ@JuzCi;hqxb891@S{;)rww(+5)rp%L{LL>?BeF#BNX2qq3Q55|YdldB$K4#a+# zc?cRNj!r||4@-Z<(g^!d^&`X~_CR76dHftA4oe3xd2~LkeGHRF(5UGUCJt*C!uaUs z!T2y5T^(k6M0F=jAA*L-lS)HuM%V|_Pn8aoLNRZXqV4 zt4Hu5?!eSXtT@bkboKbfA*C;<{Q_Yj%6SMMLL%B<5YrIhif}(f2F8c*5b9ujm^?ZS zlSj7?Q6EC;KlJ(zrXJnhFg{EkorcMy)9C78?t-NQbQ&g)Nkh^ZA@%6?!Tg6#qpO4Q zG1WoB2__G77t9@qbPjPJOdc1F9#1enOg$|8VD=$sRCmC{5%xpUDa;&P;;?dvSQ^%j zq!mr9J8-Lm)fbTR4qY9>-H`DD1Rv7gMCZf$r^M2;W=h(hJ#)s60Sa!}8{5yCDQU-) zE(sRnx}I#m&i$b+RGNW-p}`)(2C+sq|Lhqb`?F_!z+nXnjiDYs=;;BSkDeYhV)*Sh zxIZM@|Dfoc;-gCwlsseMlS}enGv{ZGS(SYKv|@ z>ESW5%OhjsVo-Smk012#BP5Tm9-WV#KSA-2oPQhhMC=(&mf3yVeHiQp^!Pn>1yo+1 zvAxrC1}u*r-{|QBJw2hzqq`5CkM3S{_o2HVT|YV>-M#4Yn0)%?PfYu1n;!_p4|@5F z?mqPNNQjS~p3u!3>3mRnMlO$sTX+ykZ|L%%@IWq~NDUA4@&nyGLg|~3edz8*HxFGN zy*+|1k8U4&dj!3`g07zWeEODup!h*f|LEm4dU&DNC+PBo${Td^sULo{Ex+mQUP9$N zrS3t`uY~G*^!P=OPxST*dU`?Uqo*Hq|Dd}MT^`-Ngv>+NkIqN;54t=ipT7AO(|+2f zcl7uslpfLLsqJ1;;|IMwM=$Tt`J}p+RQC`vpHO{+ZXY@yJ^!Jbht5Y=k8U11AKm@v z=Ap}@^U=c_osS-0==w3;gPQ-)%L{ZqA@k6~16@5KKDvH%|Dp2PcyTQmP)k{y_I1dVNAjJ$m_v&PO+&5FcGXAwD7V z(Bw?;p3q( z{Z97%hf0a&qlX{5d6@oluxDUsfSZpgk6PX^Frca@#7ECR=;ovQADvHX{eqqz(8B|r zPe?r>d35ur%}2K%olkB1hMIZk;epPlw|~&nH##4^yur*rsP*;CnUePBkmegP^`olC zlt<6M^yQ=bAH6(8mq+Jgh7WrAgWvz??IHB=L@%Gv?Q3`)XwMjA0WTlX)uZ##)r0(d z<_u))9yH;E&PUge&X;e^2Gs}Pv43p((fxzoJ|U!^kbBVO(fR1^MRyN6A2UCq#vdW| z==P)Y(cObyf1vZx-Gko$Afz5$KehSj?PWssBf5Lh`IzoQ4S&r1hboU*zTlTfHxHdp zsdc8^3m-lRX@Ge(>i=W^}|`D`WM}Q=<$J`ztPhR zIv-s!Gh2_SGWm;O!}N_Yw*( zba{05px6KC@`UCC(bc23pU}%!Q1~IY@6gjTdi{+qkM4hTdGz)OdiV}KK6?5^Pyguh z=zQv`M^E4A;YmoIkb3m;1(aTp%OgU3bp7aj^z?(C-w5$ZZ6Bc9M=2jYe9`%sPfW^-F!lPbo1%WM|U5({evkA85A$fH7lG@%PWImmPLYpvz;n z7g61VuAWf)6urJf*H6ejnBjw(UWcAMYIqWM|Ikv8o?g-WJLu&JsqIJf@{ZPg^zsZn zy^_i&D2~|CM{zOl2gv%pT^C%5pLi*9e2i?Eu`Z3!h=r|DgA8(al32Z$b}0bUu3c zp}Pm2kKX=3A73J*9=*MTZXPK7klRz}>6cLbjUFE8?E`f4(EUIB`RMgCIv+j#q06K5 zDN~Og-{^ew`WT&0DE*+P2lV`bE>9|-aQTNGUikUw=ArX3(=UGW2HHR9_ES6j(ak5s zM-M;r@_~?kbb0jnA;d@5kIpBgA6*_@KOsK4esuq%^9h+pNFLohbUwO!(9J_vj~;*M zd{Wh;>nCJCx;!EM=;{X>pHTP@Huny+d(h(>olnSpgu^8=X%me9+q? z=zR3{FFGH+J&dlO5FfpLgU&~{kC1uj^62g(#7EbU&L^ZFT^?OOAwIf(bpNCCNi`3> ze}dj0K(`-V9$i1W{pj(B-kwG0qw6QcNB2Lvedv5b=ApZXkpD3IyXgG`{Csr%g!t&; zkIqNek1mhSCsjRq`GMX)N9U8O9=*Lx$UJoO(fR1+q4UwzV~)3=jz^%YCuANdy&;bu zp@%;vAHRK=?jzJ6LQQ|@?m_31YCa+VqlXtdA3c82%|qv->&J92{_w*zkJRu%4{vn) zP|ZV+U(E1EHxEA_eLR*BA3eO#)uYQ3;-l*)l~2fgba_JNqpK&xCuANWc|zu+%cGk| zNS;#l==Bx4eGjWd?CrR&!`J7bt4FUd(c6#c>e0h}MesuSt+lOu*sp`@7qnnTJAN24;mnW5v?tfDC6LK%Qye(I_JJN;hc1t< zA6-2mKB4lFkUXX4qw6QtK0@lz$7|5-L+2AR4_!SWKDv46e02Tj^631bpdNXC1-(B5 z@(;2+x_{8;kI>5tbp7c45p;R<@(SHPbo0^q=qj>q-F|fa=;ouVNB2Lv`_RopS5JsfseVG{qsycF58XfL>e0g&T^^lJXuJ)S zUQzoisO?cg@}!n;q^c(r9)#S7E|1Pf4=-xVqnn4$N4KBWd{XVFwtDpP3B7zk_dmLN z^z?vUUZAT-&tK^F5z6oA`qAw}*N-lbZXddN=KDv5Be02S!@(GzwYk73{60(ol>e0<3#3$rFLh^*n zN0%pL9=bfbenNb7{e<}F`30Sio<9hgN63BX@`TJomq*u6h>xzH5Fg#Yg!qKaLzgEM zzUcO$>nD|uZXO{%warKOFCp{M-G{CpolnR-Lh^*t54t?Md4%NA)syOeTB`@SAGtk? z&PQ)A5#pokN9PmLk1mg{pAa8iKOsIL^9ackG9O)@ka_6sYxMpFx_Rj837L;>9=d*X z^U=*iSC5{)X~b^;oy7*aTnU1~W1uiGkW>TIUXU0FBZ;A?1<5sBomIAt5$PTxMuvv{ zATfy93?Mad{Rb}3o@?5^)E_Xx##akgnkfvQQ}G)nEf$g*X;A2haED5+TU9zY?|DX19N}FrWO45 zo=<}9uS4A50Ag=i!N0!{YJY5l*P*Uc?+?P<-*msj^o2kW-2Qz5>HFA{D&g)2vG)a} z+rjjIWm$7Dd}$lp{mM>i7PGWg?)vn<9u$5J8?M*y|FD#QuV&L;Gf?=wTFSq7(e--! zYP*%YK;gH0jhmBlM$^IhmiG>T!q57C_Kp{#aQzJH&eremuTikIgz9gtQLtTbw%)!H zs(;STQ;tt>PK4{v?x@=>8vVqE>lxU7hSfaW`%7o?af4^D>N_aN?PaJx~z|Knu7y>h!`tU&t3r}FL9yispo zTK^a9{)emGoZ>^84w|dqcL2FxZI;2VE2h78!Sw$-Q@_8lPtjHus^79#(f08fg#Lt` zryK>2O+07@)$iy3*IG$ef3L_Pu=^XHX>jj9wjj*@l(ouUkp1>|!|Z#cx$PCAJNJOX z?~;Mp!3nAb2frzN0NY>Awt36;Kh37F^w;ELv)>_KcmFL&{4;>qO+GgEu=F!)rMaVX zaFde>H2oZ!_iIbn?+Up7=p?26K`&hQ!_qH^9i60P4@1z^)LF%=~x)A;Pex!pLh1M9n(K??1buP2r4hyZ|}Oq?)Eiq3y}RF zc2Iedy?dU_PLTcm`nMc|)_im9+kFol{>yL6?KHPpZ4T4F{KWdb8hrKkccA(~>=h^0 z+j>Ctzs_cMvN-U{z8|W8=NbXi84h{y@H2Q?yZ<96v)xT-{DIg8Pix`fzkg4VlTz_6 z$JbvW`Nu6RZOet24!Hi-4*&gc9*M%^55#Wm@Q3U7i05+L7pCC!7OH=)q=@CUqJB$I z842>=l#ZhPCifTH-TdGP4u24PN=K3X$652i;eYsvpFDTe{Kq6I8!bI(W-Q^0E&N4Yg-rNU&eMD$71Jv=np}vwdi2tNrR#UG@wN6YN7nr`oSxHOroXVS#;U z=u-RDt5(@FFl?|74c%(Ldets_28ILnp`l0ZSFbu{&%kiOJ~Z^I{pwY>>=_sy*oTHb zwO_sJl|2K)2m8>_ulB1~{Q}*4=dgMelS61Is{;cAhr{YsTn?e3ybcTu0uHNJ2|0v@ ziaIbbNI0xsCFKwrD(k?&py052m6AhfsHy`4gNDQERay?Ap}GzX3Q!D2p`pGG3=9Ddt5*d%gocJXFfc?o ztX>u6K)tYJV4yTk?%j>G@94;|H!&`@zjwFR-o>TGe%8!R`}gnq>|I=@*uT7gW-srY z1^e7KUfAcz9cACU;_Ti@3iJ0JkH54p=UJrv8vV0-k6O&xS5SOq-`Tg3_PSN4_g?-o zeV@*wYx^e3MAeZ23)_h|d%#T)jPna1x^X@9nF>Vz2ks0+*Y+PZq| zi@f=AU!zW}y~6*wdsABV_j&WY-M49ftbL2+Ez3sszdvi>_?>l4{Z||gQw^v=}%^sDb zKlVum#M@WuE9_kqYhoR7>*qcl%Xs?(s~Gl9ROYwMPWZJi_E(&}+JpUjrYU#X-i-dW z??PXkeO6V)9@Y0}Y%iYtxo_*&So_KQZtdQCl-*8q)sKBj`my#A*IBI}@7Azm`TA|& zWcwKV`&W!?{%UyIE#LiR-!|1~dwH(KHaqWR*iB*kv@hgIr2Pr|w>FEeG}|3}@NVDl zx(NG+H>7RZ=1sB-34Xn=>R*^W$2$jGkz)(&T1%hrJDVJ8ue>tVR>yjsokHZ}eN9_} z?H|5qv7PsJmtC#k{e82(1=^doPP4tT;h0_5&RhE;%>wK_8s^wK_MEcQTykTd${~OI zo|k>LUosBbWv1QQH*a2`J^z6^+j!4ycC)?i?9(|MY`^npyzLCVRdxaQ?(S>-7i#}? zf}<^8%v?KDq5J!O+CVasHORIKWm|kv-=9_vg{iUxSQ`^(qrlU z=ghv?X<7CgV*89j4u0Ke`svKRNi(wSe+Kp$rLOvclm9EQ&nO*9ez@^ZX-4d>ni04s z`r6rjaS2)W_qb&D^p}b4-Q{?G-}OhC_8~l-d-j+&?){N-VIPBarhPKQi9OuwcJ96A zb#b3eYKDD|7VF-^>d$*mUb(o>KR(^QvQ&NV)cs=n)^T3i_f9L#{=bjc-dJtpeY&qM z?lV50VqbbMXYaI9zkMkk7xy^?C);z`x9=^L%Gh`Q>xF&ZhZ60ZZKm)2Kf8Y4agPi8 z{%a=K^PgF|cQ#YkzS7uu^F7qn$~|77n+$60ow4n_70 z1=wr_x-RX_%$a3(s;S6cXx$eZcZCCcLnhC%d$GUB-pTZ?jo_xWdpB;IWtaE8$UboU zQJd@bv-j3qn`IZRS!{pNWStG?sgAu{KFzXQA6jf5x^9|{-lCknvD~xm(rb$CcY4&> zTwmqBw@6{OUGv;x`)_*wHm}zy?fqgn+m3l>v3;C?f=yQ3?>$fKXWKnJS8Q)~=b^Pl zY{?N`d$Z4)xv?#8=fdpG$fyI#s~ zw!RZQ+s^S_vAt}_^xa*{a&2Dt&$i=vQEdNs&ez>%Zy&IU_n2*Gd8gQ(<%8y)&-tvj zF1EAnj-M*FU(Xx4=R=;B?Nq(lcH1`>+v^Fp>|x0Aw+)t=ZO1je*uHGe>^-gtCAM{J zv+WL+6x*vPZQfI~qQ_S3?JT=HKE?KGFZb=a_k5}?>-|}FN6d=tB`0s&qZ`w2EBtbn zU9VfQy>tJXJ#6*uw%uQ5*-efpw%^gUXwMv{dfTM`v+Sm37TY(p&e$W@mTx+ zVfWFWi*5FL&$erPSZqII&5GUs3R`SW`OUWTepYO+)6%dz^s=XoVc={#fmg-$ncEC@ zUp~lX^D$_)-NiS>_Ibw-?8=UxZp{-i+phOrv3=L^13R1Ir(4y8%(kOt;9RuAGMo9}aHtJUH&eY+(? zX4@@%S8V_H&I;@Q(_8i&_nU3!_N>@mC|1;_Yr?BN{Z6y(L@yWHOSy*GWY}x$?bV-c zXS21~{^i7O8yo%Ty@y3-+wJZtw%7T++Ga0T`(C53v+Slt7TZ6GIb-voe8JvZXJ^@+ zl`ghlv-ORQ+`XN9_s^eYmvXttp1X<7R@>(C-UnH;?BW`V?9&#D*|JW2v)4&~mfb$3 zB74n!YPN^oGVOczW~N=|u0s2T7tL%vdinQVSUl72uzR7s++8=@E;X5b%po)F3QrZ- zzq%i0`*VlJzUIF(>}EI>*!$f~vt@BH-50!IhMoO}eEXLNN^OOHIP6n&o?-VyHs2n- ze5^biwde8XBfF(j7uqGiF0waOi`wJ)`si*3*+q6I&lK5zPmJ2bBYkZ5&ufe9maQ$a z_fL%4BRc)qZoSEi?f&%^+4tl{?fL!n*zS3OOYF|%7TG7hjNG%#!o(`ZbkOq z+>v{(K0Ljf+he8Ovq^>aQBT76EEl-2o3VebUG#+ld*6caJx+d?ck7F9vNQRUZ$FhO zY)_=ojopXYx7$78&9~2H4Bhj5^PSz5`Frfz81n2bBtrLab==vV8MVi5152L$A=%J9 zUpC#|-T!WvU7Syz{k($EJ&k#{cB}X8w9}uMXFroAY|qVGH+Ii5-(lBuInTa@F>DW` z#*N);UT?E=5ze1GkRTUU#Smz`Q< zcVK;yec7kTJ#U1M@1D0{vEBaeB6}mQs6C6@kMFjvTw*7YUSuEhGjdOb{E6L5LYCSc zaV)Z5@-K4F{i!E*|2A4?w@tdpKD{P#kMNn3yJba|+x`4fX#c(`a*tNQsoniQm)qH# zEwmTsi`*lWdwTck+bituE-kdb`7UA)oBNsF>}OZnO{gxkS9=n%r|!X--C}!I*`)^- z+COiI*dz4s?C#QatL-w>3hl3lMC`fy^xW=-C2Q=eeihiKNJZ?qe(3z}p80F-;?5S> zH@pnrvvT8w-4XNF*?G+`u+LZ%zUSV;i@VJiuD8=JD6kha3*Ynq+@;;}D>v9(wlA>1 zXBECDwc_&b?|V1e?dK`5|7#k)CqMi0?(U@`%N4+jDB-<=yGN8|@}37TC}4 z3g4sAd}(*dw+(hv4GZk64u$WT&3|e4f(0Aw;v5U?SGI-kX;izkyU}}t9aCU|eem?~ zJtuEm+@1S52=xTmP@KTi9D*f8=`jo>R*%>~>$b&MtjUf&II8;d|_oFYFeNTW9xSRe}AKf8l#V z6fW$p1?r}4kQUNSafPe$&! z-RX8~?Dp{#+Q%?Q?vXuzdUtK$N;~_Bh4vnABKIg&o!GtiCo;)N9WnSjx4t47LMNYgXi#W!?O8y zJhsL5FFr=?30rY^x4p&!yEF2|_H!ho_dLCPc=xnB3+$MgitW+MN9G&S#@6kIMt>@M z?6`Ex>^-ka8!yh*H&S5kwlhyEv!50sW1PBKD!)2?)Snf<|E(#9>RI!4pkI_%D! zDYHM`CSz<-sAaUVq0P>esob8~PR7{7Ps8Z#+7>%c$8!7T3o^!QX2}^DZmzPMY+7Nz zZnLcMzbX-Zy|=WRzOULo=%t+T z@%&GQ-@EPYEUT;S_d3fPpOF7$xa_Zs-81uQ`>)sJjGg!yjHWt!*z;$mHmO8a>h$)*^K^Wh1iwkRoTyQlQU+kfRPq~TEK9O$TUKeWd0y7o!Ar>y`sq%7QL=l`kHUUsUq zao7PvBY~P8yL~!k_KWvR8>he1H#%~!%Pu^<%sw(l#yFHo&nU#E)9%f}GW#p`GR6~Y zwT<$owA(e^DYN&DlrcV;t!WhYtkq6iyxe~00U2XP2@Rv4hAnoF0?X~+OqMZTdQruQ zue`}_c~7~$?N%A%7b}&Fbhk9vEj(Uszu}0C@u_PHMk^lG+8to5u&?EnH7@XwGg@X+ zW!Gn0VV|iaYn=RC+GufenccjK3j1?1vc?CmNE-PZF0$LOxx&6ES=M-?u(;8aPkDBS z-&NS#T$eR=7Zf#G#FuTyqE%_nFE3}j>yx07x@5YYZEB@`UACNY(@TD%rvk}#l?y8E zlV8dj3*6u_n(#T!?$qr{``k1+<0>&Oqet_i?EXqr+3$&#Gk(X+ZDed2ZPzVOWzWPQ zXWUc8Z4`Yc#;*2frTw22Ib(JqUZaMpIJ=HVmG;)=a>iDgd`6u@33mHVSK5ELDr@|G z4WCiQvP3(Ut(Ercxa5q#xA7ZwnkL(&%&WAI6qhreqA6%};6RGqmG(+|@xQXh9}fu{ zrMjot#T8cC-@hwsthimssP{y=onUmOebx+FW8N*oMqAu6?M}H=+Ar{tHTGI4V&ruo z%Wk1wrTzUjS>yN#qDDccId(H7D(xRUk~Kd4N7U%kvRu1)OqKTUX2=?sWQ!ZE70I{T z{iecxd9E}D*E0KqY0}2>S1gPUS5CD1SX63%dx@0sqe^?DV5RAH2d0M z<@5=5@v}?qIVVUP=c<|-mH+FrGr3S|@3~9b*ge_U=y-pxogHhLJ$m`*xRJ#w_uHYJ zv(LHiU)HE(?{nn0sN1`KVzpX$@choXTOIamw`$n$P5W>8rS8VGZkTh8uO^L5xC_D941${i-FG?^b!r;MpgS0#~H2uZMwMg-9_j97Ee{| zUw!^-`AhWd&Yo(Q{okcj>}^>7Sw81HyE8z^b$@M;vi)I&f0oAFXLqU}bKU=;Tgl$) z@i$8ospC6k(%tq4A6K;RYxr-ORepMBn7#Y{oqH7Q4>mAZr8=G5`B2njf8<7a`#qA3 zR(Iu&@4Rr!V}IgKIeV5aHmiF7GdrhE_1ypbw5 zact)`H;?`Ai{#?$ji&#_o_v7Xu~9qhb6u3FXp#REnwnUzO(>Rxx+ zZ_cY`&v=c|s^Rw0opU0c_RB6%v(GrnXm#rU(Vc3y9QTKrsN08aW3<{Mb8P4P2*>>! zPO95?1u$CeI&yU9<*N?+{Sq|neR%#@zEC~5bA5or{(v7E_TM%zT3Nn0w)53t`~8eF zH0|FAGFoLNAKPin;jn+Tm!^G8%y-M(?fZ7hS2*lXI;~+}af8|F-n!E}U7kDa5A@Nn zFIdiMwP^LZo$aBH`{$fhw?E0qXm#h^@twSf9rsK6tJ`mU$Y3SxbYkZPeW(2wFR0mn zn#yXWCw5`ymDx`F4+g2(`{XlNU0-=(r#!p!{-;+|?boodSOsrBw{vo#^ZvweRr`6- z3|7ZNPVP**?Y#fTO%?m)t_)VC_fGDtb8*>!CPu~HLyW;{`q7g+FRXFd|MI@Fy=@qRA`~JFb3icKL3|6i) zPVMC1;J$yBfr9;cRu-!%eP?%G2=LgSmM(A4kjiMarRUhro6kJ~Pj^z7iy znkvuz4ew;_eeId8!o?5myvO3XU%ExkzHAM%m4C&dorn57_UB8=+pDVowfr@2*Ul^A z9{XRclebS!WVT}2c5vtFx$gU0+!gHC)G%AUj6b;ZsIvS1d-oLVo3=1peVKP~=h+o* z`xlle+W%R`VYONH&7oj?3e?J?A^TzY);nxvR=iw(oSP;p?!^3zK!*sf7UjhYwfPz zDzI;PmuoX&7NgCMiyQ4&*$eFJrsmk({vqNl;-CzDZ`b5X)@C5V6&cBQD>5pG~gK z_k&C}70O%eY-i-#SN7-Hbel2RXuRKK_v2!|eckMQoBjd@n^%W6+HK-2uzzclXY-Aj z(I$A#20JN-0()290-OEU|5-1qS#P(aq`-dJu{@j0Obj;1Qr6k6TwY+$wlCkNqwbHj z@T*mJrtXFIt9BIFOr7(?I+T04UH+Fsd!Y@5HkIf}8;{-Ztyl9cuzRUkY~R39VsljBgY~1k3+y)jFS7q6Rb(Sv@Y(v)x`lQE zcZ=+IzAUsc6#Zg-s%eqk)}2N6>6;2|azA{rmW^C&w|i=l{p>BpHXidoS${NKV#irn zWUsDSXk+v8n{_1bQoDQJMfP)83vHIq_-=jh^-{Zsszvr6{uSB$bN^}`d3Ko{=l?=` z@#+E_jmn?a+cqt?tG-@n-|kvuGr{J&^`$8*>?Af6+IK1x*sNguZJpe<((Ywzq5ZlS z`8E-pf2=o`uChB3U1-mrR%kP6(l6`0jMa8K4GQgR3-fLMpZjY)CvJ`1E0#k0XX^`W zCawBoy*_fS-KFaV_Ny-B*?3+2Z=Dgb&hGij0{e%3c{cyz7;M_3*V|pHDzImY&9^yW z$6#|Kd4pY^SAqSm19>(lJ~G(6tk`ImEnZ+hK_bt_HJ#B$Az`B(n@oZICfz)nJ}X8W zOOB0pwmJp&0wQ@fOqz@~)*Cn2IolN2e{CzUd3NoewN3N}yYJow_DsonHm^4`*s!r} zuv-&dV4qx*XT#CUU^98+dOO+d0{gy6c{T@A7;FUM*4sr_71&Gc$g`Q_!C+&+z22^< zv%tRbXr4`gB7;rt&UJQvGYaf^cnWQVZvL@u&RA#nbXkFY%A$Om%M1QlKNeqS*R!?2 zeou>{AYbaYpq?-g93YA z$9$WWIsdGM?yj+OeOF-rsv+M-@BLqE`3Y<6c>fgGGi@!j;hy%(`nK~LyE&YN_A8GT z+H`pSvOf2HwVl3rq5T7i0vqe4zpUN4R@$wcU1-lCS!i?3^1HR-qNR4#Mn(1kUkhzC zS-x0zL@u(MeW1u*>P3mo-x+VM59`gho9k9=|2VqXX5WLi);s>rwtIN0*#7dKVjI2X zZ>(*2X4@rvEVh3*q1fhN##`&E)3fbfTq?HT5mapR&gz}@?9w@QtG5^1w`-N!oVxnj zdZO%HyGe73?IZsd*?hErZ!LdxuHEFuV*BiGMK%huAFTUo=h@9oF1DY1w8-Y}p%2#T zdh_khxE0&;&MmUJT>jBI?7@7yDVoLh0!2kOt2IAaKbo?@?h1FYJ$m_g^{TY-sYixJ z?S(ydc6w#@so$iHpMBCdn)s{BE+@InK3qb^nDw%*(Vn_ayR|dQ?3bCy7|WXK7@hyy zZpU)2%>HwXj4`)|meIcQHoF|=a{J>wGR8Zvs~as?(qh-)RBqp-C~N$Cxt!6~`Bir3 z%qr{`9FR4BcU;6M__jb zV##cDD#PDy`o=1Ir7k&Rkvujd(XbG^3Hep_p0RSqhbM3vO)-wNJE~J|jAeEBjr=Aj+09;FY5(!LtZ}}VkkKrObUU}yO8exkvc^3|qDC3j z*>*FOEA0=O$Qmz-l{M1It*}#xs<2OAEMu&pre@S0*lc$szuaD#SH{@*ou1KLmM*(r zt!4JI<Ov}EffyEo3I z_Db2(#=ke38yRR%w3}2{YCpYQ+PL?xsnOoK{dRwMl-m0(kTza(+1SXEyU(uVbE*Be zYtqICKNuQ)Ebg&;rdwuT`$yV1WtP6tifdhV)fr{>x8-Gw&!5#bk~ZnI6I@(o&*39u zED*14WZctkxA<*l`D!+h-nhkd_>GqQPO@9S zu+rXEUCubdme;88Zk!$K-AenjesadsTe*y~JEH8&rK;>D{p5`6;<=3Um80zr2v*ro zwUskIf0^6J;aH5_)?bzOA-ZzLevG_EYg6Lv_CKz)XV;Q5=AF!I&tw7<(HXMABkzY(8evR&W&O8eU%WsUu71&l)0q}cuMsI)hKDr+2n zQP3#JIL)rDsM7w-Em`B+2Zf9tZb`Q@jj6Q%a#GfK@?2pf9pg;9cdnK8dOKx}A6JMN z$*j$?JFH)6zj(c@aq2=*qhh5TyKRz{;P5$9E@osnCD(2bbEWj>pqt>QZ_BN+q0&^ z{&uFUv73Oj(fKJQcDmCm>}B4{80S7zG~y4fxBK<7+}x*Cpfjl{`@y7XiItc?5&CfoHGmfD-fN*jM%U}02ubfVq1^ium(4bsLDH_eP* z#ZR#7oKtGgx=7kM?udzz%eOwew2P(opLR6+g>Gm)kg_Cxc)5PvBk}Gf47>lebltX9cJ;%cL*PM*`IPi*?#|>#2vHimhI4V zbJ>3>O2vMbp5=}Ym$vSBf7p5dt*Xi9^TMy9&YQrUtp@L{pQM)9UfPg?8q*2 z+TT>CX1`QAZO6;n#XF4VIPMp&QMbRylD6Yd?7|(bs~z_5oS`z*Y!2w(aqyqR{&YhP`_nzVI}JsAw#RI9+66+3itoc33Aso5XBlDI=Ub@2`ZY3KcZdsXcP{zdNC%(i@o#tG;BH$JG? zzx0sbd8;kK^g*G^{(dzT`(=h{JHFN~+Ob>0b-z%Yvi;8AB0KNwdB1Je9@qVorz_bX z`xCI^*~Ha5md3j6|8z;wey&Z-4o3YIJ06<4?=L%{VBeV-wPQKg${ky|J@(7&lef2A z61k&QV%3hd7d`fWIU;9oli0LFMRL}TvL4U#B=}o0y%s4kDNQ7{@T1faiz!p``_j4=RZ-{ zDYtdiwyCxr`zP1S+fQEQy(2$(!;ak--1pyRSFjIKkJ)iWb>)uvN$&fIlrkEY84ldsj=;^%wLz}Aoo_3|3hq&)< zjX3MH|EPqT{k8eoJ6u>6?%3<^w14SpHTzljC3e1)=iP2{!EygXdv*Ksk&!!2`!C<| z+Rt&n-Boq_B=w{njQbYvIDFb+|IKU-``Opt?)a(9xuea^VgFNRO?!=Hr+1v*ZL?#? zPW%16i#6>n#4~oR>0Y>l^Pl~Gi!e=lg~Ie5QAZZ;_@C>r|I;-M`_Joacesgf+F^Xx zVgG}04g0Ip>~_AY-C*A6?YLj(rn7@Ay8^X@5YRn*Fnwa>m+bKV>$Jb(fvSCsZTt?04NG@iNO#`< zK1tPnPqh8cjg9-v*I#tr-|`%;4v46kQYv+6)Rtx>bF8ixr zE890J*z7!YeYN>hF4z5s@|5kb_XO=&vUT;2Cxx#2T|X(=Ut)^eF*|434%Zv5`=6I8 z+220Ww8Lob^c^2;-S(gOsc0W|-esqt!7KAOi`@1;c)y%|$62GDOG|f}wYGZfmr#|rw~~zB zu`^=Tjv0I&`|Eef+h6+~v%|)4)sDz1?)z1O73@zfiP^Du(~2EAQttapUn$s2-HhF_ zfAWeQ@$=pG+czoN@7of;J*{KosUPd@L+d?_XEjVRU=iMBBmTbL-mKQsIAP0NgPMR7HW_c~?cY^-8VkHyVQ{+l znoaA=di%BtPvbE8Ee7vSJ+aAuR&W2Z)YCX6e80g{_RluzkL&G?i#?5>b)PZ_Tf|_y z_I|y+e}Sj5=i#dc3lFf{{=Z#sZ=36BeD>=DgY)^);;z1HNl?7=l6&kF5Kl{o4LK-{(6X~ z@vhIJhQbwgw$eN6?JL4PjRg~g3`^cv+7|Drx95)XH2!d!&+ue|sqOat_4e&Cp2qAJ z+=jeY4Q!tss<;0Y=V?4=F}tC&r;aVdv3mQ2L{H=I{49n!d(~~(PS)G6O!hQ3t7b6l zFjThve!AZNMXIOq^>aTBCNGtg@yaJdLMl-!_!Y49%pwavRH_4c1CJdM8?ZZgmce`NFfS-pK-m8Y=|=W2rxyPGy&Uew$F zs`fOtzPH#QNA-fujaT*dnYEtAi?+@&DC9YAv;0lH{qZ_aW1gO=1{t6C+9bZKw-;#e zH2#vK0Gq+iQ~yCVcC+dHA*7ermI)@y;`a2AiPrZyP<0%a=48On|0; zz6MWYuVjRMl69WOEebOYKGYwwX@6U9|EJp1IQsr#gIuWlcUF2D=gnDXaQM_+n_tiC z?L*5wjq74}8hn6;$MF(Rfu(VoWpnRpG~OBve+9;~;o3HLOfk|<g~T&c^Y51w8CJ2;WeA?m-Y7O<)ekt&CO-U)VI{Citp!}=V#9w)nM$* zBLe5o`z~%Y!)f#88ddTA{PXYH9X^V|$l58_J&FWR#A5YHBvc}Ko^Z&B;52Fruo zGj00v&3X~aaQkf@W^MT)ZVQ*6>65l8W0o7-zJ71jEe#dHVEaJ&kDE=~qVLNO=Nqj{ z+pNu93RnN~QNk9Ro7>?2VP7Y-rOoRT-25M#Ew?O;(Sz#`)Z*PD^Ysy2K54Pw7DJ)C zaDHxz$(H9uhv4B+eZF+d#bxK<=1*0W+1zp65^mnYBI_*)cJtx-&9;_q$(+sz_pdP9 ztSvLIbHl?&>;&(Yi;TD7@=8aFHh+%Lftx3q9{s(MoG4O}$PgJzn z;<9!k+`pkId$)Y=%z@kI{+ema#hZ`e`k!*AZrOF%1@3?QcJ?h(&R&Mg3$EX{`KwA8 zT>jddh%GCvGvM;cT3lP^Mm&eh`)ToRk^A}xE|1O+uw~qm;dCD^-|64FsUva^T>mdg z;VsE$p1|e*pZUGn&k_+H$J&2wzRPwGtR9qppZlKJ6!dA|<~nHp*(9`lOIaEsy-hp6 zZp)rCg7EmW(dpPyaFG?xFX_qK!gpI7Y#u1Rc3tn@{L$tToUdNQvt@aoF+BW!-I=nb zI+bG!%s!z56E^2@?SZ>@mh${9|LuC==35wfZ8m;+dLt;mfy~#v=xDsSyvhj1|8vn} zOTrahc>EoR|F%iR*c5J`w2;6S&2%w1UvZtymVmR}aP>u3dbiBoI~#7_llIk{fAJoJ zyJz09yiKncJlq5;55CW?+4B5MEIfTAG)~_VueBbof8kcWEpHd7!p%RvVb_*e_F}mF zon|HDrqkQt;q55nYBYxt5gtz^9Jc&E>ke0c+pT_cjG84pJa6yby(Qsi1YF*TY08$a z#cXi<%=39o;*2lA%||aE&lhU!zU`R4*Sz0tudr9W{pn83}toL@UbK83^x88nX$NODs`6_#-?s40DzP8?eZT*>D^OAV>YM*r5tJ+g+9{`N;q3he%or}{@88r%a!%^79#CdttC5cOz*huy|=L5UiQmst0N+B zZ1^v`?JbyIZ~uhhf>psuKHGoC-S%GWs<%(&|7>;qrkbtgZnwSmHTCvIM;3Ony7mFuqT?<8Mc|W3wqu5x_Q*wM`T)9PuH%s{afR< z*W0w--uaTN_1Tl{wy8O8dlQxF?IrYstoON2uoZ}L+k2S5-o7&{)|%<}blX@Tx4n1& z*4c;Ur(1L0o@cw()@`rM+dBK4xB1pj)-AE!V&Jwn_+Fj8F-y6%de2JRHdVL1lP=cT zC(Wy|woO@UTP)+Y*ZO#!ePnQh^#qL#wr51$_Ac39Xa69s(R%&#jkf+mZhKemuCw=Q zZnWOCf1|CxjN4wL-F5bR7dKcx^50;qmf*Jc@4hd-E^X*kG`J=7B z8cwoxTI9Xgh`ruE!QIcgYDR}`nYr&?N9lTdQ(Xt^jKUh*%!ht^gZ1m}-##|5-kFtV z+dVyC?**rN`|}eOtV@&pZQ}xi_8NrN+XuSvTR-nIx9wsH*(;P*Z_l*mmz7MQysi0) z(7g<$_4Z%BU$y%Fi_KQbBz*6I#(Mk8`x~q-&be#DupnZuNl(4~{O{dX_3`U$B=1D- z4VhAJ|6_r_70cEJoAXbj_FB!Vw~u_qY1JI0Wn;HBdavZXdiw=e`Yq)YHd@bgirH(v zpx(Y}uZ2awd$N^cWz60m3+nAJ+FI>2c1qoCmlCsg<$`*92mb3jzfWMTfw}$NHOs}`UHAQy!`5Rt)&oc$@b&06A4~x^;J)u2*uR%rNUTcqfdjWH+ z-H$_y_m;fz-y3dTZ{MQgzFR?}d2d&m-`;zw_4Z)`!MmS+>E1ixjn7^Kk$U^!XR*64 zYfag^rp0^jE~a{W(S-Efkqxu=8d`bnb@)_g?>r}e_oLqn_g>-m-24AgoxNdq*>17+ z<$HH>d+g1>T4$dlTeEvE_nN)zChmJVPSx2TV{F*{-hTaF?-_1;4<4+u&oFM>U1zm% z??W@Uy%YD;*@w++-2LI{#=UAHZhOz}s+F|k=kAt0y=d<@ z6Suv(kL&Ci*iv>ox6IkQ*U4?~lTUT_k7q^hW{R7-_gJ9YUQU*J`-%U3cfU&O-McB# zZLfh?y?uzMTQxZR+jO%g3sgs@*BU>3hF% zb?sfkSZ^OtnY`PWCur{*k*>YGBK7uVzTUfwc3JNYm+RVFqFQhNK*4DD{A!iGEb3i* z>rCtI+k_={JLdB2J*C&R_pWoj{j<LfKyR%xzZg;zL*ItvXdV8M< z)s|Y08P;XaU3&$y>g{L0H?Vpir)=}ev1_kcdcFNOv58hZKU!_x*>&yRlvr=S;l&B7 zcTGEOCR%mvT@+bwUw7cY6_5HGn^z`Xd-eS5?fh1;aXefBb|He>gw#xukN${X1c-l+5XPG zkIU-pUnL!|He9;VcJJQKz0Zp3>~$s{u(mk6(RRxI&b>uNb@mHH_FG5AZm^wsu5)i# zS)G0Vz1`NVE^BQkzU$mOuddF1&c$ukf*C7p@5p!U_3f^+pBT2mI@WNJ?V;GNy?g-p|m~YK(H_5jAd)MCD19kT81yilrmvq=#1$6IKy;^5~ zD80+trM<>hb8YwD+b`?vOB`#hb?Vb>!+3i3GXATxx2jFC4k`7wy^-CsmtU~n{>OSR zYsNX|wzVgF_RdqPxAzJ$u=Y-nxAjr(-D_f0Z+~{1sI?3SyKQHA@7}5Q_4XINzgb<` zbl0ZgNblZxUiJ2SWe-_N6|S>kVei}P5L|CxUfpkHaHzp%x?SJisgd>e{Ni?2Dk)kv zTQmFio{FuvUw7lE*Vb6-ygikI<9Z;r|5cnHO3{o_L@%Kv)#CF zuTFTqJsZpAU0Eyl?rHenyLWm(y?uKm<8G}7FZS#>)Vo*7quyRVNOJc9d#=50b-jB} z+t%9$=@{+~5m4A$Y}~tdkzu`k?k11jFV~vx-Tk;{?{VdNd(O@AyQ5!w?Oi;fXK$uR zz5Uz2rMr7($L}q*?%8{ox!&GwcI$4f?Bcx#pLXwc`&4Itb$S2pQ03;mOcT5Jnm(wr z&*Pi9dp1MQ-f4E-d%vHpvv=RQaQAn!DSIEi@7ntVRG;Ro+sa<=6XV=;1|Ju4+ddl*>TXeeiCim9aE3DqN`?AEEy~ck#_pWQKv*-D< zcektW`n`{Db?()xth2XfKd}3$`^LRlM?3f4F0QlRwEe*DxX&B+p5EKJm#e7GK7sqd z?$;q3_nPkO+y0y}N$|uitBauyb!nWu5)px?Q^&P1o$be6(}#t;Rb0tnXWQ z&u3e)_ulEwz3jbp_7YJWcIRAQv{&nL=ibIyb@o}kD|bsxn6r2N?asYUtLp5xpIf*) zAam;8-%mRC7VNIGKdC!&_kzOSy_es0?p<`Y&c1k8|L&#RTlW6`(YZI{L7n}BwAS5L zv1NP1nY;G(ey+1eFCPVWCfk14t-nX|Ta~@Q8b`Zr$NX$JPL$tc%~5U7x69G)!&wX4 z4|DkT#7b7%dmMMPJNa7CR`bQr-I|)!_7#^M?Luw2Y~`Y_?)EpYwokd|XlK~}*rsOI z`rT8UtL<+;ceKl&u+b)ywR87!-)j5C?;Y)K71r9QPIBHI8Cq>W`KzPdj5aZw3tlgF zwM13hPx$F*mmqCzeJDs^mq2W_ecNwGyGct@cC)q`SiOy@w$J_TX!rH9!k$IWKdj`U zs_h+rI@-xUYTlDS$=iB;NVUDdS4X?{`P=qneeAK`?^A96;hm%1zRDMSJhC=hmpE11 z|9j?Wr!bpm?<%&N*8feb?UU|0+J*b7>}{F(*LtpcwY|qBM>|6S>%C>M0yZ1PtL^_C zb+l`K60ldyOwp!_t=fM34o5rNwW)he91Lv&zf{?8TIFb$?_0UICe^`a+QTY)yE%?_ zTer3DbxQKHd3~Q&E~R~R(+MdXMm&K@4c(` zRv&4$`C3wCpXuRfS6RMx?}2-*HWj&5_KTbx?fyJiw|CFiHk+=@D*IXXj&>Ow>-TDi zwA;vJR@uAQJK9CeTf2APpH>^5+$wv2Cr7)siL3VNENZsNE3L9W?%`;sd2;FA*^laN z+?uNFHwHP{HLjk&SEi`UMr%@){g*gLyZ)#ddxO=pZIYH$*)!)l+C}{6-+Rm~&c*mYa_;OX-uiEWsXLZD6Z*?QLjjv3#ecwq(JC>I+doLS&vJTg&wtsik z(Qd&$e3*4HAd?Kyus+D$57xBK;)Hml^AYI~;Nj&=@D z<9F>5)V1`Ft+wC(+tE(wT%z@NeZ5^DVyf-)e>>VaO=7Z1sXMvLJi6Lm>X)M(TUCIK zwZ7MX8yYP-H(H+?bm*Gv=iUG%O+7`!tQ_G)%H>E9POIip4zm$ z-LTuhx!S(}xuadU42SJ!!ArX(zYoV3RFiB9XDkNH*h?JkaXlCA4(H?D2l)16giALHO? zcSm=_6H$+C7-K&bD`Z+n)5SDtku_X!*7A@qpb2h-4m+pH^e&H-It$b zyYoTr9^M62_A4_T?PiEhwq;^Y-t%)qmHo~#N4qt)-L}u4hwXWMsLH;(#nG;IS(ELw zrJj2du2$KfpX6xwv8~8Y(IWA%3{)OW_yXeX!~=@YfP_f zR@+vi!)*WlTD1M|N+uJ2$CxcYE1B#C9b@eG9b+`Pu_|WE{$q^xw^qg2e-dCcNfwRW z@?L<^K3O!@e%i;^Tix!Yn$<=!*o!vA+81;F*e>2tXu)j%->&d=to=uWep8dRT-%fm z{&;*<+7W9nq{?VApEGugpem#N z0?t_bU%wblBzt1E{QAXcFVz!czv3K|$tAv+Ei2A3*Bg4JGNc9eZCBb&)T`KT>9jBNJ*<)iF3 zXmD+lm=>x4+@2Y@sD}&b+6b)Bf_;aQmOh54Y|Mj5WLb zn!~=uFT%dX#dU|u`~4ON;yCOlERV21wKZTnPw8oM^9$_uY>biiUjvPIDAupDc;mos zUmO)_|Mx-5_Rf6_7A+gt?0L6D+MoTCynSl(J@egiZ1%r-qwMc>vzqW_L~Xg%&1%n| z5oN#iJBvx;p{Olezq8oKABwV9Oky!%myO<{ki=roDjRLTTz|d^hp6CIv(wD>Z_1bO&^%`*lYNd}jQyJIG?SiR=eG3xW3*@Jim|_8 z+OvH@JcmU@BBOoWvl#mgOiA01y4*46J?ABAxla-K0OU_T_6G%^t7Vv#n#zU%Sn5arWj$`a6DStg`T^_-9wC5@+ueG0pT| z9{;xB&HwGbo{Y7ZEM+heDu~@8Rmxy5R1j;Q$;W7NM=W+r79XSiZLwJUXUiB(rtFQ` z@^l%a{p7td_PTaVCdDZ+TeR(%?2A)k>`z@`GST9W*>dU%lf5=~jD2wivx&^+=q<$= z%=R*yqwNKLGn=SIM{g1M&1|m`9c_QRhs8vfIeN>j9u|8&=4g8*Syq!dtE09k$gfMh%L%@+3nx|h_DYy=P=P)6tN{Jox@&xQG|W; zdkzy1pNK8d?>X!}d?M^?%Q#KyzJ+gTDC4xR`xb70Y1c86EJ@R?On*7;mo5mm-@J}< z#|wrwi~1%m`+r{H_F)W>rZvo`w{o*{+t+;!v*(@4ZIUuGYzyyHZu{h!VfN3LcwP+8>)07QElA8OLV-`dOqsdifZ0PQ=J?M!!*i z&+C1=e3I?CLxqh(fAt&fH+i{F^?9=W!|8%Xm)s^81zml%ud6Y|{;`gL(WfI5j6UT) z+4n&@)xPQ^pOL%lL?bTdNBa!6rrN(T;WZLym}n&2dVe2xV48i@d~T!t4<{NqGT+^| z;dPq5H4B$fit{9+$rZQuxwoa;e^2Hxdbnhg(Ss+~_nlP8u)lnS&8U-kvQeem)qSnI zGwdU{SdEG^CmRLKxU{b=Jk!42pUr5h{A8nfv##vB_$b5vw+n}n+L}p5xm&L9-}io_Q2Uqr3Z5j}+ewNV z9c$?~l4gFh@0V_}eacxequ>1fMkn^X+gDVcWG`YRVN}%CXOx}&ai8A7M0-I~DWm^d zeMS>RzwB$~Ote3KP1H?eh9uYl{Um9%c6%6=l8ICnKC} z&mM?mq23Y4)dgav8}9PBOBXaeJSsQ@XuyFsG4h`XnRwgq!<}Po&$Qdd6V6saY&mR3tSXa@cHFwMPxnfOy}>sYqn){vjkXtE+Q*oXX&>9bYP8E` zvXS9~%lq7TGwm6j*o~}TOfm`-zqW5ecZU7ig&amRr%f_ya=)?f3TK9W-G5G_`7V=; z3JPxRGww*Yw}{|2y6|bD(V9tj_DyF?w+~&*V{~W1M5ATv?(O^3l4j4$!e=zuccM|? z*$4aN8Pn|ZeEE$w{+VEucSTMN>7qvOlKYM7PrcbE z`YXv^;JlcTsZhU>_>On`)>S0guV$7oN;uGG^m@UEeJ0-%?QfY%8nx&38L6~>+P9=M z(LO6f%4oTCpV6wUFZ;4TCD`wnAZ>K;RIkw?`)~W=ixTYTZI>~Mtn4+~CiG+9+K=(} zs&{3Lj;Z$=F+Bdcueu=Kp8JEG(dGL+MoQ~{@3VX#XK$*YVC3G?W29C7ci+q0IQxoV zMWZ~O9wX+s|NGh=#oCJrDH>VX_ZZcF`?t@7Aq}is`*Z_sW0lTXZ$vUUG)C(UcRtMpL}M?NiK8us>)iW%S&v z&*-h#mwhUniT3HIC5(Kh^cmf{_HkeCl0^Frrs77@|N4wROn$#_u3eJ7_X|;@TEBiH zG0(UA*ls4-qnD3sLV7nZxPH~7Vp5sC`RdMn$3vU9?iZM`Ep~gE{l$eH`}p|SE%qER zu`Ib$W`A)?`@Xj0)6Ek~&spqeEVmbEY1_BwR{qvs%du0@~_29bjZPz)=?9b-+?hCjzb@P_0t0wdBm)d(w>D%XV ze){HVDOXJvZY{OnwWWU_|Dsu2h5t_5cBs45{>jA&`+jo@SQK)qS?)+IwZHIo;=WYZ zqOGYlvD-v_OYOreChc3VwRW>-`V*5CIi>a*OD68KIy!T+wBJ<|n-Vo+ zb6nh2lgBGd?O(A>*w^xA+U7-hS54NPD7Du%>fbk;ZN2H##qZ3Do|oEt#`W#H^+wF1 z4|O@f@)>_x<#{U zxxGtG>%NEp4)dB7_7;h5<@WE}TlU4RVBBKW?rNNtUT)tpp?P1>b93{3Z0#0V9p(0B z)0_6${17o;xH!sU{>pOu%vp{5+@-&m{;+g4|8uI`K6qBcz9ZdB&F`fCw3z&++uvMa#p;$XewEud_}1-vHN#}4hRLgSv^)FiXaV}}wyiDeriJMfpee(I%eQ%69 zHs9yDX2STp%)V!9+rBINIybZby=rpccA5RhneF@LyLE5YeS6hp?w&IH$JHJC)}HLy z9Ci1q$&$Hc_F~bU`|LgXHn*LS7q$#RyM8~abUILKLMpHk4f&s0UyeD4Q43w6CR zd(EPrefy?xTO5)xuq+HJv)@zHz3&jm@~s;uZ{PN_tjvC4e%C(q^0DZi-Oj09_jfG1 z&uYKVB+C9x{pIZ&)?D0?WXfuPZBCT^tUP-Qp_rXJ#5!5*%UGlB!|G0(?|tX8qvbZU zy+U5Jz3L`Ui?`8TJK}Vh?HR8}+dpaL-C1~L#}2J3Ci~A0G4}4$Z7ufP-L|9Y7^D5a zRWbHIZrE5bUEQ|BP>|8yMl{xbt+CY3NcU|!aw8e+Jc{A95Ymc>G zb6#U-x#0F42C9tqeVnoOExSA|4tj0dq4k^5{$F>DePH3N9l?=zcHBP4WWR|o#{SH{ zDcid*p5Ea%pV{7dQndZ*>1-B?$vbw4=CatQiACGTI#}#n#(i%`tOct*>+C4|1o>Ut zeP*27k-^Aj&!iA#pPlb$Vc@oNhr$Uq`~0Pm_B*fM-EMtj_m0^;?Dihok@n`+0oxBh z-?JmzpTpj4V}yO4o%r@2_hxKM;ODgeZysUaH$`iwtij_t@^#BIM}LYV!moKTCSox66Z zi*nn?z6rB;lH;%_y18qIM-P|%CYNyg#ZeMFB^i(GNM+)(H<}x6FOeg$^P|<_9S!B2 z_P4%<+uK#YH)FYKw(ZVq4*NR42>Wd1dJ8SZ&pY9%0|}?7)t)#d~&mUtqWY z$q;ETejt43yN|3pZ#b~q*GEO#KNj!XQNVp*N6ZE`d(|zG_BsxS%!|3UY(Ff=X8(;h z%6^Fy@6OoIdv{#zX0;d0h_e4UIl!XWa>tIP-&yQ44@KE~=~P&#>+aYglEh-qBO7f$ z>7(?{2WNNf&^*m-|G7NcUVB0R4o|C{J6epH?e|`awqIIgYY|_)eTUynCi^vW3;#Eim}&-Tff7_Vf&7NL`M6hXEFAS-oX}Sy4!XzA7-#W>lADMtS4}1 zTl(J}T*?ggGv>$Io7r_*gg)H4Bb@2K-NQez_7U&Q&5w3$+@8PYuidV=IC}<7Q;R)r zD|g6M{IhFSiL;;WFk?qTyx@-1P5 zGTC!+$JmEe#ajfVZr_oV!ECR#IojS%PGIL+rB6H5e>2-lMMv9Q^#0Br*Lqm& z4Vk0ur+cgHXvn&?!(5itzHfDuy|k*;PUDAHcWA6(wf72%vQNKYYH@kt>K!gtZ1$Xg zBkh$951ZY6zuWA=F*bX%Ws&yFKCnUW!w3fp3-6sf%KmHM6 zpB3wA!7Z_KhjluKz15-!`-7gxcAPgnup{6-hrORqguS+NghfZn&K-qioc8VC!tJ|N zZf^g3YVVHke>m;eEC{#v+TyYOh{L`eElphZzrDikbEZdbzijbo8y`Ejea+V}`|Z2K zcS?U_+sQta+dge(nEmp-Ior%W?AmdsjN6`hZJ2%U{=4QMjvm}mc!|rtN<7@&_twcB zs&hZ=cxlXKUr`%wf7tKhjzzCF?zlOb)BeokaC_(7dv+XqZMO5^Ck}fBuL%3abL=hd z$nV?%>yQ6uwznwO*tsKgHM_mIM5O&R0r8y-j{A44WM#MasE@Q?;I&};o~yfdsKl|^ zzk3#Gk6u3ByewjrKeOMcz3275JwD0yGkyvg$vo>f+GO%_pT_fK`$$$Hqx$d(Mz&X< z?dxw$u|J+GU?g*Ng3;sLC;Prgr`j*<<1<<$G|`Ba`O!Y3t*Q1)EO?FBY9|^ALi^*+ z2e^$a&rdWmW4^m@)9W<*B&Z&v##vB`Y6NRdLf6A z)s{&{>07Sv4Su7k4<;CO&Un0!IWX1!@FYQ_bD0y2z7{;&cL&-Z-}SxU$jkoazM?0| z_77!6jowY|H@{YD4&yxUh&o@8H=EMe5#(`OW!{c)f1!9;sC zAt@tGi9Vw)(J%X2ITP)JuS**V@8~rOT=#7sGqgW`+NIa%nBC8PLG$A67x2p)9lzLP zBz@xdKHV2__Dhy47|o6CG0O4(w@=$3&YpXgq7k!fkJ0?@|NBy}#@c7jQZTZc)nin% z{O>-MggE;Z>hea@F7_B5z3_YAuBUPKr(eh#O;zbNO8@$EUs!g${kEMlM(-*Oz^UzZ2}UwIq!)%KMB0!$0l& z+L&k`a!1_g-l;w#r{oX&=CCK(?>Hc4q#)XF)RXycUrcY3{fc5yqv<*QMv+->_9+P` z+b@(5G5U2H(I0=gUC3y&%><*1Q7`r#kxQ{RNf0zLE0|zZ@AYh7&yo~-E-eA0OGhUd zX`4LR7pj$Nzmu8Y=&`~?qn}cb_W7<)wO==z*Qlv{qS2=>_xIg1O|zd}%VU&qcA}Br z$-DcE_N3V_+{I2!9VZU-do6#M)$wtd=UD;=NCBy#vcNQb5qRB?{i!SYBPsp@i%fV)JKy|W_+Jnpc zJb5$ijY6+I+9%nVYX5GgfRWI$2}bRApX`%hNVWfTOVH?k*aRcFhtKv+s7tXw zDJ^W&@wVSc_x_80EPs>j^J7GeQn&RRrC)!wZ&G!#{p$`B-y|JCvNoOV4u;41t0bqe^0bGEtfR<8q;Sa+xltWveHER=vpbG zx9WXHE1~`IUsI)xoKN=}?X~~5FR>`W-s!50(ay$RqqRam_HFnWZ(sgf)+k=N*XaAB zpZn?x;_YX<$r~x&M)b#RT_mwZ$( zO1A7Vs`&PApC?0{{j>skBlb0j{y1BNoKXowuhHN6zxH)m$J@LAkTHr$={33o?T-h~ zmNuGuy4R@3``bR{`~>?|I#NcBGJQr5#lGy*;7qhXxku+Ai|ea3^PRx&32{=6&8vzHLuG zXSmaCX1Tqjc+)=nDYv!=mEYS6>W>$EY}m)-Gk?4Jxz{^j{qbBIGtRn@w@0Pi+407t%zm{~&psjVv)dmuecu7=k8}3lG-0dvGFx!J)ZTqc-@ZL7 z?{EH>!D%{wYpMP5E&cnJt3TSjI)c;mKzFJAn~M|nMJaijNT2y>3hIxae>-vC8NcT3 zT|QHGi20V<`&LZaSFI?wBl3^Q&Sg2J_NGfF?pv{gcgJY~m7TEucy8&e&9zGmO=11< z8Ljs=rxkFT!usP^Qn|OC5SH9t_Po?yJFaivm(TV)LOL>b*0Yt_bGP^IyZuFeyOgBE z4pFr-`)#Xw_U)CIGGVuWYYOU*N1f~5wkUHfD^Wwx#AwAl{pk2^Fg2b(Q7z+u54;Eyy{#IiHiu^h9L2{kd<=`^qdgZ7pWKxGmSR+`jxp%Rc4R>^ml| zv)BphkEfh(-N)T2x}8DGeFxj`GW+bUZTmWxh;92QWV#*HAAdKqeP7_r-P^CUf7`Ke zPnrGE>W+Ovl8k1DrdygXpIc_n5Z$>?`5xnryd$bRZ`769x0rYB3wok%dV5yCnMOjH z{T9LQeLMB#&G@83%;!3m+2_CP-ls1pu;U1W;Z9xUGJCH5J^P&cgm*Zx8}CeIDYIWQ zwRc}!m+bb5|E+d_`r{jt`}T>4OYZPeH`@v7kFy!}@7vI|d%M{0+dBkSm)bx1)4wl` z>)Q53n%{RM^p@H`J2qk8xpPlUo*8-IMmb9OwRS89LCf5N{1rnk10ZT!4F z?@#r zA1J^0Ad{U8x6yw0gG~D*xsB}ep?qg3KMTsYgYwg$d@CqF6Uw)x5}%Oy=}`NuX=ER| z{pfsj|DwBxkopX$`)#1^M^}$7k8U5e`RMMaw)vErhaNtpnny@Kx;%P#pv$B43AqPd zJ$n42%ah6{WIrK!bpN9B(e)FOM^{fOpH%bF!xNp49-ip#K`$RS&0J_1`E!a@9>=MD z>{i+KU-XQv-u`y6{`Gy&zV&Z%?RP9nv8rD<%R13`&Au4XLVN3%Iaa2Ohpk)R%-t8= zTx`FpIm2qL$OY>SWi$3QC6?G9cx7ZI88FTI6#JZg?=KeHN9HWF%>Mh;>gTfs`zEs& z+h0{@+tG4Ea3{mNMf(gk7TJrI&fgh%>Bz3d&ll`#VlTGecwS(aiHzCq_{+2R9lup< zf6Ccy*Or5gyLFSN?z?ik#Qx*goL&EA7Vi#N*|%@=?Na;v`lemCZtdBfwWniW>!vb$ zq1N_YQcF(l)-Z3~*PvT&|0<|sm+jO2yX7u*?R%YGX8+4SYnP*TQlI?r+Y@MxtKbm6a@vOwY z`OLFD4DWVXhllpsm47U?cVd#*E6l)d^Ubf-Zo;oJ`?oeKd*5uAwt2u@YuA3Q+`ePl z`#smC-&mi2o^Mxlu)^MKf#;roJRa8bKBw3<)>qnZwClIhI_uagB-?V;`&C|_>yY<6!?SlVQ*q?g8-6r_3-EPs4a=VzQ3VXku`)!=e zOm;_4Y_N;mS#Cf1*Jc~eyt?nm-$v>%+< z^?2$eyI{vs`&Y?QHo`XTyY5VxZuhCF#6ECCzV)%Hmpk*1%(C0cT4IkL9%@gY?B`B;{ieOx#($>e{(N@>d*(LFJr8~UThF@3 zxqsi9aQk=N<$JtMQ>|v(rS5xCQE5L{q;bz_U5DMKHWT(<38}X)iml#L67pmBGSknt zQ`GA0jScJfIP8(%v$>MrE;6syex_2x9>3#udvYDs?VOrx?4OD^?y-&w-ZTG{zMY$D zjr}{Onmwlq!uM$EdE0s3uCkw&oVkb5F<=k(moB?^;brz-?_BnLf?#{u-Xx9%^?mrpi8JyR5N^n5xm=4UKlImzCSUo+53W_0HO; zEnU_D??w@zQ{imNo#+MS>jaE&*Xs0zP(_T_e$he}a!)VU3 z8+J=Sr`uaymNZ__6lN4YXN6tljzarMQx%OTaQJWVxYM&I;9I>tdU#y?o3xwtzT}=> zt*HIqUb5OhWJurB&bNNg@+T4dd9SkDXDi>@GkxRBJ>p9v_CIFfuy<$vzbEIL)ZT<| znfo{Sp0f-1&A!(wNOEt9Vb*>=gR^#1R$SV{aO2FL6V~DTb$z((=QwljiEZcI^Y)q1 zejzb)d-hrHtnRJpwPG%2+yCfhr2T_*DI0m+-_~cVg!b=#8)&~RuGMDU^&*>7JB9a~ zG6dS!v#+x`nY+#A{VwVKW*px3YnqPQB*#3rd2m>9|7?9Xdn1GWHt|YqwvvT<``tvX z?UgUhw>j9#Y&*ThdVdhJp8c}ZDKft;qee%h>Jz zO{uq@>weh!z{}wME9dgtqlZU`b&Ad1+t;l{kH_2nJ6>teda}(%{F$Q7wcT!Z3q-5! zgN?gvR-cWsv3c%icWOnIz5mV*o3O49o4tRE?e_Lo*!$+x*~DI*XtTX%3>Jw$N zQ2eF!{PzO(a({yC8!gLht~791Up;7KpJZlkAMajZ6QUfn>riv9UGd)vd*N&9HkG?H z_B_5nao^;aQv2^r`qqb!Htl)xS8%_yLy&!Z>aJZMWqSAAT&TU@_KB^%;e& zJcT9pPkZKTzinQkjlqKByG1J&?UUVGWUu(O*(OzWvDLNqo4caF*W06qhcBy=@rU1A z^)=rMSzr5KZ@;if-k5daRm1;j26py3HTG4nWsMIyS{eP4o@jTeq167?Dly~d?-Pt3 zUteeEKc~PxH&fWy$FA5&aOW1gC9V1Pr!6IoPp%I&3R0P4Cw;Eies7}`aUjO}_14Nh72+x-4oZ=c?$WURJgo#D3Q{C0=SYVAX8RE*PZZC>9LUuv`L zN4@={t?-Vr0&vX>V%pV6Vo@X>1?5+~|oZt9|>NDEmi; zq>YbVbujAVo@Te?P>DTyc$nqC+AVi{-tJQ&fA&q;8)skcH+hdkPw$?+g);lUb$Ho} zcAVYgy^3M)mTu$yrwz>PB`mJ)Q7+Wn+qBtv|ABrLdx@&0d-kfR>m--e^zBcrPDr`zPw!K)SNq*% zy=$kB&1dWI{lWcQ_I1fOtQW3&V6&MiV*f@XPJ08LNShU}KiCu(rR?8X`OJ>*^KzTe zW#4RcT{HH-sJLb~sql(Tz7n4;|B8(L`-`vG1%F_&y|meYln6IbN>A-JA&=e!=w6fm-)NU z+ZKr*@7e5nUT>dWQeeKnS=K7~sgkYAnR@%&x!Kz@rB_&8;qtakSYK~{RV97Lj|K+o zNAuEcnWop<&)vFv$Bdow*53llZLK=$?M?5l+;Qo-q&3&>0^82Mdi(oADcb{YZ?%%0 zZfm<~XTANsCkxDSw?5%A%cZQ`vTzxJmA} z=JvJMbT{0!`*7bb-!;?uu_~d0DSSGvE|4j4FL;4c?ZEyM7 zumA60uKs?B`D6j{{gG?^>~B@_Y$?6>7{0%KjXlqn)}W{G{r7=vJX>515$9Eegz|22 z*n&9!V4gJZmbcFy!u6kez`aHH$Wu5!nwfXY`Gbh_6!Zn#O?97tF)dUU-`_Xi&mKKI zEO+c)IH|pT0Z&x&zJNKE_Ke?_FDSm>q8Pk9XrFgmmAy}$mGURopattmg3DyRyAgeSmqY)n{l+l-ZJs0 z!n^8a3%$8p_w6$&w_heEvrs@tLt#r<@4lNHW%fZ*@(a&@a#75eY}{A2tK9y+BG)2S zuR99@lS210Ew8t~ylvWo&S(6KJReTAbqT1q@2+fL*t^qTsV#Mz?d0Ee_5yD&EZnm0 zyuw+`DX6eXF;ZF_%~~FQwB(*Z#UTgg=yY(Edo6QARnjAOEurHW? z-7d2}ZS#`!6(&t*vg{8rpRwD#zkhQt`*IWQ*Ln8$A8)t2AiZ((G3KQvTda%ii&oFK z+p+iD=8ZQNnYc|avp?R^X=kAHXtSNwLX(A^753W-O6|1f-QFy7YN5&Z=jHZ3CG~d8 z=eBPC+`HUle|@g~4ypZicaOZ;w9#~xiS)!o`z!A1Q8nbZnK0uve7*^*yZi&u;JD zw6bWG$+GBp`x4z>b_=G7ZVtY@(&U0iihb7B=XU7fkv_rBs$k+HD;sf6`v*o5_M0xr zT7T|XYW=B|$^N)SjD3+(r?u``Hk(H#KkXjQjkkXoyx4lvLN%N7R{!nJK99A}`O#y2 zdAqF5sseWVY>PP% zmy=)ZR(2)W`^L%b36v??qa|_NPT_pE{iJ@!J&O)z?2)SLxBIfO)c$JPhur~ACVPHa zAF;E_&9P4iXxSZZ|8w_)z%O=5-xBOAv_9=pS>C(5dONqhY*U#1ZApb)!AaY9eXHTK zH(nQFj~*T?_w6?n-Zk6E;N6UU4gn?hH7gGrW=)xC)UtljzSX;n>^0NA8fN{NY-BFA zW8ansdGocm&yRz@mn+*FSe2PY_zj}f_9?)lvSEWF4^rym$^Ci zuelvzA8^#t=*g@Wqq~8^`#;14+8dX68U69AHIhCrzhCK}yFFJ!nUUN4V5755PW!nE z)a?0~i;b%F^^Ed@efGb!lCqDri!!R%=V`Ryoc;cn-J13(C!>s*w&obcSZVLy?`LOU zx4_y+j;+Timxp^l)2A?du^J7d+FxBp?&{q87d{BH-@|KZBv;yLq!P%!KPn*7KKzBe z(ZR+(qcd4w_9cEwuwP;G+E9G|bfaIZw(V0@&$mYpk6H4(HWu**tR7CSx97J_+q+ut zv`un%mGzNT_4eu~P4~W*RIoL8KHFNNrQUvqpX1((a(1@aCH>ZI9`*KjO7r(V|Dk2O z^qqyZtYp2t)ZHn2Pc}cadEGbLiifq{{@dG?d-TKs?aY?<-WI%Zym{S@`9`|KXg+w=OuIxC;fQu}vZ6ZWZFKHlBFz-E{5 zv08hd32gh&!$bB0xAn8-cGgcWthRGgFSO_Ws$iq^&ca5iu*L40W4XP0*khZg;Y_wK z-Z$Hs$(7sRJ$T>dY%GH<)Bk2W9=US+n#avHvS!n5jPEqt{q`ugZ}$9e?JOW=bNKfp zyI_-2`(5jJt=nFET355|wv+bHvtKN1x05&a-Oic6@7aYHrP+u7Uc5_|U3d2$CKh}1 zuxNYD?037C7B}s-napf|WJa{TMPbnHO$&DHo*eVoE<7&P-s;qX-DfYn+3o4Q-_E@_ z*S^r>#%>Wau04-f=GkqoDYo}Xk=(QSjrX4C3zpk0zFlZ9TQ0XpH!yb3U50ITk8Jbp zc}@Cve?RnP_iObBc6-#)?Av5k?c!CC-u>b#)j% zo;cq~Fd}uIYJH`>)RZ1W?HMzS!WK2``*gD0{-eVo!)Un~M*pVI+1J0j*#1q8l~HeL zyV21dg8Qqhg6y?drx~S0CK!d^Gu(ej*22EoH{R&L&Uho0`=3lOxoG<>|rw0?@se4XI^#bpBa9j9FPcHFSD zRd)&9-#>xJUQ0V^uYIh&?Z&dO{S5tF_G=pK_iFgPwn@s4*#Db_!##f;gm%`y@vwZDj%Y$B3 z`wy-Ov-8ndXEXEFB5SXg_4|Fl7uW;`e6aD@e%AW_o%;QnN5b|@yvt|1QfsUAhl}<5 z53%~~xzQnR`|7)^^|ed&`*-gx*?Bpa-FCKyz@AgRHT#41E89JMb;0IVeDR*k*NgWr z*Pd;+SYo z=e6v;qS)H$mH8{Vc1UfWF!OPhS7`o;a&(&;FO$u4aeveuHMleRCrX z?75~g*_E6(++X>IY2QvaBm106Mmr53gZ*u6Ec-SdHMXA*DbwA*mV<2{f0LQLSMpz5#b%xTH#f5FOU^L2Z`=RJ_N=hZ{=|Q5`|e#Zw_l&| z*S4}zXaBQJZ2P`sn%f&l{;i=X3TheD3S^de|xaYgeK0}LY`+o*A zjNE(5Hzu+9>|?rDWq;_$bfbSP4IAIE2JZ`Otg>IbX1bAjSL?eI9?mdgpBc4LUCU(O z8paxX^zb)qO;b<2y>6*~;K98~x9jXz9Z6H4Q#WHN-;5P|Cn(n2YjUTnJ3cO5n);@F zZ)1MF{lCz3^*t99mNK3;+-rTP-rlo4U0rrd%#u$GC3|-NsJG9oOIJ@;TdDGyaktHz zclGw&yy@y`i;7j7*S6WJ6xG|?Ii{(Hd^@b#y6lFn>x4S{v)QTY_iz7Fy}z2v&TC1n zJ?FF(^~INj)lTOs+kM+!W1oIMS>3NuMJ?#QsU7#bYI~2WWc7FKx@yTj_I3_+)%N=s zQq+5=E2>>zW@PtVsK$OzYO4A#+dr!F^11D%&aJg)YD!aI{A|7I%8Em__pjI4tG`N9 zXPMHe>LWG7mdU%`KDH@MUGwC6Rl$fuwoW(d?C*4?tKVT0Rp~#ZVzc2-z5Q#AboC_p z2-T7gdA4a2>h0y!)70nJo>uk!`M@@*xX#`=J5}BK_b*lRyZ+TD_7pL;~Tfl zt7%8}Wk==MU%2~yw_B5~O?d@K?GC&@+vayp@4lUXOYIplS*@2{y>2sO zL*c&LYbxwLYZqF5ba`aM*J`ov$kuB6BcC?yV)%5)W`E+(y)jI6_HI8bcQZO2v^g5t zus1uW-d@`L{O&~_Yiv|q6>V7G*4tlJ5ZLql`UIQc4~K0#j@8)*O8e}&lIvu1TsqHg z^~VbP-xG`W7)3s@o+e~&XMVlfUO?7&50B@4>!U6rc1zuA?Yng?_Z%%}w~;=$(w0-A z-o9#8*q$f03O0Z17ulukDzaz#ykSolf4fatw1WNIJa_x0@*;bE0x#JtJ}hH@TF}d0 zeY?h|N1w7&-cAAtyTvm?fbI0(*Dd3lRcZJ{<5~t_`NUhPn>-q z$F5!5>|<>#OO5tRHJjVFy7$=leVJ<$c*0}<^0jjIJ0c})s;c{Kbl2GJ|GiJk-r`U5 zZY_yGn`t}b_s`+*u#ZXN+jC4^(Z*@<$9>mVC)%Tj|IS&TjNY%kV3e+=VIR)nX#ZyR zYopuRH;gK>wd|!h?CoEQd^D2Ubj|4h3qAXbZ>{Y4y&f4&bAM+P*{5e;F@zit=%B3?%0CASV5Z4nZ-59tiFcaP^XzP(|A(Uf<8?2b-}vuExRF=kqq zXvC&`&hAKPmi_x5;>JpUWsD{^Pqiz&USco(TiN&=?*#+MUfmJM^K}zM7recuDR&qh*i2+x`9*Z}0J$+qh!m3L~3C z%=Z4Z(e`CL%Er0IXAJkM3)!(H*4hiODHs>Uf7oEh44J=>@=-93R6M#qTMfeJ(Uvrp zoETyxba}a5)a^q1{A^}p-G==}OV!2fFNOKryW4y)I`;Xt(LWwN`#rm??I-sCHnPh- zX2hJNVIOtH!M;oMw~^+914i@o6z!cKyV=hEHv_apXuF>~1eUO9cYuBOVK-;x3QZwrdrUx`_{+qiGZ zp7wbz`+06F+iUcN?UwHSwC7@g*?z}fWBc<;>APAA|L^fUqP{=f*wKFX=1@yUp?7-@ zn~Cq2$@jDWCLn8-vf=ig=`5`KKg^4=4`BAQx)^j~&%!&e_uW-YwojQKYx&cAPNVk{T7`OY4dEcIQoa^`bb`;ph7BKIUY$N9{ku z{?y6X-CroDV?V`kk@aThnmu>LQ}(L|ys*nH5VENVc(O;*ENy>N z@qN3W-^*-X9W>tCZ<)UTQPC~C*oI#gd#B6q`E@jP|B?+4?fP%q@02mq-z8E~yx$^d zp55H$fZgA#`*y9FT)bbPcdp%hGs``vi$iu**{1DJK6Kx1rR>{1?y^eOo;&^b|Hv1$ z58k?I&*{=u%gI+g_peWowZCyga?jP@-n+Yg2JYXHBV<3xX65cBmnQ9A#~ro5N1n|d zJ^WYw+iGjk`pw4GNozm%N?ZHQ;Tvqvc+Rz{&$ros=bX0vW@cww#T#3#%(Gqgm+n%w z*VKu(`K4*Rhx3yAe(P`Y_FQ+vY$SI$?vb7mwEugxpuJdFtPNv}+@2}c2K!wXS=y&% zwAi$`wd^*ZwRhj=L%H^AC$!m=Tb{Mr=x?}p@y>etS)NTcmwESDO>&jC?Kn|yFV&H3 z6W20hH{Y=w+xYH!`;Zc68`nKPdrTMKv=wZwvk$JYv{^K_f6qk+89RwjHTHj{oozO) zpSq{X(#Njhbd`OxO{~rT$Fui{#7wiBzqrKyn0CF*e3zYjc27ELXD66r?;qZ6!}9gh zo{6nD?1V3-+kY{yw7FWyxL0q>Zo8d~dG@^*=G!jIXgnv}nUs<7T`(9SqmQ}A{A4h40ecL5l+pqh1Y<-m% z>=WEtWM6hP)zI1X41x{CGJKG&8OHsOM1xA%>dFjmmaHF|g9g580=nf5#7KNuxePB2=u`>WlAX$kg6WcZA= z9~2wiS;1(Zy(h*#Plngn;PyHr!z*m|-{wZz>t(VUvpCK*>RQ2T&twy7f81Np*z;VS zQTM0Ic2b;~_Ie8J#?IA3Mx1Y3?VQER?b9A`8fQmLGIG0f+-}c?Z2MK2EXMbW_8JA{ zbK3L&4!39QzGl=Ry36Rn9(8-c6i0jX@Ym&BV{7)!Vb8m#wf3!l5AXd|zR>o^0-im) z&Q#dv3nuT|zedtl#ZPzlRn=_!p6ZkP8g^f?O6J_R^P6di{ZW1X{Sp1|trDB;cWqkj zX8)*2asS=3ffg=}>N`9BXxiV%vfrAlPD zesSLZ?m6+6=Kl}x5*A-*xBP$6{u7H{TL#s#?dkb7*N(BFc>n#FPAePP?mh0x^X=F@ ziuWr_}=Go7u&zuJ8R$b zqn5VKXR3Ftt}L}@%j@44Tj*lD{NvJ{@#@v~b_x#r9#2cMHIG)>y)LWHzER=m-sn?3 zwhz~R*q!*c&feCrbT4}N=R9{Z77Fk++Lhd7XWU2urG9RF_w-oH=6b|!>-(`(mu!1)i_H|&8YW(klpgeDtnz0H)EHB zJVwqZjO=m*YwTT@x*K1RxNG<{lgIAMlv;bq3J>FF+m;!=IdIwbz=Aq^(FY#JYKNK) zFGVf4y{uAie~H)ASn*q;;kSl<+t+dR_8Q8b#{Z=K4D+5g*)mqu+ut$vG=3pvYq-m> zz}B+A-d@?=)A)Okx}igRi0#hh_4W?op2n@Kg$!%Gt!(x7)Y~6R^fY$PWHzjSrDi+f zWW7B@ny2x`i9Zdx>*Z`;ovXL!iu5#2F%~d1Hp92heu2G*vGdbyhIxK3Y}q2~?7dt(jL**9YPe$UGuzK`b@nG_ zxf^dNx^L+Ag4b?Yd#(MZYp%vy{zw{~o91kn<5_K=zuehaeS)JA|Lsyc{^kmM^zeT! z$+>0uwl|wEp6B1c=VY)wmp|tgH|sZ>zvv0(qN+gI%7 z+~Q*Qdb9sWf&J_(!S=}?Ik%kL|7x>nkl_BjgF*J}>Rem$9A9lN-6XjGW?hi|lo+lp zFAlxjyhBK6zqn11{ke%;TUNQe+}v0sv_JD_p#6elTw9(Vd$D=xMWOxgwguXo{^r^e z==oxEj)Cz0l9E9Cczy0IPG_EP?&uTVZ)_B3zb=`3OQPTN&HvsA?=N~EU_ZH&d&{d& z&o);XitK-~FTmbmF87x3!_PKzhl=c9ur$D)={WZm#kgmir!NrMe=R@2o>Plw%io-* zn_mZu?r(bUZ$Hz5cT4xhN1L1M#rHFJ``L4=a%^#V`EGNo6yJW?4m$^JQ<>qCYzfGDw^^=+Z~yIeA@)qI99y39zT3R* zDBu3-+7SEuJ26&v_{?RlD!dtSRf9_H7KQw)fxRJ@fj~BQp|S zs_g4oQDYxCDN(ZNC#O_Z*x9{Dw$|A%KF>UJzu-Knid#)KOTO3J{|;=FV)FK%)!im- zx0Sut-g6e8lvM642`RS*yJuI+?JJ@m&yaEDn(Z0ZV#n@VZof>$f7ahc84{gsadvkf zR@!?v@<}yLm^bUmY7M(f4K?=dbN9~NE8RYee-4YC@{L;i`4$r;!xbAP^A@PswXUwQ z4~R0B;t;Zt+IgVG?yz0C{q`OusfHQtl2O(>?ar*ovlq^IH)D1~rPRgUm+YGTGwpx% zrb^nrnJLxHcECayk5B78jmXb_2(UD2An%6u}@sY zj@7@`zR|lw>Yz>U%ovtT+j~>%?NvTEOU2gSnr^H2c+cr)_4YybVv>(d&P(0uIlp)M zx;p!3=hjFH&bu(<**DSsVpab3+b0Ij+EHOUD_|nye!EjK_6s@KXSFSGm+0AfZr^N^ zEPF3bV7(M|qYFVb(!^keJY_e-M8 zeqM3C)Z*~gnaqAI`;`33?a{-(?JV<_#D#NBB)3)DZ(L?&7vgzo^S}N@Cbr+o>}zhc z*=2>!-2Az2nF+6Xfqfd|M!OhE+s(zMD^1?@r`s>{zh$@o=!#AA+E$quRK?lz`TVt0 zVAnC+dSjKzOZiayvzK`7J3WsYF=nhXncDAd&uuGhZ=R%YTvxEtJ*Q5t zai7x)le$$__BRal?fF9{829~OW+Hyh*nY32nf)BM#m4#1mzrqz=-D^9Slgevzs7ii z_fnJV7qso)9kaDRP`Sp~Drl*R{5x&?j5W6QQ5%;VKU%QVzaP{jH62jd$5D zGl`Kku+KPcX@85M*Z8;2a+BFxP3$#8OznSa6&Uv!t}y9xv$B_-t#AMKtM-;3izl1R zU0!eheMN|EZh*m-XOWXkE?ug(R~3}7HG5~WrSJU&6ZMbv_7h{**@T;$ZwWP@V50P^ z-u|#{w9W6ShFfC4Pc%7sr{3PpiOqJ>ZsjfCzD_miF{roaxxC1>;hn&iFFR(Lh!oe_ z7wZeyp@)Ccl!tr#|GwROE<(rN>%5hH$d!kCg1uhteZENBo}<&+e#R8Rz4D6J_G)aE zv}ZcxW&ioR&fX<5EB1;Qe6*W8Il-Riyz$=Bqy2k#+&O1=)GX6}*F&SdmxWsPPW-sf zE^A|s{r6kkdpDd9-^&_w!p?#_+y36avwH%Rl=g1kcg9XRG|N7xe9@jdOUAv+#LnBf zyvwxLu*leRYQw%g49Bk8RWxVVXHERP``qlHJy-udu>1KY)!uAf&92hB&vtDIcyH$r zkYpdmm11q3_ujfnm&yKOc8vX`-ahLIn&viz+XU^S%Yy8q7Uo*te&uF!p<2m)_8C|E zFBkQ!kL!5aJQXsu_r7Ie|L@6NYth{oY@z}*?Awnz*w5it+Eest*PgN)oc3SlhucfP z3*Yn3_0gW3O-%NWen;C2{y4tp=ONR*xiPQpDt;x|vwr8?n{q2*ugc}ib_c66?2W60 z_6j+7>{Yz;#?DMB$zJ~l-`?AT+xPBi60raOAkh9#{`Wl!Umx!M`B>Fn@rZ*xdiZ;{ z7#jWcpKTPnTV=n&S7-Yt@xn%*+slnU1dHykfA4Q!a)H4pQe&f0z|zzE7#?QXcRROj zJS5v~G$Ar=UtmF{{pW>khI0~Hjfy^}?lUc`v=_HhH?UyZXk_8hvG3sFGW&ZcnvF~* zlo*{q@MvFFTdIBbrHMu&vK>anQUd$`ObfQZ7!YiKbzcq72uJMC^5C?u5t(bGuyBK+oN&ti z?v59B7iM-ENpy-B@xIR9?|$VdB0AT zs(rZPBqN9OO-7gYO6`yN;B7CTqHAaStO%UAo}lqK62&0sTHazD%HO#Z)p&(-4W z!#%2vrt0Y#Jvk@7e}|%<{o9xC4bAV^8!hHh-M?#tvpstFui0<5cfIq= z-S;rsdGCQ~Q}%9X&bK!)TfeX8yV>4S|Ng!6Lu>8NpZ>7-{w?*r@7N~peXyy{er{=j z?ei1bdv{;!-OIvMXa8`=LEE<-273=?H1B26sNW1 z?cSp=l=oH~tF!;^(Y)88BX94fPYiq6QtIr#KH0H%Zg1#bxs3<+JPoh4ul>rlFL z-W#k}_q@7NYCkivXWxvlguM|D`SwMbbJ@3WhU`!KaBPpqYVLhc=5X2zzYp2Ze$37~ zrIcmgLn|?R=J`JRe>hFFsd~Y%Po!DRK46Re{#WYjt&4Vk-ns({FT^zbj3+G@*qOU};Dfy;iMbg=!s+0C{y zjb-iH7I4`Id=0W+Xq;nP{8qv4<`ZFig%%(CtT|q`ZZ67pit=*y7x%i@Pl_GlwtPKOcK;&O?Y~U4wcq$j!8U)5q}@d^b^BS@ZSCjPIoW<>5VMQ_ zByHcX?rz`kINkQfM`k;ZAa?tWzG3zYzh&5-+;G7*c;{2QNtcuCUn%<7Zt`DX%Mx(f z&USyM{hvM)TiM(e+aRvJc6@@l_D>co*w&pav^{y{kXY{^*0%qAuG?L? zlWuQxq1mP&_Kl52!V5dQugUhcv79#bGa77)H@vqC)K0QzGt;*AT)oqJ-D3`W&7cVT zkdmJ^U$^<%X|-F}$1K&f-zu75PZ%@GHMmw`3QTDsGKewAO zdC4CB{wBMyvT*yLrq6aIVYxO3A12!w8oAmhe2}oWZP2x433j$y(4k|0F4@e!>U^;+ zdz7Y~>SqyqM^A5i^zav3_sh_9VULlD7|(uF*D(9{TH6d$*UU2tl49O}^kKC9ZXq_K zI^G^5k2B2s-OHoxUz#-=EnF66BwEY5U#u|7e#>HhqZ7C08y$VeyuUXo+WzJ>9;06( zK}M-TO#AC1V(hK2HySQJQg75Y;nTh;MTz#z>y8?@yKgZ1wCM0Yg~>VgHJca=;|?r0 zGMApPZ~n4UdztVG1?wI%_#f%_I)+4^6V8#y^O?CJB_># zKG?_4l4ieeUZ>IZiP1)JDGd9MRmR%$ZC+&PnbKwS+mUxaLqn*2)A?+p50NcK7rzPa zuka7DXTKn56qglb#C}0=e_U3Oy}Ej~QGsic(Y13L`(;ZV?9Zgf7zrd=8r8mX-p_wR z#eQ{Bk5R%bKSSOc@BK@{r0s1M%rIK!q+qo1Y2f}NeM0sh4LFVV8CDzdSqJSm7ZI|b z6f)0f*~fgN-wK}lixTAQzg*Kb3dzkg`dekT|6aGTJ;N~-qX)CQj5x()_m?Pp*`tSl z@GkMa{x@drO^-6%zdX|1{_1Iwz3XKA_6ADY?XU6BviBBH+H3Nua&N7U*Zv3Zr0xAP z_4htr;kUPUci8@?;av9Le2w>p-I3kv@hxe;_19N+8HpBqnJR_$u4~TQFSBU7T`QBr zUd^q_d+SbD>}R>2VRtFdYOhn7%H9?G>h}MBKi^g;Om%PFR<6D6<@Njbr%LP<-7B*< zE|hhzif;Y>9T)2NUQgEA%cQ5U_iT0je(vi2sr6xn<6knY}dyN~TLnp3y`hx(qq+C0vCr8pn%F(|9q@6W5Sk2f%Eul^SH zy|PQI_U|rp+gJHEYH!^NuDyEGYxnP-@?)-ECn1#ZT5wW|P7GlYX-M zWHuStpJ|b{D?V+oe_@OCzT(pc_Ir29+DWf5*gt8P>^|u=2KF3=ns(Am2K(+$xe2s;`R1RCp+ys8Lwym z*w)D|IZ1E-SzD)liAj3)A(tKP&SdKCH@)n*?^LFqJu9=LolS+_{^v}N`>ZPT>^;|5 z*_A%i+poRGYG3g)J$uE6g?5kUY3={`pm5*gd0O`Ov-9jWz0umgK09yUrZ-ylcXnpj zNoQ&AU$Zk~pLCYC{Yl`)Bed?%U3*V=ovRYM1m|XaB93(0xh2b?m>bakEPm z(%Zj(joZFdAwByknHF~Ec=Y$jW?Jk!&!caT9{vFV>rD4$9&u#1QE@u#uoldoHABTo z-*AoTp3EbTx?feC7Avkc-J5yDaettylZ4PJFgs|Ss#7P^O0b%zTxw2VKP@-ioq5Eu zB3;cX>G3i!o9Bp{(~ZkZ!R+}8>P~J)mVnttwdzh`n-+uFQ*Ws|Dc3JC-IaO7@yHZ) zC*cE2!R#1ybteW!h?!q@syTgjTmiPL+egjmNfX3grTeN**AA}&tKV6u>a?F_jp_c( zBaWdgs!p3-*Mil*nx^8ks14%BW=$2RzT@k`;!=B*ofF1fr>mA*z~Vv{N=}u2o56a0I+UEmlQ)6cJvWq`j+8^( zc0@zjDX(V(SpEMBWhbtM>%nZhlgdt8wyp!azf4laDeBZ(u-=WCDo%gytpT&&?o@GF z@_98loHe*qoxC|#gViTTsXBd;Sp{a#U#03a#c(B9&8=UmPS$QKz-$q3HK#{W%fV^_ zXRA4N<}U-YdtR$KX|+J&^tiRU)8!eEIA!WlcS=|ciPLrW)tzRUECH+6U8nApECEs9 zmZ0vW{%0vz{E?8l(}VlV!0vQ7s^+xxFeI*Ll&d+VFNehSS4}l1&F+<8HNkgOo!;j` z+`Ot!)oFbY#4qfQs!mmAka$o2tm0%L1&Q}POI4hH{DrV3B2=9AJX{Ahr% z6rI8=A$rwLD>@y?+yZvbPIVnMo5-YrT_tG%G^d7$JZX$^5_k*%^*kM;&|d@;{b zcKRa?@z;!R%1+4nTDUL8Zhz(x$8Hk^C&i^|_8_+2Q3a>U2`%=Zyzkbc=p=r1E|~o; zOUY^Bu3mdke&5Ee;&f)Ql|85&*tlQasZx8I9XOAlQg>P?uC^B>uIj1kBz|$$J`h`{ zL&YigE&qNHds2$3)3zK>F#G62HK!-@iuQx_Za$&zw0nIMnEf+V!^!O#M7*tB-AP}~ zVL!-TW?faMePLhrf!wyURmsUa$QaCa>r!w+_DlGtL#Cc4I~>=Dusex;+Hb03w$1Tb zBb(EbsQsql^R_w)b+b98@7inH7q!*#w=uhu!~3nKKOS#(e7}mr>C&%7rZMZ+JLbOQ zatc=IG+q5~rQ?OWyiWhtC7C|VSn7D*StNRa8n<;xt8b%{D%|6F0Z^4TWG)SJ>y zeOnfpdN?0-{NkqMbgk)>X^ZVu$M?TfokWAanx5l%=*Y7{#c6xJnAzkhZyl#Tm3LB} zrDt|=&UeSY$5KxG+bqo-w*PkI(2{Vv#HV34S^Kl&p(1Ig5_3s2k7Q=2_0x@#G<&80&2j5F87G0|Y-a1N zZ#$l77IM0(bj@^b_Cd#kFFBo%!>2RA&z+Y`ii?4Pf!EW+C5VB6g#m;)m>3usKGg5I z!oZLb?CIhdQo;Dxe_(+Fx7_RF`573P8rFxg6z|uve$wxH{1cM`gN2>-GT{LIVwGHb z0p`=(4Ga$iN^1@sxHEqeW6e(16;h^`?mG)G#4K#|n)$h5IuBzRd&dwC~UX3Ax%h@{maqxewqt86Ge71Ie zQ{}AKd)tEX!0fLk`__aWa@~3;WOhcpoz#=Bc}xw<4EAj{-S>CBklrfYl}}m26F^1? zd@Rd#Zu=FkIV~i&N!wt3xw17w2G`MZ*M5B4;ALT_yHb=5qVR$Bn=Ai&XDRggd#^IP zxNpjg>$^D_W*z!hzU|od_RvEgGd|pv_WzN{J~B#ZSM9>k}1?`cG}Fr^ol#R0{iyV4mQ;u&hTN3DJy!nU=IfnnYMLZ76A#W#Di*1n#w zcViL<14EzZ^Vd8FzUVV6Fg$o_ufQCU`ynBw--&@?0^=I9yn{afKiYat7Gx+m$!OGY zmF@C=xmJb-Gj=0}gkSCq3=V7?t|a`LzLwQ# z$;*&8X+rA+#x=$Xzph8KG|Zm;>DP1fSBwP)7WQk5r9`ex*tW?x@^4+@fn4^DXO``g zSiolYCwOz)mR`}azsv8gkgt}V!)wIgV)!@u@S^I=BHKz<-*4nenE0G|Sv?EG>`S{6 z-6j1~87|EA`M;}+A)%}EAtT6b+Z$Ba7-kDOuoc9zFRPDrWia^r_*cB`tvVxy3}1-O zFZ|o$!`K)WH@&>SwTU4ixGDJBLTzS?wHK%R{O4dWQ(gCe3^AYo??ga+nJs=Xk_Q@jm(}aKGHlRfyu6?1!GU83 zK%oTTF)aHpxg%JBVNS{}l^<-st(G&-uBnCK=pc@N*RdPxTMmbfL!FVr70IvB8~ zuYD<>ZnmucvDiEYh8h24pC|mfZo;H5!opxJB(vQw=IrH}ytCMt7#d#6OEO&lZ`6>c z#L%(C;;Z4`_ZuslUdl^4Ffc?s?|l94{!Cu0Njwgd-Amg!8?r9hq%y?(&z7Cl$-rPy z$hfD=fz5$og}GA0>w11hgTITbGt}lWEO04&@k?XwJcd~yjV_GrxkhJ$*$RXk*%nQ% zU`i-p6cL>9@2jdL10zGhyIKEiSs122|FHh8ax2q;Hw^CjdG8s{wxr$OsXjxjfv4eh{oxsAN(>HB zsa938Th8TNX!;_|!cfh}P|h-Ab}B=z3j@P}#7)Y#)rR3XNc_h=gu$4z);Zm=#SaoW;rE>3JwOo1c%RsfBBgh z7*zQg4}9sDyEG>;imlJ4L_jv5QiOviT?W_fL%p4329WNf8 zb!GqsbcO;G14F_ub`}O%77;-?riRz`e^p*8HZU-F2{Je^FdSGa`{Rp!o*XN~0mB}i zg2Vm!>-YWtv$cV@nMZ+PMl1uv_5Tkz8@?%aC_6oFcCcbwFqwma;YR?w^bM`myZ0AQ zZD3&7@$dLa-Uo^e3=gI-S){+$IUwUc$xK#orjdv#@8#m(#>R&qy^%2ngU^SLpV?A! zre^z@GdDs)w@v-HTxaU7*yzp1S67vt{`A|`QU+a)+HYB9Aqo5A7%H$#D4$kA07WJ(x*#VufJSbjQs=}I-vN1h=^eqZ8Zuwe*e zw0iSDvi={#EBhI4m#6=D`~3wU+k*WJ2bOFws(cxzc2+*<(vx|&@<8=w0pAa9&;L>1 z#U0%(lSGR=*cTjUIN)4eII$+M%J$r9{!4!hD^ERSVmMG|T(V!|x1G#U)G`wP_~aea9EP}Ng~taNEVl_V ztmv32vQY5v^J<%+_v5MGuio5#VO7+ zVs$qD$GOjM^w9g@u+U`o|C6Uw9MUZq6d3LXtiAGo%Z9mu!j~udhFz)W`PIG8?f)HV zZyts(9SOa^%0<6hryXG3)-nH!>#Ue*3pFcWMyciJI^;6AIX<@OTy}J0^1{Y8MTP?! zul}jT%)0e2Me{GWw73~p?>m0AgR3r1;bZvHBe7-L?|XfcXO;aDb}!rTurTOtN$&(S}(o-sde}L&-0&4G{ng;G|buhF33I0 z&Hw8RmAQ8~BK7P~J2c)oI7N7iTxf~qEu&YGYxmtr2-0}eb9pB7&V{TWI2mMvG`=5B zU%Ec#|9rvF+$Hu)q1W1ix9YHI9*_RlKLEZ?TFIo!UWwuX1| zf?4jtDKV@J3WzlXTX`kk zJjb)a4cg28-(1vN9jYw-?>y z;=lXq@37Q$LJ-#~(aVOqojQ3n3E;@y{4d%V@C)R{if=I|Wm4~Jge5Apfh z`RQ5v;duS){a&8C>i;KfkNe+LU&+nPa9|q$f@`cBNx6)tB|HW%I{5sBXKw+x9!`|>}Z=s&k zP5Zz8e*345zpmvb=eFP*Z~NX}GI`^#_0?W;&APwaTmPs1@Aov|RZ~*^T_5mYf`Q@G z-t^{^D%uPS{@1(>o~&P8GKcp-MdVBVWy_Mju2`gX^+L@Gw~0G*G=4aPW3wSh?`b{5 zmIwa-zG=^{R^;)QaTjD|C}hj_VUBWM@qdofT%+EboUO-O+`dk`WzWXIu(JIi1H+RC zziK&r84fToFnqbo{D9}?A7+LvZ3;ogH_}#|W17kK!-nbVGU$G+M6Z#Aoj@hpZF^*js= z#~B*b7@q!rsCz?8sj740goTaa z7k3knhvh7WIe)Lp{Mz$zN&No_>y+6Kgv7YS%t{nx_`<`+5W+CSq|qni-*0R0|2;Q8 zS2J9BQDqQZSXf#fn0fXS60I;b*Z zR#&FmIiBE&I}b=nuzJr6oNnVKs&%@*e4*0G@RA!Jw4`!al0NgZH83;mQu-Bo+dhb4 z-;ed;9~fdB_Sv5Pwq--$6$z6S8Lcl~UHgA^+kss?3_kA9JSSCux*E9Gsb*=WaA+F0 zID^CtMu*ldheBR&O#0f-B>v@V+L4gd><4cbb27w#`H&GcW7Q7tqRhyZzh0lxC<;#C zjk(u((pFV-^7P6tHrEutw%-!%@HVLYqEPqdSJQpgv;|w=v%yU?oN@pI)NAd zzBavlp@re=k9TqnpX&b`ul@IZ|8L>V{`X>P-Wka1+w9zK+`KZ%dREkJ#veNl{C!rv zewt=xk?+)N*FUAim?%b_S~TU!S^55F-CiFQ1s*Pv*K_&ye~mrsZQGTVCZVg{bKNga z4(z*F|2(C%H-BGBuceb|ov%gRho<-xO=S$Cv)miu#$$gqrV6QGVi{Z_kV+;un*6%%a zn~nvncV2$=|0?zg$&JO{|J}ZLFaF&uR=MSw_4^M~nWP&v{^tk1e7FAZ_4A;ds5 z(z~P?KCSQmx8nPfYnT4#U7R1e^6zy;rTGiRekU1DReG@^>Sby*-@w!GbKwz&4*8t(72+sm5g$NUWbUmEs5tO-`bel=L1!E}J3 zqh#W>Z?~?mzIf3_cha0)uMCJQvJ=1B!%KcA9^X4s=4Pf_QgbOsb5_>; z8C`qI)f%|o-(y+u=l*ZW9qV?U@zTHCc_C(QTJeir`tfb;-xqJ0qxrWuBKYh~kzJXg z(KZfi@2ohU%<$mN)fGD*9hm<=eSb*m$%O~HA6zoAsS;TK_UNC){G7`Z*OvWh_Kbe@ z+xWb1{mE=T)(!G8e|O6ACy9hO#Xk|Z*(4wL;F8(S%aa)+LjOnX?loh062DjKC2Jaw z(wm#>Z=HWtU!F60>5Kld>kqlE?%u799y0PHj34I2e|GUB`eE$DFiNV9}$L{|x{}!3w6#DWxa>KF5j0_CQ zw`$c6wqAQW>8wzKK&HxC#h;(*&tH3W<(klzx`xOE+XsvpOd+efjks8uUZfjMZfRhA zV7uIP!?xuIzC?98t$J_sVjtrYB?c)TW`}2qoMG~eats+v489BsoHw@`epueg$e?r3 z`u~gVr(KyV7_!#Yymj~~uW`ufh}S&(&nF(2PIxb}D)+!IUrUfZ43n9KIXrJTZvGl; zs(5>mL%+ODcfdBrEld$cKO-BeSMD@g%(Rk&L4x6$mJNd#w=>g$Ck?;UIW_+~zo|D` z_>YmFA&14Ol<@(h#vvwIhE0wM z&r1X@ijb`6oQt^)cIYXY;?RS^383Z1I!@289ekHsu|au4lry_V3?;IA6V%`)8fdCBuWSwt^!eR=Zwl&rgxXTO}G%sA!0bp?YN)5hJ?A89jGp4cqC zh4DvfeEjtP{?ZMLD@EG_AM4CKHF3$!Ly^@1|M@p?#O`0cgr$~2PQ&4Q4$G9kccUev&dRP+(mFw@Yxb!eHC~%g4C^fqaX0+6x7GWDrr4E>PvaeWLf5qTZQqIx76UW=rxf^>O7<}|A z0?+;9o44a-F?)W+znc5|{rgz9yt40GJL6V`e$V&+uk?R8+CM%2x0un4$uRwzfi82v zzxxwRJJcMe__BXs$QD?3U0ioIU-ZSl zt(RF6&bd@Du3cshHVa-E)@uud%&svPs5t1REtLN**U8>5&fb4?Z@V^g zz{>xz+RLJRO#0$J_y7M}Z2zX3)q=->V=t=-V?)RpRUWhdJhM-DnKhK}=9f$O^~GGa z?m_+2!h}g7-JW58K0es^=+fhxY9cmFH@U%32jPg?oUSu|_? z&*}eP@09=G%Ot~=aBGPb^M&^zDWCbDuF^1A5);3l{esViiy@CsoQ|Azf7`{r6}--q z;{L9iZ@uf=B!j)1bbk7q=(z58-MGN}qW-E-596SJ$C*p=nHKz8IDf(fng6Mu&rkRh zo$_b_{{_~q3lf(Ut`W1DxZuOfiU127SkJ|iXWEfUle&kri5W14rK_YbVtR3CcD_#Bu z|2xk7<#{F(gIvOjr~kjMk1Sz`IQD{h#VpTU2A!^19o@@q7X1rn1m%wq@u&3*ByMSE zFuA1lRx|N0ki58H;fh0xR(T!^{GaadQ$A#-Wi>BDnaOp{w&hnoGKgm}Fz_$14AEV2 z^cF+MtdJcRujDhB?zCo!Uhi91pH-yL@aoo?PxcJ6>u)d}S<}cK5Gc%@)p{$7eZep8 zujjdX*)sz73iF>|SD#e!Az{86LxOvwn!_C@*CzHCe`aJ^Ca-eT)l=@6)v@T`P7g-@ z3yZ4U7*?(RzF|u7@8=&*{}-5PRKWDSuI$zymWGIAhE@E%j4K@eZg%?om|<0Vo882` zx*OkE7!rCn{A^cqC}(DfV7j{5ieXjPujPNvpJ!g(HCOd-uB2lqs3l+jqV#9|j|YrO z!N)8Q3cZ;d!4S;tn<4j_uOV;quk_Y5<$$&S-s*gnFPhw6WXWz zzsb}hb5Q8c6zi0ipSSJ*ce*a3n9X5(6gb#fPA^>hEC0`d&UgAveMK&^?o%a$H3I&z zpZd?Avvm=t0P6y2`{`$8=3l*lgG=9mzhNhD^7BN1?YZLH;LiUj=i$lJiFaImRHIaX9rr$J zubY!T<@hn?p2b}%j4$ec%4_`J{4>47x8Xz$;}6Cw_Awpo6`#C5-n^YUbC2F1|3zsR z_Zx4!E3^0(gUPFUk+0k9-T%z}pQ`2{%)oGM-M^VWkB+UZKfu4>-)HaZw>768W|-{M z{Ll9`;_J;jGpfcN>DKz%$ z+=5K0Z|aeMx9_?ybvIwgr@8ZKK#TaN*Nuz?U%!=#7n=RgdFr;nV=F@jU(A9#%m18D zY*=5LH7VD@jA84q^>n^PFnpaqQ*4_@+&#{-$x)e1I+OIh=Ih$j zOJx0=|0u+zmEpk3%kzvKGmOkcsk-=p`c5s*m1in zrCn+cci6sy%9#LR@LxTQ zkC}m?MEigGyq!|nckQ)n_sOJpr%u@_KjFz)SBH~NKYAZMU;WZlQfUrb-xUQ$jsM11 zzpZKSX5Uf45b%Hh|D}(OJog^mANv3JX^UCU4WHVd^Ddm8P-Wu3zWQ@-`u?K)387kM zOh*|#1@67w%$Sh0l%Ih?qa}0UN!7|))(QHPw)idh#?bz`qM>)LZTVwHh6T+|7kWZ==(*>gZP5GMFuiWM?uV`Zr~LnYQ=I-ka_XZAToYE* zFZjd1*?(_3w4S=i&cGmY==plJU7z^1UxZCvk->Dt@g@Hidxqj{t;6R;rQa`qEPc58 z_(ukY2B!s_7w$5}*nFU`u%M zO1|My*Q~aQ$0n}&8F0VQhQWb7fMZR73F9J$_hteAvR6Dy^?ju7EpaxW7|)jc_e5S=Fh7a#6_TmcG<1K*~sx|y-6@X1r1v-#16qTD8o?-=tKZ>fFd z|8qsVeRYVd?^T!5&G!mz7#J1^T=97vp<5O8&wmfE5sxrEzw96jaI9~c&_Qp=kC zy>GG&!-3j^UtRgcRHnwA(`J6qy5bVciz!+X4G&k>A7C!n9+k{cau{q_LHveUQD+uc zd@9mgDdI04cUdv?(S}cKU->H-0xrtTUjENhj^V++1W{4$Rj=Mn^77{{6hG-Gyuf+Y z1xANo%yJ6;R-lM2d8=yVVbXrhEa7lmu?+)5LHvd^pOB+>gCi>${9oyK)E{8ZkPw|d?}S`J;p4}NMFQXDt|{iN`NL@c=;`Y3_j7M$ z_pviDyyL#6b?4~hik&jCB@VkAf@VJ3zIRTh%*~8fpPj!4-O)FL8nt4@tqiGU(@p(q z3Pa>#&o364%qY>29{<<$dCh69J_}{=D5UOp` zw|awu=~@0YQ@$ED9MrD6cjw#tB-46^hTl!*3z!wu*q8hAZ|99)_&W;5netzo_iG+>tBy)-BMe`^3&rwM2M^z#Z31 z4{RE`)z{~nPrAk+BE-cTXp^ZGyT^H30z<`WM&9L7@(dGF+XFwZ(Bjp5%fH6sGK<5< z$@ctWVJr&TGX(1H+5g+&(f3~`{o}6d`vT1*_P@>xE{rv0sPyqH(Oaif=YO+_@xfX) zlR2w0jvZ;b#&%%QigoYSe!2R4s&eV()E}#jC`w za&0`tP@z?txUQ7{!29e~M;1=&u2{;*zu@b?`NtSUk_ufP?OuOx{Tn?krLITnt?%S( zuBI@3n5`)L?-+Xm|1Ca;%@_A;UW%L&u;OV%$E>U(!NU57>$~|F)|*VoS+4$0_^ZA; z+k#(fv~<@pW>_(FJvz>uW30oK!lW7a+`<35Q2YsH)?Vy^_am8y1e-)!mHq0uGJzv1czjR~AfT;?+0p7`_i zcJ_Tmn{KKut~$=3<7~2Gn*ICvwQlbuc|gu+um9<8e^ZL#>Qugl^;Hb(oo3k`ND#3v zP-!S-C6tpT9Jny~FCo%piu= z{QeUSHV##<4x}(y{M#Iy;vk`5TbiK8DDyv3&q#r10%K`{2s`5kuLj-6G7b_7%&!tI z{9t?_aN(FBLt+EZie|@P_6BE%)$R-`j7AIi*v?8b@G-tsV4T2mVu6)G8bchX!~v-y zJ_Y^>s;>@Y{C)eEb&tyRO1-N6t5@wZKigv>wOLpFW23?4M3eTJGr!bMpE+~pdtPH> ztDrS9c6^Iv*p5z0>P|D+vU2z8YinQKyS!ib{R=m_{HtHq{rexR_0=cG+t@btug&Y& ztGo)VT~*7SIKQ|vt-5!QXV0Pr_WQrSUElZ4nMu~+#O~rN4E0(IUcEhgAe(bZy{rSf zMAo5T=5qnUAJUmu&AZ35r^VryIr|14o!gmA|5^@kt@srq@M#m{%l|*le~D){;F|Et zgt6Xl!K>$U53FWgQoo($1;eK~Y6`y&YptlNn#*u$Ki>l86UE;;J^ycDTE+0f{O@aq zMe|hB6*ly}low%e_*L%R5ZJ)8oO4a|FLqXj3ID9!7_Azj(aG7OEeE@^Qo%hR`zfAbo%k<{8z{R}zY6>9Jw_VY{{Q1@Ldf5XS z4tBe1XEl7`KdjH7@b3HkdDZ^^w=utDm~`{4ahT9wN5+WSj^AMydYMWXHuhYW=kWM% z@PmorQC4TL*M-SepwC%5e9+pr43I79F{UN zurj37$~v$!Ft9Qlsg*rYroaI5%5}ybCI$yahQj!yYm5vJOhER1`LJ@qHfF{H3|tH+ zeqE~Pmp!1tz#zhKq_%1SGeZN&ny2-$AQ6G@kw5t!Ok-dOU=aB3T0Fm;g@KEKV`GOy8UB|zOf95O~ z7#RW>Cj6fGuasdsEAs*dgkgGAjIc2ID*)XOrk zGF+5D{oksA50p?r4(tE2o|(bf_dm##MfMAr8@{Y(UcgY0wNqYgx_sZVz7UtdCEsl9 zgS_rGdrS;+dF3~8m-10*yQlfARty)ae}T-mXnnz7|HHoa&$Yesp?UE-$E=TLXopI# zlv!SMMb>p{mr>Uy>*Ylkd3PDxNpXNPga$*$zd26t`lG+e|Gk>@xW@2a9=C(xt(dZg zWYY%`!WsNMObz!g@8<(K@VutW|E149xXpWK>RPJ(J$$9aQKetgKYyv;!@Pi*;qUT# z*#}$ZbMG(ZI$-5i|K#7}qTuIumZV8-R$6M*b#$lC$`|Kc1vBUU3l@CAa6og(|9#dC z&lhb^cR#y=Y3KaVzJJG``YoBW*wgovrfa##%NH?69yzcxRC)a0Tf%VOmH+>Xy4ej( z3cr-U-*21qJXFE8t3zbvxrtG+@*S0`4(trS{O9~FXE@*b+=EfzuVmR5dqwxSIl)Wj z>^{C-ixK2o#lmkB^lioGDYH8Ka(`F9PHjWY0ZA!V2BGJZo;$GzFu2sa{J;HuYyO>` z@BiHe+3Y>%Z@c&T*5#gz0)Hp|zR1Xs{eK>}tOKLKU%|f@85v&QFJ8#3!LZ1_$Ucvo ztuuJdlz;61Q#2VC*)OtpV+2KN04qq+ih*OU_C!rvK`V&!7c(<>{D-iAEoNq5TKeU^ zW-xJB@7R)Y*q%luil)c!*Vf$EW;be z;{pv+wLwnYuh!7d#su=r#NVckGIK@T7#Z3aG#Iwa{uTUd+GrfiJS)IymXN#^B`n`H_M+NBw)b}`=&IKa*b_W6Fb3o*xy&Z$awBw zURNfpu{v5dLAiHZ*T=G*rG>BW^%tcZT$p6^&_@hp=zVtfw|gH?UpzIaBxuQ$zWXeD zG}w+Vk`~#yQhoaWANv2K_dht7&|qxN;=nlJpWt6!mRQ9Cjvi1_`DgT9A0U&cXvKr6fY2(x4*qa_7-s8xT}^D?e*`5(&rtL*mz&N+4L8)P{yFfNFi|3d%c>Ay2LC0H4( z8Wb6(zR>@5`tO<>Zx7u)FTn&BOn=BD#&Gd|nEZ=!g$2wKtO~-f88#TPI(!lTdyu{1 z6+;8x1}0~QRbM^+U)m2UL}hO`IKyVo*!{4f6&{~*2Y&-|kkMOIp$moIr9wq%iYm(p4Jj(-hO3_+S| z4C&T?qkq^}Jee+DXy14AuScrZt;JqXHKsle$z5_W&G4S4*}0Q{C72T21zs>{FkJdC zdGGV)?|tzR%l@abd$>xzk7Gb2imH2{tg)EkgQSsF!*YMd3ID>+oNd1^HrK>{>CeR_ zHEI*488?PJSvD``-(!XV=7fTOXTI=XJ#cCN?Ara`daXCl_GeGvSisisg};7UR>I5p zU;Ga20n87!c>LF3xU|3A?gC@P@!!piA`CD8>*)PwmSAmoTEAk+|9^}3f8lRq$YN0V zyZ(qS7d@t5s?_^lYS7}g~GVi#t3Deu6`@bW&$&^Cs9^Q{^b8-6!C z{&HvB@FD-FdflbH#UEj}UHFIBv1d)dG3{(FFGPGH;L@fJ%=gA$H z;OEQg9vuJo5>#_V{bT20yuvWypQ$-(g2z4E@9xH@-v;^@+fM$+C=2qIJZpl1b3^63 z^{*?h%`Z8=#+I+R_J-|>-NzXlq!@Tw^qI{VPwe#mAN#^SBaOYX>Vgmdr<_6=y*~MW z@Bc6M|G)h|_v!x)iVac>)BYPWTHJPSi1D9&GOqf`%Q)k^=P&<_ep$cq&wh(#7v(@9 zyn^wDJ0I79nP$5`KKb%0dGp=nvzxQerfiS?JzrK%^-$4~zd>C~a3Nl9_8garQThUE15{nOy!`_5aqBPlvJRJMZ!rbD zkAJJiu(`SN%l@gqi>pnx_uZMd|L|W^vW5!_t+zrgv#|eYz>D zz}mpKfQ?~Kfk?x%2gf?U)QkMu{h0N3yYc_~`OkLR2bKHn`<89XnAM<`AaD7_i}A;! z{J&50f8N<&qy6RlqLtGx{%`gAufFZqlRwXwy#4*|{?vbr&J4_q46F}I&U{;^mw))I zb|>JOQSf9wIw3~Z4MMeCH0M?I-~DR00M zz|0`haKe(Igy9OqwG?Si4TiV6+pcX3PyZtj%|3*oM&6)-ZvnHxkzAD%e^**B zf4ApPVz~+{0|Tf&U`v?!Dfr^t#V_P^&UeqxbWLG>(8J6i%g~e8HRY7jsiewz_8u#D zl*WB)yb;Q9&WOR8p@bnJJ0z#)(hi@+KLe*`-eeSe{`fKj>jNHUkZT&Q@2S|cIWQ;e z=#E*-|0iGE?@^fZcE9Lb!S|~~8;mPKPHEs{__KZf$4~0(&d-uL-TQB)=-uY0mb;3( zBK~b%&%n^YcOdevd!PEdrQ)k9{I{&W_x9FyCWZ#Z20n%jhd{0dH6H#4GR$KKt=AP{ zC}&_!;9y9AC~2^6ur2)dUxR_ciouHE0Qcfe|JfZt1-?jwF(at`&A`KGz`}5cVF3ff z3x*dA5BL(a%t3Z4xHo}JV6bAi@qaM`!vbc81q?U-GcN#{ZI-7A5-G^)60uZz-f;Ea z|I4~f_sjpUV=DN~z{7ZfvEt&vuX7e8rnbKWxeR+ z+5?~lIs+)`nLqBEer&Va_TyXL^__h4!Xl?X^Rn%`Uky?W_4~5Ee*e#~fcXVO&5PA$ zuhhhx8zQeW?s`#gaQ64)wERnVEHc);zkdDO>)GvRx13{4FaO`q$-rRMz<1#P&tGfj zES@RfEmg3FSw^&Bwe-;)UcU3Tnkt;r3t(ViI5nlH%Sh?@iPSTv9bWx%nEZO#98>q% zP2ZOL&i+^bzw>arob`_0tM}`_x8D=p!RWwfarCb}g9OuuYx65#l&=4O;eqXWQO##T zHql+ecHe5Z|G#_Or7|o5Vm*W9^Z9kB*YACKR$g*V+z(?G2gVJ5_!lr2oO-!GbJnhP z^)J}}|4grW7SGQ%U;6+H1H+R4FH5Q_Dt>&8|1TW>_v(C+hQIcES6>0O0jfIwZNB;D z!GnVG^6$UCzCItbx9sW6)sFw~aNU{Sz59Cc8f{?)h7tzW1?yfnH#fh&o*%RG)0tp@ z+rLkO{q4VgdAk3b`Mw9a|KIFxsuLGm`|q2w=)|HYFP_L~FuZ1EIQ@U}$&~W^_pi2Q z`^WG5lM>EwYyWoRhV1n_zUS}ze6e0if{Ewc3Y}SZy54!bwfugQC2Rp>+1Ic8ewVk$ zGx%LAVc=mDX}FoQZTtTEudlW)pSSDJ5n+GZi%0)!pSLOg`m0xZ_wMSe$Jo#C)tgVy zZcD9>x#DYLsejJb&%Jhm@C;D0;R(BJ@|&GK_gDR=lgs7m|8yRI{;_`MzuW(>KYaMG z%V-Mzwh(MvfKW%e}Dh>?e+!xnSSY;BWwg>Dx-*}aoSPi^eMer=0tSW!oIJ<$|DRfK z`(yL}7qagwz8pI{`|`^#DPP|2XO8%{{nzd0@H?SbEzNz`6`%S3r{sC6@Qf=z3ub*^ ze)eqhvs-n0t8cLUU3KPVoC3ovhW{7qf5jgyzRbwO*!Id)U+$?)WubUYdDqdMCwIO) z7kK{kfrmQVSs#3#Z&CANBlGWiABJ-_489Hf{~VP6EB^mc_ATjp^~s*G`q%zFU;e!8 z{b~M35~u&)*<1bh)w$M0`)2vy`)>b#m)sS$epPV&EXE5gF8^ozK5YNz@!GX(7ilOd z$#Xt9AJb``Z^&qIn8AecWqoFS{eF$EDM4ROeER?S=HAP#e!Clf)v$#xVEgmnwwz_9 zY6yeh^Gr4e;R*ky&srA9@W6Hzj8GC1U$FkY;GX?yoq^2Zx%56nCG)WP9J zI0M54mN5Ij_xa}kfBZOp$^Y9c7;V+-SP%S@XYg$}_x}I2^(C?k*dHxcY}nmW?fr*~ zfnipI(FOYp_xr9lyb~%}Ru>KGn1%VL{*-4(W^`uwUC+Z9HYdA}6QqzY;cvwUo7zkJ znHUamnKw?(zhUJtahLK|_mbz2KW%ikeDqY`mghz57yqRzzjHbmO8lAqYZLPv>Emvq zi$ASk)+w$(_r9)A$MM_#|Hs!J_&fQZF9X8`fwtf4{wM1DONTD$P_utN@pkc<^Og>k zlmAr*&wV$Um*LgH=zV*BE$4q;e)q(6{-k=T_RTY{8D{TVeD3bWITp)=o_v1(*L2&;K_cKML>ekDncTH@{5%XM)tqK0je~*}iYgQ_NrP*S~5o z%ZfqEak@m<;@&gs?CZXtdm;KgXK6{q)XiDz^@8=5S-O_E3m<_m)a#Mv;S%tIK4qX+y?rm?`^Tdzg{M;}1XP^2f&v2z7 z_{87iPi4-o@!1$Uwe&h;S0#IgE4#;Mz7Ho->|faKV82xVet+!uyZfuRaXb9xwkVcm zU@%><{7(HI2A9c;|jqp0_eEoaNi5K$~8*=Tf4s2q0!N9PBaruPb z{iiKmgI#*MZ>$U2Z1}%3#^p$J|6QI7cizSPy3V+Yfx$Fk=5K%BzB@}qQo9NxbNYiO z@8^-z2bv&(hHe}C%>Og}U#&D$aB@!!fp)Z6O7OXh|-i+)a*-ytW#w1(|v zJo}18i<$QXFg*BQ{{QTQvYm_%-rap2UamK%_ly3o-%17y3)+|3fl^}5FLRa`TNxyn z7#hChD^ED5_ILh5z5rKub_Rx*`c}|)drQnuNi8^7-Sh3mel`R&-n7% z{Yi7}tsMTdI*F-wtoS#ot)+KkjZLCur->rTY1qLA*DlM5Py-=v~gJ z3rUSCYdHGzhslETOdq!9Tgh9xr@Y*6Uj9rD;&gL{FJa7apC5fZ=e99Y^l{d_fBmli zm5y%Q`af)o`<~T(`<4{VnQc|HcMaoV@BexVp(P~@3={rUFPdgkSbObBMBW$wwV*cJ z#ks*pKCS=z;;4Duv+P+n9j{EjW7=0W@Bilym-cgeh=Kz1zkh#R)xxNQ)-Lp@8DytQ__A51xSs$&i_WxcKy#6ZdlCC~bl-s|4k$&$}_r)t0&lK67-t2jsW!B5O z;vKh38}@2HJ*(cG{d}3LY3{3a3_O{a>jOm=ul<(Mm1X%z;uGtUWKj%CeZ zkd0u^u9Jkv(D~r$eA@X+zbtpo!CWH~76RS_sj$hGBO@Ny8MS zpq)4V8^31=UGnI~Yk^O1<5fjK`QYV!UWPSlvIUvsxV0(RP0H|>< z9`SO1XbQ&y<|Sb>yIzH{Yba0ETq?7+w_OxZ;G-oyqy2pmISQ!=mGK1wh{ZId%>^(BtRjZxw6 zV&(>>1=0*V{F?X}xEk^pKq3#Wwt&Pqv|lhZFg?%>wvG7u;87>@OLozce}T*nj0`Cjxr{I6O%JT*VP%-`)1>9!N!1^p zpK&pBF>ILi{_?4YFZ^swaTyv64Mq(COj!&X3`@X(iUwgNm1tgo*a9xV)fR)3q z{lT&hk`6Kl=le_-6k&KV`$awGn6eQ7W|F@vN)DQQhb zz&A_91#A_8iy0bT>|ers!{GCspAHrbrU$rXSQ$W*n$8nA9e6)@xif-hgf0lUFhelJlyJUZgfgyx(@1%dci~($*`ORPK_bu2Om>OQ_|CMH1z{#+HVZ*8=^%qze0vKL2 zf(0{}7~+2)n_IE%_q+SN0SpuVwX^8Un=+{Ud;U@W0y{{+kR^aQfkEZp?O*G)nL`*C z+20UnaaQ>#&9{I-;cqfWf&v4x8ie<&S&G5q&nX5jaEbAal~HK_T&MIYObsviB{&+6 z)yHK-BRBE zd|9=CtL45gb%kz;3JgN~A2u*CT(Ym`|9>a&#rdBaugeSfpSx>#`m4$H$u`zG%YL6t z*?zA&?f=F2zuo_j>9b@pc>Iyz1I-aOo1Zwd1vIFx_ftOly?q!%+G(Z@*JbW?blCry zZ)c};E{@lMm!b21fdeDM%lUuZ>nx)z-PQHwo(mf{-nkNM8!_v8gYh-S0A`0r<}v{c z4!_Dp^UA*-d27T45;|Vs!07NL{lygqQwEhf9(ECiCG`Q!ZC{w;TlpA-_NNC6gC<=A znIm=wGIac|xjXy(@z2@ciKTe>T+r?}P z*c5&l|6rPMDo`r7?)d%>&-8!ozb6C=yD$IkR*e!CB=*Vi6)X9Y!T7K5Fx$i?{& zUvM3;=-qzmEcerEu}7b^CheKLsy8HLVi)`UUjZ&fmO%^xe*>8%PH8Z_lna5w9 z?JxJ=*|mE%L&@p?k3C$=T{fvKWcYB%wZ3Qp*o&9fhlJ!l(l{<8k}yQI&5ihkNF z?G)2wn3MNQU4HK8jmPgLT?M3Fw>VFlv~ z#*TkqbV8-Co?BY<+%=c?McM!G$B$>%=Y4lt!l3Z?@|B%4w;q4wSpKf4zIG3r1_Q|K zMfQKSk40Z?ogVr;J|^dk`Tr$GN7a{r^peqKBp9{xOT(yFr_no2vlG#U1UU!4Efy?(3Zo{6tdCOxz-n*7=5 z_53^E=kL9{it)!KP=_UCZvDw0m$GmDwV%kA$AR>9y7Nt8Q4#Usb5J%4Gja zjipLKQ8Jp(_!n943RZc)Da&Dg50k*(#NW05y>2t=xPh|3a#4-loDR_pT_3|%nFU$; zrIub{=`vdSXa#?Xd(@o0`&TipVB9PC_u&@3AM2b#6@Ha3`LBFeY{APotyLD&{_QTd zy2d!|cw}{YD02XFK_k=R2CWJImi|va{ki|I=UJ2U!T(O)nI9Bo^I_g9wgOMRc+N8_g= zZ!M$TWfh8+T$@=X46;bz??Hzk#tHw99(k_nK5xEq>C^{dk|*xjU1iwA`1n@qR1Q{# zi}eLB|L>@IJ!NmwkoN(P{vpL*&8sIc zDg1g|D`*{!RYxFCVVR>hR_GC;Kc0H^xi$JGej-*O#C?z0G$` z!+1f90YGN;FfFOyAhD3)#9xp9ptKHEz5fe;7DE|}=l=&c$v*$y6rdV_-w9 z14yjMegT^VA9&iAN#R%YKX%gtbD7;38?^hG6ux`^U%>XmL~$|0?gj_;00z+9$(4p+ zzO7jYUNO&~zJNJo(SL51m-0T$Z#bB$Kx-U|K#ptROAtvA7kI(I)o@4uZ?hC=3YkIA zV(N?jFZ{2gn0J-DJNKYenpJ|SfiK|XUxwGg%sot37#!GFJgK{u{!{)6gY1Dmg#$~M z3H_b;&yn{6X~k2W>m>ObxOxyfKL11Jb$)3~Mg6n};m22hH3`u-;&0dB-^6-^72352iUY$R@0H zV|-x7AiH4Fzlr}ERkyS7)QK?cSQT=~-oc-TF^7E^^z#)g^Z0LY z0>t0U1)50uz`2m&Z%nAx%lV?7{~P!oa5wAzZ~om-4K_i0(m%!$h6cHHT2sIDf8k$q zLcoE2!yo=H1)(dK)Gw(&px*L|;WcwfgV!(jU+jK-jBQq27Z?xZGFUmN{$0<*P||Qa z{Xc)fF*OFzxXA$l2X=-Rj;ep>w|wEZYKUfPyTz#UpBZfO4ZbDJpy~B~(9|(#q0l?# zFb0qn312}A!oK}yu&v>50J))!!Hw}5Ljxz6^MYaTnulNa|KZnQxMUBS!znm+$$kfK zgV(R)pX?t@V*pLVyZ>UZl4X)$-SJoa#dD@0&;K6(8~8TZy_5$B7~^)<)s>7O?U(Ee zYB&}!NBm>|&Zy0B$^Mc(Lj#k-U+@17iVUlF{mK8&zoRDvBz!^G__?UZe}+(o0|(j| zc6Lrt3YydKw0?oqB_p0`{~2W;9Q<8xThtfUHCgt+C;J`zGr*zKwq&LHN{wKxMb?*g z_cDPN3oNMzP5Az-ZuW)oBK|F#>DXJ zs?5EPMLw>guBETl9u!uKbk97HQGAhQSMuW+$g-BM@1U7w!HqxCOP??5d8$4^FW=fv z)9UU|(Ckm6&j02w`Ai??-v7zJ>~iKrE7!mm4AcHIIycPoUH30DitSzHk2toEi`iW# zUJ7(L?`ymB&+(6O*59Z9|M%lk_NveNn%nioq@V9DyLh)|j|Ow7Na~VLk*T0&Z6L$H z-T&WNmzS4!@4O;c-1vq6i-%~Y+U|?Ho6BuOnp#$+Bzj@H2qf zqwW5W37a#l4_rLnuh$pIaOpn-*8%DKUrf*26q^=pdA9n$You7}#XyE7^$n#HUVGLW zWUK8yEzKXaH8A9^rSAF9zbEPbKfKbtzMSEEEQ8&v#rBVn_0IOa{6uYgP?sy?ic@`x z4PW>rnAUXPd1Cc^ncr6v(e}(;^ZREV*tl4RUE%Nimz)RUf1O@$Z((s_XXGhM_Y&C! zv!a)SG$n*um;b+heoZ01NFndYXm(=?oC*0StIQ%l6vEu6L|JO>a&KBQg zcrc?w<8+aUROsTsK#@j>g?hir7dKp4k|vfpDb00B(Z`z$80VCI+5Ug|ex?tXrvJaX zYn`(E^^#Z1*1dLRU$H7HIXO8bv=KBPpB=$m)HS8(l%}cW^_7~S2(Ewia{qFsf|siD z+dF<7*L}`V8hid(QQz6KXN#?^84pP1AAPBHaMrV1GL;{Tf69@TGngSkp&W z`OB$)J1WZ9E$rB5T-|)Kq^h9e#=Q5nSG7T_2fPXviLN=Xp-^-x({vsOs8+tM!La$J zj%={bx%xH{{^Rz)pWA<5|L668@azZ6CHn)vwl&FEGQ9jRa=Csz>w^y;4CXoK-Mz(X zGSlz-_wVcP?+_HM|JiIG#XjL5s%8OZEP&4<0=DaJQ(wJnmnvVtLZbE7lB`>=%eW*v|bj{@44r zat+UY{{QsQdC34OmR{6%z1;twso?s~<$CdZf2?7eFkkgq3BybI1^jso3?K~;s~MJE ze))0F{kdY#Rb?H1u^;#+KjB}s$N#?~4Uw_>pZ|5f9}81XZ|}M zz!*{1P;R$z>Lr`k+ubLgQVLBq)H?lf#T}V&>u70l{ha-eRK@Kd=PtFVlxb)p_^!R9;`9WiIxz{&Uzb`~5#3 z?KX?Ay8hx)*=Aw$%lEF{e0N!W@mhOBA$taeU#I`3uV5%SH+T26S>pM!-v7VPxm|Iw z^<($>>EClqpLZS3sxp?3JA1j=;-G`W3-$w_>@V%VQ@@SNL0#N`?(M45>HoHy>&=sn zx3b?=vTnzYo6G*6+;Pu)GiWKw>`0xtLA(OH85x$;FWmp1=|bhFW6JBRF0#kok-S^H zZddy99o361!>>vIT(F`%dDr~cnNMWSzx?){_2gfMgrD*k^=|G2#VW&N)y`)#t+Qs*s66FO^B zBs}qPiyRwMkv&7X&BWhY3@-Hx>u<0w*c=(J{YmF(r1;-ryLtbrS2HfMXPEZi@z;CJ z@7fIi5Bb}D+?v1d_qWUc-@fM-`U^^d`-=B7UD)|vH+=uM-sgGNfA1f2aCip_J&*r; z+v`{#%=rCo|IO1!J-)CrO!ybB@LikXGv9{Wr3?%O@*gft`!D#nwGK3Y!!Y6BQwZbq ze~p{cH4}LemwSZI>?Pmh5=PnOj@_)1JFHweYZH5bs z0)L;@u^zYzTI;!_erG%*1H*U5*9>=FezD*A=fjUnzd8TvggD2pV_+y|xUuW|;=F(V z&iCo>RrBY+lo9-HdFaj%#s6 z&RChelzpW}_s>c7d+WE}+dXMH`%anVN=j3U_A?o*dCJ9Lz}_$=C~#?!$j(f)>az!X z({@dFi~gK+VJgE;uo(=p4USL$Yn%$1VrgDkcEP7?_RG3Jf2E~UR(p892xo{{#js#{ zti!#CmyTW&yF#YCwJe(a+SAzj#O1#>)^F;Jo_km-o&3wiz>vUqz@UURp>9bf(tX|H znX;k{H^cJMRz}=mpQAkK4%DWCvWfGqGDhuu*_S7NVaaQTuZiC+u4^vu2znRJ5VM>i zfnj&Up6#<3j(p@ia8Yl8E8`5`B4g`cUJvFdgTnR#BSS*KzdP3qx0J{AE&uNq&X5$z zaI4t%Y^v-^pVVo;ML|;sCM}b{v~QmAZ+djYr#~xp-??Af;JGe+=ghtTCjWO^07@kn z?&~T1b=>_T@xOn19K$TNXRHq<|F8d_w19zy;lPL6uK$0%H+$*Aeq!S8$K3zcvp*7B zQB%Ok(2&;*PE4^54Ir8ULaw>u%lh~HEbz3%2JVi3LjOOM zvS|1xyx;DC05@n-CDy^?&o72%J;ViV z4NtpsGsMLi1b%&G6k(7(aGH}rrLLBNHQ^@XwbgOeqKr3KTaK*f-yp{7z#g%$Yfl}6 z!wdNX`3npdGrVA!#lYb4r;S;I!K#5LMy!ZdT z>89=GL0czwX)RS^cYd-u#24g;CG~Z$cGp*Y`XawI`@f)NuUW8VR|tz;Q8?oTMh1sp z^7Gj1-pHF?Zch5_w6QeYMdb0@kY3S-g@#<+|RjdtIuG) z@|KUQBu}dpI1WAjFZzEwIZy73``!EI=caaZ9ysDSI!V` z{OGr{GTbFA+aa1Q$dXIql!gPy4HN#k{$FbHo?)d#?$fi}cU=;GC+#dP*E-I~yowPt zE7b5s|CjuG2G><)U2}FbZ75!8+jTK*iHIdTPpbO_Pyzt;FuXOVh6>IO+`{_6_3F>n zM}Ne4xt=RMP~ZkPL4T>z)Wu3?xeui5zq8L;bn%@l$mZ)W^;ntB7+vn3w~AX|->hub zO~(Tl%2+hP@v#5P{wce5H(uT;p1Z(xqOct4jxf)#4^3;ryqh2H-Y+@Zm|KHq{W^e-Z!d2+07T!33z_J0!u2@+A#g z7FWwfd>I_xP5-wr-l_pKp04n{`yXhyVirTgo&GQURt}fRFT3Wy0JtxB~20iU<>lDAQw|OZaz+l4YvPkaV@ls}x^#KeQ zSf2FUzJ2@p=lui;}v|NQLX+=!KjFC2I;bZLJ-1CwyW)7eYkSVWv&p8xa4=M%G*+`F33vB?fJ^97nB zT;ugi{+7&vx_w-mfXXBL{LRg8`!j^Gkct zz>t+v;)~BFB|mrnKmC7N$;Vo|hu-$~75_jUU*%SRUMDT_7X6c&*;A{5kp74pO;G zvy{7D9b~UF?pm}r&+9(}!wd!QM5l?$zJF&W(Qd#WM&)ab9iZZ;?$L32>)#iuK@c0K+7(QjvI_)XD<;><0TTmJ07 z;?6q(G(q^Ck=gc%d~`$CCf`4~@AS97)7$ng>dk-4eLt7~mjcK24n~Hm;I((vkBNkq z|9=0hwdnV}GNuc<|EFL5_~m{$#FPfPL;ai%mRe@#wx9n0^xV>IY+LMmLXKTpkln!l zi-lo9)MlBRq76mAlS<#YzGYb;@!loSZArwdg=`-GZNDWjF!(SWyZUo_$n*HHyt`9R zUHtgP{)f~D-}&DezrLHAwkcbTtwEY0A$PL>*0$Ro$EM%QFZp(2gTUH#|cSASPeoE;K!%Yfm4)$w_! zVwW_(XR!Zp|IhEQ_okk(EGo{v9{eqdfx&<=p+WY6`o53RX}Q1hb-5f&`=;zV&cLwd z>8^Cs2T$u|A2iBWZLr%Tsafi-zWid?5~U)!D*_A*cNlrp7_1I7=l@(9oIaJ@snqbkobtG5$q&R~%*7!N_nf<(47i1xCLm|5Mpt^c{^`5EAmZ z`d)h3=abtQOeWur@!zWj3in@;|E@DudHnbO%ongMWXj_1?|EnW7O$NBclG4M(u@ti z8yHy^$Xhw^zxxTbJB#Ib++UF+HZbW0f)Fjv&KWF?&bf62ZLw4^$aVN)+>!(96p5KhUe zx@rGo)0fsWlrYFLRK?ygVchWT{Vui!z65K55L=!9yZ5Z~_;p-QfkF1bB*{&_Tj%k{ z{bC2L%TIV9!eCt=bB^HxV-EWvfdyPuasS>c{$+09OL)s8!jKJF?=8U;;+TK>{| z{z~Ooz_4Q*Q^R-7#S8%qzheKre|YOv5UT_KxlhNNUol89X)s(1-(%*-+#t1p^9J9M zTYd~NjHL_=d-%1O-5A&Wa!MEdG7VIE^stsN7%(o_&iCLGOM_a1wLlv~=!M6h_FFPA z%wo89%YYG7#(ZaF-Vy4+-Y{>GpXd$lC#zT*Ha5I3>%_!*)gnus=R9`EPBzzvE*0 zFLQPVhV5Jt{fAjVt+QY9+%FhFvA}=&|LTj3F@+2lSaR5#v<%o87^GXSrHM2sI)FlS zJ@XEJ35H}wSq5QnoyXvN02J`Q-ZO+rFQ zR~`R>$@zct&(%Me?I!+S*Q_ka&}(JKlyhOAQv5)Kf)CAH zf7xHg`ryIFczw6q(d&PmxM;gxZ~Hqvx9F8Ck|LSIZ2rCml_?IwCoGF5&%XKQ+2qTs z`?n@81FyQ{sHl5c|CZ}O&i79TAMclSy?JHw#k=cQZF{eI%zCBF@uZc|^-L);KK*sc zt$iUmbF@K|%7Hp=jG3yJLD4M1{Y3BY^~-6yuFKrXP^+FeJESit@aY|wbByYj|L+oS zSeD0^zeQGI>f;U(U)ir~a?&oAHk=LVTci>HyN$nJbO|#nEF}0{%iQLtV@gx2O<`D|6gl$UhVUj`U$Ty&3RAw9$Cb&T} z;S7&f*qTqiyN*F5b;+aR|DXSB-|OX@5bc|{?CisLUuL@J|2gN+&QP#?mcu#2`I|Mt+IBWxv1v zyZUmf`#1UDTfb?G>`7pFz?Umaf3@@gu6(s#Xf01Q@HbeJc`}6Y{Kzl%$KKy^VZ~i_(Z>s~$`vtr8 z#b(N0X*Yj;_w?o0?`OqS9{=)b{+5^fE%y|*?~4!k#eRToVf!w&3nty`8BTuqE;s-DRR8Tb1H-!o<~6VGckTr325erj{G!Rk z&nGz>em5MQbX${Q^-abj`{efgrFCzW48IyQfEY&eWa$e`!5K!&VKD#(QgLfAbdF_s#dYviE-mhU_qgX|fJWq7Se4 z+Q81kkRZ!_U=y=P(d)FIdqC2M1HMjSU1|;*)@F!cyqcBfxNvR#J62F%pz3r}(=0xP zzsw9@7QQm(K9$b=f?=L1L&H{WhSNG4AJ?;5?ECvP!22WQ%mvv4FO#uDCtIYra diff --git a/demo-data/gltf-models/irradiance-probes/model.glb b/demo-data/gltf-models/irradiance-probes/model.glb deleted file mode 100644 index 241e61c9fff7acfa21b65dcb77961b1d153ffbfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38368 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

<*A!$n_3V9PL9EN3P3|)gZC$knBZ?FJv`HW}>J^ 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 diff --git a/demo-data/gltf-models/spot-light/Scene.glb b/demo-data/gltf-models/spot-light/Scene.glb deleted file mode 100644 index 2b15b6b9605413d978209b267c538272443edac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7376 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 diff --git a/demo-data/gltf-models/suzanne/Suzanne.bin b/demo-data/gltf-models/suzanne/Suzanne.bin deleted file mode 100644 index 60f54db70ebc7b8d7101ab1e8ba6142950da6eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590400 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≷E}*%fhPh_1)d2! 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 kRzo33m{gV1+^(*RE)vu{v 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 diff --git a/demo-data/gltf-models/suzanne/Suzanne.gltf b/demo-data/gltf-models/suzanne/Suzanne.gltf deleted file mode 100644 index 56607849..00000000 --- a/demo-data/gltf-models/suzanne/Suzanne.gltf +++ /dev/null @@ -1,193 +0,0 @@ -{ - "accessors" : [ - { - "bufferView" : 0, - "byteOffset" : 0, - "componentType" : 5123, - "count" : 11808, - "max" : [ - 11807 - ], - "min" : [ - 0 - ], - "type" : "SCALAR" - }, - { - "bufferView" : 1, - "byteOffset" : 0, - "componentType" : 5126, - "count" : 11808, - "max" : [ - 1.336914, - 0.950195, - 0.825684 - ], - "min" : [ - -1.336914, - -0.974609, - -0.800781 - ], - "type" : "VEC3" - }, - { - "bufferView" : 2, - "byteOffset" : 0, - "componentType" : 5126, - "count" : 11808, - "max" : [ - 0.996339, - 0.999958, - 0.999929 - ], - "min" : [ - -0.996339, - -0.985940, - -0.999994 - ], - "type" : "VEC3" - }, - { - "bufferView" : 3, - "byteOffset" : 0, - "componentType" : 5126, - "count" : 11808, - "max" : [ - 0.998570, - 0.999996, - 0.999487, - 1.000000 - ], - "min" : [ - -0.999233, - -0.999453, - -0.999812, - 1.000000 - ], - "type" : "VEC4" - }, - { - "bufferView" : 4, - "byteOffset" : 0, - "componentType" : 5126, - "count" : 11808, - "max" : [ - 0.999884, - 0.884359 - ], - "min" : [ - 0.000116, - 0.000116 - ], - "type" : "VEC2" - } - ], - "asset" : { - "generator" : "VKTS glTF 2.0 exporter", - "version" : "2.0" - }, - "bufferViews" : [ - { - "buffer" : 0, - "byteLength" : 23616, - "byteOffset" : 0, - "target" : 34963 - }, - { - "buffer" : 0, - "byteLength" : 141696, - "byteOffset" : 23616, - "target" : 34962 - }, - { - "buffer" : 0, - "byteLength" : 141696, - "byteOffset" : 165312, - "target" : 34962 - }, - { - "buffer" : 0, - "byteLength" : 188928, - "byteOffset" : 307008, - "target" : 34962 - }, - { - "buffer" : 0, - "byteLength" : 94464, - "byteOffset" : 495936, - "target" : 34962 - } - ], - "buffers" : [ - { - "byteLength" : 590400, - "uri" : "Suzanne.bin" - } - ], - "images" : [ - { - "uri" : "Suzanne_BaseColor.png" - }, - { - "uri" : "Suzanne_MetallicRoughness.png" - } - ], - "materials" : [ - { - "name" : "Suzanne", - "pbrMetallicRoughness" : { - "baseColorTexture" : { - "index" : 0 - }, - "metallicRoughnessTexture" : { - "index" : 1 - } - } - } - ], - "meshes" : [ - { - "name" : "Suzanne", - "primitives" : [ - { - "attributes" : { - "NORMAL" : 2, - "POSITION" : 1, - "TANGENT" : 3, - "TEXCOORD_0" : 4 - }, - "indices" : 0, - "material" : 0, - "mode" : 4 - } - ] - } - ], - "nodes" : [ - { - "mesh" : 0, - "name" : "Suzanne" - } - ], - "samplers" : [ - {} - ], - "scene" : 0, - "scenes" : [ - { - "nodes" : [ - 0 - ] - } - ], - "textures" : [ - { - "sampler" : 0, - "source" : 0 - }, - { - "sampler" : 0, - "source" : 1 - } - ] -} diff --git a/demo-data/gltf-models/suzanne/Suzanne_BaseColor.png b/demo-data/gltf-models/suzanne/Suzanne_BaseColor.png deleted file mode 100644 index 35469abfe86924d363e201208924ca2c1b117455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161624 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 z zSN6#{F`c-FyisgyY)_7fuG!CDEcxe@N)PtbEA# zzhWk1m|0_HKr{cW!h`=9ul_&as2DJ(`AuVPXQBhs|BIJ2&gd&7ddy35VC>0YpMB_) zkk0%=(hn9K)J}7WYLh(FG3{MKs!Y|rwk7@^GJmC6s{c!RW}Gk#T7B_&gYXS4mN?H^?!bU?r!9?@cbel z<##Zxd!qH*1tn)WbesP#=5cb;5_EGrV9W>3!48uQL&H|N&VRv{-@Bmqxsvf&xHmB4By{uHZV2} znDt$9A*;#>nF!hAJa)zmMRg3)+9|0A*Wa&~+*kMe^oQ5xTh5+l$m}o2cLm<6 z=h<*Dr9*Cl%;ss!{FsG>x6QOJ$T+~uuFkh2_W#5rX|Wd?^A-lRHH79&IK=i$&P~PK zFsZlX3!l8{D;AFOjK%y+ z3hS8|ULGx%V<_Fu)*SZR&!!vfX0l|Vn&W036@F!{uKyR- z>8sQ`t}|=YRcBeM@A0tZ#`jYUvKO4*EjYwgIziIMW3E_*J5S~j@ies?c5G}@o<3Kw zJkevw%)De{-?q0e{?}J9%ZE*Hs$th;e!!~9%$zp!00(FI4cSi{3KAOH6mzagY`Y_$ zV)sU2{r~@ovc^Zw=&0-oNal=|WWL6|if7`KrYi@n_!fL(+$+d`?)ra8i3#j>5*s2o zPX6!VIWg6UImlh&k$b>SzL!h~&oJCR&M_9k)He25{>#lS$}IwQ}89e>$v zZDq?ID6BcudQ$lhA9qEDxxgF!E20JyR^N`0On7+m00*a7z#YX`mLBaQl~Y-kIJI5z z{J%i`|KU?96RI7IpD)`V<;BX~#f(ZwA^%>^{GbA=% zZxz`7znRsXxk%=~C+!H{4awaF%0+XUxBPRT^^oCa^OLfSzx}uJ9Ll(bnR9O1+PpMw z`oy1Nz5+O&>@c>{2Z37t!1BqxIs3AB?|S8H4;3FY!l+GJmr3 zDX?PXYQDt3B9ZH~{)Q3`xdV)?_QFT>6*fEMvB<7r>2}|7_d=kNhusf$dk4{#nJj1H z1#pNC!Q>SpmV!^m&PF!MaGolsdmfTQWccD@1!qxN{T+qVk~ZHmzXJO=kaAeBjW~V-fjMGu)hDxIr}AVTw`4i8E~zTW18@Z zC-AwE()7tZJsPWzDokTOIzu7XQf)<4LAuV_Zq z=D@CgKv?#Fg7!TL35U7WjB;vhm7aQRst+9N7X<%1+OqRN`LE`*XNt|&u5eZr^q%8b zX?-Bq)Gb50oAc6a=BY;)Xvgla{eAYs&)f2B7v3^#XiVA=SHM2Mk@07ZcEp~B*KsRu zPS`ZNkumU`(Sg_86J#zY3r#WuwF_{Y8 zk!xb(FRJE>d7qj6+H^tKtQm}*YdBT7yL=*;rwXn$N;nc^86af(f#KJG`OFsiZfVH_ zFNJg%z323RR)2&tSR@-b7%A%ykmpYeiK%r9BxE80S49{$4{)Oq7K_swc{Z=(gDST>%K+UnD=M7ZNd z{T73!89(LYZZ_O$w&-D>bzuP~-;dD^{y%`$8< zGaAoI{7rW_>+i!eA=IT~svgIF=Q|Ak-V5HGX6WV*Nci7w&Xt%dsjn#%OuT4U|McAg84Zyc7mZ!MU#Ystf$(KouVCkpKLhDRd6e@VdYVsX2nlE3B?MDyq($+k!;zk z51z8}xZxPXm2G(N&)EiMR)3ZhOyy-3`Lp=p$^ShOZ;}r%dIX+!U~{;_ zuUvfIUgt!@>ed69{VhKdC0JG38TPD6W_TKwF_-U^2J`6!`tR=>Y}iojbV@v+j#aE< z!REpP>PL+aohq#0WR&Mfb2xQqLy^$e9>F6^_}AQL(%ZaX^Yst8(HFkmt$(raOZ^4o z)`V286=@8mRTIORn_g?Vr4?B6ds^a<`$LyK-vh_`KL@P; zRZ1Rdv6TGb`1^0;=}!me)=MqXcJp|6mSLensp*aTJqtohcz7O!GTd)`&iLmSf2X9| zg@g4Qw(%{=a}}A{!C6)y*?Og~;Rs(6D`U~Trme>v6VLO+#WuWPc7D{`$QagsFiG-S zRpZoF0jbSr*jUX@JUt^N6~+7iq4#~aaHa>|-Ww)Xq?n$N6p^dE@WJi<3B$m(8(ds8 zbQZm|6G$MCU*i_n>6PB`s zGzt18muo8}JBt`8ot0>OGQnN$psTQn%>?O78~E7wEcn-dYa#1Qp4TfB%w-%O?cZ0& zX8vU6g7)aY&G+K@v?olse60S(r@$vQ4DUY}Dop!nWT4=->0u?u8{2}9-0L1VuxA-M z^Y}{$5>=jol~iPuSrc)*j{e$GtPRAfnmI)yJT=gH0_b(m=&;#=^Os|1b10 zf7-PDKhK8AuO?dm?eXAcyuxR(<&o1#;RzqwTGc&lcN}uFe#5Ww|G$07g{ShbULM)- zBQ=SIm&fr2 z?S@^oN5ntoJhi6Ae0x=CTI;e|}wmfo(@)$cZi?wu2iUu zJ|~im6E-_CCvPaWl6aUZr4rlxre$el!Hs|a`!~h*FmfJvv-H~=d*!I=m-bPyoZ9UZ zE^{#VGMv$5w*2h>e)7MKtg1!N=QB=PD&fZX)`=k|&p>Iq@&qG}DfX5-Diw_PUeL9# zKfr$dU-Na=2`4pQyjAb%Fk+0hWX#rXJY_p!U;cc@w>Dx0=S3>7GVbYPIBt6=c7I(R zbDaH&gAFm)jSillos`tDHlXz-`}EBJj!!L;zKWcfov__diOt&K^t;p}p#J=W#QFow z|5X~=|96mkknlNOp}9Wn0N9|JF#IV=gNHwMm;77V(xG{l;KkLfo1N_V^%j+^4&oIcJY+35>p~{fC!pW^(P?VK<3nRC&^pSR6 zsXy)SZnm%0Vkk`$kS&gwl9GcS=y!#y098UGtKY03XgX84?{{=R`5-^rH_-R4*O9!^*%i0x38JL;Z z1arJfIsEOY(Lw836E?IxuVr&-6QWA0VRL9ap?so-^qW{}XuKZWlDso%WBwx9W zcjp;5U*QdXjEiKPsrlJ|eO3C7Y1?hGXI#?KO3*5z{y=^%iQ2 zNeE=JiB0S2+3-vFQGEov+)bW{ip9(9J2>nA|2_QT%we|O2Py?Bgc+Ex$k+e>$JVZ_ z5jSH(Sd)QK5+C0owxbEgzZO*SFOgjH-adtaWz!uYLH`9`zJEV2{~^@>|H8LSC%!Q( zdBH5&?lWNz&u9J|ZFUvC1le+rUo0zAoFsF8_0N)!5cnx4XxGDYB9m#7+RT7YygA-{ zpAr~V?npf7b$wFMxKucz#_+&xH6ES~j>-i;*?W^GtUeHz>a?X_V&juoms?2E6y}+$^B>er+sR>&l!!Ue9U{krMCFXI4t^XZ?V34n{DGOO|^_lj=XR~g;RPH zlp<=m-kmovHdeS^o3MGo+o*{7os4nE4Ho1GCp3uYf9MoD;lh=oI(3JDb@L`2@#aN5 z^378;a&FpdGpC%le{0OLCzer9K2a}~A&!&7hW){B{kH!2I^#b-cy~^cyk^GGDw+|* zcxP9d3(p>>Q|T{E5AjT}n#Y;x&A!CP-Dkz0_U(rqR}21EZq-*==CEC{G5kVf{*}hH zF3xLKFoZI1nA+vz;}gN$&AEqV5@V67$iD|EDG3g*CKw!IW?95N?LtCYgH~I;#OaQc z{RU6G_!7Bx&7L5v!MtU6?}{mky#c3$dDl3y_OWHKIh%d`U*9tK!ZQ|T<)9mXj~W?! z?OGimExnu$9!?asqX31#dZFPmn_nl@b&HS@=eSv;foHXD`ec% z_4xOB`}&Hvsmyx0O4k!7F#8GYn)tXm#JK+dzt%;qvL%zu#GLE?{_?z#5y9pjexhTV z<;2;MJsOpKYM!S8!@5>2{ zj2&7Yjm(_h0sERd4r#Fl++(|Wm}P&n%tG-=V*d|o%S7C3HL(i({%x^b)gcD`BnP|J zvoD%**i1hi{ATFrFY=#XSHm%#$3W>2>!m>UUw`GZp3BEvVEWp$J~O#VHi7NcpFimh zy6sJ&842@^nx<9$O=@^6?&&a}*j2B=TX&`ANXIq9 zfBfr@Bu2|5RQ|nhA5!d~D!1lPlc;0Q2S1J_O$|qRlftAQ#ko9Z6zbp5#VJ?*U+|qn zY-!W1S&4bgOG?>(9JF6xz|<~&qjAE7-~A#xCY)naiA%`jo|d2ZmBWKKd^WZh zIr;{B{{40C5_{oT9w0cuJ|Ug;KI=iHu%4|Y~8=Z zlQ@{SZDK8xcu-#;<+7yxf5!8~1D{^iS2%M;JH-T zaU&z8JdcK{%>NfM>nr@TfAXtC(8!zb-5w){Po`&D7kn0QF#i03PlcJeM&Z4DO##!S z8-g_(dU+n4(^6J>+w_L*q_H!98dJOBmUGOe9tvd!3RY7clp`Z=9xPQ!dcYL;?12A- zfBk!Iu?X24{5Nu9=W;0IOj7<<22K7nbL;ZXQugGdW+ragZuIAuC@n z!})t`)0?KHp==dh2?-4*eTqsODjfXOPvjiQ68DH`ek2hh-|$&}k21ex0mE~jj6inI z`WvUj)q0NEs>Cc<*R)nBx#5VY&OXV7AI~3Q*||*UnH~r4Mvj|nf7~iQvH3qwzyY59 zkGdK8>K0yIE>NyCeWroAv5^9E&QG4%63kN>*JMe){qz5*&^*;jq8``hwG)8VRlg%Cs3djqH2>la9`a(KwG%DAravG^+Sn03Yn ztNA``Q&3)$%c)l?dEg(D;YD^v2f@bDE&Q)iT#`AI7_?q&6#aIkPx{L#j`&uV%w-BO z4e!#t?y}viKGbn(BYWzF`u`KZu`IGovfyJ9;Br@VRGj1GAQsdT1+m1xrqJb5zVZu||GV`GTwi ziENvsjRY9qmHbI>F`tqss%mVkopMrUi{TlryRZL!JuS}G_J2c@^w!JFt9T?N1!V;S zYW_5reM`t|Yf(O8=k}vVn|TjY>q_>SJZa9hT%3F!t)HYVk~yOi89&Lcab_?U*I|42 z<&X2L7Ne%!dp~SQZ3x?O!1mAohjooTYKNV8e%5ewNNfq_kYAG0&}PZ(GwY%KB_C7f z8UdC`UV-({>xjkA?6-X8(%hW5d9gz2iOsKiI&Si2 z%xf)q;`r#lgu~{&0+at6E1chPm@Qc$k*`z!$12GTXO2r2jlAm&7L=}YSmva}UFN}m zBlW)`Gyemxsggwt9>u><5IG{xlaSwh=HGYu!UBF~<|Dj59>$ChZqBZsuyo!8M)MOp z{xo&4o>(|x!iBaKtvh*5 z*DJBfDSqVitlqGeIicKG=?$BHZ#5O6;;}^?L)-6sfQ|uL*Cr)7A;_%e)MHzdT`w^AW}+f_xL3->z((;x4c`fqBUVBc>Tk4rGc+s4SRmsK8t0 zlFlS(KVb{I=68i>jaQsL-L0?Kaqtd{5W{s|p8tlI3_VPjtohGA)mbZ8QsP0XZc!vJ zckq)f3|h+*-X$M1x_pFbuV*tOXT!PBgaeEd&Za3aO;|Or(Zk@@&-U1hzr^!98b5I^ zsb$bw?QUp#nCTWrBY$7hDf5ckje3==XiCngTI;S<;SYA4m87R5Tg2Mbt~nRA3VpXj+%wwQ6Ut)D$1>_KC9j>k@3?Zb|5 znbVeJPf!$g>ET&W#$^%r&+(Syf*rpkIZ9dIL&Y(&nZvC;1OqW)IF|-wFM13 z1TTGT5_7{4&7MD++^hc|{FAcKkx)!)xWnyfe`4`Wj=vonT3QucY&bVnIAuyLQ z;)e4bX6}5JUKwYBts9C&Oipyv&9XWY^CB*L%ZHYwr4f=}xl4|z4a_cGfBDy@JTSh@Gohq?<1OY}nvF}$ zJERlJ4y0Kx&`V87Iby>qKgB}fq6z3muzO0a$wmhZM2!E zGx>&tjWY8ZXSQh70}R>HMhe$2`<$r$r?9d8%Ff^IQ}Ps56;$m1rZ({YYV zacq|8={P9nrXd}|cYrNSp^{?~zr@5(noDFGZ>?-uS{+fzTK2pC$WNvRj@)ifR6kBQ z#>X6WTrSKlaf_~mplmps3PacC|2z{Id+R4KvFUINF&~xAxM^z>C#lfvp|IW2KlA?#A)soa8> z>?>Cs__e?8?O5u9O>F#7<^Se@RJ)xjBq-Vr-F|dTf@Sd2F15 zc?s#W=Qd8B+uArw{omwCdk)-dV&h%W@%Qs{`5y`g{No#MGuSofu{iKdGCVZfNq}w1 zpR^{^w~`KDm5OHe2K6&2b8qqb%3rWlWQAW+!*SjPxwr*$tV!t!zI3DzWkoQ z;$|-xmj3_W-magc&?qRAUN2Gi_s6M*O@<6xgc!C-F+92caFY;&Q2qoanVm(8-F`Z~ z0-d4M_q^Z+-+`9odd__xWO{Nl>eTbgoC0#5w%pd0qzEfMl`9ZSMt*4E7OL51Q&gK`6Z<5=WB)WY#V{4J? zU>)^;fowoTRqGc01&PNwW->M|b^IVy$95t|d(CBr$ce2M2@@I_FDbV2RvbPgQ@PVB zN0ljOD}%D~l3>ox{q+fnGk*GfczT&Yq&n|aNj_9?9=-nsBR zaXiGGr^n39yvC6KHWQ=w;|HF-^&Oj7E>*ajXh}*Wtd>l8$-JZI$NBsRjS&-c+Z6(z zNd8}F@tdFf@WpfX%oiEL%=<4*xEgzfi#^~r{}n&iH9Bc5*X1XCl9{D{FjY*Mxu}~d z#INy6!|TF~z1*vr9bQV6Oubvb#Ec{7DiiaT9EYU~Qw>TEv89=N@Sfn9ar=Sxq6JSS z`T6zl_%0~wW!+^W7qnmb*4hu7kj-3&Wo8KI0 zWPZS9xFTGFjj7=`_kwM_8?K)@bm+)|lLwjhENtj)Y!}|d%Mev+pl~a9LK*W8xklfz zzwNvk&CW9z1Ft!}3JRFXXLUt9M7<#_tdT9;p^!C;+2NIPhuwt~MvZe0xuF4fzrELA zGM8iZ?Sswd|1XSImQ>W%O?b#-x4oNn$K0lF{!#`8%Ygq)-&6h^6h7C%#-_5-;D9Z& zr^E{0JN5tn1)82q;0=mkW=OKwHCrK&sb7Na#6Hm(&JKdDOJ)5wS$~|%`Qg8Pjwc`U znyJSQaI_k9yB$(EkZ^~qL4Q%_O)iHwl?*p7OQ?h{%42U>7QRH)Zvzw4l!K0v-}Or@ zzpu}qz$Tt?Mf_q!nuCfFn_GsvNQDQ#x;pccgFpCdtTdMdvTfqN_S5Z2XhAFU+}ywH zx())F61!@6^2}6J51)%+_$j=lMs$jLB5!DfvfMS>rkSj#w{HkF+0Z9)X1~Jx18IH< zqM|#z4|d%8@xOgb7sI8GZ9k=NSu&QVD6+3_$Wp%0V`pw|&YUt+%6Q9VF0I-BnEj`v zvYQ`cWoeOcC_H`q^mzvT@PEpsRufMdZJ7W6U#s~K#hEgi=Zy~>;t7*$DRivI^H*>;Ev-2AWby||#z*nzD?;ql)M zHb3N}7#FQ-*ZIvVYrw+A?s4N#+VsRsrmfB#ebQ`*MV6? zVSm#pU4i+WyM8gq^j~1x;h0hET zkuxP6tmim9e)4~ztNNO=4BXKMXIXf|SL|2JY;I({rr9zzQ=u@Rl1q#E#?70OH*Q2o zDrh?@UN1YW#%*C?A?d(;sHy4DgU0F$TCe~A|2TE}gcI#C!YA3*3(wfls%9F-)NsaC ze?_JtN5h;A8)ova4v~21$a|6T^qebRzAa%)2M#l73L7c$rUxbqFzo%+@^kJycIHRi z{$Cs!ZfG$~kaK#@xL~&Tn@WZk>`aShAMQx^5Udq=U_OnxXT#Zo1a9UpX52;2qLl&+ z>-q#I%{+KLxzXy$0x1R!Hf!w$-Ww~~O;u(tSiDvs-@%PhG0j=3;Qs^me#1ljzRcp* zJv|qMKT1kUNKSOqTDaHrgiy|lc`RU@ar&la=x}wzCa3j%Klx{;HkGVP z>=9!$WI*iT7^jCcTCclgQyZsWYhLA3S?SImL@XH6Xg&XwvXiPi&hi8-U zrHQ}#qx_qN+15N}Cs?8G^Y2EK8VDm|00jQS`h0nz?=dKS&mIR9=`FR&H-nb*m2*>?7-F}At6xt+MZeG z-9g#>0tM$VC5JBuf((>YoB#gg-}qldhV8+RwjaHmRXc=EXcQ>(&*PI=u*}%V!Ap*< zKwd7z-uMecXvVpu2GfGXr!p3?4eTX~Go>f}Q_v1q$mGA2`2V;3rlo9e)EB4)ShAiv zpP2618H}2j0f8h&H)HH6s-}V0=d}Y|8 z!SH$GR!xU0$KQUAnPMUGjbVKar+fk=Pn==d`FJ*G<^;jI7s?luVygd7{H)46u|dZ6 zM^9SI^81ai{}}TaD5T!B-xZvgJ27xpXJb?%gQl{ABJXZnp1^mFM-+`uP3TlS!63h) zhv|AP&jvGvB|Z$(?x@y55#?$#6wI0lq7Bt3gFm7D^ zV?nC$lWAf%ek%PxxSiL)IbWIKCu5Ep^PBzy6G!*v&)4aKV^5*bf5M1DWGt*(iUZ^CI`F(*Z?+s(YY`M82@&lq`l zvs_bPsbrX@F;TZA^xccj{z)@hXa1MJ=fS*_^P+;wx*o+ywpU>p4hOdw2F*C2@LNgI zk*k<{(|yIxd4jWi19X3%|1kg25#DtZBqaiUntsZfa4_tWWN2~BnGv1f?dq_dxrXiD zU(Q{!4U#uHneXx)V3kQ#IvTjZLbY@Py9r0bjrHBP%`U8E*k3oPJo%vg3)`CpmnS}E zRAGC!KtS@}0!M}?xkejm7^C(0HZyN=Y47coJ?i}b!0FqDvqE@ycqX(-znbJ6z%CGx zVWd!cNK%nEyMTGB;G-fBE9RBXDOC{TvuPWqj~6?-Hhlv)`1{_B!;&o>*a|V*7`^FJ)7swau9`8-71Lc#nba{r=gwo-7{fc8mv#E|0Ly~IPwf{qcWInge93MygW0Qn!6{*x`UOkA z%a<7$Dlai+=az|xOK5nyw_amzjR5nUzxMYbhNvitGZ8 zhlIC;vWe`UkSp?EQL~XVh|Td;{e=Y#E^q6XSV=x{`5?*s-|;24kp+vN3vtkNgXg)oyAT?GlD3IJNdC zRC1bhANn9~#KDza)9A(g!Vi15@>~#Q;4%0+!R9x=)d_~zImQRt`6t|A zkUEjv@`O7eW>Lu*#d|3YygY{=$zHQ#oGQ9t4|i6@A*pE{W&+I2EBsim2A)W@FS^SV z?a6pjcn!~n4b0D9{{MfVSy#aD#ZKu9iTn{Eb-%t$WSlZ@KhyUgMMaKzvP?^}Z%o}V zfl)F-@-w@ThJ#+wbNPvS5&>*aB_=RzlA2*)X2_<+5OHJCwS!M2ecqk1SH0)3s_TSV z+oW^$CxV+&pa=n+UrX;|v%GLv8L>cOvK9`E!oB`Bl_2!~WKy*5vn&2{hI5B9a` z2fnH#g$k^>$E3SAJ*9C?2aBc9rT57x4O_Dlo^msn1TcmzJ9x|a|H8%G6N=*n*uNhN z<7oQQe7ott;8V*bdl)}Der0vx|IrZo;D_`J0SCSZLe*wsY9D4YB$V@XePKS8IpLeq z8k-cRyIM!iu;`ip|JS;uRMD^X%E|>r6M1Vml(!_LH(XPF@JmieZh|ATTif{qyL!1R zCQEDRH{Cw^AWOvTBcq{c(EdNH+oc`Uj1IoG@Q7xcBA4)$Q|I1+=Ue_X&t+s;S$?27 zY zVZ&1E0%-}sz66&d-VCt^`dbW-ojBkzty!U&fhXdxU;k7FA0MBJyS5SAnI3TECv9VD z_OAPEa=lq$u!PVm)&!T$z;xHh9cu7 zfjm;CtUDz`Dw?dgUZk=rZ`sVjnSbPs9W(QyM=Y$&Iohl{4z!+o;Czb1!{=YKo@ly5 zR>om%A2zlhKI+1kdEe*J%MA5{1Id_%?;=SPwk9T_x#pKo}>{-jUcIOtbuii=jY zMB-Fgm70Tv+~1hDmGBg57d@9ZbU4i5+ul+1(Y|8A6Mg1I4>@nI=I4}+i0rd5U@ew5 zRu*2g_|O54w>(aFSb~}LxFr>hKc4aEmA-K=v*6AjXP&)HU;no29Bq?*!7lC6xU}5k zhhy`ciH(f5z6aR$NJvf$KX1?+!(m(fSpSDfyodUH#+PkO9Wxhn&E|Y%UQorhlV9Zc ze?{-ligtha%Nd?9D5wSai_EEUs1|no$YtmA!Coc!aMI`d_9qh9giE4%)+qDePUkyq z|7L-9grs74<{`d{->iFbpJ-PkJm6=3;iVbS%sTDgLH4wN&O11T(mMPMbsC#KOKb@2 zdLd!l@O^Vr{>cQE=Ta3FO=sGU@>rNVf9BQj-`uc%m#fLT1oH(AXIiHiZZP5tlyj2G zo>0^)xN8yDodPDa8xD1iQ@qbS*ut?%{LagN?A*Bmyr(bwJm|Buh;_c(qw!wBuCF6I;L_A~_{X$8_P|%}C5?PSj~Uk4F`o@< zd?XygcleWLhJef(_C2bsyDl+Jxh5fC-1)%fyZFxoIw9r;0-OP-G}ulZ$ap@#vGLM5 zdyTV>r)=0VcBf8h6WcG+#=a<)S<`+&sSI;YnnVeQu`qMeQKc<)sSQ*1Zz$7UGmq)% z@B04&+6)hK)dF_QMzu5_*;mi*yX`N#`G1F+Bi}6F{1i>$Uy{p^S?##(;$PH;w$y(3RPN?xRPD@T!n8o@k^PUF+4lbv zN|{ymI^PQEFf(UnULwo4{x!3mBTCtPGT<~F`*o%@#clSz>^Ygm}l^qCuWb#&ekXj;p1AU423i0zP3$H|UU z9F_qR5(%QLrb#dU*I#Lq*J*UN((hn7-Er+^yNmK7MefrZrtILHl5o*~-T(jcH~E$n zG+6Ooy5m~Hsd1O@gZ#Xu0(Ol@PlL9#@kBFzIBIDa&FJu}^DbY*9vO~_W((Le56T|m z$meOc?mN>Fe8F*UM8R^7k`-KA7IsL~x`#+iXlk6uXz73GMnUz&Q^gVO0$cuz-0fX( zO18xR$9MS!o7w*vJ4oIAztDKw{|9qJ0+>bbaHcjq^;9cpXSbPsg5hpF&z^gHQ`{2g za(Eo%U%TVq;$@K&>=nH|{u?XsFDYdBKF4V{56=r@J%!H>NeWR7@e>-`+uIwvCrcOg za&1`5J@0Hv;~9shQ^pZTS-JEhES#(q7Iby+#%yYKzx9we+{2wosBMFr>5~GTCq`^> zKaCu`7XAMasW;GJ^^7&v|1PACX@@Wsqip1Re?J2-=q9Uh6EXgl|%N&EHx{|`>vO=OS#_t*K%iY7M2e~#Af3cDScs}$@~ zvIUnMWaH9y%TQ*VBR^AtmqYD^(Wn0x&Plwv;PgYWaKQzJ)v1i-0skGRPian1mK5~< zmYCLTmA@eM*@?_aotzs>M7M+pZ2K=Fl2iZRA>4=IZ2~J_N%Jd<6W<#C^K5w9`v0Hf zIn#ue+s8X1?jC5E5+^y~l-Y{}Aq$@Wj?-5C`_F#2pUcql=hts zmC_;0oT^lPcoyt_D;QmwFgNUkfI4%@gvpY-YI*LkwM?siaFRD+?}z8|DFzL)8G1## znWI_^9d7mdJZLNmuw#w=e*6rNX19c37n?E`ZWEuxTu+bt zpX`_1J;adty7|y^`7M7LyO<})dEDfVT+N+y_zqLn?1n{BV(c!w3K+CvlLn{%70j>^nZc3qvS-Zhy^p{1Kg!TemQL8|C7paUP(#+b$Y`SohOn36Yg%P z{XU^d&g}9rhBz;-mmYtT9p;UiY{}bE{D$ICy6*YEpUQ2X*Biyz&i{WRZq!kDA%Pj}3 z`2I^K$d(42IK&lRu#o%hmp`rNKKySlEttUOt}xeIt$>vy^RrSL?}Y8Kj$DNi&*f8u zmpowjE&Qr(%2nb2j=ZdCD%%fAaZTvcUUR8!sc3;J(>^va!v%~VxmETa;45!gk)D!} z;4q_o-n55Pxi4iYOtABq%lNY8FXOV<2)j03o4^12Bl!3yHS6AO{~;U7w?=HrwSUfs zm{Qo@WEn=>rNr%k@gvYN*zHk#T)7eHg3tI|Vi{hxI9yVi@K=7)HpjW?Hx@AX z=n7xzvG?Gaa?OD`bHU6h`!5vhIlN<@%D+KWDE?p~!%jEhiS~(e!#o~yO?l?{Q@Y4k zR>iitmZwmpVm9}S9`1tYvai@8A{zd%dYf;kV0+2R|IEN)kwA*{nOcRd3nVi?gqc0? zvDJ`C+wRQ(>F4mRl}jZ8b2OI*6raJ5aK-0=_B zJtxMV)A94~HGkGhvA5asEv01&!v~vh@@6kMUh^0);JabqAhnH$XM>bnVd}I0|2uxL zRLUDYIDCpBe@Bzl%>yQ%-X7Lw`w+&(=26$YcGJ)Q@4guQf8Pk7{IN(D9S-U^tOEGa`3^ z-%e92P9vU-+BCS_x4;c>gL?##W>?)UHxBF|e`V?DdU@#6r$HJ>sk?6EL{rQ2W;Yz>g-MMGkz$f7oRO*ss4na4@{!<|&Sq z^8X#zzhhs@98vpcKI2NhU+jBJI~W7Q559_s#SVqE!&1xva>~l5UVN^fa+5QnxydN}ARA-CG6nMr1zxo!$840(Ox>W! z+;Jd4jwNAHf;Pj#3GVVN3f~+Ya-JnCWWXqs5m|4(l)T?c9nJ?Zhtl)Wb5+QR(A zOY*|Q3S7pXZ1@_f6i4fl13p(Kuzo-;MVB{wFxRJ8+2W%zqEoKl~5=g-sBi zAU%6Rn=$i_Hx02f*#en0-4taLkF3x+VRIr^YlCo^qNtQkuj3`TlvL(5N(|!PE;P8v z9bwtYY?sYD?LWW%;RI0@jU2^?=NNP^D%=(lcxvjx|3twvK=K5`e9zXO&77Iv1a7|f zIn(jCal()E16IxKpV%uJ*z9I7eB|-q=jKjvU`k=vHrKb2{MTF-^Y6d=l+Fh;{`YTS zex?^t)zl*WNMY;$3mwg&yEd5cbEUV`A80dF_+)))jfHU1Qx+ATL}u0tyLuRJSu~w1 zSuibk!WCvC@hRsVUJ9nzXQW9zk@NH8+hFh5ob$j>af=bVX~T}46$-{rJmxCiSj8|w zvOXbw-klF6`jx8saZ#XEzmJ!EPDOd8E zZ3Xkm0|y#{E<3%t`~QKXLx9F6#_-n-R;NBR&iVg;f$_bLl8?{zQ%+jHNwBGiaef^z z!Lq04L^E&ChY~jJ=?c8(>N~!0hcao!JA5^pzrv&+t(W&U}IGL zc&tIF&Va9KE{~u21cpQf_JGZw&!6ac$rSYcPw?X@^&Wj`3eo|KKlh(5inu4Sbf$y` zFY^-vHva~P?W&Ge&1WP68ML$&YV}^|*lsw>cFT?>nvpfT*x^+{z-{Iou0l81ny-jX z;8gS2+pkfru+(hJTZUZ!LuVK*8A8@8t4)-UNbt?@_{+U>Zo7K`PYs{QlA5*^jywkx zjYLnx1Q?4O2J?P=1ln_PVH;am|lh1achHr%r>(#9r98)G#Mf_&FS7SIL*^{wUb=_2k6TGorizUM<54=%JG1EEl zPq}x3L6Y{a2|J!b|;pWYo5(>&|_8*kx zj&S@TpP42hR=-AO0<+Bjzs@1H6Zlw`eC*dqS77~EUom|)+K@o=Hw|S^Y7NO>de@dk)A7FOixkX!VHCGkiip^Bh)&&hQ9UhSf9w|93z0 z$@vd=rr#kej}0X!4lo3>e_{mP=)<h>iSC}oD|%}?ekYvnJ6Oi> zSZYfI@6GoU{_*SZHpFliE2mT%uZd~@-O4ETPQdoV&FTL)9R4@KI$L0?g6V^+lK&M} zb0_pB9m%mfa{m9ryI~Q>B~|!%`Q6-pXmL-7PGFzgcw@opN{2-LI7_BiKb*JoH1ss< zM6;VdkdRDx_*dL&7QeQ9#7#x^H3v^|R@gL2Cw3Gu$h04@U|sq+-hN;6WA+r8JVWS=4M)jB6qYt6!Dk?jA0((8F19R8m0lck7_OXqF#Ck~yxO@CNs zng07OUUZppO%6k=s*i0^HS;2Vp>-P?WsWdtUWong@Z0Ubk-~OQhq41k*L$9J#E%vn&x0d3Ny5Px+XA&gTpr z&b?ot8@l19%Y{l^h2npX{Nl~WMVV7xGoGleKX7}YLL#sAn{Va?9~iD3Yo5BZV-w3H zwSPx`x&;53MhPQsEOR$>oFnZkP-j*&Ol;8M?L0Gux zCST-JHm%hPKlv}RF{Fx5kXTg1Y&lKvR(R_a&jn?I84UbM*Xx)3l6_=&LxIglE{93^ zjLeBHy9*1%*6eBE-P3$}!vBt4LScOkr$fHmmfZ~8;)0?`BO?K#*F?P1G~ZwilKysh}4NJvUf;c7x9 zo5!4g?b~=Ao@!~-IIKQ&BjTo{gK$zuBa=tyPx&l13%^FeGkkM=7>^of1Tk*164d0A z6#S~VgNnbhh`RNsQ+|H2g5I^ssW%ouk11!qC8>EA2#G-HhG;oYM;rcz4ZE_`NVOlXcBM z`$Ywe<@*}v@?3bK|HeQg;$Cx!!i~{*pP81@VA2$MKvwaD zW6*!eggS=hQ7b|Fw>=jwkf;4WIq%_*Fr+`zdpNA#Ln+ltnwWgXUvQ|(pW zD^Kt4a1`}8K8rE=DYwTQ!5F2czkKsq-Q^zq;FohrYC2bT$g1JYg{w>kzbB+KJEr|@ zE^iBzmY#4i??{8FmsCPRLW9oU-^_Qj`3vROZ06H^yiikWPJn`}p_gg(ls^fB)ql+I9SIOgzjm%QHPOfpuOl zV;t9s6Acn?l3RH0Y%DBjTr9b5jmRBN=CUXM{xvUgbZM8qxRLp++{R5C3>z*PW-R5) zd1Syb#CpEaB|zVL=aI4iDMhT|xU z-Dl>Idk4<_{PCTCrpluxW`U zFe_-}GP)g6kXRGQn#JEJeSpWH!J|9D+|cP0uW`vW_MI_oCl61%*mO$m0t0u30>hMT z4%bbL6c__`CA0I*YC6O-<-Wr^=Ck*j56O!0DQs^F)7WURx#_%ZBTtdy)RjF7_DzR) z0*^OdIwb$WbbHT)nY;ckXv|3a;lQU8bMPbQnfvyQ%)T4g^epNPoX=G?PIdL^*|6DN zAyafoTd(XUDYmeA2Tt+MxE=Vn^TA*B#fogV-}|pk{Xe1PWCPQSyFc5X2(V2FHQ`ZV ziaPh_@EoSs1xnXvF3vfTpt15H!>NW1-#FLgv~E?ET$n2uQOS3kk432c%E1K^jaL#E z#GE+MVX>U!PDoNpi@X!}EB1zMOB|;yb^fHY!yz9UeIgYFIb1hv*%+6|`Ur ztLEv%UxKF}C9W1%TzyU<+`ah@!)keng?_AWlYX$yiv9n!{h|7Ve}A9r@3{B>yg>oO z6Ssof%oYMXMVHGHp8r3+{XWn9eSeaE{P?MUc)R?8&UyR)Oa4<_d!h9zw?cUH=R5T$ zTm&`r4n9>ovwy=T-W3mDUqAogM?=oSrY*@g7n*lE-jeRo5Y|>ucF;Z{vG8rcjaTs= zJ9#F#uKO*q@F|;$P~uy0wW21`+cOz%oORsF6J}{}`QZhDFJ8=*J|n+@ zVbL)KhEHV-L2Qf)nJhwWQ`WHj=ok9hF{A0{L^*cmM_%ba@>m&O{`~V+`<#l`>9q_G z4$s=KL_8;&@xxN>Cyope&EjF44wqikf4HYu;CO;Tawe;}hofxw{|Rkh-`nq(kXTUk z|6%og#opwAwDvOw|J+~xapq!lQRWF$_?ymf_M3uK$pJ@8u@i4(lud*U6ifB~E0_Lo zJjr2l`^(qc<{#>6XWVyS70XbQf1T+Ry)tR4KC^$SEF z*GDLF7HVtg9BefSO6Lz@TVT?#@Ez++*3bG&8h`NDJ(XAz)YjA2eC5Cw<@2i!p3?A8 zJ;gDfvvnr-N9iNU{};+?oakbC(kECFBB65r1jBq^wzH28HnD8$VhmjNmwCIAt9UDJuywe?T3QE5@XI?^%7f7v4#CR@P}`asHzA$)gO6Ay`Tak5 znE8pl+KVzZwIwxt!Tg@-XBGsC7S#RvFJE{-nOWtE!pkX)7X#Rym%Di=b5AN)V4nSd zVWy~=0mmd~xt^w_!2vhFJpOH7&@R1%-9&&P>p~+N^MupR6aFr6lYg^HJz!sB{>%nG zzUEV09nuNRu?LK%x3azx518Y$E#EOn*2I-z?cq`sT~u>)Dpfbcwi?((s#Kr0D+wW^;w`Lt)Dr-=;dnu5Fg-=V4)3)65uT zcE{?!f_>m6!A0)R<;86OPdv3U@LN4w(cuQhxc3Uze=hjbXj8%GEy`hdW2W+i&{CfV zx}FN53rrZSwHfBP|NEQTuvOHe@p|3iODF0xc5@gdbXxpo30rqy+d{`%suQfZ_w4#~ zKA+7k!jtfPW$)YuwmMt`k()1KRogIn zv*3kGa|OfpDgTmuP{b0oe$xc$B@0flovmx)=V3axuhD(+#v9ZX%vYBBe!J8%0^sVmjk0m=;?r0=5q?kSNVtM9%L4hGdQh;OeyZ_B51(lVR zl6Lj~&U_HBa56G3=zM6Nuy`7GM1sI$wkLc7W?vULHk7}=e{iY8Y6b^h?;0jDGbPc%PM!HuU>b}3EY{2~ zf12M5GA-4=@I>39$6+qmNb$+$C4-0 zl(yx-E(ytnKN*db*`-ZdmWH1=p|M7z<)`$a_9=!FLinNr4;(wmmG`GP&FJ9o%Z{x2 z(rcVrcL;`s{rUf2Ue)!0)c+3#jZvJ-Bo=ON{jd0YMq>Cf#q(T;Psts5VWG^t<}m+8 z?ps^gP4`JAJ{8&|<*`^&=6cVAf4qAp|Cg6KzMz3w_vb(UwObTLnU{QOC}mUl*IdCn zJO2NFci9Za>4$qZ1SSVWwqE$n|0>Ka!GvBp$*r2qXx4F*!|%30z2lJu zvKDR^=Dt-ZH+Hs;5cq%S`<}z6J=7{Blungh2&%vF@_9!IL$vCl0}U@GG#qBX(e{hk zubYQwgP%>t2PUz&4K58afi0n*5~;jU^?H%MP4VXFRLYEY&d~mtjJv#D;S^+S1m{I(>=1 zZzn!v3*yf@bC7+z#Db51=QlDglMi!J$Pahi!tC%;aF1FeytahKwR@V}Y|i|D zVAROC^&+R2c2CcRP-UJ8HSFu!B?Z$94t#08q$zCt$$??bn)Cyl4i7sl?3uR8q_<4H z-P18On1_YIhd*lS0f$p(?6-dVefSd>vn0b5um6Al9(UkWD80nDMSo7BNPrB}gI!`~ zjmJA~r7=$R?bsyv^BI4@&I3&6);yRdnQ>ZeM?m|Nc(pH{QfwZ-Ip>%=>ZP?zxwt^} z$Amu|E4%+Shi`N`6;hxsrg4TR?joDyF_x)n^$Tt{ID8dJ*{%9vLyDTmOcv{I29rRB zb>5Pak_x$O83v5o)BZBgUGsmsq{Z%klOKM*9?!GDk>P|E!-XRk>mwF7>S=O^ssH=O z9Qp14-{<)W>Hql;t0z4FfA+ULkN*9C416pN=NKAFuSh;5Z2 zzZ^a4Hy-dUS^rT!Cf@M%ix=h-q-Ra&daBP{r96`}`KI|A$F__ajc-z#^kiN0YZiUh z?99F5HJi~+==h0_+Kc=%bR7S@Y>yl>7^c1t7ysr=1V7<%t9q5EE3E$;ZSP! zl@&I5JV98mhv$WwlG{Rs-o5u9r2bfQq4}o6zxI}c^&gA^E@)m{uy@&lQ<5gX8E${} zI-%Rs(;?`SlePck;UBd($DoYPvCc2F+8h2NurUACdDLF&y0KjxySwh}vs zR*5HhrEV(r4R3yM@0EM~-`+!6=FWtF{4+&c=H_sn)9pF2_{xM+Y&Ug2a9+GHQ^RFf zQ%-B6$sGyF37_p+&N9U1GGsS2yqnK!HZ~?R0%c`$R^g$!t~}+%=~eGNuVUS@!>epM>%m z-wS-~!Y%zVW{0foHppdwC|9@Je1tZp-Utc+Z^T^2Aq7?TD7_hH3?6t_wl41cSCaUA8(= z7jT%N<{s;oK37lqo(&drqkDTDGJp2lVAYy!MVbvYWGN zk;#)DrV|GkcK9?bQ!S8WlYP=)>X(?voE_tMrgaH-!SWaP?LREg;Vw{MF0o@0&QKMx zi2TcbTwS>$mGKDg|NqL%)jf_&PGkSyyj?=^($oL{J8aHyXz!L({IuYl*@?9pn>Y4M zXx^ldKJ8C>18;|s!GdcuClpClB|ND2h~#;7qwx{jv_6RiWzGCqE$iMiO<(EpRbovt zBiCa6cst{Ua2bWI$0Z~LSBD<>$nuRt<$UA$_Y7^O!ra^yvpHAj9yr5e?a;$mctOGB zZj*ZZj01Za*gh~wTa+F?#jQ5QNPfzEyFHah5Aex6X_SfMIJtepmm>|V4pwUaCEcw5 z&uBCjm|NeX{m;0E$;+7`DBSsz`68YqmsP?Ee?=>Hev}WYQ~WA*u&-gdAP>)nlcFCU z$nUt9z%;$`MD&ycUoYBw>;`S7oR{42idCAUE3QD4JKf;G_tnm?m)9TAp0C);>*gWK zsO`R>uk9*hkH=fffLW=`*UbOyS;JFfvxeu6%$ftAI%hI&vJ$?SwJ`M-6RTpzfk);A ztcUzxWd4tDJpIp}$@>5Ldv)m*U;bzxemvb?!mj@JX$H=84{5$)pn}Ix;pNI#n95_Z-7o?imYG4J)GAnUjtxTkst$WLW)Lk&!d(d_zXFCP)YiZ#!qIA`l?WHbJ9>m8VFt|Bm1S zlSPt}fp6JnvI{bI8XxLSPf1B}SfAl=lGnLsqK)`MekO(4Oq-Z1zi|e=bP72z$)<;G zrF331!vf~b7uXpSs%JYabU3BJ@Zv}&XeNM{Me(?K%CSfG%)b;EH27vrWMiDbelX#e zBClhFj`Jn4C5L(Z8bOQMBlRTy%3Hl=$|`6MOEO^ozN$$&sb_*@Vn%RBBX7lW+Z0K` zlxh4|Ui|*fAH;CbkE@;6?!YCh9DNh!!}S$=89qr1e{ry%Fk8@^*MUnYBAGYrMMK)r z85h~?93r`u_$1db&fmtrMZ{=!i^dO$g|Z1J?t(5D-@$6i=cvt+pnT}TA%R`?a+7iu zAF^5Tus#vL&}h2hHrIvIk~69*I+$4%sxuYmiha;g(-8RYe5S?pL*mAd{frxbF}L!E+a4>>OJV$1l;liT5ZHofJXl*1*#BYt0s1k%`q zqtwMj{5lGnOM3(|AKGtOe7xhy75fWobx#y>y~=P1JFl=_A-RSBk<**@4+pDx{yRV7 zk1=DC7TK_aVdZc3*gPJt#s58+#TCpI4oP0}Y~2ck^SjeUwobd9M zeF?wn8bdzG8isaulfO>B%=u3nTJ3Y#$pwd;fepBLhRFOUh@~KVZxiJ8??u$qx3`i}&mQPx!>X*HVRicpyqGHmh&CmKAWCls;m+~Y8(gV*!-hApQV{CRr<)OM_4JZ7x@WevlLh0_;U zZ(nGfLLE&XNxBn=oe)@jcC$-Xsw_&o_huoG$y^MAbI4zSIVxBXecVH3|;yL4?-Eu(t-oO9N>+d!1;E396aOe~d z+Xe$}ZeeC|Yi?$J^8yBj9Zi#EPo$+f&RvkSfbqwF`5^J;up9r_<~cH0y?8HOaPq(S zgRGYR_&TFKwf`qS{P_7ikAM8%go>{Z%`4jE?|f@0`{XE+F-c^Llc?EDmX-1frA$?I zO+Gb$(i`R|e(q;9X<&%rWz%+doX8lxkaczrL#u?au=1%V+&UT(l7h|0CWy*T*d(dO zXXzoc$y7AtUXTp~gI-M|@4fo}0pUyrf`%Ln#U^Vev3!)gC>4C7#_N%^t#YFcf94&d zBvY|S5i^bkgXWs)3;37}j1O3SHQ0Yxh}%YI0iUE^Gs6Zpqiq5%@+=K!JQS_`ey}lK z2xkoP5F$9`IB+ zG%^~^`1oG_Q5gS*ojeotxK~&tJ8|(>xPOuVwD;SELo!nB8}=~9{W{0c9qwV}q|blw zt37khvKf*WCpJx$?pd+;(1b^#x#y*rmt0CtNJwzd+pbv1KdIT&PU7H8@tq49yO>>m zD6ejw7UA*j@EP{<0~0UlpWsP*@pqeoutKvd&xd2oIaj$VCNQkxpEfNa&FNHz+KS&2 z2YJuNKPWkTiosKTf}=^qELXWL4rbi%h?7ASdHe@~t>qRL zmXZn0UKaoy#+JGE%nSZ`#s)i2Krm zHeM;i16?{BtS6q95BSqy_3^{8d+`@cgY6G$Pj~386-#TWo$!f$;`M~d1{?T{HQpUO zox8Bz>(Hr9`!D2XE0iB(OG=zuH$hJ9hiR)oxza874J90s1#D~oFwYI*y~G{q*eY=$ z)hW*OAj9jB1LxQscrpwX7~Lw=Stf}o^hS5c1uPcdB+DwYeZn8!lav2HRO8ux&R!$- zK+%bMwoeSER{wcKnA|e%$t{(X)ZkPTodKj6^53 zFFbm#-sLZ!`2YX%Ru0_S>58jYJAB%(dG>*)A}0FIuNc^VDEwJ|US85c`{;qy4F_uN z+)hkWce|m&vBW3MWfl9s|Lr-eU8mfia4^s#UEh0 zX)ept4T5oU#sRzyP9N<}bpA1HSNy|p?pOU!u3L})bMFylH2M7h*sG2F}yyIh*E88D3t*dJKFPMUQ%w4Pq5svn`$#%XLcY5Knpx$F(8W+LAm-!|UlKkviyU$X6%7lWId z+Z3M$xuzf6m>RC|T?u2z(Pm6&HvPc7bcRB&NkLRvgQ?s9L(=^ljwz&U6AtP4mz?0> z<)ZNU0I%_aIK4bQwt&UbQwkLm+ai8(YP%fBWSL=h;PWcB!G=W z`pQox(^U$_*%uB;&e@mHYwV#cVYGlr(tyEIuxx=)#!2fn$-LPQnxy6}@M2gbJSjr) zr{qIhH@72eWHYWvY%666sW|ASDwxR_xU$jjAe-!?@A5ZhCNsTDW#hMDI4u>C&SN&4 zJG0`S`^y7$ta1vRSxcI(9FpqXP{XSEMsaSLN6p{%k|#3~exFX9`mFxPq_7V`|Lgxh zoNAde0kr7-)9dH!<0n+#TsXJR%`M_7zn=ilf{TeWq9W1-pNKslNVgua)i9;3unz1!s}Hamh)m6LDf{Vr(80f5`hdhfOeOx~X7)cw2tMoufxMWDm41 zODg!)!k^%H$~Qpb;HgNpEpJ;lY;cvk($dS)ApPyX!gXe+ZRQSaA05uIPp#(pFBxFP zub|#=+KMeg#*vB7q?jf0;?W}vvu3uNI0>d2F1nMD!oa($>0A}#cG(#UbF*$N(9+R8 z_?cO`XkHo%zfZH&whfV5YHmj!uzBcf{BumT$~i5zW-;SwbA`(Z)uD-H2OiB640Ct* zY%E+ND)i!x*bUJg6C&%`EF^s9)(6Z>J7o3osDlYZyS<6SKjR7PY|hW;CyE59vN#lS zo^pP$^yvY{gn)alPgqZU^E_cG{9mzDOu1+;Lm|_SbIA@{+#OGLOJ+I<#+5s*&f75e zKow6}t%l0^gKS$4o>gIskYc{LVAB)x4R;SS-F5mZZzahboy(vn{qQNv2_d%?(T;gd zYi}hntk+6n5g)aU=fqsAY8Xt3!$;9}r2OJlph#UPe;M2lgG8pF**-fZbct55a+ z8u(`YWxwyC~tYgder_! zfVr z0Sjg{$VwbJcJ3U*u2ozm8FEMB*tQ7&TiB|x=HM6pZ6>0ZB%I$lG#-*FQ8Ldtd7<7T zdM@ME4=o)3(i^;t{~}u==D*q8nX$oHOXkAY z`W}zP`{y^DE^t(ytMI+SU`OD&4hxnp#;8h%X@8i%zuUaA@$M;}JIlFeFKueo)sbCT zq9q}*us!>4Iz#O4W2|#NGFyro?Pl|QX<**0?dIme&K(nJsL1y$so`0vT1OI_hlPUG zz76NJk^~r%_>8$fHR}F<*gm)E4=b1Zi3S$sJqB$hUlu&%U)QT3%Dw6K1Z&3*8)i@D z4Qxz0^A3ozUXh=0xlWPQt|ov{=Hq|Ke~Y*3DV8<-VX*weJ?&irbNqu3i4IGwBYrfv z?LC;@xM9;Fc7BP4iCo{9w>a`#;ykT=;^%z9S8_)-rLnQikSMY_Y~{2dvi8E%l8&I6 zjB@4*Y)dXPyfa-`GDqQG>)f969N+9cbaP4>ZE6&j85$@|{o3>43{zMAkwotW&QBa( za*41l*u%Ar*~Fn`i-@er=QB*Q9Sx!H6r@t*Ihrr=pWxMb&}<}FD!Aw(%c<_3g8c`k zU3UJYr6HGC{YmmcAy70fok!%(Wvgf!zN$2d>taxdr@lWEwQa{ zjkmQN!h;UoVe{j^P~p6#RpF_O@|KvkrNRL>>i_?gwU9o3ltFv)f%bz&&S6GPr(M$2 zDyliBZ5PmMol<<}1DoEG5Qn_PgP#=7=qgAR#i}dsxXkEPzdg?N`z6h>j_m?XPJO%;8K%+& z-{y<%aN^uz+AxzdOy0<#;kB|*v$%}b|NqUajV}b%U+A%av8_@5!t1|w4g5cU^S${} zpZbHr=H>sl>?bb$7tgP6O#f$J`~NV5wTgJi_6D}}1YzI*joPLTg{(K_S|e&tFr2;W zb0Jj7K)v}@{f%$#AG)*>e*FEx8TpenTfN~FtJ({$xPY2Q_WLtuEZnZIcq-(?G+wnW z+iah(u}9QT=Cpdiy-v6>EufTv;fZDxACrQX#;GomC#U#Rgbu~Hi8L!tHJc?7)q0-6 zvpL0*qgH_7ra-~c?kgJ1yCq+VM6`3=+nBT%;Cr;*^m%O*V7z*6QZmno64M|}8+io`L;O5jGo(t9CiocT_^B79` z62f0NN?D(I@FO8Hl}+48;ctE7=HERRnnZ3TutsLUqFCm~xoj>{#<2@4CK@)C-0 zW&I>9yoH&kNc@jnC|k?E{q>5*9VZG|&%Ng1;n~n^NoD`+qi%Cfl5=e2y4W6b^MCU)!3zgt z=EvJ7C8RxVF~1}!p&-kcvj3oV)D%CiMZzafoaiuG%_r%Q)HIv(r27Fck&0iI6|-3{ zi53~88!t*RdcniWe8hBv$(R53%t7v)mcdGSP7QNw_+OpaWc{);6YZn)s$=hhR{rk;Cce39}Qly%OdMM?^AsGbj9KJ}mQuFTj#-|5g@> z|MmYJzv(nv|3AX<1#lh?E3?0*q9a432(k6FuPK#Ig$RlaO_>*0QFZYK- zx|?FN+JL+v; z7&OT19PPLf|6hJr6PrxlhsiG#o%JT{NO5?1rBJC^`t)FS0ZEn!p1cr4QFp0{A67bz_Q16 zGGongdmUM)7xg?F{vO$2B=L%I38Sr>$Kp@+FC4Djf1tYmM4Ezmh~&bz$}V#hbFGtG zO8FGD*C!lh{`A0Fr@oPYbrQqcv>zuKyu=qYrhMSBt|?_zxf}d=mHiCs3#X%#{C_V$ z<@tXClW3Hc(FC4<&eqk5gzU7 z|D12RF8ITkeZJw7K+XZVY5t0-mdbnn{o^lXiO?-!6|E`wYQLnGC0dnBE7{?xT*d^{svBLoskFH^PEpvU2u_D6xTK-@-;@gWIbZ9)K9fGYyWhTX^Z)vWW`_L|am?TU+SmW(wfOvh_CxK02@FB^ z98Vb)NDG@JvVRi3p#MPn&_Bm-UyPe?yYzfG$e&_vWaM;+`$_nRZ;=Ue&vE76ZaAHr zVfl-HU+5IUI~L8nvy6=n-AeD+_2U2k{}F6+B^R3aIX-cC$2xVbg7pD&k$@s@hII#) zT~%PPSQjWYl_!PS%`L*2+v&giss$S*Pj#qptbQVpHsL+rlZlcWcJgq{J}|Rff}iP+ z`})F(O%pGKF~l@89J#~AusZwVWFZw^1upd`ZhS>NhuIhpRC_EG+Q1}Mqi(i^oh9xb z_bZh@|G8%tvWR8a@2g{)ckJXjhLB2hd+^hjWOG-(w2FZ2RS0;cr674x8ybn#uYSj*%UbUb8g%s z@}w>xi1F+WCoWG9Ru;=z>22m>QffUDj%odnyZZmaZ0&~c3!0}tcjET_u;yRA%ZnjWPiB}@kwZ#~mdTe`tdtL9ig zqtR-fBHI(PCwglqNC?+#k&cQpbl4vB=YRi|gYHGbC(he29mrNxydI>a@80%PSY+A< zJ|*U?bhcRrk{7-n{KTX(MNu}bVzJCCw-1wYmn>~n*t(%l*W!F5tHQU&BZ<}15)%(G zu%39zWWjIfpcNhPm}yb}%!m4?5}gd@PT0ZzlYiQA$F#*n)mxVf8h$5HH8N{t{imq z)8;8?knmt!E`A}d{>3C`u@{bIJs!=03)-Zg=x};8Hw#{ynBw%r@`IgQ#T|!3Qf3QS zHi`+YY~)fkTWk{|@w-z7S)aA+Mm9 zkkGJH)n#Af6Um53-a`EXhPUtIe`IL~>`G>m-NdDn?bxjTAks9zc|s@W(maNCRc4b? zgF~lSBla~-W9{iN5arq6rm|>G^NXMCv5}1h*38UnWLXN$QySVCrP>yJ`2Fv#H1i87 z?+JO8*PzTpjv_PvXmj(&LdIKM6Y zfcF17rn?N8(FTp__b1+-pYYs3>6HJ4RURj{X>~XstV>U6ImYM06SltbRLF$})0_pu zF>=NRi+mm&cqJV1n{f%-wK|6F6aO9Ni*`+kj)>&j+RGUBy&HEWaOsC+msKefRV5@ZTs54)s=%u9WJ!F)lfyhr;YSXa2ryha@uT1L3`Z_2 zL#EO<8-^NoCZk1eip(m_i@B82RU#Ho>Etx3Zuhm#IU;h0hskV< zEZW#D!H|^J(A#r}%kP7R`i;g3OfnY}6I#qCJ$%Vx!*r5io^GQ^*Z;uu0*Qad3U0!R zy@3-HdpXgGvQ{<1*7V;f`|sINBNUc{cU-{!{$!xv|n7o0OpSvFO$~1S1>F%qp0fdwuFUe z)dYvdyBFkgEZFgvJ!akM6Fe_l8V|8vTge{FdAMs!iu@Bl7pe9&YEJK-9QdTUDRzS& zhljq!n})vRCNlGK!(iKYZ_Pdpa*_fW?b4@aI83#K2Pu!Z$(@_)sbQkLrk zAD%eCusXr9Iqb}Zz12KCJsOolGG!O|^p|Kg?qsfdcck7U=75(+$7@CJg%dw(3YT1X zYQJgrg4HYu|JqI{zP+C2;M=ZH`u{+))`T{e8cRiC<(g6v3tq;b4|4T*CR8LhmH8cf z#{BtZ{DYTY7xbC``IoGAVw=>7Q@m_!GbA@K`g`1Jx@*~g>tbqxLymL9%Jig`l3xdy zrF|y237z=A;3|jx{`ypgoxGc}-tsdm-|3%VyL7{cG#2wK0N8 zm$Wiy{BGQ=AbglVVIJ%CUY`lN3=dMDA9y?QM6PDR?J10A#(((lO>13ZeB*$G@+r+f zC*De2_-RHH|5neO zd|}dm{`vLBdsz9n_Wb|T{_yei{RdY6`)BayFZ;_q#)@0x6JAP*q%Bz6`JjxA`N^%U zC!b>uG|&1kxP9gUAx4wi#tnQs*>aaMykxv;v%yF-^cQw*zcUZtRQ-4?Rvt zGfD(n1+MtmcIT(l`Gy5NESe^Yb3gn)kzCcYpzp6eo5x~ajnDt(EB4zjnSAI7!|Yn- z_b-#$WSow&z)VuGH)VqY|#{beAOp6XqWo2IF_aQWbhv&mgnF%I2EA2Df{+;h%&vW2&u!I6L zqff$ShkFb&xn44Cba2mal$A>JaQ-1*^3x#aq&V}HnhC!j@+Nq^XSE4te|MwFYKD)` zhovtcMEx;aiv1yT=$gCj&|*>_Bw|Yn%N%o zovr_HD5>HWqdV`8WDcpn?MH=`nRQ|h{o%GU>6fg?P+HOBWHL$d)eTFF1mQ~_vO#Po z76>UXGVIvn%dk`NpS)Cf&xLamCbJG0&)ndq>+-jLiyMb<6uZR3e77Yg?3cJ_o^89c z?BD^0o4fg?1KCUS98L>L9*}kMaDFadA#c24GpB69uYRKsEO(WTazxhk-ucl`IxFEL z^R(oKC-O7oB^Km0Kk;XqGO@Cv$B|p4V(~o2MSZMQy|QO&p0o+B;bA(vLfNWt!j_Nn zQ5O$~&H2+V;>GiT(R9V{fB*g+X5g$ov4G)3p4y8uS~+22W-ppOPERmsH(_!pGc-_m zG_8|yTM%1_-T}6w38`!+*41BNem$Xk+WZ5dzGn^`)6m%DsIBYZ?T~m{KCzeA>_>yJ zO0Kbi!J;Sn1$saDC4V$bUAbWclj(+pSO5PuPg(EtAv$n@apZxSC1w}uLfkx_Pvo4n ze&zyZodt84PR^fTBq}Dq;6uv{*06&I8Yb~6?)%ekvVqC(LV@Xm4K7pMS7gp_WPFx3 z!$O5mfZ1n35ueclPD=?P75-N;&G~hVzl8UkVii$a;CS%=h7!h@N>-Va#wV;d9tQV( zIHph`%6Q@Y14joowiWdf2dk?U|1mssR68;E)&s`*`zL%77K^*T|9=95zA4+=m#r## zCmatSI5=(nft&RKR;_as4>V{@mQYBQIAQZ)+lK!<7pw%t*cM3c*x&J?;TPyMvC^aU z9udY);p-c=F*#r2d-Ngt!YaNe2B`@w+Yd}QC33_|hK-5gW?stDBWL~u=bp5;xbe@~ zxxX>Rq4%79mV0Ak8bi>1;~pj@XND_oDGg~n0bGnvpV!yd86KE+yIF0DLUX_d$6fY3 z6ZSA`|6kDF=`?-9;d9HHu5>S`X|hvfStG*1Y&EJy@H?Q;W+4cTz zc$@h8eMUCyrN0jTkUngz@K?y<_y3=-<=gb{|2Nw6|BGzR{{Q{)2bhEF|1r<{DZTU@ zd-%}<6)aoj52hb=kP>;I!0_{{_?DWqrfs2#r{5_Gi%sY>@`&ZV>Bem(GJA5fa9m&G z?IRbMxUPI-%Wwa|pZna%$*onvoXPPNUqp4=L_sm}1uks50SmwCq&#I~PI-Fh|Njpm zC!Ai(a7N`ZWbJ8oo0m8@CM_+eJjq!rVS;)>ul$7D0>7X9H&zf2`~OcdezEI5eTRvx zQHQvV7}NgQKdBY>khR%yTSDP&dITd+_MU(3;Ym++Jhx{)A*=BHz#*=bclB%$Z3!t3 zDGE1yn2#tLlp07~DM(0b(X)1Yw?L>wY)3^x1Fy|L_aOey))_zLU#J8Lux%9VRX!n? z5f>N7c448*f@7M-9}-sQ+wU_jU=%jDTRn5e1pfHL?>(NZHg(XlXZEjp{`AqY3rCKf zJNbdzg1PIwNx-p2Q#*-^Ri{t9^XKOa=iX==x72TOVlCIt*s#3|Y2=qmZYWvrUs2^rp6-{nvcvKfA2~ zSICS;spd4&3+E8azWLz8K3cc zv@+hD%~htn;X|{`i{nQb3ZL7vT}W(Nz^HV?vGYNn&>m-wm1i9Cnsq~4f3RPPNKgF1 z9b?2}7xLVGi6D3J=lTq`w5GB}4rPs>l$3>2KCtb){7L@W#XtNf|1Rj`*U)va%9-FO z;8EjXWi{cL9rvC74FzsXq<3f^5Vc&w$ba(rgM)4V1?(L+87uF2&UUl8ch;fARF);o zCs@`^`RCX+N$~0O`hc0A`0pjU@0iRO73FX$$wReoMr*2r#l(mDTMqLIHk}Rl=iccY zv0Q8!ZyNs^XMXMcgAe)6+w*8N3oT&eonR*>c0@;G#T=Ga`zKop6Ka^O>lb*5U2%N) z@EM!z@dFHzcmK#Qoy_TZ{erGCkHCJXPqr%k4L24PYJT97OFNOkn!>=BbZ)7Q+m??KbIzl2a-Po~|!T5t3(}jhr4m?!Z zPn$dHb43A3I6*pZ#aXg&&|mT{NOP+GB;S(=Aw?$ZNj7<@mU5H&2B%67shVo$^NAjZGETK$R3 zKQ~L?_&+ghWy7O4_v1I*{_lKRXo6iq)Ia`{+ZW`DDp=;_$+1m{|L?@k?r^R7l$6KM zGe;OSgC!qCi#ufgwEp1WR;Kshtm%P09ecir&N?ljFxgR{+QIX!{HX)Fi+Gx!$f^}c z^6HfzNZVLA| zR5+zGL3YB^#|yH9_B)4tGjOFFUl97~vv|QW`G~YX zzs?@|AX}k)rTW3iKkFM$e`c+Wl&shpDY?TkvLSu4fpG&rcS>u?rvHxN%zs$;gc{y| z`v0x{;brj)SL^mm?rXIEcHrD!{eYLJk9-im;m`Qp)Uo~gzhBHYSLG#+@fJ%kPTfkFfjCCcotrBcJpI7Kw~bd+`lEscA`0S(lx+sWzN)^r-wJ zAJ^Vw(sX<0e+A)=1F5+l%&Rs`X)F+5bEaiZ=HW93I!tCT1@X=kNoiWs)V!3@Elokb zL@dmu;!S{wimfv7!JfO)rX~n<8TK*lc|2e(ikm~Y!rJ~!Xliyi)&D_w& z_eqCw(@TwBTQ;_gX^tWPUd;8p6m#qZ!z-1>F9*JB9GdkspxH33bb;Xy`Bi*w#?Hcr z>L;-=F6d2MvG}4e`08Cl*v{wpUaa=i0^@)fX3%Pt#@L%w0a#{ z_0}xp&VKW!Sx>#aq^fcGb>`{6n%A==H^>w*ahad^z_sLIi_MJB|LqqgvUDW{{Au#r z_$=XZLW0Xp`*RIK+6xTaOYS9jUsv47Ys5aORe@DwM?-3g)60fK)21J?PFv6>y656q zhWOeK(%YVYw_n1{vVXVy33k)0#MS%}iKpK#OyqnW(_odp=0XX>zIiy4%a7eBsLVAf5({q7{eN4vIoy`hs4qgMJ(4IHk5u-cq#eJs%7R0?~DJM55JMO zn4;KQC&qTAqe1gbj%-<}L~Ent#sX)ZG84U3}UEo8uh0CI`P79J0FabD>Wo<>f)HY&PTa4mK zCOL=yKOd_zSA6AAX0AEGJk4%GW<+JDb-&YP8DZf)b6TdpJPl~m{9pZ)XryuwEI72YZigpH4i>A6aZq+b_k{Dw zjaTJ+Sft_&UjA1p`**P2XHj;Nf~>(J%Ln!+-Tt(1e|Ez51HajZ(+=qjmK9SHMG`m} zzx3IAa4KJN(aia(wx)-%RL3zZ;kthFRbxkWWrec}1>2ZgEi)#ugrzlm*+$%C*tLs4 zB>m92n+Wejm~b_KCVICMi3 ze@!faeI;8FzYl!?t=fx46>h2o%tePqpKj!F1+LO z`J;@l{xoxS+w)AA9q(|PK_Qy0?td!Fy{G?$cO*4%R;>D8eqrNLo(0}J|1n#C|Nn6E z-v0-mbN&6xJX<1>A^t5pm-dMS<5w!G8q&?HJu`l@)%2bFU;iL`o?{)uR{#C~e;i~m zk~dkvweMmpXIY%6vJGp)uc`$WO)@Nek-lu%@rt(+do-BY|NnPB+#;yNm)(AF-Tu_H zv^G8w#al}hxDVEfu$?$?us%c9|FSN_iI*})OgvURZ{_zaI&iPDorQ1Bf|jY%H*hh} zxiFEd@(Igf2gU{+!?w^m0ds{jX)cD6Pt3k_wM}fC$OzhH!Or`qj3GnDz`$TZHRCgP z5B4AC%sUd<-u_TL#9H-3s$iMuoP!N>BR+&C>a4L~ZkZ@}@qu%=ONKUshph*%PN4GZ z_B-kQ0*?0l3?VQ6GT$>iccP_khD-^k$c}*27T=6U-X@b}{}1tRVoLS6;Uzl3enw*T zwf}#c+U>*wK@G{~qYHVB(q62bWbkJ5*zMG%`iZ3>c!@SUYpR95Xl}_F-$xf5mqU@@rVVL@wBHWPfP>(rEQ_K@*?Z z28JT`6`%jJSIywjSmXGSG42z~u6g~8cm5{*=)dxi;br5RhDH+s$KQ+hF;1V?l(x-b z^P~6%W8atuZARS8XXKs~Fzyz=QQ1EC9M`Lm2J3k~E7;u{xqL5NZF?ZfyI^vuqk3NR zwp0hN@DDr^8ZQ5xxhp1kCvINugP@Jru}J;|J(FpiQ=?Z2eqOjvi|eiE|j;lKd^0~fq}ytHdo~}PLA_TTY9?x zvEe+r6DD>zZDrz9ixWCOwlS<&3fiK1>0x41yeoULG4r0_vmHx){`2SB9I&$c z|KIr#^AfQwT1-j$Po_kFsFdWHuz}g!Nn+vLTs9Yp!)z%DnKFTKj%l(Ej~?vdwVJ_O zb;{@rufqF=%ZKbemU4YIzM&If)mFwQF!y}@gX&(%2~j^beBt7&W^+;H>ok9HK;a7; zkHx-&6#EjXiExw%auO?}~1#9hlCWvxQ*u?Zm>_-EmiQ(Za-GX`l`7=*6Nx4oC6D-S z*D_m{6nh+gtH0r1BI~(DjqLFe3c36dk!)J~6-qgm7_xUIt7Xh-{>1#`Uj2y{t`2@J zb;pO?eboUD2c$bETw(KX>zOe5k0bM$1w~>Z)Bd$hJHNp8fWqGiqV5~MFnaPU)HhnO zF4%MQ+&Q*;#a#Ahr8RpGhl?6Guz4J)6pi|3WT<#ZVpA)R>Hou*EG%RljQMQ*|NZVa zdfl&~ufQC2qH-1^d&AMQ4kiB*|1ntezH0c-v!rR^?Vsrl(}Z~zGpMpW@cui|rM~Vz z)1He@#ShCr2r80DW7;-X@vDN0{GVT+W-^vM(5moeFtBYrW$7}LYbE=Ew}KC{w4Pk8 z`oCcFsRcDWw|}wRa^}}wo=~c^CYI%NdXI-K;{=Hx7m@=c53}r&n#H@xw}UaLz446G zljsu*=Wp=STJol4iYJc&S6G;%s$wo%f$LF*lbd@!TwuJe>tO%qH+z&F|ICB`e>~+c z==?9wcA>F${rx)DcenrZ+wJ_%S`hia+x$T4|M!jTKWl&R#@ynUVPUv;pZ}H@gAx0l zBCd$-4d)~nOdTDY5C4~xSaAC9%mdqF8gF%UyxyT$%25>0Z?=P1>#*b7kbs@14xi;- zXYL@Jy5R8Nh{m^GH)e94NEJ9Se}R$cm3?fy3--N77w#6W}o>y+XZ$DrWq%h%BlU5&wR$W^`L*>YK7a36Ap7t zV@#abzQ=_VzRRyY`0x35 zdA5khOqV#4lN#pg@y@DbO0^1LV_hm7;4b?_@5Ve?F|iY#Z+I^7*{vyH?Qi(kUZQaD zCHFOjhGU{jCZwe`l%7#YcWwxhNRbrLd2H<99(0h`+0BK0`b5E79qr3JZ{!$w+_x`y z_>+HW;&1tD5os;FVhheaGca@v6L+xU^m*XNapL`hk^>y8+GiYGZq_`#r%8I{gmdC6 zKJr`3o#E?ptLT zbasR81r%$apldwg@6rW7n171K2s8=lZu!G7)qH_qNyIMJo9wSV8t$;kef`J2uJM3z zBIx=KuEswcM#593JDjdne8?3k$=GL9Amb#&vqLAjeWojwt)V@4J42$rtgMhs|tX6Eb@RUvW$joRIxtg0{39 z+YO_F8azA2=Xy-B9z)-|uv1j2+$xZyy zhPU`HbALWv?{O?GA;DqFh7%vzvTY7tab~k#@RHF^fwS;_{Sra88xOcGYMT#tG%~8L zlXOsI%sgV?aF`>J{n8sPC`~!b@^DG*z+ITvg*&UxgvwzXRcq7_j@0ts3`YC11R?SCR?!9D_6FJFo za~ZRC_rvCc3$`3Qz#wbU-1e~Eqpn%T=sW+OMJ$_Ygp%|ubem4usENJs;`NYXocZ&; zd`=i^P+G$ysVVmrdvjhm7@oL)frGW3-(>H>&s;msusq{ja9?5bqMip$Of?1a!Yk?; z@62Gj_x<;K`BM(+C+Zix4d}VhX09Tq$X@Ko#tJ&d^MuZX=tS=pM`nZjjo~~^Qd`#O zOqj~NV5-0dKZZBAf+ozHzu>ma0#4?zbcas@CNlq=C+Vf|zo{>fXq?jgn9pJbqhIQU zt8x=|u}?bZn8Qy<`}D9u;SY;`v;9) zWpZ|G0m}s^eN+5uv%{Bl-D`p7)CXlJ>rW^aekke{+_v|vK6A8h<_T?0$dzg1x`~OYHlTkW%rT zvtpC|2L<~JjCJy$sB)@|1s1*c8bcHGYdL5(&4%9GUkna102LJ;oSg$i>C} z;Z^VjF%7YRT7J#X{~g17oL*i3|6l_%@1Ca9CK?iS9*hWLnA}vN7l^hh7hM$iXPDdn}WW{?~!4f z&Auw=-{0nTb(J#*RrS9lxO&7lb>90~WWmdHKub14sVy}8!wc4QsUqi!5&;IwCoL?k z9Be8Zn;GmEs;@f4lhU@%r-7HrflJwgng8pS5)Yr|w8f5+vNjJ6a7Y@mn661Ut>HK~ zJYxCd`}HRjQ#TaxxHPk+CTw2*e_;l9M)Qc{t~ z+&SSjw_>y0hTx-$bG=Wz5nVHZbtbQou+eT-Ng2j)#RYvF$|^jG#_0<-Fo!SkNaT^c z(X_50(Ixg4&qwwfCTu6nG+oqX;`SLRg%uw7_U&_rm(c;MDuKH^63#Ufp4Ki1HSh6g zj^N?x*upFsn$|LlzmGY?`zQN{KRgqv9n1|6q$wwga%;?OC_A@NK{v2v`FqfAXUT9j zwlisZ7275=UQ=wyNo3e5Z)45jdwGFic|f{YiIJW~uCWu}X~vbzp*!OD*CjLPHnPlQ zy%&Ct;hlYB5dW4#%};Y)Y+zAVX?d_(Z9%ia0s-dt>3`TI9h#1^YRF8OZhrWZl#ZPP zBd^%+^9K&Jh|CYT{eZc=qlABTn&L+WuiqN086_kiu6~qI$h>&s+qNfyH}>wk@U;Ga z;>Pm~zWfs`Sh@eFH?*^_X=F8Keo`K?TY+7->9U1E-M-p?9D4o-n9p9wXyM5@@Q3N8 z%i%|SQb%|mynfwqyLLyTx6{mp#sV7}W8E@#G_x@)Z2miek#mB)<6EY*7e1UTYM7pz zC%B8)1fOAu?BnE7^*G|RnPZ6~TVGj07t_!7PEIocuGee+rT_T!QTK+v!v4R_dDaZ` zAAjQC;v!PS#`wmE>B$u4^Wy&%6M0W3o=DZV*v~9oIbm~xLaKp9uk+`N_Aef2omd-x zZ*N)y@1=%}fLn=ea$Q`z{e*(p{-iUU|L~`|WLM%V7Q}xZ+`Vgd&4g$ZLM)9Dgm1a}Kw!N-StLT(C(zWZ9upP60Cxox7LV zv`gHim~|8T(l-p#Dsv8q@^1Kh>_N2Sfsc(V(jAiDFUaAGzRI?Ho#+#<2^KnQ4@_Ut z#5U!>^Y$Lc&r%w{6c2LC*8J$V;yBpAwjl7}2l=%Yhpzu*Fa6W*{ailA+|cmgZFU}J zmW0A{22G4b$K~Uf%Zs_l*!d@a?{@#6B$GF8n&w{mj7#f zdgS=`{DbKY4Y&4gC=xdcWQ}6`FKuJR_wLUjtAz`;y|KUHV7rAcvBhthgVZV>fno*O zc(o;FoJ(?kuxH*kbO;k}`ealQAn@Xz{RKwv38xiTFL8LreA)WNf(Qk+tEv-nlNK<> zo=`B#5D-n#U17%{JB>$5A+_z@Hp2{G`pli+NHZrwaUvOOD z$nxP~je~jP5y!U$5kJo{l$xK=?XcpyRNmm*_qTOj4C~6)Ev5;prDq;sk8;lINla^4 zEAWq9R))=g&fnIpizN@djjj02qIuuBO(2llaaS&*!@1ARmDUVJEs9D_j4K(>b_CTN zlzz$6!Dg{$VROa-;|ZJ!vN93Jn96k~%=$UOP4?9#iy0<4eC%$`O7a_hrina1Fl*}! zS)LjHSL~I2U|;3STdHRm&3K^wouQ%Of_(M_)_DSd*)!9ax0Q=t^Gsx$$IOtmq>+tT zKvvOhN$SEC-*cL#|7zm9n9z`N=|9hg+Mxdnls9L5JjCFs@Zd*-*)7S3t)?o$O_$_W zZ2Zn%QY*dVgHws#L}~X2ZTcnOc#IBl%sk3;)YjsyqcG!+VAj|m9_@w$#``YxF)D9q z{KvlINe|~16R}&_3_p2I4)I)K{v>X}`lr1o%*jucl{d(NZwk}dx+bo5`|s~JZs5Dk zWPU?Z@$~WthgSU!6PPU7f4(d5P=0U!o@g$4#PrUb zEkj*Ki~Y1a56^~E(nd{u(khKliwlk(Wat#V!8n0q?*t#F)q57$7_@4%O9ViKpcw9?xXtR5-;Rv6tbSDznNw1@Hffz4A|fI6f)&_|b4k$fo%Zf8j4% zv&{#e{Y!5+CabX~p_8jn$@s^Sx{RHi8-+J+Vm!ibUJ$WBT|jv%|AGQWUG-G9W!WEc zOq90-9%8e6(8*~P&654(;AIZwOQpdNZ1@U=Ro*mw;a(}6B%o>8BeT!aClY2yT8Bw@iI$) zaESWg!1gAkR_(+qk%)bbIf+eESpP5R4QG3ytGPh+x6XyowEq{jWjS0q#K*#NOh4lq z&%UU~_B$S*=drYD94clmq0Z>-YHdtj+GVF|;U z=M7IKq`&MD36N+w#rA<$f4}4HKXrx;R(}>mYJAwqe_%)B+E0yFy%#ic2N*F-kNmF? zthiyV@`Iu#!AW(F?^t$D6pRpW_G3$A$qi=u#dyuL{Yqqqbg08i-g)eeT@H0^clwwN z`D2b4DXqPe;3E5`Wu|x5bNLkgb!8mP6B$&`JIH>R-x%^i-mb^%+`Rf54O~V4k|Z1$ zBrl{$6f$hPBEN0VfBg-*jrsx(vh`wSd@YmyZwQ@v;M2@T!75|+C3l&-l0U2psrY%G z<^DXb)&BnuS$9m>!}M;&Kla?tq|}DF4_PkpI8=ZaB#pv6Dl)Uf`(;^Om0swh`hd{&L$y2w3Jff8t*g!^S_O zIqmZQe~Arilv?I!v+RtM-t}BIW|`Bv6U_d6fBtgcTg4I`%5rNFm)3EI_SH>?m^UST z=eOzk?{vC)LiEA*mrbX<6Kol?nh&XMcX(>J#xJRS-e&(f)N)Q!ma-_uZ?KtdDjqLYH;wJ6vH<8l9DgdY)a;Q&m0*7 zDgvt17*6oGv0d?Tj?2xBp>`=9k=Rrks%NeUfX>Ezd<{QpwThvJ^D$iKp!)5)1@0m%2Tf69i6DEs- z+}`YO*S(zn<9~aj=#CPOE!$t)=Xf(@ENGm_SXUsogPCh9$CU*P`q!E6-aXZ!vBvS+ zK`xDm$Lve^f+jF_mlY&WX1pWMd^hIkc>F`OPc0^6&qC z#=r@dC6&`42!0&CP=QqDm5`UgWla!8( z%!6b6850r(J@R#v^(ns!^3egp3SWKTe_Bvl+jNkBy-$aAW>+^z}^#L=vtXTv@#G2TSB(SSA z9s2rtx<1eT2KH}-O>8m}0@|(#-N$R-5Zim%( z9Igsz#3`2EsxP?76(xD(QCKmD^{RM}$5%m}|Ba{0C+yXEGv|RH z*P3}L4C)X6KVTAC!awo8LaK_&-9v0YB^LfJQ7q&?$$z4mp`(UXw@q>aGS7ziRQ4cs7^2e9=`7vpNN?8rU*l{MpV^6j(mdz-GN+4-dnuAOHV+liag>e!y~h z5hV%PdbS%5;#*=r%17;Q47-2ubn=Ovatl7O+!14#>Ux3Ceuprx?rq1M3z^>+=+1m_ zb>4r4w@f!26q%VnRR;1r_$DD-;wt)SmFbN#_kf+p&Ye8maAQ`lL`r(gRac$~j5;R{ z=$x?gn0bOJhxy-sc4>oFpGA%59yVR^oe){~BSEu7RCI*_tNv~F(n*qv(fbshif_1+ z-m*?DrKN>GBb8~zTK1VbNofr^SO2m{eq}i~yXQe8|AhYzZ*3;XCur9>q>B8o3SJPo zz=$#AS{>uGl?x8K2Skg+*g3vVzOl+TU?$fkW-VdGMAlg>znSy+8&4@j$TRLaJ4aAx z+k@9zB^N$rS+Sq-&4=bkY){lKRI)r^t&VaJI0YQt0Ujvk7XRcjZw20(M3T z$qhgG_1L~Dn}#zfnD3bA%v~$Wz|5R-Of-^rog+iQL&jM@+t;!ru-*0LJ$u5(r{iLX z$Kh}C%rBx;PF(Uiardjj(vD+nYl@q#K66MeY&LOGlYq-6VeHWJ1%q zfJXnU)W(?LZ`?OH8Cq?Ba5+2(G7Yd|+$s1(T<^ivzzH*x1DwC=GiQ`>T=|j0c%I8~ znr_pyv_`Ii0A|rE6WB~G9C=eb)CDiyXnQN)R^l<^;OPYiL}gb@N^U5LQ|v8$@PH|U zp^0%zIgg1o=T0+LF}DpTm`v*q7*D(qX*j`Rg+QC>i5Ul(rF$N{;+47Qz&c@KqQ{+P z_o#)ZQx6&*`_dQZS*uUVgPCCFMp})ZS!VH1iDGo&o_{1x!xs{hZWSzZ} z>A3tBN2br(7RUZOrr86h%{r;ef9>%3-$jG@Sd{|kWyja#9y*NZiN8bPN||ijt>m69~@hIcnrQbvQM9Q$zX*b zSJsKXC!;Tp{hCgh0 zBo-3a{3b0iweg&U6Wh&$nj9HsCt@NZKl57!w8Shka@-!(aHeVL%=-Tm&aZAv5pi>S zQY2z&Yhdu;^`FJlR`R4Y{=d-F${96}=jl0nVPRutU4}I}sS?K?9KYVrQ{P~G>qyBj z$Ab-PAM@*VOGrK})mqcntYew(@T%fJd;DJB$aUv9WO>qB${sk@9C={OExp2~`AM$Z ziv@Zq*JKSZ@T_ikyvZ@?x&r&pgQwC9B6)P>XDoQCo*^K7C6diwtnpT@!)?d(W=FmW z|M>Ni4;X*v;hC`3>p*Vk1T_Yg^M_7_+=z7izwoJm#`)$ijp1Jmo7%M`5^gVbc*wS@ z{NLZ^9kO@iSf;Vd%#q>w|M2Pw`;6P|oK3>jQs8}r|yu$aJxXiu<+mu%De)%r{ zZwl8+NRrcVZ!~(ewH<|wb zGyK!KZENI$=ldE?DF$e=8u5pmYd$B((5mPmzeF#!X^Xr=u1A7HHt7qD3~X#{Z3k^QK1lCk7pycBf0E|n zEGp9KF*i9Q&6O|Viz9=_k%_^d9F@e9>{HU(CNf@q_n&9Q+`t(o%6p_40{!omF{td8 zkdTnLxaR;z{)df52lx&pFa1!)5aHS{7j-0um0@lkPoKKlkunAec{2`%s7-w5S}s`c zcl5SR{KsIL@NjYMf|))Ui^aE{kq)}}pZ)s#4a}U5tXfMJp5oZ2EVc2v+@;80{Z|55 zP306%KUMsF_F!FVgUK4lq6JUqE9_1<-F$$zenGOMY<55*N7N(EBI^`+3FRfuCpmQg zNG{yGm8atv|Bl5hdKV=hoK87d?I0;}KzoJcL@wcgistDJ%+d@wGC2>Lgo_?1E-7Z# ziaoe^?g2NI6&KQ5<5<~@n5SHG$Z}L))Z|v-$STWSP|bQ`y~5T7&Djdx?`IwePi%D4 zO`MzbVXNkXCb1np-(Rt`=CwHKrV8@cI`hbd-; zd|;o+&!v2!v2lWP=)b1)>j!x2m)LGsuy>N0(DR{B@Py5Y#Fz<7-`6i>-+zEBX2Smi zr=R~j_-%<}G1H1;jJdZNp7OdKS;J}JBO&>qeAVHzjM>R9uMC`vG zHkTNOLtUJ9Hx6*jb^Lpf;nrc!*ER-DvV5yIB=Q%aimM1|rPN%q0rljGAu}(qkRi%?^0qTllhx@lpfJ>b7IXKXh0x zCoy;I7ddAJ4~hwj!%VF z1fJxQU69st&3-}Z;stI>KXQcK*j_Z~DF67E7a_$kb$gCSxN+0;cg*S2DjJxX{x>kk z&Tk0+-}svU0WaT#T)Q(LjDrsJ`aEFJt+>!HxoOQe`7hVlZt$4o1n`9DH-MOzIsX3JKD9*y_7$-ospp;F;@#DeD^8n#6`oZ9sNK^51L zxh4o{g+_`bPd#CxTT z?W+5O=#>qravEzKn3pWr!x#ORf!qCp*?n zL#10a3YGzq|K>BAS#WtuZwN7cz|5e~&U4L?VaDzW(^o2ni)i$gZjm|PaipD>>45a} zo+qNUXC63Diddj*qns?jaP6c6zoAn!qr*(8+X@UX)R;avhF*wFNQjoRQQ~}?XK)}b zO+q2phOOYR=&eF_^Q?c)MnazwxK|h?HuhCDo!;@k<7xc_K82jE3`Ix&vzzZy{N|w3 ze7=r>+xLPPgTQ>&Ofku8^V#)7oBFB_-8sz@E5v5@)m~@wVZMKjJq*n)iN=dg%w@l^ zMma>9c})Y`Pu7wS`HV7-C;TT?s2{Jx$hZs=^RK{JWHYc;Is{mfBt>ue`4SgCl^;Rr{T)M?N9%-hxjPOAClUg zb3v5(L2YP#T{Cym1s{nN?*sL0X)k=P{QoatcA`IFyVG6XB72Rs2dD4*|DS*E$rPsJ z!otE!7IU3EyxgRv{N(F|n3CgBb3m0Ebu%0nt`Vprq8yu`fHfU!ih;qI$FfG{A zEd6J})5jMQofrIFaPG1FiwVEd6OQxj`O73>zu>CWgzA!+k_y%L1>UtURdw5NRiMx# z&SB10hMA>pb3Oj>*PZ3nIDc^4kpphm9W&cFS3c%361#K0DdGUbYmR^a&okUt=E&}7 z2={ehl8)(7IQ8~_ft}9$rYVhQ8hDKwjvkyTV&=iJQSw>^BY%PeyTE~F&HsYiEgc?B zZe%n&(2%FUB$3Uh|3dIh$4?Ku<_adUCw1DZ{7I;D;nDivF87CBTUK(R@#+P~gqCb% zFygAwX0vdTIGD&&#J}TC0)uIY!n@Y9QO#%CmT(6gYUU9;bV*j}kEFs=CFLW0C$t3J zHrOXtGVHTz5!~g(IIB#tE}`W)quP=h&eQA)mm?S6&YO{tIg8P7N3Q_$^m7+1QW6|^ zt{r64P+(p^;S*1hhfof`y7Hw3KmPy!FDbCvR-rfW$rqL&uGb8Q+4>Y@Z~sqtrT@i- zAtG7kiE6-|#zU-0{9E=k@lN~GdWNIXr1`bEn%WN?(Gzkva-^7*7s)l2+_IEB@KQM9 zTXUFSV_UZ)bNK=zKBFH;&M-(-JY|_*%-|(G;YTyCPxF=Lbt{D)h&P;H)Of1AK#sXx zX~{eWeP>p_4F_J&`@f($q`ry0$?>U%@s|YM6Ahdm{7cp}E#(hbW8i!~f{8tS=+?> zz^M?ApM5V%4q5$sFr_D?&0qp&LaL?>&%eXBIG0FttZKiK`v1&_ZA{FU6jU=MI7_8}IT!nB7vFPff}qJAzP#TKukugyvQFTf{GVq-75^ruxArxc zn1$|5_@*p;Sb?$mYZ=3Y-43#{AMWuk;c1RqXmChasVJ%KIV)R6I{zwp-TRXSm?yX# zWV<_=!|OxB?+HeX789MMUvKc@yza$tX+6gu{&MY}qaDwxB9x~`g|i&8(tgp{@-~dY z&F##B7E!Yk;Ve#8CwUf3v)sY@TRtk{pw!WX-~&&&R|KBs=(GJG^!fja%^3!_6TTgi z`lC=7aYOkIOQDSNo{fx|dz{uSYAU^;$m@E;NMl0KiIt~)9{BO*)a#x2t59#~Y`t`Y zn`Vxu_=WsV4nN)H-DjU#!j^*pAu3U-hO1)cVw;- zDq|3>$UbO)Vqt@Q{l6pzUWtZNg>rd$1;;pP=dEy>w&KvV%D?R5Zzfy}nP9DOdO>1rUO;-6q)gZX1BUp*n!YS}t&c1$(P?MF9I8GXYNSvbAC>4A}Wq8oA5TDxS;B?Efzr zkaj;&RAI;B#*m**ZjTi$B`!%i%oAla?MvMJ_`hVrTmv??BMJ=4C1O(;XVodnYP^^f z!4~mcY>t#<}hmK+;v}S60cyju;S*U0`m`jGCL9% z@qD^qRe^faOSznvip)XkLPB?6u(GXreDDB6q5PK12N@na|2@RwnY=)T$8Y+DJxpch z%F35?Opnw=B!Aa8>HqVe|K#rnjA_pE-*&|s2Ga)(r(Y_vFZstlz4im2&;`Q{(Z&wZOC0{O&t!~T z%JTMz^J~M1zpRT7YUeG8)=sEnGQFbk@Zb>!-!7g9w(}LtjhsHoq}=9vvP(Te>+ksn zs}ro>j91)g4WBikh*ONM;|bfTj}tbq-{g&U;^U0-aOQm$u9gwe_`}De+3Ue4(K`yw z=iV4QSwHxn_*5lDnqOtFv7y5Bm1jIoFa7^Nou&LrV&Q>?kZld8oC+5A2^uAENJcm1 zd}RK~u;*(hW6=cBipV$hCmya|FjM2f347*@fZ6ON74pm(*XByryk`1wr0T%~xfKi9 zXH9ilS3M(QhJ-_^mWGVO>TMMb%&RsO2|ud$sA4pa`tO)_Bcb_}g6;nU-k&2Cjer0D z@628)aqzj4(y79Ptl1tPwR0Zy2BQ22}Fc z$umT-89JxmP6$src-x?-hi8Kg`(=LXdiG=K4yP3UFR0|3!r}O>>6C;(+j9Ae+MXCS zqX{et4|(srs0&A!oS~-wIj~kzsO>~k;0T?Dk;3@Zj(o5a}q1V8B6C( zRfaQXH}tV8D`zd_eyq&TYhYxssOOB4(WK~Ky=#ma9a`D9O=Y;TjY(k|yRkt-7-Pe9 zH$x{b%K-POvKH1%yBxkee?R|0WK!CTGnP901U_Tyx7ySM4=7RIz1E>8PtIs4bhbWjEIJ);H%1Q=QG^DpnD9%;zSjr|jfng^ICEEeF!JyDFBYNkuleqEuDjW+?_M;1mRfR4_f4w)Sj8yPFxf!$BEthwlYk-H{r3Qox>51K>jZCfEYtV zqlG*%4PX8=pHFb+QZM-3G*R&0O~%&$@gG8`{y!Kl-1vtvZdFg%jK;9+2Cbw5<~f3u zUyszYnJv*(Uht$%M(so)<7Z}*84opuZ)#15o6^V-u*W&wNntaG&jSyq`I;>^xjCyn zj>}uhCH!O#dw1Z=;UkG3k8|ioJ46aR)H{;Hdgh|R{)Qh9HZ?QODqA4Cy#9iy?S?-b z=U4MgsA${4Tja-<^5BL1l1=SqTn?Y?9akG$+)$KS@GC(!BSMn#*1s?E_ZFt6G?e=} zdM}jt=X}{lI7xu{h24cpd7cY$5@%$dY+!0NUU7#}cW=v5_JWf~I6kV_)GZX`oT=D2 zMSsK0gn}IohlO(3L-dbGPlyuPrXwaJ?!l_PW-@y>cfn$jlxy}U9A^ZC8~kCD)8m@0 z>T1`_q{1J4l%Zcb<4EI|1E&l=d}GO|Dx2_=4;mAGo_P?O%JX28*p<%q9OIwN`t36pp8lfv^P9cJiO31t792?H za!56KGeIlh<{6&32icEmo{&4yz##lXhF?H>(@_?YvIz&5+V4+HKj$!QNzR%in$jp3 zcirjJ@A?V}DckRKhD!wfIp$?VXDBDHUC|t7>nN5o7f)S z`Oe#__V6YnWD zPwSa*h;5N*Sfi1Vfr6o;tBJCUfZ2=o9Pym1@;m+>KG1O~tRXg?edphH(KWnxjx}FX zRIr`E>E$8GG_t{mz&nQPsR`_i=k*!4A6CpwoFI4N+u8jOP8xl9Wt`^m zlc)H<`~}8s4?d?TUHARM|R;^_L87sRFeaTTBF#R4{3S2nRGkwDhIf=M4s>2wuke| zjYg9x5(hfvY_j=Yix?}W9eSv$%)BJ{JddtLLU{8ZrhDCIxoliGr(8VXEqd@R|BW*$ zNo_*+EZW;R_B1xcBsfl&Y}~`-sXReaKB6kIrCR9PiAJ+Cj`RNX&*)8N*)3``n|C97 z(TYp;FAjS21Xw5Dl)n?uq8ILZR(r#V$p z+Q;;hcar~t=&cK8{Zr&MXguTYseNHnZ)Ydxz8d~1E(w*=KF-!I57dM;^o#-m*8{2kJqvoj*LIKSKWpZ}&X|0eMoVQy*ZA3Q=Q*4QR} zlaG-%bmXgLIxf3IubHQyar;XHr#~F0g%zakaV9rB^IovO-g!Io!L-MU&50BKPBJj` zsAGB8`u}4uW63^F;}UDZ6Z{H)A8htt^fBwx#3Ex&V%23BqvV$?Q|+ltWE#G-@gkS zFYov8_Eco9?YZEb9C_e$(#7+R3_E%6Xt1}5pNPA`py|P5lg%Qtg+aE9^JMx2D`A`F zlRTP_9XCgBh;*DFCD6vJ*K|6{?Zl?=8(d~=5xZHUrXQ5r`QXRz^9<+vC%kp-dGLh& z^_Rm^>;6x?(im;4k0oC4%$RUH zo~K!S!shMr&!qG09NEks^oma@`IVSS%@MeQDihd;l+kN@E!Rq;S{N9iO%s~7xM1p-gZPvnNJ z;n8`p`ow?34Ncpsn%Ni~zM8H0@tfWH!~{v3OwM^a4ck&DsM}0D-^#E(cfo26$$!e9 z#FUj61u;!s+MLD8aAsz6r2vE2&lg8Um6Q#WbWcuj)s$svFs*Xvl)UngNp;ghI}V0S z4d)=EASpI;u?g&q4l|i61sZs(78z;$IcR*IXTj1p2UdS;=(V|E$)xbp{z2--{|kOA zIrgf0IP;458`z#X(Do|+1<&XB7e(O#Y)s}aBqb-Xtx}kq!REoudTB;ti>UtuK2_yg z4;VajPw;Ly{N=zZ$9XL?Pj^JHGMxM{A=Q3DAE#1z^C6CqAAj0S+awZxFF3F^jICqm zgq`{y4hBuIYGJ%4$?}_h*B!ALS$rk{!8v-N}oMrp{&LSA#Jx4UIG`cPEc?^z~$hP-pXp2eV#?~ zN26|JvdhW|0&`t%WEkm8ZvN@8+n(wD^7fq*CklR*i;J)^Jg6;s!bsm^CgaKi#b=6I zi4{@_2@Wr}9I{%t;Y+KH5?^;Y8{3mUy(1}ZY#uTPDkc;(s4xW79GI?Vd~n(YXYBwr zw+*2Sb{9BS9b~pS(8V9Jas$))c`dRtI$kh1T4nNFU}MnXRS@qg*vfMuuq^FF=H&^; z7#2Bm-+zDnz<~xE3(o9{=FJ?+IoqT}$|kH;++g8oqNK3&ef@^n5)uiC9IvM|x+FaP zZa+m-p(9B8iJ6P!`3938ANU`cxh>(7weWRL{$kI}yz7488K%;d19AV(GprOBSe01$ z%-$=VU8=ul!ZC>xt^XJNex3MI?vcJnB=fZ7q$a(!Ei&_1{ER(h)jT3U$m{TUi?3Pp z<^iMG1)k&A^WzU}KD^-1=clLBKZwbD%wunt+0po!f7cs<8dW)qxyo$5312Ob=ys&e zTaZ0Jp}pHFt!H8L?Ei|!-#c>kC)hMdY++iSmf`T%eM&sfhKfdy#%)FpX)7m&H#$7( zl(d?_`2GpgU7mgKCQBA+Gnjlk&@A@g>5BzVS1f3Zo?urX)%ZkqMqS7M#7u54=U`o( zy-k;7mk9IZurNzEO*qWEaP$v$Xw7exUeZ= zLga!UEa(3;S~2=e`0RAxtMTFb6Pw}_Zn4A$b4g3E%C2cW(f!~EkK~i)H2o6|d^^$- z7+M9Hr~G{RS)J_%V^~i|w3xz5zMx|VKdG$w$o)w9d2qx}4sBtD+fM|lBu}vXZ})sI z|D;w;?be)c{yrBDor-RAz?2!^cuU}a0NZ)V zhd()s>I8Sh{+2I#CTOzL=)fmN<|Q3T4(pUBTDSXLFcXQ84KZGFuW8M#hONdE-?m&` zJ;6w@aJATpHUIw$uC|?VFxTvaR+`7JQ)sZ~?E#ML$&GB@ zHzgI`HRJ@dE>B;=rhel5h9brgyF+XViOoVA%2?K{VYq#SL-GQ{)W!#E=PjsXDN$mu z+0CCN{+Idev&}{ge*f8Ta^BP9UZXD1toQ%m$HQE*Gum62m&h>7p5xl3%D9D#@rl_D z7tIxWn!hq1`2M5$mJW}A?Smx2sQkn0uD31a^0?h8xN<8|MKj=MBd!Q&!rl z^f?&+d$6N*3J=c%$^QQn_RieEXSt@3OD{uVshUNdqT&$_QO7fRhc0oaEaR4F*I97W zx?|>si+*3eG-~81CUU=%IFQ~Xu(^MOWA}fa4Q|3q#F?}YB(^s-oME18!}a>lK`zgT zr3}^`yfv{(I}WtYxx=3~jFC|qEGA~`27p_!zu@LM9UFe0XYf{^a7uRCUBy-lCD{XMdnFg_ zb?~^!>`g0I(Tv7R3@audXNkSbxH3iJKp@AffJ5It9AcApi3V6bdvvQjv~AbBUTVVP`%%z-=Xy_p4jn%M0QoZhX-W^811XnhUSPT@Nl|M;a1 z7^FM4WHD_Ek*Yc>b>+T~&xA(b4(b1g*>z?v;FXN9`pci2(7+zl`0>}*-{v1Sc?!rE zeU;{B&iHArk>3=?-tgzgyT8$F7ZP5@zfjCq*zAzXQcw6ySqqW6Y_+9w(q*X(1cWD}`ha8oxxU3!W5PDdU)dDba=9hkX3 zxEU&2=p^vE2h3x-9({q)|Hdozj@t{LYF$y@P{P6$9T3OLYv8cSeu*((k@$|h|=ntY6pv|I0qTSiy7wWAu$rAs4nWeJEo}i+C=0;|JTi z1qo@5GC#Ox_5S(yk(XJyK!G#t-J#1CCVYw7mJ_z~HH7OM7&h};J!6S`&bp74?N;KC z_C1^4+GqVyROb$u`%7MrUpq1}RZ*Fld5cei0;7SE(y5?`zYQ_VntOivw^a7@Y_Q^A zB(GgPz*=*M= z)19;)D|r7AT>)21PSIGg_(_vMd!}ge|Te+p{j90 zCgA2Nu6Y-dTKHuQ9GJx|=Ql_3*e{HpE08PD;T18T;m)y?AN;m!1cJnz?wsYYZJ98U zaoctIG_xFrN5}autYR`_yTHJx;s2i{FOYev(E>C5lnY`KTnpZE_DoRytuVX3rtb8I z=km(TZ+b+YIC6VbHEx-&kSct_K_B4{60`%w#^ft!F}{*9`@R6FxV5I94b$ z%a|Q!usg!Cq^*6n_!|B#`Z8BKetvq&&8%~|iQAFQqn$q}LkZMcs;ZS*vVm29f11mi zwDi9-a^kMa$UJ(0<*WV~y9v4* zmhKgpEwDK$L7ahmLj42PH45d*K?*B2vS)ocI8C$h>mi%72N<@?n+daS;$QMjzGN!H zn<=3M{d_OtZiogvm>I_Q#f$IS%H|k%X0GxH>;F4*`%kEMWVTq)B)Vl0bBg#1J2TpX%Ntbx=az10+IcF`WCw>+ha|9AuFEZOn z&J(oiKEpDTwPnq_1h!MrDJDFz5NX}TWTFoJAMnd8l4#WP5jL+CS+C`?7 z&sgwNcG5NhW`z^IMgr1TJ}~j`_}d)o%5n1i1~&N6&nQiocZ%U|ALpM7~73g>OX8R^GvX4*DYl^%55+IB&9NdnRlBO zuSo#Is}G01cO5=2nb5KbjjXbkz)7`YZB^G?-)_lKUb=be=zVcuEW!f6r2lE0LS2mV*Ih2a*;Yo1N+bx(W z`($7KfypawE-+U=z#rYh!pxj;mF>j@?FrQm%=Z^ujb2c~QKY=1kvo^C`Lv(djVzgr zpZro5P3tO{cXAp%VBdL-f67aTv_`fjhkxmfH~;^)x8OHuo^I!y#w6(dT``=&NXbZ1 za|uS?0#y`HVZ~v|NpU@P_ZqY5T_Otj+5@TkaOIUg8MjpLK#M zJmx@S;*v7iMY4xE^wbYlPGr2q*R-8?Atz^=e#KKk;gr>va#nM<)FrPLqR& zcsg~4jq)S~WjFUu#%t%371$2E3Y>7W{=d^VZ~o_R873Sv-LsvUUps=Cd5Wf^x2U76 zOF%N~l?RE;aluSn#UD<{7fci1@?YlK4Axe8_Aj?oF6=8l5gIq)7=I3%OwP%AHntNv zwi<_-+(jHuSN%(rvtsG`ZNI;c!Fomx&k0#3wu;BR7N_~6oOq|S#5%KE$I4G@`*-+P z)PKcRU1pai#%m86r+wF$>*(Rg9d_ct0fyIm9HgQbIEh`VY*?b9_F@&|gvkys`&sLp zUe=$ud#Pu_v8VPAu5nDTDPR|3PTKa>zGkPG@{Wl-d*-!tvhLyGTEb=%%wEi9GD|`- zv02jRfna1nBHJsC26npzbu34DR|NBQaYy`PcyG#XCA4k5sM!i;>z7hb)Iacu7la;| z?mxew`t1!#2j0XJ3{1>FHcUM~|DLhKw6*^eA27^&$dHxO@P1ob(xEeP{}q34Rb1ap<%WvXmNxAoR!&dx38DM~^~!v^osK-N zUouN#lG?xj?qzmsikjGLl$E{Q`L{N*ddB!%;1Uu#-tn}`AlNZeNMyc!!{&+wZ8nGA zPGJ74Aj+F1a7ZhlAS&6xMC8EBX^cTPH*MHtd_am<;n)56Bd54FSgE-jXA{et;KsM; zF$15QM>WG62DOaid_wDdG)^le>ZP=V@0#Go;3Ff_x521&qM%s4fRtG=cXzSck1T06 z83rN#34Mww`Zi~L3T__cnAzJFe(6I->sdeNV1^UTJv|%YAej+Z{B`UeW z)t>oCzrc5=!@~PQnZ)!j6fk8snXt{Ap}@Ym(R%L!#vAhYC2urVvX$*O68~|H@5H{E z8=-{{Hk&p4WC&|(-2Q~&Yt#G9?0gmtXIRWz8h#32acq&{VYTdMuvyKb6~55;--M-8 zbsn$@F0n~=nKJ9YV7g{QbGzWCsW1Q6pGXkV2>sulcb{P{W0Otu(GHPm245E(5}wwY zP{}#1?%>D2^BHqDun0Zfu!Z4~q2qSfMz+EOyxDGSKO96>T;? z?7P^un2VNtvOgme@mSF01NW}1iINh14=(SLRMh4a{8eY%!1nk*W4Qa@Mmay$-CtQi z3xvWNqd5+k3;k)&iEmhI*U&B)@aO*e_dGrqoVOhKIgN3W+{47PEjNUi_=3}1B)R%; z|DUkd*5^VIucg28t5A=b>}JfF3))%t{1Mx!lhnX}!LY$P#G_P)St}u>i++OZxv2B7_Hgje6{_>eurW!=1*BsA5QsPaIEQ>;A!pgT-4|^|0eOW zZJap?Oo!T^IE%d~-O0n#Q8Z2P7GJ|oMi=L_%k_o_)c75%-_AUcd$pb?=K}NUgMaGl zB^;izuPHvua(c-FhK4m}t#cZgS9T|EYYJ2PP*CW6F23oS{eor88h0G?{(OC`&Yba7 zNI8Hnr2fz;!wX(I0hWJ%J~d_w)06wK%JRZnMupc7Uk{i+2#cOjec)|O+KCoX6`z3H ztNuH_ExNEu!_6g{ElmGU`!dlZ4~)|uIs46Su47<$^5>uh2Sc&&ky@P(0d1jm9XKmHw#W>dSt!(8%&Z`SpN#&nPGbheuthuGNp`cCYXp_!8~ zX}G`t|AW-P1r;piCXG*}PuN_rtDW%o|G)p~4W*|Xrt&?p3kzdA!E;UjN6=>b3)*KR z7Rd4jI7^vioo3xrC!oSMYbQ(ZnWj5@S!bHw9cL4-^SMwgAfX`3(;=bEob;MiIK`Et z;^vq54O#_NX(=tsO#>_rOq*wTD7{9oH#}ljQc6OK!^&`p0O_d{KK$d~#vF39=@N^H zXtTA#11=#IZn+IV_-7iVCA9Ff87h^&IiSh6XN$zOgx1nok`f7#Y=ZkIyj5FZz|<<5 zqb88T_T$0k|Njr3KJ%|(ok_F4Wot;wgV$LLrt&X3)AXcFEhFN9G&|4#hu(aObB#Rg z7+Se2W?CBO@Y|orc_CMq@mgYv-GOHDo{p!lH~3lZdBir|XoH`Ei}DHIj+wj}%>Vz_ zFR5sFs>)U&arlv(%(wsl55M2i-lD0@yk_$OhTe#XrG0ba6M7}x9wgd*sAx^E_W03o zB#~K6!Tiv=#v~Ul-Gj{`3yQd|NHV1tyLg^D!BJ?uqxk#@j^6A4KWyRVA@z z^umT8>@)wqe$LPK;jP?)n}T8|c#hOp%xgX(bD}0J;qfHFTNl}8GM`$#;pw9VZGtP- z{ARI{5#6(k;o1u3UBBf`);NATb75x5hc$XD_AswIlbF_eb^8B@?Ga6PS+v+CB?8#3 z7FPBNz6)o2aX?*X`hlbtMm~jR_6bECbGAzgCh{Ay+my3}@pp4a%;cKfKDGS>ueX47 zi(<6wf=p4X&;R=wHQ)YipTWOPde(i(hyN0oma9%sPw*~u{K*tjR?B=X@&TKX#(HJm zfTqhf8vIRX7)tXb6^t9}7qWXbTE9B5Np{bE(UkA?Cl=f?e^9Bh;GlSfghMmqo<+=; zZnUm@!nlj0q>L+t^?Ln>hy4pG*w-%j#rY~16$7w z35Dm&3>t;`HrXFst$3jM^noj9S+YMkPnSJ>sGHH~0cSKT`|KkPNA*L22hKk0t75{mDFe)oAa{eOk z%WrG_zvqF`7kv|%lXpM&uRVLv!6YH&$l59MRx@On-tIq<-ovwm;YpwUK0o`Ss&uAp zh6g2P$n9siy*1}VxR$f%p>>??TP6QHYiUfGy0pjRDNoTXcb+oiMrr;BCnx`(AlkRU z+9C0&%96S5ui}5G$XXmqOx3ptKe$PS`GoI=M#c%d9ac|N*dFf~mh+c+y+<=|n$s(m zh`Yxaawi%(on^nQkiDQ(wIVgoK1b9+Rlj0w+GRte$%h7)2u%IB{K> zz3&ohzffbm?O348`8WEXI8J~Myf?Bh^&$m(MUQ#Ypt z^H=FJtfDy!UNbs=Yi3dSe&Rp#_QwgL0&6C)&V9}R+Geppc<;e#K&p?R;Sd2k!E47N59e##V91kt^7xdA{JS6YZutiF2LVru=9W zd-mYSkpm2`3l0`>DEXpE z(Z#T7{U7y$tz0?3xmN^pNL^secWsDsW$x0Ch-xnl5;T6=bKy&KL=Q0;~$ z;UGOnHbI4lhd6Rg6b{K>Y+-+H?Dk?Chnw4vGprV;7Hrnu;3dA(iFNl(#!C_oXUz@l z9ogFcIe)g-Ij^`}`N<@qC-!M>H}=_kG_zcr*nXAsLEnk`8S@h!_IoHRNETG3H=L#irk8cY+B(r8ni7PehN%6b4X>( znQ5;hdpK=w!n*{9{I3nV?Cr~>Uvx1S>|~C5b%JN(Yx#n-HbILGKjc^LanVy&d>f(0 z_GF^zjHoFFsVz?;17>n*@+W*&=Hc0J(}-=#pAL%vp(_#0(=`_y6iU0XO+qc;gh9i( zNse48xfX9WPsX@Mqi>w%BUq`0gwFRag6i-j0gR z<{L^FC4+wOYnngE6f{)elsdtD_CoU`<}IaMZ|oKv%(>v0b7GaSM-|J|@o%pn26Q7OVaSqMz6E7>R>0>OtqPV(fA@dT2`9_Xmv;Q*8b3V*7_isDDh~w$9 z37ZvuN(Y^5`mw->wvbPB|@`Q7~I}&#R`1jN7c3p0EeVGT%GK`DRbE)u#nz>MLw{inw2VxEjB|u6ezE z+fUgidKa#xe7LD~;NOY$_7ggF3wEAjIQ#nlLhYvuz8Yo-@zz{s-l5aT`|B`UNa9D{ zlkZ==b)4ZYdC^E|^SX78%*x6yJEtcy97vF3VPIuX`o<^5$-~pp#ckS?nAoS&^}@q} zY5J55$1rZA>K*({4SzVeq665NMTLEQHcV(SIpSz@;e}L27>mgwwkS@9tR?@L^%I>; zbPmjwXX}WIcrIu2m`N%%*`XxBA(eH}hIZKaGnpy&`Tg?e1n=G`*4Wq9N-`X3;qtLK!v~ zF!N7vkSk;KiCER4i*7VhdY74;m$=^rIQ~7r^0r0k5yQ0WitWx#m-s)O;*5CL+$!&N^TU7pQ=CsW z^r^0C?29PkFl3#`uK13*l`*ATRA-Lh+CcS!=qx>s2b44vXccf#+RkoX~nM)2{GAJpKxRsI8 zvaG(~7xQsTl|Kp1J`)&OJlti(?r+%A<)i#uHex5+C&d+stWr0a&#yCfU|W=6{Pu%I zTFVjHHJdp#H#@%j!R~vmV-IumDSprI9UokI+!#;uCd^{z%}_eO%<-01$6H+m^M8MS z%I?wXohey(j_ri%gUryYYYD|l##v$t ztK%me63I}@DPWl9_u$z9V^))R#i@%GzAHXg@+jqd`NF_?yNE+uoj@)#TgKf!4Q+*2 ziJ3gp!V*mOylLFUtlDjqz~t7_Eb(vgOU0$1``_3V_%`JjFefs6I-l_V&*2)!?ofs; zGv2yu9+vQ6e{i+=f5K({|DBz#Y!$ZLp}eco4_@E>@Aq*A?fnYxk{VY0J>O7NpmXSK z$1l!HeGSuEFPIq={pHK#X9#8d{3XBOxMa~*g%f!<&R7&x3&(^zu}dc8B{lE~9Qb6Y ztX#F5WmaIrw8m5N0nwsHitL5zCuBZ|DP>rTJhApDZV|k<>=#$eL>9|n1|_yn%s;Gx z)sA%eoRAFcd2rQB;q!k-{xz*JAGvH^v)$-p*(o?FJVBUGV0#_=yl93j@k4)@EboXK zzT}iVz?f^9%9wA+F!v3=R<%9zc`@dT3VR>)*%cUwg=}j&6+dC-g14s@6p5#(XBaR9 z9s9%1f2@f4^$q(A2e~dxJ5;~GO6-;!6K_z%sqz4eKj{rq>i#Fbtt+rFOj;uT#f44# z`Ha%iFVY7*+m1A~CN?lENn*V#`D)PBICyC69k|7r3T0`oo#C1mQ6eH0<^e0Qar7|U1;MK zF+*k6zD%|dhRgtEsc91q@ho98ljfYwnb;zhvm;IE-+yn=E^o6>1yP}lg6 zQM7Nt#Fz+GMlQ*K(T^y0HInW{TgC$E(kH+Q&8~*%}k78>6B)g)i zF+^tqmt@ML`i$dTB61s;g$+;3c&t&9vft3f8dcXQ^sc^O6`QqCnI01}bCBgh4#Vb& z6DKn6lxbcn9C61vZC>K$JsU*0-~KUFO4Cv_&g@{E^Z&uq7iT8;aWb!&l$zq;H`}0E z@wVc>M*ek-x}q(zeQaLA0`h;^%hMtjY>#W;X?>B}u!b$c;fLr=eTDsw({?!eFfI)} z5hkei;_i+KHjFRdIInX35OnnahM2=A7`WMQLHC%cIFhHR_E=rW0gKYyziytMozI)6cxV92_r@9|D&o0i(Sxn23i*UI1LwxpmX ztLX@1R8)Ec&zl3&9E}{US8QN3e{zr|;7{`@mm3FI*UU*wX;~`Dw&MPOV}(azMXQ;2 z$TZK3WYDvBWPif=^>3@5CM*A!KkZ8jZ(OSQ!6p45i@RV~ddt~&pp~_k9(>}Mq3*!z zG~w-o*V&Q_*ln9+zscXJY|GuwRIVhc_>teNnX_oGE_=yswiR>O&#pMgcFCdcAG0p^ z!Q1=`9`bdG-;iWc*xvZ1IsAmraV=I~bd@vUg&vwp!XqNh-LBHX`e5%;D^ z+=ddoLF`f)scgJ@f7_RqF9{Xia8SAJKaWPHYz+UObcg))ji*B*9wj!IR7)l*TY8u% zZ*l%C9~bWQ+QLn(;yB~AjDP&R=`;Qs*c!~5a?W03)r8xL1)CS-$wkerkFai@*cjvB zHF;LlYK9EM+x*(oB_vPsbARB`Tj6`)!~7EuSZ=mv$@{QedY8y_eddH+qCs*^m!#Jy zbFMrukiPuDC8afUny1#E`1)giJ?J(W-DrojhST~1(VVl&6~0QQR4Y2^GcT!2bt&1U z_|5UpFZs+#JdfNu_B-4zQB2iJDwU{6;wU+4P%v9CWrNJ6wD!`D#GiuO9*NXE6E@j@ z_)OCg@fGz4jxl7JH=S|}dofdY!{*|Dj<-!0eA8SJ{QtduO0>!fXa2y`EOybXCB2#{ zNiWU6#4x(dY52ortu9b)5FrPfj)PoDk)L+CH1uSX4rM{p{%R~MI--jn+1rDN5 zrq^FMC^O-|fH^zEYmN`TS{*%>cLmuy(l5;;ZD>gbYroD93~|CQfU+@n!*An{m-fwWND z{{z+M{yXt|w(R5#ykXchU8ngjUtWiC!|ihro(OA! z2TkH3f`9&;Vu)(v&#rKgy0hV&#gYk)rVTSDq%8>itaZjtts?oW{+5K~rZPE4R;d&3 z7wq14FgJ_s#0!HRpa05lRN)CzICO|{iP)u!zm79lMRa#cZhXXe>E_Sl4Au^UDRw$? zj;|70O+D_)zgXD5z=^NqovC)kdApQ0&Jc^{v_%Td={^r6jS3FGv1bl4<>V9&SS)sB zCwu4;g|7*=K0Xg3>jIp`t`xG%{y6bL{?ZY4{#y(;7aU%fFt;k;hC|io{}0=D9I(pk zxo|P~Lyuxf0$Yxda#l>kBW|&<2N&=EpD6pmZR z@UD6IYd&Mx*2c-YDr+6APXC`MwY|e@s$h=Xnk2SNr#zSD+~(t!Dy9d{G+x|L!2CSY z?ZhhKj?n*-39?)hR?nEgCGF<+WDDQ9h6y%DStMH;&-OKGITXk&Fx@37DR`R8@ug5n zkU<8U)Rlt`t>(g8g4s8TJt_(?owoa3;&%(NwmZCe$`HeC*z+x%}HG+Mv8 z;Ae6|=t$?e34Fpgcs){CHDVGAKg-VwcdTPgys&lQ0vGO+))Q3kJ(%jOP3sV&c2|Njr1zRD>q*5S@4{$0oCGETa5@Mb&btq&}@zY|?%{Y-T6Ts+}HbE$-4 zVuwfhgNoD!MmILMC5%cDe-3>TQt|zl%3vBM_*7SA{b9Cbhdid~-WNnoc`jHmFV&w= zIYD*FgmVTu>m0qq9eJYy_B1`>ekP^%z)Sna8;KLK3mO?f9rP&0-n<)E!$7AayEi>% zx>3NsmaBnx+QCO0A!SXcT@p4i=65n#ahL?NYCWI1klp8Rn;a8&G5-=l-kGc{Piq6D zezkAe$}FP)p`wAep;7szeZ_=6&ZzB&KJhDir864MV3c=YoGaS6rHXr#$@IoXMydHd z7ryYme&KxT!~clS#!CDDwa3_U8Z*ajI`qj(=da;`^tTT)MJ8E(EW3N5d(!`mDmUx@ zJS>b!3UeA$9NylnbFoTIQ4l|1_4kAHstE-mH+M6Xr(p$;0kg(cy7rL{=J3I`1j0ZoW?%w`GSH!{Fxt&9n`+gPB$tRa0?!w&^Bi?xPMpKMmt{AG`w%9y#^$?8+i2Iubo z&TZU^<-eS7IX>VtNJ~4SV6&l~QPL)r<@(bFj;tr%*r&YKQ@(QE;Cmz65yiQ6FC5Or zKRDRBfH8*6V=e<%^oLiGZV~p(g8mOe&mV9Uim2pXZ7(S)$n1EcRAXIAyAcCJ@R1W9 zbxr9DgeBfIGt_JDk!6@uDIxID!E1`b>Q)gZod;|RdjwmP^h%C#>`Y2+5w#IuTQjM( z_mQE|18?~WJe|6{3&pYntQUL}vgTljW8%zN@P|Qe17p&EM*XL3XDy736~3J}J}AvJ zq30mW+a3oasg!)RH+?lHHu(p*vD{_npU26p>-wkv#FhywzuzCNo-{W?PvdF=5(&Wh22g6S=Zu8m~G{f7KLnP->f;C)!~0k7qW zH`*tB7aY@ibFU&od8X(t8~HLT^A(DmaxDy2Qbi9$RQLpV9baUA=@BSS4DV_@#4zWZ z!)=a+-_4Gjb8`|lH!fauAu#sF8HpuLO*#*oblB4vj@#}y$b0u6<2UP)0u~b~?#P1- zGe5GG=PYDq{Lse|RMl?s$1z&?pP_@_`L-pd1y;<*7;}y?D4WC{_;&9QS6YBcWB39C z$7wQ)OJpPk=Q>QVSQF5mBg%M`dCjKg4T7?+HxlC}?D)kmZIaOPQSjG4M(x^&D(8@6 zJRkf_R+xX4uQIaNnd>Zd{r>~+=ZVJ8C-BKF*~n;pfqhbuqtS&n1`S!p$1mhd1UR0k z-^ejO^!`H_M9#iRy1C^4y7Ilj5x+18;W~acHAytujR^B67 zphQ4+#YM(fCQZ`<5ApqNeq!%dVR7h_%8Bd;yME{|kzp-=v+yHZ(c$&)<0T>%Y)^GK zrB_fdJ7-$LTcuJLd3*-|k7jU=f2_MWxOLU&fuvvn2Oe zaf|pbn5i1@lS`_DAz$^!d4_4pZuim-a7Zp-nR%ASE}Lk?5BH@^|tQQkdjrIOD9iyVwI{SxWdnisHp7S`1{Fqa^ zB~t_#V$uwok{ciXuRqe*u)v6K+WrHX99B2j`|>|H@GScGhyU#T6EE3>&UO?D9{R<< zYNbTNtHh6NnxN#zX7In6mu>Zberbi4BQ`pSbI{kR7*t}wx<71e0cnX$G-cHiEOWbOctw~P{lUq znWTh-fX$m_2ht8G`n6u!zM+QSe>cyDUHo3g4xa>9Y&_L*ZC&HmM1{-hJslSs&TexR+nP6t2$wL-W1Q4y_$q_#M1%a32gxU1ITg(O!@p^5KX26p zvlVX`T2(VdHGZ73P58+r<-@ksJ&}2;!tw_8w+jQ=te9EL&WUSyA71~BEh``QgK2sR^$ay(LKzB-8R9vjj2an^ zsekn!+%)*GP3ra$jsKDo6JDizJmlB>sZc3)=|WOUN=wN(*@>rTlf z&(uF`(7A9gA%d0V{S(6mx6=PkX)k9eG@C3iaE(jj`lMae%9`!aXwsCv;h%%wTsBve zj0A=dkIfF#J3-gSJz!cfkyVbRNlt<}OQiWr^Yjx;x{WeQ95;_KX4N#$dbmJZ`atzd zhu+eH1^?U2?GiReZ&<`*X3Uf6@UK1OLQl_wE$n^rY!Qol1y%PwbX8O?(KJ)enIaY? znas0-QPimEl1jil&Wi$!%T?Xn*sg4n4EoqCbgF*E-vuU(FE%VJ*Hb+G@_{Eup4^$U z6B;>hJYduK6v=LtY7U>bqZnc4y65dRP4%F(;PA3v&syK2YIOuIhhGAT*e)@6)G9;WwxCD-_F-! zaNw~>*an49W=hwa5C639;V(80(cd)JXG3$ZM4;8$g0(yoYWTcAfB5m2|K$Ru=e!<4 zjXz|Q>~(Y`BqS#OVf56Va8UC@j=q8apGLWTY`dlBa#|&`oU&eUj3vYA8~X%Q}p^|||z;pqds`Uq{D3@A> z&ftJ5*0UR$4^0)_qsn|sF*T({&C-qSgk4=3+Xcm-1shV?_^&yglK61oOudIy!`Z6F zH;qd+zEKwHiKW%=KooS?&uE>^n_pZ<(ReYKXB0M125khp9i{J_v>qt8SXzi zz#-Yg!276)P1@n7^q#d0Px}5(DB>_;=6rLbnVoq7v*!QA=zxab(T&EP4;nZ8pKwcL z-h0Qi<|7W3^1FU<86|v^pSWByF;$Xzkw!nBQqHb~xS``bV3nZr-vkd~%b5C31twif)?$ahTn zrQ;LMj$9v~343_8YW_9djyl6L;SbZyHw-J=Whe2j?oW8;d}|rc12)Djs$6Nw%Mx3x z6B7BfXa94$U4DXDLg!3JWKD;KFmq0|=90tbnl>p3h6FUQZE*Z5={5HxLv$*uCcooH z7OUSZB5@s?c@o0EIH~<}c(mY~Qp#InyVYcAZAcyZ$H zb^d$_i-zy{MuvvY+Q;s4|JqxmS2(np1Spw$D8pQ|kL7&9U-x$mMurFeFm>itY(2s7(#bKoOK_s_gUyNm6?KCGqLQ1= zB{jJu%r#`2V#4&A!|2fY28N~j1(T9nN~{!f0+_`wWhOP1JxNUDSu{~QtKe4(%Wu9+ z0p@EfUGE8>=h)vTXykE><(*Fhe{4$2IXMG^L)tnKuKbnmyu53wgH z6m}X&8)1q<&-8?}&j&Y|Be4qGjU3a< zCrN6f`o9idC#;2r#Zl>l6&iGjyE3_0YCWfBy4FCbDm0-XkJ@f_DP11uf8>b89Dm$BNg zsk@P4>Vl-5sB!lQChxG}p zFB`8+T=7-vhMF5_HO<^cHcrP=x-R#awtG0F&oTIu-Y~Uxfo|o7tMecHVJ>CXsc$lp zJmZrx|G=q8w;kyUIuX^qjCcMumqj&ZC46N(!6P6Ych32cYT`zpRIsUmmQv#gtz(%PL+kmE9kb;o|TX^M_BS$8UO%-qPvYL#-0X^N+U`icMT z{l65=Jp^XHuxAzya+Xy)$MSYhqqOjXm{T25Jcq6vyn1*wLqs#vC52!7vJwuS{0q$Z z)+qhxFVHV~EPCmJTgeuQi$c5|{F>(!WVH&G&zsrFX!*DCD#O|Tj5e&ITP`u>s9lix zFjeh<;JN$*)?te5s~GrCFr9m|f$^~TlemC(DUovvtXOKinKv9_6ir%iNMuWj$R&xC zmL3UXCojzjb~ny4eCV^w_$j)L`yW^!h2X=0n`AZoVbFmvoXu204}|8-Js+9!SE*i$YR^v(Fdw~I}u zUDzU0k8!*US!AZ-D5{k*(;#ai=f&nVVwQ0eq*YI3@;;gT-$T@XQBbp0596iA#+j_1 z)e}m%*SAOtW-Vmo&zh&a&Y9WU*_xN9=YwQm#HN;|tTXQZf7r`#V^d8>+>IQA3Kw~a zeH+#W7??XsU7aBC=fC{Ln~awHW(U~TCrB#3YcOSTNc+>co`tbY#UcEtV(%nlr|DdW zr~PWW(!Bkgf#SDHV}k`{Jpcdy?=QI^k+ebdnZ3timLRlbAbGb`O?7fk{J&1%QG<~ibw zc?S#~+5H`VP7oBl&+-4D&AAf{#nMGHxuS*mr=>KUk!if~zu~%SKmf1XUw>H;3ap+vVZ@+PG)pze#I>IqQN?+p|MeLR}%9s z9SNCf|0NI1E&lLIVTDafHLtLRZQ~)f5PQeA48@o1VyQhBzOeM_vawCsHF+ZAHr{T= zS$PR_g+1aLmvLuQvU|HtsG7z2`hYI8RDz3lwLxaZOb$^6lh6E72idegUpVWqe!b)e zh8a;s>Hi#=-}+=Q&*4d7sMs)J;dlF27F;`g+NS=#GV87Tx_C(qmM7=GHG8WSNTsVh zV5^y1HzVvs?H2{Pqz&BDOnJQ?+$ofgV;=@$Isy*h-c)UvuXC>~|E_z)m0y@ZF2Z(4I0 z!+|9N#@EhBcup2v`tgv#ivtPqoCZbPnH{(!b3~=4m2l>NITXg!AY}idFCgIX6vnV0 z4OVw9w8`e2f0F+|s3hR?@5jsgFE~3X@CLDEEau*n(lL|KNSP_Kwqbgmu>+S)fFo0+ zFN4>ujy_}IEy0Z5{~tUJ<(bgNbh!RX(<}Qe%v@Rhf7;EM{u?`3-*_OyoO{B^=}k*& zU4X>_sp$%-31-a7UUJSi_@}yRF*uYRv|7fT)$mh?)rteDEoMTAyaE?Cd3ZEW zoymBqpk7Zy-5!$ z*x$Wm+Sw^-#mxHpO|x~!ftv~uRtYV9W*eOT9^$z7{1^MR%gr~q^>PxuqZIp?TkVa# zj`LbMbNR^$ls9P!d+bntBziA_#q`k33F+4*B@$!>B$_$3&L3f!ebfEjjRjqbTDfd& zPmUQX@41x5^t)5=)(-ZYM>|3~8-gTiT;y*VG%wYj;=-AmaQF@LWuFN*>pxt2^MArQ zp))lT;?mNd>}nNE7UO^8&-UWwx1I@F;z`fzKgeYl-1@`MJN5sDK68VA3t#d~d6&ps z)Dg)Uv6#&$f_eSv34hr5joCaZS-%UL|J(R`9%4u*l0+XP@Gyj@1hse#)CLut`l|UVDXc zqvJ1!kBruiGbCpncW7nzkl9irdxhgC)1I`K`d`+F2Ha?z{^)=66U!TsGCVvJ+C)_9 z6pUpi{GF@w!J8gav-bThUF~&6)yH9-Q`S7EGcb=1wsLC9L z+p8V^v8-ok{Ppzvc6}b1Id>iiFFm+9}1qJU1Gd9Vaw~yM1u1-mqEO;UC-G$Gnj%8Fa5V zroM|$P@dD-*~+->XrJI4y$A`XOG0aWny#d-NM${ezhF<7%)5>fW=RP*xgXBg_)j)J z*u#Fx*=Ir#qY{^P_(dT(W*>fKW*=E*p@!w!DjUa@ry(Smu1$T$$NxF00q^{}W${daz4R`ag3)sr4FNCL``i zZGxPVN%qVoK`d*U7^l_GoN&v7hiAf6U!IJ);T?Y`gs$rNBq3Hl!G>p^VEeXahhL6Q zFUdc6SeJ9as6)6Sn)8W6h8Ww8RjdvPD$O<+s*d%-;IVs7hGbro@7sHiZvVs2^{+?j4cIFD&es~+tfm5Xu{!ZA; z5pm$CQAWW7{Vx-o0;GPj>uz^QH4rvl@|WF?pLfMGd7(6?y!=M)$SYTlx9A!=y|Xzo z&qq>n<>ZMH84M8%+1(Ft9o~N-wRlFDq88T#nKRxSSU$?HO>ui?Gx1T*1iOHCwk6NS z3tD6%^>t(f(-yaB+kA93bxg~ae9)`;{vC&y@ zuG#$Fg5Dkb|0l8=KlBpsI44jJJ{qaQkhmvNKR-FtNJfFA>BA}ZeGMg=IAhkP$MYEMo!}^b;_iwCwM!;!maa28aHd)G--I7& zDG9CfrtuatTg>@y+^{~Wab@Gu;tojxIh`2Ck37;}S;J#`I{0qL-`E$%c0wp*LivAZ z?!bUnCNAa)aRtp{CAV};_8nx^Fz~Cd|I2ZD!rSv< z%W;PInG9zAf`-n2{{OGvAyah6*x_r_8P?hCg>rZ9Z#Xrr@uB^eg^e8d{|6X;@Dfrx zp&+EZA&Duz|C{_I`Glz&J6;~-SouSMUDB{g*lvw5OP73v@-O)xbHo>{t^e=vwv|Vq zrv5XNpqNj`IZ2(`f35OqKjiBki0i!n=X`4W1UEhvri74*kxvh^%yo2q!s_v>`HEuC zhhy?b>RM9&|8unBdfGG~8crS!CYiQdkV z6Ay8Sv2SSnTK_DpBxi; zv9R?2f5oNs9y<>6ZFH9Tb+UoszobM0^CAWF4Fv_p4v#o?ypgxK!Li%7QSjEo|G$5; zTf9B6E#cs_mZm$bpY$ts+8OL^e&rC*F0aBLEy?^z+h+dX_9fLv6c`u%Ww^v_Y23(o zCy|{$&3M5y-Tw;<*)@Y_9!NZOg6HJz1z&!OS9vp3WZ$dzxN-0iU)Zaiy~y(gMs&!%e3v+1S{g)Cs7(cZfN4qC+C1 z`RobjTk!(B6J--Cq^B{4V%j| zKwN{Y0*9eQl$*nAsT*g*7i^QLn5v|lA|_v!CVGN*foSl8GVYYES}HyXPtDhyYtK!0 zU3E^vp;YzB9nB}7S{R>hNSZMFfb5U`6F5yK=pT5i`+}EU;qyNSeziZ}A6qYxXZ-f4 z{zrqZNr>W8GXo9Br@ZUzv|i{iO1QC@Ft5o-NpOo}Y?$+*?bS4fv=9Hb9xOIcSW(2F zDi(0)Pj`tigN4vSQLdtP4okiVqWqH-b~q%u$m=91a4BRn&-C5@mO8agu1{oK?3ovBWBJXLsBPtdNw=_ z=HXdzn_HpX-O$j$;qE~eU5A6(0t-~Rbk@vBkd+QtETehrzw*jvOQAR60SB4#YMiCk z_4KS@wJAwqy3>%FVc}19eg%CA4WXwA z345{rCn1{&RRwa)OS99`I_@s`+v3Av{YBdvH%QNfnH$P&U!ms$V1zbkwKgjy;d{|P5 z;lUcl*`;kuqa)av*34%V+V@{l;NxfcRnsR5TGl8go@bH&@bf%_=jjP|j&t~y^Q^G! zZfs-}OgAuZ%5bqTFgWmv+bv^PW6n)R-H+*P@*mn{(iFbsKM<<^@bA?B346aR*u(xR zqv;WInS#&>$p>yc7g!%KI%Fs^o^oGM!#3?d|IKVpz0Lm}PYHdfJO2NH(qzVK9IZdz z+FyFW`iVy;lXCSxse~E{UCtFM+ zSWe47*ub*VVH5Kr#;6m9j)#O+vD{n1{M>DU^FOEUY6eb1!pu5#iIuErVmsb6-0qi{ z!dyDR@umDGuHH^YvG@%}LSp^~za2KmEI6j~!bkW+QAmPZ^PS)S#iiD7s5#mpl=k3l z$bzZN2O1S3W^xp1|L`(!%TS*`QE<;KHj@l)NsV8p8M>-J%>Cap!P)8Hb3+5;#$XF& zjkOJY*O=Y@*gps}U{h0j(IBm?a+>LE^HtLYZv__UGA?j5ys*Hw%C7mR^b~)GR09=@ znGzGEA1D|;`E!inB&SCv$0Y{#>81-dJ-4@c_3$AVr@O&P2Ido$975;+Ctg(ziu^I3 zQS!j6#2Fg<&e>-y;1%lUi8$ME^SlGYpa1{)_q{FHQU1?S+qdrTpFU%kgw209?D5Ny zFcM(Qu)OVm%Ex|J@W--$k^;;pClv7oy*v0yAVQW|@2o^(QO}1@TodL08#ipLIyCKy z^C#()3k{4b?V5M;3cgb?PQ3j}LgK<_b7tl(vdpVbODH~lRlnq$@d=-TnJja*BsR%? z;MLx&SSqKoUGaJN6X(^5!dalsGw+){3=`xXN(ENjVcst9kSoGABXUBYRfdCTi5=ex zeTJQrrcP$O;+EWc?+X)`5rB}B0%1f1u zn+7Wuv(DyiK6A=JYU+Z9*0p?$<#v)Y0}cs3in|i&Ca#lQ0I$^6|{m+4)_0RX;{LDXY*}k}%wBewH$3foLE{=z! zm#~*i*E*rU;E-sJm~qN7zHMI3jGPCg8aC{3H@P4wz`N%^&jdc94TbD-Q`y-BRxCbr zgekM)kd|!0LarQ}hG{j8S{?H9?Tt1tr!P*BH3~~$7fLbBF_E^3U|1`#;3^Yy$`z?c z;%pJRrx+{^zuVWiaaFmBZ8*eqHKYzxjvOK=%tgD{{I8LWj8vX zFR1v_9};*-YUYEA-~CZ5otpXtHCY^c!#s{Ng;hGF1tf~63!7O@6~8@h4?zFC--|XbCS}*mrLR z!*bQM6H~Ju*nF245?WAZlT#+Ogk2`=zv4Tl(x3$II>`-;1xL9g1)57vEO>aB=3rtrkQ`^c~ zCLU&cbM62Cz)Kv;TP`Iv@k=PN`75OA8#C7&o5>io?BFBjyEzea4t)}7;rC_dS+Ivy z+QL<8PRgJ24N=Dqev;lYC4psaTT*I*Ll^sv1TmF$jo07&WxLCBgu^yb-o%0}kT))q z-EWEy&jRNK2ijc>ox<`CKI-SpTp*(IjeplAjw?4o(*ed7Chmz zW8jY1clZ@oKoQIIhdvW*&K_upQ8!vB6UPaT%w=i5JrFA1-SVSnkq#L$h${LmG{gY4>#=5~h08=AwpoKIW6NRU$Tcl@Nfrlxgi zvf7I>sSU9Y($tey+8^QVm|FF~OeLeKLGaQuhVplg+KLj2seCD?C779Wau`CE9lE`h zXTj~I4b1y|7R+9%uzjY2|DJ=lm=&xa_^$jvp@_NY8{3w=w(0IY52h|#aGTMgR5rs@ zX2o45=`GE7Q$EY<{x>pmI@HK%Rl)yFnR&_NKAB|-+a2@nCo=nIG);T!e2eeDhr?-Bw`GFx=q4@3-iv7lYDkel`y^mnZcTcC%eoV7Q_@fr&NDz`^KU z{0AW&kH-QrADN5I-b_$&bMtUyzWJZqs`00E#S|Hn&u3Wf-e*2}gonq+!`MNf_RNK@ z7EY^VF3lwers|%E$yhvdBIC6W?IzO_68T{^Z)<TXG(ruBj~}(`cmP*p(%p<{zyIY^RRI8ThLy@Bq`zWdxE6I!otHW(o54??zHp9 zUXSC}JN0Z!4oY6x!pO;gWpCkw zQxEJX-Q?kUpvIxWc|c1m;*a8?iH!TS7;G+lkT1Gry@;vVWSZjKvWQ=z&*-6BpXxZRMHT=-LTQrdadnGWumtxW`$t zjdkLiy5`F|N!Om)n{XRCNyjKyC#1fruejAb=Qe|pkkMif%?|$-2t@&}5VHRui5`Q<3 z-;y!xPHa4mz2P6ktlUmysk^zINSru9x8MxV0#RiJYsb}#{xyePXFTnC;hI%IjUvC* z-{0(eZcP<5OyKYl;W_i*@;XE7H~$}&YAV-Uv*VrqM%UN0$siT2SWLu+;U74 zyJ0C}P^$1*^1)p9h#w0scNDm9aaPFW57ayGi+P9D{{^1}wjGz-`?*0QJ>YZ|n+}7~ zia+xg&8!cw<>`9dc;|D!92<`d!woHlfaCMU=GILR&M>|0-|J_u)8X;<&*3izKe5`Z z_<#78+668~O}>Om1|=5F^9etB=6sV>P&v_2|6kzr_lMdw5)uY%`HoqErxY@j9CWWM zJX_=+(>T@0uwnY{!`sd@of1-ep9!)rqi#)Hs4X{fg`6{i%d~2FL(I_sQ^j-T}jd*{~C|{ zKfKP0?W=1-ss4%&|M@fH4V=#FG|bUujmkXA5!cC(b^71GAF~=IE82M0#HF%KoB4!? zso_xH3Py$rPEO4XGbWxic#vSg%XGl#zzI1PhmevLy#{BNFlFyKuwJD}i!t?B{RKWI z<4bieX&LDvHoy37zRsOJyPdIUhBPztny2h~7Bd`9%LukVKcMySzlW*tiQENezW%-j_h;0(^6W_Z)!}N zr_dhtms!8MN%lv}orUc;xsABDuydMBI>j?blkF&f#sN+v1Lo{K#tzo{9W%o=^e?DO zOi6JniCXxNZ70{YpUDkn_Z&_qIW|jA_!}ee-zn+2eT9VNr3J0;YLi<+^9~p=lqxxf z&tZJOJB>-MfYr-fVe1(WW>+7b1(J3iGnCgU|31y|`Sbeo?_{({Y16E-ogDL&F6a{NT5;KVY8lQKI4 zIn#`t4l#0PK9l!tmZ$Ed#S+{}bjf2GoHpVrz?9o?Sa^!`# zOk|AnJ=igWv2AS*6Ti-aR@M`K7kcII9Jp#cK{V|D!lyE8-Xyo&Q9sWk$|gL!b%E-E2aSAbY8A(s?liO=({AF`-0slK zzu*_=rl&nK8AY}!m^XfZX5{3h@uYET{RLxAheTG-?f)faJZL`GVbgcVuHotW{}(fOZtk^e~FHV+2*}XU!b+%YL30B^rQHuq>SPucKx z%7!YgB>P1^sVzM*&R-SOdL$$zAEp|vxziNFdVtZM&EqWZI&Vn{Nd@N4j@4Ha--deZ z<ahoHfLtL94<;_4tVcoc3GgE?sDlS;ZKs#F@upsAzS51DoKYz=o0=oXRb{ zdKV-WPCF#FDl64UE}R=)aJ!pvXFy_FV@jUKpFiyVK2A>*8P9Xf3v{#kJ6G_ULMn?i z+w84>|I3#paOnJTFj+F8QKU-1{72j>8G9B?j*pbQQTgKlZ~26{fWzW@dPE}}{{R0ho@2h`aQBv& z*@Bx~S(eOejc#CE!gp@Ro6rRiGh=cDl?~3#_~yxf~f~O z8X33#X`ExmeU;IK=gN$frm#B-n-kMB8ZODNVPyDZtZ~Po=7S|?&jk~D8s0EHb-a;SvY~{ZQ#@ja^C77qz5`aPCKR}s)F@=inx2r9 zRCwNVh|NggCDW|zgLMs8#V7n=ZMQr1M(v6k+YJY)9Xk)RY<#c35}&x zSl|1yPFuNP)0_YHC$=fv=#gMPTt8)|X@nK)QTdGDyc+sVY?%&ae_G{caen$4pJA8W zU^XW)u7UTKQah`039GQq+=jcS8Ft1AOgWZVb)ebR=R#F?BV*kK-4%b>%su`)pL@cv zlvC`1=w6=-RlJ2C6gK?%`=yaFOsw%QTdWmN*?s$r*wZYMKUlBV|DSN~?GJv*nARoo zY;0^9mjB=W4rjYiy7fRq6OT*7spt0f2b!-enCd!VtNV097%lL7F8@TsWhR@J*i40135)*<3K63LkV zv%W%>;k16wg({IKJ?Gc_PrlhG%{4w$d{zFzHJ<|QZ}v-cfB&~%Qq%mU^q{+z@c};f z)+?_&K1rKI{NlgEn3mA6R6R*)Z);F@BSO*pL*iFGl~oE; zS#;u?9tmz~VmQJ+U!OImk6+8!VY2XsGNufDduHWDds(uz75{K$UT-)gy65R+!EISz z<(W^&oUlyQ;n`p&nZv{=b8bPOy>QA@<%~}}OJ0~4GWX3C5?%1 zQsd=E>*W*j4HvK7aCDl^%oCog7dJCZ2yiaB(#h}o#gU<8?%{d?hKI=&ZNLBbGaAb% zu<~U1D=cwj$rNcYwo+bnk&SD8{r`o%&HpI2KOlue@~1>eSO(C9dSf+3r;dG_lEZCoj7Op7E+J2!M-dmu3-XUkk{{yl`2^LM- zPA?+adnWASih0;*b$Ef(9LdUPh8I?11zY~7H=Hf`*UY!<53`xef924!oCVbxk_x}y z9C+rCzT?0@_I?fLOABb@$OIU?_aEM z>I0hp@PClfi*RQ#(O@>_j{EngJ@#qaiP;)2rwCRpW@A2*Godc+MT3~~7N+JU&TIv) zd|l;X53<+;1ey-Bm@zP%s$VeEU+u`sBO6YMYcL}k;24XqxyRfM|1WG}+p}dRV^EmmBQ~py zAM$~2jaLp$>-_KhYRfX*pI^R8~kjY_804kXj-avaCtE_`@f@FbStGj&B&2xi0B5vsu^R$f_0W z@RI4u&(pTj~_Hk1bjct7IAQ?lJcTE?H?oq z7*uo)h#4PX%XNI`eovgcuYSSf1aF6fn}h!+YF`pyj^Ds$xn>UAP4?MG|FT*MaGCt( zlT~5x)o5U|QAl6qa4J8-nt2b4*sHvVpQjk|+mz2SF;ucFVGqgs>ui-Pe~! z9@E?7Z6$mQnB{#osHr@;;8AdkMfc}_c1atim93@~4`s^|=4|-z$=OP-XTxSig`cc4 z_j)$uYV=%~yiT!HXN}Ka{d854_XN9I6hy`_nJ=|G^(d*(pm)p2<&&SFFreNdG4}k*oH} zr}>R6AO71jyE0t+*Y*$|#hal-MX< zyrJm-{r&%WIJW;yZ@4;rLlOU)e$Jv|o)-n70XK}A)87T|KDpr2M9GQ;raR6aVc30= zp~%Gw~=8RUcHEX#x%3Iw$$dRetpmy=V^*8^T+f0>JVias0EQDr6Al(yGpyNY_~AC=f}6Z6 zdlFc}_vvVS-(tMTbkRTK14g!6CURfp4`yHN_)374t;on>lfbN*icdusePj?4o%|3JJo5^7-_6-Ki7dITUJN*BDho7qIHQ|T>2~4_pc&riJM zes}Eu28;BTHpz}Q-ba7i-*04HE}r4aSIB)Le!(AZL)k>L5`N?4jc3#ER=r)6v&GY+O@Bv!AKRFu{J z!1-3d{O~L3h#5_XxXcPzyP^Z)*iFAF%&j_cfa%8t^8~9lnGbA{Ct1weIfd9J^jR+| z=J#xzFf%^lhjUtm3R#lrZ1k*rmkEeCVg>6+my*0iY9X2y2+-W-EQXPnD(bx&WO9n+#;$0o!_#|Jjf!O(ZDMZu=q3o>E}<%{yFBguDzj9 ze$!rOzvA@wJSt32{+xDT`_X+Z(S1#o@;QU7_ivXU{Zvnd*jEfH{gw!n5{rSAd5tp6QSpY6b^t$ZUXU{=~6{?+CRU)6Q~9}Ht?{>yf1xkoNjz`Yh;j(@+~ zZB{boW;dRi{{O)t&ONytA$$#Qk{GueJEV6s{9*XWo^gm}3g66w>9ZAX{pi{7iQ`4X z{`&vM4s0!r*Q1?pTRk}Fnjpzhq`o4SbravUw3NnsMhuq^H>8LqHOygr#E~(hal3o- zr{nb*^*mmaH_0|c1_$qEwEX39a`6U9mKbkdiIcKMDGPWdWLXY~t-IiJzGFi2l8*`u zYZRP)&8De$*#^l?m|~$7}sVr$_O=ObU5E>d?R+nN$AnM|2!Q|qBk})&vS0DVLH)avWrW4 zB}>1Kks_ZxllYO0xr`o>EU#S@?=;HT8EkfZ<~U8#QR;n<&k0#&k8}xpQp=DzXmWA@^kd=~h3SSL&Z#S#C`l&B*57#8t-yJq<6r%c#GVOXcwY$|{A9(< zoaD;rW3RHeL0bJnm-Hlmi2#N>y8jnezn`ff%m2al-GMLc)&fFP{2Z3=Zhpi%CD`Gm z{I!h67D474%>Nh2YO!T}=H408YO-R1W%ooz;RYp^IR%mjHm{kmOR(yw)`nzmsXvU% zEz>S6%-erpCF>HlGIbjZ|9{Og3Y{9v3)v+Y-~MK`Z4j`TaDsuqV1so+>WTmVJ3a}g zu%#66mj*O)u6)e?dQJ0b+qVA`*c3BZ57)og^sfH@!t|m8f6j8;Df>E^v2p>|wMbTW z&JzwDhCCDgFuV;gN|hec;1Vl ztV&XHra*g>k>SE8l{0Jw>i@GpPxiRy&J)%wwP`^Kqvc=uTa9Ud_~msPuKF%8Vx5*R zDJd8|-Jy^Bo6LDbY{t+|9|(~ z<%iBRUA5g{B)(CLQ?Sp#bONX7i8E#?i^MN6wr%O1abWq=%?|7Tx~wZs&}+2h+*#B9 zWa9n@Ynac6UnpXalwG6yNBYJ)27WtZMYf*_w@V$ba^BGGnNYg+o8=4nOE?__LulUPdDFp% z$2%gfGW0F}-(hBx!^BmoD!V48ZN*=9`77+xiw|rwObL*RT7O_Mm*Dd$d`t$8LPDvQ zQ!h+oaNFW?%Ag^^U@j*EH`^0q#tF@A6BQGc!&c0cRpS?KHGL&GbMB0Wwveh1J%<=x zx-|XRVk68jrShNhRe=sS(?e%B91~z>Ub2|^9`j)yt0f#p!91rfEV#+Z_rT8igNC_s z$}*NKJASai#O8=CHL6sxaMZhfm?6-pXua%pN^u+QU6Zuli~ zMS(pwl|9E`69a#5-+#w#P7R+K z57+;2U^{evLIuOlPRU*Q{7-~D+GUf>b!-%0KC)+CGpEf|L81M?#wP1k4<9nxhi&eZQ3?#RF=FF{Wdc?oehkc`CbMl6_&N?2=$^RFWGM^|p!6hFd zW7yQoRvskz&(I-l`-}(M6&nscKHtCo!XBp6+j%BTRormUC1XZIx8a9Nl_wZfEaLzC z<9<_r_>#0R^9se&hj^qp+MbDKRJH4v|2@sHv$H|aZZ==v^!*o>{{H{p@v^3h?!iC* z`EO|^w>-0)Q6FisV_~M?tZz3O!nZWCvCNn$kudjd{e`Jq3w&6(X4@aI{k>rigLJ_U z{@7*Qn*NHZoECfkwr=?E$iF|SWm)Y7FHyA@4Z1nI<)t^+GI(8ob0B-mj0J@pa(|K= zo`q&a9_qNFm+G=AJFz$K1eYEgTf{Af_=zW5UWhCRna?v}t=|Nja}7)rPIIxzJg_&( zlU$JcKVaU^|NQHOB{i7pKk8gPzE!kgR`u`1-#`B=pA|E{ASm$a&;Q^3mKopWZ5^HN za(h2tkt*Tx>3_Y;P97n~nZMuOHoqXl_JbiO;(iNb)V-!pf-kZhTK4^aFpE_tE1d86>fFxPhn4_va*c-@$O-0^Klz)t2o>%Z*zvMDWJzd5Ecn;y<%YM63z!a>K3 zt-O1ZzUtq&J3%yY0%PzAv#<>7d5l5xj2tqjJZQSc%yYqr@lIS@8}AA~rl;OV9?qWN zXJ2E=bs^TiAzi9r%fBBVnRkWAi|`5XXu1D8xb2pq(>dLSt;-clPv(2?89A(AT)IK!YOz6|!qL7%-@XYZ^q|cQ@e0v?)UZ*r((pwUIlxc6c?2U^l zZF78hto|@x33Q9>S^E5h)cF$*@>i%! zm}s-jmi)~x9qFR8G`&TyvMH2HK*}hYFKbHUXJg?f0k#73Co*0VVA9wA!yo0!u%}+M zr}}n2xZ;x$X?9I9+QyS(b>s)>m=h@7ANhXg1Uwd z;{!6xUrp95Vh=s=K(*$~hN&DKADA^;O|Koi_*4Fwxl21o3SS0`e37bzhp4iRf8(L4 zoH6emU+?=rAkA4MvQC?+;t~PGI9pSs*;c-r?PkkAJ0^r7IYCFKui+qw?Qb^R>dern}o1HO>Di zKXndx&S%ohQpRok@5$3zC(#m$|ZSI<9S)OYi!Jl()D;j#fU-v{})^$tNV0^a{I4&eAu`Y+M# zuvPq(IdA1x%&hzJV9}P({W1Rz-uNGQOK-w2raAlzp2{nmylu*|zM-PIhR4P4^@-fj z4K~Wm%zI)|Tb}5!Mes38aYb>SU|OS}P}g#HNAv3#wG%DJ8De!v4R^yE!*~5;6SAqE#)qFx~9npT2qD9on4F zr6e)tA7{B5d}6ZM1~Z){I~i6QJGMtRzhU!VXK3h{FZh%H<#PjvTb2`Ud)|;xh}KHb z_DC$%+oH>y$J}tk=RPOIR{?OfIUr8k{iw$_?Yjwl;TiQcd(G>>Uj=XpQg(_ z6ONfM2YK`CbY_rzzUi8Wyr({F z*d&l+Uh-36&0qeY@BC3G4|8#PJmh%$#PAT8f*RY6HFh4dXXFL`)<2Zhk7(xE=F3*I zNs~G2IrlabNjc@71!)?}%!>lpvK!{d@f0gRS(5EybLi7``wB&_m#-TC^69o)W4rRB z^{8c0>xqsl3!6imE<_1sE?|h7`LBHmNEeVe`?MuynVAWdO6(GrbcH zOe)RI+JzUoI2JrupD!;tqk;W*!*qM&1KbR37c|UH@OZFGOqzeNneoBjR)OsYq*%|K z>3DrS;a{_v*7InrY+`&CUg7-I{#Sy^lWkmXZfpVOc`1F*Sa}1b-wh5FU_+)Ld*5Dvp=|bkc7dFXl(rRXuDcMjYJ8znV;VBH?(wG)`+nNILnt`V}izZp)lvFoluJ;USxqfaoSImNE(Xlmo1D)EY~blYZ*o_|7vS zvQowL!3XBs3}^o5@ND?SKIKY%&Hr-;zQ|VusQmDXIKg16Vr$S4u5{p*WJhkizlD-md3_!6v9s|FkAGmeM#sEFDH+`oRTM+=7_RzJ4eL1zS?Hsa7xf+USd<(m&8ie zFt&r2Saoy{p3*4z%j@giCmGiE zpLA&Bpy{;y4KqoPyS(0?CzJ`g z@Jtd`)N55Oc5{o6mQ~?f8K3Z!g;|*S#~c2LU+FD*`mIxcKVX)WT)520DQ{ZSP4+D1 zhFgITzWk8CRK|4IiFKYxV$+trj%H4;I0F72WYORJ(9~L4nR&?^wrl&(ERfEQkO;VJ zuDqv~Mbe~Y&eu9%n7aIIgWnPG+I{5g&cYnT}> ztVmH17m#8(5UOBwL9&OBX#u;%5-0ZK_R3CtBJorBm=vr8C%BpAOzUi9+`5tLG{*y; zlP4N9R!nr`Js``$=Jw;B=aVj}orQeY&T{yk^_d{(T(aNLVTokITmhAM;{$Fp9g}=M z%=A7HbO*Es^IPIe$q)?(F24&AkL#CIUoez@l3;G^z-1qC@F0V>&%!XqVcqQqv3G|J40y;iGxfwYvre@{dW#G{?jbi#}*aHBsV1?rQv**^SATH z1`bmHCpc;cEM*H~Us<3y*U>Gb_4{}E7XHY{#*T^~k)=ExQ)Lw*Bb28It`nKEO<<*% z-uV+8@sqfv&LpHbt=Y!-yr?4eFvEL>Lsqp5*z8s`vPjNpT(ieP?hk|cF2~-Qv=d!y z0aYxm!YeKx;P5n45DL2KWF7oqN28V0wlm@(2b--m{wo-tIPsI?T$;n&h0Q-jCOuEw z^M690=AKZdzD%|!C7hkrMA%!7Vo9U@w!5srfspt)dA2{SSl{6?k zWj?dh$ETxlO8o^!c{Mk+Dd+yzFS%y5CWrYYdwJeW3CV=!q773mIo><7T~v6;|FY!Z zDa{)?RuvCeZgDw3@${H;;1oMs#&O{^z8iS~RtZc~Upss^c6h}(jw4hSVKm6MvAZb+|rbasNa{%lre6gx~RJ$Q-&PDjf8W;U)9Z`hc0=KTEH8laiXy zRQ66$yIw-Vf!F1OVxz+LMmEDpg;eE?2MlkD)lRHASD$dKEoM2VMR)fZk#dfaHf zbBe=u#}|9An_S%W9((?>>zB7q)m$*MD(pj+;)x!qlxNaON>3IzskQz8Fg2owXTv8R z!DSO_SNHe`>~_4p;K0xS=i@VC8zd~4%r8hLXtD}1Z`i=%ZmI0Vb5D}}r>u*XC#crD(Yy=j<(f{vG~v(!pp!`t$jXJPfaYH2>wy692>geVGKC z@PhK^^6$zsezywxINxUWsFblwIDLR2pWn#fz$Me5+hSHXxQ*EF{7ZB=Q{vpk8erKJ zk;{@I~-4B&=2Sg{XIS{?V;T+TbB}}WYA1GB~W`1>z;e^;~ z`vsv>4t$e-(-8f{lOv*9{#p8m28AUI%+ud4*k+LORrbjr<`3Jh@1KynqJH61uEX^w z9%$wyNCd7kGIluS8L{&u!@W;kanBDN`e47Muj#7)hKk0kwFpmtUYVrRJUu);DNiTvcTVv>@Iry1>Pyq=zzqsPv&H9pJSoS*@Z2ast+nKZ zK(E6D(+eVPDUvOnw?4SPlQD9NzWPFv?b3txkV6~JFzc`Q=X~ssW3OsJ`VV{NBl90L zvSl1(&9-QWW!2}AJaGDr<756Fjl34oJO$~7xh5HpnG*H4u%2N!wV~thS%vTeY+?%E z6s5Q~1b0h5$ZLMG_y2{1{AzA$6?+tRv+hjf)>N42Z;-}REpsQK^;znNd7%s99a>rU zNc`t7)PHsN^$OX_3C0S>hbKJ!maxCUyV|42fh+V(7vr`+l3V_8mc(&na2i$^Fh&S& zc4Sv@=uP^tDJ0{tbWMPgan4E8MLbO=+Z0~5F-9peia$*cM+UYVKDdR% zY&a&NVWYrqXV|DMa^hh9gaXEX4`WB}l8ndlGIbY9nBKV<{%O~r*j~Qtpe*-^#{T~c zZZjxMZOJ-}Ofpw?VS3}C zw#AXp!^YXz`f&Y{V>}VU%xl&pI7#U^=B+SxvVO4Ps*!+w(4yRXdsA&Gp z99QOO!;xvC@JW*U%a{5M(hGWJE;LB4n8#G!Gh@MKDV_;@MnzQ)B`ylQrY`FofAFiY z-L~)Yh+fdAt`a9Xfnn3F|NjM_N}kad5Oia^aOvCs|Mkq)-3ubKFH9`-hWZPj8|lhqie^Zu*j%(0SFo#aJ!sFyc7sb^Eo1pd`I72u_B*N-tGCU3 zaNAtqCELzD?JdelY;4yeQ(AV(&bii5$Ue)qeeNFqzDhTb^r?(4&66}QaNIa!uVL%R zH-oj6o0(Z>og%Z|1cQWzzAue`xZephA8wRPE)c(%z`9hFZG%}sE&G=5ub=btypfs1 zvtX^uhDQDg)(7j@+PHH9L{scva5+9-;53RHhvaWUUH}9 z%$dVhdll>*w@px3&L3dc%KOIY5?6>VbBZ;m&iuwh5;hx7G-!k?mKh%Stkl6Omy+6) zBiguR=Kl|D_DA+_*uuKdv9~nBl24ocV6)x=CEjVEQTW3WYq+DfH5YRk1UQ(B7&N8x z&V2Bc=Zua=RHMniiJxVvs#z>+4{y3!|K$jew*CwO?Yjk@5?97LzZEkF;dceo_ zhrc&7;#pHc;>;OWni&(7izjr+UW#ZCRZ%d0IJ1edveW)VUO+Q*pyy#elO%^zIu9cA z5)SfNuVB6Op#4Rv%PXA&M$#I=P15l_9p|jQmhxWWT6^}Nu|t~c0TX56nq%zKcopWV zpO}}wL2^Nxu(0tKW{yZUu2QDM@(((1^ju&Q$VK_2Ckrk${`%j3(bS_H`Y#lFOXK3~*a~(Wc-+ouSIuoL z!M8;A%F2Ycd0M zo@ObF4NreB*uCZ8NB*}@4o^FK*saM?RMtZGPkZUUg>ygs-{7a+!td$b!!zd(6VHZ% zv>*H*<##+{NVVD^_vB{0$Bl!R)N%qir>u9#`M}t*z~-C$BmEmM%rfRnN2u@kVyZ30vT0}N5xG}9{7IH@SxS+gwhE$ zjHinYwkGU-kix#&=KtZ(9B0;_NM(9e#u!lHbhx#Vu~3iGWKZH;Z;y8VC43YA|2z0e z^N^VV_a+^wOII69mno!*>--U%YU3ihgqh7cQ^Ks6TiZP0Uvf%A$&rMQZ5p2?Bqm(8 zwwQ0A@P|d(plM3F!0v;xE^Hn3GZr*QZ8*$#kX_DD=}bzK`MZD0X%iOC%?f*PaORl> zZ{;sEv`tyLVUu*ASVJz;D#oSd9km@LoiBbUUiwy_ajUgthT_MQ9D3agdw>1E!2G&F zyIkU*Gn=79Swnt(V#`(22}_sq{7-!O(7q;B{DjUED{;%ej)%m>&UcuwYwbC3{c@w# zwF}I%5`G<6`mny^_5tQO2N>-?%nO|GTSCFvSt0$;k3XC;uQph)@Ygu8m;Yy)KKany zg9jM;9bN7y9g?3U_RsLcC+^163TY2`EHk1RR`4{PU38c#c4UbiX(6o6oC;Va9 z#BqduZ3@HF$Pc0s3yh`;8a4d+Z=ZC4XOdcCs!)oiokq+7?ad4Rr7$n!oDgkS|MSQP z`G>r0BJ~VM6}|rnmdYBJ^y{S@6?|bPpY|b3B<+XeR3DxRn|L>Ek+%_GdDHWUb=pP+ z&I?_V1yKnNdOKNf@_HTrzu1OwHXy8V%U^}Nw13 z6U?ybtdN=DQI5Ri|9{z6W+!~*W?o~*l&|Tm5)xtEz-ZUOCwZosN6ets9ljlM=I{E=ANh@E-I9OGR?`e#&sbor|Np;o zxz)@Ie>iXEv%C&yl-jc37~>A-V?4PUhDHahpBt1nryEHsFf%U*o+7ER)aHkPRlq}* zNGG0)>{)l3@372{Y&My*fL9?yp?P{rV|s|B#02TC4?F(z3;k!0d&MKfJo7($#Ra)X z_X<6fh01>Y3x8k~T~J}@Fs;3DnuoL0mHz?f92vd|G_wAW|L`d~Aem>6&n(7EuiK_* z29!HJmfkbxi+onZVJ&4nJw3Jyo!?jd=2B#}O8F*gbl?O3wFxc1WG`7ZmMBO{Ui3>! zZ#XBU$jj4sha*alpR0Yo{XWA3cX;_$|L^EKCja8CXu|u3%R)+W6Hg~y@VxavHIrvT zAK#k89DT-1+^kR3MC@bS==hNTRmH#NvN;NAP19a%a$pxun45G$LGZ^0^Ngb`p3D=@ z37)YF`1ON%pCr?)?F*PodoDPtebALzU~--%x6;6A-K&<66&I#TUFdpiZ?Z38>4o}? zUyY?x4!)GQ^SQm$Nn(QAng7m{jfLH2GOYWsaBf(H&Hv_gehnt63hh}=mvoh;DAq(g zZkxz>abbEwL+K-jyw;`VCl;`%{QsNYAoGsHQ}6%5x#Au64_LXETs+WWk;5ON*6>LF zN+R>zD|~*x4{Z8m{=-eM!!E+E`AKcUJtkQj&M&9^ADm%L2^CiPBJlKteT9Uf0#`^| z{Ra~!&FKf2xf0fHV2qeid!g=9{fVy&5|kIbWR#Kn|Ib+AlwQP5X06*Z7xdb&t=JxT zn8AjD=Tz_mhNhh0pWo#-s}S1q2vo~!WliG0OYM&V1VCjI}PX#CKJ$7h3Nikrtyt~lQ> z@C}a8W{A0meu?cM^i~ck% zD_~<=@%KSv%l{3(=1pvz*eSTQrZHcZVO9Ioy%RPID>Og-FPYHn(_zE7o?9}3VVb?? z?4Rs6*}a>el>JM5DfTX&jV&U+voYesd-=54t&J%Tk5zLYbX!TRQnbN+TF*=bzS$Nn>Kkz%m9ahk(FaDfrOh}eScCpmnhJ$sUu8#&!!H)0NZcu?!p{|ioRml#{Zo}D@KVVkM) zmI*CqyZ*3s0WAegF3_HwbGZgABdf;^K@dDfa4XSG&oD*bbX5KV&gP#pE z^BI4RdIc-KdPUr}}*hHO6tQ|xoXxNUBKmcJI!IFtXQ z^@@wES{;sG?%Pjj-r|tRcKa~TCv%IK1yh-r_e^Rq;c;XRn(%bR2E)K3MRg|*2&kMr zaEHrJ_(G^i$2ozNorcOT4U9?ZDVF+s7N0!9z*jzDf5d_BXaBJtm#uJ-j{0n9sF>#V zP}Zm7*I)iqrXM1+)GjER{$F@lV!<)1FAPp>OH3Hwy=XX-){>LXxV|MZEz#jeE2G>! z1;Z1K<`e!NSa4PQ%!Q>J6t+8D;%7cwzvLXJ&f3FLDLofzm{(>@yezlmFpGEaf|m1V zcwYW-p0?Qd&}DXJlY@sJ@utaJ>~EC1(c{BoVCizMt)#}`C)b@shNFf%4j((waKfJ_ zqqov!IrE)`j8lz0%9N*T8tgxOB%yM?;L14-=1CF)b7dpyl3ZrFrYAUQL$u2)xPk%q-ae8XvR|{t5A{)i2Pdne^(W^V*XUB%7owA#EGG&G^Jr{#Pm_k!o#a^EIYw5}Cs;E7OTYfP9M8WGhf!rWtU-brc;&x=wX z<~#p4Y?>t)x6b*L!;??)OMbnNKe4ZJLhXjnj1m(LvFu^xl?b13dBIGHgqIDR+upLw zsCO(?u9(35N-iK-D8%ldQy=H8kF0C;7~`Pr=Fz7K`{QK{?`tAP*9~h^u-muxr;hCZG+M0&aHb-6`J|7I)Z*)c^9yq|DU9I?%+tA|(%TBp&$xUaU=zm!@@&AQ_ zCSHx^)BXXPoL}Wn{C!Zxuw@d5PM^kO$psJWgMM<|=3+a4dciJ9s}F};Qq+`#EZNhV zKWSLZcKjrz6VJQtoPEww#xt=!8y-z;v@p0~_5Z;h=3CQyZ=Fb%c$2W9^j~6c$_)i! z9eZPk&q67o0^EP@sIjrRRC01=N9=9!_`hKfkM`sP&B;9-yEs(N@yuQ0wB>Q)H3vVwc(PmUC^H+w`qe)iAkNP3>oenrt?_ss_3+6mH(3QxJ$oMpend}|)7 zUVDSNx1mG$Mn^vO7BQO*uRhvu@k(;~#;s$MSSq8;yyi^u5B`;p6W_XgG4X%l!!U)B zVMbb-6d%){qs3+nYaC=x^jKSQG|2thFy&-}kr&U&9XHq+6;5wb*sR<0;TV5XrGW6I z4l4`g|IRw9?IoWCjLkN%2`$NC-^rS!x2CAg^ohhot+*6t5k;{Vlf2+>^_R*8-s91$5pkHQWS89vo%Hn9ISRZ{U97Kb4oc}Olsg_` zdL;H?YQuu5V*md&PVZ5=#J=W3OV7JQ>v)?=$`WMV9%z^d8<)5VToP-MYOZp2>qQec(1atRr3V@2HPzP{~N!bWID^1FaF~^!@RFer3H?? zwQ6cE&Z08!dM30PpU5{b{{Qb6n-7By&x8#LP0KX{gxpO&2&gAIYdN{ZwJqiLSUj_l z@ttbh|BmLf5(=XH9&hcJhze}5NK9yW>fJIwv5?vG)dH^9_D6ygzDmysb0{x$zNFz| zeqz6Xx$%L+y^Qxf+m_~d#3=LYC>%Goh;G)ZeWBR9p-)_;*U(`$`~Qb$Sw0*%SHHyT z>;L);DTmw}4cD3ew09aR@y;(e6H&%KRdvG9i+IPrabVdHZVvr?m2e z?Y&IXxBYLGo5Ep#f%lc^2D^mXPyh7`zD?ycTERMrX{UtAW?s+s4ULf}4zA(h@%YI7 zO)BL9=Mw&yXGRCC7GEf7e^S4pC_`N!C~o1scZ@GvoYdHp;`)|)PS*A0ZEa1sn(R3;@?1iP)0)r;qXjbz-{}jV& z|NQ38+;ZrO(mIdU9lSAi|Nk+|N3bkCdjErSl42o`uBYUIujlPgC@`*&VLN(}|G}li z0?XbhiV+LU1sy(Fs^lL$l|NzA{|PM|_6FS3&L{jn`0$&9^;;jG4#wyIJG!_gU6WAc zWSX+OzP9T40iHc_VlmeY4|L0Juu@Zd(#h$vi*5P8{}VPa$XlIY$Ywu~m(Ota+Co1S zhf6wZa$Ke;PxvG`5wxiN$lN75zuAwz{{O#Y8<(o_f9Cr?+kecTWBY$YLJO~hBD?mY zzlRM}4kWz&)2x;+A(8M@IVDw1cP_VT5-lpT^> zkgBz$$2qIsK;cz##LNRHI4pligz+Cdr8C3!L9ShZ`M*6 z{`3rmO7SD?=Z`SoUbVq7D!`I2>v2=q?TyUg360@u&aaIp)F+0YHCnjlUz3XQgy@8D z)+QH+r&?CRFgxfUfBu!jY2uOxjW=vyewpxT!$k`V`Bx=w z5zqN={b)Ghe1<7>*#tq)7ynd0FveYA6II@#e3D`2_MhyzZyKzvJ}}oS^m5JkKf|&0 zY5a*EgC&RBd4vp{q*og7H$8QzHg=qwuGSH)z#P6o)m31s&xJ$cG3yMRzIhueifS2r zcKFsjy~#;>nf?CyLB6cB7Ju=famS{QJIh->UfawV6@Q@BjaU;jIVQ>?Ib+Mn2g)SK)U8t4YNd zDXDu4B&#RPo*=C}p-bpuA>(t_2U#o;$GJ+x7*23asQ>S1ZMPtJed5K_EOU>xzHN3b zIkBMegM5gg!zG@I5a}6ekr9>(zw0NaJ)K~^ZNY{H-Tkdgl#iTZn;^3!kXM%D7yrv2 z4q6}oKhXY@FjXK(o@3u9_MpK3?R+r~R<-{ZZr(9rOY48SQ%>m&nn2N%U=fduozrvxWN zFZ{_kjmNO^Zcx_;)Dt=6Gx@GCFW7>x71w@{Yw^?>;cx{qdcD z$-c(e{NoJl6E-xPibzTbMrS5GJ9y5Jsg=`0WWnmK3W-NJ>^mkj3eLK8z(ggc?$3{N z3|`#-8+gyf$J;e+Hp%hS6%MLp)J~r8+R8xsMOi>4$0~aV<`oN$sd(6{tFzx=Ur@%V z(cvhobz3d?U+lVCP2X3K`^XaAL^ZvQ_~>d%8OpZTvfvhjB}JmwPG_y0g4m!`F%Y>n89 zy8r(-SWV`P$u??WJL!=0;Gjar?}y?W)-knTu0L@vHegcvW6_p1dCk)#ADFO8J!s`+ zY*H4~4OV{Y%l05aXhk4@R1uH&X$512OtGN#hi|2Ccw4_=3lm>Cn}^JSNfN@suez9n ztp6(%C#3b1{hKMdfl+M9?H&m>ONlpg>(zc_iHotRW&GsxzCPjGx%v%1@*jlx3don- z<9L!L959);=pO$Xy`+Y1>@#Kru(vv}NXNDt~}EK=JAQc(xy03NH>QGc&KrX%}Nzp!C{4MTjrOZiNj?=>tdRH45L0 z3JMGkoK{>B_n}Ow!;t5MaOQ$v99OobvTeV)Aaj!7tNOGPjV%i1O>9AqU#(Z@@|AtB zU*hSWVbwaFe}fWdRLmdcLhA$n>;D%ntBJYID4~2P`M>Zf{Rs@m*L4X>1w46Td4a=B zv35gOp~5GV6`NRZp60QgDS7*Z@{!mL#{?HmWD#ONFJxqJKstu!g`i){@(J#99ZosU zRTtpB-Og{!B}>468+jq-K*KBdh-TJFff5IMc_s)Iw4Puv zmY%dIF|Xy~1~1{HWAz2j4A1uc|8R~&nR#2ASKD&-D&>Av3|?{|LG3f z#BcTslpnBqJYjFogJbvVcVtUQOt@sJv1Wob=YkT(uIvCtmhR#SKTo`4yUF|d%OR^d z3Y8N?H&`UQbhAYK`18MCLMPGTWIpIVb%uZ+#tU_?vd!e?l1_WEfcr;+q1uawp8pko z2P-yfZn(f;8l@=9bRo`4En~UR6TXgUL1UGk3ywS|K2@+4+;Do+B+|CPh}mTGNnRNN zhS_{tHUAyYw28jr_}}EB@R2#LjxFxd$pZ|pe>84y`_p{3&B-eIL2$;x-#ce6)Si~W z9@oef7tkzWB=uW9rl8qxe){tUlUa(H+#6X$FGaL23(RPLWFO?nJ1spS#o-A1q7#3Z zY%X-OS8PzMIj?VV?I79Cm$9*e$8RZ2iE1)ikA%H}1m%=A24R# z(M~*m$9X!6SSI!f{?1GE?pO3~SG1k@|G&UgUX48xk_ybBCsMg|dYz;$9*F$^e}bb5 z+mB7*E_MI8_ulJaoMo<<`O)5D-i!sA;!Bemr#Qy>aTJ;FVEirrNIYWsJNruu4*viD zzi?WYfVRL>My0Dxkr{IXJM8~EUlvr!J^V<{^t^FWj3kF&?E^OEO~n(=HZ2K%VspA9 z#a`uWlX5TP&O6LIIg1<=*4VTzsbyR8h1E{`iG2zy+XL%ZgY{J zWEQ}l;*i8qzTmj5QtiP*%t3vQr$Pec*mBP^%6~fEbHk3o`}B#g92U}!TI_5t)-02> z5;K{F&htF5y}aO0w}gfZ&$LD-fonV3ORF3+MW@)+F`qX`eEcAZ!Svq2X3zhM@7QlL zdHZj8!&9WZMyFxLQJwP%zYav7SWwE~VV{vIxkB)-@UEo{Pe7hzzbB!PDQ$VSdAput z__PCgQ-1L4-geAuT*-R;VtvNlLkA8t%whZ2LwySu$EWr`bQb*YV9byB%f9&ke`mP>woKSm zGjz^NWSk!Tfr)cgc;nY2`5(4jz0WgePRxgWQfJ~^W}af0Z@~1E%ZP*X&O6qe-3NbJ zZ%AR!T(1-s-+0By>9xuQh1d2KyLl$5Cp61{_#`Tpa$%W-uyIjzBjde!4ZhF*Hvi%@ zV`zx5Y?vwdkKueA^Kq_{3GI>L*B3B~Rqpu2Yuu>II3YuAZvg}AnRuIMrUTE6f`VQc z1h6PH1NY_sC(=0_tdIHl z@SNZconny4QXYQ5kMZ}D|MfpMdASOgzI;%6~&o;rZ$5=Xn;WK3l*h zlM*KRB2MkXPNoIb3l&fQl}xBhaItrOWbZYvp(ICe^PCMvoYUMKHy3XZ)f6yR{Mc&K z-5QhDa7lGX;z=IM?@UI`EO#dzWZ2F8NB>f&MMC?b&r)j=&mL$1&E{%k9OJqZ(Kf%H zfzvi1qRIM(Pe6UM50h!de`UVf=H2rdFA21*b!Z6P@?Z!1Qo##xwm*F2m~U`ya1@V7 zXL_TPQRJ+}Dj_kEEjuBRf8_y*gQ=1#waq8~e{j_Gh%idVSYPp&@#2rR<)Jg~ z)JM2-7Yi!eB=SsX zaDMf{`HYL+bA`kODLH1&W)bI6dPii==OQteT+aVz# zAyDTqB|AY(Sh>PluxQ4iQ&LZ=n9Vr4Jgg^(Fy6a;>OjK|x5*P3t1?tn<{r*XZu#+D z{?et;2xY-E^A5JDvJ)cJUql-9Y!FS_P{lDz=-@%tPWBt8%x*l;(dql=c$q=NCV~0# zgGk*M2lR5f8P3$5sHkx~XGXL&Y)+zP}+S?m%&Gb3r z@pBdYuj*upO9(dg@U;L^?b z7m4#ed^yv=`cLy=VKc=844R82AG{6r_@H!M^Tb~% zw9c?{^vW*bMSPEVJ8b_e_Qp;Sf6zXq>2+AdZJ}9@6rM5} zdr32;m@VmL%Zzq7#2#kk^r~)x#Gds`lbXVWAN-ocxop}*M!{zW=0;7~UK@VYd$=rY zvscnykk6iQtyPYx!<*Shdo3HI!!u!Hjsq4BH!BygGj8A&<2mNY5b(vo=zx&=lFjTw z&89w*4`jvI*w`u#^G)2C&?z36_s4zK#`YO}*N<};@-BHUU!tktA)hl-PD%OjoyHdo z3g#}72Ty-lIFn-O>zI7ht0pc8L$0l zJ+r6z?Z5x>b>}sXxC>YxOfz=+dxm4KVscW;`G&?nTymi;Wvl)v>Uy%CY)tc#n3%R^ z!e5@v?0fbLTU2rGn$*|ITIm1P{(}S8q798dg(v{( zgBG%yc-*yrAQbcAgw7gf&Rg@jq}L?0iA}q}#J}l{_@;DG8LplQZP)AFGLogNF0|O( zW)Ei%;m-ThXvOSMd{F(S)8S6RYYZ%{FYP@XdAOt_7IMdhHi+b%NL5m?3h-X||HCN( zqZ`bVQj?OB8s?s7m>tg4**N`p)AZfW(@*?u&Y7E#)WoZ2(3GFZV0vcaV}>xsM(Mo^ zKBPLu`f+hZUpOPHQQPz;xn)^$T86UhwH@wqC)uw0OgP16^!OA@uf1Ew4hJpM6}$gA zuFGfXPjD{Q)41a(aV@}IrXvpC{j`_u9X z^Cc#-wJFSHzTl&((`(Qao~yvd_fMJE%Hfvr1*T?3v&X#L>Mn83Q&V|(JbD$`*rqu0 zU-`w5qUK_6QS0!RujsPD*DP{<^5y=o8v}2% zjNPdtADAn?$_j7rVcjWe(#&VIq>E8AAt6)1GT*r2vPsI!H}mZ$FgirYIDO(t*~-7; z&p-aiwQRG0GR~dJ^oje;0=o!H2EX#2342($qzi6-d2hdHBZrrr&jcgsDGU#ykIhif zPIAa=T2s@|B66etzy{Ycab^?!L#JdT?3$J;Uf9NZLrY^u6dPN_4aKL$YD<`GTa9zxeIm@Dy2S3R~1S9A=vHbOQVFg)irD&N?q4&|5jtJR2O-_&1dPJJ`I{ z)y{m2!y*4Zgb?jAS+bH-`5z++MoiQ=jC%Pn^42g=fV7bLK8` zx!uTUSHW@m{sWsI@`3h;UkOfN{(q2-c|j)I5;3zA?Q?n*o*F2ZIEY`$OK6?e{vfDX zFo^3P`}2qYc_uKkPgG-)oaozpwb;PXW#>ovFgAx(AqBtNuQ)PP>}^q%SKwzlz|P?C z>O&^e$!0DGCuYVET@6QgJTe3ru4Tw})YyV%7hY|c(s|3mb&33uO@0y2g|BtAe3X<( z;0-=f6d2IPezMtEcZ)Hnc8&mVyc^pI4V5jISJt@P!;ebO`T zM~nYI=#stS+46S2OJ0rgb56C2$5Lj8`LZ`Gc#_4Ymf_5HE4@`Lr=!nq%|oU|f^&`B z*k(veF8tT_r7FOh`@}|uBK@2Irbm8kY!T`#MJr^EtlyB@bE3B@K*IT(_rW`@88wY> zT4fB5a^;_By2Fxpz~JDtNW%l{$_|enOpFOQJd;t#Oklqwmls=vgMncqx66dv5({Oy zC+tpSHSXYDC897_i;XR!F5M+7!q8DVUxPQfV1dK*g68xU{|~Q!%@oPYom`MCb8BIP zS*7HJ$KprY&ej~}N{DFW4?WQ!)Ar!li~s*MM8%mccq9&LizS@(m=OEG&q8Bwvo+s> zrzI0in1%i`-_c@_YG}+k@1T?1e6u&>jPqr4=AwDcPZ$F}i=>DNFEL9?aC-mY5S#S^ zPL7-P23t7{J*<)(UTr*J)utf+hb`_tN7N^-ee0()R!-mxjBd0}{jZSDY+&GMb!&qt zL(c^-p-1);PD>t~t5dM|AcwZ_KjQ;`n7nVF$dsAruK4QUOX0Yk#*2;!GjDO^n>#DH z;iKZeR=zaD0}M)bf@w-;n9VyRCQ3W;Tv)>R@`S;HBfL2VOokIUPICQ!_^x>;V-ClX zgq9PA2hOCrbb4QLW7r|V!m7`_CZ_qU)cVYlQ= z34yO1&$^7<+*~Y~l8g_2yZNuZRbHjgol}_Kgn@vcxWB;o|& z&|(&9n0nfI>u3Ix$`cBfeBD&fX2S69f+3HbfrQon4Xa;CD9n`gIe0G9DNlJ}+pT&Q z@lH;AeO6aP&jTx&pmfLX z0Jexow(S0<9}5n$J(*gn@cW8gg%^v}}8ua9bfUmEnv|iv7ZNeV0B#EuX!P z4gddNxV0?fCZicggAoG*Ux}L=+a12P8Ha2RL^DaSE9Cd{F)e7fQf6Lb%)f5Re`PD? z1uq!i%QnSbX7={?*}%rayyIN@5B9k~8_&OSGS*S45}e62r+8supK0zt_Rymfgt)Fr z{NvBP;9#U9yy!2Z8T-YKRvrt5Z$A%8HTP)zWJoi+lG?N3l)R~rMBtH$*6I^xzW)Dz z;#Xz$q<}P66Sj$e`DZJ(wHPudH8e7YH7I`4Uee%n=9SZ-rkRX)I#W^_%zq^I>P{$5 z=vCQJFR8G3>w~4o4>Zl5IhFU)ne?WzXOaRB8P=Of%zWUzM!>GAMgN4)4F(pCjD&B7 zN=HA}XB_4X+u(G@_07q&AN?94j=v6g+a}7M|386?amjSnUHx)b7+BhwHwb^>uPS58 z*&><7u3_tVh{f`Zps9?q4amf$g%Pccp7IOYbhgZDY8Tw{kt5cV;Tylnqr|ENUbhbq zIJr}#`ISHE*sN$g&EdVd!-Q>JzyrTu{O@HNj>RTqa$oac?YBG3zE?IO|qP5$ta84H)6b-pB{l52Q~iG8IYkEKgTBV*W0BZnCernJb& z*B_Xx<+efRkj#YJ{}iVhZ}{PKhU2e0S9F9WW4E?PI+Ijg&xy*Zf>Ck~r#Ae*V8SNE zvb$lTpq$!?UfGCEu1i=woaN@6msoh0V}}C$j``dnvf5HdW*+&?>H$S-4Bq$a=Vbjz`M$4rNe;Cg>2UvR4HLXfX zaha08;L2C|lerfx8ry}1kMKp*xy)d;j%V5!%XaMr^HSc3n@5hc*eG+Z^`3C5EMQ;T zR7(TvgTIeRN=is1wnrN(o#%19q-OT{fAimi4D1~rTBdwf;Pj|bV5?S0N|@BhIP0T> z?6ds`4!XIi9XViXyrqZ9Qud8M+lip)8<%3#o)~dT)hm>4xXPli{lGT1hH#F*|Iag= ze&2K9#}EGAm?wMAHHg&zzj&&AhF!#RhCNGprPwwYanJFWoXB=Jp_RKtOW@}lsR^MI zj3jowY8Eu~;GM+$yPdOezJ&_E64PJ#lB--c=bNN|PuL_`cJJi>{r?|i_6shZ<2dEw zhCY@xe^^#FFV&5ZWb00e_$AeG&i+Y`at6=BAFYiUAHM77a7!~Y@3sE_;0N2Lw?os#)k8DCN#hYMA!;zv5Ts9d8(ydS~2n(N9w=Cdwi73mnNu2m+wZx@^gQ^wq?MW%-)1aiPht}&e9Dz$%AEC(A&B3u zfnAHo=)d)c2dXK*Cr)>DlJb}!?2*W;=T=cIwRJNyxB7{be=cOCy4b1ky^0TL7V_cg`Aq7W=zmBa#N{yzLHpG@c;k+ z{^SMBMj1@6W-OGO_C>x0AlfBK)be8~Z2eGl2pfR00H zp$=6J_n1xBDJ*_?;w8IK{scGMMLcb}mmALBXi9!z|Ax!hWnM$*f&~W5&-EYNeY7A~ z?!gY$WlQT9sBZ7+x!@%rwEskaC^Bcd2UoEn?n5`7$1pQ99>Kys%b72$D zl9%$ui09J1m*k;>P?o5k^;{kPb$_NU@*F4j$qX4O1i!3&JO+E+~Ay|l5h zMLgw$;1X6FYo4?I4?ZM1@Q5@xPY^UZz_hKOaqArxR>LL1ALcWbbqFunlj_1^&8!mZ zaECjW!RWxHPxTefJSpNjcM`reO|SajzH6%B#Qwy(zx@909iIfY$a2luC;9Ji`n$we z3B5Ka-dG-qSJ_->%UX8KS06HCPd zfx2dfl-B~xCeDXn+XpBMO7Sn?vppepK}YJzm#h z)4b(ORxbo%?3qqq|G&Sk>F|6(A=e96S$rPsXqMf^Uc{y2Z)m7Eefxwv%-*{sq_;cYx!kmmASPKNKo7v9^&{Z=!MpI|u6zrmOx zp^$5(m4hPNO(rJp;0YEL48QDE?kWEJ%g@KW~<|eXb%shLD$1<7wnal|lmJ$bPn+XSwFr41~ ze_`p*`V~nX7Axj3@8)=;=uyf2S^CKW#~C+$d`>*&Rj$}7!hFSNg3Owl<|&CQYUL+% zzW6B>&!NN?EwS)jQ?78+wfF*eM<2zfWehdu%nd%thn^ceapN{CUEs(N6)Wy>MS(&2 zFFO<4VbR7Hg^u^NnHHMbGv}1>RzK#Sw>IJTw+Ti{YZkGF-|Fd*)I9ORIOmGYCU>bR zg^sM(uJh+VST5OYB)-C!KWj&$R$Rnk&aev#>2?L|oL9E};m@4Xd?q=?<=h5=_D1Q_ z3sHaG@8AD{kK=_&;Dkz_j9%^=2|OCcO>cjnZwUE#IPHLg$qK=<2O2W&I6AS_%-6bd z=Kuf1xzZksnXf4@i5fj<;s|44xO@EEF~+;mES&W&iJX}+j)%l1Iwkx|Z8#==M(=~1 z`UM@!FRzx#9}u2)@cUFFN2$>I1HZ2-K5KZ)slj)9F-NA4Gn>0Z(f)>V2jxHCjM+^d)jQz3>A(`+Q>Fb ztvyiC9J1lS>njcIwvK-qGk$=IQ0F}f%`zRQSW?uF$S&B!AbrPiNj_V~a;YH4h9{1< z!ygoK-IeC)uJy2LTG7hFtfP2POUlDt?A`SL6AGF?C@wQ#_WzmICeL&1(1Bw|4}W0a z)gyV)(QS#jM+C!V0p&HqY%5C+rWq;hmfz~kAN`W4Q(eV!#YKbZhwq#^(Xp#XEJZ)Z z-(<}_rsu^k6u5l&#HOEk_P6;Nb4TceBKBo`>*Urn3citi62<;ZE?`d+-?HS^`!5() zM*Vku%p%m@(J1Azk9F?GhAr$uamy7iF{vDGIK*PO`m4O={f6}A6Hf)Y{5fp3bHYAT zmHSOc7Vw%pNUVIY=Qn?nS%$*HOTo`J!E)81cZD&H_F zVq4P45YWzZt39cqmD}Q`0kW; zL{dSLS1fPAo-+qH;!@eQUjKK>S7lrp>$YM3Oo@cm6%zlPw-`B9fBnCZ{Z-?iBc~2C zYj#U2J~J*ZSahxTgVDsshv(x@WIj|#PAENEzvPqnEUtxmElctXB-z$25jbREyP-&M z%O{Q)^8<(GG6vQ)zG||6@btgWgFcHlry>jPa;_>~P-?m6&wqA*XAkCG|0NH!R~`Ih zx}v7J5A?AW+&4(MEyK(u z@p5jx$MLR-jK777+Z0*ZUZ1ho5eQ^|7SKFx%FX%?Keru>8yL$cFjyB<+ApecJM-%B zsp5jUy;t;_udq(|#koZO4ja?@CoNa}Cm6LhGL~%BN-5;8J0miHhP>nKgx6 z-s%e94HxPPJ56;yTk!wj=`DiZ9}LwmiU=3PtDZQ2!kgDI>tECNfaWiUrJQ*_ zT+{pUL8BnKb0Xt4hQH?-8aKF!?5O&8z9H!40Vz3!-wAmQ>Hq2{95cS5JE6fL%IfS1 zhG<&`Gtib%|Ln*`6vH?O=brptCqum$Fy?AM$SwHBSXbJONQCJU*&V+ z?Uiy5NjV7oUwp1-@v@i*cbhU`1dcbNReJqp>^am<*J@Ocu? z1v6ddJ;nTa2b{vp8)j_q;@>ofXOk1dJpTpH8iEzSOfZ}vHz8V~S$xBmQ!I10{yom{ zQpVZp%7QMQiFW^u4GwKjIB@A!eMOYp4q=h1o)2!C6_y4XYi20?WSgcYDWM>$b%Jk( z#EL@Rjr>CS0{<7Ti}=Z(d%#%Hx7pB1`YcZbgG%jxc6Lq|Sr@@I!TocdC)^6WY`LVk zcaoXJzr{CL&Zql$$hv0OG#-)*%RX@T5W`7vgZ&0hKMQ_KD)I_H+0@g>IBoicZ?B9U z9x+XnPfS%+(Qi7UnAo%HEqluM`V4o;Jw{x2cCy}N?6i+KEHUT&0jCpl6Ii5o@~|yc zQ~MDnaK-j{&jLmdw+lQ*#>_d(rixa~w|=oo;fZme!rYLEA4=0s9)8pKwED>>_KExn zPi>X=%wdUN&HakO*?P_bgH}^6$HY@yHX>b&ntv1%`67QZZ{`+juV1*GA zljRDV5By}!5PV?}cEN=$;}U}k-zo12+Om=Y%mO_dw)Cvfb_nF2ototE>dm1~>S@!Q z{C;1k`e2{*P3n!C+mTmVH#Gn9cvOl^`ra_N;sImJ0?AkQ3);TlubRZ>FX z6F#vYa+|{2QQ&@M>x2pyy~PLLv4|fN_`0Eww}O@NMDu^i2ipE_ug=&PNgj1jH3(p5 z;=4ApK0@;Jk(QlYLZ&DFC-*WwDP!8i)M8Oo*RZ1Dq~dka7pd0F$|(g5VcVLYOuWmb z9qd>sf5q<~XG|;0C*~D43{UG%REBjldp}&wCaLgM_k`*OGvybrD&5@NrZmR6>^#r% z@~5#;(hqqf4X%^77u0YU%I{dnW9iMhYi<|gr5fc4O_GHtl-15Fa0#q_{vcP@!;mX) zQ`2l?mmKy3&n23e84S+uP?A^kUtP@T@a(^8L8wBGK*Pkwx&#$IrUos$fN4#sX#p9| zM!HLcSzpT>5Y{%aa+oQ)Gq~|Z$RVll4J~~#^%El1o|Ld#R`AT3>lnzl&g5YA{)JD^ z*}w2ycwreE^Ao9M|9MV$cPX^WFA3y5{anHNz`JG%-uDjn7$cE@GDy z9Og}AYG>Orm7`E#jUoSM(KQbe6IwKyOsIlg26dz?XzgW;^wzxFc*4Ss?D{=c{X z^NsO_=J5wk0ykDP$7mjB$x}CS@|G`PZtdhubz{mg-{6qacCPDy)zb}bnlGe8E@a6? z9Ohjjw?&Cz%PFQS7EDhaKZMr)S7vL#@fMk%SbKkeeJX=4Co8YSfj>X~+pn3()#+Yw!%ni7ij&^Y2{$MB zasD#OWXo7AT;pW^VuJRHx`@LJbMpT+KYAh0{3eGrLY3#7QqP4dA&Ha)Y}$v;{$I$P zu%V4XDfYl8fgU#g6a%MIyl!q0eW?x4=sC6$r0r{#5=)JD<#wXK!UU+qQsxY2%-xXL_n4 zp?!CurbD2~6L(4MuG&Q%1eN8u*IBg!EOzp;TsTKqp_1BKt* zTbMYfv_EX0ro{W=z#V?>>VgO(hetw5`bT(sdOE5&rsO%cXE)v9uu|v}tx~tCP?L<9 z*R(C`fZy^q-N!7v5(lJ0H*A{SDY@;8%q+LWhrFFdY!Ov#KSj&D55&Llv9Pw5W`0wp z8PP7cWiFdt^^pS%>lP<$zSLpE#3}7@leyPBqAJZrHm7Mz;Xy6Qgon)*iE^{*{x|ZS za*|oVvHEc0PwvVOqEGlQFz{5I77#AEz_vo*j^ST^&&3aZiC7&zc7)}m_y$In2+Obh zRUD#g?zJxso?_L&_{#hVW8MYJVgz1JC|BWoOqHljLFZ#^?nSC!iBU|=!c{w>2tN#+4|8LmF z9VF-Kr`&RhM>*(T&5i9><3uA42Jb&SJsz9iY)D9BF|}6EoWz-F zCS@sh;WFc$rUcmVA zge}}F3le!J{MR_WRPv!ZQ*-TMj+6g3JpI3chr@_{r&GIV%7i8CnL3Sk7+;zgFD_G& zOq69)V>>a=rQ^0^TC;S^0S89i(w5xk46UXoYHlo4nQ*9&v*-X9^OGmR70-Xzr~DT> zT<_t`X0n)(JGh|WFZ^8RbQyRDDZfKcY%vd z;7-qHUh6+~?{zALUb zYizeRsWm?IStv!{*yEr5p2HlS!Y-_Qy21bcx1V=dZ02x*ef@%W=?+Vb3wn%{vSK}E zB{}Ixw^j2A3HJ0Dm@9m;v8gpux*i~4=D}y$bS^ORMo6;U3}Trh$XWI+aa~4|CZf<~C=j|6$K}W;%cCe{+l==c^CR=Z-V3-No>eRpk2y-6okgG6I(m zJUqbQd4Olb!N88)2fnIYS%2aj<8n#24mX$Q^98Lu4|Kfo`S8FfrR;+~^P(QdpwIIe zC$TSlYFc5cobj7ip!qVpurjmZ-1-?er#fzuoRa2maqFWDe|X89=wh7&5kc$p@cFdSgum2hfh{j6|9=)egFc>^If#s?qy zQvNu<-g5ZX-3`aovl<&R5}eK?G(0Jcc;411cc*}J)Y3iphJ&9g5!%4Ec~>H4>xnX$3KT5LkSl?_XY!(5~hUS@CbJfqsN?@&5DJ*nZFbd$>x|{nW?Z@uvbUz#6j(Vawnf{+>y3Qw*8)Zhm@@u2r==cPDWk(L)TaBGtzGzn<^2ZZzZ)by^z`!B^z`&T9Js9i z;A+)^9jv{1&X<&q1ROcTaU|x+mL7?Rts!A264_t>SyXmT;rCz30IR1y5B!)@&TGGF z5PikP!j_>dBQk%24X^iZjpa;Upm^o5V2wSC||0;B3O5zsG)Z*e}x4WA5)BpObK zE!ou1naS4k(O#wY;H?!KzA$LTJ3f76|3cwoy^AXQHZ~jQqa2-A;7-H7Q zF4<6aaNF00JB>PQp4lCaY7w`ZcJSZQbd`GIaPD-%)(aJ_OZeTUT>dU8k-%KLp-4<~ zuaUwb{!J{hMQlttvsq5;sej;Snj$LvW`Qo7n}=1?4rapz2RL+!4{lWrlI+{FiT9b< zlP}D=z7h{AXA0`hZ`N&m$`kRc^~k0F|2J%5o5{np^Q(4&foO`Dbir%|adUI#3{~kB zKFl*2r2aI@mYn9${q2x;;MBGM7a9#eJYZGXA(6l=sW98&Biq)QjPsT)d@8fUFWqfQ z=Le~F!Ln}NCp>IB><<>QowA?6$nvC-_kx$OTSZOswm3oNfC*NmTRxw6Fj;V1tKs2= zpT}qXZJ#P?k@jCwV!|siri}+rbj)0q$b7%2$ESmF^ZyO!^h=aDW<7L#DzL(b?Iq(? z)(4()3DGh!`UVC@3fugZPFc;E+w)-;%bO&&6rosNi}%VR1_y3=_k8%od-ePYW`_S0 z*<1b_3vdZCeflEFqEN}e@GL7wuuB{5u!U_8!d&}`u3{`f%VOZ%MlCTkiyC8jo;-&(L! zV5gI-U;l(IS+mdlnI^_g(&9ZISQ;~O6s)8Yt{WO0kmlHM%wP>O_eJJB0VAhxQcY4z zeI9iE(`Wv1B_|+R@Qq!|Pah9siwSPZ+qUpo`|w|L{Ka0*z9*39tIC=BGZ);B*T1;u z8Sq===PR`cceW=o6XZM&i*5WPapy-n8;8v~1;JAcg`ewhB}KYYknWT|1_z&>A6QZk`b{)GPoixx}fM{*amBnti| zrZ~(xn9gD?x>Jtjr_`mJEla#_I0kOm;B?NpV~6v)#R?DG4499!U(M|(;psN+ko0*V z%F^+LS(b%4>+k2^;><7Juz&a$xqwN4_Y-$Uo4kyfgXtNa35^LmB$!R~4lwuxKL!uux4VHa%mHHiW?gn zn;YA$=7;7S2RbHYI?m)TOfoEDW}U>9I8{ekIqPw&;L4`drm`mjNfRmB`uzL*nlJ069OK>OBXey=OR3s|T9$%}gOC2(Z>dO0ap~jF2MJw< z2(Xy2a{(W7&P#I@Tg9|J3C$V{E;PyPd_LP@RLuAKM5B{PihRZDGxZVc8Vvp^FO80v z&UR7K<;)AmKWr}>HZu6Txvz5$JZlT)r9GkG+NXU-J3y-eZhb^9fZj#pAAE!ff# z6K3Sd&aJSJ^OLc#O1hEKdatG@OaEUus97M%{q~JB+kJ@#KgDX~*o;#e_~oAaocXYe zG0g73A(k+`KkcQj96g&k)67!}BFHd64ZoE zW;&i}KF%zx%)DqPtA7{Ih7FDDA26;?Zkcc2G;f-uWZ>&4Hj@J!XZtry=~^du)8@vh zx&Qx9wBo+tXRh)0@GG7T^ZxVjOc4GeDUp!Y)V=fniS*!xU@PVfR_+y_4;?ynh(YR) z^ONuu$%^yX%(o>luT3yscxgpm%M;TZEQ~7pj$!40-B+4R98Ba4`p#cj&Awv+do=64 zSqyg0j4#|T%&Wh^@H+oN8TW;rH}x+f`4?<%PB?0=!`txYC%^4x=AD07__GWQn=adC zY?LpW$))}N!N*e!zRxf0VwkcfQ8sGB-2=JV3j7XX3JT{w{`~uwo0(hs#e!&$*bXZX zCe8PWn%%qR{;${2SAQ)pRu4*V%uAeiRp?fS+D(L>^ywR@WxIj zo}QkJ!t)GgqfeM9Gk48gV8!Ywukqjc6Yrv$AMATwxzzYhP5r+xRA5a{+fw5hHy4P` zSy05DBA1bAFa4!PY=YzlQTLt;pI8=&KPr3jg)8ast3bDo;}75Jd)TG4Y!{R?{L?2U z#$)hVaB|9m1C2YycltC<4c%~n<@@gm+ZYd=XZqp4R)kghNBhp7_RPC>ODuS*$h_uN zy3-XegZ<67C-qGD;aVoOdE2%;=3hLD%$}X%^-o!ix@I^sTu|gYqr&HM!0j>zAB%xO z4RJe z#~!i4n3>y_ZN=FQ2@GeqH1XYIzR5W2=nuv>Dosxg@D?XHOKv$MzwIr9i2eenFX!*y z=UEWwaUv+(!;_)Ve#v6~l^X#TcDORNLjrA71}?D+d}@Qk?!S-db3);C$%$RDHwFw$MKFPrPpdyJW_w-Np%s~(sLm9F|dFcP(T zeCk9;J;$G^Gy74JEAJ;tK!v|L-Vbe|G)8y+d>Hgh=@tT0$otuA6ZA*1@{8h98_^%aqbM z6Q4E8@Ex3Bz%*|))0>>e?Gqah2~DY=Ib%WdmL8r3MxuAv7@r9TSpDbQW684VYiA?l zl}MJi`_r0Mv7c;aKk~1UZK6W@+J@8Y2?`Cjq!UUX^nrHiA7-DO+stF<@X0#ofXJ=B z)P|+p5kC%uwHp{Iv56|YQpv330w{9{3plR zJv}f_+Lb-CEQp1Brfcg&i?4x{sRULxxOte z{3?0>|2of+X86RpM#kw$c)$sxrtPNx{(PI+C|XgfzhqAHl=S@#*JF&D*L`li^;2GV z{sA@#w&>^bWo7I;tN*cY`pn<8f4_&UDVr68o6_5cC*f&r|2JMcm}(c6YnspcJ(wfhVf*9PiKn^BFfKi5MC1Z=B3%bmGj3BMmX(2k!7$JrSG2 z?(mQ|`Yo3nLxal^dp0k2rVpy>PR$G(j&UnX#(v$elEbNBc-D9VSKB`?h9_*CNjufv zq?CFbYi!|K^04tl)`tyAfB0X%H+B+wUSDCC;_`ZfGZ(+d(|(Huy^OaQQW9KDL=t+H z*`^#bvdBzM5pQ8w6MXDQL!87xBi2J_d3ZKVbe<6P;pLA5eJV=?e(}%W>v)Y_lR-ds z&j0@t54SQN%@BAlzvbhho{$Fz|8T8}aqQI+kPqQ#@_)d7E~ViPqu!53R-PBDtRsH0 z_A(uonx`NY;?W>wv!Kx=fSGs8a$ysL59~J{q&?VTjz4`yU+73@4_3Q zEl#axKmBPw=X2;4lbhQSo)`5?x}=uy85MMTuy5#KFXwQmYYICs->#me+(O}HL*v8G z?hh^%Ca9igd-J22joCp~DJLbz^tGQ?V`|q@#DYfOCim}2c+YVN5?FAYv?dR(| ziW43l`0%Hl-Go_KIm@O&+5t4=zufpn1Cx%u^O@iLTR+5_S(r`-i!ad&$Z*<-? zT>Z~;g4ftZ&S?v?LaKnUurjlfltQYohC;&T{S%7VCRIo(GV+J(nj=>{8yAns4h zDVLbVygDivr^Zj+TyI zFZ}=DT$NZUIBmPbN3LC5-}Fna{Xacj|3RNnMgfzF0E1U?%$yjHN)D?T3~OKia}2LK zaLSN{*G8Igm(pwblBEn81svNxy}n<6B+T}Sk$_9Fi3gHJ76uPkCe$?D>1@1t)Pad%XZ4Eme~$N- zerI5?SkuXqULf6{S-{U^u#oqX;`Xls_gr$>6`%7y+0t&qz>v4xDcs_~E4LX@YA>EJ z?TVdXBv-psC?%Wsh@V@;S*B8{MRKiM=1V-tm7LI&AKzf!wxKxTi?G1Y9>Hv%MbB#| zD5-5ZC^<{8+P>AZ-C_zzW=vt$ z(J5RX)Ubm^EN{aR2JJN$j0J=nC)!V#yW>iOw6z0kPR<*RdG2d{6pYgsFm>`qRW?SQ zoG`Ka$xL=OHkZdNDKbUf{1+V^-m&~?51X~Y>{{$9`~=^?j7zC=JKmrW*{ z{weBSW&6n+IKki`w|;=cqPCCqA2#`2NMQ7kNs)KaXRi2fd7^hin}&w3(-)^n%xgf` zNH3YlBAV)ucjdqxhP*2dk2yE}m)@D!bSJWT3GarR7y9^;4lt(aE8Fx;oId@ZbDmH0 zog+MvOgwUet>>ONTLn(gWn8f5(|i7upXNn%%}*62ct0_F$a8P`%=+=W{S+={v&lUB zs^0ytuXxTp?U@3vS%&&6`!&q0p4}5ZG@mp1+s>2IX!T=(7ylD`mu3;8*PKy8-?kH=xaD?n~}<%lg2ht?qBowz~)=K7D&3@(0uy;zw)Q6 z`X3}&auSRaAN5?|lh0}U_P;*kd4u4kpDnrJKl-n5w6$`tS$U&zduA^%V%d_#Xf~;lgP)BpB8v5V z$v@VcKj$;nJh*LtM*Gi%!-8V>6{Hh>PLjM=*G7c)-V z?)d3Ms`MJ0mOi;g%^TNr1FV>5vhoG1od^?{U^(Z&In|5@+#=f_Tupp%(B#cm6=koO zgO}J;O#ifBE$r#|;3WISfoDU*Y0He8Cm7CZZn(-hVaFf#_+|VbS(KUAFduJVad_6u z)_rhpt=fuN|0gsuO|UC?E;Hw;r&Iz87lOpPf$_V)W7W6mAnT9(M1x4}v_{m((Z z@YI9`{&)X=_s_b?p~{)^^hC49iCmq4NRDFWB6X2VE-q`DT=JV6e>H9RJk{Zs<4^Vw z`DXSH4Xbx4m~Z@(o{)I(s(i~2)-?61*(@7{xNn_u_-M7lpm|H?Kjo|S0_6(Z%_SzB zQoeD({K$5L{|fVWHc07p@Yyb8WVo=v32Fg)Xk;$yjxCBX2ctcjV? zL-UtC^Vp1%T{?A|3D)XsDViQ_4j_e%~RlD%{z zsljZE^_#2;nz zR|&nDGbA?273^XxZCkjp|4m*2`&7Y4>;=v<1dVPme>4|nuDNM^LUe)K7x@QM+YWFs z8acB|va-oHeU>k>6-lvXS)|C7?b66D{?B>c(_}}fgqEX*I{XU1dG8gZB((JNHM<2z zJ}_7L<1W?XSdt`|$dKLgH=Ut$PU2LCHHG}#{uAyh@Z4PAHOow4>gD4Zi;h0aEk_)+ zJR~Ir-?8v-{?pD|;goj6F=+#zuEk!1Lzk3%} z5!?O1AfZjhh&}op=cWER&m|-lJmgyIlTgTgdp+Nxjl4;R&m=UJrb!BJ6;$z3C}lno zKY=kfV<%@Qf0XCpBONEIPrRJLD7C!f3)^Y-j$iy+j2c8OGWyoAJu+vT!YDLj=l_M9 zZ8z{KF7atNVx7~?V8SLTAe-4?GwJ++G-F5h8Hqoo!}cALdb6Q~_p$RS#TAhbhyOX9 z4*8I^seVGP!h?hS0g=qI4;pzUIGhrCV#0YYeuF5B$7z4ZJO_R539s2)VtH>aV=Pi$ za+Xs&STR*SNrA=e0^3S?2j*1@pB>u8noesL+-xh5KM^~@rp+S0L2%LziGPPbv%E?$ zJyg44&u4xc2lky&;!14V%#NuX8tWTQOGZdFJ&O;x#TLGnr=#p_ea1|#b=M;mWGxGB z{Qb}WHsQb{=BVopuVe~#II)!^WG#$KIKYzuGY~|5{^GG+Ws6 z@Bjb&H?7z$*%_=FnL<9W@9^qo-Qgu9)VATE^${)^j~t~}-Vtw_PCK}rV6ZqN7cuJ( zyZndaSJ+o7D?UABFC)yX@Oi>#;T#5rouB!Gm`^vKaXItvu`I&^$LI1-?Dkj+l{INv z-fRs>Y_<_@I$Lw&jm(P&d_iy7Wh0uy`GXuiPH$o`nZ#Pet|L>Z@7Sc4>n6clXsdJa zkNdeso*9dG-T2cL_v7%D1MgvA@B9+o=2;0;68hr`pq7#bKUgll!U*{w-(PEl}M za)#~XlM{N)B?lChHbk<8RL-!S(d&4GLq@o!jnzt-$)rhgpATP9LxWbFo7;(lz6<>9 zR(xtZBjO~L^nbxzhYx$-|5uQ8Dmcs@#n8Bj@yd|~7xonw8DG9={=-+KY+?1!d789x zc+rFnjYkxBC^DNhOk})P&|dQCpRod$yN4_P&P^N^0*rYF9Gp4!oNu4_(E5Xe^$gh# z8`d(}3Nzss$s5>aL_5kvD6?H@Y`c4t@8;*v{I>-Do03)9qnUSyRa931|7|8F*)I&|*&JuBo4}@>l4&ojEL^jUY0Dl_u|5UU z4x7*N*XA*myEs;I*-Scnf+63g@lZSKy$ww_IK7^4_`qQ5cJOy~qqen#;>0ry-q{LL z*DBg>c6ziw(BhTL*SQe9NimV{WyqiZ-{mi!NN>oU+t|XtCh_#KV_fqrnUAZR+%|CH zR+u2cVr;DNyxheujpaMzfw^pM9ukK>3F)kDZb__Tefj(EYxRl+95y8km(I1!=uAsW zN^4TpG)0*-Y|TldfDw4ldS zW=WCepA1QS%2(n~yp##+J7DEK;S2A}2vSHZck#czbZRx=l{dTR!jD@=4vLUv^+^aaY`;g`H6jsHji@9PqwqlJUl17D-**- z8~^a1{64`VfkE8s!4n2^=CwY5`Cl(lNE23&)jl&btz&M_hdqDg?Ow2PdEVf$Jn`rM z1V&Z1BWDCG_#3PbOz`8knCkdiF5nm2$Hckv0Y4f}`KV{wS9&~(@y{{L>kkJvzVnJ=;(GYh8Pe;kcNx&fg}sKMR=sc_#F+D4XOr1{vhk z+bUu3u=_8#YmuWi#PSI}$bwK<&T<7idKbUv?fY2}3I z#8TrG_nMX}&-ky%9NuxY>cJMyFV@CE&*j73Hwf97tag0FCepTG5A&T{4KaSsZxRl0 zIs8hjlX&~b_yNlS*;PC}|0Q2=d2Hk}`@y80ow%CO;kNj}zJK4PeGXd9{m(HcmmxBh zRkJ@KQ?hckxXNB3ahVsgF*EdTyb{S-_J{d8_XSaX9v+?^kFUziB@H~+)l|lH>|trfPNyX@7I!hG$mqOx_@tP0 zi2WLyAo7x%gX&irN6UEOYU@YLU*^$A`<0x;YlEDQQ zo>oT&mqzBfiOCJ7H47xW7%M$3mK3?0-1)cIRPCQ~sm}k!DLQN!yQc|Sc^^2?kny5v zv)PKo58w5-FdyM~f1}YzrD!qFq)x?)tTP|Bh^&9`clrk|Iitn@r7IEymlXf!w@YSw z#nO-#b+EVY#tE4WO)X|-<~18yMc5`xVO$-d_-&EdA;r1|vqcLIvT6G`w5mR7(Dq2? z3jAPbq+o8AP(I_3ROf~b3_DwU=k`9duQIwReL-yX=D_4E@v#*8U4jkAKQ@OIt`dR5@(6*zkc(yu-)i^tFR^4KXv@ zGY&XEk~h<4wNjOj2~-Zv`v0&l-Q}e8{|Vc48@5>*8W}8V5nS<^xA=K|#^Sl0Q5PMx zbP820R%}?9*&ujP zps{q$zkiKWCMN7&SZ$X0yTh@PbIQB}-~KeWFz;YK*AjL3z#&#A<3pPjH0C-TVhQ|r z=#khXvk4X^?-h6Q&bgQ9yWsx@M>{sQh*^xh=Nb+ROHC74Z+z%3A`6CSd@oa1!ZyFZO5)9Hi#Floj z@Hofn;KWYZApNGxddh2f7?&5c{r7k&vot29Mb_>_OQ4zaHhTlZ2EHY~|I6>3*kkj6 z>E!PPO@en$q&F=wy|Ier#5T?o3Z_ryO#06=VVhz}rJlGw^BUbw2?fVBHyp40oN(C4 zF_GEta?gZ6d|cjX1v^jjJxelld4Txu{@R!*z@Aijr{U&hH}b#lV*CPhstn~b9z zk}b`%4{~^VZ#bwO@smk?u<~ft$J;m{>(29SpYpt5+ zmL6cxy?*gAqfsW~M#(wX4qW7oX=RnoX`9;KmJr-a&?8>vp!w3Jlv!*!`>jZ}`nMXMdyi8;4Y;lnwGh=MKHHh}g-wD%fH5!Gqen zBow2+I8+_HuEDfjzu{Hv4PC|)UsadHHmtCAoO)`1{f0(gHntlJG)<%(fB#&O$NDt8 zK$79^CDzs16JMu$lr^VXc|?oenRj3ke`0R!mxyDg8K36QU~ybLvwntrV>`nuQ-^NZ zIV(T^um8l);UaQnhp@dy!vXJQ1saU37Ar1(gb69)AV}^+gii>=FR-B&sa3+7$%*VxF>t(VM=K6j4;mE?SVX}Z% z@B#zFj!P}N7ZV%VWL2F1xLUOcrpYZi#59x9kUebW!8^@s`UEZc7R=@9`1PM>L!YdY zkHo_=XRV|Q`z%g$F-4@cn*MM+8&>w9l6}EVp9^P%mpo?V*6qluxY6{8MTIpl!obiW z?Z%7%s|~|{~q&FT>P#tC^^dFdDh_j0X9K_SO1I;NS*pnk?8P* zk*)1NPlpLlk;I~8)=kqm?`5>l>12rK{V0FYB8B1Xt!6gM1*`QAB(l7%X|^`0SNz9P zZs+i>b#-!z!;&zM1%KMR9Zq-t=lI@yNM5Mz!A3E*Cx5s(7ys9I$(AE_g~_ervD_s? zr;<++6A!V^iIfaD&3fXd!iG;AW~Uovrtw_(;G!R%kjmzvf5R?fCug4yTZg(s<^;)& z{NgG{Teke-IP;Ic)VSg{Kl2jd(+ySvEpxX2bGCkSqEaX(+`z%g;zT0jC&N!(tRwmmbDVUYgpsK*Og^^Y5hXOk@^O`@5*CrqM#>;Fn_iz})!AAmneO&c^OG*a3 zc4@Ir$P_F6|Dk@#H=ZSDl9|$tCj57-JM=}IxkiD_a=*hNAtR6D9R12S9_TCe{{7F- z$)WZlQZy%Lg7cPyuL>$>|Fa&~*|GWmdwu3bdm5KC|No!R93Zeg;fVd7c@F2>d3a8| zRZZFN{D^1brG&Iew|}y~l;=79&v9-^P@11)2g8HI)(hu)USP1`P`=H$(o<4GLPGKd zQ^!WO7eb^u#{U- zs`JW4MOlo$>9BYT+m0BQtd|Z~n=~S-+2#cNQx5y?cxWo)${3f}rM()HH>m5++5F$+ z-Jj-D23zi#{F@>FLYHwtF5{OQLJr+U2^-e3{AdpeY`ndrX91gCN~YW%rr-Q4cO>)* z1T5r~Tk4**qfx4QL!?PYDf_$GP14~$6Hfj8U(Z&t%vH|!e|riaGqcL%fB*Sc>ooET zEjcE9B4>uoo=<5lrVSF33d%2hcs59ed|0FZK}!BZk?Vth$M$bX^;odyuly!<$s>Qb zW4Ce1sWg~{NginB%n@MNRU=|@nop}`rh+#|;_oww#+Dl{x?kA4Y{Tki1y<%Gy&tMi z2WClncr}X_El~ZPQ2g(2`xL_o*VwmQKF+}#?x8HQC0+QM0>jy7|6O;K>3Nv%gHKr%-H#BsVy%gEM*=#xaWBxjlxiZ}{n7`R?nZ$INr=x^n+ib?IMGY%m*NY@(iprdO5UTtC z0ehjNmR-c-nT!_`TFlHGs}z|PI?gd3u{rTZvWS&qvv`oB;~`O-&75Djf6NhGvW4ZF za!CNo5}|7k8%l#5$_$*>Z*MVKrYNhrLzZWQ8*@peK}mpsnEC<(c30gqZv_h3*lv6i zo?+z?=RRfA|3EfNg@tDhG+c4`$^TJYg-1cV(m~rr;n~5kV+X$dGcq{9ZYLo)SARp) zg~sTf4aTYpnfzvlc{RHQqQgK-h;}3}-ulmPHJhwaH@LBwto-9F zH6^KKS#3lzo5;5f6%D2$4yoM6d*1xv-(ST)@0!F0W;L}VSIakq{Q7UNwD-^r1F4;| zEJ@9GSXPTW>^hKm_yohf@0_zYvYRe*jDF+rdxqnu4R5_C9Q=j_v0AP6`Lu zJDM6frSD1X%}q;FtC-n5XOcr9f0zG+sRx2tC>SiZW(MJAkhUV`&Mowv3ifN8gMH`MOF>hJeAjdkviFK2YK$2KW zoAi}VhRnt{tto8j2?6d5b*@r3&OZnf-m#H^ulfImr+0jKHk^}Rv%sv4*UE>Higb`2$#4zS%10xG`Jm2;@Yh%U*G4kUhqh{o_ybxpfNWHxe@? z)9g?DU68~5`bU%Wz6GyW*ZpTZ{#^dW-g6t+cu(lu=&`Ukwy^E6bo2ryS(T6T8SR>x zCNatN{M&AVf|fU)%iHFJ}r2c&=XJdkMP5mA)ldLa3?eu72o*AU_p zv9EQQYdB%QVL9ywlU8EDHpi?SBd41W+V0)2=h<*o z`2T-pE71*HoI8UVxWpr5jEt0)YX?;PYnLfF&LNq>P`;z#U;9#jwJm#i`pVhZmWb+i zeBoN1BDo+_LZtBj!mNic`L)j8m z>64I1Fs|acP{GDuU|^td*2lmpKfdA3$+jD;vs7DU9JscL%U$cJX#OGcD8tRoCB{IB zx25TEFXP6gFYJS&ntApZ9J;J*AtEW5*d_D)L)+#0D~=Wc$7MsdIlTJ$|3T45^DkEZ z6Xb53GAxk%D*j0R!vfV30rnU-1IJgqY8l5liUbrM&EaRun8#$<+bJ3Kt?4lHwS&z| zY(IE0Er<%3#j3mh&v)@ljBPx5{}LNaG8CU0FY#htR=MHsgikDiW(JGagfJ{;&S;*> zx$6|G$oDfBesN5DugIKy;4RAo=M=?{+)_LZJVwmtEg5(N{bH zdBRV5F*lwICJYyuz1K|Ga-O5#JmQ!86V3>!)C32f2IWU`)9NH7B_^<$I9544JjfKg zitqH~`iI8fC+uiBYFn|aPcUY6!)yBq^An#pHQeFeoh^UuVX9N4YMVqwb1QoX8-I{9 zyUIlNQpHqF=A?ioK{2)oMLmLX+YFUj^_l1JuHsKH{`BEO)AZ^Ij5YjJ<3Wp0*Pi9=KcpAEw%dK#h>kGe;F@ejHqQ5mOCNJ_(Ij5S?t4q zd!^iix0pBBxSsQ3IC7~XWB1%f#(8=F7vDVJ@xrg$k@!Y@5 zD?jt!QtL@&V33=_^MheUW5c|e5*-W^4$0MDQcn|Lu=(xOuFH5NC5TOk!Iquzg0XG~ z|0^G*aF+?SbN(Ob6^S^^ViwH(QEX8JgQM&Pfp31u`y_VP++|l{~{>&#u<}}ZwyoT9N1qo%w>$5^q2nO20<-Owgbu}$KQZ9=Hmde#%m6< zePYhg)L2o-oTbrZefmM|^)oy#dU+>Aomj)6(aPxW$Y!Qe|M%Cy17}z)6{XDz7;o?A zpMA6Ksr(7fBNrwICHC?xsNY}r^TdIJ2U+LECb0GIaN?WCyit+&Q$5du9{yAI3mh2( zel-4Apske1{<=}>jeW!Q!;OC!h0@d6W2HHBGnAK?y0K+A@@Y;>EbP9R(ClK$%)F(s zHKWHdJn2vS*_?w`9v!tmIE)pSFKgxsyrJl|VMBvSRHC+r0&m$2yMV=fSB^IH)*ViJ zC-KnuAWuR0!7mMucmo|7*=IK>U)o?hZvvxQfK_`g|4;t+KMsE4R^IZE=VZM=-~@>^ zn_74?3>IDG*x>eH|9yK2iN?bAIcW*Kl`|xiVkStPQF47pF3 z-#YWu95|=h@I-ool*jQd&N&>3nN5P%gc_dZUsz-MMy$Vn!%Z$Vw->8;PAHtOk9gj~ zdFep=5AL9Uji+oU*ttYGua$I=RXQQ(&{40@EI2_jvtzbHU1Q6~`YCR*PY&2jkSa)S zo5;CRnb9-)gPR!h5#0wx?5gV&A1UZ7Pv5(M(NRKvnwjEDsY^5e^1nV{;B+d(qmo6^ zhIRUDg~|t95*MzfE;!&ScZKz2^Y$l~`|9ug0db6&^B(&-rX&7kSAa0-7#+DySsQy=K(n6fJ8blR)sT#1=KL z;mV=(97%7p*r{ zX3n_EoAE*53Hyc6H41wlIA=7LvTN`*o#GF8&hkjzEnrbX17k#mLV1{CDUXZfn!sM0 z(>#}$gP3RLwm&HqkQbUhfzM>mo8+bsiC^tc#HqQZebCa6XqVAB#$wIPJcse%rwNSd z9+3wbWG6J`&S$#nyMa$*jW37xEdlKl5(Z&{2kvl4?@4IMYFh5i7IB-|J6%$TRm!F9 zNvxWh8ru}3iH(f+wl#<_{(oTp++YFYjA%tmscFwAe9{WBRaSmw6kid=y4=-mOBF+u zSo5Jdf|Kq$~nf|9|Cejg6;F zJS_RFKeGhYH=MFl%h-GR1V^;*@dFH&{avDSY!b9f9ZIFn@Jxsb*vGI|g>9Wu*LfcVS@8 zNtL~$WL5UhvFwo~Ljxk14- zkJ^4RT=|fgmX_w=`{TmXj0v-ZBK{jJ>`5{-Fj~-?r@StWc_#NcACJu;9T%M5M5eiL z1xKW@T%2&sBE_wn(e}>4O5U)Q4wtysOy;`vneTMLgmb#eNojqIK?(=8mc`%SZ)mX5 zY297Nn4@gDUzm%PS3Km8TXg=w0S4&}4CeC|dfO%bV=PyjDe*8|=^tx^4ZhX4I0 zGZ<|?O5aIfX_GcCVVfmbTEJrYzCpWSfw^O=cuHF@XV3{oc2x)OZ;t<5=Bcv&>}I{C zz#7isGoejq#lZtiHaBIG%#4qnVs*=KW-Tifypgluw}bMG1qLiP`K1mpmT zeUctP5LW6@)tlieFWFu&M|4X!;sv6v&19>GI>SV z7PMJ&Z&BtmlrP;T_$a@nUUFfY;}J(k*31dYlT4R5HSsKRw4TY+6R_Rsl3WM#sw;^< zS*Q6Y@@7}mF=scos;~Kcm|>gLm77gx`R#`AS>_YuBA0%>5sl+3r5bYkn%TV*mfY&BwW8+61rdU|+iB{{!3e4{o~6 zuuwKBJ(zv=KhK5&wwt`2{wFLIHWZ|_?E3%y{{06gzdrvCXEQ6~+u*pt&qgK2p;yG? zPvd6^;YCIN`QN%Uu`?$!vtB5g(8+1W%<(eB!D`KfNZyDFhgbR$b&X4z-73<#FGe>0 zkiVjkl-5+XPcosJLr_-UrNZ#wVF62Dh2OG5<~$SjaQRQZFy({%BQXJfqik-eKQ42G znWAft@I+ra-Qh7kL0CfZ;aC1$P8?IVD|*{VO3qmDu6;?M%dVf?_w0@`yjN)4F7~JW zie~+S>*pJ{i8MTVt6%V;o3qNxYDY|3(;9(>tC9xx|9^K!>}A#VK3FO9B!0)u`UBxN zo4z!>j(Onl@w~jfL`38ELW9H8XDCT^`uO;Kh)ms3%X8re)7$_5*k|%OU75=x@ZV_@ z4|B?CAz^0i0!^C}G69x+pVVK}Rf#P*XmcUVA>!BHudmI&oN^KS@$&D6f`o=y+}R%v zTeVK8_}4#UWg5dyW0HG_!$g{eV26D*o< z@OJtK$e!&8yWaeWNvN#j;OhGS38|V&dk?W)Oh}bp!+Y#VOTgh192@1$B#s?m(2kd! zz@WlweDIYmTSmI{EY1VWX*?MWWpYdg4vNh$FZ`OtILY@xWgBCrw7?aP8P$o}wGt1X zNoo8@@~e0e$~quAKoRQ@Z@KHHF@wsUU%1i`~= zKlf)}lb4Cvu!V7{WI;ot1V=*30saG-le?N39+(0OFv=ZHEUqwnX#ZqA^+d+uX7p0mN)$A+w)2EiQAJhY2`_` z6LMubq&#-AtX39C)mo&}cJ<{3GqpMA8}67p95Fri#(u8#{{?1doBR6enEyRt&rV4S zHU*T3V z>)&DNzXFmezh}%)XcpPP!+C1SiDu3RZJH|%GnR;0v$Hd=ab(~1|LOVue4d^IZBiC~ zl9CUjnGQTWz+-#kmAwj2UER+E2YB9uG)vdzLN}F^j&@dEls&;K*;n|Ag4W`ERZ&BF7cpwTp`F;+UDr|GcFv}*~8Y{klJ4A__ZyDcd> z!7x+NJw(C4GUK?^6!CxmQXAH)Ij(5tD>GbhZo}f){G56b%Ci{d%6mQ-aaJy9oyd64 zp{1-&A(5+?JH?jO_ih0R)}0eck8|0q6XNYZ9dkyFfT%{|Sy zR)W!di=*-Eo(Yiw9~P)Fzd7K$H!n=F%;3;v=|giT{AegKNXQfmWNTvj zY_Ifa!r{4$5A$5^7&?7sIdWcM`=V#Q9!@{ow}f^v%B0mR-u9MIsN_mfKJkA+D8mOn zqe}`p6$Xuhg%x-D`|~9o!lMk0l)`>BoMAP8=CIwUA*}ar>kYfKB${fiVLa8bj9u{mgc8 z^6*&oi=RK-Eu)cJvLZ2sf&Y_{(`6=;wFgd>T-hWkV)p;wRJm>E43_kyFv*Lt-Rom4 z)fL{-)3ju7{fDV63U)W{F4)2=>*ByCz2W7e-LsRu%voZOU&HOA4J9wkRQ5N%PGJkk{4$^Ml3zm06xIt?ywmCuDrExw7e5O> zp%qtf&SA>R|NjnuHaYd?KSRksN4?~07q4YI=t&f$^ZoIha_1_;ksG{T2`%SX8+e)i zC?`fUXfQSk3w}PZhHb%f1qR_9mN|?YkMPDd8Z^!Rw;<1+dB=m~mXdXesZZmd?CtBh z;PXkoEP-vwL&n!14jD*{fu4W=dy1Xy$0kQDnTvktwNJOIR(V zxrukjoOyyP6MpgQMkL7cM?99j647wB~t~0bPvuG}D{-z8v6R*R=F%{e(7!6FDA753$5|GJclU2tCZ^pK#m6p(gD|qD2Rz zgo{-3nO_Gl=@+%KYfC?5pJS*bbwT6lvw9af=HBZK>O~S0tltP+J@Hb?v`3-We}YYs z6w^-DJCTVENA&j;B{}GrvY$L~h$rk|!@C=-&;8vp+P}&_2{5^_!g7s_!@4JlNfT;V zi}jW24{24XsXd9@U(eI=N#>d&7Ho z!YA%&>N6I+WBsoF-}y`PA<3N|Kg-|hY?|6HaNN=QLr;h5(GN;&FUoK1%ZZrz<-fht z-TI7MO)bVMaS7iR-sbk+{h*JBc}+80W<$f7loXdGQAg(Gxa>SvwLLx!iQ)1#DwpS(pfBlrbBFw&=-^?#>O3A1H_9+FzCNDVd zRr5tnWtnA~-n7=Nfp>}HBerSp5?_i>dZzeXZ^4wno&|?*2k<{&mc7I!{f6ag>5HG- z)5;avw>hzk9r*oBQZnHwkIfYc!Oiat3?r6*wBJ(KGPQ9*qvD54VQv|RCp8LgtmT@u z&fyqlxk!TV~_wjPw2pL^3>5@YvVTsdUO9!jj|E z>`!9T!PcUBme*&9N!fIB9kNk%0BKtRd>JyyxF!5XCkN*?GJPw`;tXSU3cuCjk zNp(bITg*A52P{1vGv{79XMbYS{|{Y^Y4(|O>nBKFdGSZs_;tUG#t}Y-179u_D>O`G zv}bsps>R3j$K7O|WP-5BgKL&sVwq>VG^@&bSPKRAAGl=v=9JwDFZB-j3BQ{a{%)v} z2?}REZFgabpm543-fMAfFIrldcFb#DR(azrBhPaEi`J||s^OgZa zyZD}*_Ae_hyw2G0kMY%?=0~hH3=E%HiWD1dH6Qse+7id>kRiYja^q5tDML_$fzg3u zD3+pJLn~opGYKB*o0)^55n&WerFEE1xxMzNF!#d*pWgLiNf+R(uLl zb5=@7JP@_6C~M%fJd%*fVfC9?H#UJ+e~0XaKOCNuJ4)JLEOGe5)XnLU$R@4WawgD$ z?@Dr7!w>F=BZfu|yAN$};;@lnSlf}f`FhWTLr?54tq~}>*3{U@XnJRc#074SfM4k? zVsiBhWkcLDj`Lr;z;bbcm+Y4Raz#-;>)DRTd37v5nD}4bsG9Gc#h-SwR}u?&P24=x z*@G(nq&J9ktni-TSoGizgWekn1>0CQ7j}*-6Pcch-Z&)?z{r_>;DA*AiC*Cel>+t( z$5nUiVlcNze8_(NG{eh`1AM71zkl<;Sn{F%LG>TS!-hQxe-(BMtag@=OyHGuab|v1 z9?^J)gHt%;Cs*E_!&3hz^a5jZ&KRz5<0XW`|hr{vfs~jaDnx{oimg`N~b@ z00t$t83LIdjI+`lGdZptVB@bdaK5aooW;(v^E3Zu>1X0c6a?1nXfEMOsB7#rGCK4o zEy*G8gYluy7AAZSWyVfyKOQg_|5vOOUm_CnuE9F9XTt{9HCc>5MZ?SvrUfbH21cZ} zF+M$DJ|R9qn=#=X1AmXhWx*?%AKvOD*c&UREvs*s*3)d=@IZ*IZZV^BO`BMfev$M1 ziGnNtG%wSeV#3)c@n8XOhNQKL?jftq^%MP8vHj#u(_8b$VaN1|jC*a;T8?X~^fw*m zycN*?Q&ui~!jXdvn%s(uILeKkE-R``aM-Mq@cX~>JJoci`BM*_IM9%DquygLqqgyZ zW<8JQeLWZUKI6IYNnp}F!9;esHLYfI5;kvr@aIIs2KKQ3#!l943AQ~GJ~4;f`}gM$ zDC^;K=V`%fy$S5pgiwreV9H<0XYV_6vUe;g=0* zSf=>I(I>#7`P+%6j2n&B3pOOX-C{d%;zY}(i)}}E&&=OoBpS%(^hnY$`rCW?H>)f? zEE%k)2-qxaG%?`vv==B=e96D**HinT#bR@K6k4U3D_ljCO$wX-aL!wroYqkKFYzN| zP@hf05gzF^KiM-E7%P?@NqnlRv-Z%XhxKe7Q696Jr-+~VP}0i5>|xY;HTuLOf%=1& zEY>8quUIUxV5*9fzKd>(0j~&~!qx=ggO!q(8eO+ID?DU4U4P;!%NgGZ#qtWb861*) zdOC`@!r~1a<}zO9|7fqnl<<_Nr9a|e`;@H`g8x`L|21EI{-9|R<6@o!2j&;4M+#p5 zF-~Bf;L;k}b%l{(hT<0~aKH4yTLHEwjWI5}`=%H(N-QijU{+rArm@5ElBmYoKR-Xt zeQ5t7M(e`?vmNW2a{ZgP%u2|d$GNR!KI1gCh0IR>{~uN_R$#s;P;Tt>nlU1h@3i=Y zU(Jkn)Yw)hHk^6V%)aoyV_0kBm8S6SjSB0O+ovk`^z3jF*tA#R30uT$W}^(wxAF>C zCvVuMwdX8X)X9@4PBhFZPfWGQs%twcyX0T%aTVn=)Bh)2m1Ewqp1~%*oiR$}fEvex zr^=VOa-WDWW`{Sbl{!3H@K!+Kmww5I35;v^wQs$vkSdyURg2l?R3ICJghYU}-i^sh zvz~9zSd?PQu)mItLw1hD&P}OsqIknNlq1%xm;3(_o^ZW^F$9xk02Ws&b zuq8D-DezEBX`1iGXT-fxe3sy@|I$T#3~QPao6bcw2x;uu$eq{NV8oZ!&JYu5?2x86 zbH;_sSL)f^*xrcRB)Q0hF*to&-()0YTw*3P$1lR+x0a%}MB?Vw4Sl>z9(QW2Ncb%( zDY0Plh5wFo1w9zqCNal9Ji!sj|4Dtx=HK%f%dG5mW=SsObqi1yf5J9_{{S!Viz0Q8 zxb`2SWeSqaHPe_M#YZr+UHp*H@}8fy)6tnVM|B6|XZey(re9>33cegX#QRLkV=?EE z~xN$J8M^OD>(_^U|jYWwq9m;G40tde_H(wT4PI)2`6XCS=fK=0&3wz@q99H;m zY~XN*q02g=^$5fKn@ytI9&oYlcp_eQ$a2$shjUE#^MB80oEM*CG>p5 zDW;Ife=KqaoYK1OH@G5enToj&o!`)Ane&bBt&ITN5e1f2dsiqwQm|C>SbK)yBXd$I z!;#pY3p*NrFmEemGwfztZSr6Fl8!R-9_x-fFMqN7uHNv4Rl7N%dE$mGeBaEsTs+L- zoBv=BPcNHGgz_h)6~@O;9XrO*tvR7;g6)Dv#(>2Fm2U6<*DpDCzP@F*Vy|Ds9>>dy z6S%En_ziCyEVKG~Z%fCYivj-O(8TWJhbeg0j-v zzs+S*2VYKRe8fKC=n3OF3H8pe-93IRn*K5%dO;$?GsUOAH;k&?UgYpT3J7|UAf&8p zGxtyPd-?WO&LcSyf0`;DY)Eq|>2fSQe&$$TnI0$e70LgG=bRgJuQn{Hk5HHQ`rmFM zmbgoD;maAEvwrD@9BFy+!Fk#Vr&kOeat55|z9$5_sZ}^M zt@d9cYPO-EeMzj#zxJ!13cWfPESh#OFJYUc?^u;!{JiJFCiZFdg0c)Z8l+Pa7$X9V z4zO>Xc*;IvM+1A7gu?2Z2Pz-FxBqa;aE7&GCA;Ohgl~-*Pd;&{$Qc`-x!*Iv%VKeB!CZq4)`(_eDa|+}y?PHd8VtHlnaGPmCV_CtkM3=b+4Bwpvo;m#9!t>zrH%Wy`xiV*-6S)s|w6<}o zyhxbIW*L9@lvBaMLkC(+JUBJyJHC`yCU+^1nZN2!JI@EhL#KUQ_OhSb{$DWFhM9R$ zPs2=pJ>!Ja{{lZ5ZOP?WQyn>h%}7E*A-Aw2az!QgwC^jf{$#((F2T%T;IAMa#}mQ$ zFNI5Q!AyyVvX*R0jLKUS8~iPIOyswnC_CG#U{QnH8GEZ7&V-Z&G6BT`3?Va}r1&TF zuzFcM@Z-5M^Z!9!JCDagV&@keVVE7+P+E}K%TW+Lvr*8HiEZvvwyU!q98->9RB1Lm zD1D(N(Let9Q{1aV9J3VC z{wFuQS=ug=v4M?OxumR1@MMnK7UwkzGbI-B=g4U&Gk^WteD5`%^w$>C4+)!fP8k2% zP;=l2%k4C#l`AGn_nqh!@388Sig2F6x{F2hnnQbw;f9A_pNkhvU`x_FAw8i@JjF#= zEPaCk>rY{$-5gr23yvBpFKJ}an*Cq7H140X#e)rh*>(3M^agtLvrH;eNLy^SMuGj` zU-s$03v4}ZG6!`S9+D2`nb2~8q0oBK!^0f1Hb40F6C@vIImpVMP*6Vde#0?kC7u}p zR?|0p_{+c6z%h|=^_7IDvO4P$Ydj*9zwLFtr2nZXiH&VWRDi?5^aT!O1`4NaZyey# ziFFFLVpi!8oXUBlE@CdHUVud4A^DrJ1=W%QKU*3ZcQSI=oPPK^oK39Y_*eVG&-Ld^ z?ATc$v5%RZ$+6cV>_LyL@TCNGo%znSM;cD74!HiWeb!ly&g==dCrUp%QP>qzXY8cJ zlEa}Rmna+Hu`juy%s}Gd+?uo(Lhcim{V!k&+SueII&qnRY??=f!zreSx_|svc`QSC zZ%L-LwSKQ>V_Ok_z>)9aq3J2kXPQIy>0AiDm-upWBcqtwgoCbX8H?r1L?zGs->`*a z=FWyQNe2!wJS@L)sm?7!;%{@R{);j(7iEq|Y8gz7?WgM_9v*MV$Y}_5e0AqPN9By! z2aOFL>}XlhyhJkN@IUz{4$e2;Sf5zi(HQ7fVAFV1VIu!L&*MJkJPGEFrw-PCn403l zV^F%mit~~95eC*Bf~PpvaY-noatYt5nIP@>kNNt`3yoYibTo>dGf!K7@Ree#yp6Bo z^w<9vyk$F)AkUmqCT&x2nx&sPqFL-(1uOp>qXpMKZLnx5U8R`V`XWd9dijPQjY|~M z*fJ)v@rvJYkY?V|*(0IBc$0mj@WkGP=HiY&Oy1%Xl$bSZ4@AZFY{*T!V8bHSz^E6S zp5k=>TSu0eu-9J>Psa&WeACJ#Bn~jM{1^Btsp2ECu#@sZ`@ zVfzwAB?#c_00eimhexA_H9rQh&K-YWm+Xm{AUrai7BLCy2e zNs%cZ6RMjfJy=@au*rJ0o%gulVUc6<$9%(~-@JAw`YhZV{A`Y|o+Nnreh<$S<_|u` z%o#3!`EM9JdAeZ5vcpnr22x7gr#Lp8Q_}dO@Jmwi#!bP~N(Uv`?yN{{NK5g!#I~}% zgiFBA(PV={(u6Zj6WGtkHCmtD(A2xr2L)6AICrRGhS-=!F_k}PySth*e)5e&RxZO@`%7@2Q@`EiRpgfENhTn_dmgS?Sv+opbrjG(hIg6 zWXXNgl)h0?;-RcT+LD{L6EYL*jSZ7UzI8PFf*QgpCo)--*eAA|2qdm#lX2(aNvKw2 zHD4mgH~VPAQo{gtVVSxQeY#0UM4s49DQI!g+w+jK+uF_ThK~7~!lNyZ(mX7bpEJ8< z6bnZw8W=3<5ox|8sdH|kw6j9&gwJXTy%}s3=|X{mj^DTs|6%90j`+orBP&%9z0)AXYg&M?`v@CBYzTnAdK zKZSio@5lc<0@;Dm^$FIJ3jf+n7A5`^axzvZJtlF{Ds94tcDWhHJ2cc2c$sgkVbqXq zNE1%{_)Grf0>gsEGC6u0t%gpA88%H~e-d;fLCr$`Py2G754p_$|2uv%^sxT4MuwSL zX}{AY0b%ARUG_&lxnFQ}K2h1mSr^TsBk%AgDaq*!+u<`!KcpYUM_4&6b9^OWyhy>_ z`Ao}H^#`gyF7UACrx-Y#3W@mF)M>1AHPpabAXP!RX0>q6QJy^;k8pUdH~9Nt3%}R= z{|XzK;`089-(pN`d7>DxlRs-uBfnj1I7^Sm^J0fPKfj;PXN$08*1Rquk#JJ#iQk7@ z{eayL#}1s1SRk#C6CvYxN<88gyZMiQ%AdG%cB(ToFVSJ(XEQj+W+L%Gn@!>0&(jQ% zrcA!#3bs80TX{SfM3y}GG*R%@$<}GYJr_h1{xAI5$hmFmlmGQk_9^b*NlI}sS)%yN zQMX~YY?R(#_mZHQ6JABN6epNUFS2V{&RK9r*=o}UBhjs&`(OMxT)ijZyYr)O_G@es z8lI&GaB`l^;`u+(>i>r?ryFj_v3%lEdH2s);T6-11>z=uo4z!j4`H0m|50=iUxEX- zxyOu#&mzps6&=ljyM(x&_&wQj>Hvf8$$$UT8?L_m|1h!B>I0W>dc*IDj7e6?OOpS} z?|RC7iL_BQXM;uLb@z%l~56 z-7g_f*LKzE|HGdgkF;HGCAOSD)wJ#W!A~4T^VnZX@Xf6cI4+<6d_JRa!!P+0bL-ip z7%n8XDfHx+yl@LT_J2yGTY$AmY;#WIQpFn$x;Y?d;hCs-ByWYd*T_{d-+yzrm>jyX>2=1U~L?f!2NZs>4Z_siQq&0%fEf?msBv~n)1 z%E)avt`LyQmwm=?0t3fQUMUuZGzEq<)vN4`6Qsf)upDieGe`0S(-a=21BbX>{{Q(V zd9toxGRw-t{Hs$YNQ?XM_;@U?UvP?hN@0D?Unc)K2A>m+@1F75aFg3Ztx;6ugo(<% z#F;YNa^xPFcrbqKXT0Y5i#_*Fqx2J=32Z`MPkHVob41SKTUC+x?SNIF!q)!_mU4K! zkuQieUvru1^qn&on3qW`n92W)JtBFYq?I+->x$+d6V9mqG?Iu|Yd5vb)6QY(H>`vhA++UxlE~=cx^JD|V z%>I}ehaa)JG;`atc^sCWlkSkmd`$aIf>?y|l!=0yjS8 zry5}&WMSkW{rQ3kuTejz)d$w1_y7N2IHq%{hf8OTLSfU29SV;o9McUFImoV;z^qx{ zxZSehOVb&)srwhKuBzBkDQRK3Q$k|lzlK;(HY4F{fvGLaL^CEB{b5=s*U-YgXi-{A znT~?e|AT#vKiUOl%1(Ub58}#-X}GLna(Uqr=M1a1pOYIIh2$Tc<1@KaSM!@mPx;?p z=Q$I2x&Qy4aG-g5?*9YK2|N?_{`xPV-R$t}e=~odp}_$u?+rzaLSY;FxR^y2EXxmA zE_yMc{fXohQSJqj-TyhvogPUVcCh%(KH%saaFexLy2I6=T5$8S4WAf9_!8=se+pk& z;VQSG;i;{MUGuqF27lO(8|$3;_uu{e>JQfhnVtUIvt8NI`gC^v12>)%>lf@`m}>rD zLrM}$yYh~W$673&%I{<96%4dDaQ5$RTdI9yC(nWpEce%+VUX(iahf6fiJ{Weg%1i+ zT3VD(tUYs~F@lXPLaw<*siL5d@zTwp3yE(qlPK*tv$wn#{~5@eRqcntK$R=WkfixI?mN zsp=hFk5uu)^&R&GECt^LWz2D8mz7jV+TUn?_fPvS*;iguZmPNb?3563J=52e({SU{ z*T?K^9~wT_-`L6iUs7V>Q_(d%&BsMG`YxO@h`9ObzkJlb1eY^%PH$R|sOtRx*M8lz zW5Zv5-f|DC_9v1Nk!?4W*lwyFXkeM~!1!^;7RFBRfISDK?oQZ|=%OO&QG1%<<&K8b zi>K!29|#RwkS(`!XQjl91*d05CS3pDbk;HUFH?7L!C&69eG1=||8RX2-jVa`zx>W@ zmQrq|eTkJ~*X}t^$z8FsdCoa|<4Y^wCDb22%@M|outkF7 zhkwiN#HZG(%?t~Ev~3M`{K;e^$=LV#KhOP!xAg_9l3TXUOkn=H!AN9I)5LWT(h?ka z44m2TOHBAJ-?JfTHlt~-;R2qXf9)ym8>DVLtQMFh7*~F{i9KxE!O!A*q8qRnoX!Wkyx(tpiAnFc|wKbI?-lR zE(O_~06o^9%qElgrB!}>{cFr@EiQlO?E^kTlcvPp*n+gAl$P^m1`b(eY#sL<+ox}6 zvOV6i$%lVUH>21y1-YV#gIxRp5)JGo3+75su-GyAG{aqg{#mSz(`Nh+eALy*xN}1D znG}UI6~%7{wMyN7%w4r%!@uwHFQr!e|3C2&pU|@nDf}y$5;9rD3z|o|fK;f_6eYlhT{c?{S(w!_c8CZH8RL zjiw(DLKQANl2qaQ%wIIeNJ%y0$rg@2>9h>igA9_rY@HjM)*CmM9837w&&bx$c!=Yz zjpA|boF5G7yzmz4Caj|S??1bwMoQy7c7Ctd z8jgU6ok^$J9=gQPpJ7Z zpRuw*a$3WL$C6KYJ$^Ete6CtugW3Nr%rdGM!XxXK&#xIT5wzBo9 z>xSrm|J(V$DR^0R=sOlR@4GH5)VJXvgWHr{95MdRr_(3Me$bWKu!VzHEh4I2RAR0>8xGgL@n<@;H=bg+ z9oGK8=SgH!xbzk04L1Dmb)3VG9bnt_|IZ(`jdM6J@wLhaoI1d;a`l191|81d95OkV z$}w6q-Bj%`5;aro5Sn+vgnQ*>g;Yr&S)I3sE?b>Q?dh=L)r|kAcuHqRQodJ()ifSF0^3t zx&>aGb0Q`_Vm{JtDyFb}ld_O<$5;MaoUBI`g||%p+Rs>+A+%@GZ+`D9E0~2hu<(C2 zKVjq1=Kl7?VJSTWsYm7~J~>@T;J3J}e0GOoyRypW|LF{|wnvY!%s$$rV)ns7V2KTr zxu2r8?7zd(B0fDEp048gFjGn|&hf)Tw+&DD^-?4y7gWnA8pkWtH>PZ?w^0K&p~F{Ar8H|#KgWmRgHpS3PuXk9vyllB$BUlW=)6f>Hm@fvV3f8 z9tRI`ywquyW~x_+_DVRtP;jo&6@zwOqsB*KGUs_ZnkI7Y;};aFm{8Fc#dh|1hZ$#x zJoBOnZEvThHY_)Fd!abFqmgODOrHr?xp+?Krm(pj?q|%qUcX^}Vy2u(oR5zOJ9iUz zo=dXWrJBYUj7J~a|IjdGW?pkCrQy}jpRdK4Q@A-bViVr|ZlCgU!UpE{oB#iR*uwOZ z!%2oSd&}WFJl=~hEE8c~67=)@ftHd5@)|V`@0xky3=JHtlqdA5o>{+Pt=a>d0}UR# zH(31qFE4be!-lz=|3rfLj>}y3o^u)*m+^VI5)F$)(j(uD%KB1 z+-4U}o;bmgKcV5R>q`p*rzl$!8&W!@J#r{A)+^-gp-TOL$2)y zbB*!I_x3y;f7qfQojh>h*h%JZuk#-~oK}A@T2SGo#7>)rDc2{oX{Ai#7CQc4QsAkO z@t+GeZfqACgeqJ`w)8Z$E1EDHJ0**XteNoi?uJjo6aPz2IFpu;(C|E0;J1B{6>B7; zxBY}q5^I=b-htN9u9?R;X}V(J7x|Z~LLw|Vb$u5U@=HxrZ&cD zaS{_Q@djODo!-4*rtgOy1L2fZrY?C20S1}v{{>S8*Z4FaW&h#w(Y{`h_w)Y=kySJP z20V9={?o%VfwAIC9wK?KyF%!%YIwdi~kz0-n_v!@xopH&*n>w z|6iH&mA&+jqr{W2B^v1oPElKrIHWq96=nSYaVKw_yW=GxO>IVnr#vQmnKc7sx%2dy zPXCy1zwc0P>l0HCsW#4k&3s)4Z!K9+(Y`dcAX@NNTnf|rCn;$SE1ReKPB7!UV&Zn> zn$?YM=})#C>)3KhB8i`w`HbEKd55$^+n5}ET(%e;$W_d+<;c!YT+uk~`-X#!_5TIf z#f%LUUg<|fGdU)^@vJ$=xV`d%)qjPn8~*VNZ^>oVUYz)^X(oquea6k7?7Q0=T^eFO zBwgoPtyU<_W4ZOCJ@eMLYU$n#8<`nh=5il6(eY5#jcHy>s!YzQ4oMb=kemxz%(u=p zt0-hh7$34?;o({Ex9ov4!_1izt#l_uCf@MT+TnPJAv@sUv=fF#2hw~Gh-&1N%oPk; z*l4W6yhxC3b%5i)rc@1=WSN~si4El`2VY4f^cuTmsHG=4#Hux0T3a3$(=WgU3iId z)0}$=tjcRHB)WXEW;XFleAp4gaVYJJAa9mOI)B*(u|*S4bF61@_@yYyzvA!*{z+X6 z9x|4(mu%w~+B)GNW6vJO>3zOa)PsoFnq9gx^@YMf^}Ity0wP7MRQK zaj9`i*oT6~Dh4s}4W|U2=YJRw_y{@PC16@f(y>6 zURYoMApMcU8J4Sa7c`$eQ2k6YA=QA{LQnBuVp78#v9m`QPVY~+`F}(6tbc|IpJYAk zFXTQb61+6=H+!kRvGS4rdWX4=ZT~-5aRj+LSiktMsBQDl(You*fertEv)@uoX=$@I z(E0!O@A(hXGv-T5NIs~Px^^I`;h3P#*+buc7#k?ulC3`wK1u1vhO3+#j3k4W9pH;h zZF$jhO!1QgBl8v+rsobXCi%G}3kP01EHz_7K)*+UliF}1QPFPz~0@?qsm`x~YYb~GGQ_Rtj$n)~^`z0#e7FCW`8o4j)<wzcUr6)985uC86wZoe&Wq zHAtL0z@d9Qu~|Mx=0b6}M1m+QGxMU}LoFsJ4sdK1OcUvne(B))jysJ24P|0vuw;O zOa(s3&;PwJm0`_2r8EHsG4~05S_X5KuI{#Pyj|xY8#2RkLshq+=KBMml%G^3Ub%X8 zfBoOK>8~dgbup^e9{y~^yk*{x{uTK%W(HoCT;$id)Hyn3ia+aLJvElf^o zGMyq|ydz=b{|UzgtJ+x0FCLsKy5isu{8NUy@Dk&?Ua$wYOaeQ_# zEoFh?83xVMiiYe$&8B{dyuJTDO!g4>o$}{5NxdR;;AO0|(f6}a_FeCQ=!p905W_qh_h?kUHxSF{k ztx0O}|NqKTUJEv`FJ(@fvbTT2RkaO$oI9AA`D~s%ojc*_{S5|;yTvvC{6FY^GBH-) zrH*xZ?2CPYPrjTx(lTSF+d1Yj6@H5Mix`LG~-eH$2|UepA#vmX z1y8wE_9R9}NJu8Ue9B+2-sXj0eT3aVX5I9}Ufl_HC%70+a2}tqOK8Tte@^e#vG44Y zT)B}`fBuYx>~;r(Shi#^@rE>h^J(IXWbtf##Af2bqIbHnFX8C}r7|Pc$oR zXkMc5^`-rXSNdTW-fAuQ!=+p8kk@|p&EZda%v)-HvB&;o;|%s#$ttJgsO_HcR7=I* z_yGHVg-p>m(QFmJ+Lz7$uaRbKaA1+loL3D`MVIt7@$NBjjA037`J}I-Cm|^HFq2_t zP9yJ!=GXpgXN;ug>{}?CH6v=q%n2VFc-jtp($ev7`mvy*>8WzWZiYQF(l69*Bv>BN z@rY`g@^nK<=geb?jK`0(SVS{D6Q5woVSb=npkgMgwzK5KPkcLkex5(jaH6=!qf|jB zZoxYS({GXzk`p%R?s>}^$au1xXTzWKCpxY@bbO*+P}dw{R?x1rocD>N;*9Et7f*0R z|76Y9{_E~#ed93S#D5YGqKzDrZlwKle57DA!|FfJ4TdudBc2rK{$wxxGckXk)3vTC zItD&0&l#8eNLe7X;M!Woo`^flUj7d}*_RZ(vENer?Z3U!{N~$V59F3EFw^unAOGQ% zmWQ;sQNUOEJ8TJ$pRuizNK9>*!JT=%X-(^gg_-jill0c;F}1#&f4}~qFYAQ`>?hX! zzu=~_#)oyP<^(>wHD}p1z@9L<8w6e7I54biW=Jp>=E#V6*u0MCwgQ6+ zPlA@zlRAM$aSTK`2Eb_3C)}5mddb%a9G`QHG$Z=`={a=0?KgXsof_D^}q*$W$ z_zmX^)&vNCTG%on;xB*PM+VR613q0P?ncbYYnnM;795-;UnJ9Th^0)7!9}L1LN+Ix zrGlY#;>1S5eIZg6=^ED76`9r%w#>>~9y4WDHq7B$H$_76rT8AN2FAh-GHVhUxV+sq z{8o51W9H0;wJ~#7`vlF8E z6FzcluTZQ}n{tfjgiXY84zcqe`b3$xRG#UGIdRC!wWFZ1RddsP1uMl?9S@l){~b2h zY}j&`g*QCH^-#x@xPZ^>Nevv&_}wyg9y!9YdXE6FN!k+C{Tn{9r^u~HN=iv_lD28w z!5`!Jw|(7;1cvJ?cnqu+Uh;1{(#t4#|3igqNZE;pym>d2ZnCewh6}8h zCwys%dS`g((#852dpAT@u(5T>FyFC1QOHxszQm~ccQa$@N@*XNC1O$i#tWVlW>~d^ zCY*T4*qQFZ*RoM^;YZHR(v#{JR?5B#E~w;r+t6g?`u_oMx<_U68?_lb7evky#i%QQY;3$9j9vR z^g1456TIHj)4|8KCX=x{xkF~rvE(NHmcwkuikk%|eBnrT_Gvt#yoQlc`)0z+Cc%08 z1!HB|*gRyM9x)$kUb43SzraH-FZ~UUnrs_j{uw&{;o7-R^wPohsi_^2 z$}Y#bcjmRX=qsC?cVdf7$Yc`}|FB8M#DQar{GPKtoYxxLe|**da!vfh8u5bL2fx3+ zFOjfa{lF={fJ2PegE!pa*4!bH@W5WhXo0L38(YLK#^ttbEDX;rGo+eUGVTMc zFvWgCqxBOu9i_E@TJyd#S~3U9IR!H+r#xl(~}xM2rddBcQL zCTVJEY)?K-Vq|vs#GhP&~;b;God;jr7 zFf5F$U-Ba10IR^q-VAGl0LFl1g$BWHYlX_mk}>}dzmm*pW|*+;c74Iu11x)v3C&TT zv0(GNo&}%yHvW+f(mQ-fIV-B!l2OcW!7eGA4cuOnFO+n8Y@V=9>xYg!8`}>a+Y@si z9Asp>z<7ItXk2__JD-u!!LXh~pF~^S^4gpDMO{ya^IZ7V+Q=Am%=uQyhCMv1r4v@a zo^c?tLF015SLU2YEMe3CyGtcB{E!OcZ#bQt_QEozr^84*jIH7Ig8Kh~N!^@p%x^fZ zUt!qEq0d&Jap({C>(>X^Tm@5kRPNO|=U+)|+J0CuOz730=5s5Pt}*g498j7#=gV0S z19L?o0lm)$Ij5bu%JAdP8J@Wp7hla{XliDNIMf!9ae!OSq+gMr>A)M;GeHN8)Kxw< zrSF;$rr9u;v6Op9)1UwHcE*i!A|6gL|SC7967;|ec%uK zY+lWThP!1yPFNnUcVT4GT%gb?WBJ#>$cd{x{)6?Ig}kh6Y(M56ny_?2&jd&1f|sn3 zdcVG_7yOqkSZ}-LDPMM6vsBgnIQ!%Tmfjj8!^7P3>o5FWx#677l0p{CyYkPL?XRyh zI*_)zj`=LRX_@0XwzH?2FNsvB&18JEe*OW~UuO;+R+@QX-8ts+J&mk78DiW*`4^rk zZi#6K`SkyxtowxN2PCHpUh_z5FpE)`DJ$mwz*)aBtzlZIkz@M#83%aNPbjczG&w$c zu=@Xj-YBsTuh>oq?Y8HsZ{#((afWBdg2V=k7xqDS4od}2*pc3{OYq{2pZs5~7da%k zWIa&eii^0_SmL#SRh4L|P2 zY5dG-@+L5yU-AN5hJ=K}OKBqqwnB9c$>vk`VP+S!WYj+J{NYciJj65St?Ro38<|cs ze^AggsBxHEf1%Oh#O6I6CTANw7JD?d-6?P=*_N2dcKbJPsW9`QyAO)mI45=eTU?ru zu-eB#*5^W8^@Q1qiEKvS?U{>yIL~3~O?GpusN_3)jHf3fkM+EfvEsQC4YKdpw2K{| zDy%rjGVf%1!<`DId8z4bIm?q;rfprYiBsfW{QW%%2`sVtrx{}F_`e8eFz`Qd`%uZX zpoHaZ!@+fx%u8(x7W2On^|;HpGwX|X!BY|DiUWKaKjkN>{cC);Iz253biQFCd)%yF z{6%@k*6YugoZ-OkYINumi;H~G4Tou|hYrbawQJ^?;4H)3C3xXr>;e;pPx31YS=L-V zuzAIUQ1%N&vLW?NVG|n;G4Gkh^1^?Deciu5oOw0QZ2l68oox^8E#5Y;vr0%lEM$7W z#OZaS+6xEOPYcY7W^#R#RaUY$G*CFxbam;5KgUiqFevPA@L$T#%XHxT2jx?4CmbY_ zvbh)8GOv6-GeMSl#l#0}x_c&bau&PHaydKufylXzS>+COO;gvNc&fn6yeOI5t9}20 z@;93sd)uB0MpSYZ3#iSFusp?b_Wy>P`ww3FnSOvxBC(Pqc+#B6`jp@aukF~B7?l40Nnaqg zpafL7Ix8@*-(bR-8*KE)J!`w;tqBXFGY))fR$n(`!m9QEc_w(;vK1V2J>&8J_=0rLzC-0F_7y&? z+jJdjc~88R@(^ac;NhaTctIrFn|Kddma~~1YC_CawOo4D3llj{S{v+dVo`j`y~Fam zd{Ew@SL_#bwRH}J?%nW*W3l6>526A871&oa-D)+c?U`_@fpKR{vkSwb9;f`(OBOj&{a zlB8e#6AvVu4xD+w*tX}y>EDj6T+B;0v#&n!aISno@)vpLB6XHI7ZyC);3YauFi=~^ zLz&5JGuvs22OEC19 zk6IGLQ~Qc-OhvZh$~!Lo<-5av^w{C^ANWgbMYuEC#4W1%<}fBPZ8|8+n(ea5QmwdMsxSsxUA2%&K)oz`N~#b1|ESp1|Co z0Gk70UJkeC@@%;1$Ch!NLFjnLA^t^tB2O3mV7|#-q`o4NL2t=S!MOzy3%lglHyoP8 zsJUM0jJrwMzyIzbatkaPmKqzJ<#^d}_>9{Tc9r-)KYlXT7>KV(wP|$koJV&0E^E)f|BK0%8CwL3L%;DfJcX=#ew1MedaQ*)#_9Y6>9NspW zU2ynS$2|R-qWQ9g3;ExA7&lJ8**J%}$XaLrp-&&`x0LW@$}C=Ys-accM>nPNb-l+@ z-nTM;nAfKzwN2*~_%|`}GaI$eA82?Z*CNCGLq^bK)tJ&VGeMESqvL?&RH5#VEzT zp@{v?!gLqSi2-cFiM+-WG&j7}UtrMmW;^@T$`i&bJQ`0ma4LK}$nk!|-{V2{jhCf9 zSosA=HSr%@Z7CN@gf4}kHX<>PuuNH9g9K+6y3?h3cWNQe%bM{wX zaF8?NCTHP!{S}-G4jNzh6ciA%@xb?P=ToWywud?NtPlKTnUl6)sf3BH^Cd%_x&PA} zmZn$4wNGv5;n|SGBk#fdT$Am@r^vDbWfAeDg#lmu*_Y zzyJT`w_a|F^HbPvpHL~jknPg9#+%GV7AYGzrs)ZO)eSmv*g9&%mIEBR>;kFGCwx0L zw<=WqS6<5LQrEghqjBoQ{{fdIJ>-|vw%%C9s>vU~#pLlWy=BVu2`?Jfq%^)rcjL55 zF>g{ycx%gM!?3JhAxqu{BGikGjogb8rd|hC6ng7DhD2MvSQ+!Wqc)PCGUpScPQq}g-SuUkzOTXew zt~BOF_J>={K6K8R@0b%|%XFF3i+e#8?;b62lZ3M!8TXyo+^53OqIbZ?L^NoIzo^vKva`WXoLAc!^P1_>F_)6DN)^M`bDh2X6YpN%E#ThZ{2@ zTG^5gYgxH0YjhDVQgaH~HGzfW{Ts!tE(dun)gl&i+=)wUD6LaabCN#L^FZZ1!|99@ zFWGYR0zT>oJnv`S#LxMJZ${J+4yBZ596KK|r*E^Lv7Eh`i#LGzlYY=~sXb3*O8k!0 zd!#?Nztw29=78<@1qMv-b5mGEr|BeoKg2FQA?>3>UfbNVU-KDD*+g~PO&FN7H5Rs+ zn#_|_Y!%R0bC6fZ&27pt#uxt*K5X*%&|z0{Q*28zcb|O5jpnmyEK_xRKI{|HkaLg_ zaev_UzTU$s(WyxKO_s!jW%&o5u3a$koBf4zdPV7ylXMjGoJ~RmU-G5czevzH(I6ts zY|NcfufJw9pWPbXD~t(EJbI039FE@(OiO9zvuA9T&X_h$GBe)p$l3{RCNp?_)HgUf z2N)dSlW1Puthc}Eso{@L=4@ido*C-cA3P*1^07m(!sGY{`I7Y?`sM8< z6H+BTY%6B!Z@I+uR43puSJ=q|pTt_+rkM3yXj5FI(>O)HqlQf;fQ3))UwfPAng?v> zjT(+5d^0q1kp4eI^zHxu9gQqA>Ly4Wk>Bv8`_76s-WbR5FayQ#B@>L8pX9hLVdU^Q zF0MF5m;62c7q;m-{%scki|7FQ{Y}P&4@>Fxe%mqd~X2$GN z7g*#!aP_&nFwbEO3u})3E5A7>spZJ`{`dA03G9ANR$qNQelnW~v)sDQCDeR1_rd4n ze@@$)|Ni>PJta#bfqhO>cyHrZ<+OJWaVbt-{}nbTY`$?KljV-z@9*+)^~MLJH>_y> zBCy@zNW$B8`wh+FjfG56qU@)-H>4i;e{e3hN9Cu_zso;->#BcnmHU9SR6{PKi;UuV zvqPVls&2A%R!6WLdYw8!_Cl4A$ej&Fq9z9zENi~&GcS45!c%rAtnvWc!GF$Q54+n) zNGy2DcjT^sy}==NYl#UA7P1WCNeyhfW;|?u!}DPa%jy3U4AL8xmwMb|o19QAcsolW zX~7rflkPq|7gD%nOB(MQFqiUM{Qi?J@nU9u*8C6s+3W3@`3{^o;b7RX)b)#*@lLkM zyOkL3YH!%Vx?Gj*h=RlllUA|gJZC)8vm8IMFJb2Lo_yv(X#9n%8+V=EeX2Df4Nvyj)!JOn#c5Asd6lg1&SWT;JI^yQLM*DQY-pO%y@BJ>#-GO-v?3gMjX&7M z-%wy@4v?vm75}k^G2jLRdxpa<$8U}2Bz`c(^l@jo9F$tRpiNe~!kfipZqwaE9P|FN zna9mk+-}`q^?SnZz?l*jH!KeJYChS~9=heh7EUwfpdCg=N>VWs+O*zG(7B<&rSsPD z569~sBO@oikIhRIU6MJTwEh3Du-WiLA|KcE`3K(0pLviiK2!36_jQQ{%nD~F{QdtR zf-!WOMUDdq_~ znr?lNzqq0G%#O_l2OjY(vm36^4h9`L!99Jrb_pGFwS=P*EsVa zgRby{@JWUaRuu{#|MP6P8rE|`hI5ydK-CQCEivrvsweU~gxK8Dj;!J@xOwo%35M18 zXG~!Kbs&|`gij*CI-w(oMJQQDMkYZq;3wBB2BqW76#)XT$|DvtPg?Krt?5yl;H|=j zGZM`_Or`S@W!)kqIi(EP`C}MG8&3JBB^>9y@_w}J*ohlJC`Br5gNHaR{h~wIg)|^---V3#VzX(b!Kl5O% zkHXdmpV%bsEjSnuaHIJYXTVKvX&L5=@%w8N8FZUjfAhZxH!}-kyTHX6@RQSB}(JWZ{dyW$fP zKXO-GvRYx&Z1Ki^Pe}XJ_75g}#*-PVj&bvqAM_4)bFn#kY%Am7W`8m6nk9xWS!%h1Qp{+a@OnAyp*Rxf`9%Iri{@;B2fKP{+7W0;8$t}^K95BVQFP^>VOF37i8!NaoD+C%L3c?PTP zPj7!;&$Ga}$+1*4gIjmaTCQ&A0!f~^Eop6ebD5r221JXdm}}hK%*@ZjepFO@M=eWd zVT6U^^!5#37_-9-4xQ3q^SCXuZI`&vya`6Vf?;w7Mu*s=913}|&NrMcf5B__m3^nT9_h|n8HK; z|39oP8F7r^;se#iJQH|W1NmQ`IIxXHL29Kyabiuxv6fP=e~#%AilXw17O|%D1RQ1T zWp0U1@IIw5)i#Gsa@xcR#!SptY9}01Rc6+CsJ!~;fBE7}S&Kaqf!1pO7v?pZdL&Gh zJ)z@~F0^Tm@U}Z_CXe`nxUHZ5;{Os?6Cu%bnDI_!gV~#gZ;ffu4x3X?)HQBQlx4n< zp^)+3z~j1o#NjSR!*0&c#vN@xnKy}x->PgeOE}n@pKzT2NxuX+PoMu^czBnO&xy@S6U6uy$t1RfG2B>fH$n15Z{~+HH{w0iMYmlMwv=@W5={B2 zsIm6IBgQBEH+p0vc+zCIOlW^&+pOcwZW`psD-qGk(#M@qao`YlP@qC-i-cmP%+3og zoz5E$3-IcDTx89CYiMwQJNQb4qmCtXpNwtqM5Vco|)oAXiLjLZpq>dI^G9%-24 z_wS(f-3@&VDPP27&iNSpSCG1Y;$5Nx^8}MKJo5^eO2r)JY6nO(ukT=N6W8!@?RHdM9gcRI^Dp$=}Y5Z#zGlpmpOuVA6aLcxn5t!Mk=w||oA{99=BpzI7~Y>Z zIKcMQ!JN^7?P5YA`|9cme;FqwyGmC$>9t=tt^LGks$kTMgJDk_KJg2GkztvI z6EFWHo6edjxV-nrw_nB+xF)u_!?Zk|&F#p~SdD}HC%F|AKX_gI-|>m%Sy0N;jxxqYJ+9}9HxzLlU4G#k(}|id z%x;O5B4XtW?3gnW7`9k3gxEE|N{ras#-SdO{lR`uj{Can3h!E{e4Sv%G{eQKwqu*- zjky8e6D~-WS2G@H)n_id?|gjy#uJC6PA~Z2)XP7`i%H|} zfBBUC63ogaM|wF+JLR(;r8elZGoOFp@c6ZT$%4j-f|V^31eZ?!EPv}}gK3RJuj_=H z8`_kL)H${#F^bLacxri}fML1e6*iVl`xWxsQj8|(O$c^;_UAWyc8|lf>?Uru3g&Lc zJ3HEY-!wmx7O_+K*Z+RLq{HUmo(G|v6K+1XKOh-0VgA8Zaqbc~jw!JVpEXKnIha*U z>t?Llq?uubMaXHm@tubQ@yawYQDEIhr+T!ix-$57$h@v{&CM*Wz@8of7-i* zw>A-~{EIJg+f+2SJhU%4ub(2yvL=x^Zru^kUBkvskHw$N>Ys0C(D1G^l}VpHjZuEn zSN>g0O^mDff+CbINo&+77{^|)J$c}1_y$J)fH_U4^#f!M7V%YdS}^w&abHYmWno#u z)3mgHMzo{w_x=0ok`kUiXfaW0T)b{VbC$yC9S3?-GCZ0-f2qIn^v;9{ZhrSWvUtLD zoDK7EHMWGD;_2z| z5_+O^#ZO6?c?n~8fwtEkW2YcKWv`nIMaIk(Vc+EcOewr^K%7}eOd>(H;De5K#Z6=3 z!}1TV30-(-xxvxqiWO7f!b7K~+Se;yKYs8N^BQjMPpUb)#Zppvl$p&A9AP=RT*1E4 zs%pdQ(u7o*HFFqW{$-EvWS*_teB{yp{~c{cC*o$@K4|=r=fQ(yhb4?`KYT17z0wVs z{Mp_@w(lW-#+7{cA7D zamZ3wJ!ygYE(50{iPt}GG*DhQqj~Df2PMDxqrU%bpHjadg6*`ivQ>$|f91ECX)M!c z@J!glqdD90^n1nVS^o?i*dh~O&gGQhzu&ldk3ylxa%Q3U1-h<29_^Ewf)CeUDPomt zpTN}E$QZZF>5{U=Jqd+WJsU|w0|SLa^91KCN&Ltj#P8jHB2#=4+r-<99iN!C+%H56VlkNN%=#x49Z=P&q4-S9nN)H!)_H)BnNq;kq>v5eVVN9O(i zP{S2j#;qBAu+)NiiI4j_^MjduVrM*l@~9nQS^GP&@|%6pB8FD$ny36*c$!W%Uv>Vh zo$*2D&c$E+k|lrH=ZPdFHt@PAyb@KNY8T%7bwN@1K`Q;xl;wcH^UQx>yZF}qh z$LpSd>|0YFrWZ5>vnqf2qaR?&wLV;7nKPT4LuFGV`?x+YS}bHEe1t{2Merw&(dizK)f-A!jhZ>_J}^XT zajh$sRA5y+;k&?*`^Et-_76F%6RI5-uQn)eK9kUPe%k@AkdD|66Rw!Pb4akHN=*9iXvt-HE-}r}@Zcv6 z7nURK32AH*&CRU4*ky&*ImkP!dnaU07F^rZvQv7=zx(z#)+jJDuer?sRnTOk!Ga^k zI%^W1$_kelFzo!3-0+fux?n0J#94lqZ=5d_Z`+tI!)`DEG1v9feA{uKCHe`HRyi7gC zbb&$Z*#*j{7$TU(MbalYFg(x9Xy%_*mT-G-!qZ#!HyDh!1arR@X}qMg<4$_RlU@Jo z6`$)J@Tx0t7TCqglOk3j#%3mPisP)c!_oSGf07!`B>YWp5LvUqg!`kua8SFj3X|UF z1$k|)$~%JDvu6DJ#X3(jH90+*;q09zsg*fv7ECpq(5Cg{j9|i{Kc61*GOLU8@6ch* zS7g4$XlFWC(ond6PFg}DNA~sw&!yd#nDJY@aZEh+LB4J>=vuXH%l~`4WDqHuP;>Oa zfkQnK7aV5vN7%BwVre?VR=UB#`0|?rHAk89&O2-iJ#fitQBLDA!xiETTZKi+*KFAP zm1n{i?qGhqHQkJcjvx3lLxuP3J$B+mLsVEpGRqux$J+-LdgD(#uv&7K7x3S3|g`cvQrZu)mrC6G%_z66y0U@n8t^JEWHT&v*ip#Kcb=%&ZMJ8W{rCIGxIK%g9P- z;XCrbF(0>_dIU3MROBYGz6 zIl?(dg^^X~2OA^X2`%w}YOyU%VrCCmSF+E1ke86+^2FIK!>*l`zvK6N`B&c(J7)do z=`i{(&-|o}!Nrm@j zgoJI@I6OP>Dk@+$qs_?!Jdz=8Uy^4?NKClh*0bT8f{v`>tN0HrQo_Ps(R^uUPxdt3 zpD^upy~j_+osT3Y^?T0!+1_ee!N3rA;7|M8&?EDL1Y7wsHD_AX_Ehlx^*^YH=6@GZYvq!vyd8rIq|;W-Ul&yVcOXb*+SgsLqZ{Ez`6AUu3)2@a-Aw4+b=DWw-z*u7xYZ<6Uvxxuc30l`&UC*<9Dxr?YpF2M1ClZ z;pw?h(3n#9VN=?Jp9~xLxFSqVl9i-7cs?whv%#X(^qB+etLgd+Z0FfG^!odKco?H# zx{PZBB3Z{}V-x*|>9dE6E5vmv!KZQ_FB~YGj;tt@j6(bW zPmo?Up{S8_J~cmDrm-El|s%EqTGd}dAgCJg5S{{CULwD@da z;=pPtTU_+HNqX6bsaY4SS_L(I5-UX}^$Wafd}^9f=(ePY^+?;=M-4}nchsdcneZge zt?LM#P||I2Q+|@X!)o-7oOO}bD;S$+X|hQJAO>kKb*?!b?zQ~ zB>hHD?L?U62KgBh5((@l8}G1Zo=|$X+HFUFBjZxLGzW&1-wtVxY3CGP?Pmzra9~>@ zDG{--`Tc|qj&sCWW}j@Dx^uyoRx8ccD-mtep7l&{NOd^EZ*rD_RpIuh0PFh;L^!nO zD>mEzKbXGjPvbhjrZYTB+vFPFv`zoa(^2zRK5C-FBbkkdIE3Ey1hn>aRI#s-+gj6b zW%~p()(H6!UgkSF9+A9#(k<^L65i@|Y)^bDv4;8oe8y*H1vbr>Se1qM*fcLWUH>7J zal#+IjqGWxI=0HL+RSU-sFdCOe_`&|^aIQef}iD61KJx|7_{XloMvM)VmQ~x;O23Y zEAkefvBV@hhg_o@2d7OqsO$2VeYcXt9Q}WeVHcZ9{x@HnyTC|vOX+9h4?XGu^=-4; zXESb6eW`yqKVv4>&Z$r3nct+z21s&CDKx~|a(*-3;**--^6t39D_6HEoKhZa4O3K4 zREnF0t_=$v4#i>5Qi$PhMT$|KN6}!)+$Vhs@Ew z+O1nE6GI#02Ssw;dbZnzku7Kjz!w%5dVq);IE&Hy83S zG^iX9Wo>-w&=aBMmUPJ|v9_n8m(g5ILxST#x`kmg!-50H%mfeRwd@;=>z@HOZ`*E=|VlC2Z{z1t(opkd^T`%=0YYC7mPdd%eqX zzBw!YEAk~Vx3U%)D4K3wkoaLf<28@ww>#NqGTy4^nz@rv_kQyoK8B+2@h>t@*Do|@ zZg}*A|CSerN4osBT&73m9?6_55A%0%zu@7^IQEtQ%ah=MJqOlpZ8H6oFxM{PM^hSm zVrsTt}IL0Kj>I;bMFXXIRC{Vob|vZ#xH;- zLH11#kBr0jLvPqyC095e=g60FzAVGMDDb;{*vp3VO$iO+Z40>CSX0GBgEXA1{{NSp zus*c$xnM?GyR6@_106e;eEMI1q%?KHmg6TFX6CZXd2qb3`O|zZ>5$aR4Nj6m_b!~X z*7$2=Z0w-L6j9-HyRK)$1-G-oCsG;DobTzG;5fBjV{V>@M1z*fgp&(q8#<`hHd~u6 zP~FWlVF%;VllA`-e)9>=Eeoh}=5cDOJ;A^)zobjT%$bFoIU;#}BjZk{v=oOj^Q1D_ zM{E%{4p?pf|9@e*k>INdcNx5=D_AEcG8VI|yftu;Ua;Ym^hF1UCG|Hh*{N(daAGqI z*jA<>YVdzy9rMeED|ZF{H-3_<_{KD&P4b_z)yxegEa$KHOt5G>d!zYOwwl_KgT`(y z`x;HZE%cnk72OL*$UROuaiEoy1PNvC%~rZ4D;0e3;c{V&N#BaYV^-x+a92%`%;)z0 zS4=#8py7o3hMO51tO~X`$sRn=AXKKX-{}*hN^jF?YqlpF(h?d<4k#u~Fld-sZ(#U@ z%}C{FgVgQ?HvB>SQD+%eXCL^gUeds}hkrU}mDSu% zND54--QmNt!8lyv;8VdZpLu0tT=Om{pJMk&7mo{b_^c=_Jnf)T#&4EAs&DPHVhkHE zi);S~Fu35w@uBYj{|U@`2Y+&{e9W_Q{mg)Amz&jd4;a@@U}&1+nxTF6K`O(cJP%op z*BhMKqy8(uvdWm)cja00DMO`Ko@^PrnA;@}*H_GPdSY5}#=t;fX&{I6#bb?2F8zP7 zg>m)DghEbZMzQ5fO8!Z1U<`H+&V#86sfKTa1E}T5!VApW<amgkZbkfRA|DE%}%F7ZZxhsvD*4!s+@9`B)eDi zh8mu1`-89a+?MQNzQivr(=tW)e<0fu#b?e;f|fanr98~cLI08*RwOfSKNxwS`C`tR zH#`%J<~K5yJ!W6?_JjN*54IUM6_y`Vvsw_8V0nYVPDRq`RHWJq1??Ss5*kaN3Fb9y zO-%UL)GAu^pJy8T%!S(A4q1+qZ6~a?Kg09jYP`;x1n2(~FZ^WBJRrfq!0DvaR<@e) z!}9Vskz$eO>!tXZ1dIh7US%;vq)Uk1JWaA{nBi?T6AaUStbiih*D>G8s-aTf&$vK;oQJ#%uu5P=jn**!p zj)v406AOp(iA`^qdjB+Xwc1}0wo;Tey6{hHfwiRMgT*ftz8|>D@+P4vZMDO*#2l#=^oNT<3v8A!B{9txWso}9 z!n7G>Ny^LU~V3!7WAA^#W`PGE8mAWZY$#$eVrKj-eP->1 zn>i=mXr15_kgw5ZQ)b>VnX}m5;*DeBL7tU29H0GZ-^Qx=luK!!;O1@x!wB_$Mww#^ zHi=yO+456zO0DAUJcZkP9a=?|P4*xBtYl;An36Ep#AA-}0clSK>Hmr{Y`T*F4u^j< zP+FQhVZOt!nFmiVoO#e#;=wu93qb+yeT*yh7|kpG{b%RrI`FQzz2%^NfwNFZTGL_1 z2)o8lf+?zE!pu4Ts>VS(8XvKnB{S|@Hj(pEBMYm*8wZyFyH@@k3e#8iY$)QL^xv-j zC(FEx51&0^n{UpPCt~Qt7Ub|$N4Vk`=cGEvN`|5fN+};$CN7&Hkr2rl^X>54<|o`P zb`47mBc97E@fGr0gf1?zk(?;C?u2Y@1Uu8Cx+ju`PfYmqge4ZTA24)ID@$x=Z@O|& z>feK1QW5-(uj4C(TzDFqF6&;9Ik9ljg{Q0j|7+at-C)Bz`)E>1%TMMc4rQ;KOhv{@ zwTq{PFKAq{|AU{-3E2fZTAxZ6RC7q|U$Bk$O@eMmwBoaaY;z{CzkhJ@yM0mu+Z0&| zNr{Q4SeD%8k~pX-Ds_+N!j6_{#vXr717@D$(+Q58;PQLe-jsxf7p>bP|0`SRcT~+0yu;c4Q_ynG!Ccu2+XEcB*Bo}fvfr}x z2nT<n#DruBQ~%!mVL9Rp$+z2B743p%Az7~XIx7JQz}xh4LizJ+TOSF+rLdB^H6oMKxd zc1JVG;f^hj-5=?!;>A7(5>AuTVW%gl3=g18{3V49&Bt8i}{M$)jjwt@@<)0 z_$U2m-Y5T4o|(NsQbT33qg305NalcN?Y)l-4HlT*`S1MgX>DC} zaZGFE6H976_dt1?i}3;Lu>T91MHcjMTgx*P2?&0vLGH|QKY(y~YXjXm=og;weIj28|< z{3>q}Gylq$ytLY}_)NzhANgrl6w;dhFzNC9KP(l?!(-og+WqFv$^*^G3g0(6oM&Qq z+458NO}?84E1RC%!=F#=_cVTypS3R`lif+#>SMw5KkX&EW-P1@edyhDFwLmJPk}*S zGW|%@y+7^eMGhX~5AkzMvz#Ecp67zIqT^2%srvs9HvgE=r&F{my~WHfF-c&%^Ctlx zo)E(WhnfZFnJQ#CyyV)pmGzmwODhj&c0tvz^BlbU>OVM2YzXY>V6IE}*7((#{aiwt z(;bG>_=-mnVh+ zmV8m0IJCkYpQ^GKtT)M7#uE1B;2-A9EB_he_p-%3;I>0E{BhqhT596W7s!hw~U`AF~oe}9|vXE*U4t7n_G z(!TNbB8wZA2fe>qT3SdXu*WF={%s#r%f5=)aUYZEkpt!C&FrB!B@(pR53r~Hbv7wG z*lUzg$F}s={rbdqR-;4f-!(5Sbg6TGV*kZT;EkRJqj&m-+7B;2GITRPDPzoGklyO~ zLq2BvK{nfigb$fZuy+eGWWnA zKJV)Z|DB}I^=O1zHZ^TauhOIMl;@X`N3@eYg3 zkA#MG4-#9Z)i3xomvf^P!!$q1#J==~5|s(*mXZ@s8FXka2<__m;AqYE;Q+hNdk3pb zgYAdTrl+v1-;mIBE&0Kg{*X9@^<0S#%p0~i=RBX!DDB`Yp`rER>@VX9OdD<-?C`hu z`Sib@EsM!*OX%f}Ki+$EH#jFtN}eo~RAydtnD27$9Jz$avrx1jNjh>uU~S|fo%yV&y!#L z6R#)MIqSW5sB7~zTQI%3!_1)QR-%hk3d_0-rnu?6tG+uVGJmqqF%W)YcBD(~NaMv7 zhP@f>j;Hk4*j!|sz8DxT-1hjtVtyvGxX6)Z*&a&C*REd7cQ8>j5SBZ^=+om<5v+1z zV^7MGs6$mBp0iXqwqIG8rcxx(FyZcoW9)kU#*XP49+A8Z*+-i0@J4wt@0Q|DVLxLl zP%J6=z*|^SQt_&=@{)(Y#jTv#qptB;eH7mm&$@|4GK8b?#{=dH2|?xf4UxhVY$q@= z6Gw)c)5yYQ8#reCrlmjC}1TV-;VNv5!A)IEGDFR^Tas^5ak z{s+YzK1*2$|7(8J_=u5DrQwsXI=gtvPSG5-?#4#Ooe8a`6^X3^I`WJF@GnwwxBF}^mE^Am45*+g1 zIOZL6$Td-ZZtB6#CNggWo4l7@O3O{|jm#T&H8Vb9a?2^?Iaxfxgkg1o#KlYIXLx%& zHqYbHm>V^LxBlVp{Dtl2MhCw9Z9mudzj?a!|A|^Z>M!WBefYxadpsfhfBV@}N?{ut z(;Xbx4;UILNpbQ_C}F%U&KI?o>DF!zYYASVvL*4&O} z?Kkxk+St|1a0&GfB!MY%sa_tqs+SLy@-hh^PvSc2hOxa@G=$KD=RD2Hh!|tS<1MgC!taA zyNloN2?t|e1jVu4I3T1FmDnEcc&3eAgLzZzhCLiYzu9fo*>%o0oT&f5kXib{mJjk5 z1zM*@Phit4IxHH<_s3mVLm{(YFi`BkC4nQpD^gjQMI1gIk1v?j_(MF!PGf<@geb2K zHe4@v9OCP2zRh36u6!i@MCAwjn%zQ0KMveD5#69r$v5rUj0v9iu}Oh@Jd9ohAv+nki7or6uwI@M)DJr!*rXf6H6O8XUT1++pCl?zTW)(>41A zyQXw<+GVhL?fpN2Kfrm_=6}wQ1;x}RY+<}x#;6yrkk{7AxbWQnhI7A+jTVVTZTNDo zf!SfQEpyy~6ApF^N7=LN+KybUU)0<3)c=NqfW>jaBB4dUQXMi^GnqDTvupe$v%@Df ziH$$yAM-q2R;|U3r;i=X4Nch7thP#_lq2Oe!eG6n0L8xtM|g4 z>@oTcM?q&GPLAvN!ls=q`JhzXN1i#zn!_?{;&!1!hlDrYnj{#L==3VtZA#gp|NlFT zB(7~sZdjMs5O#;hpk8tP1jcxO-nF|AJQdjS$F1LKi5)xhB72tX=Y~#?c`8|1*Yq&% zd~I)XE}>GgZn9`lCr_dMA^sD&x*Z=UGzQI(?D0s|ddI?knx(_#=$gfAuQPns(Chub zu$9@6nQ=*)!VGo}YpLyA1x(JfL)Ft18YbL5aay79CSRAt7e|H(Q71C&pB>=Tnb;tu zvcQqyL+#`Xf2BFTJ1B7!F&UrWaZzOIVh%_a+4e+eXHkQwg2L4WeOfCXG3v&)${u5$ zxA#B)Ta!j19%g0c95Jak_6u(KKe(EH=D=Tr4J@n+1x0x@j2qM46weA4JnfnDL6P&1 z{NdT@{1O#ES`W-+nh@=<`LV&~1d}s zUB_NpZxQ62*U8*x)^vz5M51xZros(}-B}_ZZ0?z$YWd)tnlkeiN5(e>e}8hnJ)+1b z#wagxgd@_C@!n+)zx*Da2~Q8!AKd(JL)(Ax2R))2uJY{*;}Bu!sA1Mz;_#3)Ye7@m zSI2*hYo!?V#Zy{DCUl&W`ZUkULyF=2B&VwfzsWRSIlRfF=;^rw44MuH5>Ihxf0H<1 zyqiPLB-Pl-O8&r41-2P>Ga@&zF$xFCF&|Z2!gz`!{5*$$@PEmF&eC}sp5|`ovshB# zerAypm%)ooRc>lqBKh3dA|9S((7kf-spu45@BIpfGkz!Z>h8F?prFC*gWyytmH30! zKQ07G-#mX}wVA`*dXK|XIpq=_6is9d6lnhZ$lk^C<9tRjz71D}CoG-blhJA_eCgz~ zo*s^J$3H*iS2Fj$NO3+Scx`2~i(JKTR-1T-JB)hmGiFLABr+Ato|!LTx5(+ofBBW4 zd&KT5Z2kZLfBJ!S;!(PP|DR{z^a4vDPRdw93h|F$nVCS&5kv@Y9$dFp`;&GIToIW(guTsGIybC6ZLaX{Dj z%Nd>tKNWU6Tz}ih$K4uxnPZjzL3P9Ca~_FpF~wYR6|8*EnqGNNm@bg2vZROkC1dFU zhw325M0U%HDUx;x%whleh3-$N;rgay(W?~J@9@bi=>XqFhUO`q7w$0W)hqtxkN9yY zuirs0Jn^OcwDbwmI|WJ?*fg3b9OYP@{@E0>tcEAa?CWp&|s$RBY> z`4YpTJq=T(PdsD_XV3m<)G+%ckIx5#G$wXY<)BCwL-rs)r!Z>+!vj)(Hdrz2(bN#}?OPht-|9rDDekI`VzfZ@*@rWXw&hwG0V zT>f8?dEF84n6C>%(uttb_4cz~E|`#%a)7bGE5Mg|lH>n{FFDr6viME-FWJHPq0A=g z;n|L}@(PA8R!QAxFwJ3;4*6co9=rSWAuhQV)~V|k%;DO%@u~e1xxXJDOIy7Af9Sk* z(~b#(QFRTsW-o}I<51;zJM{tc`kn>b427B3oN0Vwc;w8t`ixmlXJ7O1bXW-q`8}A% z7*yRck#W+0$8`>J4i0?g5q1B*%NtrY$gS(iXk^u{o^c^e;ouR+gN*n1jvYGFa7!+k zWxD+YM+c9;2RL%o7wqO2vo)}H+Qg)ENuhF9C!-o)p;DH+oaKGzQwkn(tf@r>n%viT za^EZb6iiar5lPs|IQN)O?E^*zj|68eC6BAkwlkY#-J7p6^muSKFsdh{9AG~n==n^6 zL0P$Ob7v%PL$(0JZ3l)mO6`_ruVw!uWMfnBfBYD>?ArI#P9W%;it zD)eH3@`p2`7L%R%HZb&``PVM?Dq#P?b>__FVv>%Mf{)h&n;dmvi;e?fWm zVJWc(k}50YBAR7I#5dfGdg8+x#JwuVV#iMj2T7I^cMWEXU}L9sW=Sq0OdkUN^J|wR z+^u&x)M_pzA@N}9pZbVi_G@gCz09rh87jg-JN_pBVAZ+d5dQa|)XN2p0w;8MkL0M` zSYdg^_QPL?2}Khh{*U)~$TVBEOgjlUeXJ2>$Dbei*m+j@!U z6~R^=e7B;R~yu z{QrrcB$-v}o4*(`ua`+_;(OL`r7^umLg4!8gQvaJt}vQCY2!*M6TfxPC52~-qiluc z0S3zx!Y0uyUcC41_N68;$!%bN?b7)7%Y4Q=J6K#rl<(ZD|KP~_#E9Lf;Q+(_<+5+Q z1FD+@jb3~dt+-^HQNV0s@Q-`P6roFktnYl;`4%*6EBeDKU&9%h%N(hAoJEd-@$NDv zIRl0^UhNutbCvo7m(+Fc|2;0W?L;M`P}_nN4cprPDYG3pu&C#PV z0gOWP1(&fo9e%`_#I&TQacRCsg`tzw+yguQa?AF#^%gi@Id~?q;fTVPzIM}?#MMhA z4m3~ZD0jNUzV^X{JN+>#e~*9A*U_2qTC&5_!2IxKW)p^lMBXlY7s-|n*33ce!ZP0k zv=8i>cshhl<@19~>6J3BedaTyB^Lf`TFHKKgT-I|T;ayG$tg|ufA@PVo?yhk&5I$7 z?Z6#I&Gv;0f5>b4Ic7F+25xT%`SZKq;y&xno|Y4T+ox<4Xm3y!%rRCLwsAl7=%@V} zn`DP2?j76;FS+IP0_HBb;krbhZN*K4t^Xe+o@q#tTXUv$sjUF7RSY+*ZZx``M)w0}u@I3toS4xW4?~|MLv;EXge@ z5o{-}*7NXes5#BCcCuqBpVzMTG@lvu3UBkjY*RfEKH(GRwCn#4bE`io2|uxSa@HEx-k@YU!@r5#*1S#W*h1cx8}+xD=;ToEkcP~6=q$-+?n;{V^n8@g9G zGCXi#c=18mL#a__4T~Sofi9LQmX5vhWeLw^LMofy^`F#r$Lg5p|8+=+a zwm7(LbtwA3kax}g3w&S7FH8-*Al&LWxA;hog~{SS|NC!6GPKJnZ9HrwyP}1$^wL4& zjXoVu`&OL3`_Hi|o@c?#s<5{C2PBQn{PI5Ry_8`7pZ)BW&5qK`c^+st9FUZ+e9$qG z(N2mlJD~B-2mW26Oh?$}-}*1Vs871$8k0tk=5#_j}8Wii6T@ zJszSb{{Qzl-6qH?y+)C1^$$T_H8!>t%oDYYT%I27NHJSs%;06-k(x1K50}^P1)|~` zoVc&uXt>e1V^Ig=EWQbsRnOG8+;a(G+Q25Sa`qsboWk!biS0WKjg-Xi`FJo(Cd5t< zXcN=y>FIFZlpraQsIOcUEo)_c{6NEqJj`k|oA;ynmPbGPIf|c{ zuy(26NMKRkVtC+#{IunXyuL28T3bbr{QLi*?BOAJks8;8;^$K;xReBxY;QC*~J)j>o@v%k?1Csb_+t`GkuL z+Jq~~Fqg{UW6D#MX)Rk_VPAJFJ~KVYb5Qm5SPB4&|kr9m2i;vX|RT_dm(E=2qd(Ueuu}{Nx+&g5M6MqWt{&%rEjXC+u9%y!^oR=uHlM`L{K|pFl`EE(choww86J~Y_ZVQo}c3eVY!s&zv8K-r%Nl6W+0g4})wL<m!xwA|>QwLURbW>vgm-LL=hmA`qJE4C`A#2)x_f)CGooB9xq|sm_HWq6$7~~SykN@3o)4QO)%rTrBVwGw4lI~=fj_AAjlPG?|K{~I z%|Aphr6oF@PFJv2T>V#JF5``zzCArFGFgr!Cpk^I{eNL^?S{KN9;>q&a!x$qRylh( z?4W~H)`f$K6?qL;*9x3|@bN5zr~CtvV;wdf+?nqhZo4ihHh1{hCHRc#$``Ke(+B== zYwmVj$!8*QkYoM*#7d?sACn!J{x5v%%a+6NBp`xe;mP3CYx34$ z^=kA2JJuCvSWY&7YF^MFa6=|Qmh+W;!zsB7y~;jkR%m}n_{lZJ{lG#duVS7PnL;XD z(g|(m#}~H0aeVDs5ZAatF;zAxnrG1&$1Be_6tM`#^?0m~P<(4Pp?;y&gG|Y5ob5b* z&UZMBnJZQKcE~bnrT%xm!(#T@Uge&|g1Y9fodyc|-x#IM-{}*OTPO=q96+EKnwrG;&F$MK85!UeITjA*u4hfop@!24?PAyv&`4xhf-4 z8Rnf#bcwZMD`KwrHfN$>oM!WtW`mpth9zuaJDWc7|EOvD|9_&NZF)iiyW9*k`J;tYj}0a$sf2Xkfc?^7)fT zEaEjAs#iKP+wk;kn7MyH&x7W_4eDnOTLmRpI~qUl*`WHEhv!5h@994ec=)+a*H36< zQ+rVqAK~~xUYE!5AXD~(gRAU6yyA6P&@`R@fAg>Dor0C8+0z^kooLYTN#u?7XlJ|h zkhT1g~=7GHQ!-;sDqqF^1Cr?{7<5$j9y}Ei z5!W=;bi#-9goe_F#MKfGuN>#5O|UxgaNYr%{wZaS|C;B#=w@58=SV}5##8$*n;6Z!|IBCf)EBOCWjIl%=H?;uKRtzoe_4}MAJ2uQM<;A( zEh%z*DP_{$c_*-Oxi#C8HmMgM4*Z``9C6^`0hXPGjC(?RIZM15p15RBi2u(ZytjrW8--SEq6!WXtA&pu_q^dVxD0psmQ$M!OeO9JGQWR zU%sGnnj!PeU*_i@|35gUV3BU1FkN&*3D2t6ipCZj{LCVxyP_sYF8I)J_49;ZZ{?5u z3wO(?WGd2E+4E2F>dpnZJQF^Nl{x5W^#5(1$I7CutXQ=$+}P-#)LWhad&hUX+pjY7 z1T<(omXO@g*_dCSkme>O(5|zUy6H!xLw=4YMa&&zj)qG~?#~hk1;hf12n0 zJ=k#NMQf>7VyXo5p-`R;Rct|Jf87i9bMEW8$g8Y-n996mLGw&b$(qCj2Qz7*fBz>Q z;u5M`AX>Fx*Br^JXx248tj{^s+}I-I+{^WKViL;^oC|3XUCG1q|KVgI1yg~)Js%|P zTIyVG7%EMj-{bK%Z-#}AOk!S3tMG~#N4X14J2}k~&YWP-)K9E)(3`B7r6{X-W4#TV}MLg` zFiR#>Ph9lRK1jCrO@72~X|oM{nvWgcwJbTl|3s?RzM6&<@oS6>6Kre>js6^;sdZ4$ zGeLkMO-$30EzP{n_J^^eg}_C(@`HJa2iEsXfE&;987vtbk$ll!@t15)ukW#g-go)pki({PjjKgEF&H>Hl;G z8MBr<4;X&8OBVHt8Ve_h2p?-Z}1@)#2(aP z*u374DfN~AeETL@?yQEUKc^2LW}Y{fy;Q^DI?q9=oD+F0b3ORDoHxi+Y-?>~tn{=_ zN%?Qjd_=Ehz9K7s%7kvtcX3B@_}83iyjtGT#5L(#;!m+@^JdIQP~I`&kdzS@w-NcZE%L&B3z_`8v&?1XpZn;!SWk#2CcsSao)S0ZX{qgFb#2K9j>g^w|J+l;fA9e`7#b#c_)NiJ*=E~t~8uZcbib{a8}|=B&&x+ z!`ol|9Q+ZI-}tRoF?wY$kSq$A$5K8+LSb%jfF(!dKK?s$EHW$!iH$k?8FNoFKFtk~ z+#>OS@g}Eq3Dfd_|36G&zWa@( zSATY!OZ~%4scGVgYDR{Rr!pdDa^05Z?F?6|uyB6W_MfNY z7tbS&FC~m#{tFf~uT5y&$vUw{;vqAKfqfHSWNOp=%mXa(@A$U~Ps#e<9K@%>=lJYE znDv3XOeg>FY+y`_XgKgnE1;ck%atFm!!H~Q|XsS?}lC(ol^!I=N9gS4B&@7$} z#;FcPXD;~JSgd>aRPM<8|AAKW9W`99mmE4*+n^rBmccF^^v3b9aF9D_kVs9zOk=Kr zk;5lWmGchidn5%@wKmn?XO$7ZT9*c&;9>}J!EN0Oj|ArQ9h}HoXt;x?Jx!uTT7i+}wEKb`Y*SaB zC}lVyqqf9MYe`LN13$}xU+tX91^i-h|NkrBa+qLq>_Ed5l>@n4H*!>c=15j;V_Rd> zxWu+&`9I~S@e??%odeBuel%Xt^boXIjoslE2M^0Hp&PsmOS}K`oOo)mCdQ>V|IRgM zwuy?R3c^wH>|y$U+RN5BGTSaNVV5dqow{n%I=+;@l=ruPN||DA_6Y?|WtA2GoY~?N z^V+t2Px#j&rV*gG;tm6=e$_3um#+8ZICgKAH}Yg&89h@%pmxpw|Nj^B_%wWCd~(NB ztl%}*8!<@v(8Zwf;dF&x@$gv<{gQof2=&++3H}W=A6Jo zmJAG+PjTcovCT~v7n77gOx!; zx$)bg<}ZzI-wvGCoS7)9rt-xh)lx^fkz1L~Boe}BPm$C(F= z|7|$L_{7}9mCdq-!_-cZm*K+;d*hU6GBG>~PM5;pI>EoCn4Zmvw7e<}-$^P+aHJB%1T!44Yn#VqVkS$p<*z zHZ)J;VJ>BqKCHvz)a1mopnARIN6y=;e{ow)X7v)zIk5VKLta8slZeKKK2c>ayC#!Y z6Rh_NRCZV>-Ct<-JY+M&>c$#A z9li8>K7U-FED64YJH-1!;V%n zX~_dW`xvi9I*5EJ`2CRA&*K+cEBlH-_FLciqB1|dmrt2*$vjE2W6Q_+jFvr#l_EO> zd3Jt$Y+vCoX?&|kiTTn278UO%8!oL(g)j9LOMlC+T*$kT_0EG726irHC0V7Z&I_iR z^~`u`wPYdJ+B1@htGyLIa&d0lf57&!!e<3h^OO|X8i(igC)Q{zNo6|uU!gW;!CFV1 z34F#C52kW%Ir2xGc});2@2;jp0#lYbJmiW>WtNg*;4NyjVqM@Sa>DLI4yUs6B_kh? zC5P{DYkDn|l`Dum$Z#&>L10aQg`vWwJN6eA=zH*191zp^$6wUPt$d}%qss9~u*)9D zOPp)|Fi-Ve&?cYrl-Wl{u#HD!E@#9)ml^DS6CZ3~X#ZI6!Opx)-tYk1R`ELuEk8c8 zzqp|Jz(HZhVO|r78Us~jW#$|Mjwj+L613J_?$Vg9$h>fZo07&IMRtpS?54#MKPp)d zyky;?)F5f$!My6W!&AN;8(CExyrT~?i)=8O+sS$FKyr)u6~V8ZEABP&I2bG_laZ8I z@Jr!cQbU=IPpOwGXfpln!EoQ zHG~^)*swsiy!Famf!qyK8S51inSJaNwlnf* z<6*&&_`mHlk9UOBIiAvXnR)8KfsSo|dG@r(N!Twa5>;W>{;l}bW=&tilB54Om>fUB zu-;tZUF#D`w-pw5_^Tm}7pyng=JPaH@rKp^`S+E*Y98+v(dH)w6C_VCrzYq(el}#@qr)i49)0%b z&&SqmW;cFD22>w->$=2GpLt76dn>CjbC%7YzwJACdBXUb&zUl8Rebn7|8G05mjaXI zm19l33=LPBZqK-|RzP9-fm8Ax`F^NKjxjFftMf@U{5d$jqL*gy)Su+n+SyP118-&JgGgOleo*XIj9|;_&WptBGBr zx0mB9N9Cdgs^$yY)K(}no|>?r+U($Mt_9zPnyq>l9OGZ3%pj+d&=zx_v53ForhP$) zc#3+?F}6KN8E$DLyLp|M;Kh6CKvV2fmX#rjk`hASFP!=-zr>KglkdX8(42zzhl~`M zU6_L&Kd|>Y&Mr1@0#{!nW62?t6%)@f?&<0mjOkRoBymEvXTd}pH8zoI2bmVF7Hh|c zjM4L0GCwd*w`5FzM3r)+bme)8{MdII~qURH6Q0|jmOn|a@wG)+6#WF^MKGr^#J2iu`G(M1V{ z8LS6bV)yZKnV%5ScX=%TFfJpJn^(0UF2zAM@gMiwkd4gNwg#UQdwC+}G;sI)7x*8d#4#&3}-iqq8URBYU<-<0o#7dk5yqWo&a>Qrf|g zr102&&qVf(?GqWVF}lB7;V{{lS!16=-H-458@J2uxy2?Dcj26rM(+WsLmO15EByVx z;I@fF&IFqqdwnJtaX*urG50~qv4&eO-SwIke)33ldAN#O=rsJ=$H@P-QMQS#m^-E4 zH0S62`hvNfH}C(H-*ZPUjOEZ7w&RQ$=M^@5VqL!Te@9?;1S?Pe0;2<$SXDkcK4O{J zwg9x-PSY?+w=l7g(@5MXxO-2_OvXK@*u>8N|9{wOanA#<51@N9m@j$!WVZ8f72UIi z-{djlCXsC+vLRwkVNV(^vniV#X)NT>N_S*dUy#6hR9Cp<8M90CC!LA};Tg*nc{SMB zCPZDxVh|G(`@v(uJn6l|yQZb~Pd2emxhL^(tFg-6gR3nHT=}(A7nlf}ERsy*RrR>l z_@sM3&xz(Xg=&ZD7mm#P7Fe~guHFqezc-64y!7^nF$%b&PKfl@i4K`RYhaEe3iOa+OM9zfjfB*lT`yd_h zzTsRr!}%{ve-HE6{$?<1=DgK+kke=Ngc>GJZ4XI~*jN0#<`L4Zl2$)>7diG?7wkQF zpd;ewfd-HL3qJhez8loOM~GR(Z9xs|EjGrTf{mPVpErCt$zaYNW#{}@Ol;qV8eUKS zj$E_<3$+hAtoC!rW&E(yfk(i2AH(^}jZd?mRIvLiFkEe5pWgVDU-%N2{RC@;ud;6f ztUPuzhp;t-EpNQTJ#Q-8^t&B?_6CWD2QKrhDC91+P`Q^d)kv9Hd6LDV$GkHu+jodA zV!IRf^L#^yn8CrD6E-BJFs!XeNOS8r9A?q*Br%V%^owIoz+5(|D+x{0_Ma$KRjGCU zYk%=wh+oZH`4gTRpSf>foyg36=EENT$cL;S%~kvxE+3XZu}b#B8zr6n#)?}l z9Y3DryYr4+%iG~!O6xPcdRhC24#os6xl?CR>wW)3gc*e}_8rsZmm zN9XYa4Z%XQS)$ZuH7;uq6l>z)VfiI8;~c|L{j6%-EpPVbhOvG8sF2eXubXu%nI2irrK*`p?A=bUJ; zSd!;z!dvSbZ<%I9`zhqLJu$tY8@>PFSGJt}_G{k!W0(8DHqVmHCtv13_LjuM zk_y!abE~)5$(-Sxpu}-aFuh^A=NXMxj_EW0GT%OZ^58*+?Bd2xj2Q;V4Xnxc*lQE>B>5%-BoPxsw zw+fidXNBKL=J(PKOe(ruT#fdBANy%ZBc`N_3+xN-_ z?Ql$&Zzzgy^e%TyTHwbaY$DsVz1QF%TeQPe4i&vb_7cZOvN8*K9_+r+IQ3Tjl1*$T z4o6QhSsoBHIeoSx}!q;nIp$(+di`nruJ36lcs%6y>g1 zDP{B6`3`T?M~0}Aj8Qiaa_u|#*xsTqq5VYT8HSCD+V=m94rsaGIAN3W-Y)3Z-~JT> z3GbMeDi^H!(ZAw~!D)Gqr;MArMfa?kD|jcd?WpCF!_03V{Ao8ibMW+K2U*38I|u%7 zO1@|)ThyqX;?QiRaNp@$_a*~{<&0m7Sj5^U_}Qq)9(u%aZ6)J#`HXb7Y0o4j1U4^B zsQ=&oM00{=!sZzY+MN@uZ6?@$d=SOCXS$%tYPPJ9=64osrT-Fpqi^h#e^Ai!EO$b* z18-7?)dfkZ`U9yF#&2TS9@G^EBr|N;E)&A%WVK{MWVjpK2_B_0u^&E75-hzU7uM!@ zh$Se_=@8Q<`Ty6Km-C!C;HSMt^FYTE`KNZ3ZXLA=dwDvpdM_wwGCihn)Z~cj0vonh zf13S@(^~azwv?WFkjZsY@5v{=XK5WbJ1l;DmECfwoAq8o)01qEsD!q%qyx>z>laqv zmULWwDMBLQBX{=k16Cpv+U!)`Ieh!yy#7XFN(1kvgXtcP+vOUpd>?3wHGU6oUbj5; z$LH=w&Knb%j>=bDli#uZtNfP+BQ>=n33|+1@)(YOkAGn2e}U(^{ey)&7fdaDAR74p ze=~m;>rqn=T^+sysoEy{555YVFkA8WUPtXZg*%IrmN}iuiHLEy!}_rCmdb{!lNNko*D6k6 z*6w(#Z}8pl0Q-aknNtN{`A0l4P`FjN;ScjCW$uzkY-#q3_WbC-aCRq zn>Zh_6-X#=%@6#<#GKU7Igv4lz2US-K+S+&)AoGJi zChTu=!`Hxs=nV_P$MGFdQ&dbl_{nU^+F$*Rf|~msixgDu9zInVFfSp^Nv`70 z`47Am(|A_Q<(jvqd6#sG`I^stD<&(Hny=|$zgk(}D6E$=C+0z!y@jmvXUR2t`8SDg zsp6>lCVoSiXF{~_zk}N({w6j|5noWmE!Ee<^Fce{V6Cm&4HtIiCv)@yVj4ejnd~=c z{L5@Q=b=6Gr)^vTyBgMtxchf(*fswJBf|{F2S?mm9T_5yOqyg~C@REZ{2|?((=!vkI&)dH>~`Sf4r+9q=Gkmzt#jr=w)MYew-*lVC4X4V zcQ{lZaa1*0(a61SMdRY%Iv$I6ZeX)sq0k_Ei*d8`v=@n;95E_}i+Y8cAAPi6BFUv^ zEGc zffEdw4Tlc#-MX0cgTFU9;K=`W^EZmUre{7RG_e1zuej52_lNwYL{{CCt|1N+a%C43 zu;)fIioRNKP&+{R;rH$SJUtJNX)j@9ioVG3Nm|$>w&{_S&F1g&fisL9|8lH#mT+L? zoHvoRKf&10A+6<~;eqv~$w>~8eZ3yV3BnQy&kmm6_@Adk^3MN`k`M3Y9~np#%s9ku zCfKVIAmhxpBc&zH`U;oKlyXIF*@%NL8SO3{IKk2>UGT3-mT&mKe0K@b9Wh&{aUdMg%@4E z0Xtbw&+hq9!=f86ktiy}%)Ew~OD|qRK>6~7BF@Zh{hV6uQdj00@892VV9_Qgj{xvdB zZ{*BuV2D}Q{CFm3T;73820Pv~O*79qu#L5Xl}A}c-ihr>!&9vd^O|_v91gKfyY^ps zskIy1nGXprr}+Ob?Bre6&Kb4+;ALYIPUlzI9_ezE*c`Y0ZC}n9@t6DdJ&x7MiiJm5 z=DRj8jo-0)K_27l^oAw&5w(1t?>*SBIi2SGpyiu(!a?ke?t+RYo;{9iQW6H21eF#a zJoUEzzrb}yr)?`7Z`Dp{c2SHrKk$=(%cT~^K=*@(BnA6A4BF1lQEHN1#6Rs?z#+L? zVeL->J!+Y(-m^T>`;htG;d|p9CL``kl?g2V=L{TPmuKjnVBm5}`>~3ZtzctcOqziL zEfCxlH6dTJP_n_BNz>OzfHh&8fl+|C!tD0z>Je*Lr>F3oC_HhZ zgR6i&4xBZK6MjuopSFB5Ekg?qL+ z-gS+9)0uZMPD+=MsB1i}ZpQY-f@Sw)#%paYEsQF!9d8JHKlq1zW=6x)%7{pY-L*}f zg4ZPewWNoaRBgS~qBGuuv2u}dJp`-Qp4FzmF*(WVr(8|xOq-)@G z)#(t|Mt9kH|Nb=}Vlh0-Z1~xp`P4qujK>^zCa_5T{rK4Z!=(BT2NMr`U^QJNu|T%K zg_-%5Msm{|LpJ@djbz|u zewY}QvAIX^+RG#dFW#OBhkn~HnUK)br{u&X?Y82&q@+aR>3&IpLPox1H?<{gMoWyj z`>Zpbvl^Y^%2a8*!|TPYlQZW*MlwsQv2v0D^BaA)j{OSEYzO*Y$e$20j97Z0BgNjL zW}#il zhlK_E4_0S7ru}I(n=|79tKOq6r7ji!+VwWKw`i_V<}wn!)4>w9=KsS~4U@e_PSQ7f zIO3HqnUy?Xe^u_55yx7XcseaHQ}PJ=+>HkqeE%yH-e^!*qsXyXazS1K)A}imH_o%@ zOG`fNWK#hhE)5v{A7<4Wa*Lr;BeOd#5Q4% z<&2kpHpkBAI+uCDpq=-H!NF~78;(dSrds9fv{y+#^hqh_+C)YfrVq9C{}WTSme@2e zPYtO1)4r=j{>secw6?i5=Q;d)H|NjgAlv>j?k#W}ggK>_p4j3Ie>w4w-f-QgLZ8osR)v{=nJIt-gsAxXZe8qi( zqvDf1rIb|WBYsO(J2d_}c-@%kv#NDL8mox7j>l@A84D}fiW1b9?D@lbuZ=;|-+_74 zhPP!43>eF2%~V+3d!Ulx$;1B>HvC|JcSGsEScAyB9szUbPmC#@+A6umhuEDT95rTE zdVh#*Yr<2bBlRaYzNNTzMy63@`-_sd4xkwlJU8v9a%PjrINzePhN(l|nL1tXlVlNmj{Quvv zh4r(z3s2CygQtux+;o^w$l)Q&sJBca;IP=U@_>IWJa?S@RN0>ve~^?ubB3qGO>fD* z=CgPHHlLF?^hr`f?jW<$e*x_k5&{zsA2`sFWu7#F-7vXJCf;EGLcRyim$aAkvPtHo zI7z8EPg%;tvw>09<&N=z+nzi;6SlCQTtA`l`ThsSDh+v!>)0BmuI%`7upubV$bm6N zZq|E&LZ(0lZGTA#h1Hc33uKKaSg4#)_$eNe*TjA?QPwHrH+PEN3Le&8;@1->^!WGxyaU$(nTU4Db0-{Z8*;>s)Z9?uPPBIT z_p?7NUFnq6jRlH_WZah6G|zd~*nH!_rgx{8_w&finIIi9V?nBkPM%|$!zTpK@Q)%~SZe|HA9)#OBxs+69t|A9>EtPf&M0#J0yt!s_N}j$46y(rCWr8@q=>}51J-UwAd^u*?GRgVE0FBsr{7?PI0&Imy|4c&3f~%c->v5 zRon+!&9^wS8$GrUTF9dHBcZOPr0bt?gVdGFg>1bA z7Z}4Y1pi1pE#O#YaL~GB!VbpUzvaE39^uIT@Hf4|)Iva1+N9V}iAy#jt?7rb)#{J( zRUH@VBQEl3?nn?d`Sh^q!I3i!8doMPt1ESK|=JFn3;o~W&`~97N zsS?Xg-ne<3xp$fm&E&Ld25m~;!aa+Xy?mC0p!(G2CO(_hf8}?Xe6v?sH}NjVYMuix zMW?L$f0!?;aY@1l)4~fT9GBQ<=`tTxUD3dPR_H$?e}aRTV8PP^Cm8m#i!YIz@?4OY zF(b)Ivv`8k?H-;F2cJ2&@{UPEBW&H z)~sRfc3L-=S??#?bJ2ud3`aFBYMZPsF7OiBBE*uRljF*C!smh);|U+xl!6!Uc zG?C_0>;8Kb{uJNyXA-9k0~6Q%`u_{G=Sw6Mo^KJFHsMQG1S4}1|CTRl4M(_LY%Pv9 zUba=~kz9~!r1Re4lch4VPEA7PT)}%An%?|uZ{ZeZRoLYhNmyR#4ekb3sTs=()@jwHsX=5we`p z4sF-ZJ~+^{B+x_fG)tL?j&Jj8+lnmQN;GB{(`R5ehG#448>a<6SgqP2qdMpFHKPW=DD=3v9t%V&AsE@{5=QT*1srn#O6Sk~T8EbN{WrtsA~rIhQ_ z0&WjpW8*Zrwx5iToEPXXWN!QafARF6|0N~<{XgCjIODDW=LF3OMQn>iidYp_@G2x=2FT0ZiO@Z!+(lvC0w7> zcSPN2;eW!z=&{G?l)Fc?tjWRyJn^OM(lZ)<^mhtw+%CWKRnya%{}1??8EYqHtDMNY z!YFrQC-Va{^^yj8!wHNZRdw_fp3grJ_J85D)emaAO7@A}_O>FGGOgiP;3nj+qG_N7>i8ESSim)iQIU+ipi?vjsO(Bhp1eUi|yZKC{(LK&x0p8|#`vcxW6RjV7 zaAJs&Flf-Oj%XIxV>5js{e~k#+S4y%{7ACNj)k zo0`=(|lDnD5uf8&IXPQSyOrZsF0EG9=bZs=<1lA6T!Y-sx||6=OY2VJrmJTJT)o}5$Gkv({)^8+(8^C2CL*$?fX zBsj3K{djPsz9OlS_nQNkWyj7525ma)lahY?e9ZoXhw;K0g&a@qGx`4)oZfe^E~#aS z@r1t{KCne{=;%rQTWrFjm?<6h&>`%Of$@P$Rwr`OK3s}9;b=2qD#sa~4SVnOT(~5) zbPdx{<&rkZIVpisE)UWey`KNHFUi!`Isex^>${=RqG#d}vs!od3#y(~=Dl%1JNOBk zhKf$0wC8`xI)?Kl35@s3`MJa|IH>NJ)5II&7|rqFoSL$-m->tU^=xb|QZ6~$9oD~* zRA`TE5Vks{=;Xlcu=xH0NzVx?DHlX0^(!zhxnOMPkjN!v(UcT%?h_8k%_ zoOT*_W?Xn>AtC>!E~B&UmO=XuPP61w423exXY>NL9A*z&kjj!{D)q*P&%=_-Gv23X zL!+Ntg(bi4)d$+V0e4!atvmQsTsh@8`y!uT>~X5cS=O>U6mnUGvp;dWa6nqaMqzuo zLDOsXh#wB8>Yr5K3B0Uvr2oMs)_KzspNc5)|6^z8TvON1WAUH;H}95G);QNc|M~fi z-L_aXOf{ZRByz2w?Tk} zGs-+zpxgQ2vqnQ9&uZ=eio7MwHDCCn_zjgxCrJdJ3ip`hIK{kUv-O0#2M!!)2%6t; z_TP8;dD|SnHJ_izG_7}mZg|d{oClvci`w{?1Rr5q_jtxZVYvz0xK!3CwD%_M7iGxN zk2)@IdC%Yy2eTN%It9rM%tluKc~qEZFiS{ku+R9)qS2=qTjL_xa(FY(gl}?7Y7ZP> zi2lg*@bD#8m-qD>f;=LR9%-0!J@F^g61h9?7?s>atMu(mKNh*u-VVyr|`9QmePNY>}k%A z*e=a;p0|ae)7bHL^aIY&ggK3;_yhJR9{Od!XEA@4a>FD3OJ=QWikP z{@1%SG6iv;beXXFkb~%_>EH7u9Zvg8N(LTgkC|hjWMp44p_x(8Zvqe3%LfWl-5pz) z?RM}aX)y2jz!tV*Ltv-}Tl>5#|KtN_DDdxaI3?Lp+2ippA)#RjyT`*rCmQxlV!A2& z;0sr7f@}E?|@W zK|W}Qveh($V#Pwn%m)X!a@3~qDew7|`$GW8xJCH$Nj`YVC3s)qb3$Rmnm*25pBRO%dn~Uo zHc+tA?>X_3?a|8r8nO%#5r-Zz>^#G)C!N-O=Le%_`Gl$7A0mUy;& zA_?a&&6jzUQv!G%6?x2POp}oItnHTMGXkk8ay@zLm zv7W+5_So2#EnI9t?-cc0Sr-*V1g$8X|ez7UJ%%L>d%YEofh^~`ZES#~zE zT*_=~WoBk(wpoAhRQ3i53qOTs@ds-&cntO{Z@bwr>5KdaA)kU=HZ%4~YKqO88`d&w z^s4+Y3SxV(s;i#I!2B?qcVgks|Mo$D*?Y3nJ}l5W660}~d7}Hd;tikp=bT&kR930q z&`9C9t#VLZORMFsTl){Ja>nQuouiRUdx)?4{AFz%s>8a$f3lCkn=e8#!Ip(eXK$m(X(N z%OSRl|BRL1v>uUOBFCc2KE;I5uc70EQ8L>$|U0=uOa(JCx#%0#zQPi1X7nuc`#(?ztJ%*sAFW~U(w6Rr9Yu|!Jf95 zf6Yf6oA-XOVF}^4mSzmu)^vz#(-!${n*?t?YM7?Kp?T}f2X8f9tmSO)F5+QuxWgqK zsifO!Y@{S)q&Ihh)5IN&Y;JCDb7nH!t$B3i(fKX^7fx(B`?jZojWJ+X%N898g{Yy?@@-ADUPRtPh9ezU?Cjj%rHmcz-iZ+lK&KY zH4gtd#G&^$@g(OZhL(0oW#&sOCkx0Wd~6E`UAE<6xm3fVfOCR>%dC-(n@3G5uUB-fyjf{fJ z6pR&m**s<_osx^F{3!p*u43jV`D+iIPh})DE7r`ga$`I5>5qMo9NTo>|B??f8P&ee zXB51?;Ya&Y_LE4bBsl-<}ksZ%yZO;*T$!xtX?Zb``lywx8x zY_>47YHgm8U|e|N7efr2^JgYylfMTKaqhHZ_|0e%@R_}6Gy9H%=MOOSW_7r^skv3` zV!X-vdPmbG#)@ZO?K2*H(Pw_MhT%yKgJ<^yM=iD~MWPocu>2Ohb)xYo=MH0T{`iil zfWOSA_bagfYj4xGS!?WciACkrKVyS~+aD?%)eqX!6xLnv@uRc!qMio@ttyIcQ*3%< zwg+fG%w&9KA2F+?)jHyQy@&g=|Mn5?{hbeu3yyV3-rDh-`R=BsnDb3v8uJ1hb@sQN zdGqHdx0FD`oh{6M>I=Rx?5T3PlD}aS+e23utM;eaY#G1Y&lykP6HhuO_DnoNl7CXW ziGt!!k+NvUl&}0t7`Z<&dz`g@@u}EtiJ4H2D)*jg|M@xl>o0_|OpsLF(#){1Q|#If zHuEhLzbNW&W_6XxF_7Ps%4#NY>I_44ChO_=GiNr;E?4mWb8z*d2eRc6e>uJWFIZcA zVdm=p0`^Xa_(Gx-!Zsbe#HJMM@T%4RgB7FHBZcjU)j+rPT$Zx9v*4+|&f5d01K8Lq z)a9n>U3}ZTWbXeDU%GVqbNHBr8d97iZZl50o@iY6VMlty6ZRu1OgB>4ZoFkyXg74a z>QH-vLDD7N;iNRrg)Lm>>?>=SUN%pyPcU0CkLh%COvj3Hg;XtO=A1J5doz<0Sh@`j zmGAyJ*df7@?!f%Pk2^%h@WuHCM$qZk6Ik>-muzZnWH^xe-TsA_Lrmdu2ayKLNfR4u z8ZL0_YcF7B(nu4KxYX7*#pHkm)3f>y4C-6vH9d(wlC}Q7N2<6+_u*M04=nz*m#DD_ zud!*k@_WKAwxo0MA9^)AwDam2&Zjc2k4kKsqj})a5uW>}PBE-iKKPVXIj4bd(zXN9 zDGUB8MC|4Yt5=@B@I)p5lzED!x+*mX5)U`b^H;272=Z6jDk!mV-B13xYkqZ?HD9am zu#1S~)!eLLeyD-%)yx?Qw_O#R&pz0Z+OjQBQlYP5$5c+cjxX|AYJ2YeVV64apPgSm z;`bx@4SGyBx!2#8T$r27HsR-gi5U~aZ8kda^|f7%7AS8Fi*m?&!uVaVv3c19(Tok9 zmM3mHZ7`DG+H-iGpCKEAL*0=Kfr%3iNiO7NiHSPUDyS@cQEk#BPtMgx=SL>~OFLq? zs`H)zdnHrQ&I8l-DoDjl*us>l(|Gr*ykdI{!{7GjP5&1xn#X8l#4>BDix2FUnE*A`yZ1S7em>ps!uvp!B+m*}ZKXX6eqUbj&n-vN!Q_&{ zyOtO2t-{PU!Ah;K>rXf;_VjrCUMC5v<5uy;1T^?2G_;Cts_Zx?s`B~Zw22+&Ldup0K+_HJ1b> zT)(ZT#l;qodzN9AYSU9owIwyIE5A&9)Xlg_p3`JDm-YsU2ff@O_QnPZfB3BrGln@B z8!7$af4!oaeY?cJ!&?j+w3gRjsO>(ZGvR6Dh7vwc>jR?V4{D<)bg>7XFl>^xSkS_q z$#QU;kHfUOLyuT2=QscTCvUak7|YGYY_B&vTB-MZnAI$JYa{z^);TJQy;f`*vl%Vt z8Xc0#_b>^OdnW!t$d@fbF45uTo0MvZ{h&b1f$45ep@O+3>$>qNty7mY94OQaGq z*{3}_z^lUMQOPi=c_-(Tca9Pv%Qi87H+6m_Gf`h+VK37YBkm(@FWY~7lxG&cw2F<* z&234W^^vy=Zi=bRP;Qvz5Z!#BT3<3@;c*7}k|uexBOMXEjA2JxBv=}A*C)Dg3425` zL_0F)GW<<%Sl{%M{eC^)Ym-BtSXFop9Z&0fJf0^w=lskGmsF~prMJvxz7oMQb@>DB z2@fuECmA$N<`UlX$9>&$g^kA>OeUOY5HWvXz`DGeZHc3H#tf(9J_qMUCR8*?c`R5f zv*C5(!|hHEhgpO2|ED)xP5ofR8ZxcnkocZdW-<2vk`pfT>gYC{vc2HLvuDr0eh+yb zo{l1+MdFjzJLVLm&*2QRZ=A#IeV^xo#ee=@{(`z>hP$)>wlkXjK6Zjbx}r^d`-2LW zm91A-KPchQWfyoV@I)Z$!%tNn4u;oH7B5SWm|@g-TSdTHu(@%=7lxgmxGzm>p31x8 zD1LJ~Ey2e29PbFKQm){AuS0w@ely#$^S-~M#8BqVv&4_#squ*g);jACJ~_DYEXzjup!16PzRllQ175jj%;XhwJ|ev2Ghd|O zS+2e31fS^bux>cV{#?P$W!``O-1O$dZ|rkEu|D#TnCGH@Sm9suQo}1IU8M{RVmT*T z%``Qog(5YHEGG&EQUXMN2C8VY;DpO-NeQyv7q<+e+@~Vun#r=K5_0z7u<40 zeu==8nGT|I+$EM4I~3AfdVM^~e)7*3b?r-;vGc(nW)+9qJpUZtTd}p;t$ECCJ%ef9 zOi9U&EP@_9lPVOAnL3u1DI7g9RVc?(d&M~y5uN`B(hf$&QlG%Y9JH|M@U#2& zFL*?^Ok$nQE}6^RzwUqgo3(%b%Nr^4M=Lf21sWYN(ka;@a&6-;cG)F~F0VE?G>eAa zP+*e0^pj0gWrGcCmW|^(c~)Kb|NME+8-8Ax7+N63V(vC^`aWgTo`#|Ym%U~tD6jkf z-&ld~Wn*cX0xP?PpF{$y+8KL=>kHfL&(tbNdRYDD@0E9%(R7Gy%ahO62D;7PT8)hk zSaD8pliG2Z*+i`5mc7NrwgVP+H-CP~hoTZ#PX7f8RGIX(@Sg7N}v!P9KNn`t# zq(;V*a%>(kO_!KY=ta1*ZL;U8O5n8-T2RN>cc>|SgM$JAsb@2v@aa|_5biGv530XBOm|& z?=WId`RD&&lJ5;K_6_k8f*<)d^6#9;TX?aat>xzbg|fO&OinkjO!&*XTH)YolLex` z?QiICuaNo6pLxze$#l}p83J>8PUP4eDY$V!K1;&s67P~v$t>@mx0{&!Gpu2s_mkmP zF#D?|&6m{*3`9is3;YfYXLkr@V7{~W!WK@xng1u4@O=``Q4@QjbfH1(ghzS92Jw>xW*g45-)lR_pgZ3ovH6YzgRU@( z{?%4B*@~zZX|_oYGCrp`%%w{i7_WJ@{P=5sL-)gure*OHCN9_{xs6{oO-%U+bH_pb z3l7Q!ZCqi`70lff3V+GpDsEk}wf=vCHlN}{=2?|VZRgC4l&%JEaFb#-Y54E__29Q) zCG&#B?|RK&n$I-J3b0?}UL}0s^x1{XrycBab~BvV_5Z(u`liE^tj_Rm_;Q5dtnvm& z>mz$FP58p>f4!$iV{W|1&jTGM8vI)sWn?C>eb#?4wQE8PL#KRzEqA2cc^>agJR5$= z%l!MWNnq=`G^bPP3cdFAf0^d3KExpz)B37$swxl9hA%(oGw!|I@}~U50c+-z-~7xr z1qu@x?e{SsjmwyMvSUT_gWiH0amEF^TA#@;DVoH&_G8Z+_XA7s)koZ7JUh$Ku}Egc zxx|zNhce?OJnmP-|1YeR+2$f{*?;IwgIapW%nzRgj0zZbMG5aIk=irqgFLfNP{OkV zr`RJRKgiE3msqHs@bB<#<&J{%26dJhbrG>luXz44&AWH*)IrW(X_pyIkNK@S7>cb= zSUoY~nsz^d`Km%`f%(7oGc1eq`&o_(uE_oR^m97f4aMUVZf7@?FRTB5jKNBtVUqa2 z!-wZG@-E=#Q1Ui5dce^0;lYuRhACze91JmKhhHiCY&S9r5Ilj6K5?LyiLIkjq4+_xN5j`Y_u~)Tp4Pzr)5(cV z@ZyP|%t2R-52c??Ol8=i)6BQ1`AWl#H#t2#bKdwkoH=vg?8!3+n2*%l(cxjLS;JFv z$A{;Rj1G^2>6nZJ;HI* ziOss5{nEU@{gZkm0$(L~>^T&c*?9VE{e(Vyjo3qnxMb#C2xU+>{I5Bz)Ywq@s$>t( zgl!Bf&NNSHoM3X`0E4E##DnnC<~uCjz7Hx=Tc%A82tRa*Be^2tOnuJsDy83S+e{i; zYB;X*W%@ikmvm;s>uDWlTK{_%uq1B%|MAwT77@u8T#}Lo#uhoAQaRVyCkp;Iu3-{; zGUve4`#Bd5Z%GjSApd~#qmE9_h73k`l^ur7CYP8WHEYRF=sk1cAX9-7n>yc#O|Au1 z%%)ZgylW({PhLY7wWLKw^VQ-@cl^ELoEp`0q5uykxogoJm@zNt9;+ z6MsnsTgFkACkk>d>7UFi{;LRIYIK~y!*nj>zn~=hBOA8@?x*kVj|j=QJmz?mc7@M2 zDU5j$-=-8Uqip7{kL^!zu@(d#XL-FxNor1y2CphxflNdCqzRvx)-W`lx!}NO*D{^u zzoK`~0b~E33#wH<6Lv5?P0cW7ykmE8n%~63jIWZ|Dj1pWt8-^c9QyNhKI6pz=A(?C zf)Z~usxH{W*JT`0(Rhg?rGdNf2ZzSJ#JZ-Nf8}4v2go!(>SK+FbYPn!kjQ;bIOFD5 z`zU2LmA~@4LgaTQa&Kgx6#qZDv;K*bh-uCNT{jQE|NM7nF?h}O=}7&w!Gxtt-(z1x zn}xD6vyMzcbEv@9j;E9V|3CamPnlWC-cf3!!Dfkstrk-lPn#R;H&)uB|gV7}7%j4(%Y;kgN6^~g(uGu$y z7b!0I*l=2~U{Av(PUS^=*g6}f%?=!Fs=wgJs}lRKUGH%76a9#LKe_j`vDZ{6XuNGW z)FNo8z#47$mp`gbVL9W6H+BYZ4&L4sq43iB^blH7qxIPk)}U>9zf( z6wV{}>I=62bC+^)EZO0h=J1GR8@pI31Ix}@rY`my2iVrw{Ntai+p@%P!rT>U&bQp^ z125U@oN@TplwX;caKz$!D`T9Q;w_sE5kK2Q>JNP~QD$D`!@4@TrOkfDbY{+~4bpW? zr!6Mf3#4l4993jHkoZ*d$o`HkY~I`dFZ?OIlgqWw*u$>DCuGn64}Fdv0W%nd!WVpF z%{c!v{=+IZwHFL(HLA=-JGuB6u6*L0wtqvnQ);2-KljxiBnz0`WF~iRC}N&{u0Er( zsd3o@d(LHx**TQfH}W*{I346W-1g>h`_p<4srDf%NDRa(!j8WzcZ%qpX;u<>`(M(SpHAUHEH|L zGvS=k2d?;pnf$N56c-vWS^v@DnIm(CM<(YCPtE~9J8f>^9dXHNY`!Lrx6Jnc|C9XV z=WF@H{qgmZc6I+amq<$3)&4yE;puVt1X*@X^8)7JikQgxm3 z!>6@pBrkZ%Z87ISs>G5#DNb4aMu$E>uJ`!JJGJ=-^QFATu%!>aaL6$*Y~1SsWE+6FGU4KD%qGMf3!woLWSm|pY|MqWu&i2IrNMoadywRcX zpaYNi#MJ-)|KBcO!1CEzXYRpE0-K~<4)YmFv3sSR_{gw|TXFNB1)=;MY>bO8vt<8p z&?*eLabVgjhqV2QKY4a4_7t4AXM5r}>;DDS4;>bbCWj;vb$JvX>;JfA!p7#d<-k z4tg?)tYS+(v>cJukvDL%WixEmU|88G zW5CJDto9;@g?o!JFBks}q0oXz29fslen|~a7z0#!t&Vg&v|p6W^wC`9ev{Rn2gj5( z{2u(4Qv9ZPNpek0ONoczFU5y^-p&uI-q}BKI8lEgO6-wsM6*ob!~>7`;^K`JrV9QS zWMh-=)%I_+CxstvPH!%gPX{|)}xXE6W%U+<#MKW*0kzwNE6%zGYo%=v%tShLM} zj?5{9riFuVQV`@X6vtOxhI2dXHMp-oy%9 z7H;;4$c~v}3+8&RxVfS4Wc-V*Qw6>=mO7>%bo^6)!Of!R#-UT||37duSmMaZ>3<~i z9}mxlqIrT+G5;kKk`~O4aL{IQe75+v>=L$V{{v2kOgK}&#Ls+*pX-uTw;vADKK9Ha z4WE@VCN!`XD%p7O7#VXEs{8O4?P{4?W>B2)RB%&N#f-n{4g5?-f83AQ?vQ2C(rrxD zRGw5VAvm+Uk@1#a;}X#VjmA)=-K_KaBo*GuKH1T@_J@NRdkTY-%+|{+pT%|NH=Qzx znAN=Ymb3rmj-r3^B>^m3oIdi`1bng&y32HO_Jyf|9;wn6XJ!iIx=g4}l;w`N)jBm; zVCw|iyK5HQ4qVX6d&-i5X9IJd;!lBXrv!rL9Xb_~v0!nFIkSv`(E|nxRSAV@h63y! zZ~y#ve#L0`c;=Jj1(HAf*PMUw>Otul`zvd6czAd;DuqPuPq6wa&-_EoFu=N9a!b7I zW%a4isn>ktMgykwUo$0Ie%zG&u`^QgM`eWMj-3$_I~tl9-n=3{vO}<-u}Nq&2K&#mLH!cKm2<wm-?(+wM8>@`u2=5!Xf#B+N3Um8VcNv7)$mjUV*)Fi z^1hz#mAr2xp0IK667p#JdEVj8G=`4q&SDm2$K#9CoO1G*cXPLwZaCbY@GC*^hrDWk zGhcp#PBxn)^Qjpd&dI4P`rqgt?$~=n{{B9r1K)l$2=g*;IhB~w5_ZOiXT#y{2UU^_ zH(UHy^giS8>tCbwnVt)(=@a-wmMFD``d;w*X`i!A%82`?{MCmORNMb6Zl3?3O{i#5 zn!_8%MwNmHXI6{JEOT1hWyDxGEqa`O*)M8j?NU;E5hT80euE_QCC0?o_b;0}o1?lF z?*C!dD`dNOn9(nKL+z^vr}(UxdCK^A=riSRap0COuu69@Igyyi6n*OCfrgAX&PK*X zNB+AEDSH#G%L?# z6f)lsSROIU?SjW@9tj1-)-`N%#3Te)TPplyPqNz;sj$6@tzV73=_#%vyGEH`;)YySQGSen_mz?4s?FY%?^ zv$zPw(X0K>=Q^;^6I?-(YfxJVxP$?to({$R7o z84X#X8NdHIzhyfruCadMGuI0YPvqH7tYO>m=pS#U%m3#4%X?o~96Y6Zqt3y@s$t6V z4PN5gUU5yzmq?t*%~|W_ax2B<)se%Oc#C8j+503EHF?zd?Xnq6n9p!@hI{;E?k;xu z(R7CK{JG{oXL%$;T3R%dzA=iaPv}z;Ht|)I>iNGQyw@pBNb&32_=*_~R_p#RJl85? z#{Eryh4Dvzq5lgGyB}=k<|&9bJaC9b=J^FH{wd29GWmj@IegOf5W2;|%C4wV>-=b< zWX%PM99LnDLy6Cq9XLFvaU!Ep_W${e)A$uD*|ykE;Ve8V#mu}U<}d$8Zeigh2d+tF z2|u|a&KVmVx-6!=WrgDfpAT)OM>Hb#a&}6)ESE6)!0s8{^I#5pp8f&rY=QdbcaiN& z-3xmAF3oGWBFHm=sfF>LAiImCsl9% z*Spl7Wq5ti&|txpOoeENk36TZKadVx5N(to8{w8w%c9>cshHQS)0vvqP|3UVUBgt) z6RFIbY?y7{I|vIh>+~BfSY}wDVQ}cE!?ecJB>^*k{g>bKkX!rng0<=yHxy49vS~Q% zm^zX1+DvypV}tL9Ua?2~Wz>#VeD|+C zCjUiq@P=(18uK?A{AVuz(aL&5LdDfWGUZ4^#GG!&pq_3=rW4|Vk68G)3Jf^77%~~l z45AzQ=Qj4Y_cn@K1ROYink{9s^Nl+>JT?b%neNQdIdFBtfp0J4A21x0cl#h2m0&G7 z^Fdzw)a(hrq=d>A7>Sy^1dW$WEKh7M*bwS6!Gd-A`~wAvO>K%l3|umPvS_+XN+t-; zz7UYuu$5EbBeRxIL*oDM@@|s6!OSbQ1wS6kkM|ahz)(!StWcDo}EViu5IgAIBMP&*#+kNRSi@ zyVCq)LG8>1N80v?3#;&DEoqppV(etq@&Di7=G~$y{3i=0II&!r`TOr@Y32+|3*}2E z>@?OW@YacaaNzW~U;g1H*O~`DO&Sjl9u>EF>~N^Nk#Vmg)9I2448QnKt-Danu|U1e z*kM)p6CQqT7D)lY(+rZe$qngAY!&J}6+bSmzt1zFd2d1{&n?5h?3pFZl?k;Q_*j-a zW(?$3O58kWgL7yA7YAEJ)Gzk+0umFok^`1AiiIZ>2Fx&aRcQ z*mSdEj1T4{F&s5rVaQjczGOi%3%mS^&;MUv=V!YiWSAjf@P|z=F{L3doKceLeT?ye zZ#9Mn2c$pq@O;?Nuwypk(n9{v)+(~jT1qn{b~GPi$!utnQr~bh<3rD}`iwiqPItL% zCkSpkFBYVsbc!J(jOn%-?@O z`^JRBfAzl{P%Efmy301}YXWopTaJ_5{~z+!yRmsZ=Gk#v&?1A0OW=ls+KV@gVK3h3 z9m$EXYUAztm+r8{eS^M4LSl2q2gOg~I(wV%@J1_f^4Yt&NOE!e&xlu8$n$ba1DoH! zM)nSc+uaI3r#CVNsX4!jOnb2@?1`Jn8Q%%oEQ+h2POz@)x$voxanhZMY-bdH3M`W^ z`73*(M(st;Yx^5TNp1yPZP%G67$maD_x$>AALJ|>C3kR@K*7Akq?Y{C3_F>p=t(rz zF&Htt4%ib!XWBb3850mctaOjm_fG2CVyW=Mf z=EM96w^E)zNl5t7e`^}U%fIYr|NDG!3}thf*O2CPBg;PRg@S3(jiwroAhwl@1)nt^ zZFKz4TrrP-#k`c{RHpOqJ{SH=77%`xCLo-YEFkzKK|uUjf`H(ohO#e~3+7fQ9G@q= zL#bhMZzH!yG1K?|#hW%WoL|q7C!D~ZE6R`w~Gx2lg=+>}Gf|;l_J= z$LD1uu|jgf z?e`m`MGpu^@=Vyq<-woh#3CgBe?e}1gk{$Zi>5992Pd-hGe<-<-aO0jc0t1_)(c_T zCsu9x|G|p)js6WTh9^t>&nPgQ5b}83yTyn3o5Yfg!>a^y^pu4?+myu5{4fy;JKhm& zeI_X+ZR3H7eEAB_LOeyxGBw|It^^wVZ_fDeM#|XO&1VCnb-mAprP~y8 z*W|o;z`~ZrV5EGW#X!NxKqDuCH-AF4gQ)q6gG|=KjMozWa_`&LK9O;w`mBkJMKd_I z6#e=xKg(0WoYR2$ycoPDZ@iu-n zGF)WBlwhoOf>+FAH>23j3r{UOVpvzc`0qGvUDF|sq7#ZG`eFt)3eD0!7xTgleI$e$%W*7Ry`uwX7J5f0mEcpxmqA!XuUUM}Mc z3kwz;6U`9i{V~BeK)sQ(tll)`ysd`DLE|?)9X&k7+`=_sY!mlMCMZif{8zgFoa++v zY6%Mq3yBNXIvX1K3jY20-p@FVPa&1#O5PSGR?GfHVec+{;pn~l-$Rzet)lf0zuM^! z@=hcn8KHF zfiI}cQR?D}r@CkK0wNlu6coNL;Nwx=;>_PA{Nxzd37HEI!x#7oBzY?22ry1M<|rzy zeCYv$j&AcCrt=e+B;)P&r6;i7%{|NEdHn%HlNnp0Y<_{w-`~d>@*|86rE$$%@K(dk zf;U^jkx6P=or1}kx(Txrn71iNl^uF-|Dr*DO)^*H-a|(i-W_QSPx{-wzJjU!eEp3x zN-0m-G6WdRc5qou5eQ=Y%cvT{<`K!Q>Fgj|dV@#xjIYmysn!piKQ^S=c>IljG0i9< zmUWZxwUrDjnWygNdGLunDDS{0DdC`I$s=w{f+Hlm=gbd0%=So*EhDmL#?2r6y51AM zw>ll--qQ5gJf&4;OERn8N{NH5Y)jU(UQ60=SY9zz2Gkd5Jtkr>x8ap)ge});_6c7& zr1$*bFBNy;&x&e0yQ<;Izvk0{7aBV@^ciJr5Ulyfp{yJ z5(c-UR($1N^P+Wia?1~H6}~RzfVu3FOPY?bZYfJ?c%tiJ`Te_mOIp)*ammDqXBj?9 zZ}Da85)LRzbTWC6m^n`{^BMmWrh;2-%UmNW`3fa1W;?R83p9&g$dcSs)i6=e(1Y*f z?F9!{{=ZNpKj~Nkv&;tF1t$tWiI+L(Dla+L>}%3+nO`~OfN<$Ckw^6&Qf)pAe`@|W zHO_3F&3J8Ld+E1?hdigQKd|ABD&^p^SBrSgBvkUj*ky)*@stG?j5iPRe7&C^Fk2)> z+=*?C!owpRa&wqgAKtn~E-c1qLF51bk{yf_jHXJizEodf^`qmP*{ZOJyNxr$B-uC| zPH}tqvg#Q+EM;5rmGP`W$5i$I6E9g5MYF2#=pIi3iuWJi%PSu? zf3TCG{=d_q9?6Qw{Ki-K7bvhl&5W4QJXv3Pi8H@o^N)$0oTZ|2OV*?}^v!WRov`KL zwfy`0n;tjGnh5-#&$vgFF)+OOT+B~y`Ig2R{ksk^EEAKt{aWkM(-$0^92gUddj&n9_Lm%>n-T zjXhDyT6S&^6s7DX9ZqvOKID!r^qV0sp4^NE` zoZ;MOJ%dxMVZzeM3wqdhX-{qx6k?y?$DI%bEVYORH_xLCn>aw99lbJ z5A(|$V+ZTT2aVEdSNzP6$Zj|#GOgg^opTJC4vmjkx4mWAcKo0GB?pc@hOFz>Nk~XM z?B#NMV7KOef_XFlm6Vn#gg&*>4OLr)qC-l1tIsk;w8|#>nx|Bm1CvZBLyelx644U-+=AL!K>z zong{CiG`JNmpt3~7!F>xT{9=4VO@x$v_jI4{)-db^!7_A_N6yWxjw;7bB7Jv(@M9D z)Zg;gX11CN&5%ft)$W+DsNUn8HZk$~O@})l#jEmIYED|Lc;t{Jb6Bcv0;74_i?bXX z*i@DJ4@j+0_`2bg(49o5zVr`TtM+$@x+U!VAF$t%%_FgzZ{`D06J_R{)l43WOO(0p zzWOA7$uRBtlca{F>NDorH%`^hNEKwZsX5qql;QUOf8tg*Shdp+ycAez%iMkW|AjxS zM(iSC3-)|``@7sD=AZi+wuaNK|0jg9Zur9TiFuJsYEyZbB6I$Pb4;fkY%X-#HyW!b zY<6frR>zzt$~^V&gM+MW9(S5f72Y@_mlGztb5r}2&I3Q#<@d2%YObjjY~kl~esMXsg!1qXe_RIDAc5??7kH4|no+OzPwr@&-|(kt~Yja>Ps z6<+zev3W=`M)o!bobK4f#gis39Q0iF+RuOeVfPFjZreZTY_9Lv`*ni}*Gm2Whwt`l z#Q#_3ed6$m?Tq}1ufobEca?r~r?6Ep@LD}=)UcP3Ob}K+!OUKP5?J>Bzx|1WS!Zro{on9v9wWDd7e9{$!L|%ZPGE2-heVqe`6jV>0U7&LM@B*dt#}(91a>sBUII3{qG~b=y=h@z! z+068o^(kkX+KFqjYARB5_$4GI6^a&o;fZNveOGK?*uchiqk)-afg|IE2Mihx4v!P; z>zLC2|Nql!F_3#*zt+cQqj?f@kyBs8{37ot{U2} zW+<$7nYkcW`iYTP8rPDud>f_3{!jSCx1>q%-Z{oj$4{y`4YC`VrV8rjK9*rg&g^w)++RS&tp{YFL{ejFaX zEB;^T64-c$&CvL-c$8q>uMcu}I@1`Ziu!c)@NmhiRWvhPvS8dPeq|ziYD$2+bdsI$ z9wGLh+$I|su5qtnak!q|IL)P5N_)-$H;W$|R{o#RXS8RM!>Py(lKBzpyf(kT$ZuQo z!Jb(uSkX#s!?A1eFBW!fU{e;>c{f37?FKhCotOu_%x(pue0P%=Z|a|6$Sz=d>d>2T zql;<6&-#VzvIoyHzrC2!bjN|=ll2ZpeyNk~^Jbhmz;Swm&xAaE;WdkoonX-9X=oMF ze(^x%#iX1CaVH+Oo!M~Z00Xz0heX38<{fJpDmHzuSG$oQ%DiJEQ?^ahqet?4Hhz}3 zVqnd!VNyM)o@s2{=>Ml}zSlqbpce<TXKA5UOYTI0ji&LXVD+hm>d;GA^IeTyXm zEKeu@=eZ&E@5ED{7GBTS9d3fkLCT_OOw7zm`Hq)VHO?F;OV$i3ujQb8Q0a?T_;rBW0C?tk{qLt)F3|vfklM z`2%e4DjcUhX_EONFOl2j!3LuS zD}DvT51xN}7Tj#!&$A(vEn)qi=9aVb@9#fQU7fhOaerg<#2FLV);MGx-1w`XF>d;S zPpUt@@rj*S7$9KI9BS-T)w-d;!LFNaTHXRlHlf86-ms)KpDLd4-|<`Xsj3UBlmeJJ zo?NdF_;Cn(%Vu*Q)nUuuwJLTESbvApV%}C4%|NcVBwJlBY}er zeErnB*}$UU>vmL=8~UK!lj7Cm9U zgLY}e!d&lyn7{2?mOIX^E~tKbKc21PhSFAFiG^>i+&V%#9OD--yxF5xP{|gx_1k;- znov!hdIKY+Z5RGB$EC9C9F-nUnV@LUad1mW^oBItuNZDU7st>KKV>4x~V{?_X zdr()O$5!`XU!5Lb!d~_{C)uxBPH;?TTQa3hDpjG}!0EGWPJ@(7GaJi+Uo#z|Hz}-U zb$H5}q41ae!v=>7y^R0=JF{0FbZhc$+8`nL)-EEFZ&CuwQ&zVlr<9(g@P5=*KINdU zd?jW=bzSXmrZvVl4u0kQ@omlj{{c2l76rnA=Nj@0nbkZ0Yt-tyEh&-_J9a{`#p7|u zHiHvJP0S1l{zgJ^oD6vzj1Ero5t`qApjD5TjZtEvkcr-PfuO@3CWm@**p?KYYnjBb zpZR;=A4a|2q}0~FSH?H^c2jQKiSxBL^DhtVld9 z`~Ps3JR2L^iJuHBT2*sWWP%zUxP(9CoUFg_is`~u|NRpG{{82-GZabD7v5vsosrTY z%%!~O5R3VVe+&7t8fHz{u=oCi)w&A30XJ4Ls(mP0{Qp58+X_Ygm0uJVhdp2uJW>4M zl>EjwqC$KVURNaa`UV{P$sBv_ul%gMy1#!|<5uy+8GWD6m~*^-$?B;Iiz_C0NoJ|5 z7)VYy%>TqcK#_~fctY)h=GhL)AM6`{-?F@6d9YPaL#DowPa%b2I>&{X%l}WXJ^Wu% zLc#d1&xdoICpu5`26`N3d&cI$%AL8u@W6MO#zW#M>?th*M$Nx}OBdt|X}{RzG2veQ zf@?a=FLr4}NV%T*;V9+jQ#*OgMM!{{8)u z38D->a(4uh8$<#&91<2w-*8TFQ2=u*cM==(GQMjwoEQH8o9=M7T41`vDV-Y%Tt$t) z?%;ysU+kHWy+YZO zD!NTq4jmE~X`9fdQnFMy!+|ZutR#Ug=A(hbx-(2if7W{xwY2DO@M%0Nb3jWY;yHJU z9rp$u*1O#NB__-jk#fo@$K*Hhh)uhv@KorCoX1So&BAhKJr}-k^l`Yoc%^beQg=fQ zL!L+@`#*(dkq2#pTWpwGHH4K;NG4_oR{MMwsl0g>wYz8$R)J7pzp z*(vS+oYQALY@W@t!GzzlctMfC6TX1D_PK@(T;*wLX>2aZO^m_@PHZm~vJ^ftt`c|n zt?Sr)Xu~JrlDq2GCA%d(cuWG$F!;Xzzu>90h3o(JC$VV(&SGo**xQwZ4zrgkFix89 zD61D>#Za0w;dEKRp5|=}{or3&UwQVV@F9WcuvC^Ixu&-xqv+u>U{Lg+m>T zVe1;6IOaLM?f9S0u-#R1;Zp{a`HK8z21-{ScAQgF-qQ1vKQ~_Cl#Iu}M5gc0X3h{u zJk%lbEWy6%r$Dhns+5ZVA?wFI6Ltv&eLpzqO#PBgyqRrX6B*a8Y1_d*ZJxw~Mt;4W z2lCqPRy4iR^SEQ6v{W)8u6;`Egp(W|KflT^o#T3y*^pgmdd~yL;(*`Glkx?cMHX!N zEnxJD1~a*8^Ye zmt0}I$)2aqU@gdVrek(nLi81f&0jWnYCJI#4Jm6>oAb|s->r3tf5fenq=qS_E534T z^c-lPVQ6q5U!`HY@Iqm!1r`l+{lD^W>*|v{{zSG&pVM2g>CVUWq(gaZISwqb)@Sl` zjwM}LdLnDa42g-C><=$UJbcS~!xqNVUJF7#@LIe$aq{FzhOW!=5A0)KA;a`jev1%~ zNb`bivKayrPtM!h?>BDvrKV6jVMB7uF;!&~_k*_{b$noZ+Wh~*5{4w_TW=@);nd@o zPzZNvx+S!rk?qDb(Gv-Z#y4VlF6>iIxyrGm$3f=S-~PtQyj#rYcRD)FnCs}))a@AD zIo~m|Z@!~n*K|jgiXHOi1^4ZwOSZ|!^chXyb4X;%<~BGK#${k+bl{Q96q)+}Y-^*~ zcu)LK|G^ydmC1`?L(B(pi^zjVS|U=9p6Ix;JvpsS^!$S_tWr` zLz(;ub_KJH-HaW)`NqZ$T)7_inpotSLky3^MC_IlWb3)GN&MQs#x16TPlZyZFa)(V zJr;f>!4^>=V9LNy$eeQQiT%7Y+^Y{LF#6TFG|C?PAita~La{d@&VA0!6RehcvMpB* zFm*AWtxec(q{PPPAgiP%CiY`eh=+yYA?w5q1_-3xoR0B7MTJN`FHf9p6W@uW-H!->Uond02&v<-V7>|Xod zkxzmpHQ~lQYmW+NA?2F134%ch4pQp>B@?E~-jH>W%P3{Y*w)qDEG%_p!W(8I?hwJh ze|}ATcz*x?2_G0{eHD*jY}C@ONEV;5?!f6ji3Cl{Fq<2heo%NT$ zNL~HSg+u=@oa5dx@fe38`z6CPm&}lcD+i@cZ(#oB@R4WL6NlCp@(<>fedv+daj@lz zMthsB#vO<1iW`aSCk-7hF{VgrWi4wzYF_lK`G~RdlAQnjcOqFt?dl~I7B?PnY~4RW z^`gSw1;Vc-CrHI9m@Z)C`oi`zKI19(I|nAyL+273eu(d2=c@T+EBs}Gy@wTpsL+X4 z<`Z^5Ci!o;KS8?Fhezg3$KQ7gKK%XuU;oBg`-Z7J8OIpIGMl&C8aRf}Yxu-(QMaJX zNJ*-5!yeZ2!95$C`xi_VR$imgW_nDaxA2KUtLUN!Y&^oR8dOijd}y5h|GzVTw#yA( zzV-DJ4zf(Jc9?oo{sUu1M@r9~0=Dvb|D4%H{vEbD!t-HfL4;Jxal;Y=hDpm4KASxd zn#y>o;eY=%gP-RawAmH(8kVWI{r}KrwZx`v1|v6f#nVF_QJxJ}VGAl6a`!vt1t>^~ zUf9DY|Dx5T#PO%3%p-@)h{a6P{Qe!BuH}4(yRW!lQX0$lc?nlpPQ*^w^xob=#evuL zL*tB|32aO`Tlp;38aRAoJd~Dku#$b{V@B@a4@JNC*Dw6$@aU2KmZab3Kgh@JJa~ue zHA~~E5Rbz%S#55xofBR#&$c8@I)!CN;gOCRq3l!F*EcXXoH?`R1E0*1{0Uor@b7uV z611=3lTt<+{}qO&(hr~#$G~9;r%Nl(tv@U`?N~EE9KOV&5$9<9bU~lu69&f{yowV( zu&u3P;`M7f=g2TMlIMbv#I*}faYFo?=5y{k#BC&em}9RZV;O^z@{*SyPp1uuD@s9oUEQr@zd|CIj%3-+Cy z*P0sV?BVZB_K0Pc3~_$jbNH2tM?2r1Rqx~5{^efRp=q>Jy^9 z8WNed3D06vNMz!idVj&Md4fh2y%HTwQ`|o6YG>T)(>yg7w0FdUnfZ|Hge|Px@)gRn z1ml#Pe3DaIeoyAS7TGH1r?5F8X+wddu76^)puq3MRCbN{rm(6F2F~kjT9)tqKcP=~ zi$)T|PrfOe|2e*92>8c1b>)W5_6Z-q$iI>k;MFsqp%85_Q=u=3LDb*pz*T*P?SFrN z=fC%mp`E*+K>W@^rd&aWr-cDE#*VKTBBa@;s?-TAE zKhUs3Tj3}Fy}IOvEt?ab>Qrpth+22(Tt8!{V;)x{k5l7osU=3zX<{h`To?6{8RZTg zKle#~$Nc$I9c3zJ?O&oH-P|^bp?Q&sd^1bIPy39W_SOaU_A7K)w=+vT zc-l9h=TCcneACpcJv|c&*e3V%Xym$2kX-PKRU~eL4VU)h|HcQ{{1TpWuaIftsW`Z; z_iwtxy6*=wXE2)XKg4FHu$6DazJsM~4C@}GsU(>)=v0u7jtm8?+;2S^rmr$mOgopr%jLG>)_1F=mVNt!2)hlgiHvta$h)A5R@8xt$pHT|6#1q11_@`aJk!kjKc_DFy`-)Pg{}oGRCN#}G#P^9g=f1@bg;WRG7UreCVjmpj zmOO6MIIZwgXxk;Gm-2)IuGX27nmK|GdHFTiJdQJL zb7C;L!JO4|@RNXwuYthfE5aBxcpO)+_~&dbxZ$8tSV1MPq)+qG$bem}ygwS**c>BgwYEy$ z+tJXfd}O{4kAc0@Ir&DNo$fpyj;CA#j`NvZV0ih%pqYKU<2#1+TtAq1{}aCQvPEXy z&-sj(D%zf!vSmautz=(o!!*@i;kUz6;}t&6Iu$KXf^Qs9(wN&|E%0A4Q&7zO0h^3+ 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±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
    46P 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 z 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 -PZArX-FErH#>ak`F^w}wY5=gd;p(i@6)|M=%Q zvYJ2ofB4%LCo9&T3wzhvH^^G1nVrzlNpj;ibY|$14|vQd!q&kkRA4@p(QFo1oEZ14 zpY35`Jr~#*cYJI!)8^t+XM5pss6OIH!@EiUj~-yMeJL+C?E{l+)Pw)dQnG1H=lLA8 zq9#NuTo*ZH_38pw17lESLxqCvhCcHYG1glvn)~>gA9r&G)i(cOc=_RP^RCzS%uASl zvD+s~ZM)AKl6cU%=l}o1{C^wYdbXEDDH{7Gl=3W?JV%i^_(4U3-e>mnTZ|muJ!M<& zs&?WQZ^TlT=wF%ti;;p3A>bbXnl`ru+kA&jsOH$95^E?|&NqFneXM(OJWD;we+kPMH;p zzkb)(*z^D3WftWvfefc-Z(y@pqs)2Ep69>fX5R}IEX(EH*k1SuF8a*wZM}hydCRrd zdp8)OG?^r~G|lAYvOnP?!(EZDn=?~ac@5(a`8y>^4spl$PyW8ZrdYJUpYdA65B@Uo zHD{Psr#DQ|*zl=G@ZN=={aaYOIG5@qG(5A6*vWPI@CW&AQ&}$+xSe_7;3PBYxB|1l z{{_a+HW;|&=@>X#KUau7b7n&IrNozlW*v-=jSUZ`%~Uvj(=qci|CV4LW8t}MFI)NV zG(6_LR+#4IDc$3d%D~K=Rm<>ETVsNx8g?WD1D`i=)b=Li;AXl)5=EO&88|(-{Qf!T88AE*4fx5J zb;EfPSJd`@&1)7UCpef)I+)1y?vKN%cl$k>*Zp7cm34*9fA;x>tZUm6n9l!m-ZtwG z`*iLFyCh29%CA{`;tse>A z?piG!!rpu;VuIy@Ptzo=W-_d5cVKTn==Xtrr(lVwt_F`|CA$dUg4gMZ%#IHlQxkqM z@m~Aad`_(?th(_JSC{>TEcb#c#$yH=djAez=1%!0DRch9W+sJH{v~r6Uo$kHY3JoR z{7Gg<-cSD54bCs>JvKk=@klj(bA~HJ^DskaqQ^@%$r%nyB0emzYK6Sji7n5npO~Cr(A^#Q*&ryd={awQgv#Cj?CfGY z!qQr{ELLC^VD( zo=WVP@tgnr<_Di;B@{~KG#=KSxOVDwc#<2Q%$l6TCz8Eq0y@|V2R4H` z=D!CyzKJVud3%^a-`?@(fAxZXJ7WvqgP-`BgMLdqQM#cOTdI zM6ng6GMrIe%*@2Y%(ueQ;lP^Ji|;dNf0>XOaaek9LX*h56Xg?~v^1|A;pbLfqQy2% z@jxs8C8L-BPiS*U1Q-eKIP{Bs=W3}E;3eP8!ZfDi+S=Tg_L)7R}`_t{J5Ic$!2U~;xaVg~a} zek1-T5^pXjsSU(Y1{(O%LaFM)lY0^jW1 z-`sLbez2}na1@ozU|`;4FJHvRv_tvldwpg%)pHCpJy}}M-rwI58GmA7%!Gsb5zhS6 z)DASO);ok}HA#u=mvoRd`|z;T!Mu6;)h2dT1zxqZ7yHuEUi4^d$Tp;XJJ1`#rdBZT zH~(9Wro#fW%n!W$WWOXP$t6qX|Nrm&a>oU}JMc9&Kh1T^VCLF+hhZk`$}Rs7T32lN z!j-M_zr8GJ<_v+k<{N%aXyNwTd!owWn*tk)fNaQ&-I5F6=1q|FInn#O{=a0xySCC> z3cZ|9j#;FnJ+dzeU=%T5&?tMOF?B;5U(L35#zGAl6&VT1gj7KlnFVWOGrqO(?=o<( zDpQF3;3Ld@<>G%u-tZ4x!fGDMU4r*ISbk4noTerrp-^+fl0iZ4NbCgFzYG5Goj(45 z;%9YbmHy^8ZYAd=B@;ff@o)eCUvh$U^n!|(r>bf%t}#up(a1TFYQ?O)r6%iPzs7860>tg>fYhllTdq3!fg?FG)Vn z;K};npyUM03DMjNo7XIG7C88nzeJVmhX4P6h6mD5H9lIf)_Z}mhl6ZkKqOn%z2 zjaH901pjeN-_S7qGxKS`2{J3@uua{#K{s+kWYL8KrW*SkwIv-^>pQGwa4>n1Bl^KX zb3-3nIYY#ZgNdA6+7}oMPVi4CV}0_Bjjv3P?Zgwt6zwDVFCIuUn>aUH2|qC5(9w46 z&G}%ddtd`I?;RrpqXU=aDjHtNe~GKjuw=_#e30#7VyUvSiEqOp{!O#kE-|*39y$12 zknwa#fK>a`@C{#%Gu_SNJXKu3@TqlHRIAJduI~DRxWu+IR)_B}7n!fPlh(qgaWFsU z2YYV2!)extTWw1nJ!W>z;gURXkVV@&@HKBnRwB!EJDv$&j&OMA@O1n+!tid-pNkHMVWIY;Cf)>9bbGRb^op*^HxnD{_w>Xt==MmHpxB zi37O{CLDHBY(Aj#;TyY)?wUO*4!-*qY!t9?TO!ZK!|;inNBO${3oiD<2@EHEL6t=_ z-vlFvhOYt+Y!$CuO`;t4{o&W2lCbi({ho*1rPEm1?_)9$KO@seO_ns-v zTz+mIicCds>W_$qJUGM?!f14ePpRd`XMVfG%$94|f|8636vT}TiWR3yu37wFKG#x_ zdC{UImnED5A7dGzu^>{h}?ox&&?~++BzFKt5yiVX|Vjj`Qw2X*Q7}a zzmH2u3K}Oq;Np!_bH2o-ykr~8a4dFkZ*1F5qV;+v&*FKE+Qv51LRp+RcH zf-d4O zl{BLW_X5G{fWsmx>_Nx**8EYp9rLgGF84X(3sbo!n6Tzr7&=*bPx$hOe^a=))Ugdl zEi)wzg*kQ=GEDmKpvc;pAHmKfBzIu%`UQN#%uC)hJjp$>iqS)=We2C3^0$wd**|=; zxzHmZd_^x}Cc{k2)-?+lT4jZ|G;;Y?@=Q1-DrEQI3wu{J8=D5F_It;LOx`^c7>#p8 zt(EueaVTL)>@;K|7DRhKC^K~A-@@`NK7w65#YShIL)zcgX)Ap`Fsidv9R71X{KD1X z38BgxZb}s_p4m8&anq@1_7!ZrQ}hz64@oZ2p6ig8&|)TWFxqc{BhTxYhC|#b=0)ku zPwFPvCor2V@Z(i+Q(%tKd7$h5Un1a9i=a&B1gmaFLj$HD=0am;=8T=@+%>y}jwn7T zYT=x;Y$AKd!RKNIP1CrXUpY>&JacA)WTgwUoRDu1kHIhbHHE+DGv3?CeA4j~TZAaH zhE0NZ$iY%U<|PYxwYnXeyC+B*c~tV}efiJIJ7c4PL)vpi?}>@GGY(Xrb7WqpV1Gb* ztAP38J1pPDnGfCFa87u|XO1FfjXwvOl@{`pzkg?Nl%{um%%v0kROtn+k{)yqd_RlXLl|3XYL>YD* zVOVy2{{8*N4SY<@t*k4A`Sats=^4Ob3@-D+fGaR^^y&E_H0;fF1g_ClKl@RznFMfY|ghC0;yVSd>E#m z?wK$%`UaPjhwaG|44JzfURg#&Glr!ZC@_A|(KUEm^XE$^<2E6|ZD(Z7Zg5B!G))^aMLXq~ zT#gYl^Q7An7w?|@Ab%^e`ND=O<|*3~zFx1-kmgC_-@(WDi{B=LS4TZEA(MaCB4(2Z zhZ%gI`&=kqslZ&r)A31GN!&}xHy1W}c&1RJ1SzysL<@5w2#-dzJ;~jHaw?r%c z?3^eV=-#yMHH)u?;lcEM3tJUW_@0^2=ulwEDAKldzQeV~S7{#>FdD=-mVUC&_$~Lu zEugCHsG_j2agZ&muJ%IhXveoD1wR_t<~dd}No0I*x$BcqS+wOBDXKZ21>Tg6e5 z>)Hb*(V`6(ecUpbSyR|w{3|YdA<3X1-e~Q!piP)L<-dipa+0TZ&U@Y^1#O+m`d6KH z@IT^Y`*DEvaJ|Q|l!S(qgo1}Wc|A_=udtfWX!!nsi9fEXx2?HFL6-Z3j^YlZ#D<=K zO`nZdOlVf-;Oe;OM(Egm1>SZ#QK?LWJ@mg44`15EN3mrfnv&|aZv%Dtw@S#L_h zRFO67+@>-A{QAE>;y7CpoA9L^6Bjv=105=?mT$TxHFX`e^gMPo@l-Uh7c|I920Udp z>lY02Y|>u;f5C#^+}|YkTuN>EA(F%>F@qEzuB1D6lS#`QsY90?VDpf7dC}lIGDHK?}Y`a ze-{)m%*|!UdeJ1cWxHCZuj72~EGP|(mU3~>J^F4*622&=-Uy9m%4s~q0H(7JLe{j6fC@3m) z;%jWyV9a-J;K@?3S|+gFNYV6&LMHPxd4=a<4yQzqED&Gh!}vPAVT$Gk6ZVCQJD=HK zI-sd>?!WVCwhw1+)Zci+!EEDy;OW6z6QwSGVB!5}UZgB`=Rw1>&-MqHUq{@qc=)gJ zC}YMq5s~W?A}{afIdfsE!GZ_vYqm6)1}XF!6;vfVOyT{o_q|6UPcgIbir~W>nw*a3 z{(P4=^Zp}$C$n*m0k5SE|1}QQ<(4njaIbLW)%Kq7nSI5kqy&c+z1*6RwLsjxAqqO8*~0IQ2n_7;JWsotYT(87hbUN-e~;9@#4dc`v)dJb*%n> z@ac{F`*}8O5`HB0q%oi)-ti&d?p%gvY7ui;^d>)e$mV%|gPU>A#*-d)9b={NhXCGtUi#)mG;oZ!2$%BbbGV5zdr z9Ek;n4F1~>{Q7a7pY1{dU&aUFJ&RZ(&i!e9f4Kc9Z_*})6sC#=EsRDB*f&a-e0V2c zpez^j%*g4h;~Wl4o)7X*9@t%YW4olMeMq#&xsAl-^t}sA~z4V!5 zsfx1jqMF8~hG7qG@-3)fn7V($>JUZdgE-2-#?>syS z)^_z3rw^Rt)Y`4EdU?WEJ&k*b)l(8bvP3iSM;kJ6#Yg;cTGQ|*n(gZM4ULHx&N6M# zRbKFh_4S3OFMpk-jVVB@KJ?t&ZndzaV62ajaf)S?zr)%tF1)3gdy(Y7=5TQXW5rwBA9zmvKjEO+gugr&K8YJiutrT} zirmY^m7Vs0L43`;cHWGJLjoJS7=o5H-9GHI!BafrB)5;t22Re1$wJfo9JVsQNVxg` zf{|1Vzu}=%2_8S1@?J39tzq<={9oYoOUJ?w&$&0O<%%lgSo>NbH=2zt!jgUEbb(YW zi{3x&Q+O40H`FjLOMKL`g8B7^4X%9IZW$4cm+eYixz@~MTgm*?{ldcj30DnyCN%0V zNctdlc>e^(Fwn+Tv$!KFk|$(5{xvLBXIsRmtXyX6b72$rwP#0DA0$ZeFzhTWacD>k zVAf$~c#w0HA-m+Dl-`0KzLR%&EV%St4yC5Jl;}uK)MjJLI6a;5)(h5kvsp}y6xp9` zaIg~iugEHx!6teoA+_n8fs>QqjX);38*KJpWo{)VH1V-D+~JWf{ojA(g`1ox>rCdE zf^D--aD3FydBzshVbn0a;h>h{jU3?cQR&)y;0DJQ2fAaA$^id z?}@^9gTvFj4}V+SG`-qcI)B4VF%OTw?CfSm3mNn_{68#p=?ss-cOxfhVTJn!jc<|? z9A;^zuw0)$!ReEIh5oyGH@6oDHF-8HNM$gWIbh=vW8}o0y1`yTa-v&>*+GY%Lpn85L$JN6o1 zoE2Y8(YZ5BkxJ~6qU|Mmj;m!IWK;P*h?@SF6zDa2(ZeIWq><@WiNm+o|5=YS=6JJM z@ESX4?cRTZkK>1cK|(6uJl*7mH}lzK<5+j!mNL1(z@`1+jG6Kg-vz4+9Zo-Xl+Br7 zp>eiB>ga?&JcY~^Y1}5&oR|K*H(zlqnPGha<5>~oKkWLtEW8E=4%!+w8j}?4Hx?Hd zJ6tjnKBZx^W%U7ull2p(S|7NP)DZe$GC>-7jXA+;~0GvdqX1y{x1&O930!VCjM#6aB<{6?Gp8h?-KvM?~*&( zw3*0ga6$6Q`vaov3r@7Rs0;7#V=euVsLhm^ zDf>qK!8a|pfE~=ISIxJtH*~NPozN%n;||k;>WGER77O~sH2&Q z__aOFobYo2qgTM2hMPVUb_ojAdvNwK8aZ%j_g}Eq*szDe>$i{3iplC5tawcl7`Wt5 zY|~aNXcw8J(QtkJ-ulxAm`aR2^gZNkE;KyJo3QKu1xLpTQXZCUeu6wFezIyEVkkOZ zpK+V((y|7gqywj1+?JThD=RPZW%SDWZ!r19EC-aXq*&7RN*L>#xsJ+CedF%fPtIVc2uT0EqOLYy9 zVmZ!e5OXl|hrJ4DQPd~<9dnxfrZm1`dMbRuQo^UlMcD>< z4u;dk8>;@8S3KgFbxtB-vc!a|@e@KFFHB9~5%@gev_Bgc!y%a#MIYx91BNHf7a1Ab z99au;7#ntcv=3_L5AisdmZ`AGgH?sOsIhAj|3ltrkAu9cE;y)H{!eWXSusI}JyM9( z@&>=nY_9vWn{U{kIMH$IBD1;POhs82wjI|0ou@k}@jY|OywH4yGd7hW??BTJo)yoW z-lR89Ir;zKRe>$GCr*5jzjdM6lrLeX@THv$qH{W|<0Tg)GHE?gG|rvC#9{Pl4S1f4L zPI=9glFE8x?FF~r`5(4M>OA;e6nT*Smt)!)hq)ii-`{Wi{{BDXeS?qkHN6Tc1-v_A zL@MUWXB^`)(dIK^-nQk(|N4lpY&ZRw-tBLcx_zLaRYrh=Gd_Tw^G*E&yYLg7_vEfyS3*5vPIi78} zaQCCfFJ|9rn*&ZhQZUbWf_UeO7=*kXJPoF0i4b%-g&8Xb7t z&Ur5(wMCW7&8@&)#H^cJ>I3U;L8-h67A$sBDcLM3OGTF$vqon&MeuP; zmZUl``gm-vSEz3&V&7BzLw?#f#ms4qj6rUVY?h8$krTIVHf(11pRusHzT+FCPL4y> z!R61I!xuK}Hsje4=@Ze;Hf5UQQ~8Ri3R{|aK8a^c5DrNzYT9PP_*iz&^?&>+uVpgK z_>6Y2Te`EDNb_q2C;t1@e&r_HdaQYvZ3EFO{G4u&@i^oCoNr>6Tac>9Zm!QP95nMRgSWQN20vkqw+@$V zcgQ6qG<>gCeAjmJ@GTL6|BgM4B_=Z`{OO#rv+ajym|H`sq0_CI6SlD^2PHVXao{O) zSfX$Y6#h#KzwlWJ*Cen^{3x-oQm&})RJ}{&K?YCZ2YcW7^sGoc+>l}Z_xEpcyFg~$ zZx3>%)YPts@+AEJ|G%AYkHW3B8yo{7?kqgQuhHLhi$B2H@$^T@gQXlv6WGlx7|y-s znXrMmm04x4!y`^JVZQ9=2l?(WZ=d|H>6V1fgl3lihjY?f_|qB=afFrq{m-6R?C{A- z<^Ex|;)J&j5i*BvwQp#&EBO2WzkN`|p+|4z_pE7|s?TAscuDw%S-=dZ%W^t*51tCV z@XdWg=LHpJy?P17zmf&9pWoZ>>1myM^T9Vg=0!UH+2d`QwLeef%4B0>ds8{3F{5E! zy#_y9gN?0~!U2N?4DT5j7A3T$DY3oKkTXel(o%Bs=yUUW-V>mBq(es8OPOnqrKG~* z&If1y$``J(SNUw*xV1^jr02sizLb;JDMw_b(*7^(l~VIyXWRB%&S)2Broh2J40D zqFkd$lh1{vX#wAxr22X;IB_iD-=;1SBf#|b|EG7V%-ZVaOCGtcVma_sXiWi=Xv>)i zPJiUL2(`6v9hrM3pmxGdMh{h<*HaXw5(V}j<~#A5{UeKtouoo<4ciL^rXsD>6c@P{ z4Hg_B9Zi>+nU!l?<~K4<%R8X6!J@)tj$r8p)|f)WKj{u4J36?8ryW!H$h`Aj+e7;` z0d6yxclt|yeNq+B(_ppy%mqFZ4F|`X4{ywkGgw(t%7iM{t1fYB{~>1fn_W&bJ*~}* zO|k4>v)P=4wB|1dFR7(CJhNw>!(U>M(W#m7fptrafJoSx3#yY8_A7_4TVTQPHl9^? zKf8WuYC?;iCX4RPw6um?<%W0U1Sa%2>85l3 z|4>%2BA6#iq4|`-jep4=kA)_llbor*9(-tfaO0uR`YLx4|1qshOLBSR$ug7i_H2H= zV2OpRyCekWh6hwMUv*^PsZiM75gqZ1dHqI)Rzv0`6Irug95}7D;pPTMo(Y;g52k7U zIAxKR#&#n|FQ;Eir?=rUV}_@d!P@^!cQ+hl+kIO8m0QH?e!;+H4SzUpFJdcV-(k#R zB5>s(>u&KmzB3+ZulRTPlvl-G4$tBRqAU}f1r%k|D#STv{8tE1FkEn@dxJ^u9Djv( z4bxUWIHtPhUsK4Ajy=5|yd7VdH4h8cxUv1%l%FBfIDMzFb6%Unlv;t!2h?90I~|g- zyxX)*;ovEufIkgq8Ros?j|*j5tE^aRzDTD1sCtoIQj=aG+i^AJ6@35M{dO<-#P&?g z&F#dbnhxuk5((E?53vP0{uJJ_U+S5io7)MwNB;xW*&*#udx=+KA;UWM1$oT3Kgt^=b7_YsKIQb0Ju&tF!k+@0?sAn`s2*AW;AXMg zjRbp_o{55`$3$0Zw3t~t{%hFMFObU-V&}wf;r6h3)`XIi2N+gQPkh(hYIx-CgkLN% zaz;*H4y%D9&z&s zgYWMNo7gX{`_CSIm-X!Q1ttu7@BjaGk9vE8NB{WD33rZnNWJBG(J*lW6WgH%!L>FC zNlsVJ?(Z?NH%Ojw1%L91On8*b*QRmgI9 zu9(2aS;I0-@Y0pWRErxOx=S8%own`a`M+?kZo~{SosR1P;wEu3(bnTKb>A?~mbhYySHTElngMN`-op9u#g+*B+-XkPyR|8RI= z1D7Wo8`~5{ApvzJ<&Cnxi0@i5S8~@Ki90Wu&n0bSNMD^ODt(5>Lz(H?M#qv_ z3(ktS{l9QdN!Ux7W0KvC1IG0NwhL}5Uf8Ew@ayM)d7}eOAq|J#G?qU2=d3OAfvf+2 zN1w_HVg66jIq%ii2(*RrD3mw5-E!1sR46>bv5v!W^XCV_Ul#T%PmtN+$dPy2`4795 z0(XjD#(homjCflU=?4GBY-iv7Z;si`%3pk8jnxW6t~DDRqj?>g+1}sV+x$knrL4zc zrog2cEg^ghidh}Pnxx(+6g%X#%Cxad3NSwPpCIj!$DHfS@bmrsetn+*5{~U3H!>f7 ztIwQql||!s!z2DH5e%)y8g~+we`@AC-?TJ7U{8b8%L#|O7RaizMJ$&TGCv`kDMT<(OCwXi;8MpU47$<|AGspuo#WBBPDtbm`YgWXP;0Mj)l=mq ze2q`#Bhm%0OlzJJJz?*q1&u}iaODsKcYMH|=64&~=NcbkDAO-ckgTO-}K9{^2i&KQS>gFM8X1 zONwpg_wVv4&jdoYH(1SD@P%=oDeF9W!77DJv7$7Fl-Z00ru+p7>?QZuPvoV&2$R2% zxM>6P^#sT7>@|<#HHM0hJ!kDgCn=)iwQFsjaD%1{4ZCujYZ|oj)wHf27lPs zE@_%~^dLuM=pmN5HVj9(|5!!5h}2$C!}&VH(Ahde!Tt~H{SC}fZy7)G>f|c4+wRb1 z+4}f@ea7xS#>!Sz;T^V2uVb9LL)o7E;-1E)@cXu6B~#5>JRANTX$XAZ zyjXs*EW@dj|0NZ))&3hFNUKszGd_5`T;RIX9}e#PA7+7U9y@vT9y{dfxp~|@&hmCi z;~)O)*9~75O>>`M;dF(&{q_SXvBT(U3$|u--JA;7VRuaX8jEk5B4Q6_?|eBZ<^R}CxYP;tM=-LdH?$71;u3zvdF*nYThjWz37D^G00 znV;;o7Q9cy)hd*^ANduq3y1g_I$4{XnQ$>~!t4X>8XFbdL=xxTuD>AYUhwo6|D{g0 zpZwQmwC)ftdu6)hF=MnBU)g#48wXfZ1Q;Hvvjuc_F`7uTZkjz)vasoEeS|XOm7Q%@ z5_mRn$v#QG%K-LwuiMl{Rvki<1Dj@mkn23=92!y zaFa3W9oIfKwh9fEC7W5LOB_u;Ii4 zi7$Dc=-n{m39xB6;>awvzR9@5LYMHSM@$o!O_*M3l$4op;F7&g zy^%wD(nRePk6j5Z`gfUkvTh5Jy2#P6Bs$`c^A(5f;s=9Ol=ql3pMKi2VbcW0UAq`o ziS4|@Vt(y_t|Z%(bE<3BG)}Sk|BzWMLHWT<;Y%-)8)lzok$vN2vMTXe1AEIqXQ@jY z_Hcf*j$qw$kz0FvV&XUUs`y{^JLd8{NMM*6{r}-iVWW(u6Y@O|*p$|sX()A5NYxT% z_G<26yflHWT~zo|t_shD0G84}4s&%rgr*+&!+0-^!FPR+zy zVw({ZF~`VJx~AvAX92tVmYn{^9r8vS7+xP~JZ@YBt8hDE!CS5q34+=-=LA#Pqu9F{!}yFGE?XQ4`>^0%J=>D00X-K!2?c5y zI|&O2Z&}xVm6M}<@$`)o;*^VaKmGr|UP9Ya@uhI!vVZNz9@fA3W*{JM^pI&Y=OeQt z3rv^zHH%F5*v@WfbntZS2`!~7p6pK?^Pl`-)$&iA>-~XCfh|I!>CO-Nn6f|VEf*FT zG`@FiFMZN@O7eg6?9vB6{{5G~7T2a5C>~{2cKKhQ zVEOm$!R&Qw^pRpydbF6Kos ztdh)H><;Xl&9_!QFi8H*Mw1H% z4m3neWQfi?f23oD!9iZN49{kbDT=p+6gE!~D2{B{9K1k@DWvd_)sqcfe0MlgTS`nE z5}9|d;*{d+>1blTqnX}fvf!ZNulbC(MA~*vl-!leAa-EFsrj5?9Zr9_J_##tadOu) zaJYDwWzCZZ#eW?d<>ljz8u(g|I$>af3mPC`3(u3b~ZZ2&9W$2`3|6yx@&x+;ZhqdY=e*FE-o_VnOlF^FA z{F#58v|K%wa(=Ye_}laT>o z1&)_kA6@W?c+7IKqS?eHQbHk9IEd{4+aU*Dkr_XGJ}~ht62JDMc}e7q*$Uqb9T=5^ zj*GmrV|(Hzdqii3tUbXxCBLD$U_tiz85d85d zf!5P{CQJ?C>FM}8^Fa+y(XaXw2Ux8?l=c4qkh*4qn@q(v*_F+lUIslr9c{KM`<>ZC z9D73_9Gp?_m}cOZ_WvJq`qcgPjB~G?<9-?Pw|&horsd@qOq&k$sa6#IHUnl%hBS$Dpb z{vco%wqy&#>{gbQ%;$TU-ljAz%T0UXrE#LMPKRg0?|(NX96BdS?n>pDvg}|kbH+{v zDVx-$O$WDgFg%vsvWX!@?8PE{QC0W|zFcyj`>5 zS>yV0*6CX(G=|*}DhhbucuRN#W95lsnGv<;4;*ON^jtEgY*DFSLY707!*eNx^mI7-t+|sNq$7a>4CLmcPdg=XKt#F^U|X?F#!h9bo5`ILK_Zp*TMw&qe-E`T@oR zswS6CiLog$tXbEh+4{3xaH;K=`Ha^T|MTm5C8kR3=wW?YTA*s+JfEB=9T;0#4= ziwSQVuTFok=j(rY=AxgRR>n*r_0DXsB_B*a`9JX|@4aWOPs%r(1ywnpa+T%DTG zd|P4nfv3j8IRRhnz0Pc4%AeVkTiWvTvHTU=34LZd`VO~tZ7^tG$$FEStMEgv$eA+* zoA>XlJ#^sM(RPut3){3x773K;39tFrn%VM&bww3=&b_UCJtGOsq9(vn;3a{z9cZ5u=Kgm$PgiW zxPh7H+f+t_^nN}Lg8-HprKP-539QOyQr8q**O?^9D!Z)i6HI<07H82ohyCpZM=sGT zfq^q5CooNAtTPpL;a(EZ_U87p2J=^mzZnv<5;i{(SS>Np%~nylhv&knkLCqmGY@z&R<jx7eD;|8UIZ%6Gfd#|+@|2{ea1$PnXAO6L z{M9blsUa@T{KM{E{e3NIlZNtFhq(*bbSe~@CNkbz z(ahuJsFge6;e;=zPB3uK{{Ns${+YeUOa`v>3tDaV2bS)cP~CCxbb*AzFU8+?6?tvk zet6jH*hoxZSfrDX;2@sfqEgEiQOr5XcBaIFU`L*wg7r#=*uwf8yJgutqFhRTDbyS} zW2*DMS*KCgux+ZL!B&OM2R?qB-^dvD()kg4(KoJ~0ETOs?Qb`>P1WDf$P&RWvgEtH z%|3@-qZ3<~)i<=SFf?*L#rUMnLdnN5&i#y3^O3}|rpp$}iyArOR`JS8Fy6Ib^gG-$ zA@%BnW41?hJZ3mw;`{SJZOI-c?&N^y-}OIe*+1ZHNYGu-_i(njzvPXB;bBT?wFgQM z)Th{~{5zQ0BPb+vV7G?kj0Np07`;Ocq_1$a?PR_7v$bT3!r6=)3)pn>98x8hB(wC% zdPKRYa6CBh!hTDi?1sD_+}_iBc>YTUNI!gFa-L(RY&*{+hf_=^4rnpg7|3n9BEC#K ziR;aVfDa2K3V!PTIU}Lw@ss%zzj4V+%O?hb9k&&(KP)tC_@uI85A#h{sTzh#HWLGe zkH!|FPOlWyJod5+{bauLjP15K?>;wCi*A0+-~SHtzi*XKIn5xsgEjW-ah|=wvRgtq zgX|2953sF25N-6&d0JNUBf+qDj<4cRIIezBG=p0B=u(LVYuVg7q9zz0WbXU_uQC4^*thup z;txFLptfg*L_(>M4sXM0gB8*T%`+SJ96Q2ruZ_`b^@O*zX9{XJGzzJ`U|_QNbAVHL znxEoRv6KMWptuH)Fuk~pTdjG)fB(x@6=;`)YL_%H8#Od&2rK3apKv_$Uos(g)Bgvb zdmJ8~J;Jhjaf2h*E+*+9E5ilbj~~ord?hpCwnB3Q56^;1$S0{UIpO-&;s94Z2X9tDgY>%t zON$=-P2-ucH+_R-@&wBXH!D0+*-uvZ@JvW`-{8bzwE6T2o|#({7-zF;t4tKOd-5eG z!0;5yca@YYa+W;~b!?_u4!lAhyPGC5UTbg)Nt)orK51uy_veGA#y2!BWazKpX)@tz zlnwmQBgmX|UUI|3)2ucX9DCFSb~>=Xec4oI<5;Drs&}OKf%QB|#rDSy>3e24^zwID zJ4`#27X06tyC%Y!@k!_n$8v-ELw_09iXNOQ!@OnUA9xztg%y%x`zHi0+sWsrjNuC1)AKt~p=jFA3G( z@DX0o$d$EXbE97`+qnz>|MEr_@!#_2&-?PPeFG;hdtuBE%lIMaO&#S~@oeRuTiM;F)yZ-RWH8d>U{Qtq<0}H(5 zO*}q|?l}KN|59A8fV539^B4UkhuLA8sanIb#^zL+enrq3YhB}7Oumw&6De4uK zrYnS5W}Qu7DCL?Vnb54fVarc>sr(6-KTf=Cq{D0M{4LtZ$RS+c!D`EbAB}5k65GzD z9Mr1vsAW18y@J=Gpy=260}RqTnwA(B1kYp)@%!`lZ#QGfCbJ@|7Sp?lkwR0{9*CMA zu3zFMGv|2FzbHR^MrPru2x~OMD3y(ZQLX(+;Ag^ME zyNs1Ik6cVj!&Ac!`-FF{`AZt!IGWT+PGDFg(_*3~DVccsMdCxIK(2E2Nq#pL$mck) zgylJI)@5FDmbFlD%_8=T58N!7zdTTNJF>82gP&T?G-k5{M_R5-Y&NYqP{-KSZ2kIz z$;lHP5+O{jk{ah6D%r2iWSQ>#|Nr6FOdV1k*$0^?E%=(|0k*Vd#>WjR>8ssQQ=2VvLelgC`iQ zdu67WIo7cqx7=dgr@P$!1$M+urK~-9H?-u`Dvr+)+;pph^U}|TC!#MByDn^L*LW}Zkx^^2!&55_`{vU&FNE?Z z)J>4Kum5+3;hx+92F=|LX$@>H4#w9O<%olQC?%r|Iz$J-iHMo+S*&} z5)&Nsf+ZC?r!wx8X`0clp`4Ja^{H#`|A765e_H3r9%1lbKjC1r{e$KN#p@dX8s~ZN zdnIo$PD{uXm~(tVm1CyN7AEFvH`#gTIr!~vFS+#3`D)|q2sMwHrw^Ry2w8T>OWk8< zi-!12iG)o4Y0Dk+8lUoC*~Rp*x?}zV&DnxRoy@CmI~4t2`1Ndkgu)?ZCZVzkf4<0D zCA7U*aOh2Pipv(!#J4LTMPdOPP=*d^8flH z2^<#h8-MUj*wo$0X(-UhA)c_Sk+0|A;ivX%v~> zNAW4wnssh7n6srFZmqh|Xw~-LBh^5;qJVMAxtWQp`4@Z@_t5u{sr=2sY{IATyz1a9 z%Z$Ir8E#HH+`v}%|KGs_OlK!guo8W>@BfBhlO{GY#yxaAlJM=oFWmz z9N6al$DL1_D&+^%jCZlr4;a_uZ@sIEPhPyfQdK$I(5*~hit-c|FH7u-W!X?3L z?dcAEyZ2wHT|U80m$~Fx7h~McMz1)J8BUM>$=66qr`%Lp^r@*ub;f^rGwToXK?TMR zVOkB}(l;?qU)*T@_W>VklBSU|bB-&U#u-I#WyQJvF0R}~GD`%HbL4Gk43^9|${@Vt zGI!<#`r{h_{k>cr_Bz{gB;!b7aCZeIJjP5Y@N`^;8x+x6PDP(T^PX5 zWVL`{6-$D#)rLO|T;U(=f)~uXf8eIUhn(y6Cl(qlkgPE)h%so~zP8~HW7dtPZB`98 z76{f|kiF#N)4?a8lzmuAbi&Qph&X0bl>?iL4qTOgFw>Ha?L*_N1?LP-=x$*Cbl_*d zWYGuy44=6Z87IznOly2BzA}+-QfmoUgYx4GY}z_|4~91wI6UHI6UGn^cA-UbG9C%e4^s_I3=Tfk6i#87z&IyfBJh)ulYNThi+=um z$r%mNsS{3{+~{Fj@~3@TC=btt9nB^Q|D8^&vSs|_l$LSMTha7~>7#v)1H-Kozt1z2 z3uoAyDCtNXT;1tVrI0GaY_r#a&1J#nxjh_z9~cQ-Y5c>_CI3P}Upd7f}6O`afj*Gj2zOZNhaiX9zR&R$-{Wp2FJt`Wol|aa=CbVI*jC&ux&dpA!fc{ zrr(8!6&ozrUbdfbw9?*ij^Tu#$FC-nGm3?rFaJ3C%}7s6aFH@$YPV#z*dRIML2t$b z1-62#d^xHN#+N1~PN)))pK{*u`JoL?>`Dh8IsAPi^M+@E>YoLSoB_{eYyueG`ZU~O z^WvW{q4}w3hJ~?_f>qZ4#OM5ue8*aN4H{1?sa+^--mmbKLs__{n_1)BfoR!-$Nsi| z_eyxmpc5mpfZh5j`j4cNEPhhkJdcGaB{_jG~oc*9d}Y%&OB=R6?DdDLJ@b38NYId zwB$EF0cGV$%90a4Tc{``e3fSQYw&o#;ZLVVxkDpwbS6V!`<-JflAU+B75|Myj>;3>^})E ztI`v5Xa48u*!IbO2`5v8R6;^R!}XaP);3Pq(0JzsbKYZz+rb953Y!z(Iz?FWJvw~o z|NnY6wuoO$-G+{*@;^+IPng9xm2<(<-wO`1T;O&85bAcJhB;FABuBY8v&G$mx88IZ z$&@|N(O7D1s5I4n!9{Pj8e0`m z(tOZFqG8Uy4V5V?c-b2M7+5JZNKNjUC|LMm6W67aN5!u8M6fvCQfRfydGgbKOHpHr zh=()7&I3&nOc&ed?Qp2MafZu6*vRo)S<|$sjcNZ5s-HJ9aQLp`EM@QWflX*hG2>14 zBPSScJF~8{J7^qIFOkqY`TvE~nh9>4i-McxR3`po(2r*}HIr~uZl7>-=Kl-3WI_at z42%wOtIVkX=ge)D_M$Og;bZ*${Y=y6I(_SE;!3X2pT%hOnPImSpV{ee|LxZ(B{PNp zc)-Q5>rJ=dNxvI9vL2RCUWtjZRitx1@l*3)X4)vqXq5d?zQRLvh4F9sK<1{!Y!A)Y zDvq;R>Pb$}Qko%su_vLyR3q?^aLA1R?ItV!IcJF#eB^s|;PAAQPFhR$^K9tiULs#( zAR)YEGymMV4WTg;BH1sj;m#>#W#03crJH#|=z=foai5O0yx4MBt89XmhgHMe84QNZ zDdsA+O11wYg|xx_Kg`EZ*1vGzRPk@R#CIaDpp`%GmEoc76$cK*bIFNRZXc<* zjsM$YBaiafSxjWz^F{QUXX_4mv*<$y8alMuOc)Beztr$eP@Q1M9U-a{e=w~`LUN+? z+K!vG9*0{R8yVM$C)q3YI;L$tz$GD&$eq37;GfeCYU~@|+m}q>y6O{PbBNE1xpdlr zUNx~3b_pI*?028@+*D#UVwmD5@$eyo-BQjuMhA>rdM3>Dond`|IqSkF(K+mnPo-}d zcl=?D&Sc5tIeaSqM$ohW51KE|m=TbE-oZ^_y6A?B<^jvu_RQjp+IQd#OS~)V8R-Rk zPH=3M-=@^Vddu+-f4TG;L$1#32wUb$Y;ket4lwM?5*9hO;REBzzwTN;5_+owESYaD zV)1&t!J>&5w37Enj`Egwht{wwHt$*x(Y#dNW08}|tb=t;%Ou^l@QJ1b^mEQjN%$#x zt&;7isKz^oLe}gXhaU0PNaz%>@(GvZ+nN{}J5<+xILH_gqi~z|eEfwY+>ezHab8Mj z??~1UPLvfanB(+II$-^O_RAY~F&%02RMuo(&A6T+*(px-(2)k2V+*b_EO1lENt0jl z^7VE72e%m=3Yl+S=UKV>-@n$YKmP}?J#`5DFT7)}K#AY!{q+-WDF1QdT z5+U=a{W+scG;bQ4a!^#`aqa-y6jg;2>lJK!cuwRsxhe07YgX0ph%hopIA*>?uI;I1 zfnBo85ur7?>?@-c-kL|)G~Ei+`1$gGJ==|Kj1hMl-!f-A>=2GAcYbXVVPW9(wk75K ze;y8o+|@=0)z)4()A%gCWq(3d;9=p1EFF~(X6B@wcx8Cunzh-36yb~nVY3ZP?;bS0 z`O}_}-E@Z|bG1_L!jy)o_Vtnz*mpQEcRu(vM=(kLko|_DzxEb-|Ngfhd0g+IVq{?8 zz$WPUuW{>Qg}iokwzm5J0&jIM?ESZ3X5ode`xg|6h8+9H9`5sBA|b8$72}0fQX4EU ze6w65%q!G<_2Y&eEg{_+l>(-a*F`GUJosBAdH z9sQ3zud12bEFzI(K5G)gS++k346*-Nv?e&r{QLcU{Dt4mGY`mypD?mvYy1DfIYi=t zD|=C6(+B>fZ+uE@np+Z>c_#F6l$?||F1gm$$+=d@#pJ@w842YpoTgbF=DW{)-pY|X z?ZduZ`}a#YRC`MvXyn=?Y1GVZmBaf)KTYjIj;cz|KWA&31vAA0l%;B{Y%lOGNS(XC zakKJ*rI&MLCKL-Dc*fYobwf0Mst!5D7AGvPyfD{Ijn zXRG}G6W5t1H<$?s&SVo?KVipjeoqdb3ARBW)EJd_L^I~iX_OB9pLp7~vAl{|I(&hf z#*QX-c01-{lENo?*$Pe=8#!tp`p>hWi~UGL>{MpWJC1iHU0OL;-9M1|!d_+GzyJUF z`-9aoSQ%Gud2o8N@8lM6wD}PqUoVe{i#c?ZhX`6AAoF8d>LUO-@O2F!`X^ z%cJ(9fmx;A!0Fswhb_eiDmnIiYVH)wU1_J%+jPnN$lRWe9qlPP6*Wqy*gTeY&zdHX z%Cu-ASM)Ou*^uN0OO8tgOv^o1T=2he@=i{U$I>tLQ}%SM6>2&Esd*01+nUDHoB^Lw zU3f|i9QK@G@Or-Cs_cd?{+)%KUb7#pb?>=wkZXmd!dssW2i4q;Ffb)$Dl(T$;5G_4 z*)T;;V&N;v33pg}5>56SHaupZHvizcRuRF1(g_Jo$4rG^eF}_N(D+$n(%lVH?Is)( zX5O)xy+~SESh%K|^F-|i;cJRf4|mRFyj0nIMLHn)VDH-h7bc1Ce9V2ByQ|t|G1H^C z8TT(f76=k^w&{w9{4Br6MlR%{fs^!-o&$$}IfSolVl!J%t5k4W$V7u7b3qgHbjC^V z6I0DpY@67QC;ZySc%FeVS2CGp9Sei34Tt2CpXVERCWJdReA0iD;8>6>93t1i)>!{P zvEl8)wjaEPI~cibXUtDDH!^VIGB_b1qnz?UXp)&iZ%sffNA{j(tH&E`SPG?6*hFfc zTOYRHAo+mpX8n@fj0p+}4sU$Zn5JJ8s1{^pR5r;yEOp?4&}_jVzJqs|r!zm({2yIZHaUL#$I91a#I(Mg z_4jPfz-bLlyeVoN&1_5$nAcorv+~gYu}1E~D*hejjj3AJ*33ubCw$_Q+2>$>h|i*B ziBL!W3<*V9?X(|dY#ojZHc3qqSNzv_-;8A51kCUUIMbsHIn3io*%Rg6KbUJ#A=w!r%KAFG>9fq0t34VIIXT@Ub~v*2 zI+i)JeNFtT=%Kx2P9n?wOCR}f#jzbVwV2x!-eu^hE+P4_)SB7rmaE@Mo|MLe+l&~d z}mFkxSSkEv-r9&V?qP zYa9%x895^!^9G(!(qe7t6!BZR?VVC z&7o}yrW4#mj!b>v^~9d}%Pi@L#rzj}5?o&8G)bvFI5oMomGM#iiMNbB7i{=fZ#XDw zq?}~NbcFrxYQAiS=8OPVo|(2k4l`_KzSHrS|7Av#k;sllE?)N!j4lUy*rM#tapfFw zIMWotlYOGuI{ScN)&;v*HMJ8AoH}zJ&J}WVW4qy@vEow`Z_NU;TmPD^t2ekQWGvx{ z$uu~a=6`S@hndtR3s!xL7B_ok=0%5@B%l1?f0y&0Ief{2HmM(38VNrdq+cD_&|?0; zQIuI&nK?&*O=R5$QQi%GVmf|`FIjIn{^GYPm8!C`VrD*Ezl6=e!*<8U&;RYO#4a#s zULqOc%wbyVWOZwTg%i&oh4=eYo7$NdF|uXPQ8s^efOqEq2`2p6JDR`uF{a=B=a8; zncNT-H^GKsv-q>)^%@V^JHy-}R`Up1UT`x}DQ&!L9d(PLotat1zEL`;M_{+YRL-Pj zjCUG-v9Iir44B=RV7`gL`u~Ov%*&PA{&z&OM4Ua}z?Javzx>2r$pfkE%0W+gGzA_s z`zq`|{7tLbxm$3e--Bhwi>CEHDERkZKJ@_CvT1_%b~K-LGj!V99?)N4x@6)xhTJ!c zr%(Ss@eil>{}+X9#oRi24mAMVuxJxMsJqm_BmIoGWRS!7Zi1uzcTto`mfO*;*BTzOqlrx4WRb;OV0| zbMEjwP`%@GhUdd4o+^fzQGPpJK9o(8fTbi6duvliw@y1GSlY|3YYs(#e3NH~4EBo`~Yx6_?f)9)(e!MU4 zRTo$|^Q1UDk&S4cCpbs^K;2z$Fvmk_Q}jmbdO`5KQ9Rari99+Ub%BNeZg}1Ghyhd{RvMAdqH#rk7`e&pC$E zlOIgs+1B34_)Ift`KJ#D8YyQD~ z?O5}a<7apbj1^xsW(sau#Gj=ueCK_KpK8%gM(K#3{OkP{(_0U)h5mDV?H>_yh|Q&r z@w`IQ+>Okh$NxWkc#Pxh?+w-89{x*c;0tp;?K|PJ!ej;>o(ZB8CWMN1n5m~oE2pUH z9r?T9oXv{4T>DfREdp7i3K?b{X>MUu-ci<&Yuq%&(C5Jx*66Rykq21>lT%Vt6H;8> z3Oih4QF+^Vm@{T;)1ANKMc#tKm#*HrFflRWhJoT%{fDVs%qsSOf3rt_W!v+XX@?b; z3V+t>O$WA1IiBCkFn#R=EB+LFF1D${0X;F_3@3219Zq1-=|A*Isi>OeX0&sq0mGC2 zhjt1M1q=*gGkY{z4V8mr4s)IPFL6>b=zxNjX+iTZ`y4m^APpy};tr-i_FLK*&CMko zTW`s?-QS<+{bS*2<^PW9m68jac{lKJ++h9xFq*-ERcggW_F3Oq&&M!wGpeO6@#+;c z+RgNOPLr`NbHzj9ikHSIYz>lYCv#|4OfWVwHcqiLQC8Y;KqtcWTu0c%#-9(ExTMnl z3yOZR&sfYn=cJ^GDB9Qpr%vBiYhDiRNvI}*P7aO_raWfs1az_+N8O*1HTcI7S?Gh@Dt_sRmq#|}S9Z}>pd!o$>y5{UuLZ#HThQ_nU3>`k}D4j|0 z7M(bmYYF2?j_*=Rv48*fe_%eb-{%6G-4a8tuh;8cetwsql`grES@r)!sZ|E%4L;Qrd2pNI0jUE%9?WhE#)-UH9v?eJ(s)+P6^~fRDi@R1P+F7VouF9C zmQyA*XTPMNakYZoj?aJOFID{Jdb6hJ^M@whMjpS0G$qH?DG9RLZUxOkPnPYkuQN1I zmOa9n&(Qo@)s0Q0VOFZd1?%L5t^XD8)_S;0J#wGGVG*;St?_V|pwMm5p;i8lFGWhU z>{sM4#9rroozZYg_(mkV!v2O+oELKL*=JO8YP%H6FWC5)QE3f>it z-k%j2PqEB(Y~x{Bxb{?X%NARQ)dv#lT7I@m-r{3e?x2=Z+tFs1W6H?9rH<{Vc-(bm z-e=B#+E#=oycBz4?sAveb9#@@h7v|i_L&b#B^RA*naVg}LHn8=KmN;Go^?LdBp6g^ zcpxmf@yg*_Mk^A}o?wv9aGavwQ6v%fQdu?PNyTv;?u11CmA?5IJKMaGTnDSFDxMf=#7e%yb-&t9j# zVOw)kNaH2eQ#-wRCh%$g*v1vGyIJs9`-KNvI=5V6edg9-8DP(-8TMi7p$B)4F`O(G zFi-Sme(>Zdi{|%#%DO2m(}Vsi{{HFs>%dz-H;=nauWmHoy78cdf7?TQ=8R1p-Ls`@ z3^blxQ$OKjTVcv~C38adtj65!`zJKk|5&BDz~)m}fQMYm-FK}b`8^!<2TpObt@vBN z@OEKB;-QX7dWnJP+@pw%VrES+;A3kz&7E=2_1mogc^-zJsXKT%1Z)`?x;-LVdr!D*=wa4=AhE!h=fR^^ z#zlO$Y*Jf7KJ;i9@9Oy==n;{4uH{7cgPFERzGh80CUYVs;8|i~a;v#Sg7->^g{)?K zgb$x!h~s0uxt&LHZu{Iio|PdBcm>%`>@&`=pZrk1W~cC$q+}P}oP=JT36cw#9?0jI zF|6Xbv*I8B%$rQ{((Jo}It7g;onm=gVeBX^w}9C$t@?&uHbkm&|JW zLm-IpZ*zZL(|2AY#dq7-*K#ntwPvwo46$fD)GJ!@S3aPjQ?l$V|B=QGT{8u(I+#Am zRphIeqzKDYUtr=53q1Jur~D;`#K!ei2`$&x)=!*PZ|J1m`d!}6pn)x_qbp#2H2FEt8n~ z&lnpTD@eIbm@2SA^@4(RLiHAh>)RWP)Q-sWJh)s_&zR14a5>BWcC)+%COS0^>l$?W zolTxN=C!?LZ8>V$@{hmRWJ+5}TVf)M~qu?K4k7Jj$rMzxpC;k2l>ni zOqW(9H7pa2IL!aXnC(dk4|jUR%$7S9EuDr3Vt&21XU_4|QC2?W!)DP?@_oW(-ZhbY zUhW^ZFa{my(2#bV=eopFZAxU(jOhP|56kSF$j4{OHlxmCfg`($M8Z$jjUm$+S^u;@ z^LMLAXB7FipyVinyhTH4$xO)yoArD)ObtCV!TSDx$8)C`mezj|%6;%DtiZilvdEj| zOnky>$%A^WyTsoZvw2jp9#zjtXk?t{mpHc|z@zcBYlh<=`IU-{m-=lYxViFg7?n-n z-SG6L!1uqY4Cc#b3PejNJmlunIia9=;{AWcj~voR76SPvY}CJL);QKixagABrDv0D2NnUHRT#N^8`4alDaXqeS@Ecu!U!1><{^EpZJU_ z7_;Wo{rx0b)5rQ|f!T$|g&X{|bIf?3=-;pu-%!LKBcWq&&bH=&}X?dI*y(ndnOpL^V=z$y>)n!hKrPu#Q6qB1?FE1N*Lyuvgzuk zHf&*5Xx5*wh2LBKf1;>`%G1VU{|`!pOmq4+)p=TC^S5l}PeRN!_9i!E5+a(nU2FVS zeE7~W7QNvAh6mWn50>he9A!Uoe!?!9O<5B-GaF`cS~ak*5BO|whcExwGuz}h zJZ9T<=+W)%>mR&6o)F0pnCEaS`2Rvz^&R(`rWtOqnl(`{sO-=G{)nfIG3pJUZ6nUt zvw2h=WzgNH@R4sDw-rN2jGW^l_8>LmhQ*?020hc_7Q{q+WY2asFj9I|5)pFvQJsZ2Wc|LKe=vLHtI{m*iOGyw03r%75;3iG{hOnvuC8)AGps z2|F03N_K1${lvg>!<1*jmt!2|I*Vdb8@6p%{K}NG(`v_BuB_FLrv;vD_{0D1#Q)TW z=k*CQ&#}zCz;s{bC`atWqdhZTvdR8qpQXXD{u$F!Mzs@JvL_N$AAN9-*wggsocxlt z0tvqxQ+l|M1ba;;G1sH39)~OfQq2txQB@{0=N&m%nn7$C|y9 zQEq$B30_sULk+W-nVM4#7{c@vPA&K^!DuMM#_TXp>J>AS3qOMcmrFtE2?otO{|r8#;_?4H zZ)D~ySSN9KfBgpLI}3UfSIC|?%`Ulc@r(sc+)v7G7*!Rp^2B~(|0bUysl&WvLaV6I zgeJL-Q@F1jXwu!<#;amrpy0OO@tU&~Lx-eB+y4novSACF4zpZoWHc3P{B838-%s{^ z%Q%;aZ;SaV|6_u@hqBb7fA$q3@-^nx7tT&deca(^yTY(#M;7-L50)^G1%2EZ-(>eJ zpT~NqfcbomvEdAO5!Yu-_i{yeS8){!aMNtfCgNT~vzAgSnNJFRd|2c_MGr zz+kDsRc0!pY?6CWE4m=BiQQ;XA!88R?6v7l?*v(51zG16w#Z#zl`di6pXK2H$lc_F zVzb1AG^H&}?PXsM7-v6dlV$$Xr7)p7!F!YAw?@B3Z8^pbE=p(gChV&J&}XQUllYO@ z`U}Srws(9>N)9r7wf-c@zF|W$3!A30aFSS`pw(f?Wx?oeR>zGbApiO?PC^ zFjNfFZv5M0q;ZttyYh{?iV}rKtlNy(%9e5Gd=M7N+mOrN^Wj%dC*!=f#zxkx1x;*! z71{$0oA|X_*1T}oA$&=p-DH*GGly4-5xbbor#L=UU-Kxf;Yp_27DgABnkn{9z{ zgwvEh%`56W6Kc+K=rR0PzIt-PChkY;{$JR|wX?3lV(LW3Yk4hK&3SryE^OkN)F-*{ zrQptY?k)Dp%x7dG3=TdyP9yaDX5-s>%asyy~E4<7Q^=!ljCFdSuUpFUL7d+0)o&u1fiG(1`Vr=*lrZ5 z%`jQxc!(kYg`?Y-840ZV%!`uRWO-OFacj#sNV4uZKAF|%Hs@=NhBK*6eG8nWEDjud z_Wu5ZrL%Gl)P8zU-Q0NECbEHcSmAiBZ%e9M)O zt)VR&X68q@vM>7IbobZvM%I_-D%GZ_rce06WclL${{J6Ln40%4HE1Pl--Ux7EKT=$Y}p-&&+(tzaxn) z%t85*{HqgI7Iq2Y8IIa!5x*K{Fs%%ccu+K<>$&}rK%NPz()aa=zqd@BCSIO{3%-DuvMUI)%Ftc+>g{QH1y z?U@UXj30`eR!mP6Ras-m>?i!dk9)=KQzsZ!Kafo5{r{h50v{W5%1r4UihWly8jgzZ zU`Tg3bFSeML&j7ljYEm;3J1dy96p(;#2#>a?D#6-DU-5rkd2dd#{)L&J z{y&_X8X*5&zk-`D!+?L^{z(%V_k88t#IqnBP{<3SXziDB4AoHWW!P=&2 zQN{+2pBRL>mn3rQb1!@ap~kav!cxUNYy^C}&%lKsDM zZsCmo|C`y19Op6S$tEYV{$>{YwxRDxy@$4h%)Sku-TwV!G~3h2zP{-U`_z>R=8dOr z|G&_@)ghB})1jC47XD6$Sc3GL&-~_=l1WZX{ z|3P*iftMmN`~I}^*d6?2=%KE0$MKb8``xCn&5b=jd2RO2XRR=mu&DWWIPJOMQ_VGJ znA$ak7tLkRTJI3<*mUXE^Yim16K*?4Bt(lIIK9cynR7y@)B_`Kvk#mlJP~YG1)t>O z!VDd(ZO>eA6!5soI{RmPtFVr}!6IIZ!(0*(&zZI)@r9%}St<7Pym-o=62M|}-~<1r zQvzFKnp+rk&Ke)M%w(}dLZFbrP+TZpz_sHWCv(k#PEM;IymB^dZJ+P&-(dB|{!GS> zs11=kJq32mCX){w;(R1}LP2!LU5;|;GyVS`zB@c^n?wM^A|2Lt?GpuVE|muve5*S? zH1oc5y2GpOpODxdbMN3MP8EH_rn@ZN)=ze^)!mRc@IS=&jX8gNQri~o#HZ38`fHre zaC}u-@~3$Q@9FFZjY&OBowdz?{o+9JoN+RRA;jF*-*x0qYhH(l1` zW>$Kylz;yZf3J9igyRpN4d1Mpb#xma$!*f*pSI`VQ#p-(V@I|$hdlP*a~U_evQAr; zuv*wLkuU3aqtwa?qM;K+g%%WvE_wF+IX};t18+GLivRuj%Nv)=p5<-e{8_<5OH%S- zu28^E-pGfnR+k@}Gbc?DnsY!Rp_Fll&tLA$?@ec$`63$cFk~M7-+o+GC(p5v*_&D6 z?}psj3kn$Teqmgvbztl7`VHoR>eCadt5DO>0{JgHep@!9?E&jWP?|_;a2yTE00r zH#*?Ch{+6wb!Q|WdjD~FHKXzL`NXxQPuSF#6g8cB=HxcHQS|M6`w47%0gvS$+?~I{ zHe|xzWjz<3@hmC)EdR=U!u*4q1AI0}R(U*S(^}%ds<48owdC4_ua55jBo(|jCeDqz zQ0lxO*x&Is^Na_~d<#-@7Hs&*J};H2RojE_-b?0H%x^haWv8)mS$9NEU=v!h;rDTd zXf{4gi~o+&CnrQc{LkaT%i-qH$UpCHvQx;N3C9?Uo{QePknCcjr7+iyjV)kLdWETDz1`B)EG?rNAp^dTP=l}in6aFSG5c%}qzUIBe z4c`NwrT!T^Nh$X9ta#U^v$VZL>3}TX1qHqhLFue|AK7Jp96fmMB!lXkT4BtV-EZuau5{q4vNALC9>YKUm1#2>@7cF6arKzd zaOF^%N8;jl2K9yx(i{(tSuiize1s$Ovw_1Yh73i9ZhJPiCC8L?-u+WPs>vK9|Hg*D zpyp6mxbxcvo_&tfo*X*O=H_vfx$t-W4$Gbkempk5hDHai?`=5fGC`;!uYFnJ24_iy zJZC>+gZhJ~gxLz(*)9gM{N|E+&vSxdP~bG>WJf_F!|G-g z;S*Z2Cwk0uY8#$7_9{lW|Cg`mR551$aV0OKsbQ+{f*;I31w9vE-25nCnBZAtN#-~WdnK@q8uqaztc!EKk`Sy_pkN^K2@3Q=G5Ms_r=x5Zt zY<%DpquUP64P^>Caf!{Rc`i&~=xol9WSGB?f92xH##F^Mg8cF?5>gzDKHL9EaG$aN zzcc$$N8_yvj@fFwEo^u%&OY_^f~zh67g|b9y6zxz;^3YMMH2)kbw~<)b6U$>#bC7f z^oa(Uwh2=MFYKDwDH+FqAogSjhrP$XwhD%l0%h$jkH0fpBr@)tHL;UXP;SCjz702{ zXUsj3Yr@9n!akGnq0ffj33KBoe5m)}Z)YqM6L9HaoO5x)X&aB32N>=%9b)JYc4?Md zGo5kMA|^ut*1KAV7+x1FY7;!etMOFEA|l}G!CP$|HtjYqn0aUZ@7UAoFahKt>^oMT}3HSbSuhRbKd@KEd5$m?O4G-;?$o`U_v|pi+u~1kizA1c$k@M}0 zo}LSx>QBn}l!NS2QyNsi)L(ebFjHZwj7n|8C9MrUOtNyktGyMQoBtnp$ujBOf~VYD z>X=LC{Aap-LT5pr?Ujm%<KeJu>mH`EOxtSk+u@f(rtA{2m}O0u_?1&w*>=P- z7QLuHafD^Xn`RYWw-ccgc}`4rRrue?#!+YJaLc%7LkIisse)4O3fmV?Yd(oo;%Fqa zCLpm%FOWTb%l-+f{}vqjf4=-d=Ai>Kt390AO_G^rFLgTid;^;$^A16N$)C+{Oxs0M z1im{Tad>t}YWW5(;gEw4)0Ca2O*U?Rf0E6VBT`Z!uk8$w)wyQw>OGbMH%hb_=|tz83C!N2fw7Z=|24bzuu!&t*G@J$Nl*n zk=xFnV0g{iq$TH3d+Y>5c0(g~xSQJ!`$TPZhq-kD?9w$#rpimUA8RpLz+gC;ao2X~ zZ4-ni={-n1*YV)6RL=yH=2=V=rK?|5|B+DK%FbML2h_SzFznblgI7J`A709lm<$(xlb4cH_;27m{pX=iMmjqjU$R`2_{abD^Wr6vYA#YvCU+7l zXL8PapU}wl?Xi8vVW|}Lpk#3ood;%b>ob@+rx{8r{QK2zBHVY&qh+bSM>^*uIf18~ zI%}0L$s9TRe_hZ?DbBQV%$vDwvj4oc&X^*Y^ZdU3f}0{o98`b&GGZ&>N@-Y<%XY$p znR$sI|Gmka_dcIL!f^W>v$6EFdk!z9#g08_(_&t7kxSeBz*B8wVP@r1T*4VMnY)zL zA}kgx^FGlfcx97V$i6?#&rCfm*)0|LHnp-@{P^+FwBV+WHS>!-5&?&0ri2~z4w95O zsIB0@ymNlseug;jqo)~O`)u6cFzs9OCHog~nHL_Y@A%VH_8=iuG-n(4wV7R_x&pLhURNICc zhSlja0`7e4XDkhsej-x%gw4FD=FlfCjWvqz8n4)|$dsNIqVVw>zuDpQ9Gb}v`_f!0 zWTRd=U9!HhmWPLD!zYnB%Ow;u`DKnT=(EnqX3y|uvnXhsBvT{iwQTvFP{^YhelS-)U@l`P58IPwLCFP~3`GG?>!%d_=?|HA_>zK$ zZPHY6jrR(-I8J=E+QH7j%i`vCMYN^B`oH2U?k8sKD)J5{hd-%IVV5gmpTCsJYd+5e zGxZa>^$o%y4;l;AJm&JvI@|ud{eM6y&xRVtwZ|Jivh9xRW0W$Rup=$4foFsAxeJX) zl~rUEp2swva!<>M?bx%6@7lA*m8mVF2@5RJ8;)5k>*yX};}U#p*YTFua7vy4NVY{8cpp%#I z_1ype9R;#|&5R2F`MxwTbha}b>gFrB=d9-;=qVeN*~k_1K|{vi^WSzp(N78S@bAC;#*{9`EPa)h1nygHx!;yBabKN(;Ax6N|ABWJY?hLCzfQBvWc=A(a$URV zIFs39M!w)JUd&;V2d6D){&D8a1U97>-aEgKHd%OZ3x!Q6=5olHaC5>ruAsxsjFYlv zNG$Aa`@bQw^*_%BJ{9IOvKtoWWZY^p_mcSMyp6fxad+cGduF9vr!xsHrw?3GsAA?! zVL$VJ!xHZ75<|t_eM;g{51xKLGr^B#k1<=65Jy%;!=+FA|4$IrRQTJ&^WkaL2iqnO z*zv3XR)9;NdW9@gk+4bcVX4a#cC?!Qnvi~d0k4RMwm_N; z^C9^YFWVX!Z`N(E4C=(t?Ma zQalV#*RRiyGyKE&i?PO={fe!^<~nBnvn;KK!Z`&DE9AHM%oWtsZ?c*=VH5kLDKjQq zx*9*lk6qcu*5MPIGV>Z`)=QjR;U6v~sGWGgDP7SfA!K&qshG`v=fm?@ckN=BC?=uM z$r~m2&;6AB1gl<7Dc%VO#Ug&T2iYGgX4Q~&sAcCBXIt_~V%qVU5`sUw8FljxYI5F_ zOk~JTZ}}*>ppbvoLgrliX0vCB>gNwni&g&3IAz~~R0EU!&Ubj%_Dd{Czv6J0c~bM7 zr-xa#icebakjN_apozEY@MX;__Y>ruH?cqYCYzS_VU=dUoCBAPbo>$$xr&u{*to8; z7I>vm7Q5C;gFE}|Aow=9i1#5^BCG0 zm6iX@VVDqiqv2M4Ml7?XkN7nEh1%->oU$2mLWk>*G)Q!uWr^O&ncHvVl%cl5;)wo)wN(oLn?5mTY!%75#8(wt!mBJHPowet+jLay8c0PTBDJzx@rz)(L;OGsXYAcg1^H zu^iQ3!F&2li$y-mv~>wTc_#5IHft_0NN}^7&0@LV`4D?h$e~B_L1IP*3a`pN{ul|c z^jL%jWE(J~Fz$?IWBZ-JP_(agitpj{*$hR87JP4DIJuoc!CEYAVPhs6TZZ$DM#hUf zTFf#e1bWLpco<(1s9;NWlG(vDsp)*q!E_yk-|hd59i(4x2nNLTJPjAUW z-VipnhzbX-xFZ5wOBlKHY>b@VFr5F>%s-bYOy>X_|A{&G58Sj0U}W4UK3mYt`|tsV z*E&Xj+CvsCh)f7*W!93Yulaf61A9b+lb=?b$btpgv+9`mr!ewz85kb4dd~CU67Qv# z?jbn~w7ASXn7FkkSkJupZK;vLfj`_c-=;Zr@kb;x%ZNSTV@i@#(D38Q2RTH^zZI(MD_aBQ3{IIl0E_s)Nb#EciA%9=1wX&E zH}YCcV2Co~D`M6--xwC&m_Acd;r3|(_8*LgnP> zrt~e~oXe;w+IX2=ILKK_jot5d&xLd1!YQtzMKig&qdjJ|Up4(NFxMcXvN2{`(`hBO z6Az3m_B(D?(}{0n_y6Z?ZNSs>;g{STc1eLsmPy|htmISqIiGRmn${hXL2L$xHk%&N zR@nKU$HUgjKstuq(D9XJz+cX6`2*+IB{W?9-{HvS64__f!NkYUb|XRJNt;MO`&0Q1 z#)mj$G=4JMtPyx3=CQZk;y6Hyz*yT@`v9meZkVp8%kJi2Q|Mjcgxt(%p_#i!RN)k;j^7U^VSKXbsK(7erV6^ zb(6W<*rk$-)BC~$QI|f!c{+(tzt=xuRACGGtdJ@B$a{lP#tdU6S3{lLLw|TYyL%oS zw)~$wgFT4VcS1q6Dm>)_CLaR909x>9cMd`8n8&aCKvfB(wXcqsmuqosCYn&yXTz6&Jx|91}i)b!(l^A<@3?JWB} zwI>;*Tz;_5nUlnxf3$JU8K$lA4(y){9T->eu*lYM#T7F21-r;{&0f%O<@JkeYSx#P`a8U4zk!YA+!zW=4p2W%N6Dk^))K2*Mz&U(oWJ08Toi*Q)yojHN9T*HA zO%j`M8Y%y5UIO5prJHb}L{s3P+v#Et+FLQx9{|fdLwhB>(6NLwuy4Xvmn;IB6c+XDo zesbf6LNnuo>`e_-2j-e3B#VdqXgbfr@JsqygTGCJ{KlsBrHswZ z<7rEbrnA)Y4Q$Lym_PDowoK>DOqs>GuZhKQL(82DsV`-!Q94pEOa>NSk5x4uQNT z6_XA7>L+|=cKFu(XvSRGEpukd-mzpp%3X0pN`%d);}2U9x1GeN|Mfo-WS%T3&X8!5 zVgD@M!B*<^&-lREmY>pbD;=*oJra26-(lrpvoE2LkKaFF*FXM??5Ecom?qda zSlRwpNaX9RXDeXsH(=j7k>k_h`ijFsmlia%vi=b8ck`%Zn>n#@%`S%-+|n7$H`y&6 zUfNH({orMfo$`-l~caLzq zymMgN4u?BTh0p6VtQ^lgQA!hknD|S6(msc;2lO8Z1&BR(xcL9V=mQ6qGAOJ3ZN6lv z@owgX%R0nN*y)Gzs>M>ZOAjxR++mNl^j z9W;*dnIP)3z=UJ9yF($B7X3(<2( zUvbdbe?pY_J}CyH7o67)GIT3P}l!&R()L-xO5u9%yf+mv$_I&+)v zFub-obht}U@LIY-AMMzhOseLcCy>ZpY6&(9rPEdNr1xtZ~yD!{r?w@!BMC%PdJ^I@@9FVD)apH;E;|yt7*z zy|OR-VK0*1(bE*7a-mA@mR@qhnn^9K#x(&mI46B`tdul5$#6%Ft>pau{}cXxT2S-p z^Y8Ev3F13=xlG%8dz%?!%$q(j6ofSi#%%w`y8Y&Vr|&nLtu8(&p49NHkl{6l-h(ok zfSEkA7@AikCNXR+PI$_>f|qX}E9b69qHnI%Z#c;Pgp=1rs(sB1rz5IM>QY*^?NvDW z?tlG>N|p^S9J3V~*`#mC{|~&yy5So4A-Mt#Bc(H~N3_$Vk`8c66rOJQKfB5jB;V*yGuC9F|Tu;(YbQmx*zj-jz-oDV8Va4l4k=S^NGD1+!QNBd6kvDEIZclg+w|{Ycn=FAZ>V|PpzVX zc^5CY*rEr5WeX}dv{|X-Gw>_2J{4V{9Jyfm+vY3HcMh=3k!3Rdm+(|LhLNxqBXz+s~ffSt$I;l)&|1o8ng`Kd}U%(jn;U~v|sX7a8>Q0EZSn&M3f#KnG z|C@J+hKT)T=0Ef=jp3~-d%QWT$#?D-+aw?Sy+7ft<%HZUp8tux&K_02|GqZgBg~gM z$=K+?m4-JdO?)#BT0iBvP{dp@L4$eCyC3|Trzc*%P=CYBD&Q}JSF%rs>W2v>ES|qN z{9wJ!x;9uc;FF#5o}QLD`}$9)_jr73KCQ9BuE6KujUIt`Lx)|gJU$*@&CcvykvYGS z@u6DA3_}AWh1vWkZywlkmgg?lclk}9IvC}`1k4YAvRo3(82N~2^?Ze|{24dx9<7m! zxW&3u(_=5cq(JkRB1wq}pOq|PjsLVSKmPy1uaDQy$MZZm%pfVyT>an=Kc`4ry~ak z*UTsR_cQ~yddg;nxitwV8czv+ND*|=Hx@4XaqyLLN4JBPLuQ-c96yJrLN`(h;+kVm za$BA}o}5OJ8GaTB_=C zo2x=X=ffYS4f7==0$=&EW!Q3^mws@NBjX;+&C@KFGo)g&n`Kz$er<2%uefP%(4%mB zqlARR_3F=`J~e(etJuK3GOlH*^o6p7h-e9swD^YfgvLYcSHfDau3m63?1^Ocg~V-V zKD^Fxe8@7hCn?3{2m7@?7r)~hcC;^#%-G4?T^u3FrroXZu}LDt-7h=g{eSl)|0nQt%~^3kR>6(!Mg%kS37Zp%p$nL% z3fjCn!Eko%20mGp;^wJFf11m~6eYQ0J{maOVJueOQIy=$v*%xXo7$5o;TsDWO4_;w zFF7VAG>Gg_`1{}-_k}t)wJYaTS2#3?DotqNzxkT?y@;{XIktv~@ADb2Ww4oEQxvs% zQYG(kTyoQM&J=m>FaK%-79Qh@Rb#ahloRobZ@4be_^$pR=bX8W`b*h+|1dlAg;dtm z{G8F)+by0WYh2~=2o+1w6aHUYtz`QkSTfTXZzCh4xOS_ zE>Xtd4K~d2R>u!8+<$%k0K-d`X6p|JDv}+t)-)QiR;=dSA=oUjrJ;pCr%lxG0PAek zB!^XN9Qhhb-zEHG5BFGL(9kB#UD0py;(*DGxSjubHng#M@UPi;>_9`tnntZKkK;{} z_Y~S&1tVl;*hV_e-SGdvWWrQdX67OdrOyj`h1pIBIY+3ASnf;6QCqTwgUdL=ropHA zsG>@w(!JRKhzN*^dZWn5C&;lceN zgd=}N)2Y?}c{+?3XO&3^Xd5f=vbsn(U*cu%l8ZRbHmz;qX^9+ONj5f@boN)g8<+)C zRhgNWT>jY3m}0g_@Ta&AUtYsM_b1UE_XYEsc)XlWdq(VP=2K`qZ8c%#1q+6qqE{Ny z8}m666B_P*=l}HDKI5?bHII}er+wOTQQ-|S|K*e9Pv|PxZtxS!N#o8D+Ypn`X!b`S zv%QmX+Wdq42u5qq1ydOmHaq@fidE*0V&jW^ zcADq?l7>r;mSP`lkH8#AX#+wuo7cGHW=szVC0eE?+ZY@5T#z zPBN@jcbHr6@#@d{2D$S85(>;Y0?mS{`a0_pHcx!8A*tyGyY}P@myMS2IBTs}T-nNa z&G1M26tM%Y+R7&H0)9%Pvfew#__pEjBfdAP5kH!OZIk|+?Fl}|q1XDr{7J%-XtxO2!whHrC)gZh zdAp;5<-g#p}~Q>3|z@+KNQ56FD;N-lhgcTvY=e~gilOa zEX+kePcg9nf0)QrXupK-N4rTkFQ=VbOW*$sC1+1Gm>953Y`e+3uKoaXjY8oP#_9k6 zUwpOTzecmS!qp9*?G&D>3D>al7X4_tYIxuexAcqFE8hhyJNEMQbTsnM_^(i^rz3A< z;1Cw}FO^~IWC!NP2b;KRj5&pwQ=*lFWVv}+Z@35>UlQ{O*vlffrD@yxgKrP+uYd56 z?^4%}eWFPMEAra5Dn6Xb&YV*qd(o5qH>cEk4znx$JUk!HSumfeU2xF!1y_W}ZOKV- z4vD|ntvXmVXDcMKWi9^K?#EWZu)c$}RdmH%Zm;7Ls(;Kp@YKE{lu@{ZfluPk{Cj&+ z9z1xK=%BaQftf|#ejoex(1XucF&yp?u6UuD!t_|aq(J=Ey_AL}ffJ$?*mE}>*mK}O zhsg|<)t?i;vg+_0Q2ZdjO^9omXi&NHt-}i}SVWC@KCG2C2z~LglabfqRR!A*1|{ae z2EpZ8QM_yohabp4n#QQ6rgkS!LaCYYK?U2ilN+uw{`h;OBW#%gkEO$_28NUA3p<{cEYT=5B0xzX?>6jX6uMg=zRab{>WK2g}o1$ z*s8d+&b-yR@b~tHW0ogs!d`eTeGtHKi&;ydo{>8-z+L>#LH2VwjoVlotUl%(D0ukb zVY_<5jnc3M8V?^lVA#!HqsDMS?m`2b^^cOu6EBZ$D7$3;kNUwB}GibcUyR}`gmW}OJV>^qjN`9lCmV2Bg!zcY6 zhClwxd;Mb;Z@D1Ne!zHs&xB@;#JdF*%3^akCtB5C*uZFhqTwZD$t)}3V{7=96fwt( za=v0PG;)yo`d?w~r~d)Q4$Q>{_J#%yk9bpLg@s@Fi0E8&vic{mSt22kKWk6J;YP-X z_G}W;LTVZ>yBitr9duYD2d)YYLB@VDK~UIgu*9NRjpZNy7xD341%*WIo+1 z@A$1y$y)Z~Y5j)Z2Qzy({Zr3(#BnZO#d@6EWG(2RftifCOB^0^rs->(NlfH@+2SZ| zbKwW0B(t`=qaJ9U*F+}fSyNs;gK5bB!&1NhALxx!yU}x?{>9ftJr87#e2|xNnec__ z%@l^yE+0;bOqk!0<#5_+=E7d%2~sycrQS$jSaXr5(0Ic`4!ze3%}Xv^6JgF#J$Zls z2IoZ%+ni2uxMf7KnMyc*TJY)f`}hk7v_CXBe7Ls!euB8uw+QCPvQxG-RI->n=86(L zz+{`wd}RTPzHoXfySbaAc8o(NXUSGg<`M(;khtb6_5VJ#GH%gj59w=OH`AGCn!_WO zJC#h+*(dCM^dR_eWAtW+y0(_f^+)a{sQvh3&#W9(mD2J&_{0JWi?ha#Z9M;+n;7mi zvbXZDc*D3>uX(DcfVnbTltQY?mbjJ_lZ;C4l?N5)7J2Lfoj~Yvi+%RVj(NuuehOUD zXkXEmndI_`Tj{>iB~^>3i9f{GOcD%|H&9qwej~2D!)A$0<5Ol2skTxP$p^BG6JAR! z{Az0iG|IU9ozOkzC{%wC2?e?QVIH^_CMAL!o=ggUs3e77PG&F6oJ}}vP zL6P8ts2XZQYHP89Se|rCd4J^DYe;E0l z9N9G_6>i7OSjfC#g30IUjgnQ|+)v&JyI8Tcawa|CH{8LP$K8BOCtwv7? zgUm%e7rHpZmL9Zf+R!ALqJF~G=R*_YBh`Y(BKIPh-&X%(F5@;XnJJtSZ+Arhe;vd7 zn$+eyioC0`B_7tXhYFnGd2o8%R(4c~S)`5$OA zD^iqXt(c|V!JnJZD7Ey#p;?SZ#f)-a8qRGnY&z@uPC-G-)2-q#$F@207bSo3=gw`C zIPaXEl|afa&>%V%W79W-gp- zF+q00TKNT{{0kx@1KinT9E==h7hE_esbZ)2uPKD-|HZUM2}y~GpR6_R{&BXvJExKH z8b|X}evhhVvni5_bDblqQXRVNXV`rZbtouT{=}+m@=z&!*@klpN_~o%jAD}}d~g){ zeV)O$+=pYf<5N-LGx0nhia0{ySAo|!x0%Sn#D@`yVPR=agB1kXLF zo!oF~LSyKISIQ6Sg3MmLQk&rYuQB}Cfpec4esI?Gu`;J@`(Xd#ms6U@a^^SX8z%j~ zz{jM#qmldFmOt(H4xeSZb(pI}(O7xQWu{p_+wV3oBsN=FEKps(zFhje5@{)H<@=hGKDS~spNh%nhe{gu0 zghI3A8XX;v&CVTrSoo6JJlt7CwoNEul%C_vv*hq2xtd%>gL?;_XB#+49j*WOhbd1p zIkjQuOZ^gg`yV|_8S3mR-{n&e2s{cch&jY|MpEHjQ>&>;|NquAa)-|_F3&E=YCUFc zbKUu;&x0Noui6bI-E;CEX3m({*eIC#fcshc388$qjGZi}o-g>|Zug!g?40wNRi=!OX1ZY$^EAE#i3b?`Wq3ZMzWATG z`pAOz2&c!qVegzisVKbjc$vb4dB~1TaWXXn*M% zo7l3#Tkx%8NAf5n1EfqU7<{c4FtS|O>Ak>+ z&&c5fhg}T+HN%#z><6E6{|Hli!no@Hg&l22&c?q;V9K#pKM}jYQ{hD8+ymdljg3vt zD1PP6Sgl!cTFRvUU|3s|w`;&`t}Sby>3?adar1~g$|Ad=RaT69rKRKp;nE3a0&9BN zcfa~#&zuvjlriC<`ilv^3AY|SdX~np){o`vljbmwgJDIEuS`2mE-2yTsuz3lL}bMu z)}!(n38IFP9DC0;GfuK}Ok|a+U|8y1@O-{t(D#NViXYiE^%Gw*+QuF{W$&@aDTq6z zp^ec-fjckR>GI+4{OcRFvnwSE7~R~i7|BfEwa`R@fiF!djGbrcL56@zc4>ixLxwvT zz3qE6a?RQlxi7G@bjUF@grDQ-IA*Y9bJL84O{rQDZOp6&Yd9GuH=CLz8Y`dRm5x}U zl{vDRq zTd;w#^wh!BWA!g|SS;QwsD3_k!QvGQW@@u}9A*o-(DbgK^{1qe-GnyIGj=D6!cY7? zyWn!y!sbU0B-JO#7z=YV=R9RtqtI;fXM&Zsg1M74>jpPgoxA0)+)~KSAd{ACQtWFrDD_$o{bTgDi2e7Ys}u zwktkzTX!>+xbj)pH2(X`y>`#UaMp(AM#fF{@+KdcUvo6w;o4a)u}OsArkiuu?&+MH z9yLuA6s-ThaH@QUr}2^82^Xsbr04WGB=*I0G)X1>Pn;XoV)@|DIR-9k4@;&?-8C1~ za?F^60+qFbW<*O!BrZSh9IRooF7UCC(G9jv?h|W7EbI*ooRXO4h%MmV{C|Vn6Z?vL zsV!Tk9sI~WJJNXuzvucBrVJ`J|CFVU|5sF%SBX7%hw~z%R(!%wcGJ6#Z~p%lH(J1H zEG!cD|KcBxlgtY?G|v3VpP9gU%OTArujPMxxq;-wKYdmQxHzQ)7#gLl7pSi3*-+Hk zDjV~zF^s(-O_Xk>rl>c`hEQc>n8_|zaO|+ z?{V`m%guWJGwU}LaoZR$YAHLO4xTwvp_$>rXWj{?Yu(YpAU|l18tmDcKwx`k_ zUd=HJIo<^rIkE{V-2NdcnIIb#u&Mcu*MS2JuQwb#CGR5T{NAOh-BQA#`2T`XZXb{4 zG6mZc;rp5n35dBrI47rkBro8H;h**=o=@J&c6{M}YxAd__m87h{s~$8h#Lo9{rR7; zwMW2NGND=YzeK|AXaAfp3!LD4vZp&o-R4}NRQiNJJYInhzOdMNv)4*m`>1cZljtzT z^u$w+7iJyt2aF{YZa-9b%NXF!TC@AGy~lITCI940JdM}zB(|8dH8x*fka|I9fpp|Q zXSNgnoY_u0%1Q@Ba?iTkvgS^6&f$h5&+V6#F=aITHfK&z75|`R`k?U$&xOY0|Nkdm z&vQDhl~H@_0Echj|NqLm-0fFYCtUTK&?xXii{H&-Ww+e94PP4WX)>*5mS*?Po=_wa z_)g)JNkqh-_UVf!Y;f1xe_-?B2fL)gt~uTLCI709jm@Rz;3N5E^3(n$J~F75n80vI z=1J8vd*(Cy7dRSt9G9IwTK7-+qwFtGq+zFaK&D$qBa@ z{wsbpUsBAQt8DD_mpdo;->;v&jl30iHFVB63I{*<#VK-Jq10!>RlENOnprvun6`#K z%yndAWBZ|H#&)7bu%eV-Sh(h^(vk-aA7%z_b9UU$=*X^@5Z!X%Rbt_B1~U;Ey$uHy z3n~w?Sbk@pCg(UgWI@^Y{0HCE+%6o@3Xoor%fTh~Bhuynf1?9zp><5*t{a`+UtvG{ zqxrOIT37*((bSI z!X4Sl-KX>8h;&Y=w1w(__w~jTFI}uZ;=smivhSuvWkTeHM#gCY5*wH!{y99E{69jp zX%55Tj!jb<84`|Y`k$W4sNmgcX`QfvpY6aS;jn8xTMjZz`2UfQVS#!a%Y4SApPT1# zC2~q!(`;ceS#yxhbIXa%B?^@{gfwSF`uMD1=HAdJy(XAzO16&OjyuH*os2Y`|Fxg{;3&0LVYj3AJ;%AS7d|NmEM(H!kA3v=*D9m+g?-2IDV#SNQkl+YH8=~#R5+%cRcsa1 zn0H|A|NRsCw0AT!D{r>`+ z`H{GY<06mjB4!vnNel1@upgd&VdDmebqp+}1qs!@iR}u8#>UF$q!?cP|IdHv2Fq?{ ziRl||8qKhuXuWvDDIQxMg{hh;VH|t@NSd7Hc;j-A?XbhE#Arc>)9Hci@)ClnN9#SR znwM~9NHTqtnbA_}q4>}3Ou~QnRmO>l{T$M65g!~r8%(O@nZRbWCYb5FHvNeopHA!n>q4IY3+KudENSFz-li{+Ae-e;q7-JRaLN4FStW!0 zhE9jsjaGAW%Xe6AFyYlcEb*XMIABlX^gG6eic_z17$-htC_Z2R;(>ZasqlrZ3mn}x z$Ox;vOH4cX$*SWY|7RKI6iY1~`{qkRizaf)E?`|I9Z>n}@$>S6$1-<5rZ?XE{72rB zpKmr0^iNPd)00r|B=vDZk+j&24U#4T@{`;fKJvs}JaB};+iSy) zhO>E%Y#fQH>N_@a#Y7(CiCfEH$tzv|l)N=IDw3z{Q*pd%US+fy9!Uzua#t{xiQ%Z#!e*l;^;>lUMBfhKi;w z;t~O$6mp(QpE#~iy1<5A&)QK|%k4$OvHBB{mJ|NoJM-ayBVVycB#U%UQj5ML`_g=m zsf^>ns8ZDcu7H0!)6G*jE;di>Eq0G#raEH6gKEjgMNP3!n!qfZp74sUV7|0Vr?m4D6 z95vKAqwqE%pnjU9&5u(j7_|2<^lRpsVW4zK+Q#D~gX9^O?fn0h*?vq|U&?kjh9S#* zgMnjM)WOsGY96;*=ESl}@}woCwD6r#2b( zurxE`j>783sdG1cIq4vhaAalIwPwZ#2`U?`5BR!O{sHJ(NwVCQo zke+@bugUa*1Fu#DJ4?ugrggPVqB|6}H%!ZG3YRu;_}1pgCF{ZZnSYPCR8XXmffH9{ zK{ICzo0A)}qp0MI3Bq-DjBIQlR;VZ~kyu!DK$J5>UsU)=ef`4f*$G!`&IYDC2?I^ekXwE|@7&@KQ@ycu6pacFqA-?j0ALdPG-c<>l8&%UgaH|`6scz zznGNLa{k;wzdNk0tSc5WJwAMhL1xwmt7rB%WICc7+jlrjFEKV)6niOID|#kMX9!$Z=F04-oZ!WF zO`>6`OGfJ-`H6P_ns5G>RQPzD#cmDTr58>bPI@K>3QsevZIE>6wSSTM^gZ6XFgoj?fJmG_8*hA$pmf1|BbhcCp_I;AGpcB zh?RR%L#v>N%$(_tFU4M|T`;oqxbr9d2cykf850LKzxa*>#@W1*p?~?g1K2v^1$o_% z7==s_a;s?Pk27>SEOg1ES%Nw9h$G)F=GRFrFIaa9-{lvm%us**zy8M>fipD|s*X5_ zG4Ii0-zmJaCaEEUaoNAae>n0dI9w83vxk|VYf(<4L%!01v|WjFZ95t#{5>OJ_+(GZ z3A+i6<}KO_e=Y25p2FR6%vxiP!(8DBRW4%9w^*}u6!~q89IRv)q)zj>;Aoi^w#3-6 zfvv&n*o1=L=NUG0Uy5K{s_EwOSk&Y;-)C#)CwrI+n%~~HXS-39ec_US+KWpePmUR! zkp8gXFaOQU{I{$=%g-`bD07sm6tH)c?)@*h@b|OCxlt!p{#X#eKHd9*aZ>olKJy@p-Fb#NK@x(pX&1I>SHv~!{QBQML#SZ|^V0Ym zrjZ+r1rPM@`+wpoukepk))QtcWWJVXUK7*8tJnNU_R`H(9-)ROil?(0qaXZpIMr4E z;K$$N4AHDiMJMzhyi)Oq_|yKJ-%ag`o8X!~$t}NlC+RD`W1q=7vAsqAgipkdhCK|Y z+b5JT1Tw!&IsD4!1;d5=52Cf`*l-7 zLQ>+PajQbHLbSF*Do4d5rkMN8`3D%5sTZVk$EY!%Kgrm3F+O8A$CI!h2Q-=2^d4l` zE?*?a`X;2Z!#-jG^VbC%7JNQ+enZ>~AbcDuqMj`zRlBE^9TAqazxV64?Ubk5C0mDQ- zfvN+kHo_|Y&D$j5(my1&iygkC(ZQed#rVLf zkbszmPuJpKJmIidGh^Y`FZM3KSf++%`J8qL~ zI=y9o{e!o55x0exwF}OhCVAkgYQ&t0jCK)Rh0G}rnB0s47!;lgExDJJbm&E&VZ$Hx z!#~zCwo39m4&!{6Zs@$t$M^zA!zsO#o;+Tixd+2$KP+Nfllwv5(%I+&zk%cF%7D0* zHCjh<&3CLxX_>l}$C=IG^(!fp36Fl%UpU5IqbZc3##r^q@Wk~6Cz?zY94%kkGq1VG zHmP~elk+_BNi4594r|o}v^9wz?&;`azT@FOie*_oDsXq_8 zzFf~|yP?A0jXDRJXR>mJvlU2wmbQ3(l);YYgZ-ZU+=0xREs_g+Sppn6U&SEH0Av;FMfND))-joYvxuDeBxCHgj~bdnj{W6lhM>2>8ox_lEn*g~qa9 zf_bfHz8&OJE=ca^lstKML2yjH@quZ#oer@@Wf~hhKW4kg*~q5AT;sra#e;dh+7E8s zkeL!QW(Y{K%djgPUEswKC3RRz-p3=eiPP!@Q|6w9?;;ORo0pi$R^xiNeu<=W#qrq_ z8yQzF`1zfGqmS?t_6h&w?>n6SVXg!!Jm7q$afxQe;_v_K*-jKWsd+5@ zC%01xYV+gwubXZdRvlUwwx z|MF)BG_fC)aA3|n@aOcIGYqdin*EQn>&3Ul*0N^4_}7}!{C@%?^Mu$5wR0yNGq8Bu zz`i7P84B&?8y%+KFmhnr zqm$B5HcwLFBUAiSHb3nP2U*;%u&JK0U$AQ;rzhW1ourl}+8wh6UP{DFH*k2|F1R(1 z?Pq1Lnw}s0y1|JLk2A1uXiNyGYx*fX z(Oq&uUTTZMf|p!D(+->xFOWUiVo@t!wm|NP?1?&;7G;Zkr^9?k#^(ZRB*S z{KlmZ|Njf73hDG8IOQ)Pf6G59A;m>DfN{N$%W7@KOx9^`0#CWBX7+yIS9*VF5uez; z2UECpof8wk{;5{vGQQ8>Xz@P{M0Aolz*dr>CRlBuA-k(LbkkzYkyMZSs=PXAvm%5$pgo=|2H_^|9@fc%l`+=oWC7+zNK^KLZ697 z+`(MCjK|%QHTN#Z8}Ls{ODts6Q*wOBV8UDS$WCRs@^w)jo(W}aN9=C!Sgxo^VxBks z5QDEv56^{Z%*sprSlUgMQyjjXUoX$o^MF&=rH*N3+mqagto9q6c6VlRURw8ueb=-J zGg;%<9S+T4oHsooS39lZ_h)Ph5@IAgSk($oMknPvg8d{DJ%{O&qEm>RNm5Icrt8DDuy)Y?;&7 zoAE$_%fW+v8l#;TXV7QyT_W;ZmT<>#E)40q;5A`lBjdIj(He&b|Lb`S%p01%=zsX2 z9>93K#cUNv){-VJ_Y0ry{lCy=n$yZ)vH4$n$gUIr+Db1Z{$rB0Vb*$)XncObkEWgp zhKIQ0CPW2PHQwmI^0IN4wAnBA>;(o6cbP1kAKH68?Y^hc62dScu-@faNn>~-tiS5P??1vMw6r;IjJYeQ} zV8iJvzF`Z`$E=t1x97)8I-HJ7{CJ2XSGMtOV#|`) zh?xvw%}@AJ3L`q2E(vh_Z;e~esxADW@EAk(m1f`MAN;v*4oIc)Tqtn&Q(y4GLFe%w z{@g!`R=xip_Uc41i);o4SN#Vl#iwgT{0JJ$UO<><`~~P}Iv9q|oG%^0&vMH+({sT1Gn4 zob?BE`ImfP*vTtVzQE5SgHubopi^7tpFp+?T!wwI zEVDix)tdkJt}|TE!Tpg zKflW#ByM=%$b5n^^u)^-`j<@OK5XIUbAAvhwZNFOfj9ZYrt}jGmKsMJ!bBR_&q@en z3QwA@xK(CN&R>4t@(qo79#RP{*EKg7u%6d4YAQDON|u`TO`%jym^sVNVwNq_QzkGzG- zDsl*W(Ru}^xY z@Rs*OmO;SY0}PtV|Nc5(QGXzs@c;ke$5LYE9Yr0SE3I0mI0~3f_>k(rr11Sfc$>pv z`91GvaT-Y+>gM`aj`y z!n;P^w1a0DRHHAbT#bKlfGs0ic*$Fi^FJ?q);?f(nBnyE2aLLG5ms%bb&hZS3eKf9 ztUbqa^z8NZ@dwib8`=C4(`6Nxs}@xEcM4Wzb1O5aED*lZ_Mdwv*DS%nV~t)KCl+Wa zGcUNo8Uack~OR zlmbS+t1Q|({vXZ~Vq;sv^}?RHD6u~-ahc7evmAOH{~O=ENNw!-bXbe|#u*u%qJz~}4^(nT zZFG2D;L+SA_|E;t837#~$%$P2F3ij#5j_v8lO1I>3m)>nRXKR2`Fl;%_lZtYYZe^j z+i>=O;CGwDT3i$M?SBx>T-Q8Zp=tfSq^2MIB~L{&7BFsk!dK&D&RnG4Hj(j~Okz^g z8+*2+<`t2K!pb%4f9|iJ&}NnMQhQA?Kd1f#&IwJ=?YBH?`XTzv|HP)Wf}{Wc%a<@P zS~Rm}MHm?wE#R|Lc&^|PVZ308?vh3}wi^`;NAgTo5Z+3x)_+Tb94`GhR%1h;^l4LA6?47nchdpu^h z)RA1s%=G_a`mO(qm&r!d9S(C)Hup*VrqIrMX8(y)5fxMC#~p%~GMbK9FS^(}hfQ+A zCGi_M3i4Bg6)HPh8LuU@?v%P_*}P^|gXyse>>UbPGXvQEC{(gc+m=}7MH6Lr^8hF;ldrK!%%p z&m8ut%NG=hikPjr5Y3zoFu8c#HV?A4qL>nwho0$N;6n_mDSviJYdMOax-a4tYizTJCMb3BSBAi zk6da)^Zt6l>+Vffz6)L#IG#&qmH)$0Xsz?s@sn-J1kO2i5`uFV{eQ5)k>}6B*OTiz z8nXg+95}_$F|)&uf7AR2PmK(moz``xBsa{pX3YHTaBhlYi})J9<|^(Ng#qkBmA@61 z^spQ^skp#vR>3d$^E`vT`Tzg!ky8&GXpl%raMAm+u#o3ce+Iwet>T`Z6Lr7&&q^=I zY0Fsrr+r(vz)QAAb#58yQeod3iWP-FweV-z@^kP0AFy5dl7)?>vBDt{qn}LDJDQF# zFOp%c6l{`wn8`9HZebp4XH)pDgKVoGBr*l^dv5LsW!SKVS^v0%LUgNwEc=O9?rJZ7 zs!U+C@wmx$i9Ks|(;ZH`?d+PehK}Kxjek$F1oB&55DKYl*tYdg^H%2n%C8hBq#wxS zx0rm6L+}1V=KBvyxV4oJDsuK}2Us}%Vf5a-p@vslA)$ruNK-~x*@ZhD?6W{x_n%>dnz%zQ>jxG&?kCfv zHoTv?U~&=?O``8m3tPmz;1~$YVEClD>+k^W%^9DGsfiEA3i+vy>v4 z<@PY{l(pqGzQCa{{r-lMpa1PuW+Xn9D-1J!6ymo2Aj1Uag0*}SvOEb3xDQw{Fx=kG zt-WW%PL?UDGbUOs``|TQuyTv!#E%!wGMtw%HacXiyhrelyxAnqO9wgRMH)hlHh3|s za7UkFTcoIdWwTL(o997RnHo-W<(l`JKTZioG&Akd|EJHa^Z1b4BgL6qRTARDCH$t! zOCB+8ovzrbxF)E@q+@}v7@LPXcjXg_i$B|Cl~{}Imo&AQ1SX^@r6ou_VDD5sKcV5( ztp69f7|docSS^1bU-4}|>z&FpmsJ}ammfAh(6>MR2miZ-M*bg3Z8~e2L^Bq&@maI8 zSEPJXFW4!vLXgE$gYVK0M-ij{k_o*<1;_sW?`M3LU$F2z!%Kw&Tp=^&Cw%c$h=Z)UTO<{h*EwsIxa@Jzs^O5|7|R-V(eRM8 z$^x&q`Wqge=eS#c@<4-u__H!MwwAdYjxpwxeYDq+ky!XH#i68c!ePF!pAEsL${CgK z^M9P&YfviiJK(a2#kv2^v4=SF`V0@G{c?EMq^sL%T9n9Z7SYTu#P7qwoS@?t;mU4Z zEBEz)@QnwI7WD=Wmz0ZCzsoOmWXYV+7`EVm)&B(rEOWmyWSbZ$P8Buy?{tU5bNYj; z7CaN$B-Z${zPsU&zVQE_)?7))kP8zgRZBETVmmnc_PKlZXj_`A_cem}JM~1>3=EusHtk3i+{E{z8<;+l% zF}uvPO8h{tJ==*hQaUn`3+Ae-J#qV3@8Ld8aAi+=+q=2xkDsJ8tZrqIVb=M3=#q4j zLNDVy{{-!M4p9lsJr4r@@Ozqf{P@HFzDM~``$WdFry|084svuh*I&5GxM1lUp9^lf zKhn4!>qz}z^;rJH9Hszwu9`e1MD}c#vCv?+Rm_uT;WYh| za=T%LLHk6`R0p9s?;V&6&s<=$*l{N4EU~x9L#E*pFZU;%FZFCY?mMP6rXQHG zU^UkTtBVshG>YkM_;Q-V^ZkR}9~_N$1XTZDSel}!$s=@bL!Y?{-@>E|k!DZWOmy-O ze!5tn5zDW=`QP8)?UVErgqe6gMC#o*z*lsS=_h02J$tqr2__c2htIZ8Ni+DJXx!M- zwj!e)ya2$G*wXbeDjfnkG#57k_kVj3$D~-n)y+7$JTz< zJ-wpORbP^O;6y{rxrUe%Ecxk9Pb3yjZ07Lp=&OIQwvXpQ z7ITXB3LjQgnTUC8tiw18U6S3pu)Cp!~cWR{uwy(cOqu`g+u~5YQevj!b#@~IgG1atGk$h3H8WmJ zPGm4|mq>Wmkec*i?^&J+O#DLc4s>yvd_Kov87V3<#V4cJGvFad+TLh4m&6@#-g%*sErOMG-4n?|@jiwB z2M%#uV`#t0&c~mT$S;}lqyNf-RuoMTe9iB(Knlu*dqEnjfUNlKAze&WaZ zjC=<^o@?4Msg04}p=6V!M8e{u8+v;7)QF|9c*s2TKcOJ9Vl%_ev@X_6gI2+{o0&3i zG~eaTG&MMINo`G2Qw!sgghmskiQLsEPS~wcYB}@I@PG`@S`mj{sT*q)pXe1m2`uzb z=1sKoFkh3%D}Av&E!JZ(*F6h|Bg`4IIgD%Sb(7SZCJLIqkz7zIG^H-#AM?r||K$yn zf4sNX=|9Bx&pG7Qh7D~~T{moKdLkWB<&t%W;cffdy=^;LFaC5t*VeCQ8#z9fyL7YZOi1$`hGOd_iaj6XedK?{2uD=%<@p@4O6Xvm z_y0g>*tBzUYAkJ{#3`%8Y(vqauNm%oi2%n^SM^7*jxKl|JMME-;s)0Jq+ zf6b3uIg1)}l~Y_rj`;7FOz?JfY%gtEU)x;1P4ZxG$b|ih(MKaB6qv&=^hs#^_~&dj z=|KgW;?;TV`mcCpF!h%B%0bV6Mgs1$CW!|D9h) zv86DGHy;r!`rB>8%++Q7A%RgjX@a24^PUNjmTqoWEZqG14J=(|H7<4Zn91=@#_+(K z_9@*HtXOuvk-W8{J=dPuTx8~qiHA5Ri7T3FDM!s~DKQiHm((&n^@FJVhCU_cFQ-gj ztWt{Dd-hDr2jdg``y0yVI)^bUo%*uhgL(RfFKnyD5B!w8m)LY>&tWg_0vY24>t-?J z3nn(@7$&$yZQ{Fjm}51wz(1EOjtdkTr6o-!{(r@XOxu3iE7c`_HOnz&UE<6BR>t{t+=Z;2_vha;GAJx)a&cIAiouGDC2CF6 zXWk>r7nGSA%=xFJ#_jN~{b@nOZ;rrqPJdWF@x0l?bK?o?7RI9tW%gTQTGvK2y=0%i zoN?AmcD{n54aEiyf6krwAYZjjU_~s$$>K9S8b2E+PGp?OCmVN zC1y%YSRHrbz^Qt+C!2a2Co<|cOcnh9fAP!Y1-cD8)Y%0}&l(TD#hngT8-Nb=qhNO2Ik z_n_s(36A(QwvRT4I3F-gWDIKf>#lX;K=r8yq5>)giHleA@ca)<=UZSbK4EF7&I2c2 zn^)YrK7#LDb=;FvT0%S&q=IHRXmJO)e)(?xBros7%e6fdvKJ~yN|$W*e+dYQR%AxpTNj@vS7n8^@wlwiw-q?P*i_re3;+6DWqb7 z6n6-R)3>CBZpu1=j_cO`;@323>}3l}a6HAq8y}G@_ar^wA-9zd>y|6hmu9g3;b$h~mOX5J$f@9o!68`h=yvHFDHeo}m(@G7; zM-xgoSLaMj->^`5*Z+xcTSDqiyc94p=I2cIP-obc+9+7~S5(==*1?JIlIOwDKL@!= z*j`)^Qa1UOz-n{q0R!_9TLt_7&C3!4)P-DsR}rF8-fA z_ABFAZGp-T$psbdt%4nCP0Ix*XdSUjnjsa@%HnCy!_yIbSdp)FY5at|h-S%&aSJQi zUf9p5i`aAE&v$t_dx7`Lm)KSmvhOrye3tfvX@=k(4W|;bL}SYfQ;sn3=dWO`Kd8>7 zY`!Dm=P!G&c9Dnj5wlvJ6uR7NJ!j)^dV2i_Q3IX=>w~hB|4*oWnegAp>5$kowFQdo z+*~URPT0+uosh^F$Rzc`nJ?WX!s!ol<^;n7j5}nK8%j<%K4hBL$Z~#%!?ysZLlTt} zm?xS!XxBS@gRNX>iTC|)s_C9|OE(O>%|MhyAAzy810ei5R{ z#>RHVG0DR&DWT!2^oAP#Ps%#|jZXwJ83Ug=Uy@kj++0)4>LI^lUSdlN=bE_YpQ0|! z>HLkAd{^ZcoHG|@&M;_T-Ltkqu!ckNg#LoVdmmK(v43Jx7qP2pZ5HEC-ks-?8?G;$ zP{jYl`~r{mq4WO_%CS%1yr6(Fn&Bh=nvJ}ZnrC!I?BeSx_OR?Yq5i;x@!cJxLze|~ z{v0Uc>EWqgxVcl{|Kz|Vu`a(FcW~EnNE*^fWLOsUpk z-R9(khSDhyGCAzLIl0|kl7$8DT`&`8X5O>5<&{`~fy1FGoVf{)?U`+kNd7zgS(Dk~ z&x{4ezZVnda+>&oWzM&oHtbpioC{iE1v|N}u;2Q`@X1=k|6lX6#s4pa&YWOo zwq*^owPcyGB(ul?wWksXo{F5vUC_yWLyKp_qW=@#vOmyakeb2PCL_#a>~u+1xM<6zdrzNhdA z!`eTMl24^S6bM|FGGY8t;3kL86D@W%Et;mpzRBd)USLat=&h?8vHYe5v+8 z&jp|J9J&UI#w#wU_AFqM3R%c-_wTQ}Ae+K^>p!oQVshi%10UoKIhZ~j_J45IXTfa-hr&<%QhEOyu8SBN zJF@XB7;Dx`CKNJq8?&)_IJ2eby>JjeVW$(3%DIvwVXBG>kHo`^>~>4qIBTD=o6R_Q zpkdD!p(UJQ7LHoxZfrO9<$BZ{(lYay%3dsAG)Fo7#0Db?F+T;n6@g6=zD&Dw8Mf&N zz4BY}I#KqA{ei>6k_$gFbti9#o_L8@<)-6jCgvr^tls7VkN+M1%(-Gyfk`J*oT5Ph)@g4K>RJ9{H>?%Bp%%KU@jvsk=>jNwfxcz_FEIi>rVnfIw(9O-I z_9>n+B@0?7GQM*2uxmT}!|=do(?k6K|1Z{SPIX}Fnea`;Mfz}k#&MoS3=_p93>elV zvQ1(*%2*`H5Xf`(|ARE1GrB!ICq6c1X(%&SS$>kArLK^8;>d^h@>$NjuQD?JHB7M< z_-M{80^P#|fNxBEK(6sOkOYhcSh^&Z6p2avvP2nX|*$nv; zYyp)_TE`QbC;wmQYOiAR@9<$Rm4EWH>KrzIUl8i?z^2P)#tDwOcNz8ervK;{k@x7$ zET~IkIlG{7+R^4@mN$VDZZ7!5yX}fZOxB;@?LqO1e;8)ZOmdL2Xe$vokjTIJz5Nq` z$bu@CU$4KvpU*R)p#2`(VGb?te-4i)GVYuE_J6&{y{5NETc@T!n7qresK@8S)r6i4 zyM!n4NiKZI+G#x@+9B0eN7lgLz^TLy#u5q-f6iyz>(}638LjRT)VRcsV0xvy!oubtJ{Vyd&)Nyu2Z zW|~}3`GIe0&2xVLw=bH_CZvDj^!`Nc#DB(r+W7<=4!yizf2E2ca9fja>vh47O%nw7 z&6&?Q>&?SbS>`pq%-q&bc5z-4OKxE5*!zFsT-69mp4Uf=4t!E55nz~R_weC~28|;M zPuY?TIK{*|$`}_3ALK9<7fKUYe&CYoiYIPItW0VR6far5S|F`6-^fUze2=4<;w5Y0 zJ$u++r?x!t_1NT~+4Arw@0E)z>;00Nd<6bD-|IWnAu=!H~<-*h}3ySznb}(ptKKOFZM8UYQrdP2S93+>>a$CAcJ&8Nf#p+SZoVWguyX_ar zY3&Eu`I;X+kk2{5X{qnP&-kBTHYcHB%U8!l{(Fy(wp4vkKH>A>fh_YOod_xB>9PxK z8pZB!h-r;Erx0Yz%*ODOwN0{c#!(07h7+?p{y5Jm?Xj48u{xDu2M;4Jmy@CJ7Fm{P zSqANPj-S~IhvXlsMac3j+_;m~()Xg4=K~oAhjls=Wt-k<6fFDMJ|}U3Z0?F~N9EE9 zZQ_e2v4?v;_`;(3?f-xGcL591$^$w{`P<+!=1vY(ps;bJD}Ql!=|@>Wd$U!P58 z6U(b>s}K0Au=#-T*OCG4HKayZ%i*W4HnBgebTrPCr z-k*LWrQ;m2eysP@k1<3yab;>W{`t#q*W7XCLAzMbgf?Yn=B#H9s|y?zSxU?^J}`=0 z+hBXi=fdh8|BMY3OqV&R=P6t5<0-K8ILhWHuTcAeO;qQ$V)(NaFQuQEMeJ*Mk^u0^iWPS!vV$3KTpoH)_2=ZW|W7Lx)*$Y|^Fi zZ*k<;)BE?Iz5IY9Z(YINBL@yNcnJSr&?>BRUfIe*p#IP+t`3_ea}tvh8g*^ie^2C; zlA2KQhkq;ooag_YPb(MvXf9^Acxz;I=n(g;`Trds@!kn+DU(aglos0eUsA#Q!orsV za~Kp08N$BH7u}E$4s!2eeC6-)oLR_@$Ae+wa>Yu)m}URkkMN%;J(0?(9Q63>fBPp! z@)rw}8-9t(Oz-LOsGQFj$JlVTaoWV5f<(6+s}sr=-8g%IVST#eQ>B~+;jm?gzEv1I zoNeZBFfvG(!f#OQXxFy+|KUe+L41cknVncWVNdUzZGwe7TtZLY$}ZR>H7z|cxpyJjmaG!cJmI@R_5X%VOiQHe)@oYBHT?X=pYlOy+A_(9FF8-1 z@7W;H@TBm@0lgh_S$&)r^qJ_KJ^Y7%Rk}jB7*qIa27WWv>%|w0#T4EuxVg+c&XJjZ z;F9%@y5y!i!TiSJ+n!Eg zFj({OERr)k@QK}m`{)UtnT<`M5f8R-=LIw~bKjC|GD}*}n-h@ui+|S@o@)lps#R)3D_=i?M7O|659e9!^3x4Rwy`xDY8W* ztaH{ASkU^j-XrxZ|2y#`Yj{#3`8VC1u*0EHdreb%OHYaNALh)0|L)lr4V<*&Z@jV3 zNZ_dHP~NlXAAfG)!D%;~rPLlQX#OpmWX5d5qhPW`@feS<`-5eo%EHV>2`Mh`TAVJc zt1NV6H&=Leh)p)(S@Tyz1A_y9nmXb;UUqC^oW~_05pasR!$Lztp;sd!nLCG>dC8@e z0~#ulk_#OVG6b?KB|hZtD_?TXH0J_m(6v8l4Y_+8c8dD^cRpibaPYA7L$L|J6)NQ} zB_^jhn21a`%@lA$>2u&}$rlP7%16#`u;REDk?5AW#QBpkGxMUyZ83g_FLB-Y-qT^w z@Ileo_C)p8iFdj86?IPRWPDhE!pEc{KwyPH*$0gse^L^gc|r^w*6&JYI2&bX;Bbi9 zjGL!h-ec!c243k83@o1}U8tY%bY=bjKPd@miKz`sEhF|AJA5|qu-90tl&{>hvh`{7 zjRpEoJ}7t`XP(qH@#LsX{`J2xW2yC)JJk*B7f!u1A_yH1gFhQ zsN|WqTtafeUDX>8q*AVmCcWk{i8pdu_n7HrI@9@i1`do{deR(9{1ocan{M-ZG5cKD z#CT^WOSl@3MsLK1-3wDCS4k^oO5~_B>+~vEUHG4vc)mfyKH$@(|NlSu@M)JzOg!Z@ zA?ikGHlNdX6$hLUP9*o`}QY(G6@tXrarG{d!ifOQ6zn9Z*t2O z{smt;Esh93x>A3^(Jta$>yP%%hx#S*rotstS$6zMayY`QlP4h|pvqQcmD12EsJuw$ z4?nNGTZY9y_f^Xeypj}1<C3ya3)4K*PI!r* zcpz=O$IszLV~V-5%DMl4op~-Ce$*g%E3x%Tuz~IWz&R{l-TxI@1uPy2eidJo$J);R zB28mSLEDT@kNX>pW(dv+Q+TSTb7!J%O4GV6Oi#0KWN}68OKq6O`J%3|-P9z$+4|Ii z+nXH93^zNxHt~pJn!eScFrZp|&#ozqg6BV!i3{hHid#HB{5o}l{lT*4SLH7lG>UF> z&e`Vh*7ZW9@_)yNeK*wkKPm4BKHt%CJpRCI-^j+(A07X-@G3cf;!g2asBq%3dC7Ku z9?yg?AJ}z1$VXi>bmUiV{V-EPq1opGV`0WE7Jm`O!{5vco*HDhGFiw-%zQ9edBZ1` zuyW;3oH;`5lg=rWN?C{<%wue~wQ+O~V={31tgExO;Y`by#DB&LsiGU|X4o3oK5#R$ zxSaG%{z*ww5<7DqgOPmO#Lr^Pv5Y!<1RlEGsJin{zT+UngzAasL8}iA$Ty#<+Qr7Z zM9t#J8sj4c6^>^+Ja`lg)n1%Y%8~q5pRuk0dta(7u z%~@*ygF`$aCz`$m{Yg)72ubScIA#;UoHJ8?$)*OKnXJ?I@jU4I`rm%aVP}P;{|kK& z{^!}?e8xdic#q7y&Q3T$xwOE zW47!Cibo}x7aeBQ=2qBTCve{JmFI~Joi_#w9ubF(c$JxpAfyp@G75 z#Ro;q(;N=4Io~-3x=AF7{|MifAFNh=Q&~67k-2Bb5Y41K;gcRS^Onh6rMAjT7O|N2 zI6UNxW8>%Iu2?J;s(?8G)}$n?L_^JNu@7@ikCQc{rBi= zZ!uTOnRr;r>~%+mh2r{Cj7JaKPr2Um~$m;!Z99u4MM9)3OAb+Cm>hlM?-u$m;i-_euz5T(bxq`FY zBm*vsTAWKvJa~ZPy!-}}6D=kO8s?-cRthGGtvS0pw;mPExyq4Z zAhy%b;YoPG4TrxRUhWh8I8|&9e=$7p_XGobhe@xA1k<$EQkw;`k^%EloX+?t&1U^9 zZoxHE;^F2!8}6|w>tskOJQZIOUvJ7-zmCKxSX^r$dyTFgAH&CzSdf`4o?8RcSGw$!n6NBKFU^^>a3abm%o(rM4p<+H~TG(%p2+@62EGC$fu}sr%Yl9V^>(etKms> zgeeoZ{Sy=JK6AGx2O3^9{uF(amr>QemZA0O*Lshy!WwN3cjWKyH){B{v-!MZV#^Os zvl$Gx@3BT(GHenvd%;l1uKZ_J#Du*MzNr}aHnIsiK2@tQWiXL-yrgjC;e_8`XCCn6 z6TG)U*F<3d!8?52?iaKoek^!Xf22&hKq|3C)`VU14C_yEvj&FfR3`7)4~%$U6yBH? z!j_T5%zLXbZ*$X@gmwYHDm`3_EDhaFeHC>w+fcupfp>p&T20xH>!j7dZcS zKI^2z*xGZbNl3A1={NaZSGXt5RQTnXbK=vV{XF{}svkt&JjiSQVP83$M=FD!h=d}q zwb+lB?-Rm}52XE6w0V$l$o_;}Wku_87RgSQyKC4t2?hl?X(|19z;s4^0h4Uhg9h!` z8TTa@$i^2e=e!i*suS2^vcQ2?af0>#KmWKbWq3;-$pqM^sPP3UG#wJzrY^JTz33*D zDS}Z7hYv}GaVT?HU$MP?qE#+}|HR!3$2fHg8~3nSX3k`^^Wx3EpnROu$9Bm>hSezx zWverG7&smlnC6%8l1*lw&jd!f4od;v4POp0bc!r-dmYc#_J2loMWQIaiO0&q|R@NMyWtzU7Kz!xP^vcepd38y+-fVqU|eqb6ok@*6 zDUNLaCrE$bxzLgBlIde~==|h{o1geoC5;Z{Jo(VvdfR?UpK;1cB^O&CxfC^>*ko__ z4IdcizT%tQZlX0~!Rq)4>^lDz|Bx5E-{EGjY!iF%m1~5|q9fW@ru_dOXq~~M@ly0! z$KUe}YxuB)gtQ1>&xIl$kv|KhU1l`={(NxxmBZWh9WF6@$e#GS z;17G8A*1g)0sFt{4O?9uQ^l4jo?ysqF;Yys<@n9;Mg8}Xq$2)`_>6*CnO{j+iM*U&k!^WX7M!cXygsB zYFnyYaFfea-tz5%PtrQQn-ta-G2GY?D!m$V0_?&ENjF)hkkYs z4~25IgjBt(nOxq*8)_P|_*7yPo^q?i9=ODO=&wLwO6>zRQxpHc?wK6UpY)WKh4<7o z?hxL4C*47_-*ILK>%KiwitH!*C#+>#&}^<4?J1C^cuJ9t&1GkU)rPJ&c_Q`(N;^9l zh0-?cU|cKLGWBDR#$QH{>73J!Cq8q`P@8c0;8(7kr93+4540f76dWm_i>(m|RF;1WRz@Xu3 z_=&=k3^oc=<}#WvaLRC|GOT^Y5_z5{o|B>2T4lb$MgwDqOP}r8Jmxi~xKFTl$YYwS zx?m4?AA7*Rw(@_H4_O+?FXuc1&apda+ndMeT*`w+(0h@$U*3vio(OVW(6l=am~w=T8|p?277{ z;Kd|j>GMFFS(os?uX_Z(o_ zAefd`z{twYAMub?Gv}YN0+;Ly9}VReHraV67|srRXQSZJ_KG4K{uehUq-C^6QEq<+` zu|-nlszHNp)3onA|0hZ@E#MNn_P}w6@HGin6BmVtoSKIcWi>o1l&u&~w6ZUH$QfzJ zJ2SIksin*D9!4&OX7>v>Qd3&wo!UFxGrk_=@D2ViC@T|iqu~yd-*%pksah8nBsToy zp5!n2V6J1tzQ6pOavyj^gts_1#vD|*q^ZQ0SjWD+|Nn}Ajl2(#%87f`|g8({>!gjc!+_0g)!%iKiuBe zPc%1ec*f4WCzyHW+J>i&9UnK;96!(?w`@brxf2|o$|v5jJmoK#d5q&Cd*+P=WgZd| z2{lI)l$eDamdLtQ{ABsYuDs(zvO}hT<7XBf-vf7;x+FaIF={fLwfNt@TwN{TvBcrk{2Q z&vIyxnYEs+bVXHHZ$G8!#l^!&A3hS+Rv=?|@Np}n*vp;{gXU`v zJU6WB1)g%48yP93T|HQr(y+wYZOWGe4MBE>N~UWjo>snafb~fH2NlM1#S?TRJ2p*Z zyz?$0p`n$3Oc^#6<4R>>+lIXV`gn)zts(X`DJ+ zJZiZ!p8(rYuA~O(p!Ev3?g|7e?BtB9`{zETc0&#G%FPP0IUYONi;S1d{VyN&rQuGi z#EQl#)e}lS^1s|BaKbBKNBx19Ot;w5lTsRT?>pFXNCm|$xIX*C7p77hl^(@8_YX*m z9N50@z%Azg3)#z!9B-8^Fk{pBqiEMOlYgcNbGttCD_=%~-GW~QOdO2`*c}{OdL$(! z3{8}tpZ;Ib^Ot|^@`RT&6CD`Wge0gO65Vl?XWBuAfPYDC_cpotY*3mW$t=#>F{SmL z+?h>syR{!OGjz1{tr4*One-{KRj7&WWxMFP1FkC2W$6Tzjrl9r4IgTtl zr)l2*+i!A8y1M%PQP5OVJMlt!MH++ou?3Pnf>9O?X|EMqZBm}K2wE9&t!!|tl2qso zSYf-rz9zY0P8gTX0hS8WQ|t5NC1*_d=GCk%`oYI^iQxDD_KPMtm`Esyidm>gOmth; z*!PQhZev@h)PukvwI{WEJ5EV#JH>dZp+Pig!Xa_9N!+hh8uxsaw~}D8N}b)=$$CfO z5AT}6 z^uH`H`p}~&d_~`9hHPoXa^|p!iKmZzDEQeQbJKX?6S;y*zs?_MxYOCNgMSn2)6cuZ zdEUg>@N77zyy#N1$omJN-D=FrZim|$FJ`uE|D2#Hc56aX%LhkMwKrd4JQfRH@^sU2 zci$mt7|?h}piNIb%|VAV?Z&)%~#!8BLLqK;7e2QsHW@K0JG5%5{`h{J@cCu==U6dvR_`^P{k=!bzqsm6sz z!t)*|rv3kazTwi(22&2jRFPM!_&VkbY|i-q@Fi2FgRtdKg+~mUza%GEb57{HSHDBT ztMiZi#mKaV%?}NmOIUN$VIdPa}W@CC#UDV+n*ieE$F!Upytzj#<*|JXHs3P zf?1w;dALtteB;)!dOve`wd1*C4(qBLn1ysEv>6Bs7tQSQuCw;!;Lbj6M3~Q1ZyZ+bz7r330P}lHO^aBGs^OFXg>F-OLYDd3-joS*qk7VC#4I$e`6fb7tag6^R3K zY@N-g{oPz7Pcrz4cU(>UFRAeRUgF#+k7mgrJ4dTO9R{gMPNwaQsUO%k`!r1Fy|9U0 zjIXDsqpDMIo~6ROA3r~{f(#3%{*xQ>cX$*`cHOw-I$uQ;LqVBEqjj0hlTxVpUtgpKjEsOQfgViuSQ-y zLxjvD6aE&mmtDqiW| z@P+Zz{{IcR))8^(j~*m7%)QFw{eHvc*^Xt+w{1TBIo1)f-_T&ebJ+>E4{F;E^DV^80qN>}%>2+*Haa@@;?p!E<$q4f)o| z4eQ>x-n)0=zz6x)ES$>B%3ij-M#6==?321#bmSiX6r3XU@b*;+NrAV@1xBt*yca|# zCUQldWzcpPEY)5UlcFH>r#<2z!(vHEiNKOWpENDbeVFl6J}O;dIx7z|n?j~c&@@A# z0@l2rjWRq8mQve{7(^_cD-9UJ+72l(S^6$?=bLz)A*nz3OPk@6B=<8e4czW*5v-iL zG7H%44Gk2us#DsPw3te)B_$O~HL{kax0Jn5oLh3G&3X+pZ~hwx>FE!gGZR*eE=aXD zHvW=V;O3#$Zu;m(!}n*+Ld<^>Y|_$x9AGJ8Z9dU4K}jy|;lK9MRSLZ}5$Yn>ZZQ6y z&bZa7ajR%TE4Q+XA@iCI4CV zeck@QLiO*7(oz%HWL5V3S2n%pSgP|xhK=oqkL;q0=Q=_-o3c|jFivoil-bSGaZ13b zf?3Lg;i&MEB8P7GjMV0s75~#6Ud=IbU~iqFAZrkjKCzMUQXtdE#Af~nd;cZuy)g6A z{}r;)0j=CoTs+Z^4679+ABxIt`F#F^{7Pn)kHSloT9+C}C`$&eYgIMq<6Mlj9D zKtalUf|vNTLy4`HMRp8Jm0Vg`rBj+rj1G$GRJgKz3T>S5p(S+7hR;kBv^h@96qrzZ zRbjis?UM!N2c_0=lp7fQX?)wv+^Q(Nb>|;Lvz(7grmB4h+ zIp9AXY9eNyI&_TdTzG=||7MdNf~nTbTRd4bgA*#Ho>>>{a1_?_;O{ueCKJ-|gF8!G zSx0Y1fYf#aV}+L-*D_s8QWEq2vHM4yCwzB2)G_fP|A$!- zVhOU0hSEaf8w}c}Y9|y+N-o$ueL}9%giq}=8RM=wPgYU-YkcUnb%Z3l5&N^U8L|(~ z*=+D>*OhHMs=4Q4_ZBUFvGp5@M59WbUK^iy%l@J0t3C6j(4_wd=W++sG`?oeh;m;4 z*;6yJ!d+;+MwpYcSZzupv&WAEr<^?Q{A<5vIH8gALV{varKL*!pa1CAZYNp9LZg|{po_Z+?+uAidEn^S4J=uV=GRWgf^zrlXR z=iU*L&2Q|V81dxTD=+$!lHjt|{h#COnjQcCugGcr(dArT$82p}W@Uy;?+r#srh|AKy@x}uqVXJ`e|Lt|` z7To?IktqAF{=wTIod=Bm4;Ux!-^a`!n#w%y`4@h>N>;z!JR80Vq$IID(f0`CdV5v5 zbVVX_(29QzTe<^Io4d#;U9#M>^b|uNccf+4j;$@6GHMHqxJASkTwU^Dv&(_6?7|r) z4UM7^?h1UTQrfP!`uK2cS6a@yA-=&?A}6V>_h3UL7&woh|Rt4D;GXziaO({5*Y;Ypp;LM2=Ck#F?1no00 z5Gdl#`+3kr;y^=4nE==AgM$AaTshC6>HI%=OQB$@;fB8J7cXWj=pR&2;t$e0s3mk| z=IZ|%z3E4CEOR9JEDjnwaS3kNJdsKI&X42$72Re216VH2aB@?bdusZ*jd@pJCy6m}$<6f6kkQw=8N7=jrMB&?mI#v7WE^uYbopMm>^@2978~^_cR;MLAWX=|8 zOzsyf4r8-i=y=7z-~iv(=F}-qErTMo2jd~mqL)N`I8^MdnZk(BfHFT`Xf#5>&fk~k=8 zyGV)EoLf@TfQu{QPQ$m4fMJYx%($zi!haN8-)O?Upp4z`W%k7r%Hxf%7T50=bryx+x``-tHUzuzO}tV6)X(@0@o#A+=%WWX@UF z6)I(m3Un%_G8^PJ@~uuvXjsDT@%)SZ9-hXf+#WxS4=KqO>FQqLUr@qYe7e4ZS!R;m z!)C@0E!`UPCwyjJhpM|0Mef zm(5Hf4Gz2#_Son0B)?_1#Dq^ei&k=fmdmuw}?4x3CIZtUd5aaLMNGj$oHK_jOAgsuG`S-&oAE;S=wq zcL|kJMv5$a+-wzIsSane1&R}YGMM@#)}^)l5VdJ!{3v+BF2ar}RP?{XxrBzb8yctb zPAK9JadZ08xL!ZCVaE%5okEA#B?anYC4Ss1d{W!yKKai-@4Y~7)`bQ4>I;Gzj+lc6 zga3Z#-zwWbXS>A3SFvgt%ja}*nl0eu4BxP;{{MmSV@>RPA{@hm|ED+n^xKX9wKhiAiQWrvUKD`y|r+0w{pl>lA?*fa5UIa|h! z!z!|k<0|v3F5B8j6I4!uMQdDLc&kjZl-@pI)|AS^MK7@hcL@}0R>TwJsbX?XIT4WVx~(vuh}Q2bs`IYA35mCZKB-F z-TeQ86I0Z-=5FB)62c~%jTKGfCZq>RE^L)oVM(ZKD81*<%CSS4aZ+2F#t9>bgr#4< z>)*&K|O*rZ`n( z&qLl)_9c@K9Qg40d3lAqd=%?J?y3`+>o4q0_^()g^j~_zEk?UL0*~Y-%y)=uQSJGk z(aL_r-=TO$LiHNO-qagjY!Sa2O{EeZay)9j!w~h4yYPSgl8S_chM$s) zT>ANo{ImdtR|!)Yn4@Mg7BXL%`#-VO{)o*HyHK|biGy0=ZfsL}e#u{IWSM=GA@>bv z;Qyhqk

    Uk_*KH4>YnRIjr_MP<>G%k(ak+zM?0WRPz6YKRX1K&U36~n7Lr{T7~t8 zAGI(F1q$#6m>)d!NdHU1?)~)(m+v@ymt)PJ#7iAxTDGGhpgFc#%}G1 zryQTSHP#(`#&r2_zr6i{&0G(@u-b0u;FR*~={Zr!xh-b0;FYXqlXVW6^B6C6Bquq= z?LENozQO3g)0q+py-^Xr(omOBfXHvU(X{lTuQBoT17`6jP- z^a);fH?|WGr~j8sNY8IbmXz9NzppN>;RbJ^c#asyJ%N@sZf2o`mNrIasfMM>9(64t z4>p*w==dc>DXcb<5NuT|SwMr2xG(;%Pmoqx{M#Fwmd!V*7zna{Y3iQ$^!4}Ly>H#QfEW_IC!&PN>cSUxv? z+VEK+;VJ)`jmI0VZAeNXU-5;n&t;q#CZV|c;eks2EN$f@@)JUt zItm)D-aatp9D{fF0vpa^6WKg;Z3>cM)CcK#~_9x4!TR#}91x zW&GN-PAj!3Y|#YK+dVsun3WuP z(FP7|<%-Y#w9jVDdjGF2FSTLnX@UKRx0yIyX*w)cHbFsoNi18Jam1YFFHN_iKU@{< zP&v#Hz3;#L(svG9UjB1r*L1kODj}6kSvaTZi9NFx!^gxKjOqzZ^Nf!jIdQ~+lYxJc z@t^dDiwc_^3ONq{IMde3uhS#J#@g`2k?qSdYvzd$xuP0*k1{`%{SfxL{sNX1E??c-hm$)o%Y_wcUc#hi4`jGfZI9 zR(c~iH?Lsfzxj-Yw~sKaoO9s18^h6u>c+-S-_;w>wut2LEI4L#VSdaV8-d0Dl}(-g zH?QVpD>&ROxakV#!|I5`&+RYWeSC)J#9aM=AC2GK8l@C?JXo!Cq!M@^)?e7$*>mBN zv{gD^IX}1YlL^Wb?k->w*keDhQP5@=PvkL9-sk@X>Xn!KdpQ0Pzr(;Zw}kIy#=#JS zrgY{6n*!Do3^)52RzFG1Y>>3#;tk~Hw02{gQM;ju;h}ec<58CNcN_{iE*@?v$zxem z)NqIC!*}^5g~ zkXBiQGlR6vZwLL!MSb!K_|OR_hCA>uhd#X~y-06JD)MTlF(j|@?_ZJv2 z$q963WH?#P?eSQhm(XkS#EnPC@8AFS-kA#Dv<_)kx!qX9kaLVjW>Z3YL%7cdhqR`| zOlcMFB4G{LA}0RWrX`9V|JqB0BqRllt0uVd=olpaOG`;`k#um{A-wGrYmlDdp>(GO zmFRTw6c#$x;pp`t=W@M^ zx`asHhFrA=kxFiAOU`|WFK{^gCbi|5@{g=l^%MFSUQ}t_aAK^mYM55MU<KnPlF8pNLQ1XrcmSWS= z!}}i`4*!4nvaZFx1(m|nru}#P`{lj-r!#h2elqx0Z_o|x*uyc=!Jq#`uYEzuLFs4z zB@@g)E1U{mAm8|rL9QYtsqNbJ3DF7)|C*ntoalVT)A5b@gxrkigjCkU^=uWt82PIl zAIlzTdy*ZIE<1}|QsH)l!!w25oGE7NJN~tc=xyk;J>sXpncsZil!+U-*_^MK_wdmp zwr!K^3>2P+vwb;elff(*bpOz)=qr9aI=%-#G4085(9V~bz)-cbQzl#?^}!Fe)$K=A zQx33*t@r8ZQ)FglR;p2u&6p8sQ11BW%lyW)A}pStJ7Q7a3!~ z|NnU=Y!V3i{4({`{A(ljG7jSNHD^qvz5G+xUcc z1Tf6}EPX4V!SfJ%_&;ZU-qvZ?C+y+ZOixJFQu%FYm;B&iGf--kpZL(~1RL|e!=L%nf*PI*M^v6R@L(`LCdS}au#RDBih$37g&Ufm zA80*XA90kS)8|5tg|xKv4VH@JKE_Ffij0gw-{s>98$=HAb^iYU-~Ljf(Sjx(!&jWQ z@3Y?a<_qS|-qYmETFq=>%zSI}$s;WnFS4IEaP<4e8Gh_c8f&|dt(b0Hk(AZ#26}SMMWG+Z)q2PA>gF;gF~fYnS6zT;)`EvK&Q$9oaJ3Co&?SygUG z1w7^0B)(O#DT7C0n@WS$)&C1FzgZ~Dc46<%o(p{(SvJmAjvbrX1x}kJPF3t_V^Ke{ z|G^f9F7=GX0#95nH1N+zYcfeu=vB*D-YmHCB9~Xmg&)l`IX%A#>_6zlc5i2z!g#M2%uHjslF7u&)g<+6!a0^C z9-%b8oNtWR7O}aJ*Ac{waIyhKtBX0rTc>Q;nO?izT+q;>#{kymNwMt|voh z0h2Y)21a3zqSmL}Hx|gH2uu>(E6jK{eZr{@##=v}&-69zX*LpI){{x7oX)wYTs-Bz ze1hc>4r}A5_7+bK51dLUc+9KzjsKCHOC)#Zo+jzNJR8`QOnM#ma=qN6@HUY3s3r4~ z$9zT79&%;-SUpbHSI8I~IxQLy<8X;@5l=!}++x<#{S)45ABfaRU=|FsYdXVrl$G6@ zeUCBQYH0}xi3fFm*kyCtUM4r}5)`}FbHR@_>z@0L*52mHjDdCsF4?b%ag&?ezC@Qz zr9q=!;i=i095>PSRvzUWsT-V~5@pjoYz|-INm*}yY8romEU#oxo5?Z3cMVfrPqcG5 zStU;R(bAzDW_REa?=#kb8IE^&R;DZP=DA2XTv9U$`|oJ&#>3;0zR}^7wHuq;7CvL< zn$!2{mz4C$=$*)G==krxGCUzwQTUSL7KP~ttXfYzy;Q%1G0bhs+x!bHJl|AG3Yg;l zIXy{8<*9f!c_QZ<^N86@PxL;7mR>M9((uUNrIy7=@}~`hg!Cp;)=PznE?M^v+~F$} zEK%qYG<5tlpRrO@R4Kjj5YM(kCC7(96H1%SDM(d8W5F{9?)ZQm&hDEOc=L{UXzxfmFx71V ztMnp62HiUcIhliYHfx7xEM(WNQFwTQ;pHAf2QB3Z$qKx_Zae-9@Tzn~ZdjVL;jrYy z%j}zOZfKKYzLKN%LPtm?N8$m)BKa6)1BEk54dq&i#x4oP|D3HO7Hnbu%D+hPhkRxO z^CJ02@)^$Ujg0f|Ni2Bg@FbB{T*toQ5|c2qa*!0$Z|*lqSDIME7B;14OG-|hcG{^( zW>dYwzqXg{CK(Ei3@a-XAM!{my6=#zJk7phVv|h=W0}3lzyE)Kw_o|0-eSICqV##5 z59j2C_bf^~GHG4FCmR)20|%+d1z)&6GOO%2bUZ4#@ZnJoe$|Lw=`LL69iaw)Pdsz@ zWX#OGMuh#O;-Ln?xHf}>tMlA$Xvt6UW6#Ogwg@+N_;oSBj9KZ;e`o7c4-U@`koxsM z@XMd}f`vy-Toeie`4qWK+!KmtpFe5UMr7 zh|^*Qmu(K$obs6yK3QsrIc)D^kglGf>*2$5;v<)I1ItZTt!l;R%N)EMkF1eVE;*^D za%W~@xv8<@sZ0;4w1kGr34&463>Ppyv0|~UZG7U8wBQr-woR;8ex|dVol|`JzP{zQ zWMZmy5;x0^I0o@G6C6+NKahI%%$hem6Sf@YDCe{gcfM@4<_`PvNVY3|+{`AmN}CSW zS6CeQdzwM^LGvuWBKsTz)+A*W`{u{3f-B!7w(zWJIwZYqi|CUQwF-4%p=k?Dn4{zP z{p`>9cr<_Ba8NblXX~_hMeqDXzT^hufK!zf{~Vv#ddN6ToAkfk?8JZP>A#vT8(xt& z*x$s{Hnm*AFk*($0-iEQBOc)z0a?xO#*MXY5ACKbVP460;3L0Quw$7+Shd3|xhJ2P z-^saoL~O-x}>3#Yh++>;Iunigl%((-+|K%Za1#x z@OU)e=ef|+`N){~V`=inhUlvvBHCRwG#o>{_<^!qnhwFbF;MdVR@R2oF+wssBduA1##K|5POnCgb zA2_s4pZZ|WNsif$ZCA8URI*Nbrtno+DMj!j@A~-)VMY&DU6)Xt%EY{amshWS=7iU| z88>-9YBA?rkiL`1&dbs8Nmp6TuqVgiN#O|x*%fcnlT(@7HCOnsE|nLMH{5W5LHEnTr<%%3 z{_^?dJ8X7bUF&#T_+JxSy5sF^g`-l;%FN2lzY=c8zsRwBbipa(SHm*zD<9gWjxahDpC*=X^|Mg2;B%jo&6+At3gkffG zVoE}bzJH6(!{(A({~D*yYjT?``5=+A)Izx^m4~l{ZHh(e5B~KIiQkMB7+v=KYd60f zz$G1!%#tR$sE4iHbjQ4u7LhX>+Qd8ledjMbuCt+#`%Q^~f@xpkx4-RSAqyhwCw%O= zu)%o;`_=djT|A-l1Xl{Vi&$;A%KM;%%~brF0`pPUC7YOcb4~M+Ojzx$a8k_7oBK7x z!5~hhtqqqny5c1y4qShG;1lDTg&jV|3qx+5$a61|OE8Ywz{O#t%#it}+3j^=Z)S(h zlKHHC`fg9y43wG_?HYB`TTR6jYn5B#1(=yZ$3=;y)Egc;Ri%^3wl%0}inPIZ=PAaA zrfV4)IBb9Iu=u4sbB+O;Y zuWa?Pe!=NGiHVHG;!oBvACb!qSk6;R7lu%tcMly>4L z?}Z;txBiM(_;IV`DReT-n|H91^P(hcB;!oa_G^MY8+I{;nLA09{a;whcto#5;)Lw~ z34ge}4GeZWq*@h4I2@ASSo7On#o*ve>6$PGgU-Kfach6b?+ay+c|2il77x#ZPal4N zfB)f6lgI1-fv3FODt7j2m`gq^}uR#!XCuk zE&b#R_crEPb_$h0?R6v#71p^WH*`0CIrK`{!^&C2MnO5h1!i_@_}ZR^UzjF-;{m7Ae4_v$^LEn*{YAM=L& zGZkdjBD|S|-2MmL;qw-M&{%RoLHb5b#sveXG?BzCiG{4DOAdG1>|pOKkNC?jC&GGE z+~mf=uUG3m?w&ucvQ; znvU3?$zf~zAMjZ*x4@(3Z|k%6{{>P}lMbC;_21*Ah=}+Gi>9mdc`PpLXuR35JmZN8 z*XDjkeuk+J4bC{YGTb}HRjkIi{Lrnb8@6d5UcmHX9)qhC&*L(U%L+Ht82naWFlPSu z*wUIIto`66dD|xW9jp%XKj<=aY!aN5LXh%3mz6Xwvhb|O58?GT`7V!Cj3Hf^#SiLr?rT={9lmgdWPlTv{J`!wTGtZ zIsW0+3Ygire1%gi)4L*vIKN$BoOKlPF;gzV{V9;io<&ftfQqg1aNoI{8qj&WL zKPe|erMb?xE_M9fvcQDh(t@WlQtpD>k4=Fm8hDP}_3@Z0lEN>u#GoN0PNDoC%e}d$ zPaQhMu=+w`E1Qa_gSLy?4UX^i5#~LN)6^vw^70m3{3#zY@qg=mCB{j~PF~C>M6Gue zr8>w3IFxkET(Hf7t^S|kAI9@-o0M*zWXP9jWSMxEFWceZ9oEglGu@7GEm3eJk$*$?2yydq4#s@yx=*TKw5>^Rs zx}>YK{=lCmjn@mZ9KIPjNFVFjV8ml2z{o8gv6#&%S+Cr6$@l*sKFwgfrPS6cyo2#9 z!?{Kto(nsgTFuXd8*JUMgHbf`K?rZ|m&1P;F7YM(Z?0mymf2o1W#)s;p$VltJRdgk ziOu7vo^epm@!gI?k9hYyZRUIxo^iB6Cj3D}YSR)cH#U!*%#ocR=QB>sQ?P43D{*kz z8e^rkHAzhC%YL!T3$)((%k8=P!$A%<52;`5G7bp|El>O-b{_9ov1P$e!OedXnD_-8 z&a_NjnNa&6(#_=`OXtCL%UdP8KX9+KEiO?yko;3{;90Tbu4-t=J0r_|6jnI_u#Xj!~|J>&hi3@e}7LiNXxWW z$WMAMDJeL&Xo7{({f2F=e;LvxPgrtxT;(t*eQ<|MJ6KXuBH%8Uws7LVG>0s4$2%uD z^0XbdU2t#_cq(zImq#PcVeA9l_cS9NDnfnv=oN8c7sAQWI=MWy$w62(~P1Zoa z=`r6Mo)=vH3DWE$-xaogILVQAVddA3)tv`R*;LpK72284)J%B#qEtkqzwtBwmUZrW z7bko@_=s_uoS@v#^B+F{4rdE{adpLplO`V40u%iu6&5E3bP3K%7f3wCuvLCqnxy2! zL$f}xR^vqN*HQ|MX-MQe&1e)RbolwkN@_}%vp_Wk@HyP z694kY?mF3W%Oj;h{KJHkDO^r1(7qp*KWVcaPUL(lHDIIW}VUPYS#!HedAzc3_ za&dVaVtMIo67g^G55YM-l7hU#5sfU_SDbR1WOf}t)MIf`{?dZxPqe0t}Ekb>!;7Uj4 z%mM=^nS%$8bVO7%$sF6@#-H*rgv~?3M%UYN=e^FlR(!lF+Kuh(50-y1dEYpHl zKlo>Qy1WrhXINg$w#2Ac@K!*Rsft7Op96)wwk$$v`WAB!@&}|OIP``G#26Sh@RhXa zU;TUj0K?7i+^c;iO1u4E_){#!%15R$UsS1ff!PFwm-8iS?(*yWQ{1eiVD5a1J+0zl zlacp1hRhVBB+WMoP6C#0J8mb;E#B~>K0>PbjELhG1EYl12NDvwxYB1>&5&4Q!bn}??>%aJ>?V@}3 zOrOX&YkHt{_=e9s2~WjOsCd}5oPA{IbeSQ@Dyd~k)`TKXOI;`5#1sd~FG((1=8_XX z=@u#XGro&2=sb1cK*I+9G=3c&#cjq7!h%Q6|9{vXcF-zXVYE_1N*Lx#tMhzr|lDHj@%$w<(3iU z62={LmP7Ug<8PT)c{Ah{79KdkAgSGWjNRn&p;O5La}J#{iKug!;(6iIlt#wX1&o37 z94=XBJYX;LP%>#fa9iX7A5TdU!?e1Dg6<7LmRSn}qg!dUfCa$10bIo1FfY{{@?yIzBYDat6g5 zoXn~6_iua1lMe@N+@@^lc~a-*VwIHCvNY4J!jAcR@c+Qu%sm06|Nkp*9Hy392Vj4Nt_}NYLLi_b5Z8EOTVwA%on;NTmJmFU!?b=f11BT9NTKx{kJ_lzZoFgTA&%Q!2M;i;ev{D3QL&ndIccSt%9@FfTLojdnx#xT&RL|)6#pS| zuYSTgz9%W69y<&ToV2*rGM2Kg)BERqB!O8-z}!iitPFvM-1HU^ zwH}XFn?*S;Zv&dv?`_m)ZZBhzTo~=pz{}ua#nNt6QO)|M!JBQ#InkV#ie3+Y$#0s@ z_l%__T4Acejzmt|1ojjw9o+*~O&n4}t|RiJXP4y$G9}P zAgVPhv1O@x#LZ9qQhXO`m~=lU_9k_lR+!77r>DpEq~?$OtnH3!hx3XZ;~ySm=x29h zyWyaJ=BvWr1qCfYm_P^r+)6TX= z&RNS3luGPyYFwj|)UZ0WWqRrV1-Y^j^BQ@|8b2A|(0EZ=IblQdmEH~`t|vY9{{@;| zCj9A*_{zF!z2mXw!%yXNl$e9c6h1L2*D%cG+_^5@Wr?N7+!GA`|0fu1W)Hx%TPwGN~liZ88m2Oj3KG^WH{e~aIC+;Qp8e8;N{Q1EyKZE6Y0$apB*E4m8 z-?-j!VJ?>6!PmY_RIOqryLNcuI|tqUiZ5BC^cx@ZCF(7bWejB1)Nf4uJ)d#kDz<6U z6cc$1jlFK3=J?F6%*?FBpeP%*#FMw9`oEFGwzfmB*4OiFFcJ+acl^Vo8SdETc;*lL z-Cdl;+-ve0BiOZr8*^1IXgS;{vuAUWa_$SSsGh`lXuFSW)Pch^>C>W`2nS6%h zEFbpS-tc)`f28Q={|To=t_imNlnVTzz*ROO z+OgFzqh7~DR(VHqyF@0-?sxWU8ab|hmk)F_JR~ja!*haF?}*Nmz^DH&FmcEfb$Cg? z^MA4Och3YTxt(thb?mu6d!pddL}tAu3m)=s5{{8HR?spnFiUI+yB1LXzkSQrhU!|y zR}M8FwuWCg$RCl&x3iY<)`>>8NBjSG>~Q-bYa455q+s6QaP)Qk6DO%xd?lt6nB=eh zXujEP;lL)h??Q&dJVn;`t6P6@Uz^X!ulBcj?j>%n@Cq*mBi_FGMmfC|U}f7Lc_rxb>U;=5&s}&i@^4HfxHR zUavWjB znx^=WkyAP%=HLH*j&uR(otJwGlvVC3{$cC2SW?1M%&gRVknOsIQO}1T%*#17_;3E* z@b_JZ1@lt%0Og1Frz9B?W;=dl_vJnzE9t>5dwZ2ihL6(J;tO+F%%0lY%s=?WXu%xK zCb{yS2Va;YC-HD9M_4tO{`luCJ+))?vxHvNCv5sUcK;5imHz+VyqjI*c!!_%5!U|; zW#a|-E&m?4B%<>#(Kao@>PP>S+<%Lwwi;MY_%Yvpzof#ajy_F~fA%Ux2b)zld|+SB z>gI7+Jk7qSrs=aX^AXhzdk%2CJ=v`7JwaxN^I?uK*4_N_+gN)z?KUuL+9#GBxWoR? z`I6XTwoM_GnaF(z+(IwLH zKOpR}7 ztcIPV_DqFl!wGA{_b+_OEi&c*zs1jjJM3O~P5Cdd{lICz46Eb@HMbiJn3gMu!JoO5PbaqVbbEb=A6G?!pcMzB=j{ni!bU%O zMap<4?2=C66F#Ap0t(R{}3wn6CWixlqtH zgK-mg&@zST*C#Zxvwe_M6Zr1*i93QkYirt%+qJj#xwJ%x5f8HBAzbpJy+jxSH|6Qu{47 zO?OW6XE!Tu<8o|zZf~*a-`{3lBjW>%I1YocKv~828V9>@LVX83w-Z%=#PEImtMwc-w*s`oFt-7(oD)2xu=zl%IP;N21+z7en&vJ$-El>s!G*18`9u4PnMOMnBqg}4zVfd* z+onTW;vuhGTH2AgO12Dk@r_417^`-0D_dAMzD;Z4VOn4wr_k%_lF09OWx+8;W#&B( z8bhD({1?n)d)eG=eCQ6VX4wSpj0lUvf6kxi_`rN5uY+qtB+rEjDJ>=P3ammcynZ4N zW=&wc$MA<=FeRa()!JlH!ov^pC-**JlVT1sOK9n9ILs}R@RV_0Y+H!ZgB=b0b${69 zmvOw>;&dw3Wyc{cpNK?;V&hM%*gRaBBsaQ>Y+6v@5Np@HD@SDFiA33;0tqK!duC=O zJ&A=M`R|GUln+vDuH{;HLE<6%Uj?bM2j2u$wn$1oc*$F~Rnbk~BezxF#AIZhTmkc>$9^(Y}d-62oI@DO)&fHRxn1D3$U z9ak=-Cp3gwOqi+QvXnnN#qkkK(Fwjk7dHIw&=Q=Zw}4Yvg=>@a6-#FEnLQJlgzp?^ zHB~rRmH5wPooK+>7G8xv|NA-OpA@k@a_>;N!5^?VfmKSUx9N++l|$3|{--ez`Ue`QAF(p1EcXJNnwTE4&R*C-E&@BATe)BiucQYPq zi>qfnx7~;5g{+C2inHKPE}`)M4~+FMbhJN<^ayHQ5BF_$ipiuM>aBO8&z+MK`I2 zo$Z1-s%y?LY&Sh{d#^$vzjX(1$z*1oITN?fKKLrP!ok2P?T^6Em-5UtA0`VLK49uf zPh0Z3=3uE^fItbaKJ%Kre7({xGY-8{?Ko2ZLP1SAMph;N|L=YcmB7n(E{Z4mC$xQw zFG!aSGXIzEFlEPtDh9EX2S(5Bw-}#en5)zH%yh!f2L+5T+f1Yc92rY**e{vN{-BV< zEkcv+?0%jNH9X$i|1bC|ut?_TfB8x8CY*IDS@!SnBoXE_whD}DY%X<;t;|*b+Mfm% zT%RbI`ITGQMPIliRaA#h;iNN2{qw(F!lY@cR?mk`Y(fDF z#R=6%Bp2qTxADC(G&peSb^VmLk{g^u4yIn(|Nq0(!VRCg7&#kGOBJ|Jo5*;Lvu)=? z`7MuGJ#TL)<4tMcG7MnxjOX!S4p#W@_(kay=NAJu{mS$dmo03Pi641c!#t=tZ;!%)0D$X%qdbD?~RCfKGGtU3E416s>i);O^B_Zk-ck8=$_WMx&lwn$m6sf3SuDw+ zdi8&XsbYxjn#oNOTL1Y^s+=e)J|kS%-5 zAtTE*pBT;WEXe!CKR>l?ijsh-K=}bJ=?`x>DpoTrInZp9(a65>09R>&gToUEiHXu@ zdp^(*89tR;Fb9GWH=HKWN$bPeNy0|y#j^cW~jV{DSP z{jWGx=0sM7@+*7h9UoY?>rZ&|mp{M2!ODGt(hK`9zZU%Wm};~{$o-v9(;vntw`1py z@!hlM%j5Xls*~Fs@o_%mw77(ipXJYdHSSnQDw}eDO zxuSEJ-yinZiB0bsonJJzGVAPh=n|}mV`Ar7V#5%=;6oMPvVO*u#!Q)u4t&zxBgp3a zeuLYc`V6V`G&hrH{|>Y7N#NCEV~eOfeBuPl{E5F<67pd$^4xVR;Q{#{Xud1@dYic z`pgRt_U4$GTtD2*c&#AOC9C6*63aD(mR8;!HfbqI4ompmGA8_Y*PN{w_p5))SJot@ zifq;`#m5>#;t!pwy^yQ=pymKWCP(vhc4Ngu;xU^W4oe8`->~5)yL8N-|MIH&im%*X zBrq_mF&x!hQNuWO>4NO73E|m|f6lVVeqmV3C^3H`%g3I9NM=ZT6Qyv%-B%IlqKhIg?Rz;$GFucy1a694p#HK$Vq$?b>T;vzYIQV_I zFy}bKPOE8+4}VYBztG6*VaxMQ=Fll#wv6;P#+XwE4X@|y|1a_28ROmmpP%!yMI4u# zWF{~-V#0q%yWijWH?m9K`S_DRTDM8!MWPEI6PwF#<~VT!r(2#A3|LPpv#Co+2$b3@ zE1xOt_{OPWGeaV9`?>>_ z>|yu+!{g)AadpCrQh8>b`+u6Rg?_L(+p#67r;#x%&*2lJ_NA};1*#Q3{+iDi=x4lu z$I8Iz^Mm>)8~*TX=1WKhezs5!GH|@nVZ-@}`vse>N4jKS`@uKveexe1xP$nmWv2IZ z81aQYJ9NAM|3s}d|0itW^Yj-8{=fKyal>bIUZO<=$yN(kb9h3k6 zS1dLC)xe`N-(lNZ!wDQ5{2UE$+7oNqoL`ka`NT6jYZpJ8LDH^A_a{j3Fzl4R`SJh9 zV>*`=Y#fc-15)TC;E9;o+?C zNbGsR(#+*ok>1Q0q+zf?)j%ywY>Atla>Wt3Wh_$;CMuUrXkwYTQ?b=($)}dok`8%A z(IfUZI&?C=e6T+vKcR``6<>hs=>r_=1SA%G68QT+@tA>wRbWR8i)Mo2YJmh+=^zus z16)2=4v89OacQ?4e8`fw$w@oi?F7eL`wV4{95rPnAIBOsw<`_KhOh0{Og!IU=+wR9 zgWxYgQC1Zl2VRYUcFt=N&EaA^JUl%-D}FiTIWEyHF+b?UEOcqZshNVy7`1rwel$q? zZ4kb+@b^B4e+{dDa?fANbd+JuCr6!XSKo^pym}fLV`VaZc;4Lkud(mffBBso`7d(^ zGEZ-=5)R2|I8yiT*FgsBwUS5JcXD2HY+WAU=5g!K_y6*j7O*Sd$n)5hmeTN4JU}hA zsjtZSkoY9MiPCNlESQh7ZTa|Jyn;bexnifH@ScYZhWr;bno8#+eEiG&BJak-2!V2= zL(%~gYPc*}_^t#dHY~S)a!l66HfxRYDTaue!@-QoF8W1Q2`=8(H#7>lO>xt`BDcka z|MYVopN?ksgYEkpWLpZZ)@R&nYgO%OYhixE6{wc6vmxNKymzutSeSvqflK0N^gGU} zlq{PgIB9y~Kjx){5zexfXaBXUq_Kr;H$2EJc~$O6UD$*wm*@PC!aZ&!H-jt6G4Wq>oIa=NtAWGmkPLRIZT4bGnu{)W z&RM5e=eES(ZOf0;ru@tX(>{lp9Hwt1Com}0I)AcwvW+p|R>QKqf?vPc&!;Q=cIZu4 zdr_AWVAW*GCmG0{%NB8?Nh+h~f<^OE?GDTT3gvamvSOXH{wY4Sd(y`5#uo9M=i0%R zr=A{5`Cfndo9wXe{lCBN9|TKfvaFIF&MPmdV!hUp=E9Yo5z8+3gHhMHB~84;TH?XC zLzm=l#AMv$ctgNInA^c|?|=A3AE(9FqLwBmqd%yh-22mfy0ruOXSbk^quE&n=|P|-rw^d<~OD>^lyInw&QW+W57ZKvp!r~?`-?d9fJMLA zYN7Mfc+nGPkDm-HUnp#Lco4+@(n^nQ3foWp2R-U13U2Ul9%=94*A+6WUl(%4CJ={y%uf`16;1$xpR4587Nf z7kzTImjG1|lGqW+HWwGKUfhCa)-j@wb7wlk4^yBkmE2Nsk zDtJ2lREpvpLlS&=PDFD`EMT?15mOM;bf%3*;GkCI1Szux(g%2j3Je^rq(RqHJZ6ql zR1Q6&Q2zhd*V&DNcGg^;Fnz zpNM+#JlN2--ofe8@dFH;&Jq6_r~6;{z&u@($HVNu`xMa)W;RNG3qKy{xaGk3vTdoR z%HjhrWhX9@Tp09!;wgI;X(6!<70qRB5)unCIRd{OnC6w-a@XF&kS9yzALH2#|I!m0 z?(_5W+W$BuvccOyuX)PZ4YR!$>}+P7cJ2RRY37~}jG-Ozk`J>SY9jvp{oNk5?ci0X z*J3VGEjM^iPZy|`c<}J^fBPgh@ff>*>^IwAd^mhc`Gk+{5}vk_Zwi?|{?{K#Fx82X zTu{emUXqx}K8r0O)oh7R)0#ZzcMc9`n18o5GDbaXe*D#**+%7{U6PBgzJz4r^>v0y zOMlis@Kdn)cOca=WdmoJ+`?t59=}+xpLe+Zp!eVZjw+EYN9GDft#^DC)NweWIe)@0 z*(uxp86K!ATX5BELlN6GhSuW;{{R2r$IHxo=u^C+v_-NcY@o!FZHuxUzg{l7o0NAA|U$hpY%xZ8OM1+85;-q4xxD)Ha-4df8`U~GPX%#k`wefnwz2fxYheA9ePw?@-UImJO}3EQF`!NvO+JDqP$^w4Y;oLDCz zp^$j~gS?RYh9c%bGv_OZW|hBqDHJyU;Gx!u69resxvaU;@RNDre8IS9ht4fyIN8W= z)H;>%LIz9WL2Vfc#pdlk9~gxnblD`#YHXD}q5prvB|eRQ$2X}g>sK(8mkAzZ&@}z$ zoXqnCv~tBo_6);!_C2yZW&A3Cn=Z@jN&X?9r}gUUB%Ti?4BY7zx0tgVTYlDWkXA@9 zaCp;n<0JpH{DyyQTa*9)YrT7#zfij9R)Wi^6#~}}+`9i?G9gnmu+Hg|_%9U^W}CH+ zY#|fE<%|!qZI%#xc!-17c*&Hb46ko1yb@(w(=cf&qXBc_dVz*3XL&XpV`A20IQNr> zhsEkgNu(r0klb|5Qvu!G)Lc4R=u7BwYX{ijG*Y(vgZ`}9yzr5yb z11BzfHxsEjYztaH*WV~|FL=}vYB!;e`HYH3@qOxGr|hI9N^?Z|2*T#_P~`Ak$q z?g1YUbIN*IX5|up#Y+hcD}0(m^EPZ~68*5jr#ptD>E?rmw3hgdtm{G~7PgvgnZRXfd(132TlSpmyH{=Z`pg4|8aiAGA&!t`*tF$o(`YGv*zh1 zoU?-kx|?=QLQBpf63dOIKaTW{C`HP_!+$uUd%5h?fF09cmBal zu3HLhx6g8PhMwp#QEF_u!;*dCa9X6o$q9mUDjfbbl^#&oT+{R6n5OccPi-xXI(HW@ z@vWGZ)}Ze8Bj;Sbi@MM@e}18D0`r}u)E=nmK56iB^VsE|=TIy!Ze^}Yf$Tq>2H}SAm z%m*G}l|};t2WzRG2@b5Lmn9QEvT3&~RI+EbbqN+}*>8A|0y%JSTWHBPtoin0pTy8Xfw2IPKhw1yNYH56?pGSjX+VKgmE8N&BVjQm?IxXA5%44wk zK_+w5{)TRm7YgU>m(`IpvbCTpj#^%&iv6H@?Ils9}uKWi8?s zE-7G~b5ugGke9Q1N`%v@Vug7>`$e8F=sCvWTMde_1-rN>**m^`pkI<;`(N=b7#x%@(bo7|MtmT83v-gZm#`W$E$ZIq{J*&+tS01*0yTE`oo!z6Bov+?4;$OqmodR}e_&1a>==?wU*)BrfL})=StH(XZyL!x; zrzIDBl}oc`3tDHmsKu69kYTsA#0drkdj*3 ztnK{p=fuPp%?I}xH89RPKhat0JOe|~8OIwZIN8N#Gu|_7DwFv4-+ko{iHTC57945M zuu(A5+L6FgYS4J?kelHIZq*1^rtE~qcj0XMXOo-GGBijPpLx*6w4@-N?Y(uYNtQqz zBP+{^m>(G?OOB=f=)dzby(L7(=YpH&5{8x^yl>134!QmKXuoI8AO5?~zsj%t#3a7` z!H4t~v3~~U4L=^VDep+;z1XaAz;V@rvPD-kcplWoPhb)a%usaeRb;h}Fjr>Y;`EC@ zH`b~6Nxe%^g43%Rjok_^JI^y1Ge7Y=(#68IPy1O4mcB^0jbFdmjIixtnvR5VU;lS#3+*lTEb z$a;N(xuL?J58|1Tavpu1oMzh0o%|6VjdxhJcL<1D9qE6t<#0#bONB$sd#+F9-1J65 z?8}B7?4c_rvmnYWXE4@nC=B z@6gB_HzXz;o+7BZFM-#vfQwal!ioR=VHtnirG7Y^N%-4tuBv!?)yxORlM~F19sJYU z-etB#aC1gKF=6;@eJ0l6ztV2uSy_?^vWXGSBAXMrUuqnXx;WtrdpEns4}~;-fnMhb zW`;NUH+mSEnYZvXw`vzH78Shq!Gw|5*u`1k){9^Ko`oxT*Zk)>@vp@+C!s2_x2_=a zc!NaBfiO9x<^BOm?eaFq4|H5=U@Na{=yEjvGGPmgXXl0uteuV9dj9 zt9d4O)H6OV`?L?+ggj<)6$`)Epk1)XNI@!M!xA>l&HtONRTK7l%+(EO?9~XClu%$d zJ7mQ_K~gqgo=e=aUJvaF7EI5V{=aaJhk4EBg9jM0<&7L4i!6F4e{5gm1bfHKIlLCT zxw)#Zd}80o#2}d75qwJVA^)b?Ga0w-;z-dKjjTVk4xSOu<)1kfg!9h2ulUrEnOVvI@FR{_{BAR33MNReeAlpbs)MXcSOL3q)I8_U zqQXJ7XF23G9Hyvm*pb%o^S}KP-=4-ST9gPziuk35&xn-olyY7#BmsCWQ)0X`T<}C_*dtA-l+i&^Ma&@PH`9p7O z9v23ey9`C=>)B2*c-S*JACgMZQ|3JOD6IQU*e*Uc1xwDj=YNjR`zO(+ATgzxal#so zlbAD0t7HHC3eJ-u?$s@=5k9J~HjxFS4UX zJoB4CSVPm>%mJ>6y9UA)n;Uv@{131Hq|sPaITS zlo`ax$;91hf7dJ7@*FEM{CJ ze@(z8yT&<)f5}D0RSu2n&zh{{7Hs&z{{Dorsnoy2RtqN_)7`Z9LCwecjf_9@O4NQh zFdpH#;>EaAxlL+*hnw6DHa4~?Cg(WzAC|m!k!2<~SMUirs}q;vKIkxCh$vY6&3=(l z`%cbBaVKu&1nm0v>8COC3dTc6PxA6PKQU%jcqwSn%$=ifIPGV`L;lxS4*qHDNWLN3 z`F~-i$VHwc7QR&mhonDDuwZ*GuIAD%C$`OCzhjj&&x2!(%oe_f(jF;3#p<;e!7giJ226DJsSwI^OOWM4DTYumviKmk@ zWRG%mheudB{9vB+ULxVBct;p01B-@(YyQ7^ghE2Hv`ZYJ&UnKLGwj^>cwyC%UY^5fwX4AGoyU2+$E zOq0}DHXY)ACRSkcr`_ez@qT&9ItF%MNA`Q09M)&G?38`xf8ng2Pftgv>jRM!Cpgxp z|Nrm4Wc~mDfv@#Fj*A6tKX}X0;O~Y{6B-$X%zZX6KK}ndkWY?vCG%EBhgS*D=QvnJ z2$&zZboT%Mj+qq|5r@0IGma&uG~_RDdC|Ep0J^HDfjNY?Uvn5MJdOR}AaB99@SBm7GUKEk zNr&`^KdtiXeoTL8udJf$^oKW6_CU)WM)uRrpE#9j8XxlJs2d+*w-VHjPMBL;aJx_P zYn$Q|n!MnI(8Iv1dwJ!b_%@HUouAwrg_!@y0STcrEww>F|_{xW&Fb z_rU6S35kGot%Xmo)kjpNH2JS-e8aM}TH&YQ5$7$IiItK@H<)toJDvT{zg}D5>GA*n z{}*lxm(*a`u!(7!nxqEXe?`V43?EsN92z2;B@4A&%Cyh2Gb>zV^$hdyYdUhcp6!Xv zX@esN7s&E3v}qSG99YmO_3*d+J`=8sLe450Yz5DpLZmJ*F~xBn3<518>A9&~R*{!}={uqLv%@1Wt(EIK|M>yWvdBt%ZM&Gi0YQx<89d zyuMY@e1*bhTONiLy#;Y$@9nV~(Ea$S^Tn(EFq5O!L}94WfrmXsgb6(3_vIn5jlW=!A}21sm)8 z^5h1SM+g5UHr!yyRB(RNdQ?(p+W*BW78%MN6B$n^*r}z2|ZALdZ z1AG+>pLFqrH8vcQit|(swb)?Mu!P%#v3*YzgJph$(}dR6sf^Rq5~dogdDIk|r%=7` z{|`Q!=!Ra#EmaMyw@$Jz=VW7Ji?D0r)i7|XD*3>tV^Je1C>!Gz!Lrcwoa3_wEB%De z6Qmv}m>)hQa_yt@Gv{E|9g7)WZct{MmB8Eg-=mXJsO$x^`-DFXC&N4Vlv2dlE?#Ij z!tUkE^wD0!_Mf}%cjH(8{Z zw#aN#;>UiEc#hu^f)fuioD7`MCg377DSbkEk7A~<%uAjXx{@w4*|gOk%1WxKefX(3 z;SVR5cSKafodpb^BrB$}T##SzNj!<&h40Elrt?dToPI2DG>^E`e1{{m$N3KDW$x4V z55An{h|=Sd^k8u1e-q{Oq-*{}M$12v4}Xe26Jvvx}r;AbaluRRv}x zKEYQCS&Fg&H+lq9Hn0>rC@@=y{W~oE(_p*fDV~g)KkZXLPYAx9_^$c(NruQ*T`PnI z*sm;{cG1H-bKz5^L-qpm8?0>3^mH_uL`1p0<8ZKQ=HXfKkd-^w<0t#;7^6d$Z+}Ab)&^1I1z%Wi-|oH@@SFc8+c5^M`wHwrO{bJjTr=>U9c# z%TMh2e>kk$uwlBO^PyMvYpyX?PGAhHYqI+N;;X_5?FS#4?rrQl;eX*At4W^ZKj$9VxRhJ-q2KjjCZ{1>+I`pn_96Ktwdw^z2|b-cuMruPK1)P)<4-r76{i4{){ zrX@%|V3_pnzw=`bQ(K2FrL-3h3{>VTh1DMT!NYUnC)X{f#FiFuFG=1_!cx;X+8u-R zlEUP!U30m@Tae4c@&E9nE=Ep=BLZ0hzY;2$j8+^wz;Iso!`meaf)UZ8W)W=fT^dhW zWgMT&85P%b<_GJV-3O~2P6~85=7w&tJn(_(>i-9g+8#~`4slzVE^%*W4%^mn%VI+b zzjR3J)rlLvH18AQw6tyd%f-)~5iOizp}fT|EyY2yhDoz^txuDP?1qwtIqMY*8OvVR zpLig8#3P`>>ChMZ5Sggmh7Erkt~_H|s=dKlQc@y;`S*m9<_z@>2Fj;0XUIEhUy%sB z#Kp|~i9zs899u>ttMzp*F*P0&h7Cm$VR`|_xiTI#O115YYTod($6~6&?y2vZ83WQA zA91v0O6v2Jur%iyG;|8>S9TX*X4VOAc6+19n>WGcln)#8k^eG@apC$F`d}W=C@+&xS*sX21D9@kQMK|6jtf zcjk)3MD~S}3tRPdW;a>C_^;S&$d=K{Xe7EP{;T|xEDMjs|MEi89Yta}=4a;r|9_Y- zyHRx21}Eu@Pug~hJ*qF5U}WI@e(B%-D;3Q8H(RG%;tB9RAY!ci$*4eOy>pgMTm1pS z#1(99{|)RHY9=?$X8g#Xb6&>6M^a)z;@O@XULVAZ!i|@)+?vB+o-<>@G->BQ z?3_32FZ^AgP%J1a!p!WY$f1}1|L|eKSG+IwUcA7@bLH><|H?k?ralr2ni&PG6^#8i zFtT4*VW0BTUYS{?ceB9(t1CPK_5WJmzx~brP3XkG{QLVGFMsQQfB)e1?~Q4t2Q%9k zAC?tdF)&atjdUpFDU^Q`m*i35)K%#bawtefx#j_1iS2{y`SF2L9UUJWOL8I?Tu(a` zEM&6a!1K^Q&N2n99^pM7j@hf+k$9NM!+Gxihc5XkD-`E?x;XRfl=;CP7sQ#l$H2hp z%AfW&)}o(Gg+j`I{Qe&=V6YI+Fs85IVMUzk`fXDR^b~8*q54LFiMYj z&bId7Dl&Q)kp)(7yAa zw>ZN>@e-@b+U7qeS?prI^8Z*B9C4FDQYSgZ!Oy*8Mp{d`gX57j#$If`vQo7)_$c=;l6X%Ak*e#)$$ir=XqqL>xfeCkHE_<=@5}(ur z2fz0ZCNQ^YXRryI`W|Xx-_`rnK4Z50qM2;o^$S*~IetB6zr{#2No-Aw!<5G#Np8wlO-N|) zk#Ick=cJ`CG2xTV85<8tj+OHha+M-98h>mMo&P|hQS4a9r=~{6oo^U^3O=d7k$6GC z_W!|Dl^+GMY#ug>pL8{N{u>{-qIig7W$p=v%+!X*LJ`v&Zmm+VR@i*EN5He<_YB6Y zYxZnrWqt*leskJvkP?xrU-(vh0#krZ-T!aBjMttyo-<$Yf$i$o4UF6y?AVqVeX(cW zbFb~{bA$g485?ddU^8+G*ZcFI|1|f9S<-jd9R1AyFNhXPNaVk5)M+tA!g5Z)XZ;m1 zfB!z`zY)9O$1nc1#g2{4^HwyL9Z7uo+n!lzzr(hV21W<&9Ac3TVA?5C^VCS0c@ghH zhTeQNm*2wA;#_vMJxT4bmN@XX`~QcUgAU>hD>u)S@OZsJxJ*hXX5;nX7rzcJJj39- zz=F4ZOo^0yw^~};{{mwP!%aq?I_x}zqW&5;oJn??71*#-SnOZI zcBZ#&YkC?&cs5*&onX14pj~Hf%h?l#hqcAomTX8!a0s!QV3FwHS$(3gBSXz0hWqkw zdBL0qT%u1hPyD?%p@jWiM1xdH&xU2JN;(f-_AnMn$QQ8-U2$OLJ<;&3{Zqkbg94^} zNrtE5S8SR-@CrxSIr(KP>^C%4THn*K^P#;LE9~X%Jg_?JK5*pMDCd_=Xd9Oj~ zgqzMU6a#%aYFaWv44SkH-Bv6Ye3$IdDHJgy`PTUZ4HKMmj~qOuaihqgfT!{N&xRL{ zEobY01ci3|onXXvt-<~5_YHf_G+Z%AWKy?qsbqU?qG0+!^55cB=?yzYpZU5~NHITc ztp8BE$e>yw@%#V(^=x0Ry7u(U_{s4oJi_viyqw#D18nCX{7G+UvtD!X2uJAQ10O^y z{H-*y66Z<>EIfDc=vjus>-HB`@SE5h89StT&s0cfGdOUEW25-BgN)|8{vY1<$ia%y z=fc5YHnxaa2`v^JQ;tc@46wTM|Nr9S{5Q&ZKG?9CF>PEUEhN|T;0o8wxy?(`Cs?TX zIeu_y7ZY56^~O4HE^o-I*s?qsAe8=l_LIoO9&=9lor6qnD@S7T**56KCv>$OZgq zu*!c>d&|N8!>11pk2(c+_NBMD>wbEmr}MWdW5e%%|J#4h@8mQLU|*^2nC9?EY>y~= zl-hw$CKUqgA#%n}Y+?1yY(@uU_t^6+*u^80=F{OA9&wv>ir|b3ryBl$*uv)Py}*EZ zTJ4GE*Bw*yJIq9tb|j{9y;{Ju;t%Uqd`W}n2sug9Og-9U-2j+t}e zvfwQr{_*pgy1DFXocUdTR^`kY6E2G^$#FcwxyOU?x%!lEYRYMrd`7b;3O+6mdc{H}DF>#Xb2+QRgpa)Y z|KSghr?k(7*ZUNIvWb0Ppz}%mZ5Sh4#%$hc>IXg^;o#o$GIKBEnwYj$-L-3!@A>yw%x!pc?Y~E=rf)OHv^fh*mc09SzF|(kWSfP= zim8k&>l-^5+ecS0}cLR`i<$ zF|tM{ab+nuZ#HDsF1Tr8QRwh}Tayo4{{>?Qtz-{n(TB`#6;|zLJ(3F5TONAPmXLVZ z`?&tUK=1kg9cC;~-i0k;VoR}7R(>Ore`KFqM6;k8`^rlRyc_?2Xkfg_Tx6V)#uwCa z(CwrkZ&&^Q1n+B#Q$=!?NSZl)f3E-LmD!AVMP8MFbitBZp{%1FFXk8+DNb9`G~LI@ zQA?=9I>0@|G43CKH-AP&!(TSdjgk@)3BBPi?M(M75))D!Ui>}ZV9?Dt(IJ3K+>PxD z8&itB#14ZdHH{577qA&JE1wF|k8tJ73{g5HnPT&1UY*+$t|rdFgH18atIzybTq^`B zBQ-X#$?p37plYG0%8AJfO1L_$JswL;*{&ceZ?QunVXEkw39aGPlt`I0jlugf1g~T8nGC}?zFB_Z3GPilIOyxZP{w6z!HK%44-2L(2evdHA z%LmRsd@eLf6r>Bx%8`&%_$uLHFT92M$Orkbb}F2i_BpwL50%##PV;(PF`sN6ArRP9xQ9v!uXdV z%l|-H-@>KRKN!pc_A#6d+jJmow_($_5a%$CgX^lApGLbxr8=yfe;|=%wfDl8969XD zMfV!6?(Xq;*~fTkMQTHb;wecFn*(g|4%Z8f8n+ue++v&XIXU38^Mts9sFW7I83s;F zEMn6ZR5+HjC8&xrGcQ`qxmi}oYC}oyuIqAX>TB%M9T+E=@h@rST>U=qw7Q2cS9W>B z6$3*hwu%Q2&m1_=u;Q^qfYiSYWy(u9T9yh2SSU|t>?jg=Ge{^jASD~SI3zn<+z1NV*?rs-?zB^*|YrkQ)# z>+Cl)I&ey-;81EqE2r?5wak9U7jP;qV13YMVsQ5_8TDz`DjitWi@LR!S>=WX;=c1m~l zjndXyNySpmqR7Jr3=C=ZMKdm+lI-c}agpea=G_$i(oBNEZwt?bCgvcqhD(B8QArZF z8s;@K`n+&tUF9&*P}7m~-uvSW?;jg45MQ-{g>Q}ORYHLp?*SHf4bX8ac1Q^f*XzrFyE-1(f&^%J#P8nRPxKOgzZ2 zQbD17!T)xh>~=G|z{e99HDfMnMYyey{Lp8uY@ur4q^-s_rHg0V@vrvG#>S5l4BRT( z8#qmK8=NJK9vwf>aN&BC@Kk2NK9;4yAAGceJ{T*V{nJ>|Aie6ppm)3Ef{&*^%x7F$ z)K(&-@RM&5o6N2YGnz~p1m*^NR2)7eU)E*d!hd7wf;Q8N)Z_Lii~}tA-KBa-@)+14W@<)<{k%l^*kmVWN(~c&GX^Qr~md( zKB#?I#XjS|;_8e8%{~wh2prO!$!GGRu*Dc`BR7j(^PM z@BS-Jd-cy%Hh@KUdixaR340i_WcF2-&1c+pT(s?Ed}ov-^gh50*aV znIO5^{(|cB2gfedM>PMGXI9Dm(|(_aA*;~&Od8AdX=g5+GhNfnu(|)C{TjZ;8LXKP zoKICBVc=tqieT6-$jHAs)gkMSqIq9}tfs-)4h?>Zf6igg8$OHcFdnvYRM@;AQ$+Cm zg-v~e7b9D*W^QO;pUHY#h^4dk$`O99`Y(>6PrjTv(D34i^B!jDC5a8st0%~=x$rs2 z;UPb#^NR(RYdD&txc$`rE9(9HFCV1euw%kD#uxwo{r_-IHOGO)jDyK{j>l8=C661U zo*zCklf9|_xhgoL5 zVAz!SmBC`=!OPY~b~sAGkG3hS6D(SmmKVG*HgY&TlktvD!|LRO2EP>wY~TJlzUFW_^|OD@mV>4WtXOjxwzC*Eba zWyE?q`oSBPkl!EwN*7r7aL#F02+wOe#dpC>4!XL<|G~KXc3s<*w$*jgchOl`?Mn)Hpgt`3re>~Z4jm^*g z>%7dHd>Q5#N=Pg?Yg%xt@u_WFB2&g*--bx<;N^`wS{iI!5=G6FgPNJe^cAE6A2?_W zu|45>DnDuAgj-T!9u3;oKjtZ)xFlPkE-`E6!Ohz*%;dXpM#H$|rs9gr=MJ9bUK!H3 zRC&qb<1G0V|6F%{mwTAzajf0+!-1)K!Ugi*?2pV#eZr=*HTuAUBgOPOQR>lZf<|PvuUQal{rRvezP;*HC%LElRHMR>{3>PNl1~7}- zOkm7i(J1wOfq|pWLzj>T6Wj!sY-o&G&2sWfPtOVOI|9A>5kDHG9S;b!mtISF^ni=u zlG7m%n++S<-u`DdKXi~c?umgjpZJj;PL-t&(uaI}cs4}ZPuQzaJkh=Dzq54B|9=NB zNhPJor&(3>OA4Q<>3CUR|DR$0DQ>^h7q;-`^%xjAToO}WBFyalO`-lk+NT9}2@Oj* zXV^~gVmGp8w_3thQ!2vD%$&rjro4xV?KW%vOb4l(8%&r#-H(58^7V$-O%8>pI;Q<| zX!hW_z-HrhE5%_=isO>{j1D6wsksxx#8l=dJ&AXF!Zo>(aT^!I8op`fGiN*$WZ%rZ z@rj5MYhV6_&f^*{n+09vZEXLwFLgfAdGCMS|D*)AyC)7FV94b$GCH8;xxrr|P+I>% z$wzsi|2;h&8(NO)u3-Gu&lq&E@h)dMt5QsYuA9rf-~A8WGm2+3PSh7*t`SgQ`1`#) za}HZKgZPkea%Tl~SkSiT1fXRmp1HBI5O!#h^fcaC30t#kHUoT&Ag zP$at4r}dncvC>li9rcn5y}=PXdAiw8Y~%Du|0=)7&c)B2$KxfV*!Kem*Mzyv}9h@K`)d zt?@EDvx@#fwt^WmBo@jVpIE@MriT5v^_H#d-QG9en5+2wKm59~VlFF>)`v2CHji(P zYuOuq3fok3&8%d}Wo$UJ&%h~7_djUBzne32Ll>u}jl)akJDtf1Evd;F7S5-lt~gq{ zOqUEScbL+gBswSS-(ev+m0ag8wiBn!JUkrJCW88YM}?SG-WwPm2#ahu+$AWK^ueQD zO*-HoEAO|%r@StdS$tq&S1zjL(tMt%**lT3{8r-(=69!!43wrbdOTbBGR|nJFkdzc;R$lO-nN{@2{vMtU8`_Q-o5VUYOYObWGS<Pr;eI{LUK;C+s=O za`w7Fz0#?f^&bvedBm~=v0F}lZ0{Axr#0E(`OAh+jOP6E%q!-x@g8XSWLxo6#$eOI z=(qp=I!pC5E#--*JaXWJd}j13`;6JsI9KvAbE{`;Wjg84!*k(B;}!1>SH)gb?+!e~ zyo&uApMz$wq~yZpO+Gvy0%!i`(fHSTM0UwK#+e`a_kHc_WSnx}AxU9>^PxuO3N|uobi=IAzs0gtHhbhgBLnZlCwBRW9SN z{49h2|I-gdu2)(f8}Td6W%X-`44w&ZThptgZgtM%H&~l=B-46R^g>k$=DQ3gtN*b3 zFZrXcN|;Z<02G! zvltHY%Qc<*(DaCN;XnDq+w~W)Nj@q0XaAv1^F+ak96{j^U0M;!{Fe+8=093&a!z_I5b&Y-Ew% z$UbG_!{^`EAE;iui8_skckg5o<{_mW2 zPmuLl{f6X3QHC`Qt)XcP41P9?h$++`cr=G|?O`4v_j$4j2@WE^K6HuSieL}_cfm=< z%$t)>x#B6~C(a_qW)9~GwlA73{!d`*l6b)DqQ>@wQFepfgRQANCl;?fJResD1@sp0d!uCV{$G5rarxg(^Q!-Xz%Nl&{cFjeaepIgRZv4=$g zcIm0vOBN&MN&FHL356|l^c`2vbO>aBdA%t}Tsdg5 zuD9Y%#Je z2N{?*Y~dNILB~OJbqtYV#C^q=CulqFWB9scARP4DLaRML1epNT%YqL^E2}kq-MoC zR)3Y02=q2}*~{X~n~?vH{k%@|>9ByvukuOe%ocV39l!r{{&S3J@27sonE!`AnW@Mr z{%csm>9*m&!b`E7C-okiWhxJ_U;E)&vO%C!$?JBbU?RVc{r~o9KPS|1f8hvum# zawXW&zMKhT?O;2ckGN?B^a9Bv}+=-{`8a#s9E|QAOOBdK2 z>d7cScX z)17=)IsD<8>yy&9#;Em}8FN)#l7i5IFN&|z7Z^Hho80)&p4s-z;e2*wzs!{Fd@m9h z4!=lX*yf>>#lUdQK-F}j@gb`}JQEJFPn@~XuQBY%2Bx?6JB0r7%b#sCjdNIau;{;_ zHk-pt=`A4~*Em{r7PpvONjSaMfmc^-N$R{Fk5;iIe>pW5I6PW#PHYV$i*#(O$f*gA z&HoQbv(AXTd4Mmyh2O)#Xh9gugf^>1flVhQ1okUWD={)s5TC@uv!P9KM+381)B-*Y zX6B+}O`$LTAMBbrLx5Fj$s~sru5yg6u2wlW^@K0+NS~-Uaz;nPNTJp0aJ__d5NE@; zDau-*9kv^~1Rfpx?;$FAMBitFW9R=4HfEg|fvSm5BosvLRp$L~mS%gJd>f_3wr}|HkALl#2b+(8_WgZnw3D2`%%aWVe|k>TwV8+sh+5?=V0hwvq#|~Ke_FVYFEYyD1OX(B$qKQ0wg>GyWk0%RCwQum^zNFDMjrG4`uj!3C z=LpFICpu0{-oPfCb5luUZ{sOd4*}(J7J=qT8y>Vz+3xd!P0T}PQd?rL%M4qe6(8HD zgwL2@b$Njem;UVqvI-FuPEyx9j#=(tW;qkAVeay${ft|qRNaH8hYzTpIPsC;lUd98 z6Acl%ES~!p7&NtVFJfdUwKtGSd|qI%@GQ^aN4<WCwE=xRDSY_0*pE_^9?|%ZrT&Z)%PI2`+N6a~JhvhQA_I`!AGHw&z@@)9kEcmMY z%N{;&;}fZe>|d-=s<>~f@!yHv@8QSK@|(W0q}YEdir(=0U?sE2x}FbjP5&?WYPe+I zPyUr=5(%ls#uj-F|C)Kl4xVA$DY|8g_$F4CLU~J-DGkjT2Xr+zTn&+stzu)Vuw>dd zl}##t!=7f1d}9e%|>3@=%nlSHn*=Lul&Zr|`vRrpj3f6i^Clmf<0za}&?iv2tB?ZB!0 z89OI@>R^o9Zs^Fap)lEELPg6`OSLI$*PVE)cEybIMDBtO%)D{U+jcwUIVUAJ$TKwW zcxb5ecx!wVb=w~srtA7m)-N=`W<&Sdd) z!rfo<{qkH3d6bvL{;MxBV35;^U}re-_CvD|t3Ef2dEh@|1@ROA6L^((T%FL~6qo6OQ4t5$EoxlRXtw8o_fLhHazPV~6=m7j{kHLRxO|__Xy(jX z%(ug!;haYkw|_=5?>-mVh>3Z8`SXm75>88OV3RrHzd<$pzhJ5W^NNNR(=!f_ zIwr=0<|z-cz2e_-u%m}Vf5XD5)+g4U_;{irMSW2s*G2wI-5L)R%N+i2Z4@tKRbKJv z=g-gThx0E8<-AZVned@mWI<0ynx@jU|H_Z}#oQF4{~IeXC@U{1WayHgAepe8;b(3Ke+AhpkHc+(d-e!#TgrUxMr%0R1q-&H zqE|k$-{k*ftl@jWZAs!w2FsoUuBYqS*dnUhZt!pmMliQeWDMkR($*-@UteWN%KHF@PU-0iAKc{@bytaq~45#laNR>|IODbbYF+OfuZExn~Y5sC}o6te2dmA>e+&+JRW1cJf?)i<3 z`|e9zd(krG=7rz`GiOTvb7t>7(C%X7a4P3QSzEk)edF9O!aH0UpTwW=<=)_Dctrfe zW;Kb0Uk}xH*y!jT$)8gUvL;MZojbPhOKPw!bw9C_c|r}-v&|0Y7B-3; zonXVLz5HOQkaCt3W8uS6wF|imgkJsaR_B?she?3{kNX*i=G!v=6~liXe9h+OvXd#% z(Mj+bd&CsQN3u!wYjPP*HT=KGmhbRP;S~FVzZZTqS#V^EO%dF5UT#`k!b=vh>nGZo z7j5TEcq=i%)<>iHVMnM=&xc2xf&9h}kLL@nF+npXRC1UJ58UGA#p5z%O3Y^cnpKXZn_ zTPC(8HVoG8tRfX>HW*I<-Fq~x=}=RrUwvg#X0YIzJ&&`*gk8Q2HVh4SERM=Av~XfuIq~3$ zhK31TqPH@V9L~fvym5$&;*V=O(xLH1QIuCD*xAidvHZtjp|AEo{%NqWoj7wV|G~jB z`va%%9bCMaXTs7w8yGoGWM~NQ`OLafL-F@h1zGNv{Rde2FRZO!Sf*h0WJR6(+7}5$ z8(8==4;U^A&6x0^;p{ELgS;)hDu>-_BpdOc^*J+vPxFM{hawxb z2n&NlhyTbIwRZ~!ZCHG!$l#D)fBVi!j5i*pCMP61+NlWKTETFOcb66WHHV-5*Bn^F zy*C^)WMKebM8!9Va@*bDF_U0f$)L!-sP^xtnT%ylrYGWK=EU&$c+53o zTd{M)A11Ht7vUcqwBn9P@=o}|&6Rw^hJ72;C;O5%dBfXmt7lAuu>Qas zr@K~6p5Y(Zw3L~HZZVgtO>qCG_>}$88QzYl6GpBcR?WO3jqH;DoY_7vICzkuNJrS@ z-NR-Z9)bFVX}KpV8J{%%f1uH{^!I-WS^kdwiN+f_J}WfO-SBt$|AqgW&&wD&rg(!b@3|@A9g#2dx_ZA2cs1U|7$? zdeoeooBK-Qg)gjnrv;5a^?WEfe&mC^)bt0Fe%mK)>t~#$G4Z?tW1on@fj=#G9x`2Z zzwaPxnZV8((%!)4;J~bSVj(kk^^Cjqb--TAq}8Y!?*UFR;Dg66d0Mu1A=U2)Vhr9OqVH z(!MIELLwJ`X|K--J?gsWvf6uaPWS`cqkk>qI`TaoH)Ac7Fo?392 zsh)ZJhsHmQru~+tlfJi(g=Ozz5-Wl!jR_-4fBv8(a=cOD*%R4pCZ1DEwL zykF4h`6Gc)2@c)qA@dC%ebLwy&7NY=z!7~VFGHuRb8U`T2(xuxhG zqA05TBBkttj((A|>?DZ<sR`PyPd2og`Y4(#S;Vr@QB*Wz zrfp3a+bYgw^8~L&B(#WFZ(tIMI;SMM?n2ir!AEfyjJyLDrM1mF!3%?_p_juJMBiwoLQD%_s9J*oHD(=7FD!EG4@ zUQG|1h8i|*Z?+Q?Y_gUz@(FiXC!YS8n8-bowP}~^qlzsmy)zgaQ%XCcZe&UF%A3vKJOP=2Q|Nlh0p3@=LIqMFH8W=OL@oNlSqhRmkm)~X*lej&g z!TJ@?1l67iOajkRI-(OrrIs|cmc03YP)dKnjU<=2f4wU-Bn_m59z?Jm*FPbb_CSj% zqQ*!uH?{FLpYHO+R)wOYTtUpwj1|6#I9n+%*wR$M?;)G9Q|pCEvd7cI96OV`IV&3& z54q|5ZC+;nBFEOIpMja-$_v(~z6HNn%il>pRQGGvDq>sGW~aR6ARA|}N3+PC>c%pW z2hB}A8@M)XC-yfE2;>;> zO_3Ae&2?LHOhuV_O)j7JY>sk;-Mpm^Qv^@m-O#6}yoIM>YHEVr;rbs3xK9)=FcK}= zZu{h4UBFFtt9Yi6vZhZKC-yE-y|chbbV^)erSwd6zdXF9KP$HsZmo?`|*Hb-9fgL?G0xb&+gl}X`|7BOYADW&Zi30UL0V% zVdv(uqxp&woA$&@Y$nYO(`Nqr@sYVkKw*c@PyUxY&WC>6Gbdf+JJi-35B81%-vi z4S#;{R-EH~5*6jK$-S>S;7;Qq7NZMHXOH)6NHbs3!@}?K|95{BJM(AF9nBnk{t;6FR%V*A|G}>XsbEF4X;cBqS)gXbIkSp$1798!vE`UJ5S1==6T;6;`kdDi7gQ?J-{%@>>=~- z{}Vqmtl87LLrm=Y|NqMK?=ofnYrd?+yr?I^<&^q{Ur*$}JP3@C=6Gb6q5jK$QSC{F zUgeIp6ByXj%iXRNi5o?5dwXA)8u~x*w(Eu;Kfd#C*O5#Y9XWnv_E&46fxz`7_F+5rI;y=%ZgB}6z z9OM|KU<(ae59vE*K;?Y>5|GT|6VfkY#PKLM2Dg^(N=JjAGyZ z|99RMc0sC#(NeeZ4Fhjp4eLBnCOeUtg0spGq_TJP-ivFU!K=yN_*LNrgG>J3r&4PH#ax7D@T6IryddBCNqmM=Ap5IRH+BAMoz1y zj;^DWUk4Z869W%-u3c}YGhR$+5fKvL|KA?E;(~BO;^{?>We25vHk^`A5nmCM*jV;M z;a#KH!5)Fn2Y4+f$TtLb+juk1yXpRNjo|@l@dx|tBKU;NAGDb;GY2i?%QP`|dfRYB z=S&<2@2dcZX`7o5NzU?<5GZT-(xg?9w!}?lljR9s8Mch5gdhDHUnC_Z1MeJWc>Ra* zF7G;*nFm5uBY1PBH8e5`_HQ`$!#^RJL~=y9i(gv6bas+cn45v| zAEw+$hp3GVky__C_KMGMWW3VJ8tV4oX2_1ik`fo#6(klgSjsv*n%BvAP0(S-cl$kw z?AaBHzgc&FBdxJrei^&8Wh=Pe$#~O$f}{Ngmc#xZ?!G$1vw-@#fA@Vs9gMe5q$RZUi8>q-StLKPOfggHS@?>X z4;X%&Z;<%Wv@Ds;)@{i0Xh@{O}YEpj&*G`wPrurP2uT^g~k{fP3GV*V0&jq?qB|5}$8 z&af$3F11Mf(liG7tj-X-Mq_*BqPpWe;t^7#+3lx~w z&S1Dc+vi2D0oxQKF|!Sf>rO6gKK9^h`-L)fi{3+r#e|NX5O%n5O`KV$*Xhp*hSf?B zA5GZ85_YtKp@Wk(!lrQ&Z^lhajlTzP&HHeNbxy-iUYq^wQ@+(VzBUtM`*DC%`N@U2 z8P*9;@7KQ&lVU5dYE)5+*wb{yz?nTKA<1BS<7M+20Zy4yJPG9uiyqpW=t(Sm$hS&< z<_v>J;?KmM7;(#(_gpAqp7b^F)(M01!>6|XzpzW($=Gng_ooS!!YSe>_!peB&zWgo zWS7t)#bLdi({i6fn^V{vr)>fa?OGCwg{>OWGbAU3H#OX0=2Uib`IVx;WME_v8DUD%j(gQCJn_||OSIk)(3JV;h z)@+!VU7?iJu%dm&*%J&eJrw?M*Dm}>gMjo}6ZS4JtDQk{aR z;tIvnoH2gfuLCwQtY>8Y$q{zaVV!u(4R)yz#`%g2vNnw2aSH-##7@kMpRjks7A{Wy zD;p9U&gm&?S$6m*is~{)c_?e8Z0MFy=w;xL&fza%6G`D(@|o9D`Ts&=yN(hj?!YTE zT;^?UGB0VE*PydDndP|Rio#<&cB%jLYxFIyT;n~(q<@o2+fddVDQxY4FSf>QAUTSD9EmKVWTmM5xchQ^nHiJEL7)x(BBr;h)5sW+L z$Q>RL%Xpdn<)1}z3hf@&0-^sCj4vNB`Ndu{L*1BJ=k9?^ws+1ySkq=z!CJ=5yks-? zN@vLj?^;U*4F4SD(7ctH%D7_hclJ8rQ}t{W35rWY*)$T8n$~V>ep2n0v9F;;UWfnC zG$rRCyC<(ATr3&2gA>0spW?Z|#ePFeAYhl%yDJS>|F=$YUQi^y^DaZzyZZkM&Atky z6D%CxykSAxhyI0z}{x9;;9g}DLaxIW^sSk zUz5?uoAu8<%9h1*@&ZSxCnp7F96gcL@rh~EDNd>BJUka98`?2* zgQ(2{M%@oH?Jg|+x8WD_o?4c$?atQsJ03Xjd}unvDaXenVE)(HvY%nvdWnb6;|z=( zK3QngB&3?GImfJ3JO&C?2=nps|>VdDrfL#s~85H~NJbI=yzts1~Z#w>t4(=R&sQ z#M3TUws5a>K5(1+|NrK^Sf_K}Cp0>E#DbQwFXeO4RF{-|@a`Y~-K?gydrvX+hPT9h zv0?D6-eB?Pzx-OA)Rq=O7m27khr`S%W;qFr^OF86^Dc0H9a(V(wWr?6G?1n>XAES@Kv`ZKI0BsYpN@JKXdq`GLO9N^^=l^Th-T#|C zZ$eWJQz?tXT)hBSmN+x+tSJVL)22FcNt`&jSi#Igc10uGs~Cf3{>8~@47yjJJ$shc z5bo!&xBma%#*nrL^O%^unnms;G=!G)OkiTV@{u)s+ke5{a+ib5iH>Pi0<20NA}P=7 z3mE_M+pTDnc+tSq)Ns`?UH0I=MzL8ZQlHyrI5S>JXwXe}@=NLYz%-9D&ham!{FLJ- z7-p_?DiyzSl*h;COu+ubTv0P-2WY!bsPd5H;N-vXMtg-K8+UMlve*qvhUG#T&0H5X znnEikoRWK_A2FR{Yg0qaMrKW!#9#jpA7;L^qInHN0^|MH+|s=4J9)+A{x6i(`f%jR z|Njp@G|WEO5YfjQ#9#E?KI8Z_&RZY;g8T`^3e;b}Qyp(w&_Cbq1!k7IurH1`1N{6P$NAcrutRXxwUi`oxI_p=B4goMB+U5b{O- z;)I49|EDwN$a&Zs{E2wbZsYWrb8SwlQm_y513cdg>PU+iCn&wT#> zP&VvJ2}|I&_xiVrLNYeB@+vt-N59?4vS|S&N8}H*` z$u#Mi;zus+>k4(PQzIX2Idg;~?}+m@mcPyBX^E+VIx-Uf4u5evb>;v6g-@B7kH~pg zIj!0ynebFZdCxxPo7|d8ilrK7au--hirjzTC#}4sr*X>j{}Krwo8F{H>~XY`?70vb zAM(HHwfF+*1MMD7x~#J~^xGvK_BlSOyrE#Op>sfUreINnf(?&^Ld}INg$>#V&6)qO zo}c6NCON@DuX$hX&m$j1D|RTJ;D2Bw8u7iEE$TqsPyWu#4*P{G*>`=B2{bxzN#EqM z@t^kN#y-4@&N$3{$=><@f4jzR$ps%7y}mCnEpC^4t!v8|w)X$~+x|3|jqQn_nXqsY!+ZHHaV=YQ9iACE zTd#ePJH4mp!MDTqFRqzC>0{dA^Y6dBodD}M?me?vS5FS)k7hmowEoIkBZcA_GZLZ? z{d3%2?s)lGy~}S-k#iF^@m@T}(0TBcz>TgG^ABukC{S0vQ~RL8N$c>#!vFG*KGoO% zH$L#~nXzK2jpMI`Xx9U8dE5Sf(9QV2@TKgNMfDpZfB&Dr$U5PQe8z4@6GK)b>5%8m zr$jxT%TMx`c<}7t4;~GMOI=MrnD^AkzSwsE!CSiv8`4u)mWxM3GIJ+C`6N1Rd17Wa z=hEa}lL_DDr`ap`H9U1M_{pj}|G(4rc!xv6kJwyxp5oxIirCaD`uhLBf6lYM{N^t; z&Jkcv<4X!)z9P^tedUK7&Or8Ze&rPF2iwojmrVF-((;d6^Sp%MM}8xwW&B~+4xS2% z_~rafomsD;!;GzlVdv%(4yp{r@`3ME4*GfQJlGPl%;|lDp#juxc){ejS%q4fGGo~(M3fX7S9A&AD4I7+866z%dW(o%dHr`>0i{f6xBfu)|p}wS% z{j<2T@|w*@8SG1CqhyQ?3>2)&66RiTk}oq=^x=6XHz9DsOb@n#*A0S8otpDZ8=e_Q zu(E&F-l2S)=O$lcl%Uh}zkl09rfgsmO;fK3k$lCjwq;_p$FVjO<9~{#t0W}_n{6H( z6m>fxl>CHAGQ}=MfH}zWz$JbSpSr(4jxpE?2!sea%zm<=pvA=KztMp-`-Eo>hqw~O za;`{RThU~CLqhVwLe9S66J_ilHi&639^l{A6#BrYr{}^!F%Nc@Y4;Qo8CR}wm^;b- z!dn)F|4vdR0`|&U1|GK(9I|{2l}tZ9e93z4H_LD7M^PRh7B3TxP@X4vYlE|XoaDl0 z*)u&8ZgNLtKeAu4l{xQAvy@DS8@E!5L!OI^sgF#Er||*l3mbkkw5V;0%ecwl|J|Yd ze{<=fnGzGMnGIrnd^R|rQb_zFT(LqzIAb<H|nPxbWMA~z`MeclY9ApkDron#MnG$vPlLsEGfTX6zd_!U>+?g zFgGFNEBD-s%%+oOEMyi~aF9hU;y8nZ`vyi`mmiL&tR&`3R;62N^g4gja!!(eBfn%5 z<6cFs&)iCD7N$O`&qx-JdExL#F6B)B`FM!~+W8VQClqOK*^=18Bh;v(PWQV6mhInVK7eAPE|e~+^G zE1!5NGKE7RFX_N7i{_h5#U5PA}M%=yK-W;X92U{0nNjUu;pFR%*Q9 ziF?O>#iy)`*0lX>=8P**{PdyT}PYjVOp^x9{h8r5153so_ji^W_iq9+GU{)*V$` zhLw#nX&XMYPt{fU`rxyG#LRfj-cxO_u}urmtXh7PA0BWhVU z3Y+#e7AsDQZ;TD~NS`VgRQ|vHH}|D)4NLXe5)>J4Z~M$|b%OuiW&YBMO zoK&`orzh(}eos7|Gl56=%O6FL2*qvJ8|M6YFJIIy@ND+~51%+TZDKXz_$8lvfNh#y zUESX!2Uu(b1TM8TE{PUY~ejRVvGnLiS_t0s>3lD^qg@deRLiQONHL%}5a8%nw zzwr(GC&jmUU$%+e@Ln+Gz=4h^kH*hm>no%jr(EA4YA|88n}oy!ey&s(t>p@Zoina9 z9c5&`aypAc<3VNY+|cLN1RH#e7= z=NxnrRQwcG=1Hz#nsB#MO8<#;|Eur+dA_jC_;)~d!->4V=N;;|A3DTVxq*FBx};7QfT498CkxFk1~2ux)B=P0c^flXB9-$C{RjMn)NW-287V$e5E zYb*Jv&|AoskuLmb+yDQHn^gnin-8;D>LvC{7wj=KGB8+FDwbHsdQw5kX+oROq3{0> zN^+;@{rJP~rdE+IyhMH*6Z52Y#g}qouQzzf+4>qfNE`Efu;KQ0=i!-P!~RJ5Y4L>9 zl7e$t)FPC{MC2XX8}G2rUYOp*7t!#CXE$#X=dK#rCwvp^71;%t_}N%_c@D6*CG;v} zoJw(7;=H2tfgj%vnM2j@LA!c^g=$N?WUO>qTAKCbuz*~1K(2F8xz7Zg9~7F9Ign6QP*Uc9|gP%~f2e1T(P!wKyP z2OYw87#~zKR65gk<6OtJK!+XjVsamf1n*cfs`?(8R~2E^lB1o_aDDFvH@Oo$7v5-9 z9AKFB&*5Lo+g>*QxQzzNKiMC}yI8Uo@tYiyOnhd1z*=*|Co!RO8;Y2X92i#SOHRDS z%=6(J*BZWm?OWc+U*T-ODrm63`O+u(7p1#4d}w0T(8+baq@i@z@l?_g2c9Ckwj+$n zZo(2%*k&%cz2U)IezyY8!yov!WijqqBRlE*|0K&0-Y0SaF^#u89x&P#%;kQ4ruh)# z#N{(*Brq=*uvTDf=BU2Wqj%!%hE4{TxRi$N_6c>(Q_Kba8hmg5%wuA|dBY}WBR*#4 z8dedFp8t;9?=<}0(ldciUs*Zn1IL`?f6A}2*w|ctwLTSJ!&?~;)o8jy;@@HGcM7%} zcKqi*d!dJ?!-VN0V@eZ)SonskG7Cam{yVNto+m+m{*w&ploVgJyOlHjs(v%uT%h}p7})D-R-MBHas_S}9?oRi+< zfYZTlZXtHeLJc#U{dt+K4&=&odAYGEi5dy8pD5CnTO4@y_jv;W2GgvL?&bfPEhHGY zls&v!Ca5fxwqiFBzWRoFDesprjJ=i>iDwuzWgKRTshcp)g^!pTR6B~ki{Bva@a*uk%BDlo ze=mr(#4GeQi9UJ2yg@?2Q|{7^q=q&|;U%$$8CI$!B(h&(FILx)N&IS%a*X|vQ_9y4 zgXWNu4Q`SuJ`QEhX~}{QIkS2Gq(5MoXK|Kc?TUqbO(mZsBp#MWI$P~{psAd3tLfOy zdbTC!xQ^W4ur%+1_U?awThr(7Kd^V}1GcyIE^Z9+8(4al&p%+@J#(S)bpyiyE7s1& z^sE1k8{Xe&+aW*6Z{lBm&+3lUg%2+L`!8SjUSG%d&+qU2Qqu*}8y}0TR6ND8-bGRL zVSK_Z*7?2+ce)s6|80DGvwbG3m&XK?-k6YvL+patWR#_J*fN zV=ha?KKAfuJUkziWGwd`T;%Zj|Nmy)%JvrX6I>CCe;?nT|KPQ zxf5=3&6y>k`0|1LC!u@)1$H~89g>PY^B~egP2_viBR;d&99+>i9!?CntHIo+V0|!= ztAwvY-i&$CMs7PrskIZ?yyPDgFz;l2A#g!JPRU*QDzXIR(F(&t3b=D3`<<#mn%D<icz8UT5`Ne-zi{*0fy$Ma_WfBXF zkDSPy&lsd3w&gV>rgDJ<$o|MN^R`fGnh-eB{;gUaGz zYz~LGCe=AUY@L&)@b!iLhR+A{{+wr68?E@P>5@*xF%hW)|Ns4CoXvkq{LF=40?*7Z zJZxHE^hn-ju7T1{R;gM4{~tUo5%$gDliHf*gB<2Lpy4IJ-st-7B0ltGz! z$y*jZ>3@gWWF-%L|Lc6Je1-JFubetI4?eQ#^E;&K7r3&%@Zn?g@MO^nR(vkta4Kbr z(d0(PdvT0g6%R~~-q6##RG3ryed0^@B_bj34!lyBuwHO((UAw7$`%tOBqxMtI-QCs z;AqNiI^lSV`ALy@=~Eq*{f%dmo7PQhJ|dZvDzr$aVQEsvPOh`7PP|R(9a}ZAn!-_)Zm;+6p^mvSU3?$A(vueaMevo&6VWcD_ zqQN<_k?~$)T1v}Vtpj`kNiLEvnZ;%PD|*j)(5uSE)>G@ULD0^_>F4nSJTXjc^CMZa zT4GKz<;6M4a%ZkO$fd9%Skj?4`hw%i2dUBj1x3a8EJ#U6XfSnp(0aX|ZHu2$(le>KJ^_4s4180Wil7$C&ZVI32m?E3-j!`$Ty_L~J>YBz+ z{yvosHjn4;K0SC^@gUN9Mzvxy>x9($4Vz^bykxVp?wZ3k@h`Jy@&>+F_Ahey zU!-Jii2mn%=}`WQFwqHFC&Z*4)RiS9OFv0>SeI`_Hq1kvW4|IEz(TIc4=Z`z5yj{x6&> zw_)FZ9*xzO2d;BBonpRlO*6~$Kj+eNZnfD~0ZpgTD@UynX zj|Aq~E9x3dzc{9<>D+tpQ+!sKp!d{;viJT^uxKw|mH3d?xBCCWRKprkmMeuDZ1_2u zpQLV|z-N0xV#3UX?FLPsbeSzK|7}lGaa;0<-N^Vn%lj_}KFR5vcRa*uIOFsIhC<_< z21XGtADD-|6i!m;Idgh1<;ux&AJZKlzVFcvODrfB5`)|AR8UoU4k9 z;@DbslQ!^K+8R4u=4EDUXfe*Yz$VhSVVjuG%m4p3d{dpkHnmh?vxG!Kq|h3koi*)i zA2b~mF0wg%+OVKnXo+YP-=e4bEz$|O%xo)cdnSB2dgRCl`7E{_KCH3ZPxR~%<#^(A zgK6pGFvt$QT4^I!z6}FxyJH*?S1J3?BZ(zVM zMK8hZF`s_Q_J8RT8rz-j{G87y`p7%}3rFxLc7_kF%F4>eJfxJBl@?tP=2sE;r);&t z$7jPc5$1~jTEfaUkDa9sPw3NFWYpNB)nxsA!_2URr`$%66Q|#fQm+|g$sf|D=xpOe24F3a}Uo3FUC#zvVmp?q)a9lv`!Ixz$eeV zW;4Gbcj(J!ca4;m`Ml-vpghHzBlEcT&Fi0-Py?8!~TY}$Ir$_M$5hhzKU*c70ZPT9hy)4 z-eA)|hd<%jfkOh5(j*NSm31yU$S`v1yDe!Hj;M26BI>rGdd7m6vlvxl1jQWg^mRB# zRB~ts|8H`Z4J$J;P`D(gQzuZ^X&`#@ze3=XJ!~J9U#RhhWk??B5Lzw}JmIyz%VYT< zchG4$mn@rZa%J~8XQ)kCy*1%?(aZ^_LfqU^_Ai*WpTqn=d$_TW&jurIC*>bJ7mQ@K z%;E{UuXtR)#@~=x<==ySzxt!%j1OHtSI?IAQo|0J zB3p)&nqI-lS&jgVlz%&^7p*YDTX zhwCq-Ffc3Mi3vz${v`cEAtr!}eQiQh`uqPYDj7Fjnj~nI!L@2~!tJ{Xm5fv7C6t=1 z+0(#lb@&xiL{;Nb+b18`e~Ol6+3WQFbB_AT#^rqDjLDlAA(v{FS#FNaGkP|JI`nuj z@9D5;TT}J(e8Y*=JP+QSVv+ummeR0YS|C$itUN&6*y)o}#siSgWSK7UYkNl?$PJsY zbAplFGyfU;9iIJTm0xo9$bm!WI>VkhTw*xlcIB7Ylsf`Hr#CWAW0RB=C_KR7AKp>J z-6K_ zJWLK>9IhB1R9}^FyIn#1@PRA|g`Yyt%pzvb;9RMD%t5K)sO~Pa8TJJylee}_v^c%c zRDs!)aZ|Ntk+GQjf?t2_4DL}0?ben;> zg87Ps%_19`BxHViOjS*4`(V$!>Gwg!lN_3F5>8K1Y}HZO;~*-dEWGC7k(P`vf8A$% zme1l?B-CJ5CNWbYVEW2KT=g6HB@!AqGtES=ME?2tnf>s0dHVyG>>D;SY`8psqO`{Y zE~Z-@Eum8X7xeN9$QKIaJ%E5_Lq*9p^~pA{l74I(ZZ|=k6BX8b!-it4s**m z{TJ+&+R@%H^?H4VyKtDLV)&*BCOj`=8mwJp6wOmW(BTlNkIOtjnRN+&$pW#8Hr9#@a+~HmewQ?MvUW81 z-)#Hkzdf^#{DDh`MYGtKs@^!unNY}fqD#Rgs=3AVh);*ciiupOwl8QCQsH%c#3mxQ zpiMi&jMt=st1b2sc@+$m{vqE(`!u~SjXhlgi^ z^(V*GLJHb;4uw3P&J&FIOFk%6q_S%8I$f4{V)Ch;XTelagXfLY@BM3k;(TG#`TYC) zn}Rr)ZFC*k*B;1hdT3v>U+=_;{{faB>>Z7amVXj+0`57SIp@sgk;r>+|An>MC!X?H z>~CTVT#)(pf4zq~*R_adlX;2{`GlI!#yNd5O48=h>HX6_J-4GzRHxs-f&J8hr;^Of zr?^<%++6-R|7nU4{VabgqwT47z@COXOfzq$H}MN79AYTjeZ;tTjKuIBi1--{ON=6JIHLWTmy}3$~wG<+N=ea3q_d4dVQtVna3Sx5W= z^;!R$a}9s-pFZ}$AlYTLcj7~Kq4cIxjc3}HO#ZKtIgyc1;HkPro`gb~!=ZM@xJb1<*5Ea$)D^gQQN{2l)lO9hjritq6G!@u(Of#1*n zJ6|>p;dzpG;@kQ8JR5SoG#)Z)w@5Dh%3=H^%8f1JCUekP4*%&BnEe(1G4j81V4tJ# z)GB2G&op+)g=r3-nAhYrKS?gI6<`Y;gE7=bZHa3-hv_rYsfsJE5k*LPmU> z5L=jf(`V3i=Z?k;UiNG_DXQl2o8g*Tt4dl%C7)mLiCD&#+6_CHf6o(4Vq0@3Ev03v z<%QP@Yy~#XuPm1ESt=`6Jp22<{>H+)Jpup!Cp)ll6e}`Ib{I)ldJDR+tJpg|>XNKd zmazENP}X=!YlRQ%)%6QDxJ=>vFL{D>gB4HU^u$>$Z|e4ZYna1$xI)A!>9PG5y@Umv z3b)R(G1|F7Po_9R2L#DRAu?4nCH+;rVwx!|I6#z96Qc76BMl%xjP5Z1g04BAl_ zK3N60Gj5sBHRWOC%?4w||Bj1$&phB^$v)8}q?O{Soy2K)WbK64yB*H8_MUOJV(4h& zT5_S$G%2A~K8e$2Q6R%tnH%pnOsw=+$iA67ETfs*a)H&A%fA%oI&7#F$o25P;LzqI zwd_PQ!-Qj|OO%?g7B6s;zZRM1a*B6Co3t@=(CtpfXJs>XKVW5MX5J&n$mM+ElP?=v zKq_1E;VXyMG`zjv{LwM(Fjvlpg-!>4u(ulKd|=*|!Z#~KVnTXbLfV0}Ovh&qPb4J- zGJ6D<3Log0@+0A2V#6MjEv%=ID@@z-`{@Gx{=Nq}8 z%&5eS^_kiY%>y3_5>p%`S1?7f$T2jPJW=?*xOuhphXW_%*#e>%@5l1mI`A4jV6|By zv?E7o&lIs2c@u6Yaxx0l^E{AbyD+uvLG9E71}TYcIWrmN%QK`jhuJn<`SU#I53^7>62>4Oq&&N8ueHIF`v$H+02xh^!}gW zfh*0ASWOfdPvt9Yp0QxFyF%p&9f2jrJ#(%}EXZpJ&C}St<^ROT@*@8xG@1lFXA-G< zup>ReL3&D)NrYo0^QJel6ZH->uLUir{j8X=;NA7}_aA8UI=*8yU7>KguJPF+{s%5g z7$@x95FMfLR81vEA)W0{>v{!-pWK%IMh?Pv_y7ODp!djso&x*B(@Ks0v_H@HxaD+4 z#`%nMih#$>V;vuU*R%cD7v{Dislu+kRZuvIVd_M|iz`^!jg{9FH%R29Ht-!eaEHmb zpL5?S=1ZB4vCG+l+T;2Z9!=(yGs`((#l3I&+=+r~ler!@Ka$&erm1wvzk}!05>r~< zC8s$VG4Gw`#uMdqip#^2MN?j|%=r%QH%8{HJ&u=zb?g#NDqIEEcqFvU-O1qDec~&V za+D-*w`0Ve<|c`lbH)zqUM4fmTg9)pUqUghkxl8~OVKMInRt`_wa!syndQsc+03`j zIesV0xnQ3OGvnOc+(iB>{Nen@xx=H8*WlnCwj!f7!d*5TOkRf+{!Z{@JJFcGV9$v& zXL!~xcF1gOo!ZK{Z7OHXHHOQ7_#ZS_S^wB@>;H$VX%kF(Ud%Z7sxYFe<%wj*t7Mla zjuEwNQVguiUEK;+Gwji76x?z4<#+i957am0q_(Z=V<{Js6sYW++|3;$*St;N!CNB3 zg5mP#`}29u=)8F_`MG1NUQVcJhPhpZ^i}&4W~=HCmGF$+3hZ%B+YOoQ3$9b=EA@WS278u#4qVSmPQyM}2JtubDF>Bn57Y86IRhZEa9J;V+Lj zb4NwPl=z+=gUty~C3R$-FX=FQ{bZ2-)4;Rlz^!&3o*s|pj*d_%g|!cAj-5Ebz#Xmj zVy5thntngy0FDW#jU(uHxvVWML zxPbA~0{%6+?%d{ratsPeIv1uIG)eovIM>Qzm$FU5NQ)y&#K@6^bSZg{{MerZ(4x!pX=}E zKj`Awaz-*_;=xmXYH4m2syszPDUv4K%sEelu6_8;KG%>n)M3FX{%tngF3o9*2cktK z6TA;?)ZgZi%iw4=^@L*k9f!s#trK$iKe6rj%*m%0u~<&9Y{N0;Gy6CAsVGN1=dro` zMcyo_KjIr#c1QCcF0*FAivdhCSzqsQ;HnMTZ|KA5^IB9h z+?sxdC%X3l!|MoTsowgD>CYq-tLG*527Hix{{O$Rf|ig+>nC~DKqre0U9%e*FG)0- zu5jqhjkwcz=MVqO4~8@B6J{%aRrLOS%;9QRt_xIQQWO~=&@a>1A zw)q03fL+a{H)bxl&G$gmh<(E`W{oqB%!~^xn&m^j z@Ed9K7`3-HOPlx}Kfv+of{}u$&w{x@1yRhmK0be+&lZu+AoTBo5&Nup37d5lst?vR zuD{W6=2O!rp%rHyKX{OGVCr$jmt3>#7CdvZx|ASU!2DVM%G(7sEYVRs??en8`2INO z$v7toi{<@q)Sj*I{YSI4`vFFag7%hH);kSNyvq*VVf$oW(fP05W3jM^%mOysjIaDF z9&+iOZhZJj{Km?LA3yb(SLm>;En(QrYvRD|%dGG_;(@u516!ox?PU@NUh-WLWHLSD z_)?%zS+~1&imbr?LvPxac(>e^2sp#?Swi7m>oN;9H?}86TyvJsl#rZo)~!$7 zW6y!GYKKQmB^$If&NiH?V5^Au)4aazC)=*?@>9$f-u|2LlqZ9sRZwc#1V2UP!}c%U zSZmBX@R8p$jOWBtOCNg=-mZ8F!JS|2P4+xc>X~4|&dJDD5!v(Nf>G1a1F~9dC%DW` za4Eh>5Efo?&NXIgXUIPTr&GKUH@ocw4l?Mk7D&|+zG5>$c7e8&Vza71@qwSx7PtB5 zr7-fA87`Q%Tw(75$*=bh>}q7(a-~CXQl3Ml^qgf4b?Hp=ck%D^}Nq)&07ukr`77?A;L#KRKyr`GpmG)@cvR|N5TI}44G$X@<>%O&jiK~SiH@0ZF2cB(x>hE&%JV*ZZ1D{NE)*2=-Zur7|`MiUogIT-I zX35TC24!Yt=Cur_hgh!m{O4h2Rwz|pV%uuHXTn`82{z^fm9rTQRUFoC;WQHe&cHCS zuw@NT)Um|VVF`v)+>BQg^5mXqly*D7!gHIMPwPp-=`#+jA}bE0B&Q}f+;!%A_rpor zX2a623uZC|I37E9kZ+w#9mDjn<|7Wg90AYgOYUl7n8VW0YMJp&>WU^qY1$1-ivu^G z%Wo-SH#MfYf3k>%EjXt6Vo&S^hr{^~7BFR)$Qv;qWSW1q z(WGHULaopegQk*u7p<3{V3qLE_YmHZklJu2uZj0}f5wS_?Q$nrJJ~&$*vk+7JM8D5 z>XbFb@rfgE?1X5=Rwdz*_mA}1u3Rj3No(Bs`hWcsKl3C8rg@1Hk`I@^XzH$TTT%O8 zQIpMt;q%MG)f;R#uyHQge6T^tt>E{9sfsHuwTL_ssBacFG?6`+mVBVj?d1Ip?+mv% z9%h)C$~cqxwlc@*FCPx_dL%eM<`lZVA@%%*6V0VJ6xscZoYT7%6B+Yf{A-R8W(ne# z3`k^=pU3K_?{HdiZcs;605gk;Gq2a?`UUMD4yNt;|G#~Qw3yg~5-vWs44DSmBOLq| z1%HekemqEM5EA%%p@i{mPowo;p8p4<;}XhWHuW&?BY!v z=r!j3VgJgUBfvaG{DAWE1?SG$v%Sa?@~~@Ib1k9C?4Kg9>V*4}6E2zT=xH?DaPT9K z&iXp$>6^KbYnFZjXCFUGW&DJr+|9w*E5%z(#I zv)m8N70ReePii{LX4rUIqrh2Y1)qqPLb+pJu7gftd#Q%wEyrg~{NI_i*h)_wOjm43 zd)APy*^rjuSjdy@({y^{{|Rd9N7hb|3=dH67LEG$kC9KJ;Z#I`Ps1gJ9~0czUYuI~ zf5KG01$-LP8zvv%+84<*Ew3?J{oet<)V5YZZswF}(uNf*UaAi&Sl4}FC{1w44{a63kuJ7 zT*+*`!K}&ckjZ_`vf+i}oJPh?+}l>Mi*28IqNNA??6?cQvgD+4@A$`_7yFANsWLXv-QP;lKC2UvX7+S4AC1|G{Vk*kG zYoBqG;q@H_Cy7aX4v$Ve)#%|3Warxa|3Q^}NL}Ntum^qWYx)vfjtH*tWj)0%@LNGP z|3ku^dXKA2de0kwGKI`;x@=Km#1^v7flakB@gU3E_J%yR(tnAS%r4HSLfF_MZn6k5 zuXSL~RckQ9jN zWa8F3_J6|Udd0;D>krHoyl}55;Nj_W=Z-O0ew4Yy*lzktQSdm+G-lCx3)sYW1fDs; zG4CnU*-ee>n3_aF{wplM%Jej1!ne(bxhg#lHoTa#xpDeh$2;6ndB@H$-BmuuvC=?7 zQm~F$RUqIXch;VU>ED^Sz2x%pP6*j&EM?VIKY03;!&KWH51HRQXwc%hutt1^F{_>K z490EGIh_vkbu;Q0{^owY$06-?;@l(k7natX@DzIEwWLjW%|#CHGbdQ(bJCdBu&wy0 zU*Rdq?e&~v=SQB6>_TP}P6-}yGhuPOc!p(eY(wl}mM-}d54hGaHNDY)_T&lEy^H7h zc2>`1yyU^CFaG~L!}=YH-yFM4#9sKQu6V#clif@F%!bR~AM%E7c(1@~!SGm@auIAhF?GiJ`%P^M(wr)+?Aj!zEszdX{O|B+g48n11q1VN2M|s8H{irV#OfS0NykGx{Ubq~E{Ah59Dk)Qw1& zo}}UU?+5$5y^bFa)-{)AEa()!R>@fU%JI{JgXR&3x$hikUe&%-e}k0T2?jwO?dCf? z(l;2MZl1qD)bv2X558Mr3|7Vuo^ZJ_(7sn*WCw^0qKs zZ46KQ^P7EM=&?O*{Fgi!*6(2~i*hJ)vSOVO={KR?Ayab8cDYSb9gHzy4Tq&e_ztA+ zRqSPd!pF16kmv0C1tyHy7Y-a^y!L`^xp>A5r&IDC?gCdLnvY6ul8Z=Zn6zACLYhM2 zPmXH=th=W$8tq{4OkPmLGH3e?g=R*DV#jbxC#fqF_+)oXWYy}IRHzgxdI##nrgIcM zxL$wafn3429@eOHjk#$q@75R^G)(7b{w!uJ%w6$KB*nbKn&U#=jRek=O4SrszBLy) zj9%-Pu<|Yu=FHsFc!_I`A+KKW%tYfG9jeba6m>T;2H7>Rr8~alzH;yZTikQbQ_g2T z%vAQMV=JHIusQjHlh_k~4-X@Q26kF+dm_)?ajfqko6l5x>Vfc z?93>zJlOCe&f&D?lMT%#^8}y1s{f&*m=hp+ZAF>`(~MLd<|}$FN^TKWzxhx8-w^3t zV8u}SqM?xa70-r^n~e`_^E$Zg>!0>erwd1zUN31ne=Z@VW%oz>EgyR|_!WQlOcb0n zFX0`_XGw_%TdmeK^N2CNd;ObVc1QD0Nh>c#OXtV@Iq?=tl9{w8E2dtz|BxX2Mya8XULR?CBp5S|={Cy)#yqwY52R20U2u>uU`F#L(;XAP%A3vL^c1h3xGlHw zl);SRgi_HHVHJN*bG+-p7JM@oXm3sUDHOBqfAbR74b>77 z5)(cjm49)HIp9u1+MmQih9cn|vcKdnx+OGh^_Ea*{=Xo2ts}G824kgv&EfhRj1Jsl z7uasl{JKs;`iXVK-9PfT%$klG=XA4r$Sqd zDAtfrl$3fB9w5oPQ%LyAynja-v@Sbl3Y%0MJklZYre!Mk21kVs>jk$R{yE-SQ?UPE z`;~Ho?TWhvW0w7Ezt-r}p(}9WDeoGe)}Ndr-*hfqwFiwUu9lIUaLO|xwohZe!doRa z9fr8DhZB-rRw+xaU`a@ulw+n`$mej5o5zIV#5?ul6(N8BOR}*wylG8Hx_lr(hKJ#M zucV|Wm(#J14-y_LCJTHsSlaUD*MIrT0XORMCuln^zO#U#UDQG0^MmS@ja4%jhA%$A zCF%0;`+UZo2U(1TMHtR}I9#KUrO;~pra?a9vVdvNzozvT$!z^Bn>RVEGhbzq4=Rbc8=l}NbDIErlma;aNPcm^D zPcYn2(UKY#pe}Mr(%qy>p;>c9ZKrf zoI=f}^Bn%M>c^(El^k=JYdhh;!{#LmESgIC8of6)GHX3>T=Spjf!7!Lim#m76&o1B zDi0od`T4p312^H64UIDyO9X^9-W=>b^uNPc&4D+ppq(p9Q8C?kLU_WT`3Ls4<{WSo zoAC2~!|CNackFoZlTB>-f-c!B3XXmDQ%bmVMGkPeb?o}jv!IP3qk(siYy;z^6K$=s zCvrY8a9G4hK9n_xSS&ZkWTt|q)HWvOIoBKNTJGxd-m>P-n&WWjnf#9no^p9|6~{&F zPOzBpm^84hdf@oIX|uDxJKM`<(<2AfEt;pTa{g?oVR%5waKcsV32vs!CDL3;ZE{og zC9Y1YYnGn7piN(;$MCe!gt-e$7-q|+yJTxLvj15S9Z~o9539_dM+paXoF6XLwmG|K zntTt>iKiSYbN@5*2Q}VUu$sqlv(<)B+y4ui4K^IJJMw;kM{CIo0q;D;Z%uzc$QORq zvXE)46b*DUHac)Fn&IT%*0QJz)>|LkGoJWwTk|=UM)OPDqErX#s0|D zB?^`i^H|Q79KLh(+_^@hh7aPpZ=0>2Jec+Le?8lil3)Mr&*YqFP+RiGag7Pn@~R~+ z-7;k-^4#C~G$yfx)iu0n(Me~^(`LN3HD|%W01rhTzv~kkbJ;$u5EL%i_MSiEgY=8K z8w?B?3GLi_{Qt`D@M$ewaqubsh8V{@=7uxBS#-iJ8&>~uU~Y;z(5Ny&-tqL~#M?Fw znao!nGA>ng%Saax`aZ$tTt`TH!(+}Jrx>OjKakGDm|ipSG5eG73kM9BI3GX3;BCC& zD%*r#JVDd`yT4k~bn4;!1H}vu%?BTRcKD|#dx~T0e9_$1%x7XZe3F|s{oh|_o<)D! zr>%VOhiz4HW7lFZ`FOKsU)B#fO7 zb4`+-a4OS{?Sq!ylh6GLxkheFYgql9v+Xck}AASr=#86rp#`Zn82W6 zlUT@ls#(Y5CzEB}f9KQH5wT27CX=pX_y>*%;AI#n-Jrsy)LuQddyMX zBFE!U&Z?To9DVkT!2t%tf|lEg{}<%)wmGt02%nWyEVsFDTO9MocWvgrl9Cb}Px-%` z_|JX!IPYfeDQS+f*&fYOmpWO?vu4aV&?>KNoMI`Wb69D&;HEA8tU4^4*|&*L>lD2B zu%X0b#(`Xq2v+7xEJfC9e)4HKICyVx_~kHJ?7yVq@7oDeH9U+fPRcPaS;UYU@ZpWX z6}byOk}HH+UI{c#i~q-{C(LHb;LscOUNjB_$k;%{K(5-ne9ZVUo#(hnYP+ z8ycJce{j=TGLf5eX8r#K)vo{lw~HT8u-)J#vGYNCL)l`7qzzk`UY8uY!~5=s<5`y9 z^BHfQWcoF8GIP;gz8y{f{`0?+OS{onvY>=<)>M|AtQl-6o~BP`>0CJIc>n(Xl!T{G z80RzaXRU0w!xtyV+pF#7=Jvvur-x@jWDcWUT|qNj&0X0ojU3&=8>AgX)s2P!6zI>0 zmt0^g5TVNMB|Skh&g1O?F8dzNi;XO%5{bsi8=l@+V9;p#ErC}fqUOL|#t@dQl4dJO zh2Q`FHNNR(m*2s;MdHeiv=+UY=}pg`|Np=zv?lQjzl`yQM$;L47nm@vy5JaH@bBPs zW#gvsD-HZ_ndhBn+||l-Ns*P8r-rp%oL^jghcoZ3<^1PP_wabgD!fpT)CiC`xRhy0 zPva^^PG_n07uYoRJm%xHo*|#`lDqPyLDI4x_BOYT4!ucixxwvUzTu#!TSxsrV~0z^ z5w^^0k~xdN*R#1zQDo?d{IG?8EAJF`$8{~HhaB=!7H-QrQndrEE(g?b$M_k{gz&N8B+`3Z1oKrnkpV z-j$0LWCKq`D*5=x%3f+3-%Sy`KKIv@RZ3o#cUFzrtjfHt&Fq$68<^qbxS<_DxmC@&US^9 zeQN!Lt11(wmTqWtESS@9xML#YHNp0?pAP0RGMrVbtNhy1*xNmwF-YCv+xO-($xVF6 zj1GrSH!x~ov)j2)`%{AV_QXW))8!NTWLDg5tP*Bev(D{^Jaf%chBf;dr*>|zVimcz zprp^nn3K!eqsIA?=9##*{~bnLDdHM&mIrSOD#}I|s7prN+w5RHZ^D<4(lTZrY)*3A zZTcWT2{g!``@Q*!_JSfI8%L%o?6NbsHc1D`Ij-wsDHmwW&Ln-M*8hCs8_2j=CF&q=LI`{QaGenAYrWdUbj6(cE-#PW-sfH9N=4F_M<)Kd-LtI{|CIkCHB@A z)H3byZR4$&$H>gQ#D|stQuAeLWfR{&&DS+~E@X;Ns9n$)5OJ$@?GxtNjCuE!j@m0P z3FL@2Wn0BNBOzCu&0{XB)P|p&duusG{&(zX+4eHvRz}BEe}&QqCpj-1U^S?*tNC+) z!HB!YnQwzl1CNWtDOZmR2Ttif`NFl4dEUK+h35`1c$ZJu(R|YR&{uutMY@dv?BDEF zK0Qd4UZmH!t{^d?;h5#6BYeV1(J$j~um}m~BybvLFrC}((=j!517mi;oWH-n_cKoW zH}P~bn+?N!s~Pp3rrnJ$4IKVTrba@``zAI{Y`oSmX@ld{-}4h6Fr3KaI3{`=wEfp$ zLY^zH>IVjU=9VK*%NDUS{Bt%|QEn_@)=ycO=lK3db4#L|fuVBwBSleGrGv&!)7}^v zHA$;I_{AJ`veEiTPmhQ9I!Vcd_7exCLJZ0sv|LVfu3o?;x<^E82aBN0(*Fz96__m- z2xsrF`+bOEmL`Mfj|DS5E_}+EQ0>Uea>KEKr>Db7I)y#u+bqUCDtvbW8GdnY(c#|d zket#I@?ygwS+mdma+*CCZYmZO^7E=h9A*-ECt$oVa{9!HjMF+Na&vk-=9wm-z-qZA zFR`ICOknvY=R-1Kh6mm9A2y5jblhk%aGYxNWJ+FzjFI8OkXs3|JrmeumIxl_v11f3 zs^wcUkw^LkA1=bRh3RVCAw};;PFF8T_4vz+}%n1(b6itH&^(%311$!E;`Fc8LiU#~@EV(j6 zLc#mH!0C?)l@IwX>=Jw1{{L5;YI9=mf;KJT5(Ab^n;KZH7BgnvJNSp2+dE)~fudbU(p>hx zA%9^)qnrIF1__nBhfiB&B(YDmR;d5Wye#;`z2LC06^%U~cC_qZEP7>}lOmzgcIQNk z>9UKT?Q@QNv)?kO*@8zX{eui|k%)3h8IQ?r=A0Q#R=)+R6~E6hHgf!Ca5(MOe`o23 z4;bg)ua`_Xy)W>R`~@Gi40YK}-)Bv1l*~IFE%l-4scy>l1DDvBOyssy5Hbnw>?rs6 z)!w41vreFrUxn%P?Fk#&P3#n3GAxo4+cv>S^xDeysna)H;+=NhL9&-|lJoz?)BY(osUS+Z4Az`zM(;RD0A2dAB!I6E!^PdineS`Pun+w=e z4qY;~;crTFa9mx{!2Cw0rfGu`Uk-1@*Q@{Qd3-!1#h#f5NToF2D`NU2T)}C_obu9M zM=wD(a>j0jLXOqa|C6ue8&sZnSlaQ2bML77CrW&4C$ z4!a1+S8Nk36)eSGh;aqfa!MZf&+j*Rf)QubzQ$9s0hOmaIv)R@u;w6xb@)-SE zIBb?UkgFY0d-woDw)o*s(i(3Zs}l46vg;gI_`TDylr879s>*uDQ*0;71fO&=RLC*6 zE35DyK2_Tx=V8~jG~45kk%N}+hUNt3zXJaq(_|I5I~h7kRXzA6d!;d*>DuWH8=8(9 zuQ~JUGk3)Ty^^CU7W0iAUd4Qv#_+&Q-4D0VTUOUXQV6E?h>>2xw8`v@&7=Lrilufu@zjw#y{mmNAC z>Ct$Cp|k$Urrt(IOFK{{dnw^xJ=>JVB)1HywwJ%pGk7xx$RGSHx#VrjBfT9m%t8Os z6gVcl)+{-C;+gRUjt86N4|};ik~!${{2;@mKL;8#m?akeoRfIqzy}E)hdgEjw-(3k z3=cR$3bv^mDJqI@*^v5EVkV0g!_9uqhYi!q9n*CkdW#Aca;(bv=lE^4kt4U^6TuKR zHWy`qBW$AE798RaNo@Mg>*UViSfpULVk2jf{F9ahwGWq6KYT4!*#EcPWJRK6Bd1jr zhjxI&OTLhUjbECr85}nMcbtB$NvoRg!NKMQ&tyF0wv_ZS?&xWl+$|i_*mRZoYLZ;Y zXZbfj|Nl=^Y|%(a+^U+BCKdM3;gEQ!{F;Q;oBcBP0@gQLAK4%(r10~aj(I6$$||m=5zizq}eH)78eY+J$Q)U#DRI9E#oX+=@ShmDFQEB zB<~#j$(>hetW?Ss_?PkR8v`Sw18HpupB5YwToQbWL)NuTCh9PU?2LxFNqnBa|0{0h zxNu1HO@7*m1dbE223r+2|94FPnwZB_F7sdc4sRbnTZB5R(BYm8Z=S?fEge0@Ox8(- ziG@5DIX%-A3|-i{q|*NQ$5%jJ8!QYo}cqTBic0?<*CpBK;xx^#B z;^GmOyG@L-qKqd)E*w;zAS0~2=P}!)=CcWnhh<{cCFpgsw6iIvY~X$t*7kow3}<$O z(ZVwql-T$aDn*2zT@YyBHtAt=<%V}AD|&vPZ(y2mS;^;-e1*TQijSk)!OO}kKJ&+^ z@mlN3JWD(AfcM1n1)-7)-ij<>Q(JM6y~y7963@r@B}GDaGSb<2D^F^71tSOhp-LOD4DE$?M!n$dn12*L<7CV1TXDmp1N|w;daoJ ziE+RWhi$?P?4=F=nzt$^yyPn4V@a97Gc72wdb?vH2bc7PYXSi`|L|8#7Gf_@mDA`^ z&=z%wuKj2Dr+ul3+X=hU0H4ORXO5}NPY(FH6&U>1Z~O$ny;A?f)Adc*8jJqx>wfgUwO@1Fa`* zsA#x&;vpY*{tYg14|cIC1vTN4`F6}H)8vgBP90%bz1<;IaYr9>?r(-R$&9V)84p;( z*qy9yY>ylmsQTGOswyt7Wji?k|(wAO0lqlonZ= z%SRa^JsDQH9GogCEXztgzpqtp2JH~FD>n@%>`q{{SQPO8bVK9=r*FTT(ho^0Oyv?TS;i>0yk~>zsts+@ zE^N#Awr!DmWE0_dmLp%q@eXf~{)>k_3Hyy4-5xqtyB_3Kc)-J#(Z(`G?}GK(2U;u{ z7C-iIEcm#fPvenEYKHSK`;>1CPmDek*|~ZAYG9RIV%RIPuV(@y_l-4{OFo`G(D0@_ zVmVWc;eY2h*Im}lkX-1iJ)!P~CA-4!{dGTi?l3XlUd)|a$9R`-UM=IL3BR8$&V zn*U%&O3RuZ4J9lR0n@HGJrEz_YmmyG;HIAPUN1%SVf~9qFaHP36*zzBlWr5&lwTmG^qsVkf4{9iEl1#e&af};;YHUB$q-oC#v zTI0rpr#JIo?7g``lqq3;^S12{kC{xESzkpoSg9-s4OpPUP$VY2fb znX%A2&oNdkEu*sWN=wT!Gq;Mv($oI@TX=@A*+uao=STA($x{s8%rDaZw2K9I6ipG_ z$=GvEpk=D|hAKffW2e(|?;nuPnh~k6+C72!^oAd8YxX6zobxg?aWlW^=thO{(pzrRV5xaFP*UG`+xgeLHSGeuygTy{BxYaVk{K) z&gqoVlRvy4*$+u%*mC$t*EcY$`CNFbvY}XY#tebg@(Hqa6J|T4YE=X@GG2P#gKMlYS)83{5&i-6u6axb{t}} zkdTlFP_vt%Ajp1NO-WL5aBC^1_ebjf1kg1cQDns1mH9$eEeJjl5^;A80@N3}+7 zbra>86O1%=G=7o~`sutnmM!2hOWBVr@h=W)Cnz6yDRfDLx%WU5moDFfhw%#zUz;#J z;4oKQ#PPS^r++`-$F#(l-!k`~eMP;d@Rp?HmU6#;MhPDszxMtaz+&%kjmuo=v9h1$drG^P(dpG zLCHt?FoT0e@<)sfj3pHt8T2M8Tyv1RUf=NqgZfAeO$aWz|*h1I9X!?4py^vI$R*OknzX-`?e3^UR;JHx9DJ)^dHe zcHuoD_v4L8##9Dol{XH(P60EyxR@_o%AR0%BS%4JuS42a(D~Re6WGf?Dc-hpNHx>= zfAG{Q`}+>e`e!cOwCvb_(451-k&SI;V|d8HQ&JP;0<73~zPA3rSAL^G=tx|_v!sNk zv(Jp0X36&~V0D-z6FOccJGb!)t}+L!8s@Nj~fiyu!(1yxx@s9BuO0;UIV93e9X+uH3CdASDil#Jg*$%L-1CQV+SLV&iYG$%oZ*@9qdm6zR0CJTxt3BU z1y4SqV-IF}Em?X-!B@dpG4Uvap47kpzu3-Hta%`MhRR)7_-915N;XQX4?#CTEbA};OlZ{WcK;d9m zXycc|Qj<>PImJC>6k@-x!7P)L#I)`VBdbwP1Ea|bPA}mT;rdOVO*Gy#y!+1`6MKYd zmoL)_ewzlic+(>s_odjhn*TMb`Oc77$gFeXCs){Ur%SqT1nfQ3MU9ksvz-sHMI|P3 ziKjRGkWONHrDLCxz!9X^6!N#7FXDjJ4~6|khd$k`Kk|w%V1`0@hU1(1|Nj@RiDJq> z$?z&Qscp{IFY>p3xA-_Yo@)R9!G`Z<8LL*XqioiN2QTXj{+?j5zs(*N)?B3WA|c-F zfh9laekT5z3%(s-V>wfygfAT)+YRiEjhwbWFmg&}_i_Hrz9J^s;Ywx4hI9sN**SLq zl($YzoGF_na)wWWw^08I?}HDmOB7Fd9sJL;;gZzFeJO2u;SAFzUNB>|kTp;W+hpMI zm{aB7^WWiY7s7-E*p}u?q_wq4GK(>2@h8k^^k@ilQ+UZd{bo-O&yOnx7laLj(j}Fd zmG8#5`bjK&_4B;J28L^FKl@GRO}uM$p_y?7GegIxDG5Im#k)>OO3ZdEsq{ELpL3na zRwlQejON(}3FeMk5(SLMI3mk#XWeL6SIweZ z&8AzNoY;D1-a#$)2ni#H=^L943rVd{D0kxh%^jP?C9lB5&b6e7(Uh-_+5boT*`~vH z*trrfl(D6~2=Y9Uqq#w-MJ|9f?@fc2ubSHj**yymS0rdBL>%;HQVb7kIxHxmGJ#K! zdB@*>-}Q4=>bIOfz>qn`i7i7Sv598`8~c)tteQMC7xX4osGdF05NOeOn0*CbiG*5? zn(Pz43$LU;tP&T?h;e?+bb*U^!p;Q+Y^DhZs-OIKvO2S2HtPXij*MN+Zzi|#NY*rZSJ zUT}6vtmM4&A+@bc>;M1s22&%&z`yeMCL}a0XUn1zU9BWiPD72T*5Xo{|=t6^k5ej ze9m*hqTz}60^bB<$pcF*RcxIOF>b4oE_o}ZT#_bu&7-}euiKXGl#Uc(pF=owj&N!|D2|$897>S+2E+jrsh`RE+MjP!#Q;wAITYt<{u7N z?N!*E&}{c0H}QXB=4?q&_gh4VxA_volV4#TvB!Dtm9fh9FqN)wEIiB;naJ?TzQRo? zYTm&|Y}3*tB{rB|nHaX-&|neI4&y)WvOk)i1`6<6+q0OQ;FR)UJZf7}z+bmOd&y$f zR}P25*8E|bSI!W*_5_dJmfr5k+;%HiHS;grZC`QuVf#tO$4n*)>{2T2rF@Q@f->d@ zJ}_)u=P)mV}3HD z?o0M-+7oX6tH0o>sMZ#Lp!!o}BlCs-^qFxIMm~Jw@T5|Xk zzYDMMjvjZdv;)lo`xo5a<&gSY{>Kt=m0X8&a~fLA7sW77Rh_Ws?5Q(M@(xVbcl!uz z{r~^)xjjGFyQK=w7&(T2P`Jf1VMF8guM!Eek}g)v{;M1=vnZSRD7x}1@2GKnqWI#P z%?qx;0vThYMa$y1Y?9p5)Fk*U&E+TeJe|arAHwe#*={5#Fk8qt`mrue4yZ6TaM)hp z@K{7lY(cTijKz_UHb!TDWoEqt9nb398rgb|ST;;-oS3KQ z%BSq6#4KkT^Pj(9g%TTcLN4ExFKpWV3!ZY#jqR3TP*C)9WR+VeSwF%4-+y=BnlF9! z9=ysWVf~D^1X39Kj~#lqjCFNFgR91p1+6UtKT={6RKK!UZPLt0 z$YHB58*KkCIH!E0_CV0%&&&OJ7T6ZoC!YTQ-#JX|fR)Au7xugZP24UyjI1jwCc00% zs4N*XQ&BY`qLD+$X`W&0%jQt61?OxRC30!MxpA(E8B|wDvO)6UzrXBz^QDEdC+uL# zV`eOibF4}<_McF~A9|Q!YdhnmlTD>p6c&G)&?t4|tJ8)p?44o}HctGGDGg87{!eH> z^zEp#pI>{caM2&<9QP%x6U;o=#U?FNVE1QC|K4!j-q4Z#vctD#Dg6ygZ!TcsnHF}? zSpC2U)>0A2EQf!r@1jPvpF$m|yk$~|yNQiCUPv(tt)-W419ECsktE;M+E zZ*UVmyubcJsN;mqA_*_~-}q-7=b3YUhT`hde@y&=Nl8hG4JI!fjRiXnFHPwEU9Ta# z??2CpsmJf{-|&T-*ES=WZBCw~WB}V=hi^)zkrD}s{EPN8POsV2IPKu!OT5fEV$!zq z|JhyHuJ9%ZOC&IuRdaSR2Q>e)w~%#AGgs7ZQh3Q(c0%Gz{Di4~|0NPu&z6|LP_!$l zfzPbre85lkkLD+O<{uEXTd+yaP=VpL5~~)sKq|+ZmckA7jhlblH~doA9Cn~0y~*TH z!d%M;3FUUd9o#?XPh`CK(@8IQ!fA7l9S*0`Pjqp3EdFfIY%|wD>6}Z$$;Og}pp`Od zJd0u+a~B-CqWneakxWs6jEaGzq(Y|jC5M!hhO4p)H|sC_>S25oxxwp6@S}sW^%?41 z*ES@vEZ1cdVel%R&}PNFLnoR<5H@1NJ;!^xvlxPLz$v}quUW)mG=!# z4t(X-@RLw@$9$7l%7gXo$#$6x&e;|X=d}K}uZdtPpZ4Flfj^EV*OY~qt3V+(pUeC5 ziJu(TcCbvZ_n9y=FhY{SQo57(qGgN8Hid`hICk8n98pscc6}mSKv?k755Gs zb}!=#ecH@94a^xL8KNr6DUaGFGEVG}5bSGQuI;kV$;Zm^lKhgjKlp2wU5@{7O02-b zNMYNmrc1IZ3-~t43dub4>EYNc8F;qk2&WTI(R+L89djA>nR3pM+sDj5yUj<>;ZO(X zwLtb;+*#M1))l6@u4!QXB^~14bj$2PWOR2=Y_BP<~)@$ywz&|%K#Uy?Ttv`(qt@JZ^X?uopm*H1B|$;v)3 zZE!jEus(y8b+y4qR+UXsF|ze;TMkJbOKmcLCK+J$e}TjA|MJ&3-Ol7Sa&f132w^&3=#voC>K9ube*81JoY5e@1vV1CtnF6+=N_nw}PzZWJPY1Zga{B}@l z?tc$i4vydEKeiNmG;{9U#HK&FSrGi*9A}5n*NKKVFJ%5z5jpQ6g{-J59b=nl$B@S2w84M3S<`UY!Vb9?cCmO6W7)5^Yz7c4?qCCHf*O+}%7OPPapJ(v}i{^7e z2hto93wfjWanF0n@XR)#SL(lj5jT0G7=NlaO zq`<7>uWYq#g9-myq9+4_yq;nu;I(>bN;7yRLUx8aX7k4Tf$mHh|iGP@N_V{BEf z2oo0^v(-fb>;KM+`zJDr$ty5kc%xZyRB%Pi5B`(+6KdKunjH&yg_@@? z>{;-M(Xjci{Hp1kcEN0#|Nk96mCSZx&G-5UL)Nd-H{yFH>=JkuA5rJ{B;MmDvzPdT zMr*f>oqSRcn9sHRb&vYRb8dOhgtvARY`8x%XGAk-^fso=cZ_zsvCw$YhQGIYcs4i+ zYyAChZxXNkNla(nfkbw(wk5U&ag8Exc{UWi_`lzt$LGw1$q)Yjb)K`9$Gku(B94=M>1#@&Erf+2P)9o>R{kTxH7HFgx)9 zr~FNuB_<~iG=zM2ekD1*6_=kMp)(3~r|@Z}r+FWXcv{Pdbo^R2&;aoRu01#_L)JmxZI z-v7g#zq944ln&FFE9wY*DFF4bYJyF%8?1z&9{5+*TT z3S-_WT6Rz5gk69%V~L06lUKeT?Lw1|OBz^BR|r11dX0p{1h#g?RKAo}nHJtSUv|4a zqGH?$ydJ6C%scL|?0l_Xa+_y`4C8t=hEIuK*){Grzt$+|Wx6?wG5f!f(o)MOp9ChR zFJL^(py_C}rRK_;;ySX_UT|?lM0UlLDc|AVCNgK+zr(j< zC*1h;?WZua^oxMpj#dF@$EzpmZ~U~L(5Mn&*HkI|X8r#Kzh-go1!xTf+xFvt?97FUhR;`Z?z0zi3Wd+XSWf1~8Ob&C?#Xf|V{+AHw z4SsUYV$nm6kJd^?i4(h|c1~z|XU`nu-oSWiYs-~w7f!vlUu4XfnX}-$)S*9T81h{V z6nW^EJv1H#HcKv+fXS)|uEQdTv8xal{M-sj~vR6I*T0%>U3P z%X}n{jm@nhS#DaLKw4v(o?!J`hr}Px&6ix}4rJz)PN?|9cFwQ)@5lf46;}_`XZ&Lf zT_@jIe!J<-Q>Jr%jc*c~cyAc|ao?#YB=Sz@LN50P)$|7k`Pq)x85JbUMAs&JL@hJxt&HyO>!R0V$Ez{<6pcL+|b5;LdIihhm|o~-UjEt97gPy zJR8bxNGMveRkHOkX4$P#WZ_bdxYPLfiM@)iq0{5WiGmjeot8vqSQsC$vQuyt49_)k zkp88xy+PXejL(CmM;@HBQqK9!yU6g@e8x#_5)uM0r!a~w+wkRF!;He#R?R;$d;zWJ zSqhmg^o^aQLN^#RA2C$kBgpt#;XoSSzr)r_J{rA-7Z|uK{F|*E{!1pTHapN8l@_tX zAxKlF|Ij6^qUUnY>?hc6`1I1=M6of3b>}6niw|3uRtE_D`OTg6^-p^%5A&UE|9N;$ zRB}$6x3A_Wlirtvmtu7iY6dkC3z+9Gh!hNv;P}-iu6R;@EQ9PqDvhTxj!+BiqJga|p*eK;`Xd1!S zGPN+FzJZ-1k^M;173EVQX-lRC7`#q+$5#GmhT>DL9h><|4o~NQFLC4G=@SQ4jUu?0 zOy)hwe&)m9mjcsk7|W(OZtnYY;I_Czvxm+HQU3*3O&1gfcGOM~jbHHMC-XfgrY$@r zsn6>@=CW$*A6WLUy+v8){((~}H_Xf~tYQi9{w05@aZkrD{*CT(bM7}5GM+mBe*v@P z27@2`rzbpU6BS-`FRf)sA)lXLfjhh0^b02J-sU|XACGeQ7lUs6VGa6kd{B*h!O3pU zsC`aWM<+B+`2SzAus>rt!`Z}!J81_v-ZuPW<+m_u;D5j@$!hH)v5X!G@#*js3Xm2oInDYeO!`CuKl7qFtjmKv z>=>R3UYIGf;LdTL-0%jSwyClojF^;V55BTHk-%9rm*?E$|NjoYR%0vJp^&$v@hAV3 zU`K5xhg8)SXIOYQHJ=IzkYc=l@1uN>+JQ%sVeWsOrS3FeE!?oBBkG&NA*nE}1D6Dq zY#rY;Y}I#oDQ&v;Z+gR0T{aVj+j6X@qZKj>s=Fpmd}tpO$za?sTJi2keTF2r^=^g` zw?FN(xV`27|2zDOrNHCh+yCsh^H^t9B(@wiSDCA{yRp%WVXqg{@=~|9iw7Cl+}Ns^ zBmNi}32l=OeOuqw$gW_nV6X{1z1O%aPt}5fAuHq%m#9-C%j$~GnIGF{vUY2^xjhk# zb!lrAHS0JeJ?UZMRP{}>9hOgMmRdEzO=HPqj_jC&R)rfbR-Di<7p|BoYHXaeQb9S0 zl{Iq))A##~>sK)E6c+j+u>EiA{dVq|xos{t>e*bD9$KmbaD9{Cv4E-E=)dxt z<{KwFE?scg)<2OmaD$P-fp0&YwHPP-d>|SA!YIkbS^5!MfP|9Nx(R+tIbtl+E-1Fg zJ32{EyK~Su!e;@Sf^pI|jtuiNIsr>Lc0UrlR={MQA))xYccS#OGiN&bBy;*rPvqTL zqq*i`^9N(*!~6+S3~MzQ=04)S<vh&&h5Duh2c72T}}|cC_|H96r-xE+whZ zEB2%|e}kX64bOjPD@lQ3g_m+cj80)}2iW8iWNmKfSlHwnI(;>8&?@jy?VTm2@R51t z28o5tW*auN9br#W;|$?DU_GZkk=@d9nyit7cJYMX4mX(@#~DuFKEV2#XTeO78xM}g zzqsU`mUbj_Z;wYMLz?{!k%ata!Cg~io}_J%d?3ccY;)dm+U~n!2QOEL}eaRk{Q`;8! zah-`*U_Q9H^+F4;=5+zy1U9yaea=Cv#g z>jfBcFDIlmK2MGK*Zy2^37bk$RlDgqht1129BjRRAb6wWL%wLYzw&dw3qB75O}la> zHm`WFSyy7>^a)O*vH7;bZiTt7X-hV-i+t41>X zY{5%MTBjQKXz;Q|JZDc*V`ffLn8wJduzt-C{`VD1myX+iU|c)FcKZS`J!O-53C8Is z%9_@+w;CrE2tJBC(QqoB&13E_`F&X&mkzkB(w0;>J$2@c84?ptM;ZKwOrHuBomejC@V7;*)n-gTVOO* z(C!Dr&O^fclo}fu=S^35=XirR@4BH=SS{$DnM_eRmGh14eH3( zYCC2!ZF|+#$r-q9;j`?J?*|`oE@Ug(VRAy|gQUZm4WIZHz1RPe6}F+u&7p-gX$&QDg|#g3`MYu^6hw=(A2_}`v+&6>uY>|*f`EZS6s*x1-2qM7F~ zEr?_4Haukcz=tC{-B4kvX~nIy7T*_+N^D8$%6s;;EG?W7txzdmsUTm{ ziBEZ$nZ0Imlu0QwD{s+BSWxUfMNsf-K)IoTLbss+Lr;as;&#!)4$N+kWDZyyXlCqT zQDQKS`ESg_$56!1qP$!F=Gy;~8s*yO7#X6<{~T;(-EknnDRa&tEsF?d9+&^_uVNI^ zGa_917ax>mPFTnzCCMrq#r#U3>D$L9?vNKg{3-GJDK{l|>}u*eWV}%4V|&Pr6P%19 zA2zfxFPg}FlJWn--V6cOt||5xRKG89lDJa%huij`RLutNf;8qUi7t93g1llKl^YHT zr`fNW%#i)_k9${n#G?jN8^^4DwTya;nci8piJTA!cBo|7(jt86XOrlG4Tm@b75@M4 z*9~-B=g+*8&t}#c25xzeR{p#lf8AxeSfvlL?&e*?Dbvj}!NPrt)Q5s*^KJhf*JrS- z4Pr1WOQ_!9*sK3S$ROhR$MfswKUlg*;j%-tMZ!y_FvEsZG6hk;*l+&l`7EAsQg4ML zqg4-Q*#SA7KZ*}o3*~nta%_>mBEf7P;E>0%O!tDupXL7Yk`CXWH${~i?458*>{>)Z z%lvGHdA2|JBjtFDt#9=9Ot@KkB7sGCOCyJ*DEm*=YY*7M@A*uaY2)GJl=i|gO)+hs zLbJhxHkHHm6-Rj`dE4K#H?MT<6Fzc^ZN}aO=U7apHl|%)@Ke}Qwkhq0Lmk^r>1op( zo(gw1O`Y3m)dW=1aX=9Eb`)~t z-2cZk@635N8+OJ!iHuU;UcXj zJw7}ezVOVx+qjc4r0*|NtTFqWFaKN5891J@cLVhocuJRXricj(zhcl?^N^2^J78Bj z<6TyMn-}~g`&ci;T-Z86VSCdX=Cgi(|Mpu{KmBii^G6w->G6+rIiXKQ zskZ5mh)DT@FO1SV7+Q6O*GxWnfMLI}oJ>}NyHg%lLd$aJj>-iVY*S4i9P|~7s9|(X zNM~i(tiC3g!|=cSo<#oa=?&~s5($N;4>Zi!((psPMvc$7gZK8O0}V6RAN<&9;X7Y& z4@!l2Hhf{oe%^Rl zIY*%Tp?!$~caVI;o$u^5S2dacEVx)-UvF&C6t?D%`x=p^tK2Vs@=Oaq@bqo{jZ@l7 zY`Aly6%PHeXHI&+^v0-wKJBO-Z{vyhMD2P;n^KuESG#dai+n>h>x#8&E>J^?7$6wOHULnuwH(!*Rvp% z(eea)*vUg$Y97bh^fJ?2LXr}!9nWT{osiwNA-HU!|FX2EU7SXXcy`{G50Y5K=X5}7 ziGr~stLO?t_NXdWt(%IHGX+-)Gw1Izba*oH`(|UqhVQPM9sJDM^jlM#;%2g5W9y6v zaOBadQS>#QabM!VT&92{Moq5^Blr&UT(7@yO#jT@38^9fAC@m_mO4J+n2vD-Pl~*U zuExCm^}o5+Z&bK$-pF;n{=(if9b9Z-FPtCE6pT9Qc!w#IK{2$(;c((=mV|X~k!@!_ z$S-9)!jUU+NJ}zdv)r8yCUZW?nG1OJj(qYjh+=3{&hYWpFGj}7e6@`2 zk~?m-g|c-Baow50Zuafp-ycjlE)G@-3oO`{nif13x^aV{^p=EUdy1p`Tt!#LBlj1i zHcyyY?eUmF$c$%#?F63*Zv4t#%zSrZ5*m1o8lNQ0<^EBWH)YEodBfSq8D`H+N@-XU z@A8=c3TJzXQbN*yhjc!}1AYSS&pj&+Gf(n9pt55rTPBO4(oNpicbcU|K2$V5({t$yAploy$I!A-$}Zvk`jgPMQ*lk^3!Cd)@3P-j>4$uDo`NwLb!20fwlk`3wo(X(n%*N8pD>Q#gSNsru;a77* zvH$@^Q2^L76erK%=WIJK}UmmFZc@`05%ujy1s!L8ryZxfoO-Z_{qIQ-~< ztoZ|@g0vT_m?Qo;XlZ*`v6ioEOtpFPz=7?>1MwAtoG&*R7#SUszW89KzT1gN=?Q&o zA10VT(2;miU{bJx;jzdzE!JzAtT#EMIN6H$HTonMe6>)qb$Y{aUc<=n;Az7rCTAFO zfBbW|(q}QOU^3*1@%!`pIK%6jdiHtRjGW8sA24!VC`$bxrkD`Pq&NM4V_KSEBG0*W zp9zhAKOCf(nVHx0CAFl5y15_2G3rh9~i@qvT&FH9?X9wa#MusQzt z(3qcbSY}G{0pnBu6=ZcLRDSSNzTw;Rp;+%g;y3xAcZb;=8aEvOfA9%>Gw@5LOYhAIVf>lDZ%Z77$NBmrVr8KDNMI`f7eidP6 z*0Fbfb@Km)h9CVl3=E$C4eXsB2`zlDf64R11S1}!3(VS^6H_^o47e-vt&Yf4M7c_7 zG`OfHEtu8FxJ{O0345Zwj?ckL{*0UT9-(aO_8)x6qHC|1saqFEAu?8M9bb7t||Ns9@F|3>lY#EX4XHP%)B)g^bk^YM}j7J`bC@V)va+!)< z%xmO1a^Meh5I?8&27k!|%yB+G8zNZwLk{qDu*KeGk1J&_VO~+odGip$D zjT|nqS8VEJ+}y`{y_RP}4YSl4mhwN1O$)Xu?NCc-Il`JT``CGTdx?aXGdnqV@*ZK} zxA%zUlG($|*VS;v;gqmPd_-J2YEx#nDokyTC%>BTd=BW=K zY>sVstLyQf;SwkNPiZp_-mLBg&t0Evl9_Vd)6N? z65XNu<@a-bo&~~x9GlNikos)@V}Z{G=?6arE=_CCJ=n6OxI;pD(Z&M?0Ssc{2D2i{ z9~4`!c_Yd5FS#KlchR1sCk|LBTy)5(Sh(u@cE6S5pV8t)To4c*v+*q8&@7(C{F zZ8wn%aQ`pCS@OrRvE!B`i{5&+b5;ucRu1b{H@=zN96D?;J9BWrdN*s`6 zxnhydWaf5oA-j?T^W_B=Y^6UM6B%;sjQ%jjGIQiUX!v%h?$4LT#@XHMIZRIyEKekG zs`Sj1n2_F;V4VJ-k(Djuu#i;diOt&t%$U8BMW?kL(EMbtVr{J0s+n_uQDoDCFQ4D* zznPNqpySv1`~w>vHI%PXU}ZT{7tqX-BeiGZ*$%THKAze29c{)Lk~S$fWmD34f-(&c zvhNqj6f(3p*m32-FZSMekFM66M>*op@d&k>?wc{;llT(Dqa2+zOT3sw&M&ZG)=qYK z`OSWhA@6KWSFY?0(GB06thYa?NJ?msF=5T;agbi?BhcP_TFs3uW4U~gtD}@wK)taO zo74l|=!}`nRv~ZXzsz!rko))VpXvpLum=jl%1h=m_=GRG$~d9AU2rZ_jHpoBzUDPj zjLQpO$YowgkkhblwmRkWfpNqC2fADf91Sk;@+~;Xa7EJ5<1ufV{)<nm=uzB4dz z&b!NSlWWs|`HHX7!pti7jf`vl{g~L;$yzjxA;a_{`-7b<3pVlY;c8@@^mHQo7RQr} zPs%)Ia?h^$}u{k-!fVHbI&yGpNQCe+Vd(7b8G7FNIW|NkA{KJ|baW5TWjPfzWy z@2I}h_?5v}Tf=AK_C*e#^^Y_vOkX^ud&3rv&g3JUZ|WQ8N~LXK_6WSq({Yg3EhDbU zBt)S(_k{6I@W!Td$xbt;vi|xYzvM8F*0X=gtn5WrP1m<4uwK~0sJq|M)UrsDyycw-|VYbOFUpmdum@0%U;aB;!Mk3rXw73 zHtbKozL&qxH2s@#7MA^2QcpB0#VHOi#V4g5JjoDs%#p98W$WJrc0=b= zL2MrmFuiyXd10GVz&z%y`yJ96ZmV8sEDo6A%;un&`If&V`#^n$nnS~ z0;WfCF42vQoChw+o_P77F)Co^sRIWXJd+LV8MaSWTpPzU^Sh`;24Cj%raae%dp!(i zy3ai5G*M%VaF>rMb9yXZY0x96X=}{m#30S#uw(KDWyy~kZbz&iKlq?K@tg!tGvkr= z*Z&=-OmfI;On9k4Lj=!DmT@UY&qH2d7316rScU!Ql z{y+(vkIsV~EV9p-t&hr^Mg5h}tp8b`!OSXBH{lB-XLP`iMlF3mKfNDsY%<)qOSbFi zXgHisORP%ZHM+6M(M9>2J+twaNz7AwdmivTkuO**UpL7}dC6k-BKb9s+1|4-UcO_` z=F-iV@=iY?S)ypsSNjv&INaRWA}S6^XZ&B_9q#y$+fVvI%xQ)^wu6sYG8b@}G51@& zKEV*kzg52MugsFdj*OVbH*8xq5B^JbiH&VO@t?!qK?A{{Lp*c#Nld(CmEpl@lfj{@D4}@p2+yuv+*YsIvX(S`n`hK;+Eb0~M^GW#5eA8( zpG=(2H@qg)^So$YHsNO8iHAWCmVPqCO(78|y+&zjz(HO^Bx$MI3*i@@3c zJOX+tX`E{8UcwL9beUD=DDpapwbgqxJNsPl6SbIc^rwA34_|kD#IN=c7apDs=WhQ0 zf8r&J)VvEDTzk&H(?8VA-ly=M{C9Z6RLbCl$`0<)Wj}Q@F1FD!ADLmcE1OVO9aY|3>&QeFDPKi zpPG>5!j*qz8K3f&J#A-}II=IEaLF>K(%_8$hSlDJKc#mq5wp6$tEKJuk%iORV@E>| zb0xbS#{mw_E3*dCunf zP|(sUF1+OrOL^OYmtXang-ZhXMA9ZyUrqG>t@x1J`i;O&XD&|Z0U42d(X7aVC7?7VN+4cUUHRP<)1*Rf{&@jA4l!m3Aw^-D<&uWV?U`p z?Y!{;>yn-g9&JyBGio{fj$Qb~DWd1oGecNpL!;n_2TUr>O>0@F&+OshIpZOF_Wy=Y zTrmX>PD~{)G?XhoOqATUMSdG^6X&)6=|4Wb(`C*`Ra$eW;i>Qj&YlU|_?5TZWx4&C zKmV}e)QLU|q(lEXvw1pvRmfm{V1MDQ*_jE9QZrgN6tQ3Nb3CHUe8uX9f|>H3&3xVb z6XrfJmT+JWzpzbe$(y8>d`p(CtOvFqV+dD0uEKz+9uWC;G);=Z_>t>6bzWB?P3j_Z|v}w z&)0cE%OQsB^aHoF6`T(?3-D|xGg4+|Qh23z!NEAiRJnwKNs8~mH{K1p9D2?F4_aw; zn4I9qecyOl?SlV?eH?3KS$CDPm@PPYim5aCgV?SA9gTGnG0v~@k9^~uVEteD>(zu* zwZjT*7uGmz;r{rObDo-{Bzt>*X9-&tuV?&nVd1nDS#94E7&f=Hg)wh*JkxP)2ir^K zv}5v1_;xaOuYJrP#Qgq`v7^;Ho}LYPYDw1wV$K^na5)9IIDFgc%(t`2RKjtp$O=b( zts@FkITk%&DQ8PKEjy8~km>v?hwpzEn$1v{n-JmFEYhW^2AL&CSu|rL z6r)3QiM*9p;J#NPsp4 z*Q}UZabwbv{~o7*A3Q71_CrH;i;n9K#)}?_2@M+)nKdRn{kUPnFZT1Nd3ZL|Fs=T6 zAo7X*q5A#xjQq09WgQO_&$G-lOl>NAHly)lS43}f#)X4Y5+_m_E&2@{!dMR+dL;jW zM_|K!Ny&qy)XyYkdB)@7cs_bNDRB?ItGe=`#;xicZ@nAtCWlQ{e{z{I4PX;>?4qT^*(! z-o|%O>hT7HpX_&!F-YgIvGQj$Fem9Lr$~z`3oFf^Iq3cD(;*ex+Ao>jGoN zh=a^=8-ia*K71;Xb6Qj*=f5+ze?%l(XMD!dgAAJa3ad~2Gdz$sLvlf?<(hd;E!Iaa z|DSlupg=A)A*EsJ`VBTbW&iC@Je+w#cJ2QQj_hI?>0)93ox+|qgw1d~|LzBWp|p=& zlDg8_<})ondl}b=?JD_WpTi*XvqqTh$0^ncl@D?yFKm+A=OX<|?}-fCy9)=;y)N@#fE+Y#BJo80k@MaRzJn?u+e$6yBG6m5wWvK%{SNfh1HSyYpl z*1)^u5ZkPTmt51z6`5~N`1Z^`<0qfDzQBJ6>w6D&v21+AB2)T5QMUAnoWzc4ZQHB` zGudluwUxizY53p4XQ%XT;;!@yU2-8)njQ;V9c0VbFmkvgw&X5%rm=I$|Mn{!Jrmw; z+HmmZ{|k(1H%=K%n0rE4Yl6u^7W*|qGP`JUhSSOqlG+(}-fQ^5YN;c^ zrkkL0aAr@1$l*(B%8wO3nom6E;FVj_ubgyaWTIHFUnOoe-)OW;kV}9?F9ajGq1TdQ>NzM#N=XPv;WM9E7I4Q{??QiS699}IAhnx>~;S1Uw zWDO^jJGQE=c);+o-P9;z!Q%D}T;f6sJ`a}ucp%Ahp)Nn;OXHP>bsdaTgLE!DowDJO zl-vZKjwPJgD;l{SD})+ER!wNrN#Yk;bMSPFs`5YgPugd6X4G!zVmQXWl9gYm;oYTw z{L%kbv=QlE5WBALzc8)@?4cm(xwIgyr_C>p$FuGfR zVQ;I#Zim%s4yV^R{{H9q`>R7{-&D~{4Zr@p6lPA5Hx_2jDEX!Qp}^q+7h}K`BPZ!2 z8$?+joa$sWl40nwzVJqB%|Xsg0jIF#3X}L#wsi@v3}RlIe}aKkc+VrYpMrNR5?V~+ z5{w!CFHB@N;y3!yc8kLy$GJg=vF*%{!%|EWDq34bm2LJ(NF=;u+14*B_I*PM=k8T} zTWVQ1&SKxX#eHULg2Q@Fh0LG&Uml$KuhA^}><l_4&Q>6t-kgoY;XFO z)SPyA;Zs?QdybnYC=~x^T0fQL?5Y2Z=M)sDWf?ntyV^XL^|ZQx`5|^K2}y~BZw+S| z^IkK)WPf{|thmFnv^-!>lhnF|?@YQ3M^DEm9G8DmAC_=f`jLmnEvI)^oDWTFWehvl_=aVv zr^)H?MdPlwMz25s*HPp|#|&vRmRNkXc1(X2o0(LWD$ zL_B5iUd_Y9QJoOhU@d;3k2mLln2^hY0=FZQdty>s_;UU_pId+7%P0A;pHAnb8m7K4 zc;CSDum6LrhEC#KiHM_Tj~qF{@H*$vCH7Un70VnSNe1;DdKF!8lX(lXi?L()qK56< zhK`SBNLoGMm3zZ9Z86US=Rf-l|FH9QG=_^bep2A(W?nPLX}$6TX6^%@Ll&?yGkevt z`)!->Hf}+my>Q7i36p3JDV7IpWn7MFHOz9eI5o{BB^6e$P%y4tut|K&*RI~VymQXa zoRPrnyCAgw!cG5z4~l%}o2S-K_`-U6|AZp$pzDhAkG{)Cy+6QqK=G;83Eu~d;%q1G zW!zYpwP6O+^YDP3Jn_2hD^DxPrcGEbDXB2m;l?+QBWqN4%we6H=`(|Ud7}4z1?z*+ zx((kN*D<%=bvWEGC+9$>z(!G_plQk?2Tlb{nD3CtB^|(^zW;y6T7d@@ZP#u;Fk#o9 z{r@ogbBBLS`cu;r8p>BWJTo?Sd?kP5n$V42la5B&6Aq8;pG*~T*qxZp)o}LjcYZ64 zpZ$#2-u-62bLktq2A`L)!gr_L+YVg(@}6hG)$#{#?JhJf{D0w71LsPc#vigl#|;y% zm~JroW?$3It+DR^zki1r^lm%Ur6e^?J3Qf_Nx{C9mblmKQW426YrKB)pMCG+v06Cs ztNDqy3k(>~{%Jnt^1)L20wXtD#!nvWcvj1Q4t0%Bay{lAXZWhDQI_~T_0NxgyfJ!B zkHj9adEEXYZ!*`==+GsmMR$)eoHZBtWpDHQU-R7kM>#T?6)vf4$vwazS;79hyHRkd zT+3AN4lC(RMm$SCTfaz%dGLz&$tICaT-}2EcJUf5;JO*bpno_)R#fc-!z23}2h^39 z=pJRzoF+Lz{X)V!hZ{#77z~Vf%nzLCxb5HZK~m+P+9k>6R0D?a8;jar|970WL?Ktu z<1f$a(~PGLotPO;NOC_>PD=mdn3cHs-w&&Q3Z)C!EUOkA`W9^L#2vliZcopLgRTL~ zc}$uavnDj93pDVGo@n%+a7@obam7NOC?^)p2@82mGM4fh@yA3k3Cpi2JjXDPx0Quw zM^g%u?1SUS4zS4Xb=7H3V%e^CV5&OvnuDxmvdqlPix}BfaVv=GFv}eH!;v@VPrFFp zgh1~Az6Mh_!B+>pqa+1+OFfvHb=EhB@SJ(zoPB`To$ZE?=n38p9BB;lT=I8uNPN`6CU=C_=K`D35!Dsn4nJySG}C4{y{G5GF>8~%&VM)}=W)eNI>WKkTy6>P zwli<^OZsisTs*-LdyRW#jKqP>dJm3i?=U{gaWDD&8JidaIc@BhIvCETDYE4z%uSvk^W>F+M@{pz zWsToN4)dL1+~~O3f6f8t8xjjYvUv+HXft0?_=~wBLZafOX2pUQ#+X9I<-!rlOjF7d z-?{3Dx1Z5#az8WC%0$6h;dGRv;!pWoZjDPcBbpg53M3^o=zeTHqI!gP!b~Q%40djz zl^ZG=T7{L~9o(0c&}N<#=v|;bBnAkooH)Riv0LQD1iKqOckkDC)PC4t#boBeFIn;PIK#}1EoXe1 z?(pAU%vZ#yBinRy!PSia0-dZT30!d#8PDi1uwa@S%=k%NV{OCqx6FsR_x$3Xk*+8k zU-qLxQsu1DHqXX$LO+=HWHN{F{dbQ{`@?USz{&UX|Ak*1cO0AVoMBqoFA>N#DIr(p z$!b%_yp*O=9nhxu%?l+t=A28|E65gc%V~+|lP|oHM?cEnn&xSq?HQTsZeE{=vhd z1nU_K-s-EJ*q47~Vci8sEj2f`8TO8)%o*Od&&$UjWZ!=9kkHO`zj^OiG0ocBe%1Iy zC0E?@hA_s4uy%*TlH1hhvzjd6vd0e@^5EX z;oIrUzNM4#QXK0~?mfE%W<5{bKF8qDZNUi@jPg2MJi%%iw#?FJ7;YXVY z|AJ3Uh0FMrwAqT+zVr)1Fs4_D%g!-wel3j3<~*xLm8RC~TfJ zUE%{%&=n&dPH@4zp{CKFH`dlO<%6*iPmYZsmwCv~|IIpc8}2Y4vt7P z-a~(3pS?!Nfoi6SP3$p^%B|vy7*ZO-^&T8*;|%)IFpaY*y|wWrW6fW=7Y&MP9?yBN zc(lIpPHFfO{;*Yf(E_H(zw&X-N@*+#r+E|km{rZ5oN8vYOFG4}RwQxri4(lh5eKc^&T+${Y?!UOMPvCp-6{{hDUB%ozuy9&KP_T(T&QssB;adg~@LJ_TOA8!IfC zy&nIv-!hT+oXUlsKk~cQ@P;jHXgSzBseXc+OvZ&K#u6<9<&`Dm zJvEWJn$xJD>BWJ=k0jQx?^`bNsQShki8Y&9yX6aBG&BFUXZGR!k+q|K!a4a27I~59 zIt$piUi{KXSjypbdV#ivVtbKeT2sPD)@+Fe>BkO-9gUS03~wBCUa+A-_j~)C4qndu z8(XJ7n3!L{)ObuvIfv8cNbUcLk2sH|IcTZ~_8L#A;muD__#|GG*}7_4BjY5u|HcaE zrZl`@ZoOZ>q|Gp8r-2J!3R{Ml<^G4y4REmLsk@o2ZnTI?lo(e4rblf6 zaimAcv9@zFFL7p-EJ;rLalS!9qhV$9)Q=bDoM70P+~IrEIX=eHGmV?;HXPKC*vT98nSDnno0%|I^j*d>QDuuQir?25J8qk)7`E|G z`#CqKuw8%Jw;ghP%9yi3dfNLL3z;J}G%^Il^4(f=kSF#RFIQE-T|TbM@dvJ2JrH&M zpZHWZBhyTqdCfYerNI+yw7Cz(71*&n-TQw+5o4J#tA<-WQ@V=d+!g;XZ28F_wXXT` zG{(R@$46q@a=C=={ZCkJ+rVaMXuR-Ayc^q>A`!9U6S|~??L@EZ1xMutr3-9$rGGR&t-q0@CtP4HniC-Uh^NI)?ZX*cix$a* zpHd-g4!3kBJbhU2(C+t-z4XO@gNE(Ch7IRFGHi=?c<#4hL(}$4jaHrY2by>5eCV?} zBiqx{VZ-)*hf_1-#mu}d5-w~LKEb#~ z=K-V2i7+9yib{q}{C6g%{os#lVVkYP5cyxc<{PW_jlBy#Fm4UCZ{F6$n11rV(|P%Z z>6|j*#Ut;x5ZDV-A|h`CXe?dCxhv*zG4j@Eau!HC+GiGhv$;bBw%;?3y=;4$KDTMglB7JcoG=9(}aYS#My(CsZ%| zlEhk}9 zDvQRWn~kTL4|@N1+${QEp?!J7Dd7tpFYK4p9$etjAR6-E(40obm%B{dDwroSMs+wS z^)@mJ%1vlvxA=CTutOrX<%zf(n?&y&hn9{1ow+SNnE3(&j1F*n-bi5h64Utqfs))S zy@*ALDGeqO2iBz|BsGOD+t4JabdG^_0~?!;^Wn7K1n-86>lZY)S{5;Wkk^z`c=Z3F ztnh?i_5c4F9k43fa7a4r!=bSLh9`-#oB`DWMwc0~_c$Gr3k&?$e9rEWl-K`-bD2JT zGFu>H{9%LfiIv|cM9HY}^KicK(KO+aP<+Y0=~koQJ&)#|s>4>z0$Wc=iiou@sBp}4 zX}G=dze2P61~ZA2HttR4!dEhCf4}4XFpWVkBl&?n^P0Q-oa`q&>~}PuW_g*>^rrRf zo#rF;4C_-^WL4N!-*N1XK5@^@V~_E|Gryd>Y;RH##sa=g^(w4c8i&XCM9`pZQ*M$sGn=FV@@4Z)+MZ31qA^ z$;kXy?{V?O2kD9rs@54#8I_rzsMI9PVm1{yn98)}P6O|)1E)AQ{B`)cAXj$++wFL^ zh&zr}5pOn3VtpeJP~j-`|Nnt#BY{lTs4`=xM*`ROHBS}x@#*jrzVm)UQyZh8*n~Zt z-upM$GzOV9TIpmMdv5q77RGjnZHj_y&;JKTO^kE4IlPp+#KBr_u^{n0i|=-y3pb0| zB4+*T*JxJEb6Gn-A(L@W%xuP>vgRWP5}DpkIeh2e_xJHj8r52MZurr@)`3|zmFXI@ zU;h6DO+gvA2U|Y!mr1BGGruZrpJ3Cg5v=%+rIOKT@i%!JY0iCiqE{Rl%pW*r{*pJj zvB0~!@#Q!95&_Oh?-!QJn5;|q$ZIy8ag%H_=Pil$qs)tPT1zBm%n&fXqhR`AlgyS+ z+$ItSIP|tiPDp3p&ye51xYSTCPmb+|0+WuPLi6Pwo(;N<8%mC{=*BxHGI3?!So!q- zKgVr+4WCrBf9QyN$nsrcKiJc;i}!`dhoZ8Gj)u8xh1P475A*bfZ?OO8_?c_R8pkF1 z5mF6DY<1-R9kyO|Vs6lpQ`T-3HU}>8Br%At)N4LwuYBd){|hEu?^_&C+q%f|8j3%< zSO3A$q+t1X`;r2on0p3>3So{0jnf}D^KE9C%01x=^Ia}xlmGT522Zp%ynDnX*TlJQ zzhmN2hC=lUdvoQiJBMFYs4ekR(Rh29|LtG?$VjFjc1aKCIrdDaRxju?u|Bcx{{>OG z{|6=e7`LotshjcS|Njep`dgT}`9$2;fYGw3BBVD4DZ$ym_HGc%HX>huS1TmLIGo7OLE z7TaJnh4seI^tNTO5i$oK%@urAH^Dk_vh4|Go)e#XGBPI!&MG_jl6elxKjp3M|C&GF zwqJ79@RD z^qE*3WGFLXPHEK_t~kJ0d10<#rmFsl{UVq=9vS5%uKV?rvo z*>R=z+Y3JMOgzY+?aDW0_QlK6yQ~8afBoOUu6v4sVa;K-B2i7_e+pk0v+`>X3lLe6De z9%b;pDIlz1EY*r$%T3;4g4Vo?r=qGvFow?|JNEH&9VKr{h9#Q?Y9)>rl?)f zUMUe^BwnP|+0XJWiV)OgzQm&B9Up;?V>X?$>{e7L{B}c=oUT3!6m3 zPd3y43T$g8yk(zm{oo0wr^tsI&Qh)unH#1G2&DG#+;6zf-1vt-Yl_n+^9;6c{5u%= zA30k+Nsu>iu&Uo+d-%X@Q-|s<$;9i7OplrGcqBKOOB`&sHFU5l?BOw}S7Hlr$ZIJ5 zk$79-K<501_J5A#1l)0C6H)khmdCc^z5bSiJhx`CaNqy`f8uAcCv6NBk0tCh4jeeZ z@Rq45GQf7h1}4)WOACtw%>Emus`lvUeE8A0)cMIKrWCsq77>Rzr#(}Ujc~csbjez} zB#cXhe}g0UgnEew43`!%?qrn_4=`7rZ^~3;?P0$pC(ZHZ^>Yovf7+*)^YHY1@G}

    n$A(II-n_H^5XCTj-B!H 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

    wbCz!3FjM}6mc)X3hwzP!;f##a-!@Bq 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 M)78&qol`;+0Ky-?`v3p{ diff --git a/demo-data/gltf-models/suzanne/Suzanne_MetallicRoughness.png b/demo-data/gltf-models/suzanne/Suzanne_MetallicRoughness.png deleted file mode 100644 index e4ff1fdea47d9a6781bcdb4987fa8bdd259d9546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860478 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¨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

    AMQ!&oG*=<^1#Q^WJ->gV%3Ad2i)O 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

    @E3w;eD*^hmXedz8wAO&-CpX$DQ3Qa{oAX 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�qpm63f-}0@D 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

    9a5TZ9Zc&c<{I_g{<$ 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 diff --git a/demo-data/images/16-bit.png b/demo-data/images/16-bit.png deleted file mode 100644 index d93e236a7ca1321e8527937fe405334de3b2cfb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35893 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 FngCn!&K&>% diff --git a/demo-data/images/image-001.dds b/demo-data/images/image-001.dds deleted file mode 100644 index 90363b810e619e5024e62257dd0aa609f86f15c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307328 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

    D{FQwdIVn&!c}{+l64X^)Cm2{T;Sb=8@ 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πb@7BgPL;L?3aw7ZV3>Kd%TrY*h6M(cV8{-K6#P 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 diff --git a/demo-data/images/image-001.png b/demo-data/images/image-001.png deleted file mode 100644 index 06cd7a4b0a1db35c20a25050d2b7e59d03e71d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845975 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

      )QX! zPbGi!nP%j(h1xIr&~#K^!zRHtMQzE~+6Qj>7QxPknPMFNr#qbcb0Y1)qo#?1)iuhG z8X52XNID`IKEdSIbVj$shXjKzDoRcGzft7IgALBFQyQ)s8aY_U^nA#0Jg0APu>Qfq z?f)E##vIBSct&a=lh%slyI2>{4wOuk(lr4lI?$rSXZEiu6P5&R{toZqV;u}U);TswJ z6(+yzQ+UM1vNseYG%OQ75h(g!B4Ms+fz>bmOo=A^IJ^xCtos1## z{x$3AHa#t0VWG3`;M`67Csciu-_y`IZ|zAI@8)_*g}MLhC+w2Em5|c1Q`qDd`#0k= zbLt<=y{)mhenG`w_Q*%fc^?{2<$u^?!km$*W^uA1+rZ;7^Ceq`c3X?94(zM{HEU}Z z+-%hFl1PY4b}?ActLXBaYv*T9F7pUW{;u!|l?rykQ9Bv9Hkw?lbmpuCwX%N4}@|w)X2l~DzxGb@Ia^wShRAb{&hndnF1RpxdDTk>6tOb<*ye-?8g((A6j|`{ zcRf$XDaLEzO>gX6b0Zom9(-UH=6P_4dCh#zvh(UU)Q)(Fn4CSprSs%NYpdpt39V*- z9CpoIkQ1=*BmY_lhDvT*J%_4>wNu&Q*ZP&{v`?@;^OFLf9L}*hhNF>x#ZSm5YXH| zk#T8B`%>0|d#!Hv7JCvsAKEiNst{korcm+all_uqKh8TyG@SYKU4FM$#EwIUW(j)l zWSjQ8eWm;|ahK*-woi;io|sF>s~qRL^OQ?Y;3t3X3gZK1&zwGq{+Sc;!9!+=AO~0R zhYDMR{y)vfbd~kq|8tj`nV#U{u%iB-(Vxa?o<0*Y_to=!I9ni4-|#J@`4Z!bbx8>h zOOEfK@Qrs1D{J&A=Ke+hC&aFNu!&2;{r~?%%hoKMt2;yD&lK(xR{kEl+a@w@t7O}j zEH*7%Aup+6nSVm_e9=i_2cF*9U(a(Qc-?~^teu9AM#2`W7QWWUc(EI$a`Lfj#$KE;X5?&?tdQFhY*dlUm zft%jy#5$*C6TcolWh8L+NXw2`E}6Oq*_{#(Ua}b({h!Zhbg#jRiNl!vroN7Wx1*@O zuuid)vFwV(6FjMhZP&jms2X?1QOyIJ}sAQb2_w(~_ew#fB6FD}Ci_A>; z{a^9ziNqsw`Vt!amMVzrDAaCH)}OIq&SsX?cO1l;udQgvh;ZcKa(cqjcxQ2vQxtcH zuAyO4=8~rBuO~E{CJN@da0n^%WPD`0#8k$9Nkg=VS#sXVe~#5L|0N$B7XSbMvHrh@ zl0WU27&!Uwcp%E;GeNVGE#nvS_gj*RSJjWK?YXekTj2M>w14g`--NfU zFPmFsJ?04B>|Nj`KjqxN|L!*%`S@nnuUNdEhlRo7Phy?hIq#khFX=S%9yUqN>;($X z87rcGeCL0B75`cLjR51iZ=AGoU$5Y={!{RIDmrMmTk?cWdg zl{U);vlvMiO;cQ=%{psh%M|?yMWSK-jmvg8y0ahLowUG6Zi@SiMBY>TC9+EuU(V=c z+_dDmJ@XPC*6Do`o;+f5C%($+>^*#$f1XXp>NSpb+qlyBbb1b!Ia=rbFT4`@f5GCF z1(gwXZL8WlnUYI*o%(t2*VGdz5G zZt0ni|NHOn7bw5wsC{kz0q*0Dm%DX5%0DJ?zxaRQqIASUmc@x#iRxz$+qB8JE4csp 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
      ^#xy4ow|Fy3UGEyj9O*Wzr$9S$FH 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
      Hn^tyWy-p4G<| z%g69)Pov+x1lIL`+1JW2uJd4>HgmyExq!o5A@NP`9n)HL{xV&?xL~qZ9P|1TmfQ`G zSjzkyveg}}OAdOkb~xSUaQXIyrSS{gj4}dPL#8!KH7r_ErY*Bz@}A{%mB><^epdGKa}?9u1^+ayJIuazVhY>&X$-Fy+2<^Xoqj+ ?jx2N!eWiar^Wdu;c_ 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 z ze#LBF!^j`XzV0W>-S~QTjsH?F?q7G<-|%Uo#s{4P;^*fZHkdhjGV#~4uQe29x@Ym3 zXN#UtL|D_c=}lJQ3xaJNW~(~R^|^51%6ofx35U9ePadZ*=steHysr8mW6bIAJQZ6m zOg_$k&^y&ZcGCCv4!uPe-sOGpvi@*3X2IuL$IbN*R3jJooM+nQ^HIN|MP$pH4sMGA zRrWcGtY`o1VVTxFVfDRzh6POSufFp1O7QgbO3K;oIL+|tMw3*-`vb4v*&8-2>vp_+ zC%;iWqv0JRyR7PAt{n3kR^EaJz4;8c_@dZ(&T#Q8kX%-Oz>9awPM(nc4eOOy+x}jk zzu@f31K)c23d9XE0*zlhNUmFObir3X`NqQw?l%NmD)26trm~{%AG6sH`--`eFH(X6 zQu$vgHj8QfW19bsch;vCpTGvUXp4sK9LLYsln!uIa?M%vgXPW6Oy>7fp0M|++^J!a z*~LEZHp{NbU-&=hxuw0hTe={7p~LO86i zaIG<@W7cN4AgIl=fO%o0g1B7sc?qUIhbA{RhwrUTZoLP16(95oJ+P2q&S;R@qVbvC zK&g(weNP?3^<94$`zjjUKKyHZXU1ZhA?cw0lv&zmLGdjIb1nl1v(yH+tv4DPdEx~4 zWR5b;Kgllh?=Sln29s4RURxF%y}N+*%K|a`7jGOcD5aY%uy^R>GGRT;l~d5t8fk*D^@9QR@1JC1B)B?@B7d8-Yl){-aN)#%7P}hSoTG6?b722Sk^;L((>+c+x$YgdQM7!X)uEyntvgyr_LFK&(6HAtJvlw^twW|$M zTNj++%$ibM(6BA`KeK)t+uEIfj-O+RyTX^n(7I1fQ&MbFb z*D9|*vp|Q>W*>8f-c9}j|BvF#86q+!XZfshM_U}YnHqYtFZ3N*&r{7W zlN_<_AH!kI2OCANH;O)1eh{^ZUw)sVf%AGL7STHX2IYzG8Wrw;On;k4uwDDjSlhb+s65VkL`nG(t+mrHx-V1G+N0XI9bAW zAw*H*Eu;BN;|8l~3z~YxE#~sy+VJVq*X$2M92Y#A88!s5_czyufr*(}Asy3nY7vAJ|aGwI}c) z*N0bj7lhiw4;VA%GcK=j++E|^a5;RzCQcKjPfxGAx1E=-GqBn7zmL%*OIcf;E63+l zQ-03FsR1nh`EoWjO%MMuKe+PG{=o}YgZ&1KpIK8%W>0*0J^TW%^?ivR9+SpjOB#9; z^d5ZqsolmczTUuwY2DA?pC=2~oY>kT!QQ-Oi$SwOf$u%;2W$)5{qHj@kBc|l!y5OW z-71$OM6W^W_<}x#6?Q)ub(kF=u24A2cW3P?9vR+r_PE?{Z4Y%n@En}JeqN(kp;1Ow z2Gj4`^$qS-8;mqgdK=7;er+^EVg=**qn8slu)QlXH4b9Fucxf5dy3)K+;h4LCky_( z(QOl5z0GhAgItE5uJVx!ccKm~SihR>%?oD#x{9wXJK{bnf4H@!na8$vwS=4vtK3%> z8G|28F(F_1Bfd4iTm1LKPw|53AD!7QoX~yoO~UX&UhV~g)FoWamVoQ zt^8iuwsiJ+#`D=M$7DZv?W*Q)Nawh>^TdI(#}7@An0p{$Rr;X?NgBsK2vz8R_!zw1 z(fg^yJDZC03zq1dNytt;wxRH@;DfVs?GIRQn9s1@Wy>a0wqwu5ADnpV$|md`%eLOZ zz3uYx^-ShVZ5Z>!7^hhs2rLL#F1lq2L&;;|3|r|J9+GSqT6q^Nl~~aH&+&CigCLjG zQFh+88rF9z?4~@C{~J!ZxP4f_Uctg$^1}GVEx&|$tV^9wJkxlv@$`XI;|IGJJI

      lBl#5_|sqZE%+;WSXwEhb``GdDp{N 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�xk~x%RLGuR3%kzB>lzQHAsBiwmEj5!NHjs5z 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�}emfa{~S)h$jlL&l5Vx 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

      $0w(?ES)@3befgQzUuE;1-+1lH-+%n~ zDt|xzZ+_thKl6(n&GipVyLcWLu)P&|!XP$j&VtST4$e0YI56>kZ(66x9BQ=SYuN)+ ziv^`tJrm}hTyRkwHt#RPWU< zc)aSM`hMrWhD3(<(^!1_8_I4rU4O|C%f5-<V zxIOj2ak1uWVgLSeTfUgdxMi~BrWtZ34re%I6o0YLF=h*$wZM-(C0VfG3eSxP%x_;b z-|;$lh(W93UsInVquHsQ4Xx@g96|$X8v9-|=KB0#yu-kJ%a+6H7TcC-LR*?!q;FhE zVCr*eG>dHz+g8MAUiX1X`p};P+SLxnzc;ysIB?(H-^{xaXF_|0uoGLzk+lr3)oqkFnT_tXE3?mCXvw<8j8fXz1JiSQ2n>5MhoC!g^V8yh=?o^>|M^W4ndh*uo9;Srn$={|}rtbC8v~FsbwZft7g|ZUq<2 zWA2k`Lg$K?L&AiE#4c51-BB(|l33A2SvoLIcXbruvPrZLSgW#=otFw5tH zUipPZzI z&&d7XO+ruB|DwDudU&b)RmWv? z)Yr|`IH7J`2~L%y)qS~t~^L!>6_KS#_AxdpK(j5WC>de zuaR+vy*RV+2aPH3=fod;J;5Q7f7i`N5C5|B>~9R-vgttfNr!a5eQfs@Fy7KU#dqrn z+pQJf_>HP~y!02$DL|KzqP`YBLh zI*aK;8)xE!7ZXfA@WltH%bB=x-`c_O>Po{aj{s+ml3rQyf-9UhOx!stjZ*y!WDl=7 z@QI~l4|~Ryshm67KAi^L0d6FDgF)2G+L`2_{NxVRyspUeoFbl_5|j?T0DFF_^vosvE8}KZRHXrVj;zm<*|=l z?)qWIHwXSQKRdhqfabUN2evV+2t3IobBA%Q;a}c2Dtj2?Sj#`(lVxLlz*kZkn%Z{V z!8X5vJ&3&&Q2{7G@;M-&U`>^!{ zu7sOBU(BrwULF^}aKh+?UFiii%>?ycc@tsQsANtN=D8Az8j8mltT-9BtP>JBo^wDj z$nU`=rnJoHPPT$37QWfd+hUvhav0*yGR}F-{_RQQ)PwN}&g@&{I6~N();(tu^>}k& zqGj3wSA{>)JC1Q)v0yOmI=HtapqVA&#DA73z9@_HEIAjOmpRO6NV>B?P$6JF&z_GA zAu}14Thuv9asEFb%J*bK=!GlnFLX3Nv_3g-Pd?)>`-WqT`CUKw<#dx7#N{S1XDW72 zb!@d=5&B!cW)1U(@0_wrpRlZ5z#8BBMZQA!jQE4pwEqXDYi(wXUbH|l{6gdT1;$_M znwK>;ES9Qo-2K{t+sVA^&1tq}hWGz6|kO%h$^{sOK_2 zf6>S)^};W~FTuIne@1(w^oNHQ#WM`Cc!Z3@=mfyvB1%EMMJbHcHCWG}%_X z;@u)8ZIR19FRFRX+{a96HhvG3eA5z=9y5lmcu-nt?|6Lc9|p4<4(ccB+5OxN4L>kx z|2ltQ?v$7X%A5_CtLhtc|LtGU!Z1sWHT2Jd>IVC|Vw$DS z9XP_YYZ+h3+q=RK-m>j)3}#<&xXIBytzp^nI)=vrC2C^k1%dC%6By6&?qQk7X|d?1 zWQB(Ii+_jDAJ}|TqS1W*2Zrl?jbfXdmfiT-5bUe8$c9JhfG=y3(jFeBKL?U)8uETI ze)%1rkjn8%eZ_=79Ct2$=Pd~pF^H>YzHBIMklZNM@gO?e;dnZO^yC8)sSI;ve~P}i z?|)$Jp9ek6G5fzWSLoi1zwpac;VfH@M}ySt{|&EaI4BD(_>hv$w)PQ&T1rAyGJ6@@ zj)v)F|5@JYFwd1Z&+%sNe`c||{|)8a|FQ3SZeP$PQZn82uz1;rrqA~eMDPC3wEji1 za9TRUT{Y%a4GzyA{bljH*ibgTv2Xn!_BmF6S$WRSU(mYXzz25OS-ksR$j?x>XjpvU z&VfCu3|__yOr0G}7nCa6$1%C@ZDiG0VZf&A^_)qM?-@gz>WYUSSxs(z?GxSM{gywY zlh2@=(Y(i?QB0Hhva&&p!}KeLjQ&emcZwF}2xat$nylh|lgPAu*N(>Y^^Mn-{Q1Rl zMt*){_pbYl+K~@B|DRb9`~JY6FVZvgZv3xLd?3g;&z+5@`~HE4>L32@TkzHAz{EBG z5BP>W_{`BL_=9;ynH__6)A|EV3?{p{tZoaGD6=ttm}BNPq25vbT9fn=2kQgM_ZGy- z7la7yXlL1S_^o_F)>HcphMcFf;)lr2eZYd z-=Yy3%?9e+DbCWy1uPOYW#Y$#;2dekNu zajikB;lD%WS9#?fmsosvH=pvq5E!-KW6FgNp^Uex8QY(gC!BvGTJZgc{)H`iFKhxY zRM~!5VW-Tz;v%0_EmKL#iToG4yaJXBZ}}!-!hL{gjY8vU7D)$p`Nq67hEf@a>y?}g z?y3&#r<=`q8>J-d8+*Mktl`g?tNG%O*M+qz3z|FOfs5PVa5 zJYI3n_z&x|SiT2s2eklbK4>TEbc;+m4s-nN&pr-cY#E1OSFLrq(+-2^mzp%tWdBeUZ%zjHf8I9-h?H4Kd z@QC}c`vVbqjXno;u?9EO$i|nS*bQ>`uuqG%zqg;=%%N2=QDfvCybz{LGmVAXl>Z_;&GpNsGo* zE{)!eOzF4knAUHoWP2l1$JoYbZ4fW{;x%)+=n{!}_SI}L=l^v#%2wE%pR9dd(vC@A zkJ2IkLF60U?tdXfXG1$r)OMybOV&JC$#UYISwd6-gRf!ZvWF1|p0_dzD;7-D{PAb; z{|UT869gsPE-=59^kk<&~b0Tk9E)LCw%7F-`E$;u#11oW^t3P>{70bJ9|Y- zs+lu-d6`$F{}4A?#F(?BLF{Ey)s+Qv*DPpWwx3B@HN#43%LI{-3r*J?|1jNRf3>of z$xY$J`UTEij*HFLEHJfL@U_C>x5M|;Pt4pG-s?AB7F+Ov@u#fCAqJ}`rjmYDb&cnZ zZIz9|0S|6#H}JBAeQ3SC=YTIm%z*+1xkkoWdMtSk4ERgkG#AW1`28OfGxwF| zM=2r+46@ElQi`l!e>t=tYZ8%>3CZ!Q0ss>}Brm?!w6AyDr^uGoTOQU)6v z&KI!wo@{(1YQn|LWBj4^#DbNq3CSE+cC*KtvTl;MnakMY9iYz=lhNSD>9APzKntVP zGWPr8+^$wGiEEhafRx~lKea&Ke&oTPf&Ia~5o0z0mF1V+g z@r3!x?%(Y5?)_tyyUWt6^_NNZ2JaSW6E2QhCQS3{82c<6`%M!5Gh1F`*&-|)al^1N zZ$3j`Tl2EQgRk`+mCvp5;n^U2dBH{gfLovg&c22oU}AYvHo@k_43P^REI(#Bs+~w$ zfBwKl#|zKg16+TKM{qVS`*d)(r=xdhqqdX6jZ`@u5|QOi#;zu8z{&7H%+AkM*j+KKJMCEg1%N9r>a z8DLvFoa_&-%%KC!A^iBsQBv9gH<9j5$;03tDM61hF+(&2reQ@V)Vp&W5RscKKiU z3+}4CaQHF*fVZ(dv$evR16z%J4t!wD^G{*WJ<2fmEr(TCv#3Sv&-fNm_>V8W~u-;kHYP@2#<_e}i-?Xw3KuUT-4d5;gPgy4c~VaK`V36Gggc#m@3N%+|R zlmEvHt`9fU9Lk&B;vLu{HZvTS*z%GmLCxaA7qbgF0dnl7 zQyeZ&UJ!d}fz2TXpXc`**Rp?@n!lh|@xZ4y>>o6`dHj`VNQb!-L^*w8J+j8Lb z!UpB53uI3(@UzhfZkpELFl~QB+B*mK&gQ%=3~wuHe|^zq)-JgBalJ^vS+xy?OmZ)o z&4e6Yi`{Q5d&Ru`$&7}%ju$iq7EJtPe}T7Y0rP6dr=}UadfG3zTmmW&^W0?lE`8$w zWA1^6Y-UOh?nMoMcyHNq&dOuyHEEn?-jMf%q1AeY4BJ`1#%WTuEONH2w>bH%%-BlG zG&BBwVNYNd+@dTZV*cPXR|8u;^IB;{biGx$at5NZt-KF7q3fwz;w-hgK?pwdbYzQffdVA8RoxZlHnDAMQ1vEWb*M}u!q6w+gs}b zUW6q)y(+@N};+~=J@YPT~gN@DN6i-${Q(h0_RH+Bj`y1xY=|8}xmQk#xakY8+ zX@A1oJ@g=3+tK=iqxIKDW5G2CO8XYX z9$c`vdmq#Ekj6ey=D8PtNJkVjJ^FR3wVP)_+gZGv?Z7IP+%6niuf!>^Luc zV-!$&-d7C9_Qn~q!UfkAgg?|Q`+wl2 zPTGQ*@eO(GzRXShU99s&_;=l9nUdyse9MPVo0<=^@43fg(aRns{6qLg!7t7?88yt` z4&B@T`_Knw3)@fpHyB!S`hM`o#dExR(_nVbfSF&J%{SVRFnz6&Pv&bf3vNd`C{LF;(9|?Pa7LqK#p)CB4@gGJrk9!RKcWb}@HD%6dH_PDFv(DIlYyWy4p92fm*XJyl zm?V}^_vh#b*&Pm&TNX=S5eR0JTh1`gi8c2TQ?6a}v*!N~*jNkJDs3=ivD4?bYGU=e zzF-sMmVZKL*sf(R*nL(}`p67Phj#boX(5g0YMFC2D!%hoT;}BdaHurEo$1D9wzqrO z*M4Wpos_`bw`2pS!9nhT3#AzgjIPs{<2DFYvIukTDf2 zxW%@vmucC~`v;5_9bd|sygbQv=Kh0Ed^fxqcmA~g5|9^gyqC4)5JLvbXL%3R4VxJ5 z>M*bQaq#u)hNto?YX0)ah_J7!a8%A+Fi|8Rrty3(%i405vkw}kwKQ0rS|FGgc4F_k z`whLh7kGFzcpRnYOFR^{SaFBhY+1c?*<7Or{(N@7!e%L+16}-Y>|d z%`Oh#oBF0R&Hu~3CdTn~p*^F!yTe@ef}3o&H2?9J^axzAJrF1{LH<9(U-nxIIcFVW z=3l|2%vf^fqVNMjxdXi0c^2$$ZOnD}u&6>U;pj2WIc_!luPhj}Z9&&N%;vu3@{Kp- z9^-V82Df(yXXi-#YhJJShh2nyDzl8vfpg{syZEPEcf5Q~=RhCh3O)w@EC%OHwcrt1i%r#kYnQK?}AK?v(e;F;fk1+T++Z-?w z*)x;h3ahVw^R zpXtk8SR=WiAf2Vuq46oRafYnL21Ty8|GY`euLTRLSm!R}&T06|PNn;KMTYxW&L7Z{%(Fkv?mH+lM-TjJQ81HN872Y#_^ zIr5OXAmsby+wwd*3#=bBJ}Y1}X0_h%?g!f)+cQj2)?7K!4X4aC10TfhVcW&y|K28z zVQ$1nQH#6UESH$)+-251&-hf>EP?$E^M->z*ekAF5`SQrwqVaGW-Bp{h@GJ1emky? z@iF5T8P<|E#q9t@fyn?*6UXm>}7v&S*jtCH>&IilTOlwsc-^MY1UEt7b z_~Djh0u$4EMHc-ewx1$5}>y;P2C!k{SSCB^L}scyT@SJDLbQa#zA*qgJyS? z1J-p8+=h<3`x{#2%?&o!vx-?Ph@HKlhdGL!Rq7=}@2tkEl%4~Lf?^AHJM!{f5R_fO zHH)!izZ$nn&VlFkhR$c$-t)AGy{SLAnBhR0;RYtAwaUp%Y5^BcFy^rET&ZSTugPR) zx1YIx0fT9cV|J88|Jno{{pAy`Y+`4FI2f-Sh!|^_FRWVwi2Ef2SVLGEcBb; z##=F6GvJ;23kR=+gWQ+6qvAPVJ#BC^{m)Q7rNLOEKtj62;dy<+jlV2rDGsmo>zK5? zFU-tXAbV#)?Ck}yB@4bTT(J3x!^Lm17DvDQ7B9HGKEfBFj3;d3Z)+_L>E*aunung$#v!PA5Iy@Kb$gOfB*f; z|Ds5Y?ZVd5{|&n%>zS5scD%fHzeDis|BcyG8+gMmXnc)Nd{D%du!!-k8FMewKekv_ zb`xfkx2IWdUFCh_)NFROflrj}YfPi@`vu+75;q#WRV^C4c(#UFI`bGRkB4g;c1;rotG3N&{m|k$qt~w~2njpn6)%F2zkHr z;e{FZhHI?7Qq9ZO92CwuaEvYEt-_C{kPDY&9;~p);ML1uz99dgP-VgA+dCXmxnEpi z2w>+fX%V<^r~klHodsUggl`0dU!0QkgL~E?_P&yabtaFevG^4-y8AlJE{h1LXZh{L?`pOS$6N|_v6SijXUIRq=quTDEx7r!pm0Wrw8b^fsNZ~6b*wiE{&C$( zVb*%xkf^|MD}h7iBvXDB^R(?7CI*-#$fYqqJ1T$RqVEMkrv+QS%0}$_!;%-pu+;v7 zq3(iSiv=%J6B85J0-pb~EwE(DNO>u};WG2B51-^`{F~XhStsX!pV|wJY4!*FZp%NI zqMq^Kq49=)KN$8nf9EbZ$!)!uD_7V}Z&j9!xrHO7)=t{-_d z2{)PKA{cUWQkd38w=Jo?u#Drv+>Z;68C2+6Z`i=nd#H$!naL#k2zN{}=PqMu8)xPy ztxwV>&YWlD9X>mluWGoYr187i?V01^p7{;S)%P&X<>rt{ea86i!!!1?YZ#@))+|^m zcVNpO<_a0X6}1Oh=i~+k1f@*47M5J`?~mo-`SaKC$Q)2k*vHJRdBM%q&advlL%{>T zxOTi~X5AqtS;D7NV9UXraZ38i0_M37Iak#?HXAO8ZaB~z9-u4|QD0=(v~C~kJVTB< zE53+E@D(xMW!SZ?k9h|pYl+9#@(-c&LFa!vH2-0pwUKdd9ix`Lqw<0Uyum&f9L>Z6 zoS8xz4oP`EU=lGg;p@@4u+Hklq2h#$M!p`Ft$+SIxP6vb*y|8>fzR^77yb+>!3e*m zYdb$OaTg^#pUEgv5#PW*v5Eg8i|^8=Ao+}5xs2y8?Ju0OeITNLVUPWT2KIT|nMKl> zW*uj<@t?pN@naK%v)rA&+ueZ%mIQ(P5R?7#kCp64U zXj-S);>+vUx2ZuUg!h!ig3Cu5=T@^_2w`~fAnw95(SVcO^XeEPKg!ogh%;LktYy~D zc+0Xuo6YWvRLOKhjg5@jnimTG=U*`4Uh#l=UJu{BTFzCyjk<^H7nI5z*ebOkd!@ti z3k_wro7_ZqG$<>sS&&$^ApT~fsL+ayJg+YPV-S1y-|@2Dfr$(Oi5yamiHu@R3y$7@ zu!E65fyq74QCa>0ujPUnOlhVGjGX)GB{leOx$;_ll-ttAzonA(iU*^=^k*Z(0*33V zf1kCyna0-tt4XW;!V8W9U%85Q8D-`QVdfti(hn|Jtys<{wTx}8A+xF&TLH7c4sF3X zdJXRw%vvHHwohqbt8-|--qfeexGmVxd|$)6DCW8B>|9&{uKZFbfAUB9Gv4~Zn6;q! z5<`GciK_^A#z*ZJH7W^bKx^{@O1w!7CDqMm;dUBY)ml0la7i>QSAg6ti2O=6px*C{iX*Z*&3?>iX%u`!S* zYBfhz$R;N7<;`V=^~`;H>R8q-W-%>eZFqQ$^-ZL4!}7H=6qGkFXwzOH%<^iBL;uUh z*uL}3b8azyUA3=4%!m0dgO$3Fi57#kvw+BSnFV(n9QvD=1ss$vcj)E4U|MmYy0Nk` zc+-Nfsy+uwqwm)-tu9$mUC(^k=Ec4E3GxTTofx#;6QVm9w^#$^c$8CSh=Eab5YYGJL=;WEEa$CjY{ zhJ6FupF>|}GH&@NxM!W8PSwv*R>^uiiy&oTfE<`3C zFgeM2X7hr>bAJAq+4wzUlR?8f`KLm{$qZ{>S97nKv5#5$w#@BO#EC(Xb?+I+#qj1L#N4w$gZU1cnHXq>#@zr*g2GY_(F+r*$P zcHyPT0_K{V2adlrFg}pxTF1mJVDpQYC-8#@+lr=yhAE8;?)oh_)hubjbb@KF8v9c7 z3u~?8@9#fIoqlA$fcaD7Y3l>hVGW5)S$CS2g(n7o zTJV8kH}{h7-{n7~83&~D-ZS|mzGb)M4GV_*%)EOJN^Vi(oUzT)LHfIccSJ*Wileo* ze9FlJd$@yA3HD;JpNu05`J;LL~4*RqGhAH2|gk&xl`;Fjry69O;RC5Al+ku-jx7j@yI z!hzWH`y1Qu|6`QZ;gd3FSi6*E+06Y1HpyHGWRKj$y`3{3;0Ym_$(Wgzn-~pj7h_?;oX$~AOG=I9B_$on&K#M;~``GVh*3= z1$VzMI3~2>65HLgf8=j;F!ypazT&&^O#ebv{)ZC97Zd6dk~^3~`k2{y91_oQ>ag!; zw2pXiSzh8_lX-BH8{8^&2L8GENS9um2d$>6*7KTE0CLG?5Pr*-bE%ZevNU05c5 z!EH|b8<_{T*Ul_3VLFq(V9!ymHTDiq*qL(Hzzn{cr_RTRn#PRs22B`@PR7D;vO+2uH`6YYrxu$o*>`#RQ+~s4`|FO?? zIlvURm+jS^rsY2x=b8oBGH4q*1m9VZSrhP=(@I*{#8!tXC#JD%)qhs~Lu`3YOmp2B z_e|voIp4VM=M(lmrlxC~o6pszGL=qg_{d~c^yX~$be;vDLSy14I*L@N&NeXk=fJEQ z-;mDU^yegt&2`a|X5klnxnT)6x#sb)JxeSL_{p*>ktbwXlhoCm1*VVI@GN+oUDv=S z*zi@&@QM;6Lv9P zm0qwiU+lwEp##7E=o={hXHRpvAR_x>1!q7)quV_PPR=WF%(CSSQhIE2g*ogvWg;4z zrM(w4eX~#b#b2_}P-BB*wzq?__kvSQdnWT_aK8A)7I2tlk1~72FUMuVjoA#1tv1#f zzdy^L;83W@J(PdqoY;j6tS@5JFZda;U8rpESx}v#Xj}HdK>EcQi3EFLmyJxzrDq&$ zZd&j%{z7Kh0$zm!g`Nu(UQ}>h2oc=Tc$&kqU=r&V3keC01#+z#8w6NP3mk%779462 zw8&z)C3&3T)*l8LQI@+?Id)x;wOPcGcgLXNx?JP7-OW)?7MvBRZ>(ck8m@N1L-oan z@CzFhHXQsYzC(|rB3@cCn#9oZ(xgWBNnGrgu9T^yZ|o^fLZuj}JY1=FmxoS+iK~1~6K= zF;yh6Zct+Vwyc5GQlq!=690<|g%1bsrXls~|x@MNC%g1ru# z9m7{NUUP1^miLFHcL~#DMv?mqRythx>axIsskhFMarth?*C7s5^)d`3u54yqdzM*u z6YEa)J!LEwyN4NMM8k&v zY zEHPnv@gOCkhWV)D^VGlWraKy2S+qZ#i@%_u_d+1)f(EbghcL!~=iPJv%YRtq^FWB{ zK~qHlvyjQEqZ~Z^7dWh$GoEXFh}jpvVB*X73wm7-tm7@XD`x$H$K=AzNekHS=_fq? z$X?*WW^(%w+nbetSl8(@_U0Hg`?)dpSrsu^3(q+qxbXY}&0YH!*nIDA6rVAT)!}*u zqx7T&sS@!Gz4O(lzcZ|1TK4t(0zZ+0hep;L8d&arVa&R~n7+L6vULs5f{6kFtt_uT zHof~M!XQ_EfImi<^OeaTF~)hFY$ozy&l)bNt*~K~jp4p!d-BjH={?O7CBJ$1Fmh;3 zci{fl*yVWrUE}pqC;l6(@59)x#_;$&Fl}3KOrWAyuth%Oi1?KEb8vH{7WHF25- ze;Y0t?l_UmboUXX&x?p`LykY z4ioEwlkD;ze(7E4^<7}vaOc3DAKbgrepzpD{v>HJmn$ltYnB*G>{-^VBMtdK9x&?# zGp;+!^frafw|Nu8^kxGl^XM9;W51&xaPVeq;oq``dCxi78x{#q9x#aK{&$@EJpMvu z*&3cX2b3LlG`>q_dUxqBmkD>s$tHgphOKiN>zLMFWqW^ueOkRju>&v51s|pl8+_R= zl>Fy^P{bN=i@Ensa~`vx09)wS16$u8n5KAQ?}EkW9fEJXIk5Hmo&#(e8JQd}4kQK4 zA+Oys z){;#uD~uU#N%C!BeCUWTgZ~UrKVac4aMR>-H{|xD_ zbxi4&4$7qqdW#llI(~?HyT4xH`GbGWcaoUzHE@>bS8P@YkgqtxaifD_eSBI|iJzk^ zOJc&E#zRlJD;_I;;4+#p+u^l;WAMxxr8zu83#z*sA9BqStN;3nmDzg7K9(}Ke~xC8 z8{Y-9%Uruhdv)gPQ;->~Ng?;2s1hS^#(8^4NGWPMlP@sdSP-{JfJCbRpE zryK+3Jz@DJz9momN&)lLqYEOLKYTPkP{1nN#JkISrr?cf4E+A47u%SVG)OB{RJ2And`?J)-YXrd~280gUmPO^7o7yrtNQ>_OhY8p80gq1s$G@ zRe~i?F3L}=$%|3ZAolD0uD9Q{Rwk&26pE{Nh8^1aHT$yeouxR&959%C#c4#fXVR zo--wdL44JMh1C}lXHQ@gS;EZ~S;G6#LPM}w+c80j*-d(bGmq75&KZ{*#HVa(GP7Xd z_PS8T`QhMkpZ^Ef=3nSw+ri406WbuAx}a1fp`AhaMSR+YFYGCs*>nE#Wz1#UF@ZTX z;(}x=Psdq>2dtMa$Z@Zj&KCEEcb(#a;$si8pC+)X{g{xM(9^{Cnbmi0^6F-@)cOa`<^LVpEF5PFUU|%RlY5_m^p*g*2*r<#<~u$x z8mpO1lW>q^DUm%VpK$mse}S*uiVN(ql}Gq^B0g-eDR?V$BIkmiN5P+_s`3RZSuZr6 zKG4FpOO1DnS|fAG6b|+mN%|K8^$*CNKEU%;e9LW-8#fZ!zQsAT*EG9vIdaE4S{ogl zDps)fN&E#3#f(^u7q?6T4$IDHbm$Iu+#P$6H{ilWl>>nW0gg=f{xHNGX0nvma2TGXMOmKLfv$4tV75gn_sg2C09~@+rFTCK+km3nZXmIn} zabWtR&5iGm{N=uLlS4|EEwo@k0o&Ji4%tWkF=)@*e&F@2eN6lvtfp!bjoCaqXSN*R zeO!Ma?jQSusEO+jY~ESd{635=uKUROQwj=PHW}0AH#3?TF?P+a|L>^0^?>C!I<$A^7==YHQsHL*<3bW=pr`h9-809S4{hl_t{c~7c>|ngJvDfQc{TrS+4rVW` z3<75SWzOYc68qv)@9=yx<8gIIcP9qvrUjc%)G;p4bja><+-~-vgRy*D5%cwgTK0Jn z$62hFNLje@&8cGUeOB~`x%5aKL-{3UY3&7%(|-Jrbl815qM_HzE+OJ`fpKGcv>ns( ziT2FP3*_zD-UYF|{lyv@u|QK_?SilRfz>@r8nT&}{%mwFXE-f-LD25O*31LHCpg;1 zs0H{-n=tXunZ+u%_8`N)UA#q?c{Ji2cx69`W*_*Gmeww#$UG~G$z0)Jc3xv5P~iev;|4{*H^_eMIRC zGR<#XlDohwZtsw;#&p`Cfb|%QVY+AK{ur zu8Lp0TQ*Bx`Ok9KfaO*K^PMMOL}zTj$N2f7_=4&mkq$rEExMR^*e@iW_c^esNpMdc z(+ma2%@PM%f7&cK{JSw#VE+z|A2B<=ADC!yVVBDUqp}M>n-6TAv!MBzaG)mGu^^%qe@IW}=s{^bGTyO@G*R%J(rzJ1;2BSYUc^0WZUXm%#xxO`r5u2(hhA zXA$*Yu(e>$fj$G}4abl1m35B~@0Cu*zN*G)3Jq>A9A^hQEIztm zlUxa#Rz|FRM!H5trO<``m;*&TTkHf(b~CSC^LHU@^ z0Y*N)fC|RrpX(a0Suc;hC%iS@2w2>Rl*Kwf0^2}**Da*&)Lc~D~?qz zfH$w8@!FM5P5s$FdFCu)U;CKFbeCk~;;;p?m)mXL%eszHES*7i3GY4$#u?LY+^Cdr zkj=Uf6?NgHw8HnM^`}_g9%6rX-TuJ2XXb1H&itF~L`$AqYkx>#yU@w7KviQwAJ2-% z%vnqRH}WlNu$r_W`HDmEoH++desNY9b7!no|B+#oc7iQ5;4Zh+mPCfTmzdTp_{V6i zZ{LtD_p{+OkK=4>hj%|%cdcZTcsJp5*#E}s|C+3ta~8;;T4nqbMF!txpA1Gm+5aa-|xTe zIj z8lqnx=n~kX$8EEhHOruBS)}9g+03d3%jYy@BrIsIvRyFmb$G&KH-Q~#>@gFYug(6$ zIMqzy48y%to~)~X+0%+HtbDg%qG~|1M2V`%iUmwtw>a)DceFM6Fy&l*Kqco(*5+%M z|FXaJV>^45S=%vS*)P^RUk`J{JoqhN(q;W&j=}}MgaB8bS&7N){1=(H3oh(E>a*aP z;);#TK06M?*=A^ni|l)IU}0HUSRUJjzg-KIxg5M%92YNHV8F2U;%~k;C+k_>)-i|i z{5deu#!Z1u)gpjdbju47lRJ!BJ^z`EkNAJcvu0!akilc1*l3>2AguPH$FzW%xg^5e zz_6(**uLTQOovv*jLD1|6E`;X`83Q^=D2l{E3TOBmL^wEIo|_AO9f*G_fUfd{|t8B zNB>y+Rl$jh}b2uuSFIdddAgY^j{FV9z&)@g= zHA~kokhXT{t+{Z;FvC{U!~RE=;)jn)2bNi8Jh#Z$#coo?ZKv={znP;T@s0ii5n15^ z72cBIBlZc)(jPI%^)l`1kdL@gz#x99Y1v7|_LrLs8m|5QE6VbWX~Ew&4_-Q4;Og4{ zK+rBA@dWQKUnY~Ie}uP4e>G>`Gm$rnnYHKse23ck4d1z%^_tQjw#mFa#AY>{YfCo2 z1?wld9WS4Y7aY{j=;dWMDCT17U-OVXZrgdj82|5o&-1ed%zKdXh-q8ljDzO>4OP?eFn14$htI45L$50{dR&0Anc z+sotT36F&$el#tM{#Vb^SJ~vgu+ewn{snW6@z{jFQ9u0Lf5O&+HwWBg%`y9v1lOUc~D;myC`Sbm?enl0>mT96TUncfUF*#hF@QYQp@*tZJ^P2-Z80Iqm z;@z?HiSdR)O`ba?U)Uou|NmjNvKE-K-r*ATGhRZBH z*#%aNTTeT_WSEg|(b9O`r*Yc!hFg0UEL^sK1E120gUlfuXYMcHQ+na!a6yeH;2`I# zzs*w83j~udWN2ITImj{voMq0jYH(|vvGDRQodxH_G6H3pR~%wA(`lGp7|~G3C?&`~ zwe`&bKjw^uRvF(dUetJ9*jc^cnA!^)?+Zcf7k(&zu0O%6`M+VV`vpV31sBug9?UZK ze6V+s&IMEN1Kt4*!4LNzw7%@9F1vxL{}rR`tQAS(1)j_qC;2q^9IVY9w<|Lqer<28GRNU^ z^8#MZ1*R(=6tQfXCtwl7x9&{i&l&BkMYlOJTBK{_q<7p&OJL~T@t37cU`9hKtMCgo zzJy4YeX1Nc0-17am`(j0%`X`+MAt1SO( zH@RgVJ)$aU$NXNC?dj?A1AX!t+bt^0ctWNzK7Op8F^%oU1*Y>IjcErODu38#oZyQP zZ*(tnw2o@Ld}+Z4_UVro?B40P`0|0p88aGx+&_PwXMuCSqx>c70bRL{u@7;d##%I6xd5AILa2NEwGyK|6usvMz;$Mr7|y`aR%Jvw~OnM z+_X)$r2V7+hUkXP7CH+iGfEt2-`RZT_pw7vGavrop0)Nj_dHhStHKNVL^W*g?XN!0 zFsqAo?L_9@xaL#g7u1&LA1Iy3v?+*3C}$DRg3rGXd@pgntfgUhAXQH}#oXw}yW+GH zg^4-`OdA$NatE+8ned+Gx8dS2nZzrlz;LzrK^bGlW`zPqOXCbPE{ho~QLm5l#c(lX zEopvrCjNlML$*FAqrc5p^dD?p@6+?)lhmF}&MhL`R=YUwrEun4X|j$!V8mv^#5*f7 zf%Tg30_&TOmGWC$9$0JCIY?h>;I%PJh~>*V(ey6*ALFb%R=JI;95Kre@t+a?-}vV~D9aVlK1_JP(doneogz~^&i!NXd;gw<1JwB7=y9*KvFD&v`TTo~AV2i+ua}E~-8Sfn6n$8~K@tH}O$(ntIAZJbm z(|TTJ-rnZ+!p6okCk`=Xu4-C#rJ>bId&5&6nMX+scjFK6+&jgkWAMM}oN2SnAI`3# z4>ubZ++)2EbK%y8dWY=|eH;vT4{C7i`pml? ze)C@cfn~sf*+vI0OB`sEGXCMEp0J}~9ZNDB@8M=K!6vtEhkgI~{qE>2*u1r&*W>~( z?}E?&9MYfvWpZWM5X9WSjZyke%z-OxR?8Sos*dtTiF2%~`S+i7{YA#!z6QTmcGZdt zvo`C$k2h|3_nGzU0SETf=5uG5&-XDr<};bfo5j#9zKZ#<$QI##=^cxCcZ5!O$iLz- zgH$h5>28O`iw?M*f8TH4Xzklr9q!2M`XFkDeL^|Y^}h^<`L-OMAX?EUW&GiW$b&Y+ z2ZsCyRxw!Y<<9bH=6l7OdxcRo?ZON36%$zd-!O3BlwZKS<-g;yvo{@&w=-N%s$+lk zn{CaWe~s64nT$<$8*F%}!;xd~f$8iMMzMtl1l7$RcrfaJIAc)u;ESPl1-mfw;qnK& zX3jq_QAsV~^_=GZsg2$ZycKmqFD~RfXc68}$TrK8#Z>PA_p8QArYU_tZdNq*x+Sa^ zlPLf1P(G9C`mI`4zs(J0ZH?zAvMiInkn|$|K&IgZHg2_q_47DyY)E7m)7kUrfV1t> z8IlzZ$_)p;sTAC0+u-qs`PSZ(CmC*4{^Z`F$+%_1PvZi|ALSQ%86PYT``4`A?r?nR zAJ%2+7X-O|7Bsgw1|L0eOhmchL?bV#&&Kl7T4OcCa?6Id7H#JjwApVkVwSzhFste} zZ;bc}hB=p>G35z7WZ0HG)BaylLe2kn#tIol<_wkZ@E_zSG2$IqGH=-f2@p>~1S z4}OE#f9$*F^3K@*Wa&~#md0?q!VL`mm!7lvS~f}v{g`N4Lq=f7ibrrv`q8U?!i z1xLC?O_-Ri>iKpEba_ivtXm>eu-)WCKycUt%fkN--&L8H&$e`|WS6kJe~)3kdDZ9H z4{wKG_*u1JVt`-3_o)w+KU}K3Fw5{l{&f9Ypz*Dm<`CO=_M zJ+t1We?PyPTdZx=VhVWAXj1iswd4=?hQuRWKA#tSU@gsZcpc-|EArr50vq22J==uE zf9*FEu=Y9?HmD2zV?6(<>f{IJlD6ye0nYq0-ZwnuFfLH(5VW|&mzB|UV}TLZmYG~7 zIY;v!cpS1%aQMff_Uiuu)4m19j{li1%j{_6&k@N@WEM_)#jLUb}Gk*S(o-mU?>qwIsAH(t3 z##-SCw;Pl#_B*D}Vk*|lu+`7FYhb_@>AwM0=MJqzaRMQ+xS#@#hibv zGO4V+=l&)$#>W5Po$=p7!lLncUQ^k$I`*(r_6?I{?Ba*-4NdDaxzGiv(;NPJ?HW>-3JZq5Po z2N_xglO>oxY-#ZCk27d^Kaceow|2p{NB_f5{A^rs_xOTT`#B3_=Nw>ceBZNRV&Vf1 z!3*}6WDfBxNS=1U{Cb1by#q-SG2574+XX&I6A5tV-Qp%$GUtYLf-3JWPZ5#-3nuzq zxMiG>%M~-9_YMb(OyqyI9FrP`vu2Fe2{{Kgi#dKg%;D1?)5LTj`&h&EawhBa{RfXL z{!L|g8^qdc)F^dUp}zJn?;6Jj=|4Y?vNW=LGDsI5F#2m=;PAk>AXz5ky1hl*LSxMZ zsd_pGj&WOO>{a>EBOBIce&F28{DgF_lD<3Q2^F>Mdg6&p&x9|$kuWwmTiEpcXX8`m zf{=;Q7E8HjJ$u4pR<@7fv1G}5vln{NVlQ6G_$*NMS@5{AA@eWyiemOJ!Wo);8M^A` z8he?gvld9#J3Q9i-&m@aaZ@tmr(}k%aRxu50VlIL6SKcKL)kUQ*|Qx^-*>#;)71Bo zG4?mxu7y3K8RFU(H_UG#*9JXsUuIqoy7z^Y8CTXXq<7;9xXg++d}?V0Dz^vyY7K2|FFWe`o&uzdS*@iPgk}d#4u5d6c+hkJhwPLiO$G8 z@ch_+=DVNRWi~RbwP!G8bnFdGILVR4(;&q1;*ZP)6U`U9=GR}Cr@F$GMM{=o>pDk? zXZknzBnq@;EMoYj!r0cHXS}xagGjAk^~Bg}D(ATJJf0Zz$izDDAP}6l;x}+zLSk9+3+tl(jb;WQt>Fm~)41 z{wDq$i^e~HxGi#cZt-%zI@oZAeQhN3`)O>xhKA0|Dja5tJy8!h#*|ya;Op1q*6X-f ze8D`8j9&2{_gpVL@=0)(D(TnASbH@8LSo~AEeyLZvQF{%-&j`EdF<-cG;o6k#T>C^>>c&^M~lP%!Nl4IZ&x^VFDg2k3~&F@aKnw2!h zrT<{hxx@H6j_re#`-K(q>?u|pCO-Ue4175a|C`Hr4tDQxT*`0I+)#F)(M|HE!)Z2$ z*SwCs`fMj|<}bLIb|FJ!hdXPOIj5Djz>GRa?#ciEwf6=vF6VL(l`W7JF@Et&`htmU zL7_Ewf!5dm{tql89qJp;^|3rv`>;h|g9F3bi7aa`GcT1cP~?@__51A z{(+Y~0TGRtOkSAOT$sYGA;0JM&$frU1;?MVKj{0Sf8eX@g0H_9Oq9H!!TjTtdxFd# z=H6vZ*S0db-`UApDN)fFoOWkHX8wZ}@++?MT1g9)JhaJp#d+oMf5sf1CaX@J1NW3N zs^s@nGR;`_zqxGdALhI4d^s{r(+wE-*E1cJw_Z`n=%ct`qQM1?hw>++h*j6!@Kvtmvnf(xJhc} zf)~tBRWFnXX4Jkezi@D^{mp}~(-l)iQ`jEruaIHvZE7-W|HFEAnt_4CwG8KL7R~B8 z|D3M*HES6J*fdSQ)^IBF!U?qsE7?iz2b4{DCTJ#qcp)R4(JJ!djCsOL))4kt*Vs(? z{yAT-YkU^wI8`%a2D?oVr;QlvlsJdQf;tZF4d)F1aLpj&}rq5jdqT!t1AMSN) z8h0;uyuACt+^+|g@fv)PZ2ZV4wUOOC#&NRyfr+sfu13^5?7rHl{Cod_aAv0Kag6Sd zZ#MAqUGNo{bHMM7{exwu7dHAIc&o{?psI~`M%#hw_ZZ!OI4Vah*gAc|CiW+K0XrGy z@iDIxXNhI!3gSOC`+=KbMwOI>2cuNvPv+R;?5plnI?fhvnCpDuV$6e;g%_-f6Rene zzy15eE!oMwb}p0e>&9j09aA;LFPvZSwPeBO7{}#2f0(AF-){)#ZdiYf>1y|az@Q7a z?%ZE+_v!zGy(WBlX%Axe)l2MaUN)&w!bE^ci@$zzK&wZfmn$*kYOCEM@&+ zUfG4IQx?P?%Q;}wE?TjMBV(8Nl)C*)<>gK13xBiUJo;C#q+fr-9=2Ym#%l^iOxM>p zT|e6NNVI01qQ<>Q2?zCnhHKZF`kpcFlr?eXmI`IkS7e&z``{D%l?3LsAKA`c`on(r z_)(5B;T6pP*sVUZccowG4POv@#pi&VL54Snb;eGvjI-7k@)u0>4Y#3;M+ z3+t9@=^fi#7;gNWAR@?o&V->{i`hE(!9~vtQlSs*7(Va_8~oi^%*nJ~k7Zi#f!7xu zq@UN-{^PX^;{ zVqCD9bB7&EnpA*AquX8wcJ2DVY_~K%wldmHW-*bknapnx-*`=>`IGXB7$$jrW}nLo z0%K1s6Y?lyy}y9%%=`szx-0CMKOQtMWwd^^KvHtT&IR8Nx<3fCTc8v{ySd}w@r{KWxC|Q1SpNQCx+~7O#=GJ6Z3%~$0#nj%I==qVP%5^Am-$`+XAXPg zw0#V3+1BQYv*lGVEiD#EOJ|NP=Cl&yHCn}gYXVzTACp!8hwJVSjLg=p=dpL3EA(L3 ziTwu{m+oI+oOtm0K1SWY-{p&bT5D`<+~(V?RX*XcgQ!)7mBf}%t}7dubUoPR_i=0# z+cKHES+t^ z>1SMK&)Cbe;|R;w69+C^Uyz!|$dq8+eNegF!Mw2PnmmJh-9Kh`O9$&K4#AQ34!xQS z_SPS?w)yAqZWrs?g-m81j*?6@DNGr6l~x%2V!qkHbZZyyt0TsZZq|+O7-i=&Tdn4p z(r{3a#Y&s6CiYJJ11YVr2L~svd2so)WrK438i&n}>4J^Z*c;2aoBCQ={MI(TTfwsS zKSTdKChmlQm_KahCXKxX3uG6tNoj0sJ|~~Ta`znLDU}0fSgc}%N>U{<)+$;T?2svm zmCDHCGzsH~YG--n*?7K+Wt&A~stI#OEQbbTJ@Z}T-=ZdRoI5`YUs=qO%5vcf=vd5! zFX|oao5M02_*vPuZi<+BaCf6a@Ub%oSh!y$HmcP+1Q#sOp6I}wvw-#Tn?DD*#8c!q zJU_>wQ&Zn;Ev&<%@ZX?m8AoGwu*2fM1#_1!SiQ<&`Yz)S28IW?xG!8V&A2XB!Yaa? zu~|rCVdM6X|C#TKeGtwOdvRy^{Re{T4>-T?`R~ZR_dvK*)3PZJwmu)0K0DwfWpak! zZoN`@l&EY7XgXu&AQsZRK9}j3HTQ=F&+F|QpBprtcVp4hd-j|~tYX4y zF3JB+W|JHA+Sz+AHEjFPEH&$YeI1jY^`oR8+&0Ue$iFzj$`-JXab0#&wxm618fG&1u5($x?+##-+vJ3d|~db1%5&qCLAWWSgh8ul{B*{7yS6B zud$G!e9C`jvm5^z+z&|ZW4yk@HU!1X<@c)04SU&Ul*UZnDA8b(i zz*L%`%x-b&3!6m~)2=@QioH9a+*)xU`%1%H z*@T^+s)!R&D>WK zn5U*Mi2S#Ig6V|?fk6SzJa;_Ure;FR2!Jh3g^Q$${*b1g z_Fz`f1u3r!Zo(Hn$}V_mcVX|%1qEzBf9hvMiev~d%&>RhO}Wr`b;074e@t(g*1lxU zeZpLR-`SEPj2Ks@N@7u!Ym+FNahJ!`)kqIU5?@zh+$~8c_L9yrN)J z#|jDN_ANSx7vJYUkj=KUv64~5eSUpiDnqUUqv;Qa>r72zXPVE8u)VEIZPaQ1^_9Ph zMY@8E?Z!d2vo=iW(;U(lH051m+-m6{8+pOdNylO9f^&8&{;E`(d0+0Sbz$TtiZkW+)uF>N- z+uZTB*v*F5{*pHww<|He7i65pz3V5>mMuIc4lK8Lc~2QH`271{v-RQw-Lek7Aq##x zd}Wj_h_(8$Av2+lVXE*0lVePlwG4B%Nhq9F+t)ljfg#<*(R)$D+xGecW zUfu`xu*D?ium3rGR+Blv!>~(~?amBVT}7syjB6w%|~0&R&9$!0G5 z0BzZ#IB9cc>x^vUj4Dx!Ie&$BJdm)lWzPD@ARW0N&_3WP&%3!sn;Xm78}D#vu4xce z+0epzEpvftFwX)utrgFCZbdLitz}uO`kUEGRwg2%xIsy1#)E$wnbZXxlw_6hp~F8upqAB(5>O27Caabb!?#tGq=1B}v64{g!t9#GkA;+$%OfUE@+;S;sV(rUoGCC|Dz$`w6 zN)dxM( z2S$zZ^#@s{G-3{9pKu6%e}IR1)s}k4>x-Jgc5G@mf3Zo1m0?#9`xY~y3IVkzGguOC zvGUqAzc*wJV_Gmf+2Q!(hH2&vZYhq|Mvm4?{u>)L&SjT&Wixe%`0soy*)gyAZWHq< z>jlid2e0cgMr$uHNMhO6BH7r=eOUg2qmV;!L*gN}C>j2q&GGvk76&bmE|id{+rWHT zf?q}d;3cCKt-O8gY!?phUNF%jzXY zFaO}sJMsUT1++ttQC%?jx`IZGk)ORke6_N)F z&$HOgV-{(DFgv87RbdA+i_}@hr=brtR9>9m7fVQ%+2YAnqG|JDUXa^^S?lK?=o6^8 z%(3DS^VvRzyWF?#@=5JwyBotaD~~O7g?+>62#3?U77exq0qmdb3&ibKoJnRdzbA1p zy}I$*oj;7G`xay$cF3ON$SZ%LDu(Stp_9ym-tq;fxUTGHmhWbM=h5IcMN&dRI{aVr zX`_PY(-@6DfB4P+A}r;?8RjLExh0o2tU1rN{yp2N|BT`_JP#H(JKPi#Irsk{OTiRA ziSrN6@-EmKxuDhL%mhC19mTvQ`Y%FQKA1?Blrfhq70)jX#E zU1~gAwsBoqz~&p<-2a_1tZTtc-3!mA`5*ZF{Xq7jnF`9&7WlDi)Hc3zVV9l#iM>ST zUHyrRfeTXA7bIKFXy_FWXz%|jU%@etagQQT#NiDL#xgJLsxL^nnI$ZrAUor}#qJj%dm-g%aS%`3xIsWKyj;7Rhv|To zP)!JrhJE8T{(tPf|NbWb;G46Pap(N#3Gy{2N9)5pVi}^E&oJD&%P$klD*NZ`M`@w? z3sxov{AHZCIEgLv{edF6k`)FU3O@_(Fy!4LAT*`U(VesLx=gc~Cquc#e^$TPCW8uP z&H}MV@&zvQI3x57n5;i75cFbuFfnq0wwYsgiX}^g#EypG(`OdU-PALos#EfY<*zS) zOqn(2H}_qC$S%jrd`Iyl!>+>;TRNZq_D;xTeYJ-9GUp1Nzic@jjn`H;Kbp+GqmOsW z{sY(3n5;K0;B7ll>B4rQ?a2NG6Vo0Ti5J{rlznrC=k6C4pKzH4ReTbD3!bLO*EyE) zeP&!A_LQmbSCiCq`GeQ9>saTP^Tbti=1gh4wy?=fiM8P!^VGKwp1S>ad>&!oX#MB^ z!R9EQ1xte*c00^v)=O}nE_!1k>r%}Nk+bX@d+Q%q2r;iX%e+fZyk?3tH+RKa?Tjg+ zA>vK13e5uAg>PK@#h4S*)OUc<^q<3Wi-sm16K_T9&Kyu>zjMH`C;6DKMh#W(7VP1(J14y7$QyCy6;6!uqRg|lu(Q3< ze-Nb*;K&qpoGEJ0Pj0JUY`eMzu0$uWh!y>B*jqedvE$+M3p6bQ4zjH(aJa0qK(Xq> zMB@i%dwL#pF!(AqwOKmO$m z@r`a;Hra9W&IP7@3%q1X{+-u9_Wr@{cE|K@4a>GWDhEzj`}06)u*3eQd@Y9FG{(aM zQyLv^UzBX*4sqPwiwDv25**Zt(m+u>_Hy>dCxp_ll z`GzJf_JEY8bHjl~Hq!-7R{oW@Y2&@+#=lF7-Q+3Lu3sEAI}9$wF8HdgGiO0*(SeJe z4`vCgU0AqVXF+250=o+u5(a@y*HoISwk_ykib`j+)8~Fsc3}lmMhIVsMFam0wrxHR zi+vYpss^w#?pelSlFKfY%Cwf71?Q;4`>zR(1dXraoy#KVOFHa<$BHFIjiJWWCbD?Cafhhc|BWFaC=LEO*a*WDl9i z$Siorf=Qm0Df7X9=Jgj@{8ltAd)d&dS9U>-{lP@d`}^w|{5WgV7-a1auxybJxzW_O z;=!Y|)^&`jX$)((Gs>Rfy>;^kw?!)NtplufbLB1Go@BgZc#%(w2f=TM;4>l_n35kCTwp!ddz-;B1y{lpRBqsM$GY`&nxFG7jV4ITihj-r3;up+g zFyL>n;;WB1V9dKxeV!kXRs57e=gi8*fH*O0}0A@Rh5 z%vt{rd`;0g&}+S53!j`P`&>bGskN-nq%ZJrRs0e&dBy%NoOyX1=(h1n&XQO5!UZhs zdo*Mu{1<#a4mzH9tH%O2R*iF!4!!;fi&&N_f6!pu@tIre_`fFiZ3h=WUtrp~;B3)? zr-l#s{@54XV-LOc;3EHm{Re-?|NF=6zr0C&kFjyn`YPuBh~_jMhlhuM$Xm&tWtn$~ zvCuJncGD%X70N7|q(bx?tlSoqu3Zq>G9Pp;@h#^I4h$OhO;R@&9L{SDZhkN^@5!o0%pz_D{2ay!}O z%8wsl*Ril?=3n#w-(ywg3|X7?8w8pSKAf1Szu@iK1txq^?>ViESS(_>vyL=c?VKQ} z;8tMCY$#tbg>!`*`>wzI7uGJgxVQg6^U9qK-i|vO)t&yZ$xh+d@vm%bf786I)A25Q zfU{JI`LFbZ$HFBNrYCwI@cJ*vHf{{>He_D@(lOQe#SEbfg`p2LE7&e@iZ9@eK5$Sb zVJ^Fsuz-mEngc%`GQL}p$~H~YzVYcx{ud`iGmaZ)lnC3bU=CrL0|eT5!?yf|bn$9zpdCcbfth;Sjqf zD}nlk^2bJoPEvb5_!=w_%uG1m!))=CYu7e0k#F}8?%vY4x!}Mb{w#~Xzu9jV@_b_d zaV|EYic$74)2po?8l`#{^xcn-JE3sc{zQj-MzWB`*#@hi{f)E54$4|SxTMUNAjhDq zo5Za9oAKG{@b_`X4WIa5{1E%FlF^~ktn9=}kp+PzC#>SrPUJctXw%8qtf7(Pz-xA4 zg?@&W#Ff=a$xOZ%4Gj0N+)L-#74|`W!$F3q?4QyRV$I9uJGMvtXZiJ4`-7NRz@KL8 zdY=cC7Hkvd?`M*py+DsCLs;4Pg+Sec*gFSiI*MIj9){14V zB(t6~>-XA&i;Wj(Ufe%{gMI4_#okl@A3TnC(9QfXOFn?{6pth;L+G*v7rj1Qkuq4^ z>?XU9(fPZvf#N2Hvy7(KBpe=x9pK`wvE{w6Z2y6amLE1)Wn}SY@Kl@ zKO8v4StBcJ(Adc3d?ACkLQCXDctBgqKh7v`j*#OVc3USfrpT?B$e2~Isfo)Xfw`xb zag#Rpl?>LekLnrA8JgNv8y_u@)6V!So?-Gx{YRJTgD-L$Hn4)`OkX!x)z&*^yE~kf zy^zNGATRpD)vyb3!WxU4!itz)bFf`7QC;!z5K~kR?;F*oYY9zl*ZwhGzW;y!gSY%V z3wk~OFBFyfF-xwXS>RF!yY9cgyfU>6UppN3$`<$wL?|?{iOpCj%M`%KpTpP4ogBc( z+f{$z5~J7$$?7u?9>+*HWKVB+DOhsS{I`9_ZO507`+!XR)feuex7lY0khuy~JV%df8RElA@>}U?(+w%?6=S%KLfyQ!0K7 zR5&xN&|xqWsC3x9u<`ZB8;(DjEx1^$?$7q0G`&&U!iqghp&@VT&+jt@D|Y@DZ<~Lh zS8jpZA^rzSbpgklnmhX&nJs+J^4UFOwDA4=UcZ8kIYjTkwG$0|dTgc@4!d3cGrOn$ zZ!&XWv=(2G8S0iG^@rE$yTFcTulPTxv3`i0xIk0y!6dc|P3adh#54X%uPEn_>SN^M z|6m$=_|MeW)3h!wg|&Ab$hrIyi~Zb zE86XYljk_K1}U=>7QPlW>Va^zegE{hUE;4Q?)uv%eqUHBOkxc29yi zYCi9(4-Ru{10orAy%*df!Wz+5!~QHez=~D2=8vdI+=1$2{~5*i85uR2)fhDR`!V!y zYrM9?(6CWE=fW-XfMn(?o=mw9m`sm3rn@v*U0hIFx**xZA$ZCedxuiqf+Ud}L8&Ze z9S+JOJO?hSUD(=?bD+)S#e_V&3r1WC%ukp#{F}-aH%}8_wANd&wd=v%*$-5$_8)w` z{D5-P0%P^YpCTb<&DR?nuPtGAUw^=S5yNN36?4Rx^P-q{a*D9cm#}X%mv4Bbf8ku* z1vj&_2TpY#Ixgv7uzJ6rXF;;3!{X-;N+%!aJM!IrK^pgt-;7zs1`TWs4%wF-3V*Yf zd^b19adXQep|CoW)n;GYo1{2{#OA_`6rpC z)h}QayU@T=5hFF_eq-uc@dpj;>?I{1?%ux6v*6{~`3EeRO#}Whna^%|WmVwLT{2C3 zMKFI9Gbc~`{{>q+7ua!bSjaZZkG1r|KL+#28s=$__Z)bA&Y@Ixh2uB&Ewkk$j_q&w z*3cKq%)73^&xv8ZBuK zR$P1D@I)*qWV-&ZnAu%V@%8%u4CZHQ+2%jxmhxq375~wuop6t_*RAPX=3llR_6tG` zZVA@UgfIM!Z!p*FWHM)Ml&W38yus0%4GY8i~IkXD;^7H>^0Q*yOGISV8LZ? zhs{z84ys=`q0GI3hfSB2nRiO#HTF#n;yF!Kc?;Og3>ppwcOT#qF==9-CH3Pp%dHQL zv+UWwMl^78n%JX^$UeuKmr7aU@^@|cCU{C|^7z)#@}wii9}7yOhzq%j4YXSebFHJ$NNcH5VI5)SUW4Vu)t zA`Yt8|7R3iSHHlWzd=bhMDuUE&bvg0&^h)E51I2OGo57*&5C#IZa#Ro_`wO*f_+k3 z1msL6v1V;(kTO`HDG}f-Tr*AnM6pA8bJd3l-aq~~l>cg2cZpHe;e+f69s!0^0t+Ud zwOXCWp+&{7XK5m%rh_y!Jgy@2aNd zEe`Hw4DE#u?!pb{&NHp`Wk@}8zvlrnqlCjurjUGtrgO)V7}hOg@|(D+sjr3cm_*8A zmI@s{8(Fp}ZT4BS*xzpW%`Wwp^{Dy^cMi}Vh7p55-xnSd64_> zz%2=rryN=e4wXz#%s!MR9bi*l!N{d$;;>ln!Acjl6JO+Byx_f1VpZ`?HsmLx^n?Z4 z>m0Kc9H;912&#I(p{u^Zk#Q6Al^4IxvFy_SZvP|8Ilz(Au2AlV!e92eUXK{e5)QWV zz0ivTO*_fx2`~BlU3kl7Ig7Q7M&czNS}Q)VuK&yuTD4%Q(19kND-vu=eFM%knC)(G zV{l+!yy@e|#{TsQ%wZle2bgB^-tc(DeAkdyYV9xHTMZv)KGZL$mHjX$k?q4Qi3hs^ zK+``9zD{@W|H!bs=4XSs2P>CK-d3wFs%#LsU?{KH#u!X%^C@P!NG1rMH# zCHy9@IIJ?J3D%@*W>h_t-?8xohhNBr?9&a4Cmd*2kaP$y{LB8VQ+|OHV@U~@fqa8h z-Twwr<&0VETW(00EaJ6kp3k^Pjq6503Ty8SqlQDm7QYy81u*$YzFAPhlC#CANovx8 zh2|649w@jNZZ6d|^%CxaBmq~UX@2e>cclq8iG>iRjPPb_A zwscU=K48Kd<@AAb#y!W`a~;^FJ~J)f{O>RO-M#=Y6$ZS>i*!;2o1KCvvR4o_G z?sG`jXS&|lWG2gSUM=wl(;j=NEB}7;pQ+!VDzv|0ca3AO_yrEZj4Hl6nM`YcC$Y*d zI>*Gv6i~+|E6B7fk!{PB=83FNuI+!o+rGerNsHg%9ZRebLtF#@mD5bOcCg0H=gwhZ za^LD8`ttt!|BA8}3GM=fE<{!|@M#1TtdPqccZvSbaJCC)_%kNUnX~gVXI!_) z2;(U^#Qx)yV?r(Wyqi~XO&u&SR zy}VKLdEaFlJDzi3nQFSf(R@Y2w>y8B+gMk`r83LCXU!69T=v-U`o5;J-~ZWm@lH{5 zJbts`+5+a)tZn-b9MlVtW^9>x;Hg1@hw;ph}>QvyZgVw?hpSM^&J_eZd_1Y>#)~7AeqCY z>j>*CFUF`dOuKl*Os@0JvSR3CGi-XprmOXjePA)-O_Mt@QL!Vc|W~M#Ad9SQs)&0i)it+1;1J)Lj4%~{3w&?-+ z(jhMx4S)CrCNwdU4d@j}`m89eF-^kc8 zPdSmT@7V^%_r)pf-^yk-?$x_+#Y+1{g>1re#x1<^GW!=i&TU{-&p0rT{f2-r!>W4r z80O!S5g-5mWQ}4!&ay9HKJ$$YY`vSB`d={c9c`X<;LV&p2kzOcGp|rQ&-Us_gA$j- zzB3DAw=7t_wPCT|g5Tjg8s9P8)#dgwzwfxX`#=}x684aehN=rO2i*87_G(_JyKwa5 z0xzMEzz-b7h8zs#;dShCHr%@o&k)?PkZ}uVGk?U6jf~=-|FiftHocSh%W8Fqb4HlM zQ>_;VqS7{49@xzCzdrc~yUnsz(TD{NQq$iYNH%duWSpJEs_V?K_Ww_29p*Y_Y32nN zixd?F*)F_gmpR}jq%Y7cmf372{pP^j_w_6dvU}b;_%mHLnk``PmZPb!j;T+O`MT~$ z1E;brf1kCjIm{^Q&wML})#}$%>4ILBie%G*Cv%uzuwU?D;ojlMx9VTSflMBgS*&t< zm`sl}{1mZy%ekti@rVA3jciu(A}{Jq!nrN82PY#2hyHWeE-=1=~?-t&F_f!j9!ny&qBTGn##bxVX~Me7lX ze@x|{{xkXhZ0x(pxNKwneg|c<1EvuNxEdzAH!zw^<(f5*$^R?!^}r^#gO1)i;RhPqOD;U{ypd7baslh_1*}he4wSI&5@fle$Y}b-aj`{Cz2nm#^&ZdpBQzSN z92RWiH_>90`uKn?ZXrk1Hr6O1Cc93?8`qdhwH&@nHCqMB9O$*HPYgcYvtYG-BO^mh z*+Ir0{Qzg)8*dUBLbDb;G`_I4dx7ck1#XNPT5s5Y`?KXGEc?S9^X>2-_L2$KEB3I- z>9fq@Vx7ggYcG4rT(OK2=_hFc%={s0js0twV)@x~1U_?qZkEn|@LDFa!Mn0S)bPbC z{|hfe7AT*tW3;D}`+iT(l}n*vs7~oKVM9dctDi>3Rq2 z=?BB5na(oY^<&Xm?dU$c;g#uy95!u@e&&7~!GDL3e~>fj;*fEj9yT%g0dwD`{p@m6 z{;*c)$r^9qW4da-U}Bx4qa)jeUpxGD-XBz#ZNAGfOOkon?)U|Zy&Klb1;{n6sbw}h z+IZB`dV?d|uBng23(}ZszA0to@kL}bTw=>`R(^4fm+`?du?v5<=Qn2S?q_uW{iCrr zHZaq3gRFeqUPeC24MrarPY0!asNIqCVUu`CurU9N8LA2MTJ8w3NJ+Bu{b2ZPl)=Kg zWefY37N$LAA~z(M&u;s}dQRfskMH7pR&_92SZOfC?Em*uIz`sXctah_+$aXSi_ABe znNAinKbA48W?Z%0Avt=%7T&m9EN9*?*upZ)^cQ=cI>T+p1;=z=bh#v?bAM-d$$z-^Ey-+k8Ie3FB3sng@MsD{>j)^4M}VH~Bq#@UVG_ z|Am(dIuA-q4@|CgOl8kF&r)z@ig<~DU4}dN3L7@v)E{g%^LQezHCXX1IQQRvLAAqI zyBG7SKIljY3-91%nI)ORbWMEDftU4W3##%G-1$sqoju2VD}Y0%yz!rK+T%n92KJPn WPu{Oy#KgeBz~JfX=d#Wzp$PyTXVi@V diff --git a/demo-data/images/life-cover.jpg b/demo-data/images/life-cover.jpg deleted file mode 100644 index 4f27dfb1f390a0ea8730f83e4adf12cece1fcaef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51599 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 diff --git a/demo-data/images/peopleCity01.jpg b/demo-data/images/peopleCity01.jpg deleted file mode 100644 index d6bc4d2dcf4d914bfb6ffd67d6a8bf3ab9e370c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55523 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�|$nmI|UX@0!@e(`Vo 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 SU~o8%JXe4`bY>WNhyehpb*y;+ diff --git a/demo-data/sounds/26777__junggle__btn402.txt b/demo-data/sounds/26777__junggle__btn402.txt deleted file mode 100644 index 8f0505fc..00000000 --- a/demo-data/sounds/26777__junggle__btn402.txt +++ /dev/null @@ -1,8 +0,0 @@ -Sound author -http://jazzy.junggle.net/ - -License -https://creativecommons.org/licenses/by/4.0/ - -Downloaded from -https://freesound.org/s/26777/ diff --git a/demo-data/words/adjectives.txt b/demo-data/words/adjectives.txt deleted file mode 100644 index 056f4583..00000000 --- a/demo-data/words/adjectives.txt +++ /dev/null @@ -1,14 +0,0 @@ -smiling -dumb -happy -red -green -blue -pink -white -black -purple -crying -running -jumping -eating \ No newline at end of file diff --git a/demo-data/words/nouns.txt b/demo-data/words/nouns.txt deleted file mode 100644 index a4c07a3b..00000000 --- a/demo-data/words/nouns.txt +++ /dev/null @@ -1,14 +0,0 @@ -man -woman -child -boy -girl -house -flower -chair -table -car -ground -garden -airplane -school \ No newline at end of file diff --git a/demo-data/words/prepositions.txt b/demo-data/words/prepositions.txt deleted file mode 100644 index 8b76fa2c..00000000 --- a/demo-data/words/prepositions.txt +++ /dev/null @@ -1,14 +0,0 @@ -in -under -at -on -near -amongst -in front of -behind -below -next to -on top of -opposite -with -close to \ No newline at end of file diff --git a/demo-data/words/words.txt b/demo-data/words/words.txt deleted file mode 100644 index 9150d10b..00000000 --- a/demo-data/words/words.txt +++ /dev/null @@ -1,14 +0,0 @@ -car -fish -flower -eagle -garbage -computer -beautiful -ugly -random -man -woman -child -missing -magic diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts deleted file mode 100644 index 0994b6c5..00000000 --- a/desktop/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - val commonMain by getting { - dependencies { - api(openrndr.math) - api(openrndr.shape) - implementation(project(":orx-noise")) - } - } - val commonTest by getting { - dependencies { - implementation(project(":orx-shapes")) - implementation(openrndr.shape) - } - } - - val jvmDemo by getting { - dependencies { - implementation(project(":orx-triangulation")) - implementation(project(":orx-shapes")) - implementation(project(":orx-noise")) - implementation(openrndr.shape) - implementation(project(":math")) - implementation(project(":orx-camera")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") - implementation(project(":orx-marching-squares")) - implementation(project(":orx-text-writer")) - implementation(project(":orx-obj-loader")) - implementation(project(":orx-palette")) - } - } - } -} \ No newline at end of file diff --git a/desktop/src/jvmDemo/kotlin/DemoColorBrewer2.kt b/desktop/src/jvmDemo/kotlin/DemoColorBrewer2.kt deleted file mode 100644 index ac900866..00000000 --- a/desktop/src/jvmDemo/kotlin/DemoColorBrewer2.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.openrndr.application -import org.openrndr.shape.Rectangle - -/** - * Demonstrates how to use a ColorBrewer2 palette. - * Finds the first available palette with 5 colors, - * then draws concentric circles filled with those colors. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val palette = colorBrewer2Palettes( - numberOfColors = 6, - paletteType = ColorBrewer2Type.Any - ).first().colors - val cellSize = 50.0 - extend { - palette.forEachIndexed { i, color -> - drawer.fill = color - drawer.rectangle( - Rectangle( - x = 0.0, - y = cellSize * i, - width = cellSize, - height = cellSize - ) - ) - // drawer.circle(drawer.bounds.center, 300.0 - i * 40.0) - } - } - } -} diff --git a/desktop/src/jvmDemo/kotlin/DemoDelaunay03.kt b/desktop/src/jvmDemo/kotlin/DemoDelaunay03.kt deleted file mode 100644 index 2c51da8b..00000000 --- a/desktop/src/jvmDemo/kotlin/DemoDelaunay03.kt +++ /dev/null @@ -1,654 +0,0 @@ -import com.icegps.math.geometry.Angle -import com.icegps.math.geometry.Vector3D -import com.icegps.math.geometry.degrees -import org.openrndr.KEY_ARROW_DOWN -import org.openrndr.KEY_ARROW_UP -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.TextSettingMode -import org.openrndr.draw.loadFont -import org.openrndr.extra.camera.Camera2D -import org.openrndr.extra.marchingsquares.findContours -import org.openrndr.extra.noise.gradientPerturbFractal -import org.openrndr.extra.textwriter.writer -import org.openrndr.extra.triangulation.DelaunayTriangulation -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.shape.Segment2D -import org.openrndr.shape.Segment3D -import org.openrndr.shape.ShapeContour -import kotlin.math.cos -import kotlin.math.sin -import kotlin.random.Random - -/** - * @author tabidachinokaze - * @date 2025/11/22 - */ -fun main() = application { - configure { - width = 720 - height = 480 - title = "Delaunator" - } - program { - val points3D = (0 until height).step(36).map { y -> - (0 until width).step(36).map { x -> - gradientPerturbFractal( - 300, - frequency = 0.8, - position = Vector3(x.toDouble(), y.toDouble(), seconds) - ) - } - }.flatten().map { - it.copy(z = it.z * 100) - } - /*val points3D = HeightmapVolcanoGenerator.generateVolcanoClusterHeightmap( - width = width, - height = height, - volcanoCount = 3 - )*/ - // val points3D = coordinateGenerate(width, height) - val zs = points3D.map { it.z } - println("zs = ${zs}") - val associate: MutableMap = points3D.associate { - Vector2(it.x, it.y) to it.z - }.toMutableMap() - val delaunay = DelaunayTriangulation(associate.map { it.key }) - - //println(points3D.niceStr()) - extend(Camera2D()) - println("draw") - var targetHeight: Double = zs.average() - val step = zs.max() - zs.min() / 6 - var heightList = (0..5).map { index -> - zs.min() + step * index - } - var logEnabled = true - var useInterpolation = false - var sampleLinear = false - keyboard.keyDown.listen { - logEnabled = true - println(it) - when (it.key) { - KEY_ARROW_UP -> targetHeight++ - KEY_ARROW_DOWN -> targetHeight-- - 73 -> useInterpolation = !useInterpolation - 83 -> sampleLinear = !sampleLinear - } - } - extend { - val triangles = delaunay.triangles() - val segments = mutableListOf() - drawer.clear(ColorRGBa.BLACK) - val indexDiff = (frameCount / 1000) % triangles.size - for ((i, triangle) in triangles.withIndex()) { - val segment2DS = triangle.contour.segments.filter { - val startZ = associate[it.start]!! - val endZ = associate[it.end]!! - if (startZ < endZ) { - targetHeight in startZ..endZ - } else { - targetHeight in endZ..startZ - } - } - - if (segment2DS.size == 2) { - val vector2s = segment2DS.map { - val startZ = associate[it.start]!! - val endZ = associate[it.end]!! - val start = Vector3(it.start.x, it.start.y, startZ) - val end = Vector3(it.end.x, it.end.y, endZ) - if (startZ < endZ) { - start to end - } else { - end to start - } - }.map { (start, end) -> - val segment3D = Segment3D(start, end) - val vector3 = - segment3D.position(calculatePositionRatio(targetHeight, start.z, end.z)) - vector3 - }.map { - associate[it.xy] = it.z - it.xy - } - val element = Segment2D(vector2s[0], vector2s[1]) - segments.add(element) - } - drawer.fill = if (indexDiff == i) { - ColorRGBa.CYAN - } else { - ColorRGBa.PINK.shade(1.0 - i / (triangles.size * 1.2)) - } - drawer.stroke = ColorRGBa.PINK.shade(i / (triangles.size * 1.0) + 0.1) - drawer.contour(triangle.contour) - } - - val sorted = connectAllSegments(segments) - - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - if (logEnabled) { - segments.forEach { - println("${it.start} -> ${it.end}") - } - println("=====") - } - - sorted.forEach { - it.forEach { - if (logEnabled) println("${it.start} -> ${it.end}") - drawer.lineSegment(it.start, it.end) - drawer.fill = ColorRGBa.WHITE - } - if (logEnabled) println("=") - drawer.fill = ColorRGBa.YELLOW - if (false) drawer.contour(ShapeContour.fromSegments(it, closed = true)) - } - /*for (y in 0 until (area.height / cellSize).toInt()) { - for (x in 0 until (area.width / cellSize).toInt()) { - values[IntVector2(x, y)] = f(Vector2(x * cellSize + area.x, y * cellSize + area.y)) - } - }*/ - val contours = findContours( - f = { - val triangle = triangles.firstOrNull { triangle -> - isPointInTriangle(it, listOf(triangle.x1, triangle.x2, triangle.x3)) - } - triangle ?: return@findContours 0.0 - val interpolate = interpolateHeight( - point = it, - triangle = listOf( - triangle.x1, - triangle.x2, - triangle.x3, - ).map { - Vector3(it.x, it.y, associate[it]!!) - } - ) - interpolate.z - targetHeight - }, - area = drawer.bounds, - cellSize = 4.0, - useInterpolation = useInterpolation - ) - val associateWith: List> = heightList.map { height -> - findContours( - f = { - val triangle = triangles.firstOrNull { triangle -> - isPointInTriangle(it, listOf(triangle.x1, triangle.x2, triangle.x3)) - } - triangle ?: return@findContours 0.0 - val interpolate = interpolateHeight( - point = it, - triangle = listOf( - triangle.x1, - triangle.x2, - triangle.x3, - ).map { - Vector3(it.x, it.y, associate[it]!!) - } - ) - interpolate.z - height - }, - area = drawer.bounds, - cellSize = 4.0, - useInterpolation = useInterpolation - ) - } - if (logEnabled) println("useInterpolation = $useInterpolation") - drawer.stroke = null - if (true) contours.forEach { - drawer.fill = ColorRGBa.GREEN.opacify(0.1) - drawer.contour(if (sampleLinear) it.sampleLinear() else it) - } - if (false) associateWith.forEachIndexed { index, contours -> - contours.forEach { - drawer.fill = colorBrewer2[index].colors.first().opacify(0.1) - drawer.contour(it) - } - } - - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 24.0) - writer { - drawer.drawStyle.textSetting = TextSettingMode.SUBPIXEL - text(targetHeight.toString()) - } - logEnabled = false - } - } -} - -/** - * 射线法判断点是否在单个三角形内 - */ -fun isPointInTriangle(point: Vector2, triangle: List): Boolean { - require(triangle.size == 3) { "三角形必须有3个顶点" } - - val (v1, v2, v3) = triangle - - // 计算重心坐标 - val denominator = (v2.y - v3.y) * (v1.x - v3.x) + (v3.x - v2.x) * (v1.y - v3.y) - if (denominator == 0.0) return false // 退化三角形 - - val alpha = ((v2.y - v3.y) * (point.x - v3.x) + (v3.x - v2.x) * (point.y - v3.y)) / denominator - val beta = ((v3.y - v1.y) * (point.x - v3.x) + (v1.x - v3.x) * (point.y - v3.y)) / denominator - val gamma = 1.0 - alpha - beta - - // 点在三角形内当且仅当所有重心坐标都在[0,1]范围内 - return alpha >= 0 && beta >= 0 && gamma >= 0 && - alpha <= 1 && beta <= 1 && gamma <= 1 -} - -fun isPointInTriangle3D(point: Vector2, triangle: List): Boolean { - require(triangle.size == 3) { "三角形必须有3个顶点" } - - val (v1, v2, v3) = triangle - - // 计算重心坐标 - val denominator = (v2.y - v3.y) * (v1.x - v3.x) + (v3.x - v2.x) * (v1.y - v3.y) - if (denominator == 0.0) return false // 退化三角形 - - val alpha = ((v2.y - v3.y) * (point.x - v3.x) + (v3.x - v2.x) * (point.y - v3.y)) / denominator - val beta = ((v3.y - v1.y) * (point.x - v3.x) + (v1.x - v3.x) * (point.y - v3.y)) / denominator - val gamma = 1.0 - alpha - beta - - // 点在三角形内当且仅当所有重心坐标都在[0,1]范围内 - return alpha >= 0 && beta >= 0 && gamma >= 0 && - alpha <= 1 && beta <= 1 && gamma <= 1 -} - -/** - * 使用重心坐标计算点在三角形上的高度 - * @param point 二维点 (x, y) - * @param triangle 三角形的三个顶点 - * @return 三维点 (x, y, z) - */ -fun interpolateHeight(point: Vector2, triangle: List): Vector3 { - require(triangle.size == 3) { "三角形必须有3个顶点" } - - val (v1, v2, v3) = triangle - - // 计算重心坐标 - val (alpha, beta, gamma) = calculateBarycentricCoordinates(point, v1, v2, v3) - - // 使用重心坐标插值z值 - val z = alpha * v1.z + beta * v2.z + gamma * v3.z - - return Vector3(point.x, point.y, z) -} - -/** - * 计算点在三角形中的重心坐标 - */ -fun calculateBarycentricCoordinates( - point: Vector2, - v1: Vector3, - v2: Vector3, - v3: Vector3 -): Triple { - val denom = (v2.y - v3.y) * (v1.x - v3.x) + (v3.x - v2.x) * (v1.y - v3.y) - - val alpha = ((v2.y - v3.y) * (point.x - v3.x) + (v3.x - v2.x) * (point.y - v3.y)) / denom - val beta = ((v3.y - v1.y) * (point.x - v3.x) + (v1.x - v3.x) * (point.y - v3.y)) / denom - val gamma = 1.0 - alpha - beta - - return Triple(alpha, beta, gamma) -} - -fun connectAllSegments(segments: List): List> { - val remaining = segments.toMutableList() - val allPaths = mutableListOf>() - - while (remaining.isNotEmpty()) { - val path = mutableListOf() - - // 开始新路径 - path.add(remaining.removeAt(0)) - - var changed: Boolean - do { - changed = false - - // 向前扩展 - val lastEnd = path.last().end - val forwardSegment = remaining.find { it.start == lastEnd || it.end == lastEnd } - if (forwardSegment != null) { - val connectedSegment = if (forwardSegment.start == lastEnd) { - forwardSegment // 正向 - } else { - Segment2D(forwardSegment.end, forwardSegment.start) // 反向 - } - path.add(connectedSegment) - remaining.remove(forwardSegment) - changed = true - } - - // 向后扩展 - val firstStart = path.first().start - val backwardSegment = remaining.find { it.end == firstStart || it.start == firstStart } - if (backwardSegment != null) { - val connectedSegment = if (backwardSegment.end == firstStart) { - backwardSegment // 正向 - } else { - Segment2D(backwardSegment.end, backwardSegment.start) // 反向 - } - path.add(0, connectedSegment) - remaining.remove(backwardSegment) - changed = true - } - - } while (changed && remaining.isNotEmpty()) - - allPaths.add(path) - } - - return allPaths -} - -fun connectSegmentsEfficient(segments: List): List { - if (segments.isEmpty()) return emptyList() - - val remaining = segments.toMutableList() - val connected = mutableListOf() - - // 构建端点查找表 - val startMap = mutableMapOf>() - val endMap = mutableMapOf>() - - segments.forEach { segment -> - startMap.getOrPut(segment.start) { mutableListOf() }.add(segment) - endMap.getOrPut(segment.end) { mutableListOf() }.add(segment) - } - - // 从第一个线段开始 - var currentSegment = remaining.removeAt(0) - connected.add(currentSegment) - - // 更新查找表 - startMap[currentSegment.start]?.remove(currentSegment) - endMap[currentSegment.end]?.remove(currentSegment) - - // 向前连接 - while (true) { - val nextFromStart = startMap[currentSegment.end]?.firstOrNull() - val nextFromEnd = endMap[currentSegment.end]?.firstOrNull() - - when { - nextFromStart != null -> { - // 正向连接 - connected.add(nextFromStart) - remaining.remove(nextFromStart) - startMap[nextFromStart.start]?.remove(nextFromStart) - endMap[nextFromStart.end]?.remove(nextFromStart) - currentSegment = nextFromStart - } - - nextFromEnd != null -> { - // 反向连接 - val reversed = Segment2D(nextFromEnd.end, nextFromEnd.start) - connected.add(reversed) - remaining.remove(nextFromEnd) - startMap[nextFromEnd.start]?.remove(nextFromEnd) - endMap[nextFromEnd.end]?.remove(nextFromEnd) - currentSegment = reversed - } - - else -> break - } - } - - // 向后连接 - currentSegment = connected.first() - while (true) { - val prevFromEnd = endMap[currentSegment.start]?.firstOrNull() - val prevFromStart = startMap[currentSegment.start]?.firstOrNull() - - when { - prevFromEnd != null -> { - // 正向连接到开头 - connected.add(0, prevFromEnd) - remaining.remove(prevFromEnd) - startMap[prevFromEnd.start]?.remove(prevFromEnd) - endMap[prevFromEnd.end]?.remove(prevFromEnd) - currentSegment = prevFromEnd - } - - prevFromStart != null -> { - // 反向连接到开头 - val reversed = Segment2D(prevFromStart.end, prevFromStart.start) - connected.add(0, reversed) - remaining.remove(prevFromStart) - startMap[prevFromStart.start]?.remove(prevFromStart) - endMap[prevFromStart.end]?.remove(prevFromStart) - currentSegment = reversed - } - - else -> break - } - } - - return connected -} - -fun connectSegments(segments: List): List { - if (segments.isEmpty()) return emptyList() - - val remaining = segments.toMutableList() - val connected = mutableListOf() - - // 从第一个线段开始,保持原方向 - connected.add(remaining.removeAt(0)) - - while (remaining.isNotEmpty()) { - val lastEnd = connected.last().end - var found = false - - // 查找可以连接的线段 - for (i in remaining.indices) { - val segment = remaining[i] - - // 检查四种可能的连接方式 - when { - // 正向连接:当前终点 == 线段起点 - segment.start == lastEnd -> { - connected.add(segment) - remaining.removeAt(i) - found = true - break - } - // 反向连接:当前终点 == 线段终点,需要反转线段 - segment.end == lastEnd -> { - connected.add(Segment2D(segment.end, segment.start)) // 反转 - remaining.removeAt(i) - found = true - break - } - // 正向连接另一端:当前起点 == 线段终点,需要插入到前面 - segment.end == connected.first().start -> { - connected.add(0, Segment2D(segment.end, segment.start)) // 反转后插入开头 - remaining.removeAt(i) - found = true - break - } - // 反向连接另一端:当前起点 == 线段起点,需要反转并插入到前面 - segment.start == connected.first().start -> { - connected.add(0, segment) // 直接插入开头(已经是正确方向) - remaining.removeAt(i) - found = true - break - } - } - } - - if (!found) break // 无法找到连接线段 - } - - return connected -} - -fun calculatePositionRatio(value: Double, rangeStart: Double, rangeEnd: Double): Double { - if (rangeStart == rangeEnd) return 0.0 // 避免除零 - - val ratio = (value - rangeStart) / (rangeEnd - rangeStart) - return ratio.coerceIn(0.0, 1.0) -} - -fun sortLinesEfficient(lines: List): List { - if (lines.isEmpty()) return emptyList() - - // 创建起点到线段的映射 - val startMap = lines.associateBy { it.start } - val sorted = mutableListOf() - - // 找到起点(没有其他线段的终点指向它的起点) - var currentLine = lines.firstOrNull { line -> - lines.none { it.end == line.start } - } ?: lines.first() - - sorted.add(currentLine) - - while (true) { - val nextLine = startMap[currentLine.end] - if (nextLine == null || nextLine == lines.first()) break - sorted.add(nextLine) - currentLine = nextLine - } - - return sorted -} - -fun sortLines(lines: List): List { - if (lines.isEmpty()) return emptyList() - - val remaining = lines.toMutableList() - val sorted = mutableListOf() - - // 从第一个线段开始 - sorted.add(remaining.removeAt(0)) - - while (remaining.isNotEmpty()) { - val lastEnd = sorted.last().end - var found = false - - // 查找下一个线段 - for (i in remaining.indices) { - if (remaining[i].start == lastEnd) { - sorted.add(remaining.removeAt(i)) - found = true - break - } - } - - if (!found) break // 无法找到下一个线段 - } - - return sorted -} - -fun findLineLoops(lines: List): List> { - val remaining = lines.toMutableList() - val loops = mutableListOf>() - - while (remaining.isNotEmpty()) { - val loop = findSingleLoop(remaining) - if (loop.isNotEmpty()) { - loops.add(loop) - // 移除已使用的线段 - loop.forEach { line -> - remaining.remove(line) - } - } else { - // 无法形成环的线段 - break - } - } - - return loops -} - -fun findSingleLoop(remaining: MutableList): List { - if (remaining.isEmpty()) return emptyList() - - val loop = mutableListOf() - loop.add(remaining.removeAt(0)) - - // 向前查找连接 - while (remaining.isNotEmpty()) { - val lastEnd = loop.last().end - val nextIndex = remaining.indexOfFirst { it.start == lastEnd } - - if (nextIndex == -1) { - // 尝试向后查找连接 - val firstStart = loop.first().start - val prevIndex = remaining.indexOfFirst { it.end == firstStart } - - if (prevIndex != -1) { - loop.add(0, remaining.removeAt(prevIndex)) - } else { - break // 无法继续连接 - } - } else { - loop.add(remaining.removeAt(nextIndex)) - } - - // 检查是否形成闭环 - if (loop.last().end == loop.first().start) { - return loop - } - } - - // 如果没有形成闭环,返回空列表(或者可以根据需求返回部分环) - remaining.addAll(loop) // 将线段放回剩余列表 - return emptyList() -} - -fun Vector3D.rotateAroundZ(angle: Angle): Vector3D { - val cosAngle = cos(angle.radians) - val sinAngle = sin(angle.radians) - - return Vector3D( - x = x * cosAngle - y * sinAngle, - y = x * sinAngle + y * cosAngle, - z = z - ) -} - -fun coordinateGenerate(width: Int, height: Int): List { - val minX = 0.0 - val maxX = width.toDouble() - val minY = 0.0 - val maxY = height.toDouble() - val minZ = -20.0 - val maxZ = 20.0 - val x: () -> Double = { Random.nextDouble(minX, maxX) } - val y: () -> Double = { Random.nextDouble(minY, maxY) } - val z: () -> Double = { Random.nextDouble(minZ, maxZ) } - val dPoints = (0..60).map { - Vector3D(x(), y(), z()) - } - return dPoints -} - -fun coordinateGenerate1(): List { - val center = Vector3D(0.0, 0.0, 0.0) - val direction = Vector3D(0.0, 1.0, -1.0) - return (0..360).step(36).map> { degrees: Int -> - val newDirection = direction.rotateAroundZ(angle = degrees.degrees) - (0..5).map { - center + newDirection * it * 100 - } - }.flatten() -} - - -fun Vector3D.niceStr(): String { - return "[$x, $y, $z]".format(this) -} - -fun List.niceStr(): String { - return joinToString(", ", "[", "]") { - it.niceStr() - } -} diff --git a/desktop/src/jvmDemo/kotlin/DemoDelaunay3D.kt b/desktop/src/jvmDemo/kotlin/DemoDelaunay3D.kt deleted file mode 100644 index f472da6f..00000000 --- a/desktop/src/jvmDemo/kotlin/DemoDelaunay3D.kt +++ /dev/null @@ -1,267 +0,0 @@ -import org.openrndr.KEY_ARROW_DOWN -import org.openrndr.KEY_ARROW_UP -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.TextSettingMode -import org.openrndr.draw.loadFont -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.marchingsquares.findContours -import org.openrndr.extra.objloader.loadOBJasVertexBuffer -import org.openrndr.extra.textwriter.writer -import org.openrndr.extra.triangulation.DelaunayTriangulation -import org.openrndr.extra.triangulation.DelaunayTriangulation3D -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.shape.Path3D -import org.openrndr.shape.Segment3D - -/** - * @author tabidachinokaze - * @date 2025/11/22 - */ -fun main() = application { - configure { - width = 720 - height = 720 - title = "Delaunator" - multisample = WindowMultisample.SampleCount(8) - - } - program { - /*val points3D = (0 until height).step(36).map { y -> - (0 until width).step(36).map { x -> - gradientPerturbFractal( - 300, - frequency = 0.8, - position = Vector3(x.toDouble(), y.toDouble(), seconds) - ) - } - }.flatten().map { - it.copy(x = it.x - width / 2, y = it.y - height / 2, z = it.z * 100) - }*/ - /*val points3D = HeightmapVolcanoGenerator.generateVolcanoClusterHeightmap( - width = width, - height = height, - volcanoCount = 3 - )*/ - val points3D = coordinateGenerate(width, height).map { - it.copy(x = it.x - width / 2, y = it.y - height / 2, z = it.z * 10) - } - val zs = points3D.map { it.z } - println("zs = ${zs}") - val associate: MutableMap = points3D.associate { - Vector2(it.x, it.y) to it.z - }.toMutableMap() - val delaunay = DelaunayTriangulation(associate.map { it.key }) - val delaunay3D = DelaunayTriangulation3D(points3D.map { Vector3(it.x, it.y, it.z) }) - - //println(points3D.niceStr()) - //extend(Camera2D()) - val cam = Orbital() - extend(cam) { - eye = Vector3(x = 100.0, y = 100.0, z = 0.0) - lookAt = Vector3(x = 1.6, y = -1.9, z = 1.2) - } - - println("draw") - var targetHeight: Double = zs.average() - var logEnabled = true - var useInterpolation = false - var sampleLinear = false - keyboard.keyDown.listen { - logEnabled = true - println(it) - when (it.key) { - KEY_ARROW_UP -> targetHeight++ - KEY_ARROW_DOWN -> targetHeight-- - 73 -> useInterpolation = !useInterpolation - 83 -> sampleLinear = !sampleLinear - } - } - val vb = loadOBJasVertexBuffer("orx-obj-loader/test-data/non-planar.obj") - - extend { - val triangles = delaunay3D.triangles() - val segments = mutableListOf() - drawer.clear(ColorRGBa.BLACK) - val indexDiff = (frameCount / 1000) % triangles.size - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - x_fill.rgb = normalize(v_viewNormal) * 0.5 + vec3(0.5); - """.trimIndent() - } - - drawer.vertexBuffer(vb, DrawPrimitive.TRIANGLES) - - // 绘制等高线段区域 - for ((i, triangle) in triangles.withIndex()) { - val segment2DS = triangle.segments.filter { - val startZ = it.start.z - val endZ = it.end.z - if (startZ < endZ) { - targetHeight in startZ..endZ - } else { - targetHeight in endZ..startZ - } - } - - if (segment2DS.size == 2) { - val vector2s = segment2DS.map { - val startZ = it.start.z - val endZ = it.end.z - val start = Vector3(it.start.x, it.start.y, startZ) - val end = Vector3(it.end.x, it.end.y, endZ) - if (startZ < endZ) { - start to end - } else { - end to start - } - }.map { (start, end) -> - val segment3D = Segment3D(start, end) - val vector3 = - segment3D.position(calculatePositionRatio(targetHeight, start.z, end.z)) - vector3 - }.onEach { - associate[it.xy] = it.z - } - val element = Segment3D(vector2s[0], vector2s[1]) - segments.add(element) - } - drawer.strokeWeight = 20.0 - drawer.stroke = ColorRGBa.PINK - //drawer.contour(triangle.contour) - drawer.path(triangle.path) - } - - val sorted = connectAllSegments(segments) - - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - if (logEnabled) { - segments.forEach { - println("${it.start} -> ${it.end}") - } - println("=====") - } - - sorted.forEach { - it.forEach { - if (logEnabled) println("${it.start} -> ${it.end}") - drawer.lineSegment(it.start, it.end) - drawer.fill = ColorRGBa.WHITE - } - if (logEnabled) println("=") - drawer.fill = ColorRGBa.YELLOW - // if (false) drawer.contour(ShapeContour.fromSegments(it, closed = true)) - } - // 结束绘制等高线 - /*for (y in 0 until (area.height / cellSize).toInt()) { - for (x in 0 until (area.width / cellSize).toInt()) { - values[IntVector2(x, y)] = f(Vector2(x * cellSize + area.x, y * cellSize + area.y)) - } - }*/ - val contours = findContours( - f = { - val triangle = triangles.firstOrNull { triangle -> - isPointInTriangle3D(it, listOf(triangle.x1, triangle.x2, triangle.x3)) - } - triangle ?: return@findContours 0.0 - val interpolate = interpolateHeight( - point = it, - triangle = listOf( - triangle.x1, - triangle.x2, - triangle.x3, - ) - ) - interpolate.z - targetHeight - }, - area = drawer.bounds.movedTo(Vector2(-width / 2.0, -height / 2.0)), - cellSize = 4.0, - useInterpolation = useInterpolation - ) - if (logEnabled) println("useInterpolation = $useInterpolation") - drawer.stroke = null - contours.map { - if (false) drawer.contour(it) - it.segments.map { - Segment3D( - it.start.vector3(), - it.end.vector3() - ) - } - }.forEach { - drawer.fill = ColorRGBa.GREEN.opacify(0.1) - drawer.path(Path3D.fromSegments(it, closed = true)) - } - - if (false) writer { - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 24.0) - drawer.drawStyle.textSetting = TextSettingMode.SUBPIXEL - text(targetHeight.toString()) - } - logEnabled = false - } - } -} - -data class Triangle3D( - val x1: Vector3, - val x2: Vector3, - val x3: Vector3, -) { - fun toList(): List = listOf(x1, x2, x3) -} - -fun connectAllSegments(segments: List): List> { - val remaining = segments.toMutableList() - val allPaths = mutableListOf>() - - while (remaining.isNotEmpty()) { - val path = mutableListOf() - - // 开始新路径 - path.add(remaining.removeAt(0)) - - var changed: Boolean - do { - changed = false - - // 向前扩展 - val lastEnd = path.last().end - val forwardSegment = remaining.find { it.start == lastEnd || it.end == lastEnd } - if (forwardSegment != null) { - val connectedSegment = if (forwardSegment.start == lastEnd) { - forwardSegment // 正向 - } else { - Segment3D(forwardSegment.end, forwardSegment.start) // 反向 - } - path.add(connectedSegment) - remaining.remove(forwardSegment) - changed = true - } - - // 向后扩展 - val firstStart = path.first().start - val backwardSegment = remaining.find { it.end == firstStart || it.start == firstStart } - if (backwardSegment != null) { - val connectedSegment = if (backwardSegment.end == firstStart) { - backwardSegment // 正向 - } else { - Segment3D(backwardSegment.end, backwardSegment.start) // 反向 - } - path.add(0, connectedSegment) - remaining.remove(backwardSegment) - changed = true - } - - } while (changed && remaining.isNotEmpty()) - - allPaths.add(path) - } - - return allPaths -} diff --git a/desktop/src/jvmDemo/kotlin/FindContours.kt b/desktop/src/jvmDemo/kotlin/FindContours.kt deleted file mode 100644 index 34df6b20..00000000 --- a/desktop/src/jvmDemo/kotlin/FindContours.kt +++ /dev/null @@ -1,94 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Camera2D -import org.openrndr.extra.marchingsquares.findContours -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 - -/** - * A simple demonstration of using the `findContours` method provided by `orx-marching-squares`. - * - * `findContours` lets one generate contours by providing a mathematical function to be - * sampled within the provided area and with the given cell size. Contours are generated - * between the areas in which the function returns positive and negative values. - * - * In this example, the `f` function returns the distance of a point to the center of the window minus 200.0. - * Therefore, sampled locations which are less than 200 pixels away from the center return - * negative values and all others return positive values, effectively generating a circle of radius 200.0. - * - * Try increasing the cell size to see how the precision of the circle reduces. - * - * The circular contour created in this program has over 90 segments. The number of segments depends on the cell - * size, and the resulting radius. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - extend(Camera2D()) - var showLog = true - val target = Vector2(0.0, 0.0) - val points3D = (0..10).map { x -> - (0..10).map { y -> - Vector3(x.toDouble(), y.toDouble(), x * y * 1.0) - } - } - - extend { - drawer.clear(ColorRGBa.BLACK) - drawer.stroke = ColorRGBa.PINK - fun f3(v: Vector2): Double { - val distance = drawer.bounds.center.distanceTo(v) - return when (distance) { - in 0.0..<100.0 -> -3.0 - in 100.0..<200.0 -> 1.0 - in 200.0..300.0 -> -1.0 - else -> distance - } - } - - fun f(v: Vector2): Double { - val distanceTo = v.distanceTo(target) - return (distanceTo - 100.0).also { - if (showLog) println( - buildString { - appendLine("${v} distanceTo ${target} = ${distanceTo}") - appendLine("distanceTo - 100.0 = ${distanceTo - 100.0}") - } - ) - } - } - - val points = mutableListOf() - - fun f1(v: Vector2): Double { - val result = if (v.x == v.y * 2 || v.x * 2 == v.y) { - points.add(v) - -1.0 - } else 0.0 - return result.also { - if (showLog) { - println("$v -> $result") - } - } - } - - val contours = findContours(::f3, drawer.bounds, 4.0) - drawer.fill = null - drawer.contours(contours) - - if (showLog) { - println( - buildString { - for ((index, contour) in contours.withIndex()) { - appendLine("index = ${index}, $contour") - } - } - ) - } - showLog = false - } - } -} diff --git a/desktop/src/jvmDemo/kotlin/HeightmapVolcanoGenerator.kt b/desktop/src/jvmDemo/kotlin/HeightmapVolcanoGenerator.kt deleted file mode 100644 index eb6a923a..00000000 --- a/desktop/src/jvmDemo/kotlin/HeightmapVolcanoGenerator.kt +++ /dev/null @@ -1,373 +0,0 @@ -import com.icegps.math.geometry.Vector3D -import kotlin.math.PI -import kotlin.math.abs -import kotlin.math.cos -import kotlin.math.exp -import kotlin.math.floor -import kotlin.math.max -import kotlin.math.sin -import kotlin.math.sqrt - -/** - * @author tabidachinokaze - * @date 2025/11/22 - */ -object HeightmapVolcanoGenerator { - - // 基础火山高度图 - fun generateVolcanoHeightmap( - width: Int = 100, - height: Int = 100, - centerX: Double = 50.0, - centerY: Double = 50.0, - maxHeight: Double = 60.0, - craterRadius: Double = 8.0, - volcanoRadius: Double = 30.0 - ): List { - val points = mutableListOf() - - for (x in 0 until width) { - for (y in 0 until height) { - // 计算到火山中心的距离 - val dx = x - centerX - val dy = y - centerY - val distance = sqrt(dx * dx + dy * dy) - - // 计算基础火山高度 - var z = calculateVolcanoHeight(distance, craterRadius, volcanoRadius, maxHeight) - - // 添加噪声细节 - val noise = perlinNoise(x * 0.1, y * 0.1, 0.1) * 3.0 - z = max(0.0, z + noise) - - points.add(Vector3D(x.toDouble(), y.toDouble(), z)) - } - } - - return points - } - - // 复合火山群高度图 - fun generateVolcanoClusterHeightmap( - width: Int = 150, - height: Int = 150, - volcanoCount: Int = 3 - ): List { - val points = mutableListOf() - val volcanoes = generateRandomVolcanoPositions(volcanoCount, width, height) - - for (x in (0 until width).step(25)) { - for (y in (0 until height).step(25)) { - var totalZ = 0.0 - - // 叠加所有火山的影响 - for (volcano in volcanoes) { - val dx = x - volcano.x - val dy = y - volcano.y - val distance = sqrt(dx * dx + dy * dy) - - if (distance <= volcano.radius) { - val volcanoHeight = calculateVolcanoHeight( - distance, - volcano.craterRadius, - volcano.radius, - volcano.maxHeight - ) - totalZ += volcanoHeight - } - } - - // 基础地形 - val baseNoise = perlinNoise(x * 0.02, y * 0.02, 0.05) * 5.0 - val detailNoise = perlinNoise(x * 0.1, y * 0.1, 0.2) * 2.0 - - points.add(Vector3D(x.toDouble(), y.toDouble(), totalZ + baseNoise + detailNoise)) - } - } - - return points - } - - // 带熔岩流的火山高度图 - fun generateVolcanoWithLavaHeightmap( - width: Int = 100, - height: Int = 100 - ): List { - val points = mutableListOf() - val centerX = width / 2.0 - val centerY = height / 2.0 - - // 生成熔岩流路径 - val lavaFlows = generateLavaFlowPaths(centerX, centerY, 3) - - for (x in 0 until width) { - for (y in 0 until height) { - val dx = x - centerX - val dy = y - centerY - val distance = sqrt(dx * dx + dy * dy) - - // 基础火山高度 - var z = calculateVolcanoHeight(distance, 10.0, 35.0, 70.0) - - // 添加熔岩流 - z += calculateLavaFlowEffect(x.toDouble(), y.toDouble(), lavaFlows) - - // 侵蚀效果 - z += calculateErosionEffect(x.toDouble(), y.toDouble(), distance, z) - - points.add(Vector3D(x.toDouble(), y.toDouble(), max(0.0, z))) - } - } - - return points - } - - // 破火山口高度图 - fun generateCalderaHeightmap( - width: Int = 100, - height: Int = 100 - ): List { - val points = mutableListOf() - val centerX = width / 2.0 - val centerY = height / 2.0 - - for (x in 0 until width) { - for (y in 0 until height) { - val dx = x - centerX - val dy = y - centerY - val distance = sqrt(dx * dx + dy * dy) - - var z = calculateCalderaHeight(distance, 15.0, 45.0, 50.0) - - // 内部平坦区域细节 - if (distance < 20) { - z += perlinNoise(x * 0.2, y * 0.2, 0.3) * 1.5 - } - - points.add(Vector3D(x.toDouble(), y.toDouble(), max(0.0, z))) - } - } - - return points - } - - // 线性火山链高度图 - fun generateVolcanoChainHeightmap( - width: Int = 200, - height: Int = 100 - ): List { - val points = mutableListOf() - - // 在一条线上生成多个火山 - val chainCenters = listOf( - Vector3D(30.0, 50.0, 0.0), - Vector3D(70.0, 50.0, 0.0), - Vector3D(110.0, 50.0, 0.0), - Vector3D(150.0, 50.0, 0.0), - Vector3D(170.0, 50.0, 0.0) - ) - - for (x in 0 until width) { - for (y in 0 until height) { - var totalZ = 0.0 - - for (center in chainCenters) { - val dx = x - center.x - val dy = y - center.y - val distance = sqrt(dx * dx + dy * dy) - - if (distance <= 25.0) { - val volcanoZ = calculateVolcanoHeight(distance, 6.0, 25.0, 40.0) - totalZ += volcanoZ - } - } - - // 添加基底地形,模拟山脉链 - val baseRidge = calculateMountainRidge(x.toDouble(), y.toDouble(), width, height) - totalZ += baseRidge - - points.add(Vector3D(x.toDouble(), y.toDouble(), totalZ)) - } - } - - return points - } - - // 辅助函数 - private data class VolcanoInfo( - val x: Double, - val y: Double, - val radius: Double, - val craterRadius: Double, - val maxHeight: Double - ) - - private data class LavaFlowInfo( - val startX: Double, - val startY: Double, - val angle: Double, // 弧度 - val length: Double, - val width: Double, - val intensity: Double - ) - - private fun calculateVolcanoHeight( - distance: Double, - craterRadius: Double, - volcanoRadius: Double, - maxHeight: Double - ): Double { - return when { - distance <= craterRadius -> { - // 火山口 - 中心凹陷 - val craterDepth = maxHeight * 0.4 - craterDepth * (1.0 - distance / craterRadius) - } - - distance <= volcanoRadius -> { - // 火山锥 - val slopeDistance = distance - craterRadius - val maxSlopeDistance = volcanoRadius - craterRadius - val normalized = slopeDistance / maxSlopeDistance - maxHeight * (1.0 - normalized * normalized) - } - - else -> 0.0 - } - } - - private fun calculateCalderaHeight( - distance: Double, - innerRadius: Double, - outerRadius: Double, - rimHeight: Double - ): Double { - return when { - distance <= innerRadius -> { - // 平坦的破火山口底部 - rimHeight * 0.2 - } - - distance <= outerRadius -> { - // 陡峭的边缘 - val rimDistance = distance - innerRadius - val rimWidth = outerRadius - innerRadius - val normalized = rimDistance / rimWidth - rimHeight * (1.0 - (1.0 - normalized) * (1.0 - normalized)) - } - - else -> { - // 外部平缓斜坡 - val externalDistance = distance - outerRadius - rimHeight * exp(-externalDistance * 0.08) - } - } - } - - private fun calculateLavaFlowEffect(x: Double, y: Double, lavaFlows: List): Double { - var effect = 0.0 - - for (flow in lavaFlows) { - val dx = x - flow.startX - val dy = y - flow.startY - - // 计算到熔岩流中心线的距离 - val flowDirX = cos(flow.angle) - val flowDirY = sin(flow.angle) - - val projection = dx * flowDirX + dy * flowDirY - - if (projection in 0.0..flow.length) { - val perpendicularX = dx - projection * flowDirX - val perpendicularY = dy - projection * flowDirY - val perpendicularDist = sqrt(perpendicularX * perpendicularX + perpendicularY * perpendicularY) - - if (perpendicularDist <= flow.width) { - val widthFactor = 1.0 - (perpendicularDist / flow.width) - val lengthFactor = 1.0 - (projection / flow.length) - effect += flow.intensity * widthFactor * lengthFactor - } - } - } - - return effect - } - - private fun calculateErosionEffect(x: Double, y: Double, distance: Double, height: Double): Double { - // 基于坡度的侵蚀 - val slopeNoise = perlinNoise(x * 0.15, y * 0.15, 0.1) * 2.0 - // 基于距离的侵蚀 - val distanceErosion = if (distance > 25) perlinNoise(x * 0.08, y * 0.08, 0.05) * 1.5 else 0.0 - return slopeNoise + distanceErosion - } - - private fun calculateMountainRidge(x: Double, y: Double, width: Int, height: Int): Double { - // 创建山脉基底 - val ridgeCenter = height / 2.0 - val distanceToRidge = abs(y - ridgeCenter) - val ridgeWidth = height * 0.3 - - if (distanceToRidge <= ridgeWidth) { - val ridgeFactor = 1.0 - (distanceToRidge / ridgeWidth) - return ridgeFactor * 15.0 * perlinNoise(x * 0.01, y * 0.01, 0.02) - } - return 0.0 - } - - private fun generateRandomVolcanoPositions(count: Int, width: Int, height: Int): List { - return List(count) { - VolcanoInfo( - x = (width * 0.2 + random() * width * 0.6), - y = (height * 0.2 + random() * height * 0.6), - radius = 20.0 + random() * 20.0, - craterRadius = 5.0 + random() * 7.0, - maxHeight = 25.0 + random() * 35.0 - ) - } - } - - private fun generateLavaFlowPaths(centerX: Double, centerY: Double, count: Int): List { - return List(count) { - LavaFlowInfo( - startX = centerX, - startY = centerY, - angle = random() * 2 * PI, - length = 20.0 + random() * 15.0, - width = 2.0 + random() * 3.0, - intensity = 5.0 + random() * 8.0 - ) - } - } - - private fun perlinNoise(x: Double, y: Double, frequency: Double): Double { - // 简化的柏林噪声实现 - val x0 = floor(x * frequency) - val y0 = floor(y * frequency) - val x1 = x0 + 1 - val y1 = y0 + 1 - - fun grad(ix: Int, iy: Int): Double { - val random = sin(ix * 12.9898 + iy * 78.233) * 43758.5453 - return (random % 1.0) * 2 - 1 - } - - fun interpolate(a: Double, b: Double, w: Double): Double { - return a + (b - a) * (w * w * (3 - 2 * w)) - } - - val g00 = grad(x0.toInt(), y0.toInt()) - val g10 = grad(x1.toInt(), y0.toInt()) - val g01 = grad(x0.toInt(), y1.toInt()) - val g11 = grad(x1.toInt(), y1.toInt()) - - val tx = x * frequency - x0 - val ty = y * frequency - y0 - - val n0 = interpolate(g00, g10, tx) - val n1 = interpolate(g01, g11, tx) - - return interpolate(n0, n1, ty) - } - - private fun random(): Double = Math.random() -} \ No newline at end of file diff --git a/dokka/images/logo-icon.svg b/dokka/images/logo-icon.svg deleted file mode 100644 index 57694fb7..00000000 --- a/dokka/images/logo-icon.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/dokka/styles/extra.css b/dokka/styles/extra.css deleted file mode 100644 index ea6338ee..00000000 --- a/dokka/styles/extra.css +++ /dev/null @@ -1,4 +0,0 @@ - -.library-name--link { text-transform: uppercase; } -.library-version { top: 0px; margin-left: 10px; } - diff --git a/gradle.properties b/gradle.properties index c066fcca..20e2a015 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,32 +1,22 @@ -# suppress inspection "UnusedProperty" for whole file - -kotlin.code.style=official - -# For optimal compilation performance -org.gradle.jvmargs=-Xmx2G -XX:+UseParallelGC -kotlin.incremental.multiplatform=true -# https://kotlinlang.org/docs/gradle.html#check-for-jvm-target-compatibility-of-related-compile-tasks -kotlin.jvm.target.validation.mode=error -org.gradle.parallel=true -org.gradle.caching=true - -#org.gradle.configuration-cache=true -#org.gradle.configuration-cache.parallel=true -#org.gradle.configuration-cache.problems=warn - -# Whether to automatically bundle the Kotlin standard library (true by default) -# https://kotlinlang.org/docs/gradle.html#dependency-on-the-standard-library -kotlin.stdlib.default.dependency=true -kotlin.mpp.import.legacyTestSourceSetDetection=true - -# Enable Dokka 2.0.0 -org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled -org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true - +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 68eff4f4..55395292 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,30 +1,6 @@ [versions] -kotlinApi = "2.2" -kotlinLanguage = "2.2" kotlin = "2.2.21" -jvmTarget = "17" -openrndr = { require = "[0.5,0.6.0)" } -kotest = "5.9.1" -dokka = "2.1.0" -nebulaRelease = "18.0.7" -boofcv = "1.2.4" -libfreenect = "0.5.7-1.5.9" -librealsense = "2.53.1-1.5.9" -gson = "2.13.2" -antlr = "4.13.2" -antlrKotlin = "1.0.8" -minim = "2.2.2" -netty = "4.2.7.Final" -rabbitcontrol = "0.3.39" -zxing = "3.5.4" ktor = "3.3.2" -jgit = "7.3.0.202506031305-r" -javaosc = "0.9" -jsoup = "1.21.2" -mockk = "1.14.2" -processing = "4.4.10" -nmcp = "1.2.0" -okhttp = "5.2.1" agp = "8.13.1" junit = "4.13.2" coreKtx = "1.17.0" @@ -39,36 +15,6 @@ kotlinx-serialization = "1.9.0" mapbox = "11.16.6" [libraries] -okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } -kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } -kotlin-test = { group = "org.jetbrains.kotlin", name = "kotlin-test", version.ref = "kotlin" } -kotlin-scriptingJvm = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-jvm", version.ref = "kotlin" } -kotlin-scriptingJvmHost = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-jvm-host", version.ref = "kotlin" } -kotlin-scriptingJSR223 = { group = "org.jetbrains.kotlin", name = "kotlin-scripting-jsr223", version.ref = "kotlin" } -kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } -kotlin-serialization-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-serialization", version.ref = "kotlin" } -dokka-gradle-plugin = { group = "org.jetbrains.dokka", name = "dokka-gradle-plugin", version.ref = "dokka" } - -mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk"} - -processing-core = { group = "org.processing", name = "core", version.ref = "processing"} - -boofcv = { group = "org.boofcv", name = "boofcv-core", version.ref = "boofcv" } -libfreenect = { group = "org.bytedeco", name = "libfreenect", version.ref = "libfreenect" } -librealsense = { group = "org.bytedeco", name = "librealsense2", version.ref = "librealsense" } -minim = { group = "net.compartmental.code", name = "minim", version.ref = "minim" } -netty-all = { group = "io.netty", name = "netty-all", version.ref = "netty" } -rabbitcontrol-rcp = { group = "cc.rabbitcontrol", name = "rcp", version.ref = "rabbitcontrol" } -zxing-core = { group = "com.google.zxing", name = "core", version.ref = "zxing" } -ktor-server-core = { group = "io.ktor", name = "ktor-server-core", version.ref = "ktor" } -ktor-server-netty = { group = "io.ktor", name = "ktor-server-netty", version.ref = "ktor" } -jgit = { group = "org.eclipse.jgit", name = "org.eclipse.jgit", version.ref = "jgit" } -javaosc-core = { group = "com.illposed.osc", name = "javaosc-core", version.ref = "javaosc" } -gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } -antlr-core = { group = "org.antlr", name = "antlr4", version.ref = "antlr" } -antlr-runtime = { group = "org.antlr", name = "antlr4-runtime", version.ref = "antlr" } -antlr-kotlin-runtime = { group = "com.strumenta", name = "antlr-kotlin-runtime", version.ref = "antlrKotlin" } -jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoup" } junit = { group = "junit", name = "junit", version.ref = "junit" } core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } @@ -90,11 +36,7 @@ mapbox-maps = { module = "com.mapbox.maps:android-ndk27", version.ref = "mapbox" [plugins] kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -nebula-release = { id = "nebula.release", version.ref = "nebulaRelease" } -kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" } -antlr-kotlin = { id = "com.strumenta.antlr-kotlin", version.ref = "antlrKotlin" } -nmcp = { id = "com.gradleup.nmcp.aggregation", version.ref = "nmcp" } android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -android-library = { id = "com.android.library", version.ref = "agp" } \ No newline at end of file +android-library = { id = "com.android.library", version.ref = "agp" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55baabb587c669f562ae36f953de2481846..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37442 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


      <&k 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 z znM4>w7&stT|1eC}Uh2*{EtBs}H3I{~l*!dgomiL-vD}}0aH$y6H@?Y^%VZ{d@GDFX z*dQRCld{e?kBNa{GcyB&8UrT-0yIo^Smq>?y@q{eG!p~EHWmg3V-$IBVX#3BV(gO- z3rkN9*dQnkzv7&M!3IUGfEZM*Hpo&LOp0=;(IEpAjK@8tNAAHTOr28tBxecHu?VwEgASlY|Q9>meWL0 zY_BB>GE4@1=@%md!#O4f1|t;zOw)#III1HBQp_3;y0K|8<0?_6HM(HQ3wnAW2^qvS zC+JZz%>b;hL5ywkhE?)1h)WC56)rKI{CbrmYcS}n{mF)_MVV}^Ccj>#G&yUvsto*i zag3P!Y(07PYJX|?;noZcjwqgpv!A?rwe)0zHI6cfW0Dyd>`)ZNI!^9g6DjiwenKw; zgFcFaDbAA*t{0u0?FxI;_Mj)23-_ImSJE;|D)I@?^~xUgV;d9z@UYq zuq*a#`a!kYs%rAV^&T>aQBDR11r(Dw zYbGCDFEiP3gS-rU@QQ_jK^{d>WH;Dd#*-lF5C=I_ zbPNo7D5mA~gB7`KG?9Teav1{H(8KKbWUwMgFHlDYxmeObF->YZRG}W*xw)WX1^{KJ BNooK9 diff --git a/gradlew b/gradlew index 23d15a93..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee8..e509b2dd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock deleted file mode 100644 index 3f37bfe8..00000000 --- a/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,2089 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@^0.6.1": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" - integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.25": - version "0.3.30" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz#4a76c4daeee5df09f5d3940e087442fb36ce2b99" - integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@socket.io/component-emitter@~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" - integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@*", "@types/node@>=10.0.0": - version "18.7.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.13.tgz#23e6c5168333480d454243378b69e861ab5c011a" - integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" - integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== - -"@webpack-cli/info@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" - integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== - -"@webpack-cli/serve@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" - integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn@^8.14.0, acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@^1.19.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.24.0: - version "4.25.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.2.tgz#90c1507143742d743544ae6e92bca3348adff667" - integrity sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA== - dependencies: - caniuse-lite "^1.0.30001733" - electron-to-chromium "^1.5.199" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001733: - version "1.0.30001735" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz#ba658fd3fd24a4106fd68d5ce472a2c251494dbe" - integrity sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== - -date-format@^4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.13.tgz#87c3aab3a4f6f37582c5f5f63692d2956fa67890" - integrity sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== - -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.5.199: - version "1.5.203" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz#ef7fc2f7e1b816fa4535c861d1ec1348204142b6" - integrity sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -engine.io-parser@~5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" - integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== - -engine.io@~6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" - integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - -enhanced-resolve@^5.17.2: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== - -envinfo@^7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" - integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== - -es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.6: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.0.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -format-util@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^10.4.5: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3, glob@^7.1.7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.2.10, graceful-fs@^4.2.11: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isbinaryfile@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" - integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -karma-chrome-launcher@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" - integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz#b01d73f8f688f533bcc8f5d273d43458e13b5488" - integrity sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA== - dependencies: - graceful-fs "^4.2.10" - -karma-webpack@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.1.tgz#4eafd31bbe684a747a6e8f3e4ad373e53979ced4" - integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== - dependencies: - glob "^7.1.3" - minimatch "^9.0.3" - webpack-merge "^4.1.5" - -karma@6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492" - integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== - dependencies: - "@colors/colors" "1.5.0" - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.4.1" - mime "^2.5.2" - minimatch "^3.0.4" - mkdirp "^0.5.5" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^4.7.2" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.30" - yargs "^16.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kotlin-web-helpers@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.1.0.tgz#6cd4b0f0dc3baea163929c8638155b8d19c55a74" - integrity sha512-NAJhiNB84tnvJ5EQx7iER3GWw7rsTZkX9HVHZpe7E3dDBD/dhTzqgSwNU3MfQjniy2rB04bP24WM9Z32ntUWRg== - dependencies: - format-util "^1.0.5" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.4.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.6.1.tgz#48f23de8a87d2f5ffd3d913f24ca9ce77895272f" - integrity sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A== - dependencies: - date-format "^4.0.13" - debug "^4.3.4" - flatted "^3.2.6" - rfdc "^1.3.0" - streamroller "^3.1.2" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.3: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.3, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@11.7.1: - version "11.7.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.1.tgz#91948fecd624fb4bd154ed260b7e1ad3910d7c7a" - integrity sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A== - dependencies: - browser-stdout "^1.3.1" - chokidar "^4.0.1" - debug "^4.3.5" - diff "^7.0.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^9.0.5" - ms "^2.1.3" - picocolors "^1.1.1" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^9.2.0" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.20.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" - integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -socket.io-adapter@~2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" - integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== - dependencies: - debug "~4.3.4" - ws "~8.11.0" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.7.2: - version "4.7.5" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" - integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.5.2" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" - integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== - dependencies: - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - -source-map-support@0.5.21, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -streamroller@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.2.tgz#abd444560768b340f696307cf84d3f46e86c0e63" - integrity sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A== - dependencies: - date-format "^4.0.13" - debug "^4.3.4" - fs-extra "^8.1.0" - -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1: - version "5.43.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -vary@^1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== - -watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-cli@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" - integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== - dependencies: - "@discoveryjs/json-ext" "^0.6.1" - "@webpack-cli/configtest" "^3.0.1" - "@webpack-cli/info" "^3.0.1" - "@webpack-cli/serve" "^3.0.1" - colorette "^2.0.14" - commander "^12.1.0" - cross-spawn "^7.0.3" - envinfo "^7.14.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^6.0.1" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" - integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.1" - -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== - -webpack@5.100.2: - version "5.100.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.100.2.tgz#e2341facf9f7de1d702147c91bcb65b693adf9e8" - integrity sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.2" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -workerpool@^9.2.0: - version "9.3.3" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.3.tgz#e75281fe62e851afb21cdeef8fa85f6a62ec3583" - integrity sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/openrndr-demos/build.gradle.kts b/openrndr-demos/build.gradle.kts deleted file mode 100644 index 69f90cb9..00000000 --- a/openrndr-demos/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - demoImplementation(project(":orx-mesh-generators")) - demoImplementation(project(":orx-parameters")) - demoImplementation(project(":orx-noise")) - demoImplementation(project(":orx-jvm:orx-gui")) - demoImplementation(project(":orx-shader-phrases")) - demoImplementation(project(":orx-camera")) - demoImplementation(project(":orx-color")) - demoImplementation(project(":orx-composition")) - demoImplementation(project(":orx-shapes")) - demoImplementation(project(":orx-svg")) - demoImplementation(sharedLibs.slf4j.simple) - demoImplementation(openrndr.ffmpeg) -} diff --git a/openrndr-demos/src/demo/kotlin/Demo16BitPng.kt b/openrndr-demos/src/demo/kotlin/Demo16BitPng.kt deleted file mode 100644 index 77f99c5c..00000000 --- a/openrndr-demos/src/demo/kotlin/Demo16BitPng.kt +++ /dev/null @@ -1,13 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.loadImage - -fun main() = application { - program { - val image16 = loadImage("demo-data/images/16-bit.png") - val image8 = loadImage("demo-data/images/image-001.png") - extend { - drawer.image(image16) - drawer.image(image8, 320.0, 0.0) - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoAnimation01.kt b/openrndr-demos/src/demo/kotlin/DemoAnimation01.kt deleted file mode 100644 index 1b9da509..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoAnimation01.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.animatable.Animatable -import org.openrndr.animatable.easing.Easing -import org.openrndr.application -import org.openrndr.math.Vector2 - -fun main() = application { - program { - class A: Animatable() { - var x = 0.0 - var y = Vector2(200.0, 200.0) - } - - val a = A() - a.apply { - ::y.animate(Vector2.ZERO, 10000, Easing.CubicInOut) - ::x.animate(100.0, 5000).completed.listen { - println("hello world") - ::x.animate(1.0, 5000).completed.listen { - println("we meet again") - } - } - } - - extend { - a.updateAnimation() - drawer.circle(a.y, 10.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoAsyncImages01.kt b/openrndr-demos/src/demo/kotlin/DemoAsyncImages01.kt deleted file mode 100644 index 052ba1b3..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoAsyncImages01.kt +++ /dev/null @@ -1,13 +0,0 @@ -import org.openrndr.application -import org.openrndr.internal.colorBufferLoader - -fun main() = application { - program { - extend { - val proxy = colorBufferLoader.loadFromUrl("https://avatars3.githubusercontent.com/u/31103334?s=200&v=4") - proxy.colorBuffer?.let { - drawer.image(it) - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoBillboardCircles01.kt b/openrndr-demos/src/demo/kotlin/DemoBillboardCircles01.kt deleted file mode 100644 index 636eebb4..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoBillboardCircles01.kt +++ /dev/null @@ -1,65 +0,0 @@ -// Demonstration of circles that always face the camera - -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.noise.uniformRing -import org.openrndr.extra.camera.Orbital -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 - - -fun main() = application { - configure { - multisample = WindowMultisample.SampleCount(8) - } - program { - extend(Orbital()) - - val circlePositions = vertexBuffer(vertexFormat { - attribute("position", VertexElementType.VECTOR3_FLOAT32) - attribute("scale", VertexElementType.FLOAT32) - }, 1000) - - circlePositions.put { - for (i in 0 until circlePositions.vertexCount) { - write(Vector3.uniformRing(2.0, 3.0)) - write(Math.random().toFloat()*0.1f) - } - } - - extend { - drawer.perspective(90.0, width*1.0/height*1.0, 0.1, 100.0) - - drawer.fill = ColorRGBa.PINK - drawer.stroke = null - drawer.drawStyle.alphaToCoverage = true - - drawer.depthWrite = true - drawer.depthTestPass = DepthTestPass.LESS_OR_EQUAL - - drawer.shadeStyle = shadeStyle { - vertexTransform = """ - vec3 viewOffset = (x_viewMatrix * x_modelMatrix * vec4(i_position, 1.0)).xyz; - vec2 i = vec2(0.0, 1.0); - x_viewMatrix = mat4(i.yxxx, i.xyxx, i.xxyx, i.xxxy); - x_modelMatrix = mat4(i.yxxx, i.xyxx, i.xxyx, i.xxxy); - x_position = viewOffset + vec3(a_position.xy * i_scale, 0.0); - vi_radius = vec2(i_scale); - """.trimIndent() - - // The circle bounds can be used to calculate a color or to sample a texture - fragmentTransform = """ - float r = length(c_boundsPosition.xy - 0.5) * 2.0; - x_fill.rg = c_boundsPosition.xy; - x_fill.a = 1.0 - step(1.0, r); - """.trimIndent() - - attributes(circlePositions) - } - - drawer.circles((0 until circlePositions.vertexCount).map { Vector2.ZERO }, 0.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCatmullRom01.kt b/openrndr-demos/src/demo/kotlin/DemoCatmullRom01.kt deleted file mode 100644 index 46b06be0..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCatmullRom01.kt +++ /dev/null @@ -1,32 +0,0 @@ -// Converting Catmull-Rom curves to Bezier - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.shapes.splines.CatmullRomChain2 -import org.openrndr.extra.shapes.splines.toContour -import org.openrndr.math.Polar -import org.openrndr.shape.ShapeContour - -fun main() = application { - program { - val points = List(6) { - Polar(it * 70.0, 100.0).cartesian + drawer.bounds.center - } - val cmr = CatmullRomChain2(points, 1.0, loop = true) - val contour = ShapeContour.fromPoints(cmr.positions(200), true) - - extend { - drawer.run { - clear(ColorRGBa.WHITE) - fill = null - stroke = ColorRGBa.BLACK - contour(contour) - circles(points, 5.0) - - stroke = ColorRGBa.RED - contour(cmr.toContour()) - fill = ColorRGBa.BLACK - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoCircleBatch01.kt b/openrndr-demos/src/demo/kotlin/DemoCircleBatch01.kt deleted file mode 100644 index e15fe5e7..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCircleBatch01.kt +++ /dev/null @@ -1,18 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa - -/* -This demo just verifies that drawing a single circle still works with revamped circle drawing code - */ -fun main() = application { - program { - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - drawer.circle(100.0, 100.0, 50.0) - drawer.rectangle(100.0, 100.0, 50.0, 50.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt b/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt deleted file mode 100644 index 16771dc2..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt +++ /dev/null @@ -1,43 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.circleBatch -import org.openrndr.draw.shadeStyle - -/* -This program demonstrates creating "pre-baked" batches of circles. -Batches can have varying fill, stroke and strokeWeight settings. - -Batches are (currently) static but stored in GPU memory but can be -animated using a vertex shader. Batches are fast to draw. -*/ - -fun main() = application { - program { - val batch = drawer.circleBatch { - for (i in 0 until 2000) { - fill = ColorRGBa.PINK.shade(Math.random()) - strokeWeight = Math.random() * 5 - circle(width * 0.5, height * 0.5, 20 * Math.random() + 5) - } - } - - extend { - drawer.clear(ColorRGBa.GRAY) - - // The following optional shadeStyle animates the batch - // by using polar coordinates: - // sets angle and radius based on time and shape ID. - drawer.shadeStyle = shadeStyle { - vertexTransform = """ - float a = float(c_instance) + p_time * 0.1; - float r = 200.0 + 100.0 * sin(a * 0.998); - x_position.x += r * sin(a); - x_position.y += r * cos(a); - """.trimIndent() - parameter("time", seconds) - } - - drawer.circles(batch) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCircleBatch03.kt b/openrndr-demos/src/demo/kotlin/DemoCircleBatch03.kt deleted file mode 100644 index 93c4b775..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCircleBatch03.kt +++ /dev/null @@ -1,30 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.hsv -import org.openrndr.extra.noise.simplex -import kotlin.math.abs - -/* -This program demonstrates dynamic circle batches - */ - -fun main() = application { - program { - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.circles { - this.fill = ColorRGBa.PINK - for (i in 0 until 10000) { - val hue = simplex(i * 403, i * 149.0 + 0.2 * seconds) * 180.0 + 180.0 - fill = hsv(hue, 0.5, 0.3).toRGBa() - stroke = hsv(hue + 180.0, 0.5, 1.0).toRGBa() - val x = simplex(i * 337, i * 43.0 + 0.1 * seconds) * width / 2.0 + width / 2.0 - val y = simplex(i * 439, i * 39.0 - 0.1 * seconds) * height / 2.0 + height / 2.0 - val radius = simplex(i * 139, i * 51.0 + seconds * 0.43) * 20.0 + 20.0 - strokeWeight = abs(simplex(i * 139, i * 51.0 + seconds * 0.43) * radius * 0.5) - circle(x, y, radius) - } - } - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoClipping.kt b/openrndr-demos/src/demo/kotlin/DemoClipping.kt deleted file mode 100644 index c224aa3b..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoClipping.kt +++ /dev/null @@ -1,43 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.ClipMode -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.drawComposition -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle -import org.openrndr.shape.LineSegment -import org.openrndr.shape.Shape - -fun main() = application { - program { - val outline = Shape( - listOf( - Circle(drawer.bounds.center, 70.0).contour.reversed, - Circle(drawer.bounds.center, 100.0).contour, - ) - ) - - val radius = outline.bounds.dimensions.length / 2 - val off = outline.bounds.center - val num = radius.toInt() - - val svg = drawComposition { - lineSegments(List(num) { segNum -> - val yNorm = (segNum / (num - 1.0)) - val x = ((segNum % 2) * 2.0 - 1.0) * radius - val y = (yNorm * 2.0 - 1.0) * radius - val start = Vector2(-x, y) + off - val end = Vector2(x, y) + off - LineSegment(start, end) - }) - clipMode = ClipMode.INTERSECT - shape(outline) - } - extend { - drawer.clear(ColorRGBa.PINK) - drawer.fill = null - drawer.shape(outline) - drawer.composition(svg) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoColorBufferCopy01.kt b/openrndr-demos/src/demo/kotlin/DemoColorBufferCopy01.kt deleted file mode 100644 index ca972264..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoColorBufferCopy01.kt +++ /dev/null @@ -1,14 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage - -fun main() = application { - program { - val cb0 = loadImage("demo-data/images/image-001.png") - val cb1 = cb0.createEquivalent() - extend { - cb0.copyTo(cb1) - drawer.image(cb1) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle01.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle01.kt deleted file mode 100644 index 263346a1..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle01.kt +++ /dev/null @@ -1,97 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 - -/** - * SSBO -> https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object - * - * This program demonstrates - * - how to create an SSBO - * - how to populate an SSBO with data - * - how to pass an SSBO to a compute shader - * - how to download the SSBO data to the CPU before and after executing the compute shader - * - * It prints the before/after data to observe how it was modified by the compute shader. - * - * Writing a useful compute shader that processes data faster than in the CPU is NOT a goal - * of this program, since such a simple calculation would be faster and easier if done completely in the CPU. - * - * Notice how the execute() call has a width, height and depth of 1 - * (basically doing just one computation). - * - * A useful compute shader would do a large number of parallel computations. - * This will be presented in a different demo. - * - * Output: byteBuffer -> text - */ - -fun main() = application { - program { - // Define SSBO format - val fmt = shaderStorageFormat { - primitive("time", BufferPrimitiveType.FLOAT32) - primitive("vertex", BufferPrimitiveType.VECTOR2_FLOAT32, 3) - struct("Particle", "particles", 5) { - primitive("pos", BufferPrimitiveType.VECTOR3_FLOAT32) - primitive("age", BufferPrimitiveType.FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val ssbo = shaderStorageBuffer(fmt) - - // Populate SSBO - ssbo.put { - write(3.0.toFloat()) // time - repeat(3) { - write(Vector2(1.1, 1.2)) // vertex - } - repeat(5) { - write(Vector3(2.1, 2.2, 2.3)) // pos - write(1.0.toFloat()) // age - } - } - - // Create Compute Shader - val cs = computeStyle { - computeTransform = """ - b_myData.time = 3.3; - b_myData.vertex[0] = vec2(7.01); - b_myData.vertex[1] = vec2(7.02); - b_myData.vertex[2] = vec2(7.03); - b_myData.particles[0].pos = vec3(112.0); - b_myData.particles[0].age = 111.0; - """.trimIndent() - } - cs.buffer("myData", ssbo) - - // Download SSBO data to CPU - val byteBufferBeforeExecute = ssbo.createByteBuffer() - byteBufferBeforeExecute.rewind() - ssbo.read(byteBufferBeforeExecute) - - // Execute compute shader - cs.execute(1, 1, 1) - - // Download SSBO data to CPU - val byteBufferAfterExecute = ssbo.createByteBuffer() - byteBufferAfterExecute.rewind() - ssbo.read(byteBufferAfterExecute) - - // Debugging - - // Notice the (maybe unexpected) 0.0 padding values printed on the console. - // Depending on the variable size in bytes, padding may be added by the system - // to align them in memory. This will depend on the sizes of the involved variables, - // and their order. For instance, a vec3 and a float do not require padding, but - // a float followed by a vec3 pads the float with 3 values, and the vec3 with one. - // Run compute02.kt and study the output to observe a more inefficient layout. - byteBufferBeforeExecute.rewind() - byteBufferAfterExecute.rewind() - repeat(ssbo.format.size / 4) { - println("$it: ${byteBufferBeforeExecute.float} -> ${byteBufferAfterExecute.float}") - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle02.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle02.kt deleted file mode 100644 index b57cd04e..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle02.kt +++ /dev/null @@ -1,83 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 - -/** - * A program identical to compute01.kt, except that the order of variables - * `age` and `pos` have been swapped, resulting in a less ideal memory layout. - * In this case the SSBO requires 192 bytes instead of 112, and padding is - * inserted after the variables `time`, `age` and `pos`. - * - * Output: byteBuffer -> text - */ - -fun main() = application { - program { - // Define SSBO format - val fmt = shaderStorageFormat { - primitive("time", BufferPrimitiveType.FLOAT32) - primitive("vertex", BufferPrimitiveType.VECTOR2_FLOAT32, 3) - struct("Particle", "particles", 5) { - primitive("age", BufferPrimitiveType.FLOAT32) - primitive("pos", BufferPrimitiveType.VECTOR3_FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val ssbo = shaderStorageBuffer(fmt) - - // Populate SSBO - ssbo.put { - write(3.0.toFloat()) // time - repeat(3) { - write(Vector2(1.1, 1.2)) // vertex - } - repeat(5) { - write(1.0.toFloat()) // age - write(Vector3(2.1, 2.2, 2.3))// pos - } - } - - // Create Compute Shader - val cs = computeStyle { - computeTransform = """ - b_myData.time = 3.3; - b_myData.vertex[0] = vec2(7.01); - b_myData.vertex[1] = vec2(7.02); - b_myData.vertex[2] = vec2(7.03); - b_myData.particles[0].pos = vec3(112.0); - b_myData.particles[0].age = 111.0; - """.trimIndent() - } - cs.buffer("myData", ssbo) - - // Download SSBO data to CPU - val byteBufferBeforeExecute = ssbo.createByteBuffer() - byteBufferBeforeExecute.rewind() - ssbo.read(byteBufferBeforeExecute) - - // Execute compute shader - cs.execute(1, 1, 1) - - // Download SSBO data to CPU - val byteBufferAfterExecute = ssbo.createByteBuffer() - byteBufferAfterExecute.rewind() - ssbo.read(byteBufferAfterExecute) - - // Debugging - - // Notice the (maybe unexpected) 0.0 padding values printed on the console. - // Depending on the variable size in bytes, padding may be added by the system - // to align them in memory. This will depend on the sizes of the involved variables, - // and their order. For instance, a vec3 and a float do not require padding, but - // a float followed by a vec3 pads the float with 3 values, and the vec3 with one. - // Run compute02.kt and study the output to observe a more inefficient layout. - byteBufferBeforeExecute.rewind() - byteBufferAfterExecute.rewind() - repeat(ssbo.format.size / 4) { - println("$it: ${byteBufferBeforeExecute.float} -> ${byteBufferAfterExecute.float}") - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle03.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle03.kt deleted file mode 100644 index b9f8f2ac..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle03.kt +++ /dev/null @@ -1,88 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 - -/** - * This program demonstrates - * - how to use a compute shader and an SSBO to do many computations in parallel - * - how to use a compute shader to initialize an SSBO - * - how to use a different shader to update the SSBO - * - * Note the `workGroupSize` property. The GPU splits tasks - * into chunks and computes those in parallel. The ideal workGroupSize depends on - * the GPU being used. Too small of a size may be inefficient. - * - * In some cases a compute shader works with 2D images or 3D data structures, but in this - * program we are processing the elements of a 1D array. That's why we only - * increase the x value to 32, leaving y and z equal to 1. - * - * Note: this program only does the computation, but does not visualize the results - * in any way. We will do that in another program. - * - * Output: none - */ - -fun main() = application { - program { - val particleCount = 4800 - // Define SSBO format - val fmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val particlesSSBO = shaderStorageBuffer(fmt) - - // Create Compute Shaders - val initCS = computeStyle { - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - b_particles.particle[id].pos = vec2(320.0, 240.0); - b_particles.particle[id].velocity = vec2(cos(id), sin(id)); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - val updateCS = computeStyle { - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - - // Add velocity to position - b_particles.particle[id].pos += b_particles.particle[id].velocity; - - // Deal with the particle trying to escape the window - if(b_particles.particle[id].pos.x < 0.0) { - b_particles.particle[id].pos.x = 0.0; - b_particles.particle[id].velocity.x = abs(b_particles.particle[id].velocity.x); - } - if(b_particles.particle[id].pos.y < 0.0) { - b_particles.particle[id].pos.y = 0.0; - b_particles.particle[id].velocity.y = abs(b_particles.particle[id].velocity.y); - } - if(b_particles.particle[id].pos.x > p_windowSize.x) { - b_particles.particle[id].pos.x = p_windowSize.x; - b_particles.particle[id].velocity.x = -abs(b_particles.particle[id].velocity.x); - } - if(b_particles.particle[id].pos.y > p_windowSize.y) { - b_particles.particle[id].pos.y = p_windowSize.y; - b_particles.particle[id].velocity.y = -abs(b_particles.particle[id].velocity.y); - } - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - - // Execute initCS - initCS.buffer("particles", particlesSSBO) - initCS.execute(particleCount / initCS.workGroupSize.x) - - extend { - updateCS.buffer("particles", particlesSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount / updateCS.workGroupSize.x) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle04.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle04.kt deleted file mode 100644 index e4579554..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle04.kt +++ /dev/null @@ -1,107 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 - -/** - * This program draws moving points to demonstrate - * how to write the resulting calculations of a compute shader into a vertex buffer. - * - * There are various ways to output the calculations and make them visible to the user: - * - Write into a vertex buffer, which can be rendered as points, lines or triangles by OPENRNDR - * (this program). - * - Update a colorBuffer (the pixels of a texture). - * - * Output: vertexBuffer -> POINTS - */ - -fun main() = application { - program { - val particleCount = 4800 - // Define SSBO format - val fmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val particleSSBO = shaderStorageBuffer(fmt) - - // Create a vertex buffer. - // Padding is required if position has less than 4 dimensions. - // val vb = vertexBuffer(vertexFormat { - // position(3) - // paddingFloat(1) - // }, particleCount) - - // With BufferAlignment.STD430 padding is taken care of - val vb = vertexBuffer(vertexFormat(BufferAlignment.STD430) { - position(3) - }, particleCount) - - // Create Compute Shaders - val initCS = computeStyle { - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - b_particles.particle[id].pos = vec2(320.0, 240.0); - b_particles.particle[id].velocity = vec2(cos(id), sin(id)); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - val updateCS = computeStyle { - // We can create GLSL functions in the computePreamble. - // Thanks to an `inout` variable, we can shorten the code. - // (Compare this with compute03.kt) - computePreamble = """ - void updateParticle(inout Particle p) { - // Add velocity to position - p.pos += p.velocity; - - // Deal with the particle trying to escape the window - if(p.pos.x < 0.0) { - p.pos.x = 0.0; - p.velocity.x = abs(p.velocity.x); - } - if(p.pos.y < 0.0) { - p.pos.y = 0.0; - p.velocity.y = abs(p.velocity.y); - } - if(p.pos.x > p_windowSize.x) { - p.pos.x = p_windowSize.x; - p.velocity.x = -abs(p.velocity.x); - } - if(p.pos.y > p_windowSize.y) { - p.pos.y = p_windowSize.y; - p.velocity.y = -abs(p.velocity.y); - } - } - """.trimIndent() - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - updateParticle(b_particles.particle[id]); - - // Update the vertexBuffer with data from the shaderStorageBuffer - b_vb.vertex[id].position.xy = b_particles.particle[id].pos; - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - - // Execute initCS - initCS.buffer("particles", particleSSBO) - initCS.execute(particleCount / initCS.workGroupSize.x) - - extend { - updateCS.buffer("vb", vb.shaderStorageBufferView()) - updateCS.buffer("particles", particleSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount /updateCS.workGroupSize.x) - - drawer.fill = ColorRGBa.WHITE - drawer.vertexBuffer(vb, DrawPrimitive.POINTS) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle05.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle05.kt deleted file mode 100644 index 985ce2a3..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle05.kt +++ /dev/null @@ -1,97 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 - -/** - * This program demonstrates how to change the rendering type from POINTS to LINE_LOOP. - * In everything else, it's identical to compute04.kt - * - * Output: vertexBuffer -> LINE_LOOP - */ - -fun main() = application { - program { - val particleCount = 4800 - // Define SSBO format - val fmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val particleSSBO = shaderStorageBuffer(fmt) - - // Create a vertex buffer. - // Padding is required if position has less than 4 dimensions. - // val vb = vertexBuffer(vertexFormat { - // position(3) - // paddingFloat(1) - // }, particleCount) - - // With BufferAlignment.STD430 padding is taken care of - val vb = vertexBuffer(vertexFormat(BufferAlignment.STD430) { - position(3) - }, particleCount) - - // Create Compute Shaders - val initCS = computeStyle { - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - b_particles.particle[id].pos = vec2(320.0, 240.0); - b_particles.particle[id].velocity = vec2(cos(id), sin(id)); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - val updateCS = computeStyle { - computePreamble = """ - void updateParticle(inout Particle p) { - // Add velocity to position - p.pos += p.velocity; - - // Deal with the particle trying to escape the window - if(p.pos.x < 0.0) { - p.pos.x = 0.0; - p.velocity.x = abs(p.velocity.x); - } - if(p.pos.y < 0.0) { - p.pos.y = 0.0; - p.velocity.y = abs(p.velocity.y); - } - if(p.pos.x > p_windowSize.x) { - p.pos.x = p_windowSize.x; - p.velocity.x = -abs(p.velocity.x); - } - if(p.pos.y > p_windowSize.y) { - p.pos.y = p_windowSize.y; - p.velocity.y = -abs(p.velocity.y); - } - } - """.trimIndent() - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - updateParticle(b_particles.particle[id]); - b_vb.vertex[id].position.xy = b_particles.particle[id].pos; - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - - // Execute initCS - initCS.buffer("particles", particleSSBO) - initCS.execute(particleCount / initCS.workGroupSize.x) - - extend { - updateCS.buffer("vb", vb.shaderStorageBufferView()) - updateCS.buffer("particles", particleSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount / updateCS.workGroupSize.x) - - drawer.fill = ColorRGBa.WHITE - drawer.vertexBuffer(vb, DrawPrimitive.LINE_LOOP) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle06.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle06.kt deleted file mode 100644 index d9421352..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle06.kt +++ /dev/null @@ -1,93 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 - -/** - * This program is almost identical to compute04.kt, but instead of writing into - * a vertex buffer, it draws the particles into a 2D image (a ColorBuffer). - * - * Output: 2D Image - */ - -fun main() = application { - program { - val particleCount = 4800 - // Define SSBO format - val fmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val particleSSBO = shaderStorageBuffer(fmt) - - // Create a color buffer to write into. - val cb = colorBuffer(width, height, type = ColorType.FLOAT32) - - // Create Compute Shaders - val initCS = computeStyle { - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - b_particles.particle[id].pos = vec2(320.0, 240.0); - b_particles.particle[id].velocity = vec2(cos(id), sin(id)); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - val updateCS = computeStyle { - computePreamble = """ - void updateParticle(inout Particle p) { - // Add velocity to position - p.pos += p.velocity; - - // Deal with the particle trying to escape the window - if(p.pos.x < 0.0) { - p.pos.x = 0.0; - p.velocity.x = abs(p.velocity.x); - } - if(p.pos.y < 0.0) { - p.pos.y = 0.0; - p.velocity.y = abs(p.velocity.y); - } - if(p.pos.x > p_windowSize.x) { - p.pos.x = p_windowSize.x; - p.velocity.x = -abs(p.velocity.x); - } - if(p.pos.y > p_windowSize.y) { - p.pos.y = p_windowSize.y; - p.velocity.y = -abs(p.velocity.y); - } - } - """.trimIndent() - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - updateParticle(b_particles.particle[id]); - - // write into the image - imageStore(p_img, ivec2(b_particles.particle[id].pos.xy), vec4(1.0)); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - // Execute initCS - initCS.buffer("particles", particleSSBO) - initCS.execute(particleCount, initCS.workGroupSize.x) - - extend { - // Clear the image, otherwise all pixels become eventually white - cb.fill(ColorRGBa.TRANSPARENT) - - // Pass image to the compute shader. - // We can choose between READ, READ_WRITE or WRITE. - updateCS.image("img", cb.imageBinding(0, ImageAccess.WRITE)) - updateCS.buffer("particles", particleSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount / updateCS.workGroupSize.x) - - drawer.image(cb) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle07.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle07.kt deleted file mode 100644 index edd92235..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle07.kt +++ /dev/null @@ -1,120 +0,0 @@ -package compute - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 - -/** - * This program demonstrates - * - how to modify the particles, adding color, age and ageVelocity. - * - make the particles wrap around the edges instead of bouncing on them. - * - * Output: 2D Image - */ - -fun main() = application { - program { - val particleCount = 4800 - // Define SSBO format - val fmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("color", BufferPrimitiveType.VECTOR3_FLOAT32) - primitive("age", BufferPrimitiveType.FLOAT32) - primitive("ageVelocity", BufferPrimitiveType.FLOAT32) - } - } - println("Study the padding in the format:\n$fmt\n") - - // Create SSBO - val particleSSBO = shaderStorageBuffer(fmt) - - // Create a color buffer to write into. - val cb = colorBuffer(width, height, type = ColorType.FLOAT32) - - // Create Compute Shaders - val initCS = computeStyle { - computePreamble = """ - // From lygia.xyz - vec3 hue2rgb(const in float hue) { - float R = abs(hue * 6.0 - 3.0) - 1.0; - float G = 2.0 - abs(hue * 6.0 - 2.0); - float B = 2.0 - abs(hue * 6.0 - 4.0); - return clamp(vec3(R,G,B), 0.0, 1.0); - } - void initParticle(uint id, inout Particle p) { - float k = 100.0 / $particleCount; - p.velocity = vec2(cos(id * k), sin(id * k)); - p.pos = vec2(320.0, 240.0) + p.velocity * id * 0.0003; - p.color = hue2rgb(fract(id * k / 4.0)); - p.age = id * k / 5.0; - p.ageVelocity = sin(id * k * 1.0) * 0.1 + 0.2; - } - """.trimIndent() - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - initParticle(id, b_particles.particle[id]); - """.trimIndent() - workGroupSize = IntVector3(32, 1, 1) - } - val updateCS = computeStyle { - computePreamble = """ - void updateParticle(inout Particle p) { - // Add velocity to position - p.pos += p.velocity; - - // Update age - p.age += p.ageVelocity; - - // Deal with the particle trying to escape the window - if(p.pos.x < 0.0) { - p.pos.x += p_windowSize.x; - } - if(p.pos.y < 0.0) { - p.pos.y += p_windowSize.y; - } - if(p.pos.x > p_windowSize.x) { - p.pos.x = 0.0; - } - if(p.pos.y > p_windowSize.y) { - p.pos.y = 0.0; - } - } - """.trimIndent() - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - updateParticle(b_particles.particle[id]); - - float alpha = sin(b_particles.particle[id].age); - alpha = sin(alpha + sin(alpha)) * 0.5 + 0.5; - - // draw particle in the image - imageStore(p_img, - ivec2(b_particles.particle[id].pos), - vec4((b_particles.particle[id].color * alpha), alpha) - ); - """.trimIndent() - } - - // Execute initCS - initCS.buffer("particles", particleSSBO) - initCS.execute(particleCount / initCS.workGroupSize.x) - - extend { - // Clear the image, otherwise all pixels become eventually white - cb.fill(ColorRGBa.TRANSPARENT) - - // Pass image to the compute shader. - // We can choose between READ, READ_WRITE or WRITE. - updateCS.image("img", cb.imageBinding(0, ImageAccess.WRITE)) - updateCS.buffer("particles", particleSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount / updateCS.workGroupSize.x) - - drawer.image(cb) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle08.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle08.kt deleted file mode 100644 index 251e14a4..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle08.kt +++ /dev/null @@ -1,128 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -/** - * This program demonstrates - * - How to animate 2D particles but render them as 2D triangles. - * - How to deal with two buffers of different size: the particles buffer - * and the vertex buffer, which has three times more elements. - * The update compute shader calculates 3 vertices for each particle. - * - How to make the init compute shader initialize both the particles (position and velocity) - * and the colors of the vertices. - * - How to create a minimal ShadeStyle to set per-vertex colors, - * and render the colors interpolated across each triangle. - * - * Output: vertexBuffer -> TRIANGLES - */ - -fun main() = application { - program { - val particleCount = 3200 - - // Define SSBO format - val ssboFmt = shaderStorageFormat { - struct("Particle", "particle", particleCount) { - primitive("pos", BufferPrimitiveType.VECTOR2_FLOAT32) - primitive("velocity", BufferPrimitiveType.VECTOR2_FLOAT32) - } - } - println("Study the padding in the format:\n$ssboFmt\n") - - // Create SSBO - val particleSSBO = shaderStorageBuffer(ssboFmt) - - // The padding is required to match the expected layout. - // Even if we are in a 2D world we need to use a 3D position - // because that's what OPENRNDR expects in its shaders. - val vertFormat = vertexFormat(BufferAlignment.STD430) { - position(3) - color(4) - } - println("Study the padding in the vertex buffer format:\n$vertFormat\n") - - // Create vertex buffer. - // Note how me multiply the particleCount by 3 (three vertices per particle). - val vb = vertexBuffer(vertFormat, particleCount * 3) - - // Create Compute Shaders - val initCS = computeStyle { - computeTransform = """ - uint id = gl_GlobalInvocationID.x; - - b_particles.particle[id].pos = vec2(320.0, 240.0); - b_particles.particle[id].velocity = vec2(cos(id), sin(id)); - - // Generate colors based on id - vec4 col = vec4( - sin(id + 0.000) * 0.5 + 0.5, - sin(id + 2.094) * 0.5 + 0.5, - sin(id + 4.188) * 0.5 + 0.5, 1.0); - - // Swap R, G and B and darken the two rear vertices of each triangle. - // This creates a gradient in each triangle. - b_vb.vertex[id * 3 + 0].color = col.rgba; - b_vb.vertex[id * 3 + 1].color = col.grba * 0.5; - b_vb.vertex[id * 3 + 2].color = col.rbga * 0.25; - """.trimIndent() - } - val updateCS = computeStyle { - computePreamble = """ - const float margin = 16.0; - void updateParticle(inout Particle p) { - // Add velocity to position - p.pos += p.velocity; - - // Deal with the particle trying to escape the window - if(p.pos.x < -margin) { - p.pos.x += p_windowSize.x + 2.0 * margin; - } - if(p.pos.y < -margin) { - p.pos.y += p_windowSize.y + 2.0 * margin; - } - if(p.pos.x > p_windowSize.x + margin) { - p.pos.x = -margin; - } - if(p.pos.y > p_windowSize.y + margin) { - p.pos.y = -margin; - } - } - """.trimIndent() - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - updateParticle(b_particles.particle[id]); - - // Calculate the vertices of a directed triangle - // pointing towards `velocity`. Hint: - // vel (x,y) has two normals (-y, x) and (y, -x). - vec2 pos = b_particles.particle[id].pos; - vec2 vel = b_particles.particle[id].velocity * margin; - vec2 n0 = vec2(-vel.y, vel.x) * 0.5; - b_vb.vertex[id * 3 + 0].position = vec3(pos + vel, 0.0); - b_vb.vertex[id * 3 + 1].position = vec3(pos + n0, 0.0); - b_vb.vertex[id * 3 + 2].position = vec3(pos - n0, 0.0); - """.trimIndent() - } - - // Execute initCS - initCS.buffer("vb", vb.shaderStorageBufferView()) - initCS.buffer("particles", particleSSBO) - initCS.execute(particleCount / initCS.workGroupSize.x) - - extend { - updateCS.buffer("vb", vb.shaderStorageBufferView()) - updateCS.buffer("particles", particleSSBO) - updateCS.parameter("windowSize", drawer.bounds.dimensions) - updateCS.execute(particleCount / updateCS.workGroupSize.x) - - drawer.fill = ColorRGBa.WHITE - drawer.shadeStyle = shadeStyle { - // The color of every triangle's pixel is interpolated using - // its three vertex colors - fragmentTransform = "x_fill = va_color;" - } - drawer.vertexBuffer(vb, DrawPrimitive.TRIANGLES) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle09.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle09.kt deleted file mode 100644 index 680b39b3..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle09.kt +++ /dev/null @@ -1,80 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.computeStyle -import org.openrndr.draw.execute -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.dodecahedronMesh -import org.openrndr.math.IntVector3 -import org.openrndr.math.Vector3 - -/** - * This program demonstrates - * - How to use a compute shader to deform a 3D shape (a vertex buffer). - * We create a dodecahedron vertex buffer and displace its vertices - * along their normals, exploding the object into 12 pieces with - * 3 triangles each (3 triangles to form a pentagon). - * - * Use the mouse for panning, rotating and zooming. - * - * Output: vertexBuffer -> TRIANGLES - */ - -fun main() = application { - program { - val vb = dodecahedronMesh(2.0) - - //vb.saveOBJ("/tmp/dodecahedron.obj") // study with Blender3D - - println(vb.vertexFormat.toString().replace("), ", "),\n ").replace("[", "[\n ").replace("]", "\n]")) - println("Vertex count: ${vb.vertexCount}") - - // Create Compute Shaders - val updateCS = computeStyle { - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - - b_vb.vertex[id].position += b_vb.vertex[id].normal * 0.01; - """.trimIndent() - workGroupSize = IntVector3(64, 1, 1) - } - - // Debugging: print the mesh data - val shadow = vb.shadow - shadow.download() - val reader = shadow.reader() - reader.rewind() - repeat(vb.vertexCount) { - println(it) - // Notice how we read Vector4's instead of Vector3 or Vector2 - // because the data has been padded to align 16-byte boundaries. - val pos = reader.readVector4() - val nrm = reader.readVector4() - val uv = reader.readVector4() - println(" pos: ${pos.xyz}") - println(" nrm: ${nrm.xyz}") - println(" uv: ${uv.xy}") - } - - val cam = Orbital() - cam.eye = Vector3.UNIT_Z * 5.0 - - extend(cam) - extend { - updateCS.buffer("vb", vb.shaderStorageBufferView()) - // We use a width of 2 because we have 108 vertices and the - // workgroup size is 64. 2 x 64 = 128, which is greater than 108 and - // therefore processes all the vertices. - updateCS.execute(2) - - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.WHITE - drawer.shadeStyle = shadeStyle { - fragmentTransform = "x_fill.rgb = va_normal.xyz * 0.5 + 0.5;" - } - drawer.vertexBuffer(vb, DrawPrimitive.TRIANGLES) - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle10.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle10.kt deleted file mode 100644 index 1ed52971..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle10.kt +++ /dev/null @@ -1,88 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.computeStyle -import org.openrndr.draw.execute -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.color.presets.WHEAT -import org.openrndr.extra.meshgenerators.dodecahedronMesh -import org.openrndr.math.IntVector3 -import org.openrndr.math.Vector3 - -/** - * This program is a variation of compute09.kt. It draws `vb` - * multiple times, each with a unique translation and rotation. - * - * For each item drawn, the instance number is sent to the shade style - * as a float uniform (named `p_i`) to shade them with unique hues. - * The interpolated normal varying is used to set the color, and - * this color rotated using `p_i` as the rotation angle. - * - * Use the mouse for panning, rotating and zooming. - * - * Output: vertexBuffer -> TRIANGLES - */ - -fun main() = application { - program { - val vb = dodecahedronMesh(2.0) - - // Create Compute Shaders - val updateCS = computeStyle { - computeTransform = """ - // The id of the element being currently processed - uint id = gl_GlobalInvocationID.x; - - b_vb.vertex[id].position += b_vb.vertex[id].normal * 0.01; - """.trimIndent() - workGroupSize = IntVector3(64, 1, 1) - } - - val cam = Orbital() - cam.eye = Vector3.UNIT_Z * 5.0 - - val style = shadeStyle { - // From https://github.com/dmnsgn/glsl-rotate - fragmentPreamble = """ - mat4 rotation3d(vec3 axis, float angle) { - axis = normalize(axis); - float s = sin(angle); - float c = cos(angle); - float oc = 1.0 - c; - - return mat4( - oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, - 0.0, 0.0, 0.0, 1.0 - ); - } - - vec3 rotate(vec3 v, vec3 axis, float angle) { - return (rotation3d(axis, angle) * vec4(v, 1.0)).xyz; - } - """.trimIndent() - fragmentTransform = """ - x_fill.rgb = rotate(va_normal.xyz * 0.5 + 0.5, - normalize(vec3(1.0)), p_i); - """.trimIndent() - } - - extend(cam) - extend { - updateCS.buffer("vb", vb.shaderStorageBufferView()) - updateCS.execute(2) - - drawer.clear(ColorRGBa.WHEAT.shade(0.2)) - drawer.fill = ColorRGBa.WHITE - drawer.shadeStyle = style - repeat(10) { - style.parameter("i", it * 0.3) - drawer.translate(1.0, 0.0, 0.0) - drawer.rotate(Vector3.UNIT_Z, 5.0) - drawer.vertexBuffer(vb, DrawPrimitive.TRIANGLES) - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoComputeStyle20.kt b/openrndr-demos/src/demo/kotlin/DemoComputeStyle20.kt deleted file mode 100644 index 9839bf6c..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoComputeStyle20.kt +++ /dev/null @@ -1,61 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.IntVector3 -import kotlin.math.sin - -/** - * Use a compute shader to read from a colorBuffer - * and write into a different colorBuffer. - * - * The input colorBuffer is updated on every animation frame - * with a scaling circle. - * - * Then the compute shader is executed to update every pixel - * in the output colorBuffer by reading a displaced pixel - * from the input colorBuffer. - * - * Output: 2D Image - */ -fun main() { - application { - program { - val input = renderTarget(width, height) { - colorBuffer(type = ColorType.FLOAT32) - } - val output = input.colorBuffer(0).createEquivalent() - - val cs = computeStyle { - computeTransform = """ - ivec2 id = ivec2(gl_GlobalInvocationID.xy); - ivec2 src = ivec2(id + sin(id) * p_m); - vec4 c = imageLoad(p_inputImage, src); - imageStore(p_outputImage, id, c); - """.trimIndent() - workGroupSize = IntVector3(16, 16, 1) - } - - cs.image("inputImage", input.colorBuffer(0).imageBinding(0, ImageAccess.READ)) - cs.image("outputImage", output.imageBinding(0, ImageAccess.WRITE)) - - extend { - // Update input - drawer.isolatedWithTarget(input) { - clear(ColorRGBa.TRANSPARENT) - circle(bounds.center, 100.0 + 80 * sin(seconds)) - } - - // Apply the compute shader to update output - cs.parameter("m", sin(seconds * 0.8) * 13.0 + 15.0) - cs.execute( - output.width / cs.workGroupSize.x, - output.height / cs.workGroupSize.y, - 1 - ) - - // Draw result - drawer.image(output) - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoContour01.kt b/openrndr-demos/src/demo/kotlin/DemoContour01.kt deleted file mode 100644 index 45693f2a..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContour01.kt +++ /dev/null @@ -1,19 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.shape.Circle - -/** - * a simple demo that tests heavy stroke weights on tiny geometry - * - * This was made to assist in resolving https://github.com/openrndr/openrndr/issues/164 - */ -fun main() = application { - program { - val c = Circle(200.0, 200.0, 10.0).contour - extend { - drawer.strokeWeight = mouse.position.y - drawer.stroke = ColorRGBa.PINK - drawer.contour(c) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoContour02.kt b/openrndr-demos/src/demo/kotlin/DemoContour02.kt deleted file mode 100644 index 7ca4113b..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContour02.kt +++ /dev/null @@ -1,41 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.LineJoin -import org.openrndr.math.Vector2 -import org.openrndr.shape.ShapeContour -import org.openrndr.shape.contour - -/** - * a simple demo that tests line joins - * - * This was made to assist in resolving https://github.com/openrndr/openrndr/issues/162 - */ - -fun arc(start: Vector2, end: Vector2, radius: Double): ShapeContour { - return contour { - moveTo(start) - arcTo(radius, radius, 0.0, false, false, end) - } -} - -fun main() = application { - configure { - width = 800 - height = 800 - } - program { - val center = Vector2(width / 2.0, height / 2.0) - val extra = Vector2(75.0, 75.0) - - extend { - drawer.clear(ColorRGBa.PINK) - - drawer.lineJoin = LineJoin.BEVEL - - drawer.strokeWeight = 40.0 - drawer.contour(arc(center - extra, center - extra - extra, 75.0)) - drawer.contour(arc(center, center + extra, 75.0 / 2.0)) - drawer.contour(arc(center + extra + extra, center + extra, 75.0 / 2.0)) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoContour03.kt b/openrndr-demos/src/demo/kotlin/DemoContour03.kt deleted file mode 100644 index c4f1292c..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContour03.kt +++ /dev/null @@ -1,42 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.isolated -import org.openrndr.shape.Circle -import org.openrndr.shape.Rectangle - -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val cs = Rectangle(0.0, 0.0, 200.0, 200.0).contour - val cc = Circle(100.0, 0.0, 100.0).contour - - extend { - drawer.fill = ColorRGBa.GRAY - drawer.stroke = ColorRGBa.PINK - drawer.isolated { - drawer.contour(cs) - drawer.translate(300.0, 0.0) - - // this should create a contour similar to the input contour - drawer.contour(cs.sampleEquidistant(4)) - drawer.contour(cs.sampleEquidistant(3)) - } - - drawer.isolated { - drawer.translate(.0, 400.0) - drawer.contour(cc) - drawer.translate(300.0, 0.0) - - drawer.contour(cc) - // this should draw a hexagon - drawer.contour(cc.sampleEquidistant(6)) - // this should draw a triangle - drawer.contour(cc.sampleEquidistant(3)) - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoContourIntersections01.kt b/openrndr-demos/src/demo/kotlin/DemoContourIntersections01.kt deleted file mode 100644 index ac98561f..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContourIntersections01.kt +++ /dev/null @@ -1,37 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.shape.Ellipse -//import org.openrndr.shape.OrientedEllipse -//import org.openrndr.shape.intersections -// -//fun main() { -// application { -// program { -// val c1 = Ellipse(width / 2.0, height / 2.0, 200.0, 100.0).contour -// extend { -// drawer.clear(ColorRGBa.PINK) -// drawer.fill = null -// val c2 = OrientedEllipse(mouse.position, 100.0, 200.0, seconds*45.0).contour -// drawer.contour(c1) -// //drawer.contour(c2) -// val ints = intersections(c1, c2) -// -// if (ints.isEmpty()) { -// drawer.contour(c2) -// } else { -// (ints + ints.take(1)).map { it.b.contourT }.zipWithNext().forEach { -// val end = if (it.second <= it.first) it.second + 1.0 else it.second -// val sub = c2.sub(it.first, end) -// val l = sub.length -// val ta = sub.tForLength(15.0) -// val tb = sub.tForLength(l - 15.0) -// drawer.contour(sub.sub(ta, tb)) -// } -// } -// for (i in ints) { -// drawer.circle(i.position, 10.0) -// } -// } -// } -// } -//} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoContourIntersections02.kt b/openrndr-demos/src/demo/kotlin/DemoContourIntersections02.kt deleted file mode 100644 index ce9bcacc..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContourIntersections02.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle -import org.openrndr.shape.Rectangle -import org.openrndr.shape.intersections - -fun main() = application { - program { - extend { - val circle = Circle(mouse.position, 200.0).contour - - drawer.fill = null - for (y in 50 until height step 100) { - for (x in 50 until width step 100) { - - for (ring in 0 until 10) { - val r = Rectangle.fromCenter( - Vector2(x * 1.0, y * 1.0), - 90.0 - ring * 8.0, - 90.0 - ring * 8.0 - ).contour - - val ints = intersections(circle, r) - if (ints.isEmpty()) { - drawer.stroke = ColorRGBa.GREEN - drawer.contour(r) - } else { - drawer.stroke = ColorRGBa.WHITE - ints.map { it.b.contourT }.let { it + it.take(1) }.zipWithNext().forEach { - val end = if (it.second <= it.first) it.second + 1.0 else it.second - val sub = r.sub(it.first, end) - val length = sub.length - val ta = sub.tForLength(2.0) - val tb = sub.tForLength(length - 2.0) - drawer.contour(sub.sub(ta, tb)) - } - } - } - } - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoContourIntersections03.kt b/openrndr-demos/src/demo/kotlin/DemoContourIntersections03.kt deleted file mode 100644 index 3ed66230..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContourIntersections03.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Vector2 -import org.openrndr.shape.ShapeContour -import org.openrndr.shape.intersections -import kotlin.math.PI -import kotlin.math.cos -import kotlin.math.sin - -fun main() = application { - program { - val points = 200 - extend { - val contour = ShapeContour.fromPoints( - List(points) { - val a = PI * 2 * it / points - val x = (200 + 50 * cos(a * 2)) * sin(a * 3 + sin(a)) - val y = 150 * cos(a * 2 + seconds * 0.2) - Vector2(x, y) - }, closed = true - ) - val ints = intersections(contour, contour) - drawer.run { - clear(ColorRGBa.WHITE) - translate(width * 0.5, height * 0.5) - fill = null - stroke = ColorRGBa.BLACK - contour(contour) - fill = ColorRGBa.PINK.opacify(0.3) - - circles(ints.map { it.position }, 10.0) - } - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoContourNearest01.kt b/openrndr-demos/src/demo/kotlin/DemoContourNearest01.kt deleted file mode 100644 index a18c3cbd..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoContourNearest01.kt +++ /dev/null @@ -1,54 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.noise.simplex -//import org.openrndr.shape.OrientedEllipse -// -//fun main() { -// application { -// program { -// extend { -// drawer.clear(ColorRGBa.BLACK) -// drawer.fill = null -// -// val offset = seconds * 0.1 -// val contours = listOf( -// OrientedEllipse( -// simplex(320, offset)*width/2.0 + width/2.0, -// simplex(3120, offset)*height/2.0 + height/2.0, -// simplex(3420, offset)*50.0 + 80.0, -// simplex(7521, offset)*50.0+ 80.0, -// simplex(3212, offset)*180.0+180.0 -// ).contour, -// OrientedEllipse( -// simplex(5320, offset)*width/2.0 + width/2.0, -// simplex(73120, offset)*height/2.0 + height/2.0, -// simplex(23420, offset)*50.0 + 80.0, -// simplex(47521, offset)*50.0+ 80.0, -// simplex(33212, offset)*180.0+180.0 -// ).contour -// ) -// drawer.fill = null -// drawer.stroke = ColorRGBa.PINK -// for (contour in contours) { -// drawer.contour(contour) -// } -// -// for (j in contours.indices) { -// for (i in 0 until j) { -// val eqj = contours[j].equidistantPositions(50) -// val eqi = contours[i].equidistantPositions(50) -// -// for (p in eqj) { -// val q = contours[i].nearest(p).position -// drawer.lineSegment(p, q) -// } -// for (p in eqi) { -// val q = contours[j].nearest(p).position -// drawer.lineSegment(p, q) -// } -// } -// } -// } -// } -// } -//} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt deleted file mode 100644 index dddef7b7..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt +++ /dev/null @@ -1,25 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Session -import org.openrndr.draw.loadCubemap -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.boxMesh - -fun main() = application { - program { - val cubemap = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) - val cube = boxMesh() - - extend(Orbital()) - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - x_fill = texture(p_cubemap, va_position); - """ - parameter("cubemap", cubemap) - } - drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt deleted file mode 100644 index 6850ceb4..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt +++ /dev/null @@ -1,31 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.boxMesh - -fun main() = application { - program { - val cubemap1 = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) - val cube = boxMesh() - val cubemap2 = cubemap( - cubemap1.width, - format = cubemap1.format, - type = cubemap1.type, - levels = 2, - session = Session.active - ) - cubemap1.copyTo(cubemap2, 0, 0) - cubemap2.generateMipmaps() - - extend(Orbital()) - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - x_fill = texture(p_cubemap, va_position); - """ - parameter("cubemap", cubemap2) - } - drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt deleted file mode 100644 index 040dd755..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.boxMesh - -fun main() = application { - program { - val cubemap1 = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) - val cube = boxMesh() - val cubemap2 = cubemap( - cubemap1.width, - format = cubemap1.format, - type = cubemap1.type, - levels = 2, - session = Session.active - ) - cubemap1.copyTo(cubemap2, 0, 0) - cubemap2.generateMipmaps() - - val cma = arrayCubemap(cubemap1.width, 10) - for (i in 0 until 1) { - cubemap1.copyTo(cma, 8) - } - - cma.generateMipmaps() - - extend(Orbital()) - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - x_fill = texture(p_cma, vec4(va_position, 8.0)); - """ - parameter("cubemap", cubemap2) - parameter("cma", cma) - } - drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoDDSImage01.kt b/openrndr-demos/src/demo/kotlin/DemoDDSImage01.kt deleted file mode 100644 index aa1e0bc4..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoDDSImage01.kt +++ /dev/null @@ -1,13 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.loadImage - -fun main() = application { - program { - val image = loadImage("demo-data/images/image-001.dds") - println(image.format) - println(image.type) - extend { - drawer.image(image) - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoGeometryShader01.kt b/openrndr-demos/src/demo/kotlin/DemoGeometryShader01.kt deleted file mode 100644 index 085bbf1a..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoGeometryShader01.kt +++ /dev/null @@ -1,30 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Shader -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.resourceText - -fun main() = application { - program { - val vb = boxMesh() - val shader = Shader.createFromCode( - vsCode = resourceText("/shaders/gs-01.vert"), - gsCode = resourceText("/shaders/gs-01.geom"), - fsCode = resourceText("/shaders/gs-01.frag"), - name = "x" - ) - extend(Orbital()) - extend { - drawer.clear(ColorRGBa.PINK) - shader.begin() - shader.uniform("offset", mouse.position.xy0) - shader.uniform("view", drawer.view) - shader.uniform("proj", drawer.projection) - shader.uniform("model", drawer.model) - driver.drawVertexBuffer(shader, listOf(vb), DrawPrimitive.TRIANGLES, 0, vb.vertexCount) - shader.end() - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore01.kt b/openrndr-demos/src/demo/kotlin/DemoImageLoadStore01.kt deleted file mode 100644 index 71b2ea50..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore01.kt +++ /dev/null @@ -1,48 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.meshgenerators.planeMesh -import org.openrndr.internal.Driver -import org.openrndr.math.Vector3 - -fun main() = application { - program { - val shader = Shader.createFromCode( - vsCode = - """${Driver.instance.shaderConfiguration(ShaderType.VERTEX)} -in vec3 a_position; -in vec2 a_texCoord0; -in vec3 a_normal; -uniform mat4 projMatrix; -uniform mat4 viewMatrix; - -void main() { - gl_Position = projMatrix * vec4(a_position, 1.0); -} - """, - fsCode = """${Driver.instance.shaderConfiguration(ShaderType.FRAGMENT)} -out vec4 o_color; -layout(rgba8) uniform writeonly image2D bla; -void main() { - imageStore(bla, ivec2(30,30), vec4(1.0, 0.0, 0.0, 1.0)); - o_color = vec4(1.0); -} - """, name = "ils" - ) - val cb = colorBuffer(128, 128, type = ColorType.UINT8) - val mesh = planeMesh(Vector3.ZERO, Vector3.UNIT_X, Vector3.UNIT_Y, -Vector3.UNIT_Z, 100.0, 100.0) - - extend { - drawer.clear(ColorRGBa.PINK) - shader.begin() - shader.image("bla", 0, cb.imageBinding(0, ImageAccess.READ_WRITE)) - shader.uniform("viewMatrix", drawer.view) - shader.uniform("projMatrix", drawer.projection) - - Driver.instance.drawVertexBuffer(shader, listOf(mesh), DrawPrimitive.TRIANGLES, 0, mesh.vertexCount) - shader.end() - drawer.clear(ColorRGBa.BLACK) - drawer.image(cb) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore02.kt b/openrndr-demos/src/demo/kotlin/DemoImageLoadStore02.kt deleted file mode 100644 index f7c798cf..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore02.kt +++ /dev/null @@ -1,24 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -fun main() = application { - program { - val cb = colorBuffer(128, 128, type = ColorType.UINT8) - cb.fill(ColorRGBa.BLACK) - val ss = shadeStyle { - fragmentTransform = """ - imageStore(p_image, ivec2(30, 30), vec4(1.0, 0.0, 0.0, 1.0)); - """.trimIndent() - - image("image", cb.imageBinding(0, ImageAccess.WRITE)) - } - extend { - drawer.shadeStyle = ss - drawer.clear(ColorRGBa.PINK) - drawer.rectangle(0.0, 0.0, 100.0, 100.0) - drawer.shadeStyle = null - drawer.image(cb, 0.0, 200.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore03.kt b/openrndr-demos/src/demo/kotlin/DemoImageLoadStore03.kt deleted file mode 100644 index d87f95ed..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoImageLoadStore03.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.rgb -import org.openrndr.draw.* - -fun main() = application { - program { - val cb = colorBuffer(128, 128, type = ColorType.UINT8) - val at = arrayTexture(128, 128, 32, type = ColorType.UINT8) - val vt = volumeTexture(32, 32, 32, type = ColorType.UINT8) - extend { - val ss = shadeStyle { - fragmentTransform = """ - imageStore(p_image, ivec2(30.0, 30.0), vec4(1.0, 0.0, 0.0, 1.0)); - imageStore(p_vt, ivec3(2, 2, 2), vec4(1.0, 0.0, 0.0, 1.0)); - imageStore(p_at, ivec3(2, 2, 2), vec4(1.0, 0.0, 0.0, 1.0)); - """.trimIndent() - - image("at", at.imageBinding(0, ImageAccess.READ_WRITE)) - image("image", cb.imageBinding(0, ImageAccess.READ_WRITE)) - image("vt", vt.imageBinding(0, ImageAccess.READ_WRITE)) - } - drawer.shadeStyle = ss - drawer.clear(rgb(0.1)) - drawer.fill = rgb(0.2) - drawer.rectangle(0.0, 0.0, 100.0, 100.0) - drawer.image(cb, 0.0, 200.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoLineCapJoin.kt b/openrndr-demos/src/demo/kotlin/DemoLineCapJoin.kt deleted file mode 100644 index b3d89527..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoLineCapJoin.kt +++ /dev/null @@ -1,52 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.LineCap -import org.openrndr.draw.LineJoin -import org.openrndr.draw.isolated -import org.openrndr.draw.loadFont -import org.openrndr.math.IntVector2 -import org.openrndr.math.Vector2 -import org.openrndr.shape.Triangle - -/** - * Test all combinations of line cap and line join by drawing - * a 3x3 grid of triangles and lines. - */ - -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0) - val pointA = Vector2(0.0, 50.0) - val pointB = Vector2(50.0, -20.0) - val pointC = Vector2(-50.0, 0.0) - val triangle = Triangle(pointA, pointB, pointC).contour - - extend { - drawer.apply { - fill = ColorRGBa.GRAY - stroke = ColorRGBa.PINK - strokeWeight = 8.0 - fontMap = font - LineCap.entries.forEachIndexed { x, cap -> - lineCap = cap - LineJoin.entries.forEachIndexed { y, join -> - lineJoin = join - val pos = IntVector2(x - 1, y - 1).vector2 * 180.0 - isolated { - translate(bounds.position(0.46, 0.46) + pos) - text("cap: ${cap.name}", -30.5, 80.5) - text("join: ${join.name}", -30.5, 100.5) - contour(triangle) - lineSegment(pointA - pointC, pointB - pointC) - } - } - } - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoLineDash01.kt b/openrndr-demos/src/demo/kotlin/DemoLineDash01.kt deleted file mode 100644 index 6bfd56c0..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoLineDash01.kt +++ /dev/null @@ -1,33 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.shadeStyle -import org.openrndr.math.Polar -import org.openrndr.shape.contour - -fun main() = application { - program { - val style = shadeStyle { - //fragmentTransform = "x_stroke.a *= step(0.5, fract(c_contourPosition / p_dashLen));" - fragmentTransform = - "x_stroke.a *= smoothstep(0.0, 1.0, mod(c_contourPosition, p_dashLen)) * smoothstep(p_dashLen, p_dashLen-1.0, mod(c_contourPosition, p_dashLen));" - parameter("dashLen", 20.0) - } - extend { - drawer.run { - clear(ColorRGBa.WHITE) - stroke = ColorRGBa.BLACK.opacify(0.5) - val c = contour { - moveTo(100.0, 100.0) - continueTo(100.0, 300.0) - continueTo(bounds.center + Polar(seconds * 30, 100.0).cartesian) - continueTo(500.0, 100.0) - continueTo(600.0, 100.0) - } - shadeStyle = style - contour(c) - - drawer.lineSegment(0.0, 0.0, width * 1.0, height * 1.0) - } - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoMouseCursor01.kt b/openrndr-demos/src/demo/kotlin/DemoMouseCursor01.kt deleted file mode 100644 index 55973fe4..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoMouseCursor01.kt +++ /dev/null @@ -1,21 +0,0 @@ -//import org.openrndr.CursorType -//import org.openrndr.application -// -//fun main() { -// application { -// program { -// keyboard.character.listen { -// if (it.character == 'c') { -// mouse.cursorVisible = !mouse.cursorVisible -// } -// } -// extend { -// if (mouse.position.x < width/2.0) { -// mouse.cursorType = CursorType.ARROW_CURSOR -// } else { -// mouse.cursorType = CursorType.HAND_CURSOR -// } -// } -// } -// } -//} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoPointBatch01.kt b/openrndr-demos/src/demo/kotlin/DemoPointBatch01.kt deleted file mode 100644 index 3ad0e9a6..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoPointBatch01.kt +++ /dev/null @@ -1,22 +0,0 @@ -// Drawing points using a stored batch - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.pointBatch - -fun main() = application { - program { - val storedBatch = drawer.pointBatch { - for (y in 10 until height step 20) { - for (x in 10 until width step 20) { - fill = ColorRGBa.PINK.shade(Math.random()) - point(x * 1.0, y * 1.0) - } - } - } - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.points(storedBatch) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoScreenCapture01.kt b/openrndr-demos/src/demo/kotlin/DemoScreenCapture01.kt deleted file mode 100644 index 7cc6ba8e..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoScreenCapture01.kt +++ /dev/null @@ -1,42 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DepthTestPass -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.isolated -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.ffmpeg.VideoPlayerFFMPEG -import org.openrndr.math.Vector3 - -fun main() = application { - program { - val cube = boxMesh() - val screen = VideoPlayerFFMPEG.fromScreen( - frameRate = 15.0, - imageWidth = 300, - imageHeight = 300 - ) - - screen.play() - extend { - screen.draw(drawer, true) // update the screen grabber - drawer.isolated { - clear(ColorRGBa.WHITE) - perspective(60.0, width * 1.0 / height, 0.01, 1000.0) - depthWrite = true - depthTestPass = DepthTestPass.LESS_OR_EQUAL - shadeStyle = shadeStyle { - fragmentTransform = "x_fill = texture(p_tex, vec2(1.0-va_texCoord0.x, va_texCoord0.y));" - screen.colorBuffer?.run { - parameter("tex", this) - } - } - rotate(Vector3.UNIT_Z, 90.0) - translate(0.0, 0.0, -120.0) - rotate(Vector3.UNIT_X, seconds * 10) - scale(90.0) - vertexBuffer(cube, DrawPrimitive.TRIANGLES) - } - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoShaderStorageBuffer01.kt b/openrndr-demos/src/demo/kotlin/DemoShaderStorageBuffer01.kt deleted file mode 100644 index 085037d9..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoShaderStorageBuffer01.kt +++ /dev/null @@ -1,53 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.BufferPrimitiveType -import org.openrndr.draw.shadeStyle -import org.openrndr.draw.shaderStorageBuffer -import org.openrndr.draw.shaderStorageFormat -import java.nio.ByteBuffer -import java.nio.ByteOrder - -// A demo of shaderStorageBuffer doing no useful work - -fun main() = application { - program { - - // Construct a SSB - val ssb = shaderStorageBuffer(shaderStorageFormat { - primitive("foo", BufferPrimitiveType.FLOAT32, 1000) - }) - - // A ShadeStyle that reads from and writes into an SSB - val ss = shadeStyle { - buffer("someBuffer", ssb) - fragmentTransform = """ - float a = b_someBuffer.foo[0]; - b_someBuffer.foo[1] += 2.0; - """.trimIndent() - } - - // A ByteBuffer in RAM to download the GPU data into - val bb = ByteBuffer.allocateDirect(ssb.format.size) - bb.order(ByteOrder.nativeOrder()) - - extend { - // Clear the SSB - ssb.clear() - - drawer.shadeStyle = ss - drawer.circle(100.0, 100.0, 200.0) - - // Download the SSB into RAM - bb.rewind() - ssb.read(bb) - - bb.rewind() - val f0 = bb.float - val f1 = bb.float - println(f1) - // The shade style runs for every pix el in the circle. - // The order in which the pixels are processed is not known - // Therefore the value of `f1` can vary from frame to frame, - // because we don't know how many times `+= 2.0` was executed. - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DemoTessShader01.kt b/openrndr-demos/src/demo/kotlin/DemoTessShader01.kt deleted file mode 100644 index 8d07b9cc..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoTessShader01.kt +++ /dev/null @@ -1,50 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Shader -import org.openrndr.draw.vertexBuffer -import org.openrndr.draw.vertexFormat -import org.openrndr.math.Vector3 -import org.openrndr.resourceText - -fun main() = application { - program { - val vb = vertexBuffer(vertexFormat { - position(3) - }, 12) - val shader = Shader.Companion.createFromCode( - vsCode = resourceText("/shaders/ts-01.vert"), - tcsCode = resourceText("/shaders/ts-01.tesc"), - tesCode = resourceText("/shaders/ts-01.tese"), - fsCode = resourceText("/shaders/ts-01.frag"), - name = "x" - ) - - vb.put { - write(Vector3(0.0, 0.0, 0.0)) - write(Vector3(100.0, 0.0, 0.0)) - write(Vector3(140.0, 200.0, 0.0)) - write(Vector3(200.0, 300.0, 0.0)) - write(Vector3(0.0, 0.0, 0.0)) - write(Vector3(100.0, 0.0, 0.0)) - write(Vector3(140.0, 200.0, 0.0)) - write(Vector3(200.0, 400.0, 0.0)) - write(Vector3(0.0, 0.0, 0.0)) - write(Vector3(100.0, 0.0, 0.0)) - write(Vector3(140.0, 200.0, 0.0)) - write(Vector3(200.0, 500.0, 0.0)) - } - - extend { - drawer.clear(ColorRGBa.PINK) - shader.begin() - shader.uniform("offset", mouse.position.xy0) - shader.uniform("view", drawer.view) - shader.uniform("proj", drawer.projection) - shader.uniform("model", drawer.model) - driver.drawVertexBuffer(shader, listOf(vb), DrawPrimitive.PATCHES, 0, vb.vertexCount) - - shader.end() - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoTessShader02.kt b/openrndr-demos/src/demo/kotlin/DemoTessShader02.kt deleted file mode 100644 index b7af7a45..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoTessShader02.kt +++ /dev/null @@ -1,49 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Shader -import org.openrndr.draw.vertexBuffer -import org.openrndr.draw.vertexFormat -import org.openrndr.resourceText -import org.openrndr.shape.Ellipse - -fun main() = application { - program { - val ellipse = Ellipse(width / 2.0, height / 2.0, 100.0, 300.0).contour - - val vb = vertexBuffer(vertexFormat { - position(3) - }, ellipse.segments.size * 4) - - val shader = Shader.createFromCode( - vsCode = resourceText("/shaders/ts-02.vert"), - tcsCode = resourceText("/shaders/ts-02.tesc"), - tesCode = resourceText("/shaders/ts-02.tese"), - gsCode = resourceText("/shaders/ts-02.geom"), - fsCode = resourceText("/shaders/ts-02.frag"), - name = "x" - ) - - vb.put { - for (segment in ellipse.segments) { - val cubic = segment.cubic - write(cubic.start.xy0) - write(cubic.control[0].xy0) - write(cubic.control[1].xy0) - write(cubic.end.xy0) - } - } - - extend { - drawer.clear(ColorRGBa.PINK) - shader.begin() - shader.uniform("offset", mouse.position.xy0) - shader.uniform("view", drawer.view) - shader.uniform("proj", drawer.projection) - shader.uniform("model", drawer.model) - shader.uniform("resolution", ((mouse.position.x / width) * 63 + 1).toInt()) - driver.drawVertexBuffer(shader, listOf(vb), DrawPrimitive.PATCHES, 0, vb.vertexCount) - shader.end() - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoTessShader03.kt b/openrndr-demos/src/demo/kotlin/DemoTessShader03.kt deleted file mode 100644 index 035efa7e..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoTessShader03.kt +++ /dev/null @@ -1,55 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Shader -import org.openrndr.draw.vertexBuffer -import org.openrndr.draw.vertexFormat -import org.openrndr.resourceText -import org.openrndr.shape.Ellipse - -fun main() = application { - program { - - val ellipse = Ellipse(width / 2.0, height / 2.0, 100.0, 200.0).contour - - val vb = vertexBuffer(vertexFormat { - position(3) - }, ellipse.segments.size * 4) - - val shader = Shader.createFromCode( - vsCode = resourceText("/shaders/ts-03.vert"), - tcsCode = resourceText("/shaders/ts-03.tesc"), - tesCode = resourceText("/shaders/ts-03.tese"), - gsCode = resourceText("/shaders/ts-03.geom"), - fsCode = resourceText("/shaders/ts-03.frag"), - name = "x" - ) - - vb.put { - for (segment in ellipse.segments) { - val cubic = segment.cubic - write(cubic.start.xy0) - write(cubic.control[0].xy0) - write(cubic.control[1].xy0) - write(cubic.end.xy0) - } - } - - extend { - drawer.clear(ColorRGBa.PINK) - drawer.translate(width / 2.0, height / 2.0, 0.0) - drawer.rotate(seconds * 45.0) - drawer.translate(-width / 2.0, -height / 2.0, 0.0) - - shader.begin() - shader.uniform("offset", mouse.position.xy0) - shader.uniform("view", drawer.view) - shader.uniform("proj", drawer.projection) - shader.uniform("model", drawer.model) - shader.uniform("resolution", ((mouse.position.x / width) * 63 + 1).toInt()) - shader.uniform("weight", ((mouse.position.y / height) * 128 + 1)) - driver.drawVertexBuffer(shader, listOf(vb), DrawPrimitive.PATCHES, 0, vb.vertexCount) - shader.end() - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoTessShader04.kt b/openrndr-demos/src/demo/kotlin/DemoTessShader04.kt deleted file mode 100644 index aefd0ce3..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoTessShader04.kt +++ /dev/null @@ -1,67 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.extra.noise.uniformRing -import org.openrndr.extra.shaderphrases.preprocessedFromUrls -import org.openrndr.math.Vector3 -import org.openrndr.resourceUrl -import org.openrndr.shape.path3D -import kotlin.math.cos - -fun main() = application { - program { - extend(Orbital()) - - val path = path3D { - moveTo(Vector3.ZERO) - for (i in 0 until 100) { - continueTo(anchor + Vector3.uniformRing(0.0, 10.0), anchor + Vector3.uniformRing(0.0, 10.0)) - } - } - val vb = vertexBuffer(vertexFormat { - position(3) - }, path.segments.size * 4) - - val shader = Shader.preprocessedFromUrls( - vsUrl = resourceUrl("/shaders/ts-04.vert"), - tcsUrl = resourceUrl("/shaders/ts-04.tesc"), - tesUrl = resourceUrl("/shaders/ts-04.tese"), - gsUrl = resourceUrl("/shaders/ts-04.geom"), - fsUrl = resourceUrl("/shaders/ts-04.frag") - ) - - val mesh = sphereMesh() - extend { - val vc = vb.put { - for (segment in path.sub(0.0, cos(seconds * 0.1) * 0.5 + 0.5).segments) { - val cubic = segment.cubic - write(cubic.start) - write(cubic.control[0]) - write(cubic.control[1]) - write(cubic.end) - } - } - drawer.clear(ColorRGBa.PINK) - drawer.depthTestPass = DepthTestPass.LESS_OR_EQUAL - drawer.depthWrite = true - drawer.vertexBuffer(mesh, DrawPrimitive.TRIANGLES) - - shader.begin() - shader.uniform("offset", mouse.position.xy0) - shader.uniform("view", drawer.view) - shader.uniform("proj", drawer.projection) - shader.uniform("model", drawer.model) - shader.uniform("resolution", 32) - shader.uniform("weight", 3.0 + cos(seconds)) - shader.uniform("time", seconds * 0.0) - drawer.depthWrite = false - - driver.setState(drawer.drawStyle) - driver.drawVertexBuffer(shader, listOf(vb), DrawPrimitive.PATCHES, 0, vc) - shader.end() - drawer.fill = ColorRGBa.WHITE - } - } -} diff --git a/openrndr-demos/src/demo/kotlin/DemoVolumeTexture01.kt b/openrndr-demos/src/demo/kotlin/DemoVolumeTexture01.kt deleted file mode 100644 index 80acb087..00000000 --- a/openrndr-demos/src/demo/kotlin/DemoVolumeTexture01.kt +++ /dev/null @@ -1,22 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -fun main() = application { - program { - val volumeTexture = VolumeTexture.create(128, 128, 32, type = ColorType.UINT8) - val rt = renderTarget(128, 128) { - volumeTexture(volumeTexture, 0) - } - - val cb = colorBuffer(128, 128) - extend { - drawer.isolatedWithTarget(rt) { - drawer.ortho(rt) - drawer.clear(ColorRGBa.PINK) - } - volumeTexture.copyTo(cb, 0) - drawer.image(cb) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DrawerNegativeDimensions.kt b/openrndr-demos/src/demo/kotlin/DrawerNegativeDimensions.kt deleted file mode 100644 index 97cec56c..00000000 --- a/openrndr-demos/src/demo/kotlin/DrawerNegativeDimensions.kt +++ /dev/null @@ -1,42 +0,0 @@ -// Test negative widths & heights for drawing aligned rectangles. -// Also draw a circle with negative radius. -// All shapes should appear with a white 4-pixel border - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.shape.Rectangle - -fun main() = application { - program { - val margin = 5.0 - val squareSize = 100.0 - - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 4.0 - - // Top Left - drawer.rectangle(margin, margin, squareSize, squareSize) - // Top Right - drawer.rectangle(width - margin, margin, -squareSize, squareSize) - // Bottom Right - drawer.rectangle(width - margin, height - margin, -squareSize, -squareSize) - // Bottom Left - drawer.rectangle(margin, height - margin, squareSize, -squareSize) - - // Circle with negative radius - drawer.circle(drawer.bounds.center, -squareSize * 2) - - // Rectangles with the bottom right corner centered in the window - drawer.rectangles(List(10) { - Rectangle( - drawer.bounds.center, - -squareSize * 2 + it * 10, - -squareSize * 2 + it * 10 - ) - }) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch01.kt b/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch01.kt deleted file mode 100644 index b9f69e09..00000000 --- a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch01.kt +++ /dev/null @@ -1,16 +0,0 @@ -// A single rectangle - -import org.openrndr.application -import org.openrndr.color.ColorRGBa - -fun main() = application { - program { - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - drawer.rectangle(100.0, 100.0, 50.0, 50.0) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch02.kt b/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch02.kt deleted file mode 100644 index 6bea140a..00000000 --- a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch02.kt +++ /dev/null @@ -1,29 +0,0 @@ -// Stored rectangle batches -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.rectangleBatch - -fun main() = application { - program { - val batch = drawer.rectangleBatch { - fill = ColorRGBa.PINK - stroke = ColorRGBa.WHITE - for (i in 0 until 1000) { - strokeWeight = Math.random() * 5.0 + 1.0 - val rwidth = Math.random() * 40.0 + 4.0 - val rheight = Math.random() * 40.0 + 4.0 - val x = Math.random() * width - val y = Math.random() * height - rectangle(x, y, rwidth, rheight, Math.random() * 360.0) - } - } - - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - drawer.rectangles(batch) - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch03.kt b/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch03.kt deleted file mode 100644 index 11819dc6..00000000 --- a/openrndr-demos/src/demo/kotlin/DrawerRectangleBatch03.kt +++ /dev/null @@ -1,22 +0,0 @@ -// Dynamic rectangle batches - -import org.openrndr.application -import org.openrndr.color.ColorRGBa - -fun main() = application { - program { - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.strokeWeight = 2.0 - drawer.rectangles { - for (y in 0 until height / 20) { - for (x in 0 until width / 20) { - rectangle(x * 20.0, y * 20.0, 10.0, 15.0, (x + y) * 10.0 + seconds * 90.0) - } - } - } - } - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/gs-01.frag b/openrndr-demos/src/demo/resources/shaders/gs-01.frag deleted file mode 100644 index 2a60498a..00000000 --- a/openrndr-demos/src/demo/resources/shaders/gs-01.frag +++ /dev/null @@ -1,8 +0,0 @@ -#version 410 core - -out vec4 o_color; - - -void main() { - o_color = vec4(1.0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/gs-01.geom b/openrndr-demos/src/demo/resources/shaders/gs-01.geom deleted file mode 100644 index 422ee2e2..00000000 --- a/openrndr-demos/src/demo/resources/shaders/gs-01.geom +++ /dev/null @@ -1,26 +0,0 @@ -#version 410 core - -layout (triangles) in; -layout (triangle_strip, max_vertices = 3) out; - -in InVertex { - vec3 va_position; - vec3 va_normal; - vec4 v_addedProperty; -} vertices[]; - -out vec3 va_position; -out vec3 va_normal; -out vec4 v_addedProperty; - - -uniform vec3 offset; - -void main() { - int i; - for(i = 0;i < gl_in.length();i++) { - gl_Position = gl_in[i].gl_Position; - EmitVertex(); - } - EndPrimitive(); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/gs-01.vert b/openrndr-demos/src/demo/resources/shaders/gs-01.vert deleted file mode 100644 index 6a81c839..00000000 --- a/openrndr-demos/src/demo/resources/shaders/gs-01.vert +++ /dev/null @@ -1,22 +0,0 @@ -#version 410 core - -in vec3 a_position; -in vec3 a_normal; -in vec2 a_texCoord0; - -out InVertex { - vec3 va_position; - vec3 va_normal; - vec4 v_addedProperty; -} vertexOut; - -uniform mat4 view; -uniform mat4 proj; -uniform mat4 model; - -void main() { - vertexOut.v_addedProperty = vec4(1.0, 0.0, 0.0, 1.0); - vertexOut.va_position = a_position; - vertexOut.va_normal = a_normal; - gl_Position = proj * view * model * vec4(a_position, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-01.frag b/openrndr-demos/src/demo/resources/shaders/ts-01.frag deleted file mode 100644 index 660dc5e4..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-01.frag +++ /dev/null @@ -1,7 +0,0 @@ -#version 410 core - -out vec4 o_color; - -void main() { - o_color = vec4(1.0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-01.tesc b/openrndr-demos/src/demo/resources/shaders/ts-01.tesc deleted file mode 100644 index e9ca834d..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-01.tesc +++ /dev/null @@ -1,16 +0,0 @@ -#version 410 core - -layout(vertices = 4) out; // 4 points per patch - - - -in vec3 va_position[]; -out vec3 cva_position[]; - -void main() { - cva_position[gl_InvocationID] = va_position[gl_InvocationID]; - if(gl_InvocationID == 0) { // levels only need to be set once per patch - gl_TessLevelOuter[0] = 1; // we're only tessellating one line - gl_TessLevelOuter[1] = 4; // tessellate the line into 100 segments - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-01.tese b/openrndr-demos/src/demo/resources/shaders/ts-01.tese deleted file mode 100644 index bb107c62..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-01.tese +++ /dev/null @@ -1,34 +0,0 @@ - -#version 410 core - -vec3 bezier2(vec3 a, vec3 b, float t) { - return mix(a, b, t); -} -vec3 bezier3(vec3 a, vec3 b, vec3 c, float t) { - return mix(bezier2(a, b, t), bezier2(b, c, t), t); -} -vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) { - return mix(bezier3(a, b, c, t), bezier3(b, c, d, t), t); -} - -layout(isolines) in; -in vec3 cva_position[]; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; - -void main() { - float t = gl_TessCoord.x; - vec3 ePos = bezier4( - cva_position[0], - cva_position[1], - cva_position[2], - cva_position[3], - - - t); - - - gl_Position = proj * view * model * vec4(ePos, 1); -} diff --git a/openrndr-demos/src/demo/resources/shaders/ts-01.vert b/openrndr-demos/src/demo/resources/shaders/ts-01.vert deleted file mode 100644 index a5f37377..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-01.vert +++ /dev/null @@ -1,15 +0,0 @@ -#version 410 core - -in vec3 a_position; - - -out vec3 va_position; - -uniform mat4 view; -uniform mat4 proj; -uniform mat4 model; - -void main() { - va_position = a_position; - gl_Position = proj * view * model * vec4(a_position, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-02.frag b/openrndr-demos/src/demo/resources/shaders/ts-02.frag deleted file mode 100644 index 660dc5e4..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-02.frag +++ /dev/null @@ -1,7 +0,0 @@ -#version 410 core - -out vec4 o_color; - -void main() { - o_color = vec4(1.0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-02.geom b/openrndr-demos/src/demo/resources/shaders/ts-02.geom deleted file mode 100644 index 7c706234..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-02.geom +++ /dev/null @@ -1,21 +0,0 @@ -#version 410 core - -layout (lines) in; -layout (line_strip, max_vertices = 2) out; - - -out vec3 va_position; -out vec3 va_normal; -out vec4 v_addedProperty; - - -uniform vec3 offset; - -void main() { - int i; - for(i = 0;i < gl_in.length();i++) { - gl_Position = gl_in[i].gl_Position; - EmitVertex(); - } - EndPrimitive(); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-02.tesc b/openrndr-demos/src/demo/resources/shaders/ts-02.tesc deleted file mode 100644 index 0dd13870..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-02.tesc +++ /dev/null @@ -1,16 +0,0 @@ -#version 410 core - -layout(vertices = 4) out; // 4 points per patch - -uniform int resolution; - -in vec3 va_position[]; -out vec3 cva_position[]; - -void main() { - cva_position[gl_InvocationID] = va_position[gl_InvocationID]; - if(gl_InvocationID == 0) { // levels only need to be set once per patch - gl_TessLevelOuter[0] = 1; // we're only tessellating one line - gl_TessLevelOuter[1] = resolution; // tessellate the line into 100 segments - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-02.tese b/openrndr-demos/src/demo/resources/shaders/ts-02.tese deleted file mode 100644 index 04a7e26f..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-02.tese +++ /dev/null @@ -1,32 +0,0 @@ - -#version 410 core - -vec3 bezier2(vec3 a, vec3 b, float t) { - return mix(a, b, t); -} -vec3 bezier3(vec3 a, vec3 b, vec3 c, float t) { - return mix(bezier2(a, b, t), bezier2(b, c, t), t); -} -vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) { - return mix(bezier3(a, b, c, t), bezier3(b, c, d, t), t); -} - -layout(isolines) in; -in vec3 cva_position[]; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; - -void main() { - float t = gl_TessCoord.x; - vec3 ePos = bezier4( - cva_position[0], - cva_position[1], - cva_position[2], - cva_position[3], - t); - - - gl_Position = proj * view * model * vec4(ePos, 1); -} diff --git a/openrndr-demos/src/demo/resources/shaders/ts-02.vert b/openrndr-demos/src/demo/resources/shaders/ts-02.vert deleted file mode 100644 index a5f37377..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-02.vert +++ /dev/null @@ -1,15 +0,0 @@ -#version 410 core - -in vec3 a_position; - - -out vec3 va_position; - -uniform mat4 view; -uniform mat4 proj; -uniform mat4 model; - -void main() { - va_position = a_position; - gl_Position = proj * view * model * vec4(a_position, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-03.frag b/openrndr-demos/src/demo/resources/shaders/ts-03.frag deleted file mode 100644 index 5604a5ff..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-03.frag +++ /dev/null @@ -1,11 +0,0 @@ -#version 410 core - -out vec4 o_color; - -//in vec3 va_position; -//in vec3 va_normal; -//in vec4 v_addedProperty; - -void main() { - o_color = vec4(1.0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-03.geom b/openrndr-demos/src/demo/resources/shaders/ts-03.geom deleted file mode 100644 index 3e485133..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-03.geom +++ /dev/null @@ -1,50 +0,0 @@ -#version 410 core - -layout (lines) in; -layout (triangle_strip, max_vertices = 4) out; - -in InVertex { - vec3 va_position; - vec3 va_normal; - vec4 v_addedProperty; -} vertices[]; - -out vec3 va_position; -out vec3 va_normal; -out vec4 v_addedProperty; - - -uniform vec3 offset; -in vec3 derivative[]; -in vec3 position[]; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; -uniform float weight; - -void main() { - mat4 pvm = proj * view * model; - - vec2 direction0 = normalize(derivative[0].xy); - vec4 perp0 = vec4(direction0.y, -direction0.x, 0.0, 0.0); - - vec2 direction1 = normalize(derivative[1].xy); - vec4 perp1 = vec4(direction1.y, -direction1.x, 0.0, 0.0); - - // output a triangle strip encoded quad - - gl_Position = pvm * vec4( vec4(position[0],1.0) + perp0 * weight); - EmitVertex(); - - gl_Position = pvm * vec4( vec4(position[0],1.0) - perp0 * weight); - EmitVertex(); - - gl_Position = pvm * vec4( vec4(position[1],1.0) + perp1 * weight); - EmitVertex(); - - gl_Position = pvm * vec4( vec4(position[1],1.0) - perp1 * weight); - EmitVertex(); - - EndPrimitive(); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-03.tesc b/openrndr-demos/src/demo/resources/shaders/ts-03.tesc deleted file mode 100644 index 698180ce..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-03.tesc +++ /dev/null @@ -1,17 +0,0 @@ -#version 410 core - -layout(vertices = 4) out; // 4 points per patch - -uniform int resolution; - - -in vec3 va_position[]; -out vec3 cva_position[]; - -void main() { - cva_position[gl_InvocationID] = va_position[gl_InvocationID]; - if(gl_InvocationID == 0) { // levels only need to be set once per patch - gl_TessLevelOuter[0] = 1; // we're only tessellating one line - gl_TessLevelOuter[1] = resolution; // tessellate the line into 100 segments - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-03.tese b/openrndr-demos/src/demo/resources/shaders/ts-03.tese deleted file mode 100644 index 600844ff..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-03.tese +++ /dev/null @@ -1,48 +0,0 @@ -#version 410 core - -vec3 bezier2(vec3 a, vec3 b, float t) { - return mix(a, b, t); -} -vec3 bezier3(vec3 a, vec3 b, vec3 c, float t) { - return mix(bezier2(a, b, t), bezier2(b, c, t), t); -} -vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) { - return mix(bezier3(a, b, c, t), bezier3(b, c, d, t), t); -} - -struct Vertex { - vec3 va_position; - vec3 va_normal; - vec4 v_addedProperty; -}; - -layout(isolines) in; -in vec3 cva_position[]; - -out vec3 derivative; -out vec3 position; - -uniform int resolution; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; - -void main() { - float t = gl_TessCoord.x; - vec3 ePos = bezier4( - cva_position[0], - cva_position[1], - cva_position[2], - cva_position[3], - t); - - // calculate derivative using Hodograph - derivative = bezier3(cva_position[1] - cva_position[0], cva_position[2]-cva_position[1], cva_position[3]-cva_position[2], t); - - // output model space positions - position = ePos; - - float r = resolution + 1.0; - //gl_Position = proj * view * model * vec4(ePos, 1); -} diff --git a/openrndr-demos/src/demo/resources/shaders/ts-03.vert b/openrndr-demos/src/demo/resources/shaders/ts-03.vert deleted file mode 100644 index 44f14186..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-03.vert +++ /dev/null @@ -1,16 +0,0 @@ -#version 410 core - -in vec3 a_position; - - -out vec3 va_position; - -uniform mat4 view; -uniform mat4 proj; -uniform mat4 model; - -void main() { - va_position = a_position; - gl_Position = proj * view * model * vec4(a_position, 1.0); - -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-04.frag b/openrndr-demos/src/demo/resources/shaders/ts-04.frag deleted file mode 100644 index 5604a5ff..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-04.frag +++ /dev/null @@ -1,11 +0,0 @@ -#version 410 core - -out vec4 o_color; - -//in vec3 va_position; -//in vec3 va_normal; -//in vec4 v_addedProperty; - -void main() { - o_color = vec4(1.0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-04.geom b/openrndr-demos/src/demo/resources/shaders/ts-04.geom deleted file mode 100644 index 820f504f..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-04.geom +++ /dev/null @@ -1,77 +0,0 @@ -#version 410 core - -layout (lines) in; -layout (triangle_strip, max_vertices = 4) out; -// -//in InVertex { -// vec3 va_position; -// vec3 va_normal; -// vec4 v_addedProperty; -//} vertices[]; - -out vec3 va_position; -out vec3 va_normal; -out vec4 v_addedProperty; - -uniform vec3 offset; -in vec3 derivative[]; -in vec3 position[]; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; -uniform float weight; - - - - -void main() { - - mat4 pvm = proj * view * model; - - // vec2 direction0 = normalize(derivative[0].xy); - // vec4 perp0 = vec4(direction0.y, -direction0.x, 0.0, 0.0); - // - // vec2 direction1 = normalize(derivative[1].xy); - // vec4 perp1 = vec4(direction1.y, -direction1.x, 0.0, 0.0); - - vec4 p00 = (pvm * vec4(position[0], 1.0)); - //p00 /= p00.w; - vec4 p01 = (pvm * vec4(position[0] + derivative[0], 1.0)); - //p01 /= p01.w; - vec4 p10 = (pvm * vec4(position[1], 1.0)); - //p10 /= p10.w; - vec4 p11 = (pvm * vec4(position[1] + derivative[1], 1.0)); - //p11 /= p11.w; - - vec2 direction0 = normalize(p01.xy - p00.xy); - vec2 direction1 = normalize(p11.xy - p10.xy); - vec4 perp0 = vec4(direction0.y, -direction0.x, 0.0, 0.0); - vec4 perp1 = vec4(direction1.y, -direction1.x, 0.0, 0.0); - -// v_addedProperty = vertices[0].v_addedProperty; -// va_normal = vertices[0].va_normal; -// va_position = vertices[0].va_position; - gl_Position = pvm * vec4(vec4(position[0], 1.0)) + perp0 * weight * 0.01; - EmitVertex(); - -// v_addedProperty = vertices[0].v_addedProperty; -// va_normal = vertices[0].va_normal; -// va_position = vertices[0].va_position; - gl_Position = pvm * vec4(vec4(position[0], 1.0)) - perp0 * weight * 0.01; - EmitVertex(); - -// v_addedProperty = vertices[1].v_addedProperty; -// va_normal = vertices[1].va_normal; -// va_position = vertices[1].va_position; - gl_Position = pvm * vec4(vec4(position[1], 1.0)) + perp1 * weight * 0.01; - EmitVertex(); - -// v_addedProperty = vertices[1].v_addedProperty; -// va_normal = vertices[1].va_normal; -// va_position = vertices[1].va_position; - gl_Position = pvm * vec4(vec4(position[1], 1.0)) - perp1 * weight * 0.01; - EmitVertex(); - - EndPrimitive(); -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-04.tesc b/openrndr-demos/src/demo/resources/shaders/ts-04.tesc deleted file mode 100644 index 698180ce..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-04.tesc +++ /dev/null @@ -1,17 +0,0 @@ -#version 410 core - -layout(vertices = 4) out; // 4 points per patch - -uniform int resolution; - - -in vec3 va_position[]; -out vec3 cva_position[]; - -void main() { - cva_position[gl_InvocationID] = va_position[gl_InvocationID]; - if(gl_InvocationID == 0) { // levels only need to be set once per patch - gl_TessLevelOuter[0] = 1; // we're only tessellating one line - gl_TessLevelOuter[1] = resolution; // tessellate the line into 100 segments - } -} \ No newline at end of file diff --git a/openrndr-demos/src/demo/resources/shaders/ts-04.tese b/openrndr-demos/src/demo/resources/shaders/ts-04.tese deleted file mode 100644 index 600844ff..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-04.tese +++ /dev/null @@ -1,48 +0,0 @@ -#version 410 core - -vec3 bezier2(vec3 a, vec3 b, float t) { - return mix(a, b, t); -} -vec3 bezier3(vec3 a, vec3 b, vec3 c, float t) { - return mix(bezier2(a, b, t), bezier2(b, c, t), t); -} -vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) { - return mix(bezier3(a, b, c, t), bezier3(b, c, d, t), t); -} - -struct Vertex { - vec3 va_position; - vec3 va_normal; - vec4 v_addedProperty; -}; - -layout(isolines) in; -in vec3 cva_position[]; - -out vec3 derivative; -out vec3 position; - -uniform int resolution; - -uniform mat4 proj; -uniform mat4 view; -uniform mat4 model; - -void main() { - float t = gl_TessCoord.x; - vec3 ePos = bezier4( - cva_position[0], - cva_position[1], - cva_position[2], - cva_position[3], - t); - - // calculate derivative using Hodograph - derivative = bezier3(cva_position[1] - cva_position[0], cva_position[2]-cva_position[1], cva_position[3]-cva_position[2], t); - - // output model space positions - position = ePos; - - float r = resolution + 1.0; - //gl_Position = proj * view * model * vec4(ePos, 1); -} diff --git a/openrndr-demos/src/demo/resources/shaders/ts-04.vert b/openrndr-demos/src/demo/resources/shaders/ts-04.vert deleted file mode 100644 index 79a8af65..00000000 --- a/openrndr-demos/src/demo/resources/shaders/ts-04.vert +++ /dev/null @@ -1,16 +0,0 @@ -#version 410 core - -#pragma import org.openrndr.extra.noise.phrases.SimplexKt.phraseSimplex3; - -in vec3 a_position; -out vec3 va_position; - -uniform mat4 view; -uniform mat4 proj; -uniform mat4 model; - -uniform float time; - -void main() { - va_position = a_position; //4.0* vec3(simplex31(a_position + vec3(time, time, -time) ), 4.0*simplex31(a_position.zxy + vec3(-time, time, time)), 4.0*simplex31(a_position.yzx + vec3(time, -time, time))) ; -} \ No newline at end of file diff --git a/orx-camera/README.md b/orx-camera/README.md deleted file mode 100644 index 677cc39d..00000000 --- a/orx-camera/README.md +++ /dev/null @@ -1,160 +0,0 @@ -# orx-camera - -2D and 3D cameras controllable via mouse and keyboard. - -## Usage - -```kotlin -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.AxisHelper -import org.openrndr.extra.camera.GridHelper -import org.openrndr.extra.camera.OrbitalCamera -import org.openrndr.extra.camera.OrbitalControls -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 - -fun main() = application { - program { - val camera = OrbitalCamera( - Vector3.UNIT_Z * 90.0, Vector3.ZERO, 90.0, 0.1, 5000.0 - ) - val controls = OrbitalControls(camera, keySpeed = 10.0) - - val sphere = sphereMesh(radius = 25.0) - val cube = boxMesh(20.0, 20.0, 5.0, 5, 5, 2) - - extend(camera) - extend(AxisHelper()) // shows XYZ axes as RGB lines - extend(GridHelper(100)) // debug ground plane - extend(controls) // adds both mouse and keyboard bindings - extend { - drawer.vertexBuffer(sphere, DrawPrimitive.LINE_LOOP) - drawer.vertexBuffer(cube, DrawPrimitive.LINE_LOOP) - drawer.stroke = ColorRGBa.WHITE - drawer.fill = null - repeat(10) { - drawer.translate(0.0, 0.0, 10.0) - // 2D primitives are not optimized for 3D and can - // occlude each other - drawer.circle(0.0, 0.0, 50.0) - } - } - } -} -``` - -### Keybindings - -* `w` - move forwards (+z) -* `s` - move backwards (-z) -* `Left` or `a` - strafe left (-x) -* `Right` or `d` - strafe right (+x) -* `Up` or `e` - move up (+y) -* `Down` or `q` - move up (-y) -* `Page Up` - zoom in -* `Page Down` - zoom out - -## Demos -### DemoCamera2D01 - -#### Camera2D demo - -click and drag the mouse for panning, use the mouse wheel for zooming - -![DemoCamera2D01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoCamera2D01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCamera2D01.kt) - -### DemoCamera2D02 - -#### Camera2D demo with static elements - -An approach for having certain elements not affected by the camera. -See DemoCamera2DManual01.kt for a new and simpler approach - -![DemoCamera2D02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoCamera2D02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCamera2D02.kt) - -### DemoCamera2DManual01 - -Demonstrates how to use `Camera2DManual` to have -some elements affected by an interactive 2D camera combined with -other elements not affected by it. - -In this example both PINK circles can be dragged, scaled and rotated -while the white circle in the middle is static. - -![DemoCamera2DManual01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoCamera2DManual01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCamera2DManual01.kt) - -### DemoCamera2DManual02 - -Demonstrate the use of `Camera2DManual` to independently translate, scale and rotate one contour -in a collection. - -When the mouse is clicked, the active contour is transformed using the camera view matrix, -then the camera is reset to its default state and whatever shape is under the mouse becomes -the new active contour. - -As the mouse is dragged or its wheel scrolled, the camera is updated, affecting -how the active contour is rendered. - -![DemoCamera2DManual02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoCamera2DManual02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCamera2DManual02.kt) - -### DemoOrbital01 - -Demonstrate the use of `Orbital`, an interactive 3D camera -that can be controlled with a mouse and a keyboard. - -![DemoOrbital01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoOrbital01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoOrbital01.kt) - -### DemoOrbitalCamera01 - -Demonstrate the use of `OrbitalCamera`, `OrbitalControls`, `AxisHelper` and `GridHelper`. - -Press the `t` key to toggle camera interaction, or `r` to reset the camera to its defaults. - -![DemoOrbitalCamera01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoOrbitalCamera01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoOrbitalCamera01.kt) - -### DemoOrbitalManual01 - -Demonstrate the use of an orbital camera to render a sphere and a cube in 3D space as wireframe meshes, positioned -and rendered independently using the camera's isolated drawing state. A stationary pink circle is also drawn in the -center of the scene. - -Functionality: -- Initializes a sphere mesh and a cube mesh with predefined dimensions. -- Spawns an orbital camera, initially positioned away from the origin, to allow for focused rendering. -- Renders 3D wireframe shapes (sphere and cube) using the camera's isolated perspective. -- Draws a static 2D pink circle overlay at the window center. - -![DemoOrbitalManual01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoOrbitalManual01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoOrbitalManual01.kt) - -### DemoParametricOrbital01 - -Demonstrates the use of a `ParametricOrbital` camera. -This 3D camera can't be directly interacted with a mouse or a keyboard, -but only via a GUI (or via code). - -The GUI state is saved when closing the program and loaded -when running it again. - -The GUI also allows randomizing, loading and saving -its state to a file via the top buttons it displays. - -![DemoParametricOrbital01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-camera/images/DemoParametricOrbital01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoParametricOrbital01.kt) diff --git a/orx-camera/build.gradle.kts b/orx-camera/build.gradle.kts deleted file mode 100644 index 5578f0f9..00000000 --- a/orx-camera/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - jvm { - testRuns["test"].executionTask { - useJUnitPlatform { - } - } - } - - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-camera")) - implementation(project(":orx-mesh-generators")) - implementation(project(":orx-jvm:orx-gui")) - } - } - } -} diff --git a/orx-camera/src/commonMain/kotlin/AxisHelper.kt b/orx-camera/src/commonMain/kotlin/AxisHelper.kt deleted file mode 100644 index 982ab992..00000000 --- a/orx-camera/src/commonMain/kotlin/AxisHelper.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.Matrix33 -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 - - -@Suppress("unused") -class AxisHelper(var size: Int = 80) : Extension { - override var enabled: Boolean = true - - val fbo = renderTarget(size, size) { - colorBuffer() - depthBuffer() - } - val side = size.toDouble() - val axisLength = size / 2.0 - val planeLength = axisLength + 10.0 - - override fun afterDraw(drawer: Drawer, program: Program) { - draw(drawer) - } - - fun draw(drawer: Drawer) { - val viewMatrix = drawer.view - val x = drawer.width - (size + 5.0) - val y = 5.0 - - drawer.isolatedWithTarget(fbo) { - drawer.defaults() - drawer.ortho(fbo) - - drawer.clear(ColorRGBa.TRANSPARENT) - drawer.stroke = null - drawer.fill = ColorRGBa.PINK.opacify(0.7) - drawer.circle(axisLength, axisLength, axisLength) - - drawer.ortho(-planeLength, planeLength, -planeLength, planeLength, -planeLength, planeLength) - drawer.view = getRotation(viewMatrix) - drawer.strokeWeight = 0.6 - - drawer.fill = ColorRGBa.RED - drawer.stroke = ColorRGBa.RED - drawer.lineSegment(Vector3.ZERO, Vector3.UNIT_X * axisLength) - - drawer.fill = ColorRGBa.GREEN - drawer.stroke = ColorRGBa.GREEN - drawer.lineSegment(Vector3.ZERO, Vector3.UNIT_Y * axisLength) - - drawer.fill = ColorRGBa.BLUE - drawer.stroke = ColorRGBa.BLUE - drawer.lineSegment(Vector3.ZERO, Vector3.UNIT_Z * axisLength) - } - - drawer.isolated { - drawer.defaults() - - drawer.image(fbo.colorBuffer(0), x, y, side, side) - } - } -} - -internal fun getRotation(mat: Matrix44): Matrix44 { - val mat3 = mat.matrix33 // without translation - val c0 = mat3[0].length - val c1 = mat3[1].length - val c2 = mat3[2].length - - return Matrix33( - mat3.c0r0 / c0, mat3.c1r0 / c1, mat3.c2r0 / c2, - mat3.c0r1 / c0, mat3.c1r1 / c1, mat3.c2r1 / c2, - mat3.c0r2 / c0, mat3.c1r2 / c1, mat3.c2r2 / c2 - ).matrix44 -} \ No newline at end of file diff --git a/orx-camera/src/commonMain/kotlin/Camera2D.kt b/orx-camera/src/commonMain/kotlin/Camera2D.kt deleted file mode 100644 index 1c868fc1..00000000 --- a/orx-camera/src/commonMain/kotlin/Camera2D.kt +++ /dev/null @@ -1,234 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.KeyEvents -import org.openrndr.MouseButton -import org.openrndr.MouseEvents -import org.openrndr.Program -import org.openrndr.draw.Drawer -import org.openrndr.draw.RenderTarget -import org.openrndr.draw.isolated -import org.openrndr.events.Event -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.transforms.buildTransform -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.contract - -/** - * The [Camera2D] extension enables panning, rotating, and zooming the view - * with the mouse: - * - left click and drag to **pan** - * - right click and drag to **rotate** - * - use the mouse wheel to **zoom** in and out - * - * Usage: `extend(Camera2D())` - */ -class Camera2D : Extension, ChangeEvents { - override var enabled = true - - private lateinit var program: Program - private var controlInitialized = false - - /** - * Represents the 4x4 transformation matrix of the camera view in a 2D drawing environment. - * This matrix is used to apply custom transformations such as translation, rotation, - * or scaling to the viewport. By default, it is set to the identity matrix. - * - * When modified, the `dirty` flag is automatically set to `true` to indicate - * that the view matrix has been updated and subsequent transformations might - * need recalculation or application. - */ - var view = Matrix44.IDENTITY - set(value) { - field = value - dirty = true - } - - /** - * Represents the center of rotation for the camera in 2D space. - * - * Changes to this property will mark the camera's state as dirty, necessitating - * a re-calculation of the view transformation. - * - * Default value is [Vector2.ZERO]. - */ - var rotationCenter = Vector2.ZERO - set(value) { - field = value - dirty = true - } - - override val changed = Event() - - private var dirty = true - set(value) { - if (value && !field) { - changed.trigger(Unit) - program.window.requestDraw() - } - field = value - } - override val hasChanged: Boolean - get() = dirty - - - /** - * Executes the provided drawing function in an isolated scope, preserving the current - * drawing state and then restoring it after the function is executed. The `ortho` projection - * and custom view transformation are applied during the isolated drawing session. - * - * @param function the drawing function to be applied within the isolated scope of the `Drawer`. - */ - @OptIn(ExperimentalContracts::class) - fun isolated(function: Drawer.() -> Unit) { - contract { - callsInPlace(function, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - program.drawer.isolated { - program.drawer.ortho(RenderTarget.active) - - program.drawer.view = this@Camera2D.view - program.drawer.function() - } - } - - /** - * Reinitialize the camera to its default state, where no transformations - * (such as rotation, translation, or scaling) are applied. - */ - var defaults = { - view = Matrix44.IDENTITY - rotationCenter = Vector2.ZERO - } - - /** - * Applies a panning transformation to the camera view. The method modifies the current view - * by translating it based on the provided displacement vector, effectively shifting the - * camera's view in the scene. - * - * @param displacement the vector by which the camera view is translated. - */ - fun pan(displacement: Vector2) { - view = buildTransform { - translate(displacement) - } * view - } - - /** - * Rotates the camera view by a specified angle around its rotation center. - * - * @param angle the angle in degrees by which the view is rotated. - */ - fun rotate(angle: Double) { - view = buildTransform { - translate(rotationCenter) - rotate(angle) - translate(-rotationCenter) - } * view - } - - /** - * Applies a zoom transformation to the camera view. The transformation is centered - * around the specified point while adjusting the zoom level by the given factor. - * - * @param center The point in space around which the zoom transformation is centered. - * @param factor The zoom factor, where values greater than 1.0 zoom in and values less than 1.0 zoom out. - */ - fun zoom(center: Vector2, factor: Double) { - view = buildTransform { - translate(center) - scale(factor, factor, 1.0) - translate(-center) - } * view - } - - /** - * Sets up and applies mouse and keyboard controls for interacting with the camera. - * This variable provides event-driven logic to handle user input for panning, rotation, and zooming. - * - * - Mouse button interactions are used to configure the center of rotation and reset the view. - * - Mouse drag events control panning and rotation with the left and right mouse buttons respectively. - * - Mouse scrolling adjusts the zoom level based on the scroll direction and position. - * - * @param mouse an instance of `MouseEvents` providing data for mouse interactions, - * such as button presses, movement, and scrolling. - * @param keyboard an instance of `KeyEvents` providing the framework for handling keyboard inputs, - * though currently unused in this implementation. - */ - var controls = { mouse: MouseEvents, keyboard: KeyEvents -> - mouse.buttonDown.listen { - rotationCenter = it.position - if (it.button == MouseButton.CENTER) { - defaults() - } - } - mouse.dragged.listen { - if (!it.propagationCancelled) { - when (it.button) { - MouseButton.LEFT -> pan(it.dragDisplacement) - MouseButton.RIGHT -> rotate(it.dragDisplacement.x + it.dragDisplacement.y) - else -> Unit - } - } - } - mouse.scrolled.listen { - if (!it.propagationCancelled) { - val scaleFactor = 1.0 - it.rotation.y * 0.03 - zoom(it.position, scaleFactor) - } - } - Unit - } - - /** - * Configures the mouse interaction events for controlling the camera view and handling - * transformations such as translation, rotation, and scaling via mouse inputs. - * - * @param mouse the MouseEvents instance that provides mouse interaction data, including - * button presses, dragging, and scrolling events. - */ - fun setupControls(mouse: MouseEvents, keyboard: KeyEvents) { - if (!controlInitialized) { - controls(mouse, keyboard) - } - controlInitialized = true - } - - override fun setup(program: Program) { - this.program = program - if (!controlInitialized) { - setupControls(program.mouse, program.keyboard) - } - defaults() - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - drawer.pushTransforms() - drawer.ortho(RenderTarget.active) - drawer.view = view - } - - override fun afterDraw(drawer: Drawer, program: Program) { - dirty = false - drawer.popTransforms() - } -} - -/** - * Creates and sets up a custom-configured Camera2D instance within a Program. - * - * This function initializes a new Camera2D, applies the provided configuration block, - * and sets it up with the current Program context for interactive 2D transformations - * such as panning, rotating, and zooming. - * - * @param configure an optional configuration block where you can set up the Camera2D - * instance (e.g., setting view or rotation center). The default is an empty block. - * @return the configured Camera2D instance. - */ -fun Program.Camera2DManual(configure: Camera2D.() -> Unit = { }): Camera2D { - val camera = Camera2D() - camera.configure() - camera.setup(this) - return camera -} diff --git a/orx-camera/src/commonMain/kotlin/ChangeEvents.kt b/orx-camera/src/commonMain/kotlin/ChangeEvents.kt deleted file mode 100644 index 2f5962bf..00000000 --- a/orx-camera/src/commonMain/kotlin/ChangeEvents.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.events.Event - -interface ChangeEvents { - val changed : Event - val hasChanged: Boolean -} \ No newline at end of file diff --git a/orx-camera/src/commonMain/kotlin/GridHelper.kt b/orx-camera/src/commonMain/kotlin/GridHelper.kt deleted file mode 100644 index 754aacd5..00000000 --- a/orx-camera/src/commonMain/kotlin/GridHelper.kt +++ /dev/null @@ -1,56 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.Vector3 - -@Suppress("unused") -class GridHelper(val size: Int = 10, val divisions: Int = 10) : Extension { - override var enabled: Boolean = true - private val step = size / divisions.toDouble() - - private val grid = vertexBuffer( - vertexFormat { - position(3) - } - , 4 * (size * divisions + 1)).apply { - put { - val halfSize = size / 2.0 - var k = -halfSize - - for(i in 0 until divisions + 1) { - write(Vector3(-halfSize, 0.0, k)) - write(Vector3(halfSize, 0.0, k)) - - write(Vector3(k, 0.0, -halfSize)) - write(Vector3(k, 0.0, halfSize)) - - k += step - } - } - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - draw(drawer) - } - - fun draw(drawer: Drawer) { - drawer.isolated { - drawer.fill = ColorRGBa.WHITE - drawer.stroke = ColorRGBa.WHITE - drawer.vertexBuffer(grid, DrawPrimitive.LINES) - - // Axis cross - drawer.stroke = ColorRGBa.RED - drawer.lineSegment(Vector3.ZERO, Vector3(step, 0.0, 0.0)) - - drawer.stroke = ColorRGBa.GREEN - drawer.lineSegment(Vector3.ZERO, Vector3(0.0, step, 0.0)) - - drawer.stroke = ColorRGBa.BLUE - drawer.lineSegment(Vector3.ZERO, Vector3(0.0, 0.0, step)) - } - } -} \ No newline at end of file diff --git a/orx-camera/src/commonMain/kotlin/Orbital.kt b/orx-camera/src/commonMain/kotlin/Orbital.kt deleted file mode 100644 index 36b97f97..00000000 --- a/orx-camera/src/commonMain/kotlin/Orbital.kt +++ /dev/null @@ -1,67 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.draw.Drawer -import org.openrndr.events.Event -import org.openrndr.math.Vector3 -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -/** - * Extension that provides orbital camera view and controls. - */ -class Orbital : Extension, ChangeEvents { - override var enabled: Boolean = true - - override val changed = Event() - override val hasChanged: Boolean - get() { - return camera.hasChanged - } - - - var eye = Vector3.UNIT_Z * 10.0 - var lookAt = Vector3.ZERO - var near = 0.1 - var far = 1000.0 - var fov = 90.0 - var userInteraction = true - var keySpeed = 1.0 - var projectionType = ProjectionType.PERSPECTIVE - - /** - * Damping factor for camera motion, set to 0 for no damping - */ - var dampingFactor = 0.05 - - val camera by lazy { - OrbitalCamera(eye, lookAt, fov, near, far, projectionType).apply { - dampingFactor = this@Orbital.dampingFactor - this.changed.listen(this@Orbital.changed) - } - } - val controls by lazy { OrbitalControls(camera, userInteraction, keySpeed) } - - override fun setup(program: Program) { - camera.setup(program) - controls.setup(program) - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - camera.beforeDraw(drawer, program) - } - - override fun afterDraw(drawer: Drawer, program: Program) { - camera.afterDraw(drawer, program) - } - - @OptIn(ExperimentalContracts::class) - fun isolated(drawFunction: Drawer.() -> Unit) { - contract { - callsInPlace(drawFunction, InvocationKind.EXACTLY_ONCE) - } - camera.isolated(camera.program.drawer, drawFunction) - } -} \ No newline at end of file diff --git a/orx-camera/src/commonMain/kotlin/OrbitalCamera.kt b/orx-camera/src/commonMain/kotlin/OrbitalCamera.kt deleted file mode 100644 index 93e698a1..00000000 --- a/orx-camera/src/commonMain/kotlin/OrbitalCamera.kt +++ /dev/null @@ -1,459 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.draw.DepthTestPass -import org.openrndr.draw.Drawer -import org.openrndr.events.Event -import org.openrndr.math.Matrix44 -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.math.abs -import kotlin.math.max -import kotlin.math.pow -import org.openrndr.math.transforms.lookAt as lookAt_ - -enum class ProjectionType { - PERSPECTIVE, - ORTHOGONAL -} - - -class OrbitalCamera( - eye: Vector3 = Vector3.ZERO, - lookAt: Vector3 = Vector3.UNIT_Z, - var fov: Double = 90.0, - var near: Double = 0.1, - var far: Double = 1000.0, - var projectionType: ProjectionType = ProjectionType.PERSPECTIVE -) : Extension, ChangeEvents { - - internal lateinit var program: Program - override val changed = Event() - - override val hasChanged: Boolean - get() = dirty - - - // current position in spherical coordinates - var spherical = Spherical.fromVector(eye) - private set - var lookAt = lookAt - private set - - var depthTest = true - - var magnitude = 100.0 - var magnitudeEnd = magnitude - - private var sphericalEnd = Spherical.fromVector(eye) - private var lookAtEnd = lookAt - private var dirty: Boolean = true - set(value) { - if (value && !field) { - changed.trigger(Unit) - } - field = value - } - private var lastSeconds: Double = -1.0 - - var fovEnd = fov - - var dampingFactor = 0.05 - var zoomSpeed = 1.0 - - var orthoNear = -1000.0 - var orthoFar = 1000.0 - - // Defaults - val eyeDefault = eye.copy() - val lookAtDefault = lookAt.copy() - val fovDefault = fov - val magnitudeDefault = magnitude - - /** - * Reinitialize the camera to its initial state. - * - * @param instant whether the rotation is applied immediately; if false, it interpolates over time (default is false) - */ - fun defaults(instant: Boolean = false) { - panTo(lookAtDefault, instant) - rotateTo(eyeDefault, instant) - zoomTo(fovDefault, instant) - scaleTo(magnitudeDefault, instant) - } - - /** - * Sets the view for the orbital camera by updating the look-at position, spherical coordinates, - * and field of view (FOV). This method initializes both the target and current states of these properties. - * - * @param lookAt the target position the camera should look at, represented as a 3D vector - * @param spherical the spherical coordinates defining the camera's orientation - * @param fov the field of view (in degrees) for the camera - */ - fun setView(lookAt: Vector3, spherical: Spherical, fov: Double) { - this.lookAt = lookAt - this.lookAtEnd = lookAt - this.spherical = spherical - this.sphericalEnd = spherical - this.fov = fov - this.fovEnd = fov - } - - - /** - * Rotates the orbital camera by the specified angles in the horizontal and vertical directions. - * The rotation can be applied instantly or smoothly interpolated over time. - * - * @param degreesX the rotation angle in degrees around the horizontal axis (theta) - * @param degreesY the rotation angle in degrees around the vertical axis (phi) - * @param instant whether the rotation is applied immediately; if false, it interpolates over time (default is false) - */ - fun rotate(degreesX: Double, degreesY: Double, instant: Boolean = false) { - sphericalEnd += Spherical(degreesX, degreesY, 0.0) - sphericalEnd = sphericalEnd.makeSafe() - if (instant) { - spherical = sphericalEnd - } - dirty = true - } - - /** - * Rotates the camera to the specified spherical angles. The rotation can occur instantly or - * smoothly over time based on the `instant` parameter. - * - * @param degreesX the target horizontal rotation angle (theta) in degrees - * @param degreesY the target vertical rotation angle (phi) in degrees - * @param instant whether the rotation should be applied immediately (default is `false`) - */ - fun rotateTo(degreesX: Double, degreesY: Double, instant: Boolean = false) { - sphericalEnd = sphericalEnd.copy(theta = degreesX, phi = degreesY) - sphericalEnd = sphericalEnd.makeSafe() - - if (instant) { - spherical = sphericalEnd - } - dirty = true - } - - /** - * Rotates the orbital camera to the specified position defined by the `eye` vector. - * The rotation can either occur instantly or smoothly interpolated over time, - * depending on the `instant` parameter. - * - * @param eye the target position to rotate the camera to, represented as a 3D vector - * @param instant whether the rotation should be applied immediately (default is `false`) - */ - fun rotateTo(eye: Vector3, instant: Boolean = false) { - sphericalEnd = Spherical.fromVector(eye) - sphericalEnd = sphericalEnd.makeSafe() - if (instant) { - spherical = sphericalEnd - } - dirty = true - } - - /** - * Zooms the camera in by decreasing the distance to the target. The zoom is based on - * an exponential scale factor determined by the `zoomSpeed` field. If the `instant` - * parameter is set to `true`, the zoom effect is applied immediately; otherwise, it - * will interpolate the change over time. - * - * @param instant whether the zoom-in effect should occur instantly (default is `false`) - */ - fun dollyIn(instant: Boolean = false) { - val zoomScale = pow(0.95, zoomSpeed) - dolly(sphericalEnd.radius * zoomScale - sphericalEnd.radius, instant) - } - - /** - * Zooms the camera out by increasing the distance to the target. The zoom operation - * is based on an exponential scale factor determined by the `zoomSpeed` field. - * - * @param instant whether the zoom-out effect should occur instantly (default is `false`) - */ - fun dollyOut(instant: Boolean = false) { - val zoomScale = pow(0.95, zoomSpeed) - dolly(sphericalEnd.radius / zoomScale - sphericalEnd.radius, instant) - } - - /** - * Adjusts the camera's distance from the target by the specified amount. - * The change in distance is applied immediately if `instant` is set to `true`, - * otherwise it will be interpolated over time with smoothing. - * - * @param distance the amount to adjust the camera's distance by - * @param instant whether the adjustment should be applied immediately (default is `false`) - */ - fun dolly(distance: Double, instant: Boolean = false) { - sphericalEnd += Spherical(0.0, 0.0, distance) - if (instant) { - spherical = sphericalEnd - } - dirty = true - } - - fun pan(x: Double, y: Double, z: Double, instant: Boolean = false) { - val view = viewMatrix() - val xColumn = Vector3(view.c0r0, view.c1r0, view.c2r0) * x - val yColumn = Vector3(view.c0r1, view.c1r1, view.c2r1) * y - val zColumn = Vector3(view.c0r2, view.c1r2, view.c2r2) * z - lookAtEnd += xColumn + yColumn + zColumn - if (instant) { - lookAt = lookAtEnd - } - dirty = true - } - - - /** - * Smoothly pans the camera to a specified target position. If the `instant` parameter is set - * to `true`, the panning occurs immediately; otherwise, it will be interpolated over time. - * - * @param target the target position to pan the camera to, represented as a 3D vector - * @param instant whether the panning should occur instantly (default is `false`) - */ - fun panTo(target: Vector3, instant: Boolean = false) { - lookAtEnd = target - if (instant) { - lookAt = lookAtEnd - } - dirty = true - } - - /** - * Adjusts the camera's distance (radius) to the specified value. If the `instant` parameter - * is set to true, the distance change is applied immediately; otherwise, it will be interpolated - * over time during updates. - * - * @param distance the target distance (radius) that the camera should move to - * @param instant whether the distance adjustment should occur instantly (default is `false`) - */ - fun dollyTo(distance: Double, instant: Boolean = false) { - sphericalEnd = sphericalEnd.copy(radius = distance) - if (instant) { - spherical = sphericalEnd - } - dirty = true - } - - /** - * Adjusts the magnitude of the orbital camera by the specified scale factor. - * If the `instant` parameter is set to true, the adjustment is applied immediately; - * otherwise, it will be interpolated over time during updates. - * - * @param scale the amount by which to adjust the camera's magnitude - * @param instant whether the scale adjustment should be applied instantly (default is `false`) - */ - fun scale(scale: Double, instant: Boolean = false) { - magnitudeEnd += scale - if (instant) { - magnitude = magnitudeEnd - } - dirty = true - } - - /** - * Adjusts the camera's scaling factor to the specified value. The scaling can either - * be applied instantly or interpolated over time during updates. - * - * @param scale the target scaling factor for the camera - * @param instant whether the scaling should be applied instantly (default is `false`) - */ - - fun scaleTo(scale: Double, instant: Boolean = false) { - magnitudeEnd = scale - if (instant) { - magnitude = magnitudeEnd - } - dirty = true - } - - /** - * Adjusts the camera's field of view (FOV) by the specified number of degrees. The transition can either - * happen instantly or be interpolated over time during updates. - * - * @param degrees the number of degrees to adjust the field of view by - * @param instant whether the adjustment should occur instantly (default is `false`) - */ - fun zoom(degrees: Double, instant: Boolean = false) { - fovEnd += degrees - if (instant) { - fov = fovEnd - } - dirty = true - } - - /** - * Adjusts the camera's field of view (FOV) to the specified number of degrees. If the `instant` - * parameter is set to `true`, the FOV immediately transitions to the specified value; otherwise, - * it will be interpolated over time during updates. - * - * @param degrees the target field of view (in degrees) for the camera - * @param instant whether the transition to the target FOV should occur instantly (default is `false`) - */ - fun zoomTo(degrees: Double, instant: Boolean = false) { - fovEnd = degrees - if (instant) { - fov = fovEnd - } - dirty = true - } - - /** - * Updates the orbital camera state by iteratively applying updates to the camera's parameters - * based on a fixed time step. The method ensures smooth interpolation of the camera properties - * (e.g., position, orientation) over a specified time delta. - * - * @param timeDelta the time elapsed for which the camera state should be updated, in seconds - */ - fun update(timeDelta: Double) { - if (!dirty) return - dirty = false - - val stepSize = 1.0/60.0 - val steps = max(timeDelta/stepSize, 1.0).toInt() - for (step in 0 until steps) { - updateStep(stepSize) - } - } - - /** - * Updates the camera position, orientation, and view properties such as spherical coordinates, - * look-at point, field of view, and magnitude based on damping factors and time delta. - * - * @param timeDelta the time step used to update the interpolation of camera parameters - */ - fun updateStep(timeDelta: Double) { - - val dampingFactor = if (dampingFactor > 0.0) { - dampingFactor * timeDelta / 0.0060 - } else 1.0 - val sphericalDelta = sphericalEnd - spherical - val lookAtDelta = lookAtEnd - lookAt - val fovDelta = fovEnd - fov - val magnitudeDelta = magnitudeEnd - magnitude - if ( - abs(sphericalDelta.radius) > EPSILON || - abs(sphericalDelta.theta) > EPSILON || - abs(sphericalDelta.phi) > EPSILON || - abs(lookAtDelta.x) > EPSILON || - abs(lookAtDelta.y) > EPSILON || - abs(lookAtDelta.z) > EPSILON || - abs(fovDelta) > EPSILON - ) { - fov += (fovDelta * dampingFactor) - spherical += (sphericalDelta * dampingFactor) - spherical = spherical.makeSafe() - lookAt += (lookAtDelta * dampingFactor) - magnitude += (magnitudeDelta * dampingFactor) - dirty = true - } else { - magnitude = magnitudeEnd - spherical = sphericalEnd.copy() - lookAt = lookAtEnd.copy() - fov = fovEnd - } - spherical = spherical.makeSafe() - } - - /** - * Computes and returns the view matrix for the orbital camera. The view matrix is - * calculated using the current spherical coordinates, look-at position, and the up vector (Vector3.UNIT_Y). - * - * @return a 4x4 matrix representing the current view transformation of the camera - */ - fun viewMatrix(): Matrix44 { - return lookAt_(Vector3.fromSpherical(spherical) + lookAt, lookAt, Vector3.UNIT_Y) - } - - companion object { - private const val EPSILON = 0.000001 - } - - // EXTENSION - override var enabled: Boolean = true - - override fun setup(program: Program) { - this.program = program - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - drawer.pushTransforms() - applyTo(drawer) - } - - override fun afterDraw(drawer: Drawer, program: Program) { - drawer.popTransforms() - } - - /** - * Enables the perspective camera. Use this faster method instead of .isolated() - * if you don't need to revert back to the orthographic projection. - */ - fun OrbitalCamera.applyTo(drawer: Drawer) { - - if (lastSeconds == -1.0) lastSeconds = program.seconds - - val delta = program.seconds - lastSeconds - lastSeconds = program.seconds - - update(delta) - - if (projectionType == ProjectionType.PERSPECTIVE) { - drawer.perspective(fov, drawer.width.toDouble() / drawer.height, near, far) - } else { - val ar = drawer.width * 1.0 / drawer.height - drawer.ortho(-ar * magnitude, ar * magnitude, -1.0 * magnitude, 1.0 * magnitude, orthoNear, orthoFar) - } - drawer.view = viewMatrix() - - if (depthTest) { - drawer.drawStyle.depthWrite = true - drawer.drawStyle.depthTestPass = DepthTestPass.LESS_OR_EQUAL - } - } - -} - -/** - * Temporarily enables this camera, calls function to draw using - * that camera, then disables it by popping the last matrix changes. - * It makes it easy to combine perspective and orthographic projections - * in the same program. - * @param function the function that is called in the isolation - */ -@OptIn(ExperimentalContracts::class) -fun OrbitalCamera.isolated(drawer: Drawer, function: Drawer.() -> Unit) { - contract { - callsInPlace(function, InvocationKind.EXACTLY_ONCE) - } - drawer.pushTransforms() - drawer.pushStyle() - try { - applyTo(drawer) - function(drawer) - } finally { - drawer.popStyle() - drawer.popTransforms() - } -} - - -private fun pow(a: Double, x: Double): Double = a.pow(x) - - -/** - * Creates an instance of the Orbital extension, sets it up with the calling Program, - * and returns the configured instance. - * - * @return a configured Orbital instance ready for use with the calling Program. - */ -fun Program.OrbitalManual(): Orbital { - val orbital = Orbital() - orbital.setup(this) - return orbital -} \ No newline at end of file diff --git a/orx-camera/src/commonMain/kotlin/OrbitalControls.kt b/orx-camera/src/commonMain/kotlin/OrbitalControls.kt deleted file mode 100644 index 51d77755..00000000 --- a/orx-camera/src/commonMain/kotlin/OrbitalControls.kt +++ /dev/null @@ -1,151 +0,0 @@ -package org.openrndr.extra.camera - -import org.openrndr.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.asRadians -import kotlin.math.abs -import kotlin.math.tan - -class OrbitalControls( - val orbitalCamera: OrbitalCamera, - var userInteraction: Boolean = true, - val keySpeed: Double = 1.0 -) : Extension { - enum class STATE { - NONE, - ROTATE, - PAN, - } - - private var state = STATE.NONE - var fov = orbitalCamera.fov - - private lateinit var program: Program - private lateinit var lastMousePosition: Vector2 - - private fun mouseScrolled(event: MouseEvent) { - if (userInteraction && !event.propagationCancelled) { - - if (orbitalCamera.projectionType == ProjectionType.PERSPECTIVE) { - if (abs(event.rotation.x) > 0.1) return - when { - event.rotation.y > 0 -> orbitalCamera.dollyIn() - event.rotation.y < 0 -> orbitalCamera.dollyOut() - } - } else { - if (abs(event.rotation.x) > 0.1) return - when { - event.rotation.y > 0 -> orbitalCamera.scale(1.0) - event.rotation.y < 0 -> orbitalCamera.scale(-1.0) - } - } - } - } - - private fun mouseMoved(event: MouseEvent) { - - if (userInteraction && !event.propagationCancelled) { - if (state == STATE.NONE) return - val delta = lastMousePosition - event.position - lastMousePosition = event.position - - if (state == STATE.PAN) { - - val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt - - // half of the fov is center to top of screen - val targetDistance = offset.length * tan(fov.asRadians / 2) - val panX = (2 * delta.x * targetDistance / program.width) - val panY = (2 * delta.y * targetDistance / program.height) - - orbitalCamera.pan(panX, -panY, 0.0) - - } else { - val rotX = 360.0 * delta.x / program.width - val rotY = 360.0 * delta.y / program.height - orbitalCamera.rotate(rotX, rotY) - } - } - } - - private fun mouseButtonDown(event: MouseEvent) { - if (userInteraction && !event.propagationCancelled) { - val previousState = state - - when (event.button) { - MouseButton.LEFT -> { - state = STATE.ROTATE - } - MouseButton.RIGHT -> { - state = STATE.PAN - } - MouseButton.CENTER -> { - } - MouseButton.NONE -> { - } - } - - if (previousState == STATE.NONE) { - lastMousePosition = event.position - } - } - } - - fun keyPressed(keyEvent: KeyEvent) { - if (userInteraction && !keyEvent.propagationCancelled) { - if (keyEvent.key == KEY_ARROW_RIGHT) { - orbitalCamera.pan(keySpeed, 0.0, 0.0) - } - if (keyEvent.key == KEY_ARROW_LEFT) { - orbitalCamera.pan(-keySpeed, 0.0, 0.0) - } - if (keyEvent.key == KEY_ARROW_UP) { - orbitalCamera.pan(0.0, keySpeed, 0.0) - } - if (keyEvent.key == KEY_ARROW_DOWN) { - orbitalCamera.pan(0.0, -keySpeed, 0.0) - } - - if (keyEvent.name == "q") { - orbitalCamera.pan(0.0, -keySpeed, 0.0) - } - if (keyEvent.name == "e") { - orbitalCamera.pan(0.0, keySpeed, 0.0) - } - if (keyEvent.name == "w") { - orbitalCamera.pan(0.0, 0.0, -keySpeed) - } - if (keyEvent.name == "s") { - orbitalCamera.pan(0.0, 0.0, keySpeed) - } - if (keyEvent.name == "a") { - orbitalCamera.pan(-keySpeed, 0.0, 0.0) - } - if (keyEvent.name == "d") { - orbitalCamera.pan(keySpeed, 0.0, 0.0) - } - - if (keyEvent.key == KEY_PAGE_UP) { - orbitalCamera.zoom(keySpeed) - } - if (keyEvent.key == KEY_PAGE_DOWN) { - orbitalCamera.zoom(-keySpeed) - } - } - } - - // EXTENSION - override var enabled: Boolean = true - - override fun setup(program: Program) { - this.program = program - - program.mouse.moved.listen { mouseMoved(it) } - program.mouse.buttonDown.listen { mouseButtonDown(it) } - program.mouse.buttonUp.listen { state = STATE.NONE } - program.mouse.scrolled.listen { mouseScrolled(it) } - program.keyboard.keyDown.listen { keyPressed(it) } - program.keyboard.keyRepeat.listen { keyPressed(it) } - } -} diff --git a/orx-camera/src/commonMain/kotlin/ParametricOrbital.kt b/orx-camera/src/commonMain/kotlin/ParametricOrbital.kt deleted file mode 100644 index 92f78797..00000000 --- a/orx-camera/src/commonMain/kotlin/ParametricOrbital.kt +++ /dev/null @@ -1,106 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.camera - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.draw.Drawer -import org.openrndr.events.Event -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.Vector3Parameter -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 - -/** - * Extension that provides orbital camera through annotated parameters - */ -@Description("Orbital camera") -class ParametricOrbital : Extension, ChangeEvents { - override var enabled: Boolean = true - - override val changed = Event() - override val hasChanged: Boolean - get() = dirty - private var dirty = true - set(value) { - if (value && !field) { - changed.trigger(Unit) - } - field = value - } - @DoubleParameter("fov", 1.0, 90.0, order = 0) - var fov = 45.0 - set(value) { - if (field != value) { - dirty = true - } - field = value - camera.zoomTo(fov) - } - - val camera by lazy { - OrbitalCamera(Spherical(theta, phi, radius).cartesian, center, fov, 0.1, 1000.0, projectionType).apply { - dampingFactor = 0.0 - } - } - - @DoubleParameter("phi", 0.0, 180.0, order = 2) - var phi = 0.0 - set(value) { - if (field != value) { - dirty = true - } - field = value - camera.rotateTo(theta, phi.coerceAtLeast(1E-3)) - } - - @DoubleParameter("theta", -180.0, 180.0, order = 1) - var theta = 0.0 - set(value) { - if (field != value) { - dirty = true - } - field = value - camera.rotateTo(theta, phi.coerceAtLeast(1E-3)) - } - - - @DoubleParameter("orbit radius", 0.1, 100.0, order = 3) - var radius = 10.0 - set(value) { - if (field != value) { - dirty = true - } - field = value - camera.dollyTo(radius) - } - - - @Vector3Parameter("center", order = 4) - var center = Vector3.ZERO - set(value) { - if (field != value) { - dirty = true - } - field = value - camera.panTo(value) - } - - - var projectionType = ProjectionType.PERSPECTIVE - - - override fun setup(program: Program) { - camera.setup(program) - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - camera.beforeDraw(drawer, program) - } - - override fun afterDraw(drawer: Drawer, program: Program) { - dirty = false - camera.afterDraw(drawer, program) - } -} \ No newline at end of file diff --git a/orx-camera/src/jvmDemo/kotlin/DemoCamera2D01.kt b/orx-camera/src/jvmDemo/kotlin/DemoCamera2D01.kt deleted file mode 100644 index 84ee2b56..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoCamera2D01.kt +++ /dev/null @@ -1,25 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.camera.Camera2D - -/** - * #### Camera2D demo - * - * click and drag the mouse for panning, use the mouse wheel for zooming - */ -fun main() = application { - program { - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 72.0) - - extend(Camera2D()) - extend { - drawer.circle(drawer.bounds.center, 300.0) - - drawer.fontMap = font - drawer.fill = ColorRGBa.PINK - drawer.text("click and drag mouse", 50.0, 400.0) - drawer.text("use mouse wheel", 50.0, 500.0) - } - } -} \ No newline at end of file diff --git a/orx-camera/src/jvmDemo/kotlin/DemoCamera2D02.kt b/orx-camera/src/jvmDemo/kotlin/DemoCamera2D02.kt deleted file mode 100644 index 223d0c60..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoCamera2D02.kt +++ /dev/null @@ -1,64 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.loadFont -import org.openrndr.draw.renderTarget -import org.openrndr.extra.camera.Camera2D -import org.openrndr.math.Vector2 -import org.openrndr.math.transforms.transform -import org.openrndr.shape.Rectangle -import kotlin.math.sin - -/** - * #### Camera2D demo with static elements - * - * An approach for having certain elements not affected by the camera. - * See DemoCamera2DManual01.kt for a new and simpler approach - */ -fun main() = application { - program { - // Create a renderTarget where to draw things. It will be controlled by the camera. - val rt = renderTarget(width, height) { - colorBuffer() - depthBuffer() - } - // Create a camera and apply an initial transformation - // so the origin is no longer in the top-left corner. - val cam = Camera2D() - cam.view *= transform { - translate(width * 0.5, height * 1.0) - rotate(45.0) - scale(2.0) - } - - // Add mouse listeners to the camera - cam.setup(this) - - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 50.0) - - extend { - // Draw onto the renderTarget - drawer.isolatedWithTarget(rt) { - // Calling ortho required if the size differs from the window size - ortho(rt) - // Apply the current camera transformation - view = cam.view - // Clear render target - clear(ColorRGBa.TRANSPARENT) - // Draw the things affected by the camera (here a rectangle at the origin) - rectangle(Rectangle.fromCenter(Vector2.ZERO, 200.0, 100.0 + sin(seconds) * 20.0)) - } - - drawer.clear(ColorRGBa.PINK) - - // Draw the renderTarget with the camera applied to it - drawer.image(rt.colorBuffer(0)) - - // Draw things not affected by the camera - drawer.fontMap = font - drawer.fill = ColorRGBa.PINK.shade(0.5) - drawer.text("click and drag mouse", 50.0, 400.0) - drawer.text("use mouse wheel", 50.0, 450.0) - } - } -} diff --git a/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual01.kt b/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual01.kt deleted file mode 100644 index 9081c6b9..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual01.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Camera2DManual - -/** - * Demonstrates how to use `Camera2DManual` to have - * some elements affected by an interactive 2D camera combined with - * other elements not affected by it. - * - * In this example both PINK circles can be dragged, scaled and rotated - * while the white circle in the middle is static. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val camera = Camera2DManual() - extend { - camera.isolated { - drawer.fill = ColorRGBa.PINK - drawer.circle(drawer.bounds.center, 300.0) - } - - drawer.circle(drawer.bounds.center, 200.0) - - camera.isolated { - drawer.fill = ColorRGBa.PINK - drawer.circle(drawer.bounds.center, 100.0) - } - } - } -} diff --git a/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual02.kt b/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual02.kt deleted file mode 100644 index ba2b464b..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoCamera2DManual02.kt +++ /dev/null @@ -1,70 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Camera2DManual -import org.openrndr.extra.noise.shapes.uniform -import org.openrndr.extra.noise.uniform -import org.openrndr.math.Vector2 -import org.openrndr.math.transforms.transform -import org.openrndr.shape.Rectangle -import org.openrndr.shape.contains - -/** - * Demonstrate the use of `Camera2DManual` to independently translate, scale and rotate one contour - * in a collection. - * - * When the mouse is clicked, the active contour is transformed using the camera view matrix, - * then the camera is reset to its default state and whatever shape is under the mouse becomes - * the new active contour. - * - * As the mouse is dragged or its wheel scrolled, the camera is updated, affecting - * how the active contour is rendered. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val camera = Camera2DManual() - // Create a mutable list of rectangular contours with random transformations - // applied to them. This is the initial state for the contours. - val contours = MutableList(16) { - Rectangle.fromCenter(Vector2.ZERO, 85.0).contour.transform( - transform { - translate(drawer.bounds.uniform()) - scale(Double.uniform(0.5, 2.0)) - rotate(Double.uniform(0.0, 360.0)) - } - ) - } - - var activeContour = -1 - extend { - // Draw all contours. The active contour is drawn in pink and - // affected by the camera's transformations. - contours.forEachIndexed { i, c -> - if (i == activeContour) { - camera.isolated { - drawer.fill = ColorRGBa.PINK - drawer.contour(c) - } - } else { - drawer.fill = ColorRGBa.GRAY - drawer.contour(c) - } - } - } - mouse.buttonDown.listen { - // Apply the camera view matrix to the active contour - if (activeContour >= 0) contours[activeContour] = contours[activeContour].transform(camera.view) - - // Reset the camera to its default state - camera.defaults() - camera.rotationCenter = it.position - - // Make the contour under the mouse the active contour - activeContour = contours.indexOfLast { mouse.position in it } - } - } -} diff --git a/orx-camera/src/jvmDemo/kotlin/DemoOrbital01.kt b/orx-camera/src/jvmDemo/kotlin/DemoOrbital01.kt deleted file mode 100644 index f4c86dd6..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoOrbital01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.extra.meshgenerators.sphereMesh - -/** - * Demonstrate the use of `Orbital`, an interactive 3D camera - * that can be controlled with a mouse and a keyboard. - */ -fun main() = application { - configure { - width = 720 - height = 720 - multisample = WindowMultisample.SampleCount(8) - } - program { - val sphere = sphereMesh(radius = 25.0) - val cube = boxMesh(20.0, 20.0, 5.0, 5, 5, 2) - - extend(Orbital()) - - extend { - drawer.vertexBuffer(sphere, DrawPrimitive.LINE_LOOP) - drawer.vertexBuffer(cube, DrawPrimitive.LINE_LOOP) - drawer.fill = null - drawer.stroke = ColorRGBa.GREEN - - repeat(10) { - drawer.translate(0.0, 0.0, 10.0) - // Note: 2D primitives are not optimized for 3D and can - // occlude each other - drawer.circle(0.0, 0.0, 50.0) - } - } - } -} \ No newline at end of file diff --git a/orx-camera/src/jvmDemo/kotlin/DemoOrbitalCamera01.kt b/orx-camera/src/jvmDemo/kotlin/DemoOrbitalCamera01.kt deleted file mode 100644 index d2a82b29..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoOrbitalCamera01.kt +++ /dev/null @@ -1,69 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.AxisHelper -import org.openrndr.extra.camera.GridHelper -import org.openrndr.extra.camera.OrbitalCamera -import org.openrndr.extra.camera.OrbitalControls -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 - -/** - * Demonstrate the use of `OrbitalCamera`, `OrbitalControls`, `AxisHelper` and `GridHelper`. - * - * Press the `t` key to toggle camera interaction, or `r` to reset the camera to its defaults. - */ -fun main() = application { - configure { - width = 720 - height = 720 - multisample = WindowMultisample.SampleCount(8) - } - program { - val camera = OrbitalCamera( - Vector3.UNIT_Z * 90.0, Vector3.ZERO, 90.0, 0.1, 5000.0 - ) - val controls = OrbitalControls(camera, keySpeed = 10.0) - controls.userInteraction = false - - val sphere = sphereMesh(radius = 25.0) - val cube = boxMesh(20.0, 20.0, 5.0, 5, 5, 2) - - extend(camera) - - // shows XYZ axes as RGB lines - extend(AxisHelper()) - - // debug ground plane - extend(GridHelper(100)) - - // adds mouse and keyboard bindings - extend(controls) - - extend { - drawer.vertexBuffer(sphere, DrawPrimitive.LINE_LOOP) - drawer.vertexBuffer(cube, DrawPrimitive.LINE_LOOP) - - drawer.stroke = if(controls.userInteraction) ColorRGBa.GREEN else ColorRGBa.WHITE - drawer.fill = null - - repeat(10) { - drawer.translate(0.0, 0.0, 10.0) - // Note: 2D primitives are not optimized for 3D and can - // occlude each other - drawer.circle(0.0, 0.0, 50.0) - } - } - keyboard.keyDown.listen { - if (it.name == "r") { - camera.defaults() - } - if (it.name == "t") { - // mouse and keyboard input can be toggled on and off - controls.userInteraction = !controls.userInteraction - } - } - } -} \ No newline at end of file diff --git a/orx-camera/src/jvmDemo/kotlin/DemoOrbitalManual01.kt b/orx-camera/src/jvmDemo/kotlin/DemoOrbitalManual01.kt deleted file mode 100644 index a4444d86..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoOrbitalManual01.kt +++ /dev/null @@ -1,49 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.OrbitalManual -import org.openrndr.extra.meshgenerators.boxMesh -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 - -/** - * Demonstrate the use of an orbital camera to render a sphere and a cube in 3D space as wireframe meshes, positioned - * and rendered independently using the camera's isolated drawing state. A stationary pink circle is also drawn in the - * center of the scene. - * - * Functionality: - * - Initializes a sphere mesh and a cube mesh with predefined dimensions. - * - Spawns an orbital camera, initially positioned away from the origin, to allow for focused rendering. - * - Renders 3D wireframe shapes (sphere and cube) using the camera's isolated perspective. - * - Draws a static 2D pink circle overlay at the window center. - */ -fun main() = application { - configure { - width = 720 - height = 720 - multisample = WindowMultisample.SampleCount(8) - } - - program { - val sphere = sphereMesh(radius = 25.0) - val cube = boxMesh(20.0, 20.0, 5.0, 5, 5, 2) - - val camera = OrbitalManual() - camera.camera.rotateTo(Vector3(0.0, 0.0, 30.0), instant = true) - extend { - camera.isolated { - drawer.fill = ColorRGBa.WHITE - drawer.vertexBuffer(sphere, DrawPrimitive.LINE_LOOP) - } - - drawer.fill = ColorRGBa.PINK - drawer.circle(drawer.bounds.center, 250.0) - - camera.isolated { - drawer.fill = ColorRGBa.WHITE - drawer.vertexBuffer(cube, DrawPrimitive.LINE_LOOP) - } - } - } -} \ No newline at end of file diff --git a/orx-camera/src/jvmDemo/kotlin/DemoParametricOrbital01.kt b/orx-camera/src/jvmDemo/kotlin/DemoParametricOrbital01.kt deleted file mode 100644 index 590a87a2..00000000 --- a/orx-camera/src/jvmDemo/kotlin/DemoParametricOrbital01.kt +++ /dev/null @@ -1,46 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.* -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.addTo -import org.openrndr.extra.meshgenerators.boxMesh - -/** - * Demonstrates the use of a `ParametricOrbital` camera. - * This 3D camera can't be directly interacted with a mouse or a keyboard, - * but only via a GUI (or via code). - * - * The GUI state is saved when closing the program and loaded - * when running it again. - * - * The GUI also allows randomizing, loading and saving - * its state to a file via the top buttons it displays. - */ -fun main() = application { - configure { - multisample = WindowMultisample.SampleCount(8) - } - - program { - val gui = GUI() - val po = ParametricOrbital() - po.addTo(gui) - extend(gui) - extend(po) - - val bm = boxMesh() - extend { - drawer.clear(ColorRGBa.PINK) - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - vec3 n = normalize(v_viewNormal) * 0.5 + 0.5; - x_fill = vec4(n, 1.0); - """.trimIndent() - } - drawer.vertexBuffer(bm, DrawPrimitive.TRIANGLES) - } - } -} diff --git a/orx-color/README.md b/orx-color/README.md deleted file mode 100644 index fb279e1d..00000000 --- a/orx-color/README.md +++ /dev/null @@ -1,421 +0,0 @@ -# orx-color - -Color spaces, palettes, histograms, named colors. - -## Color presets - -orx-color adds an extensive list of preset colors to `ColorRGBa`. Check [sources](src/commonMain/kotlin/presets/Colors.kt) for a listing of the preset colors. - -## Color histograms - -orx-color comes with tools to calculate color histograms for images. - -```kotlin -val histogram = calculateHistogramRGB(image) -val colors = histogram.sortedColors() -``` - -## Color sequences - -Easy ways of creating blends between colors. - -Using the `rangeTo` operator: -```kotlin -for (c in ColorRGBa.PINK..ColorRGBa.BLUE.toHSVa() blend 10) { - drawer.fill = c - drawer.rectangle(0.0, 0.0, 40.0, 40.0) - drawer.translate(0.0, 40.0) -} -``` - -Or blends for multiple color stops using `colorSequence`. Blending takes place in the colorspace of the input arguments. -```kotlin -val cs = colorSequence(0.0 to ColorRGBa.PINK, - 0.5 to ColorRGBa.BLUE, - 1.0 to ColorRGBa.PINK.toHSLUVa()) // <-- note this one is in hsluv - -for (c in cs blend (width / 40)) { - drawer.fill = c - drawer.stroke = null - drawer.rectangle(0.0, 0.0, 40.0, height.toDouble()) - drawer.translate(40.0, 0.0) -} -``` - - - -## HSLUVa and HPLUVa colorspaces - -Two color spaces are added: `ColorHSLUVa` and `ColorHPLUVa`, they are an implementation of the colorspaces presented at [hsluv.org](http://www.hsluv.org) - -## Demos -### colormap/DemoSpectralZucconiColormap - -This program demonstrates the `spectralZucconi6()` function, which -takes a normalized value and returns a `ColorRGBa` using the -accurate spectral colormap developed by Alan Zucconi. - -It draws a varying number of vertical bands (between 16 and 48) -filled with various hues. - -![colormap-DemoSpectralZucconiColormapKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoSpectralZucconiColormapKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormap.kt) - -### colormap/DemoSpectralZucconiColormapPhrase - -This program demonstrates how to use the shader-based version of -the `spectral_zucconi6()` function, which -takes a normalized value and returns an `rgb` color using the -accurate spectral colormap developed by Alan Zucconi. - -It shades a full-window rectangle using its normalized `x` coordinate -in a `ShadeStyle` to choose pixel colors. - -![colormap-DemoSpectralZucconiColormapPhraseKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoSpectralZucconiColormapPhraseKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPhrase.kt) - -### colormap/DemoSpectralZucconiColormapPlot - -This demo uses the shader based `spectral_zucconi6()` function to fill the background, -then visualizes the red, green and blue components of the colors used in the background -as red, green and blue line strips. - -The Vector2 points for the line strips are calculated only once when the program starts. - -![colormap-DemoSpectralZucconiColormapPlotKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoSpectralZucconiColormapPlotKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPlot.kt) - -### colormap/DemoTurboColormap - -This program demonstrates the `turboColormap()` function, which -takes a normalized value and returns a `ColorRGBa` using the -Turbo colormap developed by Google. - -It draws a varying number of vertical bands (between 16 and 48) -filled with various hues. - -![colormap-DemoTurboColormapKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoTurboColormapKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoTurboColormap.kt) - -### colormap/DemoTurboColormapPhrase - -This program demonstrates how to use the shader-based version of -the `turbo_colormap()` function, which -takes a normalized value and returns an `rgb` color using the -Turbo colormap developed by Google. - -It shades a full-window rectangle using its normalized `x` coordinate -in a `ShadeStyle` to choose pixel colors. - -![colormap-DemoTurboColormapPhraseKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoTurboColormapPhraseKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoTurboColormapPhrase.kt) - -### colormap/DemoTurboColormapPlot - -This demo uses the shader based `turbo_colormap()` function to fill the background, -then visualizes the red, green and blue components of the colors used in the background -as red, green and blue line strips. - -The Vector2 points for the line strips are calculated only once when the program starts. - -![colormap-DemoTurboColormapPlotKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormap-DemoTurboColormapPlotKt.png) - -[source code](src/jvmDemo/kotlin/colormap/DemoTurboColormapPlot.kt) - -### colormatrix/DemoColorMatrix01 - -This demo modifies the displayed image in each grid cell -using color matrix transformations to demonstrate color channel inversions based on -the grid cell's index. The image is adjusted to fit within each grid cell while maintaining -alignment. - -Functionality: -- Loads an image from the specified file path. -- Splits the drawing area into an evenly spaced 4x2 grid. -- Applies different color matrix inversions (red, green, blue) based on the position index. -- Fits the image into each grid cell while providing horizontal alignment adjustments. - -![colormatrix-DemoColorMatrix01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormatrix-DemoColorMatrix01Kt.png) - -[source code](src/jvmDemo/kotlin/colormatrix/DemoColorMatrix01.kt) - -### colormatrix/DemoColorMatrix02 - -This demo modifies the displayed image in each grid cell -using color matrix transformations to demonstrate color channel inversions based on -the grid cell's index. The image is adjusted to fit within each grid cell while maintaining -alignment. - -Functionality: -- Loads an image from the specified file path. -- Splits the drawing area into an evenly spaced 4x2 grid. -- Applies different color matrix inversions (red, green, blue) based on the position index. -- Fits the image into each grid cell while providing horizontal alignment adjustments. - -![colormatrix-DemoColorMatrix02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormatrix-DemoColorMatrix02Kt.png) - -[source code](src/jvmDemo/kotlin/colormatrix/DemoColorMatrix02.kt) - -### colormatrix/DemoColorMatrix03 - -Entry point for an application demonstrating the use of color matrix transformations on an image. - -The program initializes a graphical application with a resolution of 720x720 pixels -and processes an image to display it in a series of grid cells, applying a hue shift -transformation based on the index of each cell. - -Key features: -- Loads an image from a specified file path. -- Configures the drawing area to consist of a horizontal grid with 16 cells. -- Applies a color tint transformation utilizing the red channel, shifting its hue progressively -per cell index to create a colorful gradient effect. -- Adjusts the positions of the images within each grid cell for aesthetic alignment. - -![colormatrix-DemoColorMatrix03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormatrix-DemoColorMatrix03Kt.png) - -[source code](src/jvmDemo/kotlin/colormatrix/DemoColorMatrix03.kt) - -### colormatrix/DemoColorMatrix04 - -Entry point of a graphical application that demonstrates the use of color matrix -transformations on an image displayed within a grid layout. - -Overview: -- Initializes a window with a resolution of 720x720 pixels. -- Loads an image from the specified file path. -- Splits the drawing canvas into a 7x1 grid of cells. -- In each grid cell, applies custom grayscale transformations to the image using -a color matrix. The grayscale transformation coefficients for red, green, and blue -channels are computed based on the index of the grid cell. -- Displays the adjusted image in each grid cell with horizontal alignment modifications -to position the images dynamically based on their index within the grid. - -![colormatrix-DemoColorMatrix04Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colormatrix-DemoColorMatrix04Kt.png) - -[source code](src/jvmDemo/kotlin/colormatrix/DemoColorMatrix04.kt) - -### colorRange/DemoColorRange01 - -Comparison of color lists generated by interpolating from -`PINK` to `BLUE` in six different color spaces. - -![colorRange-DemoColorRange01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colorRange-DemoColorRange01Kt.png) - -[source code](src/jvmDemo/kotlin/colorRange/DemoColorRange01.kt) - -### colorRange/DemoColorRange02 - -Demonstrates how to create a `ColorSequence` containing three colors, one of them in the HSLUV color space. - -Each color in the sequence is assigned a normalized position: in this program, one at the start (0.0), -one in the middle (0.5) and one at the end (1.0). - -The `ColorSpace.blend()` method is used to get a list with 18 interpolated `ColorRGBa` colors, -then those colors are drawn as vertical rectangles covering the whole window. - -![colorRange-DemoColorRange02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colorRange-DemoColorRange02Kt.png) - -[source code](src/jvmDemo/kotlin/colorRange/DemoColorRange02.kt) - -### colorRange/DemoColorRange03 - -This program creates color interpolations from `ColorRGBa.BLUE` to -`ColorRGBa.PINK` in 25 steps in multiple color spaces. - -The window height is adjusted based on the number of interpolations to show. - -The resulting gradients differ in saturation and brightness and apparently include more -`BLUE` or more `PINK` depending on the chosen color space. - -![colorRange-DemoColorRange03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colorRange-DemoColorRange03Kt.png) - -[source code](src/jvmDemo/kotlin/colorRange/DemoColorRange03.kt) - -### colorRange/DemoColorRange04 - -A visualization of color interpolations inside a 3D RGB cube with an interactive 3D `Orbital` camera. - -The hues of the source and target colors are animated over time. - -The color interpolations are shown simultaneously in nine different color spaces, revealing how in -each case they share common starting and ending points in 3D, but have unique paths going from -start to end. - -By rotating the cube 90 degrees towards the left and slightly zooming out, one can appreciate how -one of the points moves along the edges of the cube, while the other moves on the edges of a -smaller, invisible cube. - - -![colorRange-DemoColorRange04Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/colorRange-DemoColorRange04Kt.png) - -[source code](src/jvmDemo/kotlin/colorRange/DemoColorRange04.kt) - -### DemoColorPalette01 - -Demonstrates the creation of color palettes using various available methods - -![DemoColorPalette01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoColorPalette01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorPalette01.kt) - -### DemoColorPalette02 - -By default, generated palettes contain colors of varying hue -but similar brightness and saturation. -Here we alter the brightness of each color using .shade() for -an increased dynamic range. - -![DemoColorPalette02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoColorPalette02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorPalette02.kt) - -### DemoColorPlane01 - -Visualizes a plane of ColorOKLCH colors as small 3D spheres -inside a 3D box. The plane represents all available hues and chromas. -The luminosity used to create the colors is modulated over time -with a slow sine wave. -Instanced rendering is used to render 90 x 100 colored spheres, -each with a unique position based on the RGB components of the color. - -Since the OKLCH color space is larger than the RGB space, some -spheres would be outside the 3D box, but they are -actually clipped to the walls. - -![DemoColorPlane01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoColorPlane01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorPlane01.kt) - -### DemoColorPlane02 - - - -![DemoColorPlane02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoColorPlane02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorPlane02.kt) - -### DemoColorSequence01 - -A demo that demonstrates 3D objects with custom shading and color gradients. - -The application setup involves: -- Configuring the application window dimensions. -- Creating a color gradient using `ColorSequence` and converting it to a `ColorBuffer` for shading purposes. -- Defining a 3D sphere mesh with specified resolution. - -The rendering process includes: -- Setting up an orbital camera extension to provide an interactive 3D view. -- Applying a custom fragment shader with a palette-based shading style. -- Rendering a grid of 3D spheres, each transformed and rotated to create a dynamic pattern. - -![DemoColorSequence01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoColorSequence01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorSequence01.kt) - -### DemoDeltaE - - - -![DemoDeltaEKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoDeltaEKt.png) - -[source code](src/jvmDemo/kotlin/DemoDeltaE.kt) - -### DemoFettePalette01 - - - -![DemoFettePalette01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoFettePalette01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFettePalette01.kt) - -### DemoFettePalette02 - - - -![DemoFettePalette02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoFettePalette02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFettePalette02.kt) - -### DemoHSLUV01 - - - -![DemoHSLUV01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoHSLUV01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoHSLUV01.kt) - -### DemoHSLUV02 - - - -![DemoHSLUV02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoHSLUV02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoHSLUV02.kt) - -### DemoHueTools01 - - - -![DemoHueTools01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoHueTools01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoHueTools01.kt) - -### DemoMixSpectral01 - - - -![DemoMixSpectral01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoMixSpectral01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoMixSpectral01.kt) - -### DemoOKHSV01 - - - -![DemoOKHSV01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoOKHSV01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoOKHSV01.kt) - -### DemoXSLUV01 - - - -![DemoXSLUV01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/DemoXSLUV01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoXSLUV01.kt) - -### histogram/DemoHistogram01 - -Demonstrates how to generate a palette with the top 32 colors -of a loaded image, sorted by luminosity. The colors are displayed -as rectangles overlayed on top of the image. - -![histogram-DemoHistogram01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/histogram-DemoHistogram01Kt.png) - -[source code](src/jvmDemo/kotlin/histogram/DemoHistogram01.kt) - -### histogram/DemoHistogram02 - -Show the color histogram of an image using non-uniform weighting, -prioritizing bright colors. - -![histogram-DemoHistogram02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/histogram-DemoHistogram02Kt.png) - -[source code](src/jvmDemo/kotlin/histogram/DemoHistogram02.kt) - -### histogram/DemoHistogram03 - -Create a simple grid-like composition based on colors sampled from image. -The cells are 32 by 32 pixels in size and are filled with a random sample -taken from the color histogram of the image. - -Note: due to its random nature the resulting animation contains flickering colors. - -![histogram-DemoHistogram03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-color/images/histogram-DemoHistogram03Kt.png) - -[source code](src/jvmDemo/kotlin/histogram/DemoHistogram03.kt) diff --git a/orx-color/build.gradle.kts b/orx-color/build.gradle.kts deleted file mode 100644 index a198d217..00000000 --- a/orx-color/build.gradle.kts +++ /dev/null @@ -1,50 +0,0 @@ -@Suppress("DSL_SCOPE_VIOLATION") -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotest.multiplatform) -} - -kotlin { - sourceSets { - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(sharedLibs.kotlin.serialization.core) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - val commonTest by getting { - dependencies { - implementation(sharedLibs.kotlin.serialization.json) - implementation(sharedLibs.kotest.assertions) - implementation(sharedLibs.kotest.framework.engine) - } - } - - val jvmTest by getting { - dependencies { - implementation(sharedLibs.kotlin.serialization.json) - implementation(sharedLibs.kotest.assertions) - implementation(sharedLibs.kotest.framework.engine) - } - } - - val jvmDemo by getting { - dependencies { - implementation(project(":orx-camera")) - implementation(project(":orx-mesh-generators")) - implementation(project(":orx-color")) - implementation(project(":orx-jvm:orx-gui")) - implementation(project(":orx-shade-styles")) - implementation(project(":orx-image-fit")) - implementation(project(":orx-shapes")) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/Color.kt b/orx-color/src/commonMain/kotlin/Color.kt deleted file mode 100644 index 91eaf885..00000000 --- a/orx-color/src/commonMain/kotlin/Color.kt +++ /dev/null @@ -1,5 +0,0 @@ -// keeping this file here will stop IntelliJ from showing warning in nested relative packages -/** - * orx-color - */ -package org.openrndr.extra.color diff --git a/orx-color/src/commonMain/kotlin/colormaps/ColormapPhrases.kt b/orx-color/src/commonMain/kotlin/colormaps/ColormapPhrases.kt deleted file mode 100644 index 92603d45..00000000 --- a/orx-color/src/commonMain/kotlin/colormaps/ColormapPhrases.kt +++ /dev/null @@ -1,91 +0,0 @@ -package org.openrndr.extra.color.colormaps - -import org.openrndr.extra.shaderphrases.ShaderPhrase -import org.openrndr.extra.shaderphrases.ShaderPhraseBook - -/** - * Colormaps represent a class of functions taking a value in the range `0.0..1.0` and returning particular RGB color - * values. Colormaps can be used in data visualization for representing additional information/dimension of the data - * e.g: - * - depth - * - elevation - * - heat - * - * Note: the [ShaderPhrase] GLSL functions gathered in this [ShaderPhraseBook] also have respective Kotlin - * implementations. - * - * @see org.openrndr.extra.color.colormaps.turboColormap - * @see org.openrndr.extra.color.colormaps.spectralZucconi6 - */ -object ColormapPhraseBook : ShaderPhraseBook("colormap") { - - // Copyright 2019 Google LLC. - // SPDX-License-Identifier: Apache-2.0 - /** - * Polynomial approximation in GLSL for the Turbo colormap. - * - * See [Turbo, An Improved Rainbow Colormap for Visualization](https://research.google/blog/turbo-an-improved-rainbow-colormap-for-visualization/), - * [the source of this code](https://gist.github.com/mikhailov-work/0d177465a8151eb6ede1768d51d476c7), - * - * @author Anton Mikhailov (mikhailov@google.com) - Colormap Design - * @author Ruofei Du (ruofei@google.com) - GLSL Approximation - * @see org.openrndr.extra.color.colormaps.turboColormap - */ - val turboColormap = ShaderPhrase(""" - |vec3 turbo_colormap(in float x) { - | const vec4 kRedVec4 = vec4(0.13572138, 4.61539260, -42.66032258, 132.13108234); - | const vec4 kGreenVec4 = vec4(0.09140261, 2.19418839, 4.84296658, -14.18503333); - | const vec4 kBlueVec4 = vec4(0.10667330, 12.64194608, -60.58204836, 110.36276771); - | const vec2 kRedVec2 = vec2(-152.94239396, 59.28637943); - | const vec2 kGreenVec2 = vec2(4.27729857, 2.82956604); - | const vec2 kBlueVec2 = vec2(-89.90310912, 27.34824973); - | - | x = clamp(x, 0.0, 1.0); - | vec4 v4 = vec4( 1.0, x, x * x, x * x * x); - | vec2 v2 = v4.zw * v4.z; - | return vec3( - | dot(v4, kRedVec4) + dot(v2, kRedVec2), - | dot(v4, kGreenVec4) + dot(v2, kGreenVec2), - | dot(v4, kBlueVec4) + dot(v2, kBlueVec2) - | ); - |}""".trimMargin()) - - /** - * Accurate spectral colormap developed by Alan Zucconi. - * - * See [Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) article, - * [the source of this code](https://www.shadertoy.com/view/ls2Bz1) - * - * @author Alan Zucconi - * @see org.openrndr.extra.color.colormaps.spectralZucconi6 - */ - val spectralZucconi6 = ShaderPhrase(""" - |#pragma import colormap.bump3y - | - |vec3 spectral_zucconi6(in float x) { - | - | const vec3 c1 = vec3(3.54585104, 2.93225262, 2.41593945); - | const vec3 x1 = vec3(0.69549072, 0.49228336, 0.27699880); - | const vec3 y1 = vec3(0.02312639, 0.15225084, 0.52607955); - | - | const vec3 c2 = vec3(3.90307140, 3.21182957, 3.96587128); - | const vec3 x2 = vec3(0.11748627, 0.86755042, 0.66077860); - | const vec3 y2 = vec3(0.84897130, 0.88445281, 0.73949448); - | - | return - | bump3y(c1 * (x - x1), y1) + - | bump3y(c2 * (x - x2), y2) ; - |}""".trimMargin()) - - /** - * A function used internally by [spectralZucconi6]. - * - * @author Alan Zucconi - */ - val bump3y = ShaderPhrase(""" - |vec3 bump3y(in vec3 x, in vec3 yoffset) { - | vec3 y = vec3(1.0) - x * x; - | return clamp(y - yoffset, vec3(0.0), vec3(1.0)); - |}""".trimMargin()) - -} diff --git a/orx-color/src/commonMain/kotlin/colormaps/SpectralZucconiColormap.kt b/orx-color/src/commonMain/kotlin/colormaps/SpectralZucconiColormap.kt deleted file mode 100644 index 38698264..00000000 --- a/orx-color/src/commonMain/kotlin/colormaps/SpectralZucconiColormap.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.openrndr.extra.color.colormaps - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Vector3 -import org.openrndr.math.saturate - -/** - * Accurate spectral colormap developed by Alan Zucconi. - * - * @see spectralZucconi6Vector - * @see ColormapPhraseBook.spectralZucconi6 - */ -fun spectralZucconi6( - x: Double -): ColorRGBa = ColorRGBa.fromVector( - spectralZucconi6Vector(x) -) - -/** - * Accurate spectral colormap developed by Alan Zucconi. - * - * @see ColormapPhraseBook.spectralZucconi6 - */ -fun spectralZucconi6Vector(x: Double): Vector3 { - val v = Vector3(x) - return bump3y(c1 * (v - x1), y1) + bump3y(c2 * (v - x2), y2) -} - -private fun bump3y( - x: Vector3, - yOffset: Vector3 -) = (Vector3.ONE - x * x - yOffset).saturate() - -private val c1 = Vector3(3.54585104, 2.93225262, 2.41593945) -private val x1 = Vector3(0.69549072, 0.49228336, 0.27699880) -private val y1 = Vector3(0.02312639, 0.15225084, 0.52607955) - -private val c2 = Vector3(3.90307140, 3.21182957, 3.96587128) -private val x2 = Vector3(0.11748627, 0.86755042, 0.66077860) -private val y2 = Vector3(0.84897130, 0.88445281, 0.73949448) diff --git a/orx-color/src/commonMain/kotlin/colormaps/TurboColormap.kt b/orx-color/src/commonMain/kotlin/colormaps/TurboColormap.kt deleted file mode 100644 index af423c79..00000000 --- a/orx-color/src/commonMain/kotlin/colormaps/TurboColormap.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.openrndr.extra.color.colormaps - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.* - -/** - * Polynomial approximation in GLSL for the Turbo colormap. - * - * @see turboColormapVector - * @see ColormapPhraseBook.turboColormap - */ -fun turboColormap( - x: Double -): ColorRGBa = ColorRGBa.fromVector( - turboColormapVector(x) -) - -/** - * Polynomial approximation in GLSL for the Turbo colormap. - * - * @see ColormapPhraseBook.turboColormap - */ -fun turboColormapVector(x: Double): Vector3 { - val v = saturate(x) - val v4 = Vector4( 1.0, v, v * v, v * v * v) - val v2 = Vector2(v4.z, v4.w) * v4.z - return Vector3( - v4.dot(kRedVec4) + v2.dot(kRedVec2), - v4.dot(kGreenVec4) + v2.dot(kGreenVec2), - v4.dot(kBlueVec4) + v2.dot(kBlueVec2) - ) -} - -private val kRedVec4 = Vector4(0.13572138, 4.61539260, -42.66032258, 132.13108234) -private val kGreenVec4 = Vector4(0.09140261, 2.19418839, 4.84296658, -14.18503333) -private val kBlueVec4 = Vector4(0.10667330, 12.64194608, -60.58204836, 110.36276771) -private val kRedVec2 = Vector2(-152.94239396, 59.28637943) -private val kGreenVec2 = Vector2(4.27729857, 2.82956604) -private val kBlueVec2 = Vector2(-89.90310912, 27.34824973) diff --git a/orx-color/src/commonMain/kotlin/colormatrix/ColorTransforms.kt b/orx-color/src/commonMain/kotlin/colormatrix/ColorTransforms.kt deleted file mode 100644 index b6299e9b..00000000 --- a/orx-color/src/commonMain/kotlin/colormatrix/ColorTransforms.kt +++ /dev/null @@ -1,138 +0,0 @@ -package org.openrndr.extra.color.colormatrix - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Matrix55 - -/** - * Creates a 5x5 matrix based on the given color values. - * - * @param color The color represented as an instance of ColorRGBa, where the r, g, b, and alpha - * components will be used to modify the matrix. - * @param ignoreAlpha A boolean flag indicating whether the alpha component of the color should be ignored. - * If true, the alpha value in the matrix will be set to 0.0. Defaults to true. - * @return A 5x5 matrix (Matrix55) with the r, g, b components set in the corresponding matrix columns, - * and the alpha value determined by the ignoreAlpha parameter. - */ -fun constant(color: ColorRGBa, ignoreAlpha: Boolean = true): Matrix55 { - return Matrix55.IDENTITY.copy(c4r0 = color.r, c4r1 = color.g, c4r2 = color.b, - c4r3 = if (ignoreAlpha) 0.0 else color.alpha - ) -} - -/** - * Applies a color tint transformation and returns a 5x5 matrix representing the transformation. - * - * @param color The `ColorRGBa` instance containing the red, green, blue, and alpha values of the color tint to apply. - * @return A 5x5 transformation matrix with the color tint applied based on the provided color. - */ -fun tint(color: ColorRGBa): Matrix55 { - return Matrix55(c0r0 = color.r, c1r1 = color.g, c2r2 = color.b, c3r3 = color.alpha, c4r4 = 1.0) -} - -/** - * A lazily initialized 5x5 matrix (Matrix55) representing a transformation matrix. - * The matrix is configured with specific coefficient values to perform an inversion transformation. - */ -val invert: Matrix55 by lazy { - Matrix55(c0r0 = -1.0, c1r1 = -1.0, c2r2 = -1.0, c3r3 = 1.0, c4r0 = 1.0, c4r1 = 1.0, c4r2 = 1.0, c4r3 = 0.0, c4r4 = 1.0) -} - -/** - * Creates a grayscale transformation matrix with the specified red, green, and blue coefficients. - * - * @param r The coefficient for the red channel. Default is 0.33. - * @param g The coefficient for the green channel. Default is 0.33. - * @param b The coefficient for the blue channel. Default is 0.33. - * @return A 5x5 matrix representing the grayscale transformation. - */ -fun grayscale(r: Double = 0.33, g: Double = 0.33, b: Double = 0.33): Matrix55 { - return Matrix55( - c0r0 = r, c1r0 = g, c2r0 = b, - c0r1 = r, c1r1 = g, c2r1 = b, - c0r2 = r, c1r2 = g, c2r2 = b, - c3r3 = 1.0, - c4r4 = 1.0) -} - -class ColorMatrixBuilder() { - @PublishedApi - internal var matrix = Matrix55.IDENTITY - - /** - * Applies a grayscale transformation to the current color matrix using the specified red, green, and blue coefficients. - * - * @param r The coefficient for the red channel. Default is 1.0/3.0. - * @param g The coefficient for the green channel. Default is 1.0/3.0. - * @param b The coefficient for the blue channel. Default is 1.0/3.0. - */ - fun grayscale(r: Double = 1.0/3.0, g: Double = 1.0/3.0, b: Double = 1.0/3.0) { - matrix *= org.openrndr.extra.color.colormatrix.grayscale(r, g, b) - } - - /** - * Adds a constant color transformation to the current color matrix. - * - * @param color The color to be added, represented as an instance of `ColorRGBa` with red, green, blue, and alpha components. - * @param ignoreAlpha A boolean flag indicating whether to ignore the alpha component of the color. - * If true, the alpha value in the matrix will be set to 0.0. Defaults to true. - */ - fun addConstant(color: ColorRGBa, ignoreAlpha: Boolean = true) { - matrix *= org.openrndr.extra.color.colormatrix.constant(color, ignoreAlpha) - } - - - /** - * Inverts the specified color channels in the current color matrix. - * - * @param invertR A boolean indicating whether to invert the red channel. Default is true. - * @param invertG A boolean indicating whether to invert the green channel. Default is true. - * @param invertB A boolean indicating whether to invert the blue channel. Default is true. - */ - fun invert(invertR: Boolean = true, invertG: Boolean = true, invertB: Boolean = true) { - matrix *= Matrix55( - c0r0 = if (invertR) -1.0 else 1.0, - c1r1 = if (invertG) -1.0 else 1.0, - c2r2 = if (invertB) -1.0 else 1.0, - c3r3 = 1.0, - c4r0 = if (invertR) 1.0 else 0.0, - c4r1 = if (invertG) 1.0 else 0.0, - c4r2 = if (invertB) 1.0 else 0.0, - c4r3 = 0.0, - c4r4 = 1.0 - ) - } - /** - * Applies a tint transformation to the color matrix using the specified color. - * - * @param color The `ColorRGBa` instance specifying the tint color, including its red, green, blue, and alpha components. - */ - fun tint(color: ColorRGBa) { - matrix *= org.openrndr.extra.color.colormatrix.tint(color) - } - - /** - * Multiplies the current transformation matrix with the specified 5x5 matrix. - * - * @param matrix A 5x5 matrix (Matrix55) to multiply with the current matrix. - */ - fun multiply(matrix: Matrix55) { - this.matrix *= matrix - } - - fun build(): Matrix55 { - return matrix - } -} - -/** - * Constructs a 5x5 color transformation matrix using the specified transformations - * defined within a [ColorMatrixBuilder] DSL. - * - * @param builder A lambda function with a receiver of type [ColorMatrixBuilder] used - * to define the series of color matrix transformations to apply. - * @return A [Matrix55] instance representing the resulting color transformation matrix - * after applying all specified operations in the builder. - */ -fun colorMatrix(builder: ColorMatrixBuilder.() -> Unit): Matrix55 { - return ColorMatrixBuilder().apply(builder).build() -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/fettepalette/FettePalette.kt b/orx-color/src/commonMain/kotlin/fettepalette/FettePalette.kt deleted file mode 100644 index a290799e..00000000 --- a/orx-color/src/commonMain/kotlin/fettepalette/FettePalette.kt +++ /dev/null @@ -1,256 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.color.fettepalette - -import org.openrndr.color.ColorHSLa -import org.openrndr.color.ColorHSVa -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.spaces.ColorOKHSLa -import org.openrndr.extra.color.spaces.ColorOKHSVa -import org.openrndr.extra.color.spaces.toOKHSLa -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.math.clamp -import kotlin.math.* - -/* -Converted to Kotlin from https://github.com/meodai/fettepalette/blob/main/src/index.ts - -MIT License - -Copyright (c) 2021 David Aerne - -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. -*/ - -interface Curve { - fun pointOnCurve( - i: Double, - total: Double, - curveAccent: Double, - min: Vector2 = Vector2.ZERO, - max: Vector2 = Vector2.ZERO - ): Vector2 - - fun remap(v: Vector2, min: Vector2, max: Vector2): Vector2 { - var x = v.x - var y = v.y - - x = min.x + x.coerceIn(0.0, 1.0) * (max.x - min.x) - y = min.y + y.coerceIn(0.0, 1.0) * (max.y - min.y) - - return Vector2(x, y) - } -} - -object Lamé : Curve { - override fun pointOnCurve(i: Double, total: Double, curveAccent: Double, min: Vector2, max: Vector2): Vector2 { - val limit = PI / 2 - val percentile = i / total - val t = percentile * limit - val exp = 2 / (2 + 20 * curveAccent) - val cosT = cos(t) - val sinT = sin(t) - val x = sign(cosT) * abs(cosT).pow(exp) - val y = sign(sinT) * abs(sinT).pow(exp) - return remap(Vector2(x, y), min, max) - } -} - -object Arc : Curve { - override fun pointOnCurve(i: Double, total: Double, curveAccent: Double, min: Vector2, max: Vector2): Vector2 { - val limit = PI / 2 - val slice = limit / total - val y = cos(-PI / 2 + i * slice + curveAccent) - val x = sin(PI / 2 + i * slice - curveAccent) - return remap(Vector2(x, y), min, max) - } -} - -class ColorRamp(val baseColors: List, val darkColors: List, val lightColors: List) - -@Description("Color ramp parameters") -class ColorRampParameters { - @IntParameter("total", 3, 16, 0) - var total = 3 - - @DoubleParameter("center hue", -180.0, 180.0, 3, 1) - var centerHue = 0.0 - - @DoubleParameter("hue cycle", 0.0, 1.0, 3, 2) - var hueCycle = 0.3 - - @DoubleParameter("offset tint", 0.0, 1.0, 3, 3) - var offsetTint = 0.1 - - @DoubleParameter("offset shade", 0.0, 1.0, 3, 4) - var offsetShade = 0.1 - - @DoubleParameter("curve accent", 0.0, 1.0, 3, 5) - var curveAccent = 0.0 - - @DoubleParameter("tint shade hue shift", 0.0, 1.0, 3, 6) - var tintShadeHueShift = 0.1 - - @DoubleParameter("offset mod tint", 0.0, 1.0, 3, 7) - var offsetCurveModTint = 0.03 - - @DoubleParameter("offset mod shade", 0.0, 1.0, 3, 8) - var offsetCurveModShade = 0.03 - - @Vector2Parameter("min saturation/light", min = 0.0, max = 1.0, precision = 3, order = 9) - var minSaturationLight = Vector2.ZERO - - @Vector2Parameter("max saturation/light", min = 0.0, max = 1.0, precision = 3, order = 10) - var maxSaturationLight = Vector2.ONE - - @BooleanParameter("use OKHSV", order = 11) - var useOK = false -} - - -/** - * @param total total of base colors in the ramp - * @param centerHue at what hue should the generation start at - * @param hueCycle hsl spins how much should the hue change over the curve, 0: not at all, 1: one full rainbow - * @param offsetTint offset for the tints - * @param offsetShade offset of the shades - * @param curveAccent how accentuated is the curve (depends heavily on curveMethod) - * @param tintShadeHueShift defines how shifted the hue is for the shades and the tints - * @param offsetCurveModTint modifies the tint curve - * @param offsetCurveModShade modifies the shade curve - * @param minSaturationLight defines the min saturation and light of all the colors - * @param maxSaturationLight defines the max saturation and light of all the colors - * @param useOK use OKHSV and OKHSL spaces - */ -fun generateColorRamp( - total: Int = 3, - centerHue: Double = 0.0, - hueCycle: Double = 0.3, - offsetTint: Double = 0.1, - offsetShade: Double = 0.1, - curveAccent: Double = 0.0, - tintShadeHueShift: Double = 0.1, - curveMethod: Curve = Lamé, - offsetCurveModTint: Double = 0.03, - offsetCurveModShade: Double = 0.03, - minSaturationLight: Vector2 = Vector2.ZERO, - maxSaturationLight: Vector2 = Vector2.ONE, - useOK: Boolean = false, -): ColorRamp { - val baseColors = mutableListOf() - val lightColors = mutableListOf() - val darkColors = mutableListOf() - - val okHueAdjust = if (useOK) 30.0 else 0.0 - - for (i in 1 until total + 1) { - val (x, y) = curveMethod.pointOnCurve( - i.toDouble(), - total + 1.0, - curveAccent, - minSaturationLight, - maxSaturationLight - ) - val h = (okHueAdjust + 360.0 + - (-180.0 * hueCycle + (centerHue + i * (360 / (total + 1)) * hueCycle)) - ) % 360 - - val hsv = if (useOK) { - ColorOKHSVa(h, x, y) - } else ColorHSVa(h, x, y) - val hsl = if (useOK) { - hsv.toRGBa().toOKHSLa() - } else hsv.toRGBa().toHSLa() - baseColors.add(hsl.toRGBa().toSRGB()) - - val (xl, yl) = curveMethod.pointOnCurve( - i.toDouble(), total + 1.0, curveAccent + offsetCurveModTint, - minSaturationLight, - maxSaturationLight - ) - - val hslLight = if (useOK) ColorOKHSVa(h, xl, yl).toRGBa().toOKHSLa() else ColorHSVa(h, xl, yl).toRGBa().toHSLa() - - if (useOK) { - hslLight as ColorOKHSLa - lightColors.add( - ColorOKHSLa( - (hslLight.h + 360.0 * tintShadeHueShift).mod(360.0), - (hslLight.s - offsetTint).clamp(0.0, 1.0), - (hslLight.l + offsetTint).clamp(0.0, 1.0) - ).toRGBa().toSRGB() - ) - } else { - hslLight as ColorHSLa - lightColors.add( - ColorHSLa( - (hslLight.h + 360.0 * tintShadeHueShift).mod(360.0), - (hslLight.s - offsetTint).clamp(0.0, 1.0), - (hslLight.l + offsetTint).clamp(0.0, 1.0) - ).toRGBa().toSRGB() - ) - } - - val (xd, yd) = curveMethod.pointOnCurve( - i.toDouble(), total + 1.0, curveAccent - offsetCurveModShade, - minSaturationLight, - maxSaturationLight - ) - - val hslDark = if (useOK) ColorOKHSVa(h, xd, yd).toRGBa().toOKHSLa() else ColorHSVa(h, xd, yd).toRGBa().toHSLa() - - if (useOK) { - hslDark as ColorOKHSLa - darkColors.add( - ColorOKHSLa( - (hslDark.h - 360.0 * tintShadeHueShift).mod(360.0), - (hslDark.s - offsetShade).clamp(0.0, 1.0), - (hslDark.l - offsetShade).clamp(0.0, 1.0) - ).toRGBa().toSRGB() - ) - } else { - hslDark as ColorHSLa - darkColors.add( - ColorHSLa( - (hslDark.h - 360.0 * tintShadeHueShift).mod(360.0), - (hslDark.s - offsetShade).clamp(0.0, 1.0), - (hslDark.l - offsetShade).clamp(0.0, 1.0) - ).toRGBa().toSRGB() - ) - } - } - return ColorRamp(baseColors, darkColors, lightColors) -} - -fun generateColorRamp(parameters: ColorRampParameters) - = generateColorRamp(total = parameters.total, - centerHue = parameters.centerHue, - hueCycle = parameters.hueCycle, - offsetTint = parameters.offsetTint, - offsetShade = parameters.offsetShade, - curveAccent = parameters.curveAccent, - tintShadeHueShift = parameters.tintShadeHueShift, - curveMethod = Lamé, - offsetCurveModTint = parameters.offsetCurveModTint, - offsetCurveModShade = parameters.offsetCurveModShade, - minSaturationLight = parameters.minSaturationLight, - maxSaturationLight = parameters.maxSaturationLight, - useOK = parameters.useOK -) \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/mixing/Spectral.kt b/orx-color/src/commonMain/kotlin/mixing/Spectral.kt deleted file mode 100644 index 54ceef74..00000000 --- a/orx-color/src/commonMain/kotlin/mixing/Spectral.kt +++ /dev/null @@ -1,612 +0,0 @@ -package org.openrndr.extra.color.mixing - -import org.openrndr.color.ColorRGBa -import org.openrndr.color.ColorXYZa -import org.openrndr.extra.color.tools.matchLinearity - -import kotlin.math.max -import kotlin.math.min -import kotlin.math.pow -import kotlin.math.sqrt - -/* -Direct port of https://github.com/rvanwijnen/spectral.js - */ - -/** - * Represents spectral power distribution (SPD) coefficients for the cyan channel, - * spanning 38 wavelength samples. This array is used as part of the spectral upsampling - * process to convert a linear RGB color into a reflectance spectrum. - * - * The coefficients are predefined values that define the contribution of the cyan channel - * at specific wavelengths to the resulting reflectance spectrum. - */ -private val SPD_C = doubleArrayOf( - 0.96853629, - 0.96855103, - 0.96859338, - 0.96877345, - 0.96942204, - 0.97143709, - 0.97541862, - 0.98074186, - 0.98580992, - 0.98971194, - 0.99238027, - 0.99409844, - 0.995172, - 0.99576545, - 0.99593552, - 0.99564041, - 0.99464769, - 0.99229579, - 0.98638762, - 0.96829712, - 0.89228016, - 0.53740239, - 0.15360445, - 0.05705719, - 0.03126539, - 0.02205445, - 0.01802271, - 0.0161346, - 0.01520947, - 0.01475977, - 0.01454263, - 0.01444459, - 0.01439897, - 0.0143762, - 0.01436343, - 0.01435687, - 0.0143537, - 0.01435408 -) - -/** - * Represents the spectral power distribution (SPD) data for the magenta color component. - * This array contains 38 predefined values corresponding to specific wavelengths. - * Used in the process of spectral upsampling to compute reflectance spectra from RGB color information. - */ -private val SPD_M = doubleArrayOf( - 0.51567122, - 0.5401552, - 0.62645502, - 0.75595012, - 0.92826996, - 0.97223624, - 0.98616174, - 0.98955255, - 0.98676237, - 0.97312575, - 0.91944277, - 0.32564851, - 0.13820628, - 0.05015143, - 0.02912336, - 0.02421691, - 0.02660696, - 0.03407586, - 0.04835936, - 0.0001172, - 0.00008554, - 0.85267882, - 0.93188793, - 0.94810268, - 0.94200977, - 0.91478045, - 0.87065445, - 0.78827548, - 0.65738359, - 0.59909403, - 0.56817268, - 0.54031997, - 0.52110241, - 0.51041094, - 0.50526577, - 0.5025508, - 0.50126452, - 0.50083021 -) - -/** - * Spectral power distribution (SPD) values for the Yellow primary in the spectral upsampling process. - * This array contains 38 precomputed reflectance values corresponding to specific wavelength samples. - * It is used to calculate the reflectance spectrum when converting a linear RGB color to its spectral representation. - */ -private val SPD_Y = doubleArrayOf( - 0.02055257, - 0.02059936, - 0.02062723, - 0.02073387, - 0.02114202, - 0.02233154, - 0.02556857, - 0.03330189, - 0.05185294, - 0.10087639, - 0.24000413, - 0.53589066, - 0.79874659, - 0.91186529, - 0.95399623, - 0.97137099, - 0.97939505, - 0.98345207, - 0.98553736, - 0.98648905, - 0.98674535, - 0.98657555, - 0.98611877, - 0.98559942, - 0.98507063, - 0.98460039, - 0.98425301, - 0.98403909, - 0.98388535, - 0.98376116, - 0.98368246, - 0.98365023, - 0.98361309, - 0.98357259, - 0.98353856, - 0.98351247, - 0.98350101, - 0.98350852 -) - -/** - * A predefined spectral power distribution (SPD) array for the red channel, - * used in the spectral upsampling process to convert linear RGB colors into reflectance spectra. - * - * This array contains 38 values corresponding to specific wavelengths and represents - * the relative spectral contribution of the red channel in the conversion process. - * - * The SPD_R array is utilized in conjunction with other SPDs (e.g., SPD_C, SPD_M, SPD_Y, SPD_G, SPD_B) - * and the weights derived from spectral upsampling to calculate the reflectance spectrum - * for a given color. - */ -private val SPD_R = doubleArrayOf( - 0.03147571, - 0.03146636, - 0.03140624, - 0.03119611, - 0.03053888, - 0.02856855, - 0.02459485, - 0.0192952, - 0.01423112, - 0.01033111, - 0.00765876, - 0.00593693, - 0.00485616, - 0.00426186, - 0.00409039, - 0.00438375, - 0.00537525, - 0.00772962, - 0.0136612, - 0.03181352, - 0.10791525, - 0.46249516, - 0.84604333, - 0.94275572, - 0.96860996, - 0.97783966, - 0.98187757, - 0.98377315, - 0.98470202, - 0.98515481, - 0.98537114, - 0.98546685, - 0.98550011, - 0.98551031, - 0.98550741, - 0.98551323, - 0.98551563, - 0.98551547 -) - -/** - * Represents the predefined spectral power distribution (SPD) values for the green component - * used in spectral upsampling of linear RGB colors. - * - * This array contains 38 reflectance values corresponding to specific wavelengths and - * reflects the spectral characteristics of the green primary in the color model. - * - * It is utilized as one of the SPD datasets in the linearToReflectance function, which - * converts linear RGB colors into reflectance spectra. - */ -private val SPD_G = doubleArrayOf( - 0.49108579, - 0.46944057, - 0.4016578, - 0.2449042, - 0.0682688, - 0.02732883, - 0.013606, - 0.01000187, - 0.01284127, - 0.02636635, - 0.07058713, - 0.70421692, - 0.85473994, - 0.95081565, - 0.9717037, - 0.97651888, - 0.97429245, - 0.97012917, - 0.9425863, - 0.99989207, - 0.99989891, - 0.13823139, - 0.06968113, - 0.05628787, - 0.06111561, - 0.08987709, - 0.13656016, - 0.22169624, - 0.32176956, - 0.36157329, - 0.4836192, - 0.46488579, - 0.47440306, - 0.4857699, - 0.49267971, - 0.49625685, - 0.49807754, - 0.49889859 -) - -/** - * Represents the spectral power distribution (SPD) values corresponding to the blue component - * of a linear RGB color. The array contains 38 precomputed reflectance values - * that span a specific range of wavelengths. These values are utilized in the spectral - * upsampling process to map an RGB color to its equivalent spectral reflectance distribution. - */ -private val SPD_B = doubleArrayOf( - 0.97901834, - 0.97901649, - 0.97901118, - 0.97892146, - 0.97858555, - 0.97743705, - 0.97428075, - 0.96663223, - 0.94822893, - 0.89937713, - 0.76070164, - 0.4642044, - 0.20123039, - 0.08808402, - 0.04592894, - 0.02860373, - 0.02060067, - 0.01656701, - 0.01451549, - 0.01357964, - 0.01331243, - 0.01347661, - 0.01387181, - 0.01435472, - 0.01479836, - 0.0151525, - 0.01540513, - 0.01557233, - 0.0156571, - 0.01571025, - 0.01571916, - 0.01572133, - 0.01572502, - 0.01571717, - 0.01571905, - 0.01571059, - 0.01569728, - 0.0157002 -) - -/** - * A pre-defined array representing the CIE 1931 Standard Observer's color matching function values for the X component. - * This data is used in color science calculations to transform spectral reflectance data into the CIE XYZ color space. - * The array contains 38 discrete samples corresponding to wavelengths within the visible spectrum. - * - * This constant is specifically used during computations involving spectral data to calculate the X component - * of the CIE XYZ color space via multiplication with a corresponding reflectance spectrum array. - */ -private val CIE_CMF_X = doubleArrayOf( - 0.00006469, - 0.00021941, - 0.00112057, - 0.00376661, - 0.01188055, - 0.02328644, - 0.03455942, - 0.03722379, - 0.03241838, - 0.02123321, - 0.01049099, - 0.00329584, - 0.00050704, - 0.00094867, - 0.00627372, - 0.01686462, - 0.02868965, - 0.04267481, - 0.05625475, - 0.0694704, - 0.08305315, - 0.0861261, - 0.09046614, - 0.08500387, - 0.07090667, - 0.05062889, - 0.03547396, - 0.02146821, - 0.01251646, - 0.00680458, - 0.00346457, - 0.00149761, - 0.0007697, - 0.00040737, - 0.00016901, - 0.00009522, - 0.00004903, - 0.00002 -) - -/** - * Represents the Y-component of the CIE 1931 color matching functions. - * - * The CIE 1931 color matching functions are used to convert spectral power distributions into - * CIE XYZ tristimulus values, which represent a color in a perceptually-uniform color space. - * These functions are defined over 38 discrete wavelength samples, typically covering - * the visible spectrum. - * - * The Y-component corresponds to the luminous efficiency function, - * which describes the sensitivity of human vision to different wavelengths of light. - */ -private val CIE_CMF_Y = doubleArrayOf( - 0.00000184, - 0.00000621, - 0.00003101, - 0.00010475, - 0.00035364, - 0.00095147, - 0.00228226, - 0.00420733, - 0.0066888, - 0.0098884, - 0.01524945, - 0.02141831, - 0.03342293, - 0.05131001, - 0.07040208, - 0.08783871, - 0.09424905, - 0.09795667, - 0.09415219, - 0.08678102, - 0.07885653, - 0.0635267, - 0.05374142, - 0.04264606, - 0.03161735, - 0.02088521, - 0.01386011, - 0.00810264, - 0.0046301, - 0.00249138, - 0.0012593, - 0.00054165, - 0.00027795, - 0.00014711, - 0.00006103, - 0.00003439, - 0.00001771, - 0.00000722 -) - -/** - * Represents the Z component of the CIE 1931 2° Standard Observer Color Matching Function (CMF). - * - * This array contains precomputed values representing the spectral sensitivity of the human eye's Z cone. - * It is used in color science to convert spectral reflectance data into the Z component of the CIE XYZ color space. - * - * The values in this array correspond to sampling points across the visible light spectrum - * and are used in conjunction with `CIE_CMF_X` and `CIE_CMF_Y` to perform reflectance spectrum to XYZ color conversions. - */ -private val CIE_CMF_Z = doubleArrayOf( - 0.00030502, - 0.00103681, - 0.00531314, - 0.01795439, - 0.05707758, - 0.11365162, - 0.17335873, - 0.19620658, - 0.18608237, - 0.13995048, - 0.08917453, - 0.04789621, - 0.02814563, - 0.01613766, - 0.0077591, - 0.00429615, - 0.00200551, - 0.00086147, - 0.00036904, - 0.00019143, - 0.00014956, - 0.00009231, - 0.00006813, - 0.00002883, - 0.00001577, - 0.00000394, - 0.00000158, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 -) - -/** - * Converts RGB color values into a form that represents spectral power distribution weights. - * - * @param rgb The RGB color in the form of a `ColorRGBa` object, which is to be converted to spectral weights. - * @return A `DoubleArray` representing the decomposed weights for white, cyan, magenta, yellow, red, green, and blue. - */ -private fun spectralUpsampling(rgb: ColorRGBa): DoubleArray { - var lrgb = rgb.toLinear() - val w = min(min(lrgb.r, lrgb.g), lrgb.b) - - lrgb = lrgb.copy(r = lrgb.r - w, g = lrgb.g - w, lrgb.b - w) - - val c = max(0.0, min(lrgb.g, lrgb.b)) - val m = max(0.0, min(lrgb.r, lrgb.b)) - val y = max(0.0, min(lrgb.r, lrgb.g)) - val r = max(0.0, min(lrgb.r - lrgb.b, lrgb.r - lrgb.g)) - val g = max(0.0, min(lrgb.g - lrgb.b, lrgb.g - lrgb.r)) - val b = max(0.0, min(lrgb.b - lrgb.g, lrgb.b - lrgb.r)) - - return doubleArrayOf(max(0.0, w), c, m, y, r, g, b) -} - - -/** - * Converts a linear RGB color into a reflectance spectrum represented as a `DoubleArray`. - * The resulting reflectance spectrum spans 38 wavelength samples - * and is computed using spectral upsampling based on predefined spectral distributions. - * - * @param rgb The linear RGB color to be converted, represented as a `ColorRGBa` object. - * @return A `DoubleArray` containing 38 reflectance values corresponding to the wavelengths. - */ -internal fun linearToReflectance(rgb: ColorRGBa): DoubleArray { - val eps = 0.00000001 - val weights = spectralUpsampling(rgb) - val reflectance = DoubleArray(38) - - for (i in 0 until 38) { - reflectance[i] = max( - eps, - weights[0] + - weights[1] * SPD_C[i] + - weights[2] * SPD_M[i] + - weights[3] * SPD_Y[i] + - weights[4] * SPD_R[i] + - weights[5] * SPD_G[i] + - weights[6] * SPD_B[i] - ) - } - return reflectance -} - -/** - * Computes the concentration of a component in a linear interpolation based on the specified parameters. - * - * The method calculates a concentration factor `c` using two linear values `l1` and `l2`, - * as well as a blend factor `t`. This can be used in scenarios such as spectral mixing - * or interpolation tasks where weights are dynamically computed. - * - * @param l1 The first linear value, typically derived from reflectance or intensity. - * @param l2 The second linear value, typically derived from reflectance or intensity. - * @param t The blending factor in the range [0.0, 1.0], where 0.0 represents full influence of `l1` - * and 1.0 represents full influence of `l2`. - * @return The computed concentration factor as a `Double`, representing the relative contribution - * of the components based on the blending factor. - */ -private fun linearToConcentration(l1: Double, l2: Double, t: Double): Double { - val t1 = l1 * (1 - t).pow(2.0) - val t2 = l2 * t.pow(2.0) - - return t2 / (t1 + t2) -} - -private fun DoubleArray.dot(other: DoubleArray): Double { - var d = 0.0 - for (i in indices) { - d += this[i] * other[i] - } - return d -} - -/** - * Converts a reflectance spectrum represented as a `DoubleArray` to a color in the CIE XYZ color space. - * - * This method calculates the XYZ color by performing a dot product operation between the reflectance spectrum - * and the CIE color matching functions (CIE_CMF_X, CIE_CMF_Y, CIE_CMF_Z). The result is returned as a `ColorXYZa` object. - * - * @param reflectance An array of reflectance spectrum values, typically spanning the visible spectrum. - * This is represented as a `DoubleArray` with 38 wavelength samples. - * @return A `ColorXYZa` object representing the corresponding color in the CIE XYZ color space. - */ -internal fun reflectanceToXYZ(reflectance: DoubleArray): ColorXYZa { - val x = reflectance.dot(CIE_CMF_X) - val y = reflectance.dot(CIE_CMF_Y) - val z = reflectance.dot(CIE_CMF_Z) - return ColorXYZa(x, y, z) -} - -private fun pow(x: Double, y: Double): Double = x.pow(y) - -/** - * Applies the Saunderson correction to a reflectance value to account for surface reflectance effects. - * - * Saunderson correction adjusts the measured reflectance by considering front surface reflection - * and internal reflections in the material. The correction is based on two coefficients, `k1` and `k2`. - * - * @param rInf The measured reflectance value to be corrected. - * @param k1 The first Saunderson coefficient representing front surface reflection. - * @param k2 The second Saunderson coefficient representing internal reflection effects. - * @return The corrected reflectance value as a `Double`. - */ -internal fun saundersonCorrection(rInf: Double, k1: Double, k2: Double): Double { - return k1 + ((1 - k1) * (1 - k2) * rInf) / (1 - (k2 * rInf)) -} - -/** - * Blends two colors spectrally by interpolating their reflectance spectra and returns the resulting color. - * This method uses spectral upsampling, Saunderson correction, and concentration factors to compute - * the resulting color in the RGB color space. - * - * @param color1 The first color to be mixed, represented as a `ColorRGBa`. - * @param color2 The second color to be mixed, represented as a `ColorRGBa`. - * @param t The blending factor in the range [0.0, 1.0], where 0.0 represents full influence of `color1` - * and 1.0 represents full influence of `color2`. - * @param k1 The first Saunderson correction coefficient for surface reflection. Default is 0.0. - * @param k2 The second Saunderson correction coefficient for internal reflections. Default is 0.0. - * @return The resulting blended color as a `ColorRGBa`, maintaining the linearity of the first input color (`color1`). - */ -fun mixSpectral(color1: ColorRGBa, color2: ColorRGBa, t: Double, k1: Double = 0.0, k2: Double = 0.0): ColorRGBa { - val lrgb1 = color1.toLinear() - val lrgb2 = color2.toLinear() - - val ref1 = linearToReflectance(lrgb1) - val ref2 = linearToReflectance(lrgb2) - - val l1 = ref1.dot(CIE_CMF_Y) - val l2 = ref2.dot(CIE_CMF_Y) - - val c = linearToConcentration(l1, l2, t) - - val reflectance = DoubleArray(38) - - for (i in 0 until 38) { - val ks = - (1.0 - c) * (pow(1.0 - ref1[i], 2.0) / (2.0 * ref1[i])) + c * (pow( - 1.0 - ref2[i], - 2.0 - ) / (2.0 * ref2[i])) - val km = (1.0 + ks - sqrt(pow(ks, 2.0) + 2.0 * ks)) - - reflectance[i] = saundersonCorrection(km, k1, k2) - } - - val xyz = reflectanceToXYZ(reflectance) - return xyz.toRGBa().matchLinearity(color1) -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/palettes/Classics.kt b/orx-color/src/commonMain/kotlin/palettes/Classics.kt deleted file mode 100644 index 36c6fa2b..00000000 --- a/orx-color/src/commonMain/kotlin/palettes/Classics.kt +++ /dev/null @@ -1,92 +0,0 @@ -package org.openrndr.extra.color.palettes - -import org.openrndr.color.ColorModel -import org.openrndr.color.ColorRGBa -import org.openrndr.color.HueShiftableColor -import org.openrndr.extra.color.tools.shiftHue - -/** - * Generates an analogous color palette based on the current color. - * - * This function creates a sequence of colors by shifting the hue of the current color - * gradually across a specified range of steps, using a particular color model that supports hue shifting. - * - * @param T The color model used for hue shifting. - * Must extend both `HueShiftableColor` and `ColorModel`. - * @param hueShift The total degree shift in hue between the first color and the last color. - * The hue shift is divided among the specified number of steps. - * @param steps The number of colors to include in the palette, including the starting color. - * Defaults to 5. - * @return A list of `ColorRGBa` instances forming the analogous palette. - */ -inline fun ColorRGBa.analogous(hueShift: Double, steps: Int = 5): List - where T : HueShiftableColor, - T : ColorModel = (0 until steps).map { - shiftHue(hueShift * it / (steps - 1.0)) -} - -/** - * Generates a split complementary color palette based on the current `ColorRGBa`. - * - * The method calculates complementary colors that are spread around the complementary - * hue axis of the original color. Depending on the parameters, the result may include - * two or four additional colors in addition to the original color. - * - * @param T The color model and hue shifting capability of the colors to generate. - * @param splitFactor A value between 0.0 and 1.0 that controls the spread of the complementary colors - * around the complementary hue. A higher value increases the angle between - * the colors on the hue wheel, while a lower value decreases it. - * @param double If `true`, the method will generate two additional colors derived by more granular - * shifts within the complementary range. If `false`, a simpler complementary palette - * is returned. - * @return A list of `ColorRGBa` objects representing the split complementary palette, with the original - * color as the first element in the list. - */ -inline fun ColorRGBa.splitComplementary(splitFactor: Double, double: Boolean = false): List - where T : HueShiftableColor, - T : ColorModel { - val c0 = shiftHue(180 - 180.0 * splitFactor) - val c1 = shiftHue(180 + 180.0 * splitFactor) - - if (!double) { - return listOf(this, c0, c1) - } else { - val c2 = shiftHue(180.0 * splitFactor) - val c3 = shiftHue(-180.0 * splitFactor) - return listOf(this, c0, c1, c2, c3) - } -} - - -/** - * Generates a triadic color palette based on the current `ColorRGBa`. - * - * Triadic colors are evenly spaced on the color wheel, forming a triangle. - * This method generates two additional colors by evenly shifting the hue of the given color - * at 120° intervals around the hue circle. - * - * @param T The color model and hue shifting capability of the colors to generate. - * @return A list of `ColorRGBa` objects representing the triadic color palette. - */ -inline fun ColorRGBa.triadic(): List - where T : HueShiftableColor, - T : ColorModel = splitComplementary(1.0 / 3.0) - - -/** - * Generates a tetradic color scheme based on the current color. - * A tetradic color scheme consists of four colors that are equidistant on the color wheel. - * - * @param aspectRatio A double value representing the aspect ratio of the tetradic scheme. - * The aspect ratio determines the angular separation between the colors in the scheme. - * Default is 1.0, resulting in equidistant colors. - * @return A list of `ColorRGBa` instances representing the tetradic color scheme. - * The list includes the original color and three additional colors derived by shifting the hue. - */ -inline fun ColorRGBa.tetradic(aspectRatio: Double = 1.0): List - where T : HueShiftableColor, - T : ColorModel { - val a0 = 180 / (aspectRatio + 1) - val a1 = 180 - a0 - return listOf(this, shiftHue(a0), shiftHue(a0 + a1), shiftHue(a0 + a1 + a0)) -} diff --git a/orx-color/src/commonMain/kotlin/palettes/ColorSequence.kt b/orx-color/src/commonMain/kotlin/palettes/ColorSequence.kt deleted file mode 100644 index 835ded5b..00000000 --- a/orx-color/src/commonMain/kotlin/palettes/ColorSequence.kt +++ /dev/null @@ -1,143 +0,0 @@ -package org.openrndr.extra.color.palettes - -import org.openrndr.color.* -import org.openrndr.draw.* -import org.openrndr.extra.color.spaces.* - - -/** - * Creates a `ColorSequence` by accepting a variable number of pairs, where each pair consists of - * a position (Double) and a color (T). The positions represent the normalized range `[0.0, 1.0]`. - * The resulting `ColorSequence` can be used for creating interpolated colors between the specified positions. - * - * @param offsets Vararg parameter of pairs, where each pair includes a position (Double) and a color (of type T). - * The position defines the location along a normalized sequence `[0.0, 1.0]`, and the color must implement `ConvertibleToColorRGBa`. - * Typically, positions must be sorted, but the function will sort them internally based on their position values. - * @return A `ColorSequence` containing the sorted sequence of colors and positions. - */ -fun colorSequence(vararg offsets: Pair): ColorSequence - where T : ConvertibleToColorRGBa { - return ColorSequence(offsets.sortedBy { it.first }) -} - -/** - * Represents a sequence of colors along with their corresponding positions in a normalized range [0.0, 1.0]. - * The `ColorSequence` allows for creating interpolated colors between the specified color points. - * - * @property colors A list of pairs where the first value is a position (ranging from 0.0 to 1.0) - * and the second value is a color that implements `ConvertibleToColorRGBa`. - */ -class ColorSequence(val colors: List>) { - infix fun blend(steps: Int): List = color(0.0, 1.0, steps) - - /** - * Converts a color sequence into a color buffer with a gradient representation. - * - * @param drawer The Drawer used to render the gradient into the color buffer. - * @param width The width of the resulting color buffer in pixels. Defaults to 256. - * @param height The height of the resulting color buffer in pixels. Defaults to 16. - * @param type The ColorType of the resulting color buffer. Defaults to UINT8_SRGB. - * @param format The ColorFormat of the resulting color buffer. Defaults to RGBa. - * @return A ColorBuffer containing the rendered color gradient. - */ - fun toColorBuffer( - drawer: Drawer, - width: Int = 256, - height: Int = 16, - type: ColorType = ColorType.UINT8_SRGB, - format: ColorFormat = ColorFormat.RGBa - ): ColorBuffer { - val cb = colorBuffer(width, height, type = type, format = format) - val rt = renderTarget(width, height) { - colorBuffer(cb) - } - - drawer.isolatedWithTarget(rt) { - defaults() - ortho(rt) - drawer.rectangles { - for (i in 0 until width) { - fill = color(i / (width.toDouble() - 1.0)) - stroke = null - rectangle(i * 1.0, 0.0, 1.0, height.toDouble()) - } - } - } - - rt.destroy() - return cb - } - - /** - * Generates a sequence of interpolated colors between two specified values. - * - * @param t0 A Double representing the start value for interpolation. - * @param t1 A Double representing the end value for interpolation. - * @param steps An Int representing the number of colors to generate in the sequence. - * @return A List of interpolated colors. - */ - fun color(t0: Double, t1: Double, steps: Int) = (0 until steps).map { - val f = (it / (steps - 1.0)) - val t = t0 * (1.0 - f) + t1 * f - color(t) - } - - /** - * Calculates a color using interpolation based on the provided parameter `t`. - * - * @param t A Double representing the position along the color sequence, typically ranging from 0.0 to 1.0. - * It indicates how far between the sequence colors the interpolation should occur, - * with 0.0 being the start of the sequence and 1.0 being the end. - * @return A ColorRGBa instance representing the interpolated color in the sRGB color space. - * If the provided `t` is outside the range of the sequence, the color at the nearest boundary will be returned. - */ - fun color(t: Double): ColorRGBa { - if (colors.size == 1) { - return colors.first().second.toRGBa().toSRGB() - } - if (t < colors[0].first) { - return colors[0].second.toRGBa().toSRGB() - } - if (t >= colors.last().first) { - return colors.last().second.toRGBa().toSRGB() - } - val rightIndex = colors.binarySearch { it.first.compareTo(t) }.let { if (it < 0) -it - 2 else it } - val leftIndex = (rightIndex + 1).coerceIn(0, colors.size - 1) - - val right = colors[rightIndex] - val left = colors[leftIndex] - - val rt = t - right.first - val dt = left.first - right.first - val nt = rt / dt - - return when (val l = left.second) { - is ColorRGBa -> right.second.toRGBa().mix(l, nt) - is ColorHSVa -> right.second.toRGBa().toHSVa().mix(l, nt).toRGBa() - is ColorHSLa -> right.second.toRGBa().toHSLa().mix(l, nt).toRGBa() - is ColorXSVa -> right.second.toRGBa().toXSVa().mix(l, nt).toRGBa() - is ColorXSLa -> right.second.toRGBa().toXSLa().mix(l, nt).toRGBa() - is ColorLABa -> right.second.toRGBa().toLABa().mix(l, nt).toRGBa() - is ColorLUVa -> right.second.toRGBa().toLUVa().mix(l, nt).toRGBa() - is ColorHSLUVa -> right.second.toRGBa().toHSLUVa().mix(l, nt).toRGBa() - is ColorHPLUVa -> right.second.toRGBa().toHPLUVa().mix(l, nt).toRGBa() - is ColorXSLUVa -> right.second.toRGBa().toXSLUVa().mix(l, nt).toRGBa() - is ColorLCHUVa -> right.second.toRGBa().toLCHUVa().mix(l, nt).toRGBa() - is ColorLCHABa -> right.second.toRGBa().toLCHABa().mix(l, nt).toRGBa() - is ColorOKLABa -> right.second.toRGBa().toOKLABa().mix(l, nt).toRGBa() - is ColorOKLCHa -> right.second.toRGBa().toOKLCHa().mix(l, nt).toRGBa() - is ColorOKHSLa -> right.second.toRGBa().toOKHSLa().mix(l, nt).toRGBa() - is ColorOKHSVa -> right.second.toRGBa().toOKHSVa().mix(l, nt).toRGBa() - else -> error("unsupported color space: ${l::class}") - }.toSRGB() - } -} - -/** - * Defines a range between two colors by creating a sequence of colors - * that transition smoothly from the start color to the end color. - * - * @param end The end color of the range. Both start and end colors must implement `ConvertibleToColorRGBa`. - * The start color is implicitly the color on which this operator is called. - */ -operator fun ConvertibleToColorRGBa.rangeTo(end: ConvertibleToColorRGBa) = colorSequence(0.0 to this, 1.0 to end) diff --git a/orx-color/src/commonMain/kotlin/phrases/Phrases.kt b/orx-color/src/commonMain/kotlin/phrases/Phrases.kt deleted file mode 100644 index 7177158e..00000000 --- a/orx-color/src/commonMain/kotlin/phrases/Phrases.kt +++ /dev/null @@ -1,88 +0,0 @@ -package org.openrndr.extra.color.phrases - -import org.openrndr.extra.shaderphrases.ShaderPhrase -import org.openrndr.extra.shaderphrases.ShaderPhraseBook - -val oklabToLinearRgbPhrase = """#ifndef ORX_COLOR_OKLAB_TO_LINEAR_RGB_PHRASE - |#define ORX_COLOR_OKLAB_TO_LINEAR_RGB_PHRASE - |vec4 oklab_to_linear_rgb(vec4 lab) { - | const mat3 kLMStoCONE = mat3( - | 1.0, 1.0, 1.0, - | 0.3963377774, -0.1055613458, -0.0894841775, - | 0.2158037573, -0.0638541728, -1.2914855480); - | const mat3 kRot = mat3( - | 4.0767416621, -1.2684380046, -0.0041960863, - | -3.3077115913, 2.6097574011, -0.7034186147, - | 0.2309699292, -0.3413193965, 1.7076147010); - | vec3 lms = kLMStoCONE * lab.rgb; - | lms = lms * lms * lms; - | vec4 res = vec4(kRot * lms,lab.a); - | return res; - |} - |#endif""".trimMargin() - -val linearRgbToOklabPhrase = """ - |#ifndef ORX_COLOR_LINEAR_RGB_TO_OKLAB_PHRASE - |#define ORX_COLOR_LINEAR_RGB_TO_OKLAB_PHRASE - |vec4 linear_rgb_to_oklab(vec4 c) { - | c.rgb = max(vec3(0.0), c.rgb); - | const mat3 kCONEtoLMS = mat3( - | 0.4122214708, 0.2119034982, 0.0883024619, - | 0.5363325363, 0.6806995451, 0.2817188376, - | 0.0514459929, 0.1073969566, 0.6299787005); - | - | const mat3 kRot = mat3( - | 0.2104542553, 1.9779984951, 0.0259040371, - | 0.7936177850, -2.4285922050, 0.7827717662, - | -0.0040720468, 0.4505937099, -0.8086757660); - | vec3 lms = pow(kCONEtoLMS * c.rgb, vec3(1.0/3.0)); - | vec4 res = vec4((kRot) * lms, c.a); - | return res; - |} - |#endif""".trimMargin() - -object ColorPhraseBook : ShaderPhraseBook("color") { - val phraseAtan2 = ShaderPhrase(""" - |float atan2(in float y, in float x) { - | bool s = (abs(x) > abs(y)); - | return mix(PI/2.0 - atan(x,y), atan(y,x), float(s)); - |}""".trimMargin()) - - val phraseLinearRgbToOKLab = ShaderPhrase(linearRgbToOklabPhrase) - - val oklabToLinearRgb = ShaderPhrase(oklabToLinearRgbPhrase) - - val phraseLabToLch = ShaderPhrase( """ - |vec4 lab_to_lch(vec4 lab) { - | float r = length(lab.yz); - | float h = atan2(lab[2], lab[1]); - | return vec4(lab[0], c, h, lab.a); - |}""".trimMargin()) - - val phraseLchToLab = ShaderPhrase(""" - |vec4 lch_to_lab(vec4 lch) { - | float a = lch[1] * cos(lch[2]); - | float b = lch[1] * sin(lch[2]); - | return vec4(lab[0], a, b, lab.a); - |}""".trimMargin()) - - val linearRgbToSRgb = ShaderPhrase(""" - |vec4 linear_rgb_to_srgb(vec4 c) { - | const float t = 0.00313066844250063; - | return vec4( - | c.r <= t ? c.r * 12.92 : 1.055 * pow(c.r, 1.0 / 2.4) - 0.055, - | c.g <= t ? c.g * 12.92 : 1.055 * pow(c.g, 1.0 / 2.4) - 0.055, - | c.b <= t ? c.b * 12.92 : 1.055 * pow(c.b, 1.0 / 2.4) - 0.055, - | c.a); - |}""".trimMargin()) - - val phraseSRgbToLinearRgb = ShaderPhrase(""" - |vec4 srgb_to_linear_rgb(vec4 c) { - | const float t = 0.0404482362771082; - | return vec4( - | c.r <= t ? c.r / 12.92 : pow( (c.r + 0.055) / 1.055, 2.4), - | c.g <= t ? c.g / 12.92 : pow( (c.g + 0.055) / 1.055, 2.4), - | c.b <= t ? c.b / 12.92 : pow( (c.b + 0.055) / 1.055, 2.4), - | c.a); - |}""".trimMargin()) -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/presets/Colors.kt b/orx-color/src/commonMain/kotlin/presets/Colors.kt deleted file mode 100644 index fa1df8b6..00000000 --- a/orx-color/src/commonMain/kotlin/presets/Colors.kt +++ /dev/null @@ -1,140 +0,0 @@ -@file:Suppress("unused") - -package org.openrndr.extra.color.presets - -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb - -val ColorRGBa.Companion.ALICE_BLUE by lazy { rgb(0.941176, 0.972549, 1.0) } -val ColorRGBa.Companion.ANTIQUE_WHITE by lazy { rgb(0.980392, 0.921569, 0.843137) } -val ColorRGBa.Companion.AQUA by lazy { rgb(0.0, 1.0, 1.0) } -val ColorRGBa.Companion.AQUAMARINE by lazy { rgb(0.498039, 1.0, 0.831373) } -val ColorRGBa.Companion.AZURE by lazy { rgb(0.941176, 1.0, 1.0) } -val ColorRGBa.Companion.BEIGE by lazy { rgb(0.960784, 0.960784, 0.862745) } -val ColorRGBa.Companion.BISQUE by lazy { rgb(1.0, 0.894118, 0.768627) } -val ColorRGBa.Companion.BLANCHED_ALMOND by lazy { rgb(1.0, 0.921569, 0.803922) } -val ColorRGBa.Companion.BLUE_VIOLET by lazy { rgb(0.541176, 0.168627, 0.886275) } -val ColorRGBa.Companion.BROWN by lazy { rgb(0.647059, 0.164706, 0.164706) } -val ColorRGBa.Companion.BURLY_WOOD by lazy { rgb(0.870588, 0.721569, 0.529412) } -val ColorRGBa.Companion.CADET_BLUE by lazy { rgb(0.372549, 0.619608, 0.627451) } -val ColorRGBa.Companion.CHARTREUSE by lazy { rgb(0.498039, 1.0, 0.0) } -val ColorRGBa.Companion.CHOCOLATE by lazy { rgb(0.823529, 0.411765, 0.117647) } -val ColorRGBa.Companion.CORAL by lazy { rgb(1.0, 0.498039, 0.313726) } -val ColorRGBa.Companion.CORNFLOWER_BLUE by lazy { rgb(0.392157, 0.584314, 0.929412) } -val ColorRGBa.Companion.CORN_SILK by lazy { rgb(1.0, 0.972549, 0.862745) } -val ColorRGBa.Companion.CRIMSON by lazy { rgb(0.862745, 0.0784314, 0.235294) } -val ColorRGBa.Companion.DARK_BLUE by lazy { rgb(0.0, 0.0, 0.545098) } -val ColorRGBa.Companion.DARK_CYAN by lazy { rgb(0.0, 0.545098, 0.545098) } -val ColorRGBa.Companion.DARK_GOLDEN_ROD by lazy { rgb(0.721569, 0.52549, 0.0431373) } -val ColorRGBa.Companion.DARK_GRAY by lazy { rgb(0.662745, 0.662745, 0.662745) } -val ColorRGBa.Companion.DARK_GREY by lazy { rgb(0.662745, 0.662745, 0.662745) } -val ColorRGBa.Companion.DARK_GREEN by lazy { rgb(0.0, 0.392157, 0.0) } -val ColorRGBa.Companion.DARK_KHAKI by lazy { rgb(0.741176, 0.717647, 0.419608) } -val ColorRGBa.Companion.DARK_MAGENTA by lazy { rgb(0.545098, 0.0, 0.545098) } -val ColorRGBa.Companion.DARK_OLIVE_GREEN by lazy { rgb(0.333333, 0.419608, 0.184314) } -val ColorRGBa.Companion.DARK_ORANGE by lazy { rgb(1.0, 0.54902, 0.0) } -val ColorRGBa.Companion.DARK_ORCHID by lazy { rgb(0.6, 0.196078, 0.8) } -val ColorRGBa.Companion.DARK_RED by lazy { rgb(0.545098, 0.0, 0.0) } -val ColorRGBa.Companion.DARK_SALMON by lazy { rgb(0.913725, 0.588235, 0.478431) } -val ColorRGBa.Companion.DARK_SEA_GREEN by lazy { rgb(0.560784, 0.737255, 0.560784) } -val ColorRGBa.Companion.DARK_SLATE_BLUE by lazy { rgb(0.282353, 0.239216, 0.545098) } -val ColorRGBa.Companion.DARK_SLATE_GRAY by lazy { rgb(0.184314, 0.309804, 0.309804) } -val ColorRGBa.Companion.DARK_TURQUOISE by lazy { rgb(0.0, 0.807843, 0.819608) } -val ColorRGBa.Companion.DARK_VIOLET by lazy { rgb(0.580392, 0.0, 0.827451) } -val ColorRGBa.Companion.DEEP_PINK by lazy { rgb(1.0, 0.0784314, 0.576471) } -val ColorRGBa.Companion.DEEP_SKY_BLUE by lazy { rgb(0.0, 0.74902, 1.0) } -val ColorRGBa.Companion.DIM_GRAY by lazy { rgb(0.411765, 0.411765, 0.411765) } -val ColorRGBa.Companion.DODGER_BLUE by lazy { rgb(0.117647, 0.564706, 1.0) } -val ColorRGBa.Companion.FIREBRICK by lazy { rgb(0.698039, 0.133333, 0.133333) } -val ColorRGBa.Companion.FLORAL_WHITE by lazy { rgb(1.0, 0.980392, 0.941176) } -val ColorRGBa.Companion.FOREST_GREEN by lazy { rgb(0.133333, 0.545098, 0.133333) } -val ColorRGBa.Companion.FUCHSIA by lazy { rgb(1.0, 0.0, 1.0) } -val ColorRGBa.Companion.GAINSBORO by lazy { rgb(0.862745, 0.862745, 0.862745) } -val ColorRGBa.Companion.GHOST_WHITE by lazy { rgb(0.972549, 0.972549, 1.0) } -val ColorRGBa.Companion.GOLD by lazy { rgb(1.0, 0.843137, 0.0) } -val ColorRGBa.Companion.GOLDENROD by lazy { rgb(0.854902, 0.647059, 0.12549) } -val ColorRGBa.Companion.GREY by lazy { rgb(0.501961, 0.501961, 0.501961) } -val ColorRGBa.Companion.GREEN_YELLOW by lazy { rgb(0.678431, 1.0, 0.184314) } -val ColorRGBa.Companion.HONEYDEW by lazy { rgb(0.941176, 1.0, 0.941176) } -val ColorRGBa.Companion.HOT_PINK by lazy { rgb(1.0, 0.411765, 0.705882) } -val ColorRGBa.Companion.INDIAN_RED by lazy { rgb(0.803922, 0.360784, 0.360784) } -val ColorRGBa.Companion.INDIGO by lazy { rgb(0.294118, 0.0, 0.509804) } -val ColorRGBa.Companion.IVORY by lazy { rgb(1.0, 1.0, 0.941176) } -val ColorRGBa.Companion.KHAKI by lazy { rgb(0.941176, 0.901961, 0.54902) } -val ColorRGBa.Companion.LAVENDER by lazy { rgb(0.901961, 0.901961, 0.980392) } -val ColorRGBa.Companion.LAVENDER_BLUSH by lazy { rgb(1.0, 0.941176, 0.960784) } -val ColorRGBa.Companion.LAWN_GREEN by lazy { rgb(0.486275, 0.988235, 0.0) } -val ColorRGBa.Companion.LEMON_CHIFFON by lazy { rgb(1.0, 0.980392, 0.803922) } -val ColorRGBa.Companion.LIGHT_BLUE by lazy { rgb(0.678431, 0.847059, 0.901961) } -val ColorRGBa.Companion.LIGHT_CORAL by lazy { rgb(0.941176, 0.501961, 0.501961) } -val ColorRGBa.Companion.LIGHT_CYAN by lazy { rgb(0.878431, 1.0, 1.0) } -val ColorRGBa.Companion.LIGHT_GOLDEN_ROD_YELLOW by lazy { rgb(0.980392, 0.980392, 0.823529) } -val ColorRGBa.Companion.LIGHT_GRAY by lazy { rgb(0.827451, 0.827451, 0.827451) } -val ColorRGBa.Companion.LIGHT_GREEN by lazy { rgb(0.564706, 0.933333, 0.564706) } -val ColorRGBa.Companion.LIGHT_PINK by lazy { rgb(1.0, 0.713726, 0.756863) } -val ColorRGBa.Companion.LIGHT_SALMON by lazy { rgb(1.0, 0.627451, 0.478431) } -val ColorRGBa.Companion.LIGHT_SEA_GREEN by lazy { rgb(0.12549, 0.698039, 0.666667) } -val ColorRGBa.Companion.LIGHT_SKY_BLUE by lazy { rgb(0.529412, 0.807843, 0.980392) } -val ColorRGBa.Companion.LIGHT_SLATE_GRAY by lazy { rgb(0.466667, 0.533333, 0.6) } -val ColorRGBa.Companion.LIGHT_STEEL_BLUE by lazy { rgb(0.690196, 0.768627, 0.870588) } -val ColorRGBa.Companion.LIGHT_YELLOW by lazy { rgb(1.0, 1.0, 0.878431) } -val ColorRGBa.Companion.LIME by lazy { rgb(0.0, 1.0, 0.0) } -val ColorRGBa.Companion.LIME_GREEN by lazy { rgb(0.196078, 0.803922, 0.196078) } -val ColorRGBa.Companion.LINEN by lazy { rgb(0.980392, 0.941176, 0.901961) } -val ColorRGBa.Companion.MAROON by lazy { rgb(0.501961, 0.0, 0.0) } -val ColorRGBa.Companion.MEDIUM_AQUAMARINE by lazy { rgb(0.4, 0.803922, 0.666667) } -val ColorRGBa.Companion.MEDIUM_BLUE by lazy { rgb(0.0, 0.0, 0.803922) } -val ColorRGBa.Companion.MEDIUM_ORCHID by lazy { rgb(0.729412, 0.333333, 0.827451) } -val ColorRGBa.Companion.MEDIUM_PURPLE by lazy { rgb(0.576471, 0.439216, 0.858824) } -val ColorRGBa.Companion.MEDIUM_SEA_GREEN by lazy { rgb(0.235294, 0.701961, 0.443137) } -val ColorRGBa.Companion.MEDIUM_SLATE_BLUE by lazy { rgb(0.482353, 0.407843, 0.933333) } -val ColorRGBa.Companion.MEDIUM_SPRING_GREEN by lazy { rgb(0.0, 0.980392, 0.603922) } -val ColorRGBa.Companion.MEDIUM_TURQUOISE by lazy { rgb(0.282353, 0.819608, 0.8) } -val ColorRGBa.Companion.MEDIUM_VIOLET_RED by lazy { rgb(0.780392, 0.0823529, 0.521569) } -val ColorRGBa.Companion.MIDNIGHT_BLUE by lazy { rgb(0.0980392, 0.0980392, 0.439216) } -val ColorRGBa.Companion.MINT_CREAM by lazy { rgb(0.960784, 1.0, 0.980392) } -val ColorRGBa.Companion.MISTY_ROSE by lazy { rgb(1.0, 0.894118, 0.882353) } -val ColorRGBa.Companion.MOCCASIN by lazy { rgb(1.0, 0.894118, 0.709804) } -val ColorRGBa.Companion.NAVAJO_WHITE by lazy { rgb(1.0, 0.870588, 0.678431) } -val ColorRGBa.Companion.NAVY by lazy { rgb(0.0, 0.0, 0.501961) } -val ColorRGBa.Companion.OLD_LACE by lazy { rgb(0.992157, 0.960784, 0.901961) } -val ColorRGBa.Companion.OLIVE by lazy { rgb(0.501961, 0.501961, 0.0) } -val ColorRGBa.Companion.OLIVE_DRAB by lazy { rgb(0.419608, 0.556863, 0.137255) } -val ColorRGBa.Companion.ORANGE by lazy { rgb(1.0, 0.647059, 0.0) } -val ColorRGBa.Companion.ORANGE_RED by lazy { rgb(1.0, 0.270588, 0.0) } -val ColorRGBa.Companion.ORCHID by lazy { rgb(0.854902, 0.439216, 0.839216) } -val ColorRGBa.Companion.PALE_GOLDEN_ROD by lazy { rgb(0.933333, 0.909804, 0.666667) } -val ColorRGBa.Companion.PALE_GREEN by lazy { rgb(0.596078, 0.984314, 0.596078) } -val ColorRGBa.Companion.PALE_TURQUOISE by lazy { rgb(0.686275, 0.933333, 0.933333) } -val ColorRGBa.Companion.PALE_VIOLET_RED by lazy { rgb(0.858824, 0.439216, 0.576471) } -val ColorRGBa.Companion.PAPAYA_WHIP by lazy { rgb(1.0, 0.937255, 0.835294) } -val ColorRGBa.Companion.PEACH_PUFF by lazy { rgb(1.0, 0.854902, 0.72549) } -val ColorRGBa.Companion.PERU by lazy { rgb(0.803922, 0.521569, 0.247059) } -val ColorRGBa.Companion.PLUM by lazy { rgb(0.866667, 0.627451, 0.866667) } -val ColorRGBa.Companion.POWDER_BLUE by lazy { rgb(0.690196, 0.878431, 0.901961) } -val ColorRGBa.Companion.PURPLE by lazy { rgb(0.501961, 0.0, 0.501961) } -val ColorRGBa.Companion.ROSY_BROWN by lazy { rgb(0.737255, 0.560784, 0.560784) } -val ColorRGBa.Companion.ROYAL_BLUE by lazy { rgb(0.254902, 0.411765, 0.882353) } -val ColorRGBa.Companion.SADDLE_BROWN by lazy { rgb(0.545098, 0.270588, 0.0745098) } -val ColorRGBa.Companion.SALMON by lazy { rgb(0.980392, 0.501961, 0.447059) } -val ColorRGBa.Companion.SANDY_BROWN by lazy { rgb(0.956863, 0.643137, 0.376471) } -val ColorRGBa.Companion.SEA_GREEN by lazy { rgb(0.180392, 0.545098, 0.341176) } -val ColorRGBa.Companion.SEASHELL by lazy { rgb(1.0, 0.960784, 0.933333) } -val ColorRGBa.Companion.SIENNA by lazy { rgb(0.627451, 0.321569, 0.176471) } -val ColorRGBa.Companion.SILVER by lazy { rgb(0.752941, 0.752941, 0.752941) } -val ColorRGBa.Companion.SKY_BLUE by lazy { rgb(0.529412, 0.807843, 0.921569) } -val ColorRGBa.Companion.SLATE_BLUE by lazy { rgb(0.415686, 0.352941, 0.803922) } -val ColorRGBa.Companion.SLATE_GRAY by lazy { rgb(0.439216, 0.501961, 0.564706) } -val ColorRGBa.Companion.SNOW by lazy { rgb(1.0, 0.980392, 0.980392) } -val ColorRGBa.Companion.SPRING_GREEN by lazy { rgb(0.0, 1.0, 0.498039) } -val ColorRGBa.Companion.STEEL_BLUE by lazy { rgb(0.27451, 0.509804, 0.705882) } -val ColorRGBa.Companion.BLUE_STEEL by lazy { rgb(0.27451, 0.509804, 0.705882) } -val ColorRGBa.Companion.TAN by lazy { rgb(0.823529, 0.705882, 0.54902) } -val ColorRGBa.Companion.TEAL by lazy { rgb(0.0, 0.501961, 0.501961) } -val ColorRGBa.Companion.THISTLE by lazy { rgb(0.847059, 0.74902, 0.847059) } -val ColorRGBa.Companion.TOMATO by lazy { rgb(1.0, 0.388235, 0.278431) } -val ColorRGBa.Companion.TURQUOISE by lazy { rgb(0.25098, 0.878431, 0.815686) } -val ColorRGBa.Companion.VIOLET by lazy { rgb(0.933333, 0.509804, 0.933333) } -val ColorRGBa.Companion.WHEAT by lazy { rgb(0.960784, 0.870588, 0.701961) } -val ColorRGBa.Companion.WHITE_SMOKE by lazy { rgb(0.960784, 0.960784, 0.960784) } -val ColorRGBa.Companion.YELLOW_GREEN by lazy { rgb(0.603922, 0.803922, 0.196078) } \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorHPLUVa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorHPLUVa.kt deleted file mode 100644 index e60dac93..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorHPLUVa.kt +++ /dev/null @@ -1,96 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import org.openrndr.math.mixAngle -import kotlin.jvm.JvmRecord - -/** - * Represents a color in the HPLUVa (Hue, Perceptual Lightness, Saturation, Alpha) color space. - * This color space is based on perceptual uniformity, making it suitable for operations - * like interpolation, shading, and manipulation of hue, saturation, and lightness values. - * - * @property h The hue component of the color, representing the angle on the color wheel in degrees [0, 360). - * @property s The saturation component of the color, representing the intensity of the color [0.0, 1.0]. - * @property l The lightness component of the color, representing the relative brightness [0.0, 1.0]. - * @property alpha The alpha (opacity) component of the color, ranging from fully transparent (0.0) to fully opaque (1.0). - */ -@Serializable -@JvmRecord -data class ColorHPLUVa(val h: Double, val s: Double, val l: Double, override val alpha: Double = 1.0) : - ColorModel, - HueShiftableColor, - SaturatableColor, - ShadableColor, - LuminosityColor, - AlgebraicColor { - fun toLCHUVa(): ColorLCHUVa { - val l1 = l - if (l1 > 0.9999999) { - return ColorLCHUVa(100.0, 0.0, h) - } - if (l1 < 0.00000001) { - return ColorLCHUVa(0.0, 0.0, h) - } - val l100 = l1 * 100.0 - val max100 = maxSafeChromaForL(l100) - val c100 = max100 * s - return ColorLCHUVa(l100, c100, h) - } - - override val hue: Double - get() = h - override fun withHue(hue: Double) = copy(h = hue) - - - override fun shade(factor: Double): ColorHPLUVa = copy(l = l * factor) - - override val saturation: Double - get() = s - - override fun withSaturation(saturation: Double): ColorHPLUVa = copy(s = saturation) - - override fun toRGBa(): ColorRGBa = toLCHUVa().toRGBa() - - override fun opacify(factor: Double) = copy(alpha = alpha * factor) - - override fun minus(right: ColorHPLUVa) = copy(h = h - right.h, s = s - right.s, l = l - right.l, alpha = alpha - right.alpha) - - override fun plus(right: ColorHPLUVa) = copy(h = h + right.h, s = s + right.s, l = l + right.l, alpha = alpha + right.alpha) - - override fun times(scale: Double) = copy(h = h * scale, s = s * scale, l = l * scale, alpha = alpha * scale) - - override fun mix(other: ColorHPLUVa, factor: Double) = mix(this, other, factor) - - override fun toVector4(): Vector4 = Vector4(h, s, l, alpha) - override val luminosity: Double - get() = l - - override fun withLuminosity(luminosity: Double): ColorHPLUVa = copy(l = luminosity) -} - -fun mix(left: ColorHPLUVa, right: ColorHPLUVa, x: Double): ColorHPLUVa { - val sx = x.coerceIn(0.0, 1.0) - return ColorHPLUVa( - mixAngle(left.h, right.h, sx), - (1.0 - sx) * left.s + sx * right.s, - (1.0 - sx) * left.l + sx * right.l, - (1.0 - sx) * left.alpha + sx * right.alpha) -} - -fun ColorRGBa.toHPLUVa(): ColorHPLUVa = toLCHUVa().toHPLUVa() - -fun ColorLCHUVa.toHPLUVa(): ColorHPLUVa { - val l100 = l - if (l100 > 99.9999999) { - return ColorHPLUVa(h, 0.0, 1.0) - } - if (l100 < 0.00000001) { - return ColorHPLUVa(h, 0.0, 0.0) - - } - val max100 = maxSafeChromaForL(l) - val s1 = c / max100 - return ColorHPLUVa(h, s1, l100 / 100.0) -} diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorHSLUVa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorHSLUVa.kt deleted file mode 100644 index 61778449..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorHSLUVa.kt +++ /dev/null @@ -1,203 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import org.openrndr.math.map -import org.openrndr.math.mixAngle -import kotlin.jvm.JvmRecord -import kotlin.math.* - -private val m = arrayOf( - doubleArrayOf(3.240969941904521, -1.537383177570093, -0.498610760293), - doubleArrayOf(-0.96924363628087, 1.87596750150772, 0.041555057407175), - doubleArrayOf(0.055630079696993, -0.20397695888897, 1.056971514242878)) - -private const val kappa = 903.2962962 -private const val epsilon = 0.0088564516 - -private fun getBounds(L: Double): List { - val result = ArrayList() - val sub1 = (L + 16).pow(3.0) / 1560896 - val sub2 = if (sub1 > epsilon) sub1 else L / kappa - for (c in 0..2) { - val m1 = m[c][0] - val m2 = m[c][1] - val m3 = m[c][2] - for (t in 0..1) { - val top1 = (284517 * m1 - 94839 * m3) * sub2 - val top2 = (838422 * m3 + 769860 * m2 + 731718 * m1) * L * sub2 - 769860 * t * L - val bottom = (632260 * m3 - 126452 * m2) * sub2 + 126452 * t - result.add(doubleArrayOf(top1 / bottom, top2 / bottom)) - } - } - return result -} - -private fun intersectLineLine(lineA: DoubleArray, lineB: DoubleArray): Double { - return (lineA[1] - lineB[1]) / (lineB[0] - lineA[0]) -} - -private fun distanceFromPole(point: DoubleArray): Double { - return sqrt(point[0].pow(2.0) + point[1].pow(2.0)) -} - -private fun lengthOfRayUntilIntersect(theta: Double, line: DoubleArray): Length { - val length = line[1] / (sin(theta) - line[0] * cos(theta)) - return Length(length) -} - -private class Length(val length: Double) { - val greaterEqualZero: Boolean = length >= 0 -} - -internal fun maxSafeChromaForL(L100: Double): Double { - val bounds = getBounds(L100) - var min = Double.MAX_VALUE - for (i in 0..1) { - val m1 = bounds[i][0] - val b1 = bounds[i][1] - val line = doubleArrayOf(m1, b1) - val x = intersectLineLine(line, doubleArrayOf(-1 / m1, 0.0)) - val length = distanceFromPole(doubleArrayOf(x, b1 + x * m1)) - min = min(min, length) - } - return min -} - -private fun maxChromaForLH(L100: Double, H: Double): Double { - val hrad = H / 360 * PI * 2 - val bounds = getBounds(L100) - var min = Double.MAX_VALUE - for (bound in bounds) { - val length: Length = lengthOfRayUntilIntersect(hrad, bound) - if (length.greaterEqualZero) { - min = min(min, length.length) - } - } - return min -} - - -/** - * Represents a color in the HSLuv color space with an alpha transparency component. - * HSLuv is a perceptually uniform color space, where hues are uniformly distributed - * and the perception of color is consistent across the spectrum. - * - * @property h The hue of the color in degrees, ranging from 0.0 to 360.0. - * @property s The saturation of the color, ranging from 0.0 to 1.0. - * @property l The luminance of the color, ranging from 0.0 to 1.0. - * @property alpha The alpha transparency value, ranging from 0.0 (fully transparent) to 1.0 (fully opaque). - */ -@Serializable -@JvmRecord -data class ColorHSLUVa(val h: Double, val s: Double, val l: Double, override val alpha: Double = 1.0) : - ColorModel, - HueShiftableColor, - SaturatableColor, - ShadableColor, - LuminosityColor, - AlgebraicColor { - - - fun toLCHUVa(): ColorLCHUVa { - - val l100 = l * 100.0 - val s100 = s * 100.0 - - if (l100 > 99.9999999) { - ColorLCHUVa(100.0, 0.0, h, alpha) - } - - if (l100 < 0.00000001) { - ColorLCHUVa(0.0, 0.0, h, alpha) - } - val max100 = maxChromaForLH(l100, h) - - val c: Double = max100 / 100 * s100 - - return ColorLCHUVa(l100, c, h, alpha) - } - - fun toXSLUVa() : ColorXSLUVa { - return ColorXSLUVa(hueToX(h), s, l, alpha) - } - - override val hue: Double - get() = h - - override fun withHue(hue: Double): ColorHSLUVa = copy(h = hue) - override fun shade(factor: Double) = copy(l = l * factor) - override val saturation: Double - get() = s - - override fun withSaturation(saturation: Double): ColorHSLUVa = copy(s = saturation) - - override fun toRGBa(): ColorRGBa { - return toLCHUVa().toRGBa() - } - - override fun opacify(factor: Double) = copy(alpha = alpha * factor) - - override fun minus(right: ColorHSLUVa) = copy(h = h - right.h, s = s - right.s, l = l - right.l, alpha = alpha - right.alpha) - - override fun plus(right: ColorHSLUVa) = copy(h = h + right.h, s = s + right.s, l = l + right.l, alpha = alpha + right.alpha) - - override fun times(scale: Double) = copy(h = h * scale, s = s * scale, l = l * scale, alpha = alpha * scale) - - override fun mix(other: ColorHSLUVa, factor: Double) = mix(this, other, factor) - - override fun toVector4(): Vector4 = Vector4(h, s, l, alpha) - override val luminosity: Double - get() = l - - override fun withLuminosity(luminosity: Double): ColorHSLUVa = copy(l = luminosity) - -} - -fun mix(left: ColorHSLUVa, right: ColorHSLUVa, x: Double): ColorHSLUVa { - val sx = x.coerceIn(0.0, 1.0) - return ColorHSLUVa( - mixAngle(left.h, right.h, sx), - (1.0 - sx) * left.s + sx * right.s, - (1.0 - sx) * left.l + sx * right.l, - (1.0 - sx) * left.alpha + sx * right.alpha) -} - -internal fun map(x: Double, a: Double, b: Double, c: Double, d: Double): Double { - return ((x - a) / (b - a)) * (d - c) + c -} - -fun hueToX(hue:Double): Double { - val h = hue.mod(360.0) - return if (0 <= h && h < 35) { - h.map(0.0, 35.0, 0.0, 60.0) - } else if (35 <= h && h < 60) { - h.map(35.0, 60.0, 60.0, 120.0) - } else if (60 <= h && h < 135.0) { - h.map(60.0, 135.0, 120.0, 180.0) - } else if (135.0 <= h && h < 225.0) { - h.map(135.0, 225.0, 180.0, 240.0) - } else if (225.0 <= h && h < 275.0) { - h.map( 225.0, 275.0, 240.0, 300.0) - } else { - h.map( 275.0, 360.0, 300.0, 360.0) - } -} - -fun ColorLCHUVa.toHSLUVa(): ColorHSLUVa { - val l100 = l - - if (l100 > 99.99999) { - return ColorHSLUVa(h, 0.0, 1.0) - } - if (l < 0.000001) { - return ColorHSLUVa(h, 0.0, 0.0) - } - val max100 = maxChromaForLH(l100, h) - val c100 = c - val s1 = c100 / max100 - return ColorHSLUVa(h, s1, l100 / 100.0, alpha) -} - -fun ColorRGBa.toHSLUVa(): ColorHSLUVa = toLCHUVa().toHSLUVa() diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorOKHSLa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorOKHSLa.kt deleted file mode 100644 index b7e146f0..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorOKHSLa.kt +++ /dev/null @@ -1,143 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import org.openrndr.math.mixAngle -import kotlin.jvm.JvmRecord -import kotlin.math.* - -/** - * Represents a color in the OKHSL (hue, saturation, lightness) color space with an alpha channel. - * This color model is based on perceptual uniformity and is useful for hue, saturation, and - * lightness manipulations while maintaining consistency with human vision. - * - * @property h The hue of the color, represented as a value in degrees [0.0, 360.0). - * @property s The saturation of the color, where 0.0 is fully desaturated (gray) and 1.0 is fully saturated. - * @property l The lightness of the color, where 0.0 is completely dark and 1.0 is completely light. - * @property alpha The opacity of the color, where 0.0 is fully transparent and 1.0 is fully opaque. - */ -@Suppress("LocalVariableName") -@Serializable -@JvmRecord -data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, override val alpha: Double = 1.0) : - ColorModel, - HueShiftableColor, - SaturatableColor, - ShadableColor, - AlgebraicColor { - - companion object { - fun fromColorRGBa(c: ColorRGBa): ColorOKHSLa { - val lab = c.toOKLABa() - val C = sqrt(lab.a * lab.a + lab.b * lab.b) - val a_ = lab.a / C - val b_ = lab.b / C - - val L = lab.l - val h = 0.5 + 0.5 * atan2(-lab.b, -lab.a) / PI - - val (c0, cMid, cMax) = get_Cs(L, a_, b_) - - val s = if (C < cMid) { - val k0 = 0 - val k1 = 0.8 * c0 - val k2 = (1 - k1 / cMid) - - val t = (C - k0) / (k1 + k2 * (C - k0)) - t * 0.8 - } else { - val k0 = cMid - val k1 = 0.2 * cMid * cMid * 1.25 * 1.25 / c0 - val k2 = (1 - (k1) / (cMax - cMid)) - - val t = (C - k0) / (k1 + k2 * (C - k0)) - 0.8 + 0.2 * t - } - val l = toe(L) - return ColorOKHSLa( - h * 360.0, - if (s == s) s else 0.0, - if (l == l) l else 0.0, - c.alpha - ) - } - } - - - override fun toRGBa(): ColorRGBa { - if (l == 0.0 || l == 1.0) { - return ColorRGBa(l, l, l, alpha, Linearity.SRGB) - } - val a_ = cos(2 * PI * h / 360.0) - val b_ = sin(2 * PI * h / 360.0) - val L = toeInv(l) - - val Cs = get_Cs(L, a_, b_) - val C_0 = Cs[0] - val C_mid = Cs[1] - val C_max = Cs[2] - - val C = if (s < 0.8) { - val t = 1.25 * s - val k_0 = 0.0 - val k_1 = 0.8 * C_0 - val k_2 = (1 - k_1 / C_mid) - k_0 + t * k_1 / (1 - k_2 * t) - } else { - val t = 5 * (s - 0.8) - val k_0 = C_mid - val k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0 - val k_2 = (1 - (k_1) / (C_max - C_mid)) - k_0 + t * k_1 / (1 - k_2 * t) - } - - // If we would only use one of the Cs: - //C = s*C_0; - //C = s*1.25*C_mid; - //C = s*C_max; - - return ColorOKLABa( - if (L == L) L else 0.0, - if (C == C) C * a_ else 0.0, - if (C == C) C * b_ else 0.0, - alpha - ).toRGBa().toSRGB() - } - - override val hue: Double - get() = h - - override fun withHue(hue: Double): ColorOKHSLa = copy(h = hue) - - override fun opacify(factor: Double): ColorOKHSLa = copy(alpha = alpha * factor) - override val saturation: Double - get() = s - - override fun withSaturation(saturation: Double): ColorOKHSLa = copy(s = saturation) - - override fun shade(factor: Double): ColorOKHSLa = copy(l = l * factor) - - override fun minus(right: ColorOKHSLa) = - copy(h = h - right.h, s = s - right.s, l = l - right.l, alpha = alpha - right.alpha) - - override fun plus(right: ColorOKHSLa) = - copy(h = h + right.h, s = s + right.s, l = l + right.l, alpha = alpha + right.alpha) - - override fun times(scale: Double): ColorOKHSLa = - copy(h = h * scale, s = s * scale, l = l * scale, alpha = alpha * scale) - - override fun mix(other: ColorOKHSLa, factor: Double): ColorOKHSLa { - val sx = factor.coerceIn(0.0, 1.0) - return ColorOKHSLa( - mixAngle(h, other.h, sx), - (1.0 - sx) * s + sx * other.s, - (1.0 - sx) * l + sx * other.l, - (1.0 - sx) * alpha + sx * other.alpha - ) - } - - override fun toVector4(): Vector4 = Vector4(h, s, l, alpha) -} - -fun ColorRGBa.toOKHSLa(): ColorOKHSLa = ColorOKHSLa.fromColorRGBa(this) \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorOKHSVa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorOKHSVa.kt deleted file mode 100644 index 6fa61443..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorOKHSVa.kt +++ /dev/null @@ -1,150 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import org.openrndr.math.mixAngle -import kotlin.jvm.JvmRecord -import kotlin.math.* - -/** - * Represents a color in the OKHSVa color model. - * - * The OKHSVa color model is derived from OKLABa and provides a perceptually uniform representation - * of colors using hue (h), saturation (s), value (v), and alpha (opacity). - * - * This class supports operations and transformations such as conversion to and from RGBa, - * hue shifting, saturation adjustment, shading, and algebraic operations like addition, subtraction, - * and scaling. It is ideal for working with colors in contexts requiring accurate color mixing - * and perceptual results. - * - * @property h Hue value in degrees (0.0 - 360.0), representing the color's angle on the color wheel. - * @property s Saturation value (0.0 - 1.0), representing the intensity or purity of the color. - * @property v Value (0.0 - 1.0), representing the color's brightness. - * @property alpha Opacity value (0.0 - 1.0), with 1.0 being fully opaque. - */ -@Suppress("LocalVariableName") -@Serializable -@JvmRecord -data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, override val alpha: Double = 1.0) : - ColorModel, - HueShiftableColor, - SaturatableColor, - ShadableColor, - AlgebraicColor { - - companion object { - fun fromColorRGBa(c: ColorRGBa): ColorOKHSVa { - val lab = c.toOKLABa() - var C = sqrt(lab.a * lab.a + lab.b * lab.b) - val a_ = if (C != 0.0) lab.a / C else 0.0 - val b_ = if (C != 0.0) lab.b / C else 0.0 - - var L = lab.l - val h = 0.5 + 0.5 * atan2(-lab.b, -lab.a) / PI - - val ST_max = get_ST_max(a_, b_) - val S_max = ST_max[0] - val S_0 = 0.5 - val T = ST_max[1] - val k = if (S_max != 0.0) (1 - S_0 / S_max) else 0.0 - - val t = T / (C + L * T) - val L_v = t * L - val C_v = t * C - - val L_vt = toeInv(L_v) - val C_vt = C_v * L_vt / L_v - - val rgb_scale = ColorOKLABa(L_vt, a_ * C_vt, b_ * C_vt, c.alpha).toRGBa().toLinear() - val scale_L = (1.0 / (max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0.0))).pow(1.0 / 3.0) - - L /= scale_L - C /= scale_L - - C = C * toe(L) / L - L = toe(L) - - val v = L / L_v - val s = (S_0 + T) * C_v / ((T * S_0) + T * k * C_v) - - return ColorOKHSVa(h * 360.0, if (s == s) s else 0.0, if (v == v) v else 0.0, c.alpha) - } - } - - override fun toRGBa(): ColorRGBa { - val a_ = cos(2 * PI * h / 360.0) - val b_ = sin(2 * PI * h / 360.0) - - val ST_max = get_ST_max(a_, b_) - val S_max = ST_max[0] - val S_0 = 0.5 - val T = ST_max[1] - val k = 1 - S_0 / S_max - - val L_v = 1 - s * S_0 / (S_0 + T - T * k * s) - val C_v = s * T * S_0 / (S_0 + T - T * k * s) - - var L = v * L_v - var C = v * C_v - - // to present steps along the way - //L = v; - //C = v*s*S_max; - //L = v*(1 - s*S_max/(S_max+T)); - //C = v*s*S_max*T/(S_max+T); - - val L_vt = toeInv(L_v) - val C_vt = C_v * L_vt / L_v - - val L_new = toeInv(L) // * L_v/L_vt; - C = C * L_new / L - L = L_new - - val rgb_scale = - ColorOKLABa(L_vt, a_ * C_vt, b_ * C_vt, alpha).toRGBa().toLinear()// oklab_to_linear_srgb(L_vt,a_*C_vt,b_*C_vt); - val scale_L = (1.0 / (max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0.0))).pow(1.0 / 3.0) - - // remove to see effect without rescaling - L *= scale_L - C *= scale_L - - return ColorOKLABa( - if (L == L) L else 0.0, - if (C == C) C * a_ else 0.0, - if (C == C) C * b_ else 0.0, - alpha - ).toRGBa().toSRGB() - } - - override val hue: Double - get() = h - - override fun withHue(hue: Double): ColorOKHSVa = copy(h = hue) - - override fun opacify(factor: Double): ColorOKHSVa = copy(alpha = alpha * factor) - override val saturation: Double - get() = s - override fun withSaturation(saturation: Double): ColorOKHSVa = copy(s = saturation) - - override fun shade(factor: Double): ColorOKHSVa = copy(v = v * factor) - override fun minus(right: ColorOKHSVa) = - copy(h = h - right.h, s = s - right.s, v = v - right.v, alpha = alpha - right.alpha) - override fun plus(right: ColorOKHSVa) = - copy(h = h + right.h, s = s + right.s, v = v + right.v, alpha = alpha + right.alpha) - override fun times(scale: Double): ColorOKHSVa = copy(h = h * scale, s = s * scale, v = v * scale, alpha = alpha * scale) - - override fun mix(other: ColorOKHSVa, factor: Double): ColorOKHSVa { - val sx = factor.coerceIn(0.0, 1.0) - return ColorOKHSVa( - mixAngle(h, other.h, sx), - (1.0 - sx) * s + sx * other.s, - (1.0 - sx) * v + sx * other.v, - (1.0 - sx) * alpha + sx * other.alpha - ) - } - - override fun toVector4(): Vector4 = Vector4(h, s, v, alpha) -} - -fun ColorRGBa.toOKHSVa(): ColorOKHSVa = ColorOKHSVa.fromColorRGBa(this) \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorOKLABa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorOKLABa.kt deleted file mode 100644 index 6267e83c..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorOKLABa.kt +++ /dev/null @@ -1,86 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import kotlin.jvm.JvmRecord -import kotlin.math.abs -import kotlin.math.pow -import kotlin.math.sign - - -/** - * Represents a color in the OKLAB color space with an optional alpha (transparency) value. - * OKLAB is a perceptual color space designed to represent colors in a way that aligns - * with human visual perception, offering an alternative to traditional color spaces like RGB. - * - * @property l The lightness component of the color. A value between 0 (black) and 1 (white). - * @property a The 'a' component in the OKLAB color space, representing the first chromatic axis. - * @property b The 'b' component in the OKLAB color space, representing the second chromatic axis. - * @property alpha The alpha (opacity) value of the color. A value between 0.0 (completely transparent) and 1.0 (completely opaque). - */ -@Suppress("LocalVariableName") -@Serializable -@JvmRecord -data class ColorOKLABa(val l: Double, val a: Double, val b: Double, override val alpha: Double = 1.0) : - ColorModel, - ShadableColor, - LuminosityColor, - AlgebraicColor { - - companion object { - fun fromRGBa(rgba: ColorRGBa): ColorOKLABa { - // based on https://bottosson.github.io/posts/oklab/ - val c = rgba.toLinear() - val l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b - val m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b - val s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b - - val lnl = abs(l).pow(1.0 / 3.0) * sign(l) - val mnl = abs(m).pow(1.0 / 3.0) * sign(m) - val snl = abs(s).pow(1.0 / 3.0) * sign(s) - - - val L = 0.2104542553 * lnl + 0.7936177850 * mnl - 0.0040720468 * snl - val a = 1.9779984951 * lnl - 2.4285922050 * mnl + 0.4505937099 * snl - val b = 0.0259040371 * lnl + 0.7827717662 * mnl - 0.8086757660 * snl - - return ColorOKLABa(L, a, b, c.alpha) - } - } - - override fun toRGBa(): ColorRGBa { - // based on https://bottosson.github.io/posts/oklab/ - val lnl = l + 0.3963377774 * a + 0.2158037573 * b - val mnl = l - 0.1055613458 * a - 0.0638541728 * b - val snl = l - 0.0894841775 * a - 1.2914855480 * b - - val l = lnl * lnl * lnl - val m = mnl * mnl * mnl - val s = snl * snl * snl - - return ColorRGBa( - 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, - -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, - -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s, - alpha, - Linearity.LINEAR - ) - } - - fun toOKLCHa() = ColorOKLCHa.fromColorOKLABa(this) - - override fun shade(factor: Double) = ColorOKLABa(l * factor, a, b, alpha) - override fun opacify(factor: Double) = ColorOKLABa(l, a, b, alpha * factor) - override fun minus(right: ColorOKLABa) = ColorOKLABa(l - right.l, a - right.a, b - right.b, alpha - right.alpha) - override fun plus(right: ColorOKLABa) = ColorOKLABa(l + right.l, a + right.a, b + right.b, alpha + right.alpha) - override fun times(scale: Double) = ColorOKLABa(l * scale, a * scale, b * scale, alpha * scale) - - override fun toVector4() = Vector4(l, a, b, alpha) - override val luminosity: Double - get() = l * 100.0 - - override fun withLuminosity(luminosity: Double): ColorOKLABa = copy(l = luminosity / 100.0) -} - -fun ColorRGBa.toOKLABa() = ColorOKLABa.fromRGBa(this) \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorOKLCHa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorOKLCHa.kt deleted file mode 100644 index 1451b4fb..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorOKLCHa.kt +++ /dev/null @@ -1,81 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.* -import kotlin.jvm.JvmRecord -import kotlin.math.* - - -/** - * Represents a color in the OKLCH color space, which is based on the OKLab color space with added polar coordinates for chroma and hue. - * - * @property l Lightness of the color. Range: 0.0 (black) to 1.0 (white). - * @property c Chroma, representing color intensity. Typically non-negative. - * @property h Hue angle in degrees. Range: 0.0 to 360.0. - * @property alpha Opacity of the color. Range: 0.0 (fully transparent) to 1.0 (fully opaque). Default is 1.0. - */ -@Serializable -@JvmRecord -data class ColorOKLCHa(val l: Double, val c: Double, val h: Double, override val alpha: Double = 1.0) : - ColorModel, - ShadableColor, - ChromaColor, - HueShiftableColor, - LuminosityColor, - AlgebraicColor { - - companion object { - fun fromColorOKLABa(oklaba: ColorOKLABa): ColorOKLCHa { - val l = oklaba.l - val c = sqrt(oklaba.a * oklaba.a + oklaba.b * oklaba.b) - var h = atan2(oklaba.b, oklaba.a) - - if (h < 0) { - h += PI * 2 - } - h = h.asDegrees - return ColorOKLCHa(l, c, h, oklaba.alpha) - } - } - - override fun opacify(factor: Double) = copy(alpha = alpha * factor) - override fun shade(factor: Double) = copy(l = l * factor) - - override fun plus(right: ColorOKLCHa) = copy(l = l + right.l, c = c + right.c, h = h + right.h, alpha = alpha + right.alpha) - override fun minus(right: ColorOKLCHa) = copy(l = l - right.l, c = c - right.c, h = h - right.h, alpha = alpha - right.alpha) - override fun times(scale: Double) = copy(l = l * scale, c = c * scale, h = h * scale, alpha = alpha * scale) - override fun mix(other: ColorOKLCHa, factor: Double) = mix(this, other, factor) - - fun toOKLABa(): ColorOKLABa { - val a = c * cos(h.asRadians) - val b = c * sin(h.asRadians) - return ColorOKLABa(l, a, b, alpha = this.alpha) - } - - override fun toRGBa(): ColorRGBa = toOKLABa().toRGBa() - override fun toVector4(): Vector4 = Vector4(l, c, h, alpha) - override val chroma: Double - get() = c * 100.0 - override fun withChroma(chroma: Double): ColorOKLCHa = copy(c = chroma / 100.0) - override val hue: Double - get() = h - - override fun withHue(hue: Double): ColorOKLCHa = copy(h = hue) - override val luminosity: Double - get() = l * 100.0 - - override fun withLuminosity(luminosity: Double): ColorOKLCHa = copy(l = luminosity / 100.0) -} - -fun mix(left: ColorOKLCHa, right: ColorOKLCHa, x: Double): ColorOKLCHa { - val sx = x.coerceIn(0.0, 1.0) - return ColorOKLCHa( - (1.0 - sx) * left.l + sx * right.l, - (1.0 - sx) * left.c + sx * right.c, - mixAngle(left.h, right.h, sx), - (1.0 - sx) * left.alpha + sx * right.alpha - ) -} - -fun ColorRGBa.toOKLCHa() = ColorOKLABa.fromRGBa(this).toOKLCHa() diff --git a/orx-color/src/commonMain/kotlin/spaces/ColorXSLUVa.kt b/orx-color/src/commonMain/kotlin/spaces/ColorXSLUVa.kt deleted file mode 100644 index f7b6a01c..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/ColorXSLUVa.kt +++ /dev/null @@ -1,85 +0,0 @@ -package org.openrndr.extra.color.spaces - -import kotlinx.serialization.Serializable -import org.openrndr.color.* -import org.openrndr.math.Vector4 -import org.openrndr.math.map -import org.openrndr.math.mixAngle -import kotlin.jvm.JvmRecord - -/** - * Represents a color in the XSLUV color space with an optional alpha transparency value. - * XSLUV is a cylindrical representation of the HSLUV color space using an alternative X coordinate - * instead of the standard hue. It provides a perceptually uniform color representation. - * - * @property x The X coordinate representing the hue variation in the XSLUV color space. - * @property s The saturation of the color in the XSLUV color space. - * @property l The luminance of the color in the XSLUV color space. - * @property alpha The alpha transparency value of the color, ranging from 0.0 to 1.0. Defaults to 1.0. - */ -@Serializable -@JvmRecord -data class ColorXSLUVa(val x: Double, val s: Double, val l: Double, override val alpha: Double = 1.0) : - ColorModel, - HueShiftableColor, - SaturatableColor, - ShadableColor, - AlgebraicColor { - - override val hue: Double - get() = x - override fun withHue(hue: Double): ColorXSLUVa = copy(x = hue) - - override fun shade(factor: Double) = copy(l = l * factor) - override val saturation: Double - get() = s - - override fun withSaturation(saturation: Double): ColorXSLUVa = copy(s = saturation) - - override fun toRGBa(): ColorRGBa = toHSLUVa().toRGBa() - - fun toHSLUVa(): ColorHSLUVa = ColorHSLUVa(xToHue(x), s, l, alpha) - - override fun opacify(factor: Double) = copy(alpha = alpha * factor) - - override fun minus(right: ColorXSLUVa) = - copy(x = x - right.x, s = s - right.s, l = l - right.l, alpha = alpha - right.alpha) - - override fun plus(right: ColorXSLUVa) = - copy(x = x + right.x, s = s + right.s, l = l + right.l, alpha = alpha + right.alpha) - - override fun times(scale: Double) = copy(x = x * scale, s = s * scale, l = l * scale, alpha = alpha * scale) - - override fun mix(other: ColorXSLUVa, factor: Double) = mix(this, other, factor) - - override fun toVector4(): Vector4 = Vector4(x, s, l, alpha) -} - -fun xToHue(x: Double): Double { - @Suppress("NAME_SHADOWING") val x = x.mod(360.0) - return if (0.0 <= x && x < 60.0) { - x.map(0.0, 60.0, 0.0, 35.0) - } else if (60.0 <= x && x < 120.0) { - x.map(60.0, 120.0, 35.0, 60.0) - } else if (120.0 <= x && x < 180.0) { - x.map(120.0, 180.0, 60.0, 135.0) - } else if (180.0 <= x && x < 240.0) { - x.map(180.0, 240.0, 135.0, 225.0) - } else if (240.0 <= x && x < 300.0) { - x.map(240.0, 300.0, 225.0, 275.0) - } else { - x.map( 300.0, 360.0, 275.0, 360.0) - } -} - -fun mix(left: ColorXSLUVa, right: ColorXSLUVa, x: Double): ColorXSLUVa { - val sx = x.coerceIn(0.0, 1.0) - return ColorXSLUVa( - mixAngle(left.x, right.x, sx), - (1.0 - sx) * left.s + sx * right.s, - (1.0 - sx) * left.l + sx * right.l, - (1.0 - sx) * left.alpha + sx * right.alpha - ) -} - -fun ColorRGBa.toXSLUVa() = toHSLUVa().toXSLUVa() diff --git a/orx-color/src/commonMain/kotlin/spaces/OKHelpers.kt b/orx-color/src/commonMain/kotlin/spaces/OKHelpers.kt deleted file mode 100644 index adfabfb3..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/OKHelpers.kt +++ /dev/null @@ -1,281 +0,0 @@ -@file:Suppress("FunctionName", "LocalVariableName") - -package org.openrndr.extra.color.spaces - - -import kotlin.math.max -import kotlin.math.min -import kotlin.math.pow -import kotlin.math.sqrt - -// verbatim copies of https://github.com/bottosson/bottosson.github.io/blob/master/misc/colorpicker/colorconversion.js - -internal fun max(a: Double, b: Double, c: Double, d: Double): Double { - return max(max(a, b), max(c, d)) -} - -/** - * Computes a modified version of the Toe mapping function, used in color space transformations. - * - * @param x The input value for the function, representing a parameter in the transformation process. - * @return The transformed value after applying the Toe mapping function. - */ -fun toe(x: Double): Double { - val k1 = 0.206 - val k2 = 0.03 - val k3 = (1 + k1) / (1 + k2) - - val d = (k3 * x - k1) * (k3 * x - k1) + 4 * k2 * k3 * x - - return 0.5 * (k3 * x - k1 + sqrt(d.coerceAtLeast(0.0))) -} - -/** - * Computes the toe inverse transformation of a given input value based on specific constants. - * This function is typically used for calculations involving perceptual transformations - * or non-linear scaling in color spaces or other mathematical models. - * - * @param x The input value for which the toe inverse transformation is calculated. - * @return A transformed value based on the toe inverse function. - */ -fun toeInv(x: Double): Double { - val k1 = 0.206 - val k2 = 0.03 - val k3 = (1 + k1) / (1 + k2) - return (x * x + k1 * x) / (k3 * (x + k2)) -} - -internal fun compute_max_saturation(a: Double, b: Double): Double { - // Max saturation will be when one of r, g or b goes below zero. - - // Select different coefficients depending on which component goes below zero first - val k0: Double - val k1: Double - val k2: Double - val k3: Double - val k4: Double - val wl: Double - val wm: Double - val ws: Double - - if (-1.88170328 * a - 0.80936493 * b > 1) { - // Red component - k0 = +1.19086277; k1 = +1.76576728; k2 = +0.59662641; k3 = +0.75515197; k4 = +0.56771245 - wl = +4.0767416621; wm = -3.3077115913; ws = +0.2309699292 - } else if (1.81444104 * a - 1.19445276 * b > 1) { - // Green component - k0 = +0.73956515; k1 = -0.45954404; k2 = +0.08285427; k3 = +0.12541070; k4 = +0.14503204 - wl = -1.2684380046; wm = +2.6097574011; ws = -0.3413193965 - } else { - // Blue component - k0 = +1.35733652; k1 = -0.00915799; k2 = -1.15130210; k3 = -0.50559606; k4 = +0.00692167 - wl = -0.0041960863; wm = -0.7034186147; ws = +1.7076147010 - } - - // Approximate max saturation using a polynomial: - val S = k0 + k1 * a + k2 * b + k3 * a * a + k4 * a * b - - // Do one step Halley's method to get closer - // this gives an error less than 10e6, except for some blue hues where the dS/dh is close to infinite - // this should be sufficient for most applications, otherwise do two/three steps - - val k_l = +0.3963377774 * a + 0.2158037573 * b - val k_m = -0.1055613458 * a - 0.0638541728 * b - val k_s = -0.0894841775 * a - 1.2914855480 * b - - return run { - val l_ = 1 + S * k_l - val m_ = 1 + S * k_m - val s_ = 1 + S * k_s - - val l = l_ * l_ * l_ - val m = m_ * m_ * m_ - val s = s_ * s_ * s_ - - val l_dS = 3 * k_l * l_ * l_ - val m_dS = 3 * k_m * m_ * m_ - val s_dS = 3 * k_s * s_ * s_ - - val l_dS2 = 6 * k_l * k_l * l_ - val m_dS2 = 6 * k_m * k_m * m_ - val s_dS2 = 6 * k_s * k_s * s_ - - val f = wl * l + wm * m + ws * s - val f1 = wl * l_dS + wm * m_dS + ws * s_dS - val f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2 - - S - f * f1 / (f1 * f1 - 0.5 * f * f2) - } -} - -internal fun find_cusp(a: Double, b: Double): DoubleArray { - // First, find the maximum saturation (saturation S = C/L) - val S_cusp = compute_max_saturation(a, b) - val rgb_at_max = ColorOKLABa(1.0, S_cusp * a, S_cusp * b).toRGBa().toLinear() - val L_cusp = (1.0 / max(max(rgb_at_max.r, rgb_at_max.g), rgb_at_max.b)).pow(1.0 / 3.0) - val C_cusp = L_cusp * S_cusp - - return doubleArrayOf(L_cusp, C_cusp) -} - -internal fun get_ST_max(a: Double, b: Double, cusp: DoubleArray? = null): DoubleArray { - @Suppress("NAME_SHADOWING") val cusp = cusp ?: find_cusp(a, b) - - val L = cusp[0] - val C = cusp[1] - return doubleArrayOf(C / L, C / (1.0 - L)) -} - -fun get_ST_mid(a_: Double, b_: Double): DoubleArray { - val S = 0.11516993 + 1 / ( - +7.44778970 + 4.15901240 * b_ - + a_ * (-2.19557347 + 1.75198401 * b_ - + a_ * (-2.13704948 - 10.02301043 * b_ - + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_ - ))) - ) - - val T = 0.11239642 + 1 / ( - +1.61320320 - 0.68124379 * b_ - + a_ * (+0.40370612 + 0.90148123 * b_ - + a_ * (-0.27087943 + 0.61223990 * b_ - + a_ * (+0.00299215 - 0.45399568 * b_ - 0.14661872 * a_ - ))) - ) - - return doubleArrayOf(S, T) -} - -fun get_Cs(L: Double, a_: Double, b_: Double): DoubleArray { - val cusp = find_cusp(a_, b_) - - val C_max = find_gamut_intersection(a_, b_, L, 1.0, L, cusp) - val ST_max = get_ST_max(a_, b_, cusp) - - val S_mid = 0.11516993 + 1 / ( - +7.44778970 + 4.15901240 * b_ - + a_ * (-2.19557347 + 1.75198401 * b_ - + a_ * (-2.13704948 - 10.02301043 * b_ - + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_ - ))) - ) - - val T_mid = 0.11239642 + 1 / ( - +1.61320320 - 0.68124379 * b_ - + a_ * (+0.40370612 + 0.90148123 * b_ - + a_ * (-0.27087943 + 0.61223990 * b_ - + a_ * (+0.00299215 - 0.45399568 * b_ - 0.14661872 * a_ - ))) - ) - - val k: Double = C_max / min((L * ST_max[0]), (1 - L) * ST_max[1]) - - val C_mid: Double - run { - val C_a = L * S_mid - val C_b = (1 - L) * T_mid - - C_mid = (0.9 * k) * sqrt(sqrt(1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b)))) - } - - val C_0: Double - run { - val C_a = L * 0.4 - val C_b = (1 - L) * 0.8 - - C_0 = sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b))) - } - - return doubleArrayOf(C_0, C_mid, C_max) -} - -fun find_gamut_intersection( - a: Double, - b: Double, - L1: Double, - C1: Double, - L0: Double, - cusp: DoubleArray? = null -): Double { - @Suppress("NAME_SHADOWING") val cusp = cusp ?: find_cusp(a, b) - - - // Find the intersection for upper and lower half seprately - var t: Double - if (((L1 - L0) * cusp[1] - (cusp[0] - L0) * C1) <= 0) { - // Lower half - - t = cusp[1] * L0 / (C1 * cusp[0] + cusp[1] * (L0 - L1)) - } else { - // Upper half - - // First intersect with triangle - t = cusp[1] * (L0 - 1) / (C1 * (cusp[0] - 1) + cusp[1] * (L0 - L1)) - - // Then one step Halley's method - run { - val dL = L1 - L0 - val dC = C1 - - val k_l = +0.3963377774 * a + 0.2158037573 * b - val k_m = -0.1055613458 * a - 0.0638541728 * b - val k_s = -0.0894841775 * a - 1.2914855480 * b - - val l_dt = dL + dC * k_l - val m_dt = dL + dC * k_m - val s_dt = dL + dC * k_s; - - - // If higher accuracy is required, 2 or 3 iterations of the following block can be used: - { - val L = L0 * (1 - t) + t * L1 - val C = t * C1 - - val l_ = L + C * k_l - val m_ = L + C * k_m - val s_ = L + C * k_s - - val l = l_ * l_ * l_ - val m = m_ * m_ * m_ - val s = s_ * s_ * s_ - - val ldt = 3 * l_dt * l_ * l_ - val mdt = 3 * m_dt * m_ * m_ - val sdt = 3 * s_dt * s_ * s_ - - val ldt2 = 6 * l_dt * l_dt * l_ - val mdt2 = 6 * m_dt * m_dt * m_ - val sdt2 = 6 * s_dt * s_dt * s_ - - val r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1 - val r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt - val r2 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2 - - val u_r = r1 / (r1 * r1 - 0.5 * r * r2) - var t_r = -r * u_r - - val g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1 - val g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt - val g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2 - - val u_g = g1 / (g1 * g1 - 0.5 * g * g2) - var t_g = -g * u_g - - val b = -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s - 1 - val b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.7076147010 * sdt - val b2 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.7076147010 * sdt2 - - val u_b = b1 / (b1 * b1 - 0.5 * b * b2) - var t_b = -b * u_b - - t_r = if (u_r >= 0) t_r else 10e5 - t_g = if (u_g >= 0) t_g else 10e5 - t_b = if (u_b >= 0) t_b else 10e5 - - t += min(t_r, min(t_g, t_b)) - } - } - } - - return t -} diff --git a/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt b/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt deleted file mode 100644 index 290e1aac..00000000 --- a/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.* - -typealias RGB = ColorRGBa -typealias LAB = ColorLABa -typealias LUV = ColorLUVa -typealias HPLuv = ColorHPLUVa -typealias HSL = ColorHSLa -typealias HSV = ColorHSVa -typealias HSLuv = ColorHSLUVa -typealias OKLab = ColorOKLABa -typealias OKHSV = ColorOKHSVa -typealias OKHSL = ColorOKHSLa -typealias OKLCH = ColorOKLCHa -typealias XSL = ColorXSLa -typealias XSV = ColorXSVa -typealias XSLuv = ColorXSLUVa -typealias CIEXYZ = ColorXYZa -typealias LCHab = ColorLCHABa -typealias LCHuv = ColorLCHUVa \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/statistics/DeltaE.kt b/orx-color/src/commonMain/kotlin/statistics/DeltaE.kt deleted file mode 100644 index af6d3b33..00000000 --- a/orx-color/src/commonMain/kotlin/statistics/DeltaE.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.openrndr.extra.color.statistics - -import org.openrndr.color.ColorLABa -import org.openrndr.color.ConvertibleToColorRGBa -import org.openrndr.math.Vector3 - -/** - * Computes the CIE76 color difference (ΔE*76) between this color and another color. - * The method calculates the Euclidean distance between the two colors in the LAB color space. - * If either of the colors is not in LAB format, it will be converted to LAB before computation. - * - * @param other The second color to compare, which should implement the ConvertibleToColorRGBa interface. - * @return The calculated CIE76 color difference as a Double. - */ -fun T.deltaE76(other: T): Double { - return if (this is ColorLABa && other is ColorLABa) { - val tv = Vector3(l, a, b) - val ov = Vector3(other.l, other.a, other.b) - tv.distanceTo(ov) - } else { - val tLab = if (this is ColorLABa) this else this.toRGBa().toLABa() - val oLab = if (other is ColorLABa) other else other.toRGBa().toLABa() - tLab.deltaE76(oLab) - } -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/statistics/Histogram.kt b/orx-color/src/commonMain/kotlin/statistics/Histogram.kt deleted file mode 100644 index 3744c4cf..00000000 --- a/orx-color/src/commonMain/kotlin/statistics/Histogram.kt +++ /dev/null @@ -1,13 +0,0 @@ -@file:JvmName("HistogramJvm") -package org.openrndr.extra.color.statistics - -import org.openrndr.color.ColorRGBa -import kotlin.jvm.JvmName - -internal fun ColorRGBa.binIndex(binCount: Int): Triple { - val rb = (r * binCount).toInt().coerceIn(0, binCount - 1) - val gb = (g * binCount).toInt().coerceIn(0, binCount - 1) - val bb = (b * binCount).toInt().coerceIn(0, binCount - 1) - return Triple(rb, gb, bb) -} - diff --git a/orx-color/src/commonMain/kotlin/tools/ChromaColorExtensions.kt b/orx-color/src/commonMain/kotlin/tools/ChromaColorExtensions.kt deleted file mode 100644 index ea344b8e..00000000 --- a/orx-color/src/commonMain/kotlin/tools/ChromaColorExtensions.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.openrndr.extra.color.tools - -import org.openrndr.color.ChromaColor -import org.openrndr.color.ConvertibleToColorRGBa - - -private fun binarySearchMax(min: Double, max: Double, start: Double, threshold: Double = 1E-5, f: (Double) -> Boolean): Double { - var low = min - var high = max - - var best = min - var mid = start - while (low <= high) { - - val res = f(mid) - - if (res) { - best = mid - low = mid - } else { - high = mid - } - - if (high - low < threshold) { - return best - } - mid = (low + high) / 2.0 - } - return best -} - -fun T.findMaxChroma(): Double - where T : ChromaColor, - T : ConvertibleToColorRGBa { - return binarySearchMax(0.0, 200.0, chroma, 1E-5) { - val c = withChroma(it).toRGBa() - !c.isOutOfGamut - } -} - -fun T.clipChroma(): T - where T : ChromaColor, - T : ConvertibleToColorRGBa { - - val maxChroma = findMaxChroma() - return withChroma(maxChroma) -} \ No newline at end of file diff --git a/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt b/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt deleted file mode 100644 index 3a4a41e9..00000000 --- a/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt +++ /dev/null @@ -1,198 +0,0 @@ -package org.openrndr.extra.color.tools - -import org.openrndr.color.* -import org.openrndr.extra.color.spaces.* - -/** - * Indicates whether the color is out of the RGB gamut. - * - * This property evaluates if the color's red, green, or blue components are outside - * the valid range of [0.0, 1.0], accounting for a slight tolerance in the negative range (-1E-3). - * Additionally, it checks whether the alpha component is outside the range [0.0, 1.0]. - * - * This property is commonly used in color manipulation functions to detect and handle - * out-of-gamut colors, which may require adjustments (e.g., clipping or chroma adjustment) - * to fit within a valid color space. - */ -val ColorRGBa.isOutOfGamut: Boolean - get() { - return (r !in -1E-3..1.0) || (g !in -1E-3..1.0) || (b !in -1E-3..1.0) || (alpha !in 0.0..1.0) - } - -/** - * Matches the linearity of the current `ColorRGBa` instance with another `ColorRGBa` instance. - * If the linearity of `other` matches that of the current instance, the current instance is returned. - * Otherwise, it converts the current instance to match the linearity of `other`. - * - * @param other The `ColorRGBa` instance whose linearity is to be matched. - * @return A `ColorRGBa` instance with the same linearity as the `other` color. - */ -fun ColorRGBa.matchLinearity(other: ColorRGBa): ColorRGBa { - return if (other.linearity.isEquivalent(linearity)) { - this - } else { - if (other.linearity.isEquivalent(Linearity.LINEAR)) { - toLinear() - } else if (other.linearity.isEquivalent(Linearity.SRGB)) { - toSRGB() - } else { - this - } - } -} - -inline fun ColorRGBa.hue(): Double - where T : HueShiftableColor, - T : ColorModel = convertTo().hue - -inline fun ColorRGBa.blendWith(other: ColorRGBa, steps: Int): Sequence - where T : AlgebraicColor, - T : ColorModel { - return sequence { - for (step in 0 until steps) { - yield(mixedWith(other, step / (steps - 1.0))) - } - } -} - - -/** - * Converts the current `ColorRGBa` instance to the specified color model type `T`. - * - * @return An instance of the specified color model type `T` after conversion. - * @throws IllegalStateException if the specified color model is not supported. - */ -inline fun > ColorRGBa.convertTo(): T { - val converted = when (T::class) { - ColorHSLa::class -> this.toHSLa() - ColorHSVa::class -> this.toHSVa() - ColorRGBa::class -> this - ColorHPLUVa::class -> this.toHPLUVa() - ColorHSLUVa::class -> this.toHSLUVa() - ColorOKLABa::class -> this.toOKLABa() - ColorOKLCHa::class -> this.toOKLCHa() - ColorOKHSLa::class -> this.toOKHSLa() - ColorOKHSVa::class -> this.toOKHSVa() - ColorLABa::class -> this.toLABa() - ColorLUVa::class -> this.toLUVa() - ColorLCHABa::class -> this.toLCHABa() - ColorLCHUVa::class -> this.toLCHUVa() - ColorOKHSLa::class -> this.toOKHSLa() - ColorXYZa::class -> this.toXYZa() - ColorXSLUVa::class -> this.toXSLUVa() - ColorXSVa::class -> this.toXSVa() - ColorXSLa::class -> this.toXSLa() - else -> error("color model ${T::class} not supported") - } - return converted as T -} - -inline fun ColorRGBa.withLuminosity(luminosity: Double): ColorRGBa - where T : LuminosityColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().withLuminosity(luminosity).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.luminosity(): Double - where T : LuminosityColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().luminosity - -inline fun ColorRGBa.mixLuminosity(luminosity: Double, factor: Double): ColorRGBa - where T : LuminosityColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().mixLuminosity(luminosity, factor).toRGBa().matchLinearity(this) - - -inline fun ColorRGBa.shadeLuminosity(factor: Double): ColorRGBa - where T : LuminosityColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().shadeLuminosity(factor).toRGBa().matchLinearity(this) - - -inline fun ColorRGBa.mixHue(hue: Double, factor: Double): ColorRGBa - where T : HueShiftableColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().mixHue(hue, factor).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.withHue(hue: Double): ColorRGBa - where T : HueShiftableColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().withHue(hue).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.mixSaturation(saturation: Double, factor: Double): ColorRGBa - where T : SaturatableColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().mixSaturation(saturation, factor).toRGBa().matchLinearity(this) - - -inline fun ColorRGBa.mixedWith(other: ColorRGBa, factor: Double): ColorRGBa - where T : AlgebraicColor, T : ColorModel { - val source = convertTo() - val target = other.convertTo() - return source.mix(target, factor).toRGBa().matchLinearity(this) -} - -inline fun ColorRGBa.mixChroma(chroma: Double, factor: Double): ColorRGBa - where T : ChromaColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().mixChroma(chroma, factor).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.withChroma(chroma: Double): ColorRGBa - where T : ChromaColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().withChroma(chroma).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.chroma(): Double - where T : ChromaColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().chroma - -inline fun ColorRGBa.modulateChroma(factor: Double): ColorRGBa - where T : ChromaColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - convertTo().modulateChroma(factor).toRGBa().matchLinearity(this) - - -/** - * Adjusts the saturation of the current `ColorRGBa` based on a given factor. - * - * @param T The target color model type that supports saturation adjustments. - * @param factor The saturation adjustment factor. A value of 1.0 keeps the saturation unchanged, - * values less than 1.0 decrease saturation, and values greater than 1.0 increase it. - * @return A new `ColorRGBa` instance with the adjusted saturation, maintaining the linearity of - * the original color. - */ -inline fun ColorRGBa.saturate(factor: Double): ColorRGBa - where T : SaturatableColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().saturate(factor).toRGBa().matchLinearity(this) - -/** - * Shifts the hue of the current `ColorRGBa` by the specified number of degrees. - * The method is only applicable to color models that support hue shifting and can be converted to `ColorRGBa`. - * - * @param degrees The amount of hue adjustment in degrees. Positive values shift the hue clockwise, while negative values shift it counterclockwise. - * @return A new `ColorRGBa` instance with the hue shifted by the specified degree, maintaining the same linearity as the input color. - */ -inline fun ColorRGBa.shiftHue(degrees: Double): ColorRGBa where - T : HueShiftableColor, - T : ColorModel, - T : ConvertibleToColorRGBa = convertTo().shiftHue(degrees).toRGBa().matchLinearity(this) - -inline fun ColorRGBa.clipChroma(): ColorRGBa - where T : ChromaColor, - T : ColorModel, - T : ConvertibleToColorRGBa = - - if (isOutOfGamut) { - convertTo().clipChroma().toRGBa().matchLinearity(this).clip() - } else { - this - } diff --git a/orx-color/src/commonTest/kotlin/ColorTest.kt b/orx-color/src/commonTest/kotlin/ColorTest.kt deleted file mode 100644 index 91eaf885..00000000 --- a/orx-color/src/commonTest/kotlin/ColorTest.kt +++ /dev/null @@ -1,5 +0,0 @@ -// keeping this file here will stop IntelliJ from showing warning in nested relative packages -/** - * orx-color - */ -package org.openrndr.extra.color diff --git a/orx-color/src/commonTest/kotlin/colormaps/TestSpectralZucconi6Colormap.kt b/orx-color/src/commonTest/kotlin/colormaps/TestSpectralZucconi6Colormap.kt deleted file mode 100644 index b11460f7..00000000 --- a/orx-color/src/commonTest/kotlin/colormaps/TestSpectralZucconi6Colormap.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.openrndr.extra.color.colormaps - -import io.kotest.matchers.shouldBe -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.math.Vector3 -import kotlin.test.Test - -class TestSpectralZucconi6Colormap { - - @Test - fun testSpectralZucconi6Vector() { - spectralZucconi6Vector(0.0) shouldBe Vector3(0.0, 0.0, 0.026075309353279508) - spectralZucconi6Vector(0.5) shouldBe Vector3(0.49637374891706215, 0.8472371726323733, 0.18366091774095827) - spectralZucconi6Vector(1.0) shouldBe Vector3(0.0, 0.0, 0.0) - spectralZucconi6Vector(-0.1) shouldBe Vector3(0.0, 0.0, 0.0) - spectralZucconi6Vector(1.1) shouldBe Vector3(0.0, 0.0, 0.0) - } - - @Test - fun testSpectralZucconi6() { - spectralZucconi6(0.0) shouldBe ColorRGBa(0.0, 0.0, 0.026075309353279508, linearity = Linearity.LINEAR) - spectralZucconi6(0.5) shouldBe ColorRGBa(0.49637374891706215, 0.8472371726323733, 0.18366091774095827, linearity = Linearity.LINEAR) - spectralZucconi6(1.0) shouldBe ColorRGBa(0.0, 0.0, 0.0, linearity = Linearity.LINEAR) - spectralZucconi6(-0.1) shouldBe ColorRGBa(0.0, 0.0, 0.0, linearity = Linearity.LINEAR) - spectralZucconi6(1.1) shouldBe ColorRGBa(0.0, 0.0, 0.0, linearity = Linearity.LINEAR) - } - -} diff --git a/orx-color/src/commonTest/kotlin/colormaps/TestTurboColormap.kt b/orx-color/src/commonTest/kotlin/colormaps/TestTurboColormap.kt deleted file mode 100644 index 9fff4521..00000000 --- a/orx-color/src/commonTest/kotlin/colormaps/TestTurboColormap.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.openrndr.extra.color.colormaps - -import io.kotest.matchers.shouldBe -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.math.Vector3 -import kotlin.test.Test - -class TestTurboColormap { - - @Test - fun testTurboColormapVector() { - turboColormapVector(0.0) shouldBe Vector3(0.13572138, 0.09140261, 0.1066733) - turboColormapVector(0.5) shouldBe Vector3(0.5885220621875007, 0.981864383125, 0.31316869781249856) - turboColormapVector(1.0) shouldBe Vector3(0.5658592099999993, 0.05038885999999998, -0.025520659999997974) - turboColormapVector(-0.1) shouldBe Vector3(0.13572138, 0.09140261, 0.1066733) - turboColormapVector(1.1) shouldBe Vector3(0.5658592099999993, 0.05038885999999998, -0.025520659999997974) - } - - @Test - fun testTurboColormap() { - turboColormap(0.0) shouldBe ColorRGBa(0.13572138, 0.09140261, 0.1066733, linearity = Linearity.LINEAR) - turboColormap(0.5) shouldBe ColorRGBa(0.5885220621875007, 0.981864383125, 0.31316869781249856, linearity = Linearity.LINEAR) - turboColormap(1.0) shouldBe ColorRGBa(0.5658592099999993, 0.05038885999999998, -0.025520659999997974, linearity = Linearity.LINEAR) - turboColormap(-0.1) shouldBe ColorRGBa(0.13572138, 0.09140261, 0.1066733, linearity = Linearity.LINEAR) - turboColormap(1.1) shouldBe ColorRGBa(0.5658592099999993, 0.05038885999999998, -0.025520659999997974, linearity = Linearity.LINEAR) - } - -} diff --git a/orx-color/src/commonTest/kotlin/mixing/TestSpectral.kt b/orx-color/src/commonTest/kotlin/mixing/TestSpectral.kt deleted file mode 100644 index b9dcb62e..00000000 --- a/orx-color/src/commonTest/kotlin/mixing/TestSpectral.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.openrndr.extra.color.mixing - -import org.openrndr.color.ColorRGBa - -import org.openrndr.extra.color.tools.matchLinearity -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -class TestSpectral { - @Test - fun testIdentity() { - val colors = listOf(ColorRGBa.RED, ColorRGBa.GREEN, ColorRGBa.BLUE) - - for (c in colors) { - val r = linearToReflectance(c) - assertEquals(38, r.size) - val xyz = reflectanceToXYZ(r) - val cp = xyz.toRGBa().matchLinearity(c) - assertTrue(cp.toVector4().distanceTo(c.toVector4()) < 5E-3) - } - } - - @Test - fun testSaunderson() { - val c = saundersonCorrection(10.15, 0.0, 0.0) - println(c) - } - -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/spaces/TestHSLUVa.kt b/orx-color/src/commonTest/kotlin/spaces/TestHSLUVa.kt deleted file mode 100644 index 264087b3..00000000 --- a/orx-color/src/commonTest/kotlin/spaces/TestHSLUVa.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.ColorRGBa -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestHSLUVa { - - @Test - fun testConversions() { - val testColors = listOf(ColorRGBa.RED, ColorRGBa.BLUE, ColorRGBa.GREEN, ColorRGBa.GRAY, ColorRGBa.YELLOW) - val error = (-1E-3 .. 1E-3) - testColors.forEach { - val testColor = it - val toColor = it.toHSLUVa() - val restoreColor = toColor.toRGBa().toSRGB() - assertTrue("color $testColor, $toColor, $restoreColor") { - testColor.r - restoreColor.r in error && testColor.g - restoreColor.g in error && testColor.b - restoreColor.b in error - } - } - } - -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/spaces/TestOKHSLa.kt b/orx-color/src/commonTest/kotlin/spaces/TestOKHSLa.kt deleted file mode 100644 index ff65c7e6..00000000 --- a/orx-color/src/commonTest/kotlin/spaces/TestOKHSLa.kt +++ /dev/null @@ -1,41 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.ColorRGBa -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestOKHSLa { - @Test - fun testConversions() { - val testColors = listOf(ColorRGBa.RED, ColorRGBa.BLUE, ColorRGBa.GREEN, ColorRGBa.GRAY, ColorRGBa.YELLOW) - val error = (-1E-5 .. 1E-5) - testColors.forEach { - val testColor = it - val toColor = it.toOKHSLa() - val restoreColor = toColor.toRGBa() - assertTrue("color $testColor, $toColor, $restoreColor") { - testColor.r - restoreColor.r in error && testColor.g - restoreColor.g in error && testColor.b - restoreColor.b in error - } - } - } - - @Test - fun testSaturationPersistence() { - val black = ColorRGBa.BLACK.toOKHSLa() - - assertTrue("resulting OKHSLa $black contains no NaNs") { - black.h == black.h && black.s == black.s && black.l == black.l - } - - val rgbBlack = black.toRGBa() - val white = ColorRGBa.WHITE.toOKHSLa() - val rgbWhite = white.toRGBa() - val epsilon = 1E-6 - assertTrue("resulting color $rgbWhite is white") { - rgbWhite.r in (1.0 - epsilon .. 1.0 + epsilon) && rgbWhite.g in (1.0 - epsilon .. 1.0 + epsilon) && rgbWhite.b in (1.0 - epsilon .. 1.0 + epsilon) - } - assertTrue("resulting color $rgbBlack is black") { - rgbBlack.r in (0.0 - epsilon .. 0.0 + epsilon) && rgbBlack.g in (0.0 - epsilon .. 0.0 + epsilon) && rgbBlack.b in (0.0 - epsilon .. 0.0 + epsilon) - } - } -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/spaces/TestOKHSVa.kt b/orx-color/src/commonTest/kotlin/spaces/TestOKHSVa.kt deleted file mode 100644 index 95629126..00000000 --- a/orx-color/src/commonTest/kotlin/spaces/TestOKHSVa.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.ColorRGBa -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestOKHSVa { - @Test - fun testConversions() { - val testColors = listOf(ColorRGBa.RED, ColorRGBa.BLUE, ColorRGBa.GREEN, ColorRGBa.GRAY, ColorRGBa.YELLOW) - val error = (-1E-5 .. 1E-5) - testColors.forEach { - val testColor = it - val toColor = it.toOKHSVa() - val restoreColor = toColor.toRGBa() - assertTrue("color $testColor, $toColor, $restoreColor") { - testColor.r - restoreColor.r in error && testColor.g - restoreColor.g in error && testColor.b - restoreColor.b in error - } - } - } - - @Test - fun testSaturationPersistence() { - val black = ColorRGBa.BLACK.toOKHSVa() - val rgbBlack = black.toRGBa() - - assertTrue("resulting OKHSVa $black contains no NaNs") { - black.h == black.h && black.s == black.s && black.v == black.v - } - - val white = ColorRGBa.WHITE.toOKHSVa() - val rgbWhite = white.toRGBa() - - assertTrue("resulting OKHSVa $white contains no NaNs") { - white.h == white.h && white.s == white.s && white.v == white.v - } - - val epsilon = 1E-6 - assertTrue("resulting color is white") { - rgbWhite.r in (1.0 - epsilon .. 1.0 + epsilon) && rgbWhite.g in (1.0 - epsilon .. 1.0 + epsilon) && rgbWhite.b in (1.0 - epsilon .. 1.0 + epsilon) - } - assertTrue("resulting color is black") { - rgbBlack.r in (0.0 - epsilon .. 0.0 + epsilon) && rgbBlack.g in (0.0 - epsilon .. 0.0 + epsilon) && rgbBlack.b in (0.0 - epsilon .. 0.0 + epsilon) - } - } - -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/spaces/TestOKLCHa.kt b/orx-color/src/commonTest/kotlin/spaces/TestOKLCHa.kt deleted file mode 100644 index 186564c3..00000000 --- a/orx-color/src/commonTest/kotlin/spaces/TestOKLCHa.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.tools.chroma -import org.openrndr.extra.color.tools.withLuminosity -import kotlin.test.Test - -class TestOKLCHa { - @Test - fun testLowLuminosity() { - val c = ColorRGBa.GREEN.withLuminosity(10.0) - println(c) - println(c.chroma()) - - - val g = ColorRGBa.GREEN.toOKLCHa() - val gl10 = g.withLuminosity(10.0) - val rgb10 = gl10.toRGBa() - println(gl10) - println(rgb10) - println(rgb10.toOKLCHa()) - - } -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/spaces/TestXSLUVa.kt b/orx-color/src/commonTest/kotlin/spaces/TestXSLUVa.kt deleted file mode 100644 index c95d95b2..00000000 --- a/orx-color/src/commonTest/kotlin/spaces/TestXSLUVa.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.openrndr.extra.color.spaces - -import org.openrndr.color.ColorRGBa -import kotlin.math.abs -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestXSLUVa { - - @Test - fun testHueConversions() { - for (i in 0 until 3600) { - val inputHue = i/10.0 - val x = hueToX(inputHue) - val recoveredHue = xToHue(x) - assertTrue( abs(recoveredHue-inputHue) < 1E-8, "$inputHue $recoveredHue") - } - } - - @Test - fun testConversions() { - val testColors = listOf(ColorRGBa.RED, ColorRGBa.BLUE, ColorRGBa.GREEN, ColorRGBa.GRAY, ColorRGBa.YELLOW) - val error = (-1E-3..1E-3) - testColors.forEach { - val testColor = it - val hsluvColor = it.toHSLUVa() - val xsluvColor = it.toXSLUVa() - - val restoredHsluvColor = xsluvColor.toHSLUVa() - - val dh = restoredHsluvColor.h - hsluvColor.h - val dl = restoredHsluvColor.l - hsluvColor.l - val ds = restoredHsluvColor.s - hsluvColor.s - - assertTrue(abs(dh) < 1E-7) - - } - } - -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/tools/TestChromaColorExtensions.kt b/orx-color/src/commonTest/kotlin/tools/TestChromaColorExtensions.kt deleted file mode 100644 index 944557ab..00000000 --- a/orx-color/src/commonTest/kotlin/tools/TestChromaColorExtensions.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.openrndr.extra.color.tools - -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.spaces.toOKLCHa -import kotlin.test.Test - -class TestChromaColorExtensions { - @Test - fun testFindMaxChroma() { - - run { - val i = ColorRGBa.BLUE.toLCHABa()//.withLuminosity(50.0) - val maxChroma = i.findMaxChroma() - println(i.chroma) - println(maxChroma) - } - run { - val i = ColorRGBa.BLUE.toOKLCHa()//.withLuminosity(50.0) - val maxChroma = i.findMaxChroma() - println(ColorRGBa.BLUE.isOutOfGamut) - println(i.chroma) - println(maxChroma) - println(i.toRGBa()) - } - - } - - -} \ No newline at end of file diff --git a/orx-color/src/commonTest/kotlin/tools/TestColorRGBaExtensions.kt b/orx-color/src/commonTest/kotlin/tools/TestColorRGBaExtensions.kt deleted file mode 100644 index be5f6cc1..00000000 --- a/orx-color/src/commonTest/kotlin/tools/TestColorRGBaExtensions.kt +++ /dev/null @@ -1,76 +0,0 @@ -package org.openrndr.extra.color.tools - -import org.openrndr.color.* -import org.openrndr.extra.color.spaces.* -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -class TestColorRGBaExtensions { - @Test - fun testShiftHue0() { - val seed = ColorRGBa.RED.shade(0.5) - val shifted = listOf( - seed.shiftHue(0.0), - seed.shiftHue(0.0), - seed.shiftHue(0.0), - seed.shiftHue(0.0) - ) - for (s in shifted) { - assertEquals(Linearity.SRGB, s.linearity) - assertTrue(seed.toVector4().distanceTo(s.toVector4()) < 1E-4) - } - } - - @Test - fun testShiftHue0Linear() { - val seed = ColorRGBa.RED.shade(0.5).toLinear() - val shifted = listOf( - seed.shiftHue(0.0), - seed.shiftHue(0.0), - seed.shiftHue(0.0), - seed.shiftHue(0.0) - ) - for (s in shifted) { - assertEquals(Linearity.LINEAR, s.linearity) - assertTrue(seed.toVector4().distanceTo(s.toVector4()) < 1E-4) - } - } - - @Test - fun testSaturate1() { - val seed = ColorRGBa.RED.shade(0.5) - val shifted = listOf( - seed.saturate(1.0), - seed.saturate(1.0) - ) - for (s in shifted) { - assertEquals(Linearity.SRGB, s.linearity) - assertTrue(seed.toVector4().distanceTo(s.toVector4()) < 1E-4) - } - } - - @Test - fun testSaturate1Linear() { - val seed = ColorRGBa.RED.shade(0.5).toLinear() - val shifted = listOf( - seed.saturate(1.0), - seed.saturate(1.0) - ) - for (s in shifted) { - assertEquals(Linearity.LINEAR, s.linearity) - assertTrue(seed.toVector4().distanceTo(s.toVector4()) < 1E-4) - } - } - - @Test - fun testMixedWith() { - val seed = ColorRGBa.RED - val mixed = listOf( - seed.mixedWith(ColorRGBa.BLUE, 0.5), - seed.mixedWith(ColorRGBa.BLUE, 0.5), - seed.mixedWith(ColorRGBa.BLUE, 0.5) - ) - } - -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt deleted file mode 100644 index 15e31526..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt +++ /dev/null @@ -1,62 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.palettes.analogous -import org.openrndr.extra.color.palettes.splitComplementary -import org.openrndr.extra.color.palettes.tetradic -import org.openrndr.extra.color.palettes.triadic -import org.openrndr.extra.color.presets.ORANGE -import org.openrndr.extra.color.spaces.* - -/** - * Demonstrates the creation of color palettes using various available methods - */ -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - // HueShiftableColor: - // HPLuv HSL HSV LCHab LCHuv XSL XSV XSLuv HSLuv OKHSL OKHSV OKLCH - val palette0 = RGB.PINK.analogous(360.0, 10) - val palette1 = RGB.RED.analogous(240.0, 3) - val palette2 = RGB.YELLOW.triadic() - val palette3 = RGB.CYAN.tetradic() - val palette4 = RGB.CYAN.tetradic(0.5) - val palette5 = RGB.ORANGE.splitComplementary(0.2, true) - extend { - drawer.clear(ColorRGBa.WHITE) - drawer.stroke = ColorRGBa.BLACK.opacify(0.25) - - palette0.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(100.0 + i * 50.0, 80.0, 50.0) - } - - palette1.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(100.0 + i * 50.0, 200.0, 50.0) - } - - palette2.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(440.0 + i * 50.0, 200.0, 50.0) - } - - palette3.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(100.0 + i * 50.0, 320.0, 50.0) - } - - palette4.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(400.0 + i * 50.0, 320.0, 50.0) - } - - palette5.forEachIndexed { i, c -> - drawer.fill = c - drawer.circle(100.0 + i * 50.0, 440.0, 50.0) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt deleted file mode 100644 index 5924948e..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt +++ /dev/null @@ -1,36 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.color.palettes.analogous -import org.openrndr.extra.color.spaces.HSLuv -import org.openrndr.extra.color.spaces.RGB -import org.openrndr.extra.color.tools.shadeLuminosity - -/** - * By default, generated palettes contain colors of varying hue - * but similar brightness and saturation. - * Here we alter the brightness of each color using .shade() for - * an increased dynamic range. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - val count = 8 - val palette = RGB.PINK.analogous(360.0, count).mapIndexed { i, c -> - c.shadeLuminosity((i + 1.0) / count) - }.reversed() - extend { - drawer.stroke = null - - palette.forEachIndexed { i, c -> - drawer.fill = c - drawer.rectangle( - 0.0, i * height / count.toDouble(), - width.toDouble(), height / count.toDouble() - ) - } - - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPlane01.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPlane01.kt deleted file mode 100644 index a6ef052f..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoColorPlane01.kt +++ /dev/null @@ -1,93 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.color.spaces.ColorOKLCHa -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 -import kotlin.math.cos - -/** - * Visualizes a plane of ColorOKLCH colors as small 3D spheres - * inside a 3D box. The plane represents all available hues and chromas. - * The luminosity used to create the colors is modulated over time - * with a slow sine wave. - * Instanced rendering is used to render 90 x 100 colored spheres, - * each with a unique position based on the RGB components of the color. - * - * Since the OKLCH color space is larger than the RGB space, some - * spheres would be outside the 3D box, but they are - * actually clipped to the walls. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val mesh = sphereMesh(8, 8, radius = 0.1) - - val instanceData = vertexBuffer( - vertexFormat { - attribute("instanceColor", VertexElementType.VECTOR4_FLOAT32) - attribute("instancePosition", VertexElementType.VECTOR3_FLOAT32) - }, - 90 * 100 - ) - println(extensions.size) - extend(Orbital()) - - extend { - drawer.clear(ColorRGBa.WHITE) - drawer.stroke = null - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - - instanceData.put { - for (hue in 0 until 360 step 4) { - for (chroma in 0 until 100 step 1) { - val lch = ColorOKLCHa(cos(seconds * 0.1) * 0.5 + 0.5, chroma / 100.0, hue.toDouble()) - val srgb = lch.toRGBa().toSRGB().clip() - write(srgb) - write(Vector3((srgb.r - 0.5) * 10.0, (srgb.g - 0.5) * 10.0, (srgb.b - 0.5) * 10.0)) - } - } - } - drawer.isolated { - drawer.shadeStyle = shadeStyle { - - vertexTransform = """ - x_position += i_instancePosition; - """.trimIndent() - fragmentTransform = """ - x_fill = vi_instanceColor; - """.trimIndent() - } - - drawer.vertexBufferInstances(listOf(mesh), listOf(instanceData), DrawPrimitive.TRIANGLES, 90 * 100) - } - - // Draw the edges of a 3D cube - drawer.stroke = ColorRGBa.BLACK.opacify(0.25) - drawer.strokeWeight = 10.0 - drawer.lineSegments( - listOf( - Vector3(-5.0, -5.0, -5.0), Vector3(5.0, -5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, 5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, 5.0, -5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, -5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, -5.0, 5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, 5.0, -5.0), Vector3(5.0, 5.0, 5.0), - - ) - ) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPlane02.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPlane02.kt deleted file mode 100644 index 27212b0a..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoColorPlane02.kt +++ /dev/null @@ -1,77 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.color.spaces.ColorOKLCHa -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 -import kotlin.math.cos - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val mesh = sphereMesh(8, 8, radius = 0.1) - - val instanceData = vertexBuffer( - vertexFormat { - attribute("instanceColor", VertexElementType.VECTOR4_FLOAT32) - attribute("instancePosition", VertexElementType.VECTOR3_FLOAT32) - }, - 100 * 100 - ) - extend(Orbital()) - extend { - drawer.clear(ColorRGBa.WHITE) - - drawer.stroke = null - - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - - instanceData.put { - for (lumo in 0 until 100 step 1) { - for (chroma in 0 until 100 step 1) { - val lch = ColorOKLCHa(lumo / 100.0, chroma / 100.0, cos(seconds * 0.1) * 360.0) - val srgb = lch.toRGBa().toSRGB().clip() - write(srgb) - write(Vector3((srgb.r - 0.5) * 10.0, (srgb.g - 0.5) * 10.0, (srgb.b - 0.5) * 10.0)) - } - } - } - drawer.isolated { - drawer.shadeStyle = shadeStyle { - vertexTransform = """ - x_position += i_instancePosition; - """.trimIndent() - fragmentTransform = """ - x_fill = vi_instanceColor; - """.trimIndent() - } - drawer.vertexBufferInstances(listOf(mesh), listOf(instanceData), DrawPrimitive.TRIANGLES, 90 * 100) - } - - drawer.stroke = ColorRGBa.BLACK.opacify(0.25) - drawer.strokeWeight = 10.0 - drawer.lineSegments( - listOf( - Vector3(-5.0, -5.0, -5.0), Vector3(5.0, -5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, 5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, 5.0, -5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, -5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, -5.0, 5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, 5.0, -5.0), Vector3(5.0, 5.0, 5.0), - ) - ) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorSequence01.kt b/orx-color/src/jvmDemo/kotlin/DemoColorSequence01.kt deleted file mode 100644 index d564e09b..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoColorSequence01.kt +++ /dev/null @@ -1,69 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.isolated -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.color.palettes.ColorSequence -import org.openrndr.extra.color.presets.MEDIUM_AQUAMARINE -import org.openrndr.extra.color.presets.ORANGE -import org.openrndr.extra.color.spaces.toOKLABa -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 - -/** - * A demo that demonstrates 3D objects with custom shading and color gradients. - * - * The application setup involves: - * - Configuring the application window dimensions. - * - Creating a color gradient using `ColorSequence` and converting it to a `ColorBuffer` for shading purposes. - * - Defining a 3D sphere mesh with specified resolution. - * - * The rendering process includes: - * - Setting up an orbital camera extension to provide an interactive 3D view. - * - Applying a custom fragment shader with a palette-based shading style. - * - Rendering a grid of 3D spheres, each transformed and rotated to create a dynamic pattern. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val cs = ColorSequence( - listOf( - 0.0 to ColorRGBa.PINK, - 0.25 to ColorRGBa.ORANGE.toOKLABa(), - 0.27 to ColorRGBa.WHITE.toOKLABa(), - 0.32 to ColorRGBa.BLUE, - 1.0 to ColorRGBa.MEDIUM_AQUAMARINE - ) - ) - val palette = cs.toColorBuffer(drawer, 256, 16) - val sphere = sphereMesh(sides = 48, segments = 48) - - extend(Orbital()) { - fov = 50.0 - eye = Vector3(0.0, 0.0, 13.0) - } - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - float d = normalize(va_normal).z; - x_fill = texture(p_palette, vec2(1.0-d, 0.0)); - """.trimIndent() - parameter("palette", palette) - } - for (j in -2..2) { - for (i in -2..2) { - drawer.isolated { - drawer.translate(i * 2.0, j * 2.0, 0.0) - drawer.rotate(Vector3.UNIT_Y, j * 30.0) - drawer.rotate(Vector3.UNIT_X, i * 30.0) - drawer.vertexBuffer(sphere, DrawPrimitive.TRIANGLES) - } - } - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoDeltaE.kt b/orx-color/src/jvmDemo/kotlin/DemoDeltaE.kt deleted file mode 100644 index 784cf1b9..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoDeltaE.kt +++ /dev/null @@ -1,37 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.spaces.toOKHSVa -import org.openrndr.extra.color.statistics.deltaE76 -import org.openrndr.math.Polar - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - extend { - drawer.clear(ColorRGBa.BLACK) - drawer.fill = null - drawer.stroke = ColorRGBa.WHITE.opacify(0.2) - for (i in 10 until 270 step 10) { - drawer.circle(drawer.bounds.center, i.toDouble()) - } - - drawer.stroke = null - - val startColor = ColorRGBa.RED.toOKHSVa().shiftHue(seconds * 36.0).toRGBa() - drawer.circles { - for (j in 99 downTo 0) { - for (i in 0 until 360 step 10) { - val color = startColor.toOKHSVa().shiftHue(i.toDouble()).saturate(j / 99.0).toRGBa() - val distance = color.deltaE76(startColor) - val p = Polar(seconds * 36.0 + i.toDouble(), distance).cartesian + drawer.bounds.center - fill = color - circle(p, 2.0) - } - } - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoFettePalette01.kt b/orx-color/src/jvmDemo/kotlin/DemoFettePalette01.kt deleted file mode 100644 index 45ffda96..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoFettePalette01.kt +++ /dev/null @@ -1,84 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.isolated -import org.openrndr.extra.color.fettepalette.ColorRamp -import org.openrndr.extra.color.fettepalette.Lamé -import org.openrndr.extra.color.fettepalette.generateColorRamp -import org.openrndr.math.Vector2 -import kotlin.random.Random - -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val total = 9 - - extend { - val ramp = generateColorRamp( - total = total, - centerHue = (mouse.position.x / width) * 360.0, - curveMethod = Lamé, - hueCycle = mouse.position.y / height, - curveAccent = 0.0, - offsetTint = 0.01, - offsetShade = 0.01, - tintShadeHueShift = 0.01, - offsetCurveModTint = 0.03, - offsetCurveModShade = 0.03, - minSaturationLight = Vector2.ZERO, - maxSaturationLight = Vector2.ONE, - useOK = true - ) - - fun rampSquare(ramp: ColorRamp, random: Random, position: Vector2, width: Double) { - drawer.isolated { - drawer.fill = ramp.baseColors.random(random).toRGBa() - drawer.stroke = null - drawer.rectangle(position, width, width) - - drawer.fill = ramp.lightColors.random(random).toRGBa() - drawer.rectangle(position + Vector2(width / 4.0, width / 4.0), width / 4.0, width / 2.0) - - val dc = ramp.darkColors.shuffled(random).take(2) - - drawer.fill = dc[0].toRGBa() - drawer.rectangle(position + Vector2(width / 2.0, width / 4.0), width / 4.0, width / 4.0) - - drawer.fill = dc[1].toRGBa() - drawer.rectangle(position + Vector2(width / 2.0, width / 2.0), width / 4.0, width / 4.0) - } - } - - - drawer.isolated { - for ((index, i) in ramp.lightColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 20.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - drawer.isolated { - for ((index, i) in ramp.baseColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 70.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - drawer.isolated { - for ((index, i) in ramp.darkColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 120.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - - val random = Random(seconds.toInt()) - rampSquare(ramp, random, Vector2(180.0, 180.0), 360.0) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoFettePalette02.kt b/orx-color/src/jvmDemo/kotlin/DemoFettePalette02.kt deleted file mode 100644 index f1287eba..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoFettePalette02.kt +++ /dev/null @@ -1,75 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.isolated -import org.openrndr.extra.color.fettepalette.ColorRamp -import org.openrndr.extra.color.fettepalette.ColorRampParameters -import org.openrndr.extra.color.fettepalette.generateColorRamp -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.addTo -import org.openrndr.math.Vector2 -import kotlin.random.Random - -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val gui = GUI() - val parameters = ColorRampParameters() - parameters.addTo(gui) - - extend(gui) - extend { - val ramp = generateColorRamp(parameters) - fun rampSquare(ramp: ColorRamp, random: Random, position: Vector2, width: Double) { - drawer.isolated { - drawer.fill = ramp.baseColors.random(random).toRGBa() - drawer.stroke = null - drawer.rectangle(position, width, width) - - drawer.fill = ramp.lightColors.random(random).toRGBa() - drawer.rectangle(position + Vector2(width / 4.0, width / 4.0), width / 4.0, width / 2.0) - - val dc = ramp.darkColors.shuffled(random).take(2) - - drawer.fill = dc[0].toRGBa() - drawer.rectangle(position + Vector2(width / 2.0, width / 4.0), width / 4.0, width / 4.0) - - drawer.fill = dc[1].toRGBa() - drawer.rectangle(position + Vector2(width / 2.0, width / 2.0), width / 4.0, width / 4.0) - } - } - - drawer.translate(200.0, 0.0) - - drawer.isolated { - for ((index, i) in ramp.lightColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 20.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - drawer.isolated { - for ((index, i) in ramp.baseColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 70.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - drawer.isolated { - for ((index, i) in ramp.darkColors.withIndex()) { - drawer.stroke = null - drawer.fill = i.toRGBa() - drawer.rectangle(20.0, 120.0, 50.0, 50.0) - drawer.translate(50.0, 0.0) - } - } - - val random = Random(seconds.toInt()) - rampSquare(ramp, random, Vector2(20.0, 180.0), 360.0) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoHSLUV01.kt b/orx-color/src/jvmDemo/kotlin/DemoHSLUV01.kt deleted file mode 100644 index 53a54873..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoHSLUV01.kt +++ /dev/null @@ -1,50 +0,0 @@ -// Draw rectangles shaded in RGB and HSLUV space - -import org.openrndr.application -import org.openrndr.color.ColorHSLa -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.isolated -import org.openrndr.draw.loadFont -import org.openrndr.extra.color.spaces.ColorHSLUVa -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 26.0) - extend { - drawer.stroke = null - drawer.clear(rgb(0.3)) - val s = mouse.position.x / width - val l = mouse.position.y / height - for (a in 0 until 360 step 12) { - val pos = Vector2(0.0, 110.0) - drawer.isolated { - translate(bounds.center) - rotate(a * 1.0) - - fill = ColorHSLUVa(a * 1.0, s, l).toRGBa().toSRGB() - rectangle(Rectangle(pos * 1.2, 40.0, 300.0)) - - fill = ColorHSLa(a * 1.0, s, l).toRGBa() - rectangle(Rectangle.fromCenter(pos, 30.0, 60.0)) - } - } - drawer.fontMap = font - drawer.fill = if (l > 0.8) ColorRGBa.BLACK else ColorRGBa.WHITE - drawer.text("HSLa", width * 0.48, height * 0.73) - drawer.text("HSLUVa", width * 0.8, height * 0.52) - drawer.text( - "hue: 0 to 360, " + - "saturation: ${String.format("%.02f", s)}, " + - "lightness: ${String.format("%.02f", l)}", - 30.0, height - 30.0 - ) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoHSLUV02.kt b/orx-color/src/jvmDemo/kotlin/DemoHSLUV02.kt deleted file mode 100644 index 140d37d3..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoHSLUV02.kt +++ /dev/null @@ -1,46 +0,0 @@ -// Visualize HSLUV color space by drawing a phyllotaxis pattern - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.spaces.toHSLUVa -import org.openrndr.math.Polar -import org.openrndr.math.Vector2 -import kotlin.math.sqrt - -fun main() = application { - configure { - width = 720 - height = 720 - } - - val g = Math.PI * 2.0 * (1.0 - 1.0 / 1.61803398875) - fun phyllotaxis(count: Int) = sequence { - for (i in 0 until count) { - yield(Polar(Math.toDegrees(i * 1.0), g * i)) - } - } - - program { - extend { - drawer.clear(ColorRGBa.GRAY) - val color = ColorRGBa.RED - val hc = color.toHSLUVa() - drawer.stroke = null - drawer.strokeWeight = 0.0 - - val count = 400 - val bobRadius = 20.0 - - for (i in phyllotaxis(count)) { - val h = i.theta - val s = i.radius / (count * g) - for (l in 9 downTo 0) { - val position = - i.cartesian / (count * g) * (width / 2.0 - bobRadius) + Vector2(width / 2.0, height / 2.0) - drawer.fill = hc.shiftHue(h).saturate(s).shade((9 - l) / 4.5).toRGBa().toSRGB() - drawer.circle(position, sqrt(s) * 20.0 * l / 9.0) - } - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoHueTools01.kt b/orx-color/src/jvmDemo/kotlin/DemoHueTools01.kt deleted file mode 100644 index 6ed5f060..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoHueTools01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.isolated -import org.openrndr.extra.color.spaces.OKHSV -import org.openrndr.extra.color.tools.mixHue -import org.openrndr.extra.color.tools.withHue - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - extend { - val seedColor = ColorRGBa.PINK - val targetHue = seconds * 100.0 - - val rows = 10 - val columns = 12 - - val cellWidth = width / columns.toDouble() - val cellHeight = height / rows.toDouble() - - drawer.stroke = null - for (j in 0 until 10) { - drawer.isolated { - for (i in 0 until columns) { - drawer.fill = seedColor - .withHue(i * 360.0 / columns) - .mixHue(targetHue, j / (rows.toDouble() - 1.0)) - drawer.rectangle(0.0, 0.0, cellWidth, cellHeight) - drawer.translate(cellWidth, 0.0) - } - } - drawer.translate(0.0, cellHeight) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoMixSpectral01.kt b/orx-color/src/jvmDemo/kotlin/DemoMixSpectral01.kt deleted file mode 100644 index 39918a7b..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoMixSpectral01.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.isolated -import org.openrndr.extra.color.mixing.mixSpectral -import org.openrndr.extra.color.spaces.OKHSV -import org.openrndr.extra.color.spaces.OKLab -import org.openrndr.extra.color.tools.saturate -import org.openrndr.extra.color.tools.shadeLuminosity -import org.openrndr.extra.color.tools.shiftHue - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - extend { - val a = ColorRGBa.BLUE.shiftHue(0.0).saturate(0.3).shadeLuminosity(0.3) - val b = ColorRGBa.BLUE.shiftHue(60.0).saturate(0.8) - - drawer.isolated { - for (i in 0 until 60) { - val c = mixSpectral(a, b, i / 59.0, 0.0, 0.0).toSRGB() - drawer.fill = c - drawer.stroke = null - drawer.rectangle(0.0, 0.0, width / 60.0, 1.0 * height) - - drawer.translate(width / 60.0, 0.0) - - } - } - drawer.translate(0.0, 0.5 * height / 60.0) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/DemoOKHSV01.kt b/orx-color/src/jvmDemo/kotlin/DemoOKHSV01.kt deleted file mode 100644 index c2054dcf..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoOKHSV01.kt +++ /dev/null @@ -1,36 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.extra.color.spaces.ColorOKHSLa -import org.openrndr.extra.color.spaces.ColorOKHSVa - -fun main() = application { - configure { - width = 720 - height = 160 - } - program { - extend { - drawer.clear(rgb(0.2)) - - val c = ColorRGBa.GREEN - val okhsv = ColorOKHSVa.fromColorRGBa(c) - val hsv = c.toHSVa() - val hsl = c.toHSLa() - val okhsl = ColorOKHSLa.fromColorRGBa(c) - - for (i in 0 until 36) { - drawer.fill = okhsv.shiftHue(i * 10.0).saturate(1.0).toRGBa() - drawer.rectangle(i * 10.0, 40.0, 10.0, 10.0) - drawer.fill = hsv.shiftHue(i * 10.0).saturate(1.0).toRGBa() - drawer.rectangle(i * 10.0, 60.0, 10.0, 10.0) - - drawer.fill = okhsl.shiftHue(i * 10.0).saturate(1.0).toRGBa() - drawer.rectangle(i * 10.0, 80.0, 10.0, 10.0) - drawer.fill = hsl.shiftHue(i * 10.0).saturate(1.0).toRGBa() - drawer.rectangle(i * 10.0, 100.0, 10.0, 10.0) - - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/DemoXSLUV01.kt b/orx-color/src/jvmDemo/kotlin/DemoXSLUV01.kt deleted file mode 100644 index 97a19c68..00000000 --- a/orx-color/src/jvmDemo/kotlin/DemoXSLUV01.kt +++ /dev/null @@ -1,59 +0,0 @@ -// Visualize XSLUV color space by drawing a recursively subdivided arcs - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.spaces.ColorXSLUVa -import org.openrndr.math.Polar -import org.openrndr.shape.contour - -fun main() = application { - configure { - width = 720 - height = 720 - } - - class Arc(val start: Double, val radius: Double, val length: Double, val height: Double) { - fun split(offset: Double = 0.0): List { - val hl = length / 2.0 - return listOf( - Arc(start, radius + offset, hl, height), - Arc(start + hl, radius + offset, hl, height) - ) - } - - val contour - get() = contour { - moveTo(Polar(start, radius).cartesian) - arcTo(radius, radius, length, false, true, Polar(start + length, radius).cartesian) - lineTo(Polar(start + length, radius + height).cartesian) - arcTo(radius + height, radius + height, length, false, false, Polar(start, radius + height).cartesian) - lineTo(anchor) - close() - } - } - - fun List.split(depth: Int): List = if (depth == 0) { - this - } else { - this + flatMap { it.split(it.height) }.split(depth - 1) - } - - program { - val arcs = (0..4).map { Arc(it * 90.0 - 45.0, 50.0, 90.0, 50.0) }.split(5) - - extend { - drawer.clear(ColorRGBa.GRAY) - val color = ColorRGBa.RED - drawer.stroke = ColorRGBa.BLACK - drawer.strokeWeight = 1.0 - drawer.translate(drawer.bounds.center) - val l = if (System.getProperty("takeScreenshot") == "true") 0.7 else mouse.position.y / height - val s = if (System.getProperty("takeScreenshot") == "true") 1.0 else mouse.position.x / width - for (arc in arcs) { - val xsluv = ColorXSLUVa(arc.start + arc.length / 2.0, s, l, 1.0) - drawer.fill = xsluv.toRGBa() - drawer.contour(arc.contour) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange01.kt b/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange01.kt deleted file mode 100644 index 4f761c83..00000000 --- a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange01.kt +++ /dev/null @@ -1,47 +0,0 @@ -package colorRange - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.palettes.rangeTo -import org.openrndr.extra.color.spaces.toHSLUVa -import org.openrndr.math.Vector2 -import org.openrndr.math.map -import org.openrndr.shape.Rectangle - -/** - * Comparison of color lists generated by interpolating from - * `PINK` to `BLUE` in six different color spaces. - */ -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val numColors = 10 - val colorLists = listOf( - ColorRGBa.PINK..ColorRGBa.BLUE.toHSVa() blend numColors, - ColorRGBa.PINK..ColorRGBa.BLUE blend numColors, - ColorRGBa.PINK..ColorRGBa.BLUE.toHSLUVa() blend numColors, - ColorRGBa.PINK..ColorRGBa.BLUE.toXSVa() blend numColors, - ColorRGBa.PINK..ColorRGBa.BLUE.toLUVa() blend numColors, - ColorRGBa.PINK..ColorRGBa.BLUE.toLCHUVa() blend numColors - ) - extend { - drawer.clear(ColorRGBa.WHITE) - drawer.stroke = null - colorLists.forEachIndexed { listId, colorList -> - val x = map(0.0, 2.0, - width * 0.2, width * 0.8, listId % 3.0) - val y = map(0.0, 1.0, - height * 0.3, height * 0.7, (listId / 3) * 1.0) - colorList.forEachIndexed { colorId, color -> - drawer.fill = color - drawer.rectangle( - Rectangle.fromCenter(Vector2(x, y), - 180.0 - colorId * 150.0 / numColors)) - } - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange02.kt b/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange02.kt deleted file mode 100644 index c604d898..00000000 --- a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange02.kt +++ /dev/null @@ -1,38 +0,0 @@ -package colorRange - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.color.palettes.colorSequence -import org.openrndr.extra.color.spaces.toHSLUVa - -/** - * Demonstrates how to create a `ColorSequence` containing three colors, one of them in the HSLUV color space. - * - * Each color in the sequence is assigned a normalized position: in this program, one at the start (0.0), - * one in the middle (0.5) and one at the end (1.0). - * - * The `ColorSpace.blend()` method is used to get a list with 18 interpolated `ColorRGBa` colors, - * then those colors are drawn as vertical rectangles covering the whole window. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - extend { - val cs = colorSequence( - 0.0 to ColorRGBa.PINK, - 0.5 to ColorRGBa.BLUE, - 1.0 to ColorRGBa.PINK.toHSLUVa() // <-- note this color is in HSLUV - ) - - for (c in cs blend (width / 40)) { - drawer.fill = c - drawer.stroke = null - drawer.rectangle(0.0, 0.0, 40.0, height.toDouble()) - drawer.translate(40.0, 0.0) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange03.kt b/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange03.kt deleted file mode 100644 index 1ce39264..00000000 --- a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange03.kt +++ /dev/null @@ -1,60 +0,0 @@ -package colorRange - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.color.palettes.rangeTo -import org.openrndr.extra.color.spaces.* - -/** - * This program creates color interpolations from `ColorRGBa.BLUE` to - * `ColorRGBa.PINK` in 25 steps in multiple color spaces. - * - * The window height is adjusted based on the number of interpolations to show. - * - * The resulting gradients differ in saturation and brightness and apparently include more - * `BLUE` or more `PINK` depending on the chosen color space. - */ -fun main() = application { - val colorA = ColorRGBa.BLUE - val colorB = ColorRGBa.PINK - - val stepCount = 25 - - val allSteps = listOf( - "RGB" to (colorA..colorB blend stepCount), - "RGB linear" to (colorA.toLinear()..colorB.toLinear() blend stepCount), - "HSV" to (colorA..colorB.toHSVa() blend stepCount), - "Lab" to (colorA.toLABa()..colorB.toLABa() blend stepCount), - "LCh(ab)" to (colorA.toLCHABa()..colorB.toLCHABa() blend stepCount), - "OKLab" to (colorA.toOKLABa()..colorB.toOKLABa() blend stepCount), - "OKLCh" to (colorA.toOKLCHa()..colorB.toOKLCHa() blend stepCount), - "OKHSV" to (colorA.toOKHSVa()..colorB.toOKHSVa() blend stepCount), - "OKHSL" to (colorA.toOKHSLa()..colorB.toOKHSLa() blend stepCount), - "HSLUV" to (colorA.toHSLUVa()..colorB.toHSLUVa() blend stepCount), - "XSLUV" to (colorA.toXSLUVa()..colorB.toXSLUVa() blend stepCount), - ) - - configure { - width = 720 - height = 30 + 50 * allSteps.size - } - program { - extend { - drawer.clear(ColorRGBa.WHITE) - drawer.stroke = null - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - drawer.translate(20.0, 20.0) - for ((label, steps) in allSteps) { - drawer.fill = ColorRGBa.GRAY.shade(0.25) - drawer.text(label, 0.0, 24.0) - - for (i in steps.indices) { - drawer.fill = steps[i].toSRGB() - drawer.rectangle(100.0 + i * 20.0, 0.0, 20.0, 40.0) - } - drawer.translate(0.0, 50.0) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange04.kt b/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange04.kt deleted file mode 100644 index a46676a4..00000000 --- a/orx-color/src/jvmDemo/kotlin/colorRange/DemoColorRange04.kt +++ /dev/null @@ -1,98 +0,0 @@ -package colorRange - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.isolated -import org.openrndr.draw.loadFont -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.color.palettes.rangeTo -import org.openrndr.extra.color.spaces.toHSLUVa -import org.openrndr.extra.color.spaces.toOKLABa -import org.openrndr.extra.color.spaces.toOKLCHa -import org.openrndr.extra.color.spaces.toXSLUVa -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 - -/** - * A visualization of color interpolations inside a 3D RGB cube with an interactive 3D `Orbital` camera. - * - * The hues of the source and target colors are animated over time. - * - * The color interpolations are shown simultaneously in nine different color spaces, revealing how in - * each case they share common starting and ending points in 3D, but have unique paths going from - * start to end. - * - * By rotating the cube 90 degrees towards the left and slightly zooming out, one can appreciate how - * one of the points moves along the edges of the cube, while the other moves on the edges of a - * smaller, invisible cube. - * - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val mesh = sphereMesh(8, 8, radius = 0.1) - - extend(Orbital()) - - extend { - drawer.clear(ColorRGBa.WHITE) - - val colorA = ColorRGBa.BLUE.toHSVa().shiftHue(seconds * 40.0).toRGBa() - val colorB = ColorRGBa.PINK.toHSVa().shiftHue(-seconds * 34.0).toRGBa() - - val stepCount = 25 - - val allSteps = listOf( - "RGB" to (colorA..colorB blend stepCount), - "RGB linear" to (colorA.toLinear()..colorB.toLinear() blend stepCount), - "HSV" to (colorA..colorB.toHSVa() blend stepCount), - "Lab" to (colorA.toLABa()..colorB.toLABa() blend stepCount), - "LCh(ab)" to (colorA.toLCHABa()..colorB.toLCHABa() blend stepCount), - "OKLab" to (colorA.toOKLABa()..colorB.toOKLABa() blend stepCount), - "OKLCh" to (colorA.toOKLCHa()..colorB.toOKLCHa() blend stepCount), - "HSLUV" to (colorA.toHSLUVa()..colorB.toHSLUVa() blend stepCount), - "XSLUV" to (colorA.toXSLUVa()..colorB.toXSLUVa() blend stepCount), - ) - - for ((_, steps) in allSteps) { - for (i in steps.indices) { - val srgb = steps[i].toSRGB().clip() - drawer.fill = srgb - drawer.isolated { - drawer.translate((srgb.r - 0.5) * 10.0, (srgb.g - 0.5) * 10.0, (srgb.b - 0.5) * 10.0) - drawer.vertexBuffer(mesh, DrawPrimitive.TRIANGLES) - } - } - val positions = steps.map { - val l = it.toSRGB().clip() - Vector3((l.r - 0.5) * 10.0, (l.g - 0.5) * 10.0, (l.b - 0.5) * 10.0) - } - drawer.stroke = ColorRGBa.BLACK.opacify(0.25) - drawer.strokeWeight = 10.0 - drawer.lineStrip(positions) - } - drawer.lineSegments( - listOf( - Vector3(-5.0, -5.0, -5.0), Vector3(5.0, -5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, 5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, 5.0, -5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, 5.0, -5.0), - Vector3(-5.0, -5.0, 5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, -5.0, 5.0), Vector3(5.0, 5.0, 5.0), - - Vector3(-5.0, -5.0, -5.0), Vector3(-5.0, -5.0, 5.0), - Vector3(5.0, -5.0, -5.0), Vector3(5.0, -5.0, 5.0), - Vector3(-5.0, 5.0, -5.0), Vector3(-5.0, 5.0, 5.0), - Vector3(5.0, 5.0, -5.0), Vector3(5.0, 5.0, 5.0), - ) - ) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormap.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormap.kt deleted file mode 100644 index 06135ba1..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormap.kt +++ /dev/null @@ -1,37 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.extra.color.colormaps.spectralZucconi6 -import org.openrndr.extra.noise.fastFloor -import kotlin.math.sin - -/** - * This program demonstrates the `spectralZucconi6()` function, which - * takes a normalized value and returns a `ColorRGBa` using the - * accurate spectral colormap developed by Alan Zucconi. - * - * It draws a varying number of vertical bands (between 16 and 48) - * filled with various hues. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - extend { - drawer.stroke = null - val stripeCount = 32 + (sin(seconds) * 16.0).fastFloor() - val bandWidth = width / stripeCount.toDouble() - repeat(stripeCount) { i -> - drawer.fill = spectralZucconi6(i / stripeCount.toDouble()) - drawer.rectangle( - x = i * bandWidth, - y = 0.0, - width = bandWidth, - height = height.toDouble(), - ) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPhrase.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPhrase.kt deleted file mode 100644 index d2b3fa54..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPhrase.kt +++ /dev/null @@ -1,33 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.shaderphrases.preprocess - -/** - * This program demonstrates how to use the shader-based version of - * the `spectral_zucconi6()` function, which - * takes a normalized value and returns an `rgb` color using the - * accurate spectral colormap developed by Alan Zucconi. - * - * It shades a full-window rectangle using its normalized `x` coordinate - * in a `ShadeStyle` to choose pixel colors. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - ColormapPhraseBook.register() - val style = shadeStyle { - fragmentPreamble = "#pragma import colormap.spectral_zucconi6".preprocess() - fragmentTransform = "x_fill.rgb = spectral_zucconi6(c_boundsPosition.x);" - } - extend { - drawer.shadeStyle = style - drawer.rectangle(drawer.bounds) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPlot.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPlot.kt deleted file mode 100644 index 67f12e56..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoSpectralZucconiColormapPlot.kt +++ /dev/null @@ -1,61 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.color.colormaps.spectralZucconi6 -import org.openrndr.extra.shaderphrases.preprocess -import org.openrndr.math.Vector2 - -/** - * This demo uses the shader based `spectral_zucconi6()` function to fill the background, - * then visualizes the red, green and blue components of the colors used in the background - * as red, green and blue line strips. - * - * The Vector2 points for the line strips are calculated only once when the program starts. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - ColormapPhraseBook.register() - val backgroundStyle = shadeStyle { - fragmentPreamble = "#pragma import colormap.spectral_zucconi6".preprocess() - fragmentTransform = "x_fill.rgb = spectral_zucconi6(c_boundsPosition.x);" - } - - // Function that expects as an argument a function to convert a ColorRGBa into a Double, - // and returns a list of Vector2 coordinates. - fun getColormapPoints( - block: ColorRGBa.() -> Double - ) = List(width) { x -> - Vector2( - x.toDouble(), - (1.0 - block(spectralZucconi6(x / width.toDouble()))) * height - ) - } - - val redPoints = getColormapPoints { r } - val greenPoints = getColormapPoints { g } - val bluePoints = getColormapPoints { b } - extend { - drawer.run { - shadeStyle = backgroundStyle - rectangle(bounds) - shadeStyle = null - - stroke = ColorRGBa.RED - lineStrip(redPoints) - - stroke = ColorRGBa.GREEN - lineStrip(greenPoints) - - stroke = ColorRGBa.BLUE - lineStrip(bluePoints) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormap.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormap.kt deleted file mode 100644 index 074bbbb8..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormap.kt +++ /dev/null @@ -1,37 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.extra.color.colormaps.turboColormap -import org.openrndr.extra.noise.fastFloor -import kotlin.math.sin - -/** - * This program demonstrates the `turboColormap()` function, which - * takes a normalized value and returns a `ColorRGBa` using the - * Turbo colormap developed by Google. - * - * It draws a varying number of vertical bands (between 16 and 48) - * filled with various hues. - */ - -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - extend { - drawer.stroke = null - val stripeCount = 32 + (sin(seconds) * 16.0).fastFloor() - repeat(stripeCount) { i -> - drawer.fill = turboColormap(i / stripeCount.toDouble()) - drawer.rectangle( - x = i * width / stripeCount.toDouble(), - y = 0.0, - width = width / stripeCount.toDouble(), - height = height.toDouble(), - ) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPhrase.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPhrase.kt deleted file mode 100644 index 57fffb21..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPhrase.kt +++ /dev/null @@ -1,33 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.shaderphrases.preprocess - -/** - * This program demonstrates how to use the shader-based version of - * the `turbo_colormap()` function, which - * takes a normalized value and returns an `rgb` color using the - * Turbo colormap developed by Google. - * - * It shades a full-window rectangle using its normalized `x` coordinate - * in a `ShadeStyle` to choose pixel colors. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - ColormapPhraseBook.register() - val style = shadeStyle { - fragmentPreamble = "#pragma import colormap.turbo_colormap".preprocess() - fragmentTransform = "x_fill.rgb = turbo_colormap(c_boundsPosition.x);" - } - extend { - drawer.shadeStyle = style - drawer.rectangle(drawer.bounds) - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPlot.kt b/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPlot.kt deleted file mode 100644 index f0a45131..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormap/DemoTurboColormapPlot.kt +++ /dev/null @@ -1,57 +0,0 @@ -package colormap - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.color.colormaps.turboColormap -import org.openrndr.extra.shaderphrases.preprocess -import org.openrndr.math.Vector2 - -/** - * This demo uses the shader based `turbo_colormap()` function to fill the background, - * then visualizes the red, green and blue components of the colors used in the background - * as red, green and blue line strips. - * - * The Vector2 points for the line strips are calculated only once when the program starts. - */ -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - ColormapPhraseBook.register() - val backgroundStyle = shadeStyle { - fragmentPreamble = "#pragma import colormap.turbo_colormap".preprocess() - fragmentTransform = "x_fill.rgb = turbo_colormap(c_boundsPosition.x);" - } - fun getColormapPoints( - block: ColorRGBa.() -> Double - ) = List(width) { x -> - Vector2( - x.toDouble(), - (1.0 - block(turboColormap(x / width.toDouble()))) * height - ) - } - val redPoints = getColormapPoints { r } - val greenPoints = getColormapPoints { g } - val bluePoints = getColormapPoints { b } - extend { - drawer.run { - shadeStyle = backgroundStyle - rectangle(bounds) - shadeStyle = null - - stroke = ColorRGBa.RED - lineStrip(redPoints) - - stroke = ColorRGBa.GREEN - lineStrip(greenPoints) - - stroke = ColorRGBa.BLUE - lineStrip(bluePoints) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix01.kt b/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix01.kt deleted file mode 100644 index b0ee8d4d..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix01.kt +++ /dev/null @@ -1,38 +0,0 @@ -package colormatrix - -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.colormatrix.colorMatrix -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - -/** - * This demo modifies the displayed image in each grid cell - * using color matrix transformations to demonstrate color channel inversions based on - * the grid cell's index. The image is adjusted to fit within each grid cell while maintaining - * alignment. - * - * Functionality: - * - Loads an image from the specified file path. - * - Splits the drawing area into an evenly spaced 4x2 grid. - * - Applies different color matrix inversions (red, green, blue) based on the position index. - * - Fits the image into each grid cell while providing horizontal alignment adjustments. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - extend { - val cells = drawer.bounds.grid(4, 2).flatten() - for ((index, cell) in cells.withIndex()) { - drawer.drawStyle.colorMatrix = colorMatrix { - invert(index and 1 != 0, index and 2 != 0, index and 4 != 0) - } - drawer.imageFit(image, cell, horizontalPosition = -0.5) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix02.kt b/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix02.kt deleted file mode 100644 index b1e31296..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix02.kt +++ /dev/null @@ -1,41 +0,0 @@ -package colormatrix - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.colormatrix.colorMatrix -import org.openrndr.extra.color.spaces.OKHSV -import org.openrndr.extra.color.tools.shiftHue -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - -/** - * This demo modifies the displayed image in each grid cell - * using color matrix transformations to demonstrate color channel inversions based on - * the grid cell's index. The image is adjusted to fit within each grid cell while maintaining - * alignment. - * - * Functionality: - * - Loads an image from the specified file path. - * - Splits the drawing area into an evenly spaced 4x2 grid. - * - Applies different color matrix inversions (red, green, blue) based on the position index. - * - Fits the image into each grid cell while providing horizontal alignment adjustments. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - extend { - val cells = drawer.bounds.grid(16, 1).flatten() - for ((index, cell) in cells.withIndex()) { - drawer.drawStyle.colorMatrix = colorMatrix { - tint(ColorRGBa.RED.shiftHue(index * 360 / 16.0)) - } - drawer.imageFit(image, cell, horizontalPosition = -1.0 + 2.0 * index / 15.0) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix03.kt b/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix03.kt deleted file mode 100644 index d7bfde0f..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix03.kt +++ /dev/null @@ -1,44 +0,0 @@ -package colormatrix - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.colormatrix.colorMatrix -import org.openrndr.extra.color.spaces.OKHSV -import org.openrndr.extra.color.tools.shiftHue -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - - -/** - * Entry point for an application demonstrating the use of color matrix transformations on an image. - * - * The program initializes a graphical application with a resolution of 720x720 pixels - * and processes an image to display it in a series of grid cells, applying a hue shift - * transformation based on the index of each cell. - * - * Key features: - * - Loads an image from a specified file path. - * - Configures the drawing area to consist of a horizontal grid with 16 cells. - * - Applies a color tint transformation utilizing the red channel, shifting its hue progressively - * per cell index to create a colorful gradient effect. - * - Adjusts the positions of the images within each grid cell for aesthetic alignment. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - extend { - val cells = drawer.bounds.grid(16, 1).flatten() - for ((index, cell) in cells.withIndex()) { - drawer.drawStyle.colorMatrix = colorMatrix { - tint(ColorRGBa.RED.shiftHue(index * 360 / 16.0)) - } - drawer.imageFit(image, cell, horizontalPosition = -1.0 + 2.0 * index / 15.0) - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix04.kt b/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix04.kt deleted file mode 100644 index a5a12dd8..00000000 --- a/orx-color/src/jvmDemo/kotlin/colormatrix/DemoColorMatrix04.kt +++ /dev/null @@ -1,53 +0,0 @@ -package colormatrix - -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.colormatrix.colorMatrix -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - - -/** - * Entry point of a graphical application that demonstrates the use of color matrix - * transformations on an image displayed within a grid layout. - * - * Overview: - * - Initializes a window with a resolution of 720x720 pixels. - * - Loads an image from the specified file path. - * - Splits the drawing canvas into a 7x1 grid of cells. - * - In each grid cell, applies custom grayscale transformations to the image using - * a color matrix. The grayscale transformation coefficients for red, green, and blue - * channels are computed based on the index of the grid cell. - * - Displays the adjusted image in each grid cell with horizontal alignment modifications - * to position the images dynamically based on their index within the grid. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - extend { - val cells = drawer.bounds.grid(7, 2) - for ((rowIndex, row) in cells.withIndex()) { - for ((index, cell) in row.withIndex()) { - drawer.drawStyle.colorMatrix = colorMatrix { - var r = if ((index + 1) and 1 != 0) 1.0 else 0.0 - var g = if ((index + 1) and 2 != 0) 1.0 else 0.0 - var b = if ((index + 1) and 4 != 0) 1.0 else 0.0 - val sum = r + g + b - r /= sum - g /= sum - b /= sum - grayscale(r, g, b) - if (rowIndex == 1) { - invert() - } - } - drawer.imageFit(image, cell, horizontalPosition = -0.5) - } - } - } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram01.kt b/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram01.kt deleted file mode 100644 index 121fe573..00000000 --- a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram01.kt +++ /dev/null @@ -1,59 +0,0 @@ -package histogram - -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.statistics.calculateHistogramRGB - -/* - * Demonstrates how to generate a palette with the top 32 colors - * of a loaded image, sorted by luminosity. The colors are displayed - * as rectangles overlayed on top of the image. - */ -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val useColors = 32 - val image = loadImage("demo-data/images/image-001.png") - - val histogram = calculateHistogramRGB(image, binCount = 8) - print("Histogram using ${histogram.binCount} bins per RGB channel") - - val colorsSortedByFreq = histogram.sortedColors() - println(" therefore it contains ${colorsSortedByFreq.size} colors.") - - val topColors = colorsSortedByFreq.subList(0, useColors) - print("\nWe will use the most common $useColors") - - val topColorsSortedByLuminosity = topColors.sortedBy { - it.first.toHSLa().l - } - println(" and sort them by luminosity.") - - val topColorsFreqSum = topColors.sumOf { it.second } - println("\nThose top $useColors colors represent " + - String.format("%.02f", 100 * topColorsFreqSum) + - "% of the image colors.") - - extend { - drawer.image(image, 0.0, 0.0, width * 1.0, height * 1.0) - drawer.stroke = null - var x = 0.0 - topColorsSortedByLuminosity.forEachIndexed { i, (color, freq) -> - drawer.fill = color - - // draw horizontal bars - drawer.rectangle(x, 2.0, width.toDouble(), 16.0) - x += width * freq / topColorsFreqSum - - // draw vertical bars - drawer.rectangle(i * width / useColors.toDouble() + 2.0, - height - 2.0, - width / useColors.toDouble() - 4.0, - -height * freq / topColorsFreqSum) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram02.kt b/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram02.kt deleted file mode 100644 index 78d0bcf9..00000000 --- a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram02.kt +++ /dev/null @@ -1,38 +0,0 @@ -package histogram - -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.statistics.calculateHistogramRGB -import kotlin.math.pow - -/* - * Show the color histogram of an image using non-uniform weighting, - * prioritizing bright colors. - */ -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val image = loadImage("demo-data/images/image-001.png") - // -- here we use non-uniform weighting, such that bright colors are prioritized - val histogram = calculateHistogramRGB(image, weighting = { - ((r + g + b) / 3.0).pow(2.4) - }) - val colors = histogram.sortedColors() - // .subList(0, 32).sortedBy { it.first.toHSLa().h } // sort by hue - - extend { - drawer.image(image, 0.0, 0.0, width * 1.0, height * 1.0) - for (i in 0 until 32) { - drawer.fill = colors[i].first - drawer.stroke = null - drawer.rectangle(i * width / 32.0 + 2.0, - height - 2.0, - width / 32.0 - 4.0, - -16.0) - } - } - } -} diff --git a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram03.kt b/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram03.kt deleted file mode 100644 index 33af6599..00000000 --- a/orx-color/src/jvmDemo/kotlin/histogram/DemoHistogram03.kt +++ /dev/null @@ -1,32 +0,0 @@ -package histogram - -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.color.statistics.calculateHistogramRGB - -/* - * Create a simple grid-like composition based on colors sampled from image. - * The cells are 32 by 32 pixels in size and are filled with a random sample - * taken from the color histogram of the image. - * - * Note: due to its random nature the resulting animation contains flickering colors. - */ -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val image = loadImage("demo-data/images/image-001.png") - val histogram = calculateHistogramRGB(image) - extend { - for (j in 0 until height step 32) { - for (i in 0 until width step 32) { - drawer.stroke = null - drawer.fill = histogram.sample() - drawer.rectangle(i * 1.0, j * 1.0, 32.0, 32.0) - } - } - } - } -} diff --git a/orx-color/src/jvmMain/kotlin/src/statistics/Histogram.kt b/orx-color/src/jvmMain/kotlin/src/statistics/Histogram.kt deleted file mode 100644 index 014552bd..00000000 --- a/orx-color/src/jvmMain/kotlin/src/statistics/Histogram.kt +++ /dev/null @@ -1,79 +0,0 @@ -package org.openrndr.extra.color.statistics - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorBuffer -import kotlin.random.Random - -fun calculateHistogramRGB(buffer: ColorBuffer, - binCount: Int = 16, - weighting: ColorRGBa.() -> Double = { 1.0 }, - downloadShadow: Boolean = true): RGBHistogram { - val bins = Array(binCount) { Array(binCount) { DoubleArray(binCount) } } - if (downloadShadow) { - buffer.shadow.download() - } - - var totalWeight = 0.0 - val s = buffer.shadow - for (y in 0 until buffer.height) { - for (x in 0 until buffer.width) { - val c = s[x, y] - val weight = c.weighting() - val (rb, gb, bb) = c.binIndex(binCount) - bins[rb][gb][bb] += weight - totalWeight += weight - } - } - - if (totalWeight > 0) - for (r in 0 until binCount) { - for (g in 0 until binCount) { - for (b in 0 until binCount) { - bins[r][g][b] /= totalWeight - } - } - } - return RGBHistogram(bins, binCount) -} - - -class RGBHistogram(val freqs: Array>, val binCount: Int) { - fun frequency(color: ColorRGBa): Double { - val (rb, gb, bb) = color.binIndex(binCount) - return freqs[rb][gb][bb] - } - - fun color(rBin: Int, gBin: Int, bBin: Int): ColorRGBa = - ColorRGBa(rBin / (binCount - 1.0), gBin / (binCount - 1.0), bBin / (binCount - 1.0)) - - fun sample(random: Random = Random.Default): ColorRGBa { - val x = random.nextDouble() - var sum = 0.0 - for (r in 0 until binCount) { - for (g in 0 until binCount) { - for (b in 0 until binCount) { - sum += freqs[r][g][b] - if (sum >= x) { - return color(r, g, b) - } - } - } - } - return color(binCount - 1, binCount - 1, binCount - 1) - } - - fun sortedColors(): List> { - val result = mutableListOf>() - for (r in 0 until binCount) { - for (g in 0 until binCount) { - for (b in 0 until binCount) { - result += Pair( - ColorRGBa(r / (binCount - 1.0), g / (binCount - 1.0), b / (binCount - 1.0)), - freqs[r][g][b] - ) - } - } - } - return result.sortedByDescending { it.second } - } -} \ No newline at end of file diff --git a/orx-color/src/jvmTest/kotlin/TestMix.kt b/orx-color/src/jvmTest/kotlin/TestMix.kt deleted file mode 100644 index 97daf257..00000000 --- a/orx-color/src/jvmTest/kotlin/TestMix.kt +++ /dev/null @@ -1,44 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.extra.color.palettes.rangeTo - -import kotlin.test.assertEquals -import kotlin.test.assertSame - -class TestMix : DescribeSpec({ - - describe("two srgb colors") { - val a = ColorRGBa.BLUE - val b = ColorRGBa.RED - - assertEquals(Linearity.SRGB, a.linearity) - - - it("should mix properly") { - assertSame(a, a.mix(b, 0.0)) - assertSame(b, a.mix(b, 1.0)) - } - } - - describe("two linear rgb colors") { - val a = ColorRGBa.BLUE.toLinear() - val b = ColorRGBa.RED.toLinear() - - it("should mix properly") { - assertSame(a, a.mix(b, 0.0)) - assertSame(b, a.mix(b, 1.0)) - } - } - - describe("a 2-step range of colors") { - val a = ColorRGBa.BLUE - val b = ColorRGBa.RED - - val blend = a..b blend 2 - assertEquals(2, blend.size) - assertEquals(a, blend[0]) - assertEquals(b, blend[1]) - } - -}) \ No newline at end of file diff --git a/orx-composition/README.md b/orx-composition/README.md deleted file mode 100644 index d42e2186..00000000 --- a/orx-composition/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# orx-composition - -Shape composition library - -One can think of a Composition as a vector design made out of primitives -like ShapeContour, Shape, or LineSegment, each having its fill color, -stroke color and stroke weight. - -Compositions can be loaded from SVG files and then queried or altered via code. - -Composition can also be generated from scratch, typically using `drawComposition { ... }`, then saved as an SVG file. - -Read about Composition [in the guide](https://guide.openrndr.org/drawing/drawingSVG.html). - -_The code in `orx-composition` was previously found under `openrndr-draw` in the `openrndr` repository._ - - -## Demos -### DemoCompositionDrawer01 - -Demonstrates how to - -- Create a Composition -- Draw it on the program window -- Save it to an SVG file -- Print the SVG content as text - -![DemoCompositionDrawer01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-composition/images/DemoCompositionDrawer01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositionDrawer01.kt) - -### DemoCompositionDrawer02 - -Demonstrates how to draw a Composition and how to use -`ClipMode.REVERSE_DIFFERENCE` to clip shapes. - -The first shape clips part of the second one away, -producing a shape that seems to be behind the first one. - -Without clipping, the second circle would cover part of the first one. - -![DemoCompositionDrawer02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-composition/images/DemoCompositionDrawer02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositionDrawer02.kt) - -### DemoCompositionDrawer03 - -Draws a composition using 3 circles and `ClipMode.REVERSE_DIFFERENCE`. - -A println() demonstrates that the result contains 3 shapes: -a complete circle, a moon-like shape, and a shape with two small black areas. - -One way to verify this is by saving the design as an SVG file and opening -it in vector editing software. - - -![DemoCompositionDrawer03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-composition/images/DemoCompositionDrawer03Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositionDrawer03.kt) - -### DemoCompositionDrawer04 - -Demonstrates how to add content to and how to clear an existing Composition. - -A number of circles are added when the program starts. -Dragging the mouse button adds more circles. -Right-clicking the mouse clears the Composition. - -![DemoCompositionDrawer04Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-composition/images/DemoCompositionDrawer04Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositionDrawer04.kt) - -### DemoCompositionDrawer05 - -Demonstrates how to - -- Create a Composition with a group -- Add XML attributes so the group appears as a layer in Inkscape - -![DemoCompositionDrawer05Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-composition/images/DemoCompositionDrawer05Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositionDrawer05.kt) diff --git a/orx-composition/build.gradle.kts b/orx-composition/build.gradle.kts deleted file mode 100644 index af4f8055..00000000 --- a/orx-composition/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - implementation(sharedLibs.kotlin.serialization.core) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-svg")) - } - } - } -} diff --git a/orx-composition/src/commonMain/kotlin/Composition.kt b/orx-composition/src/commonMain/kotlin/Composition.kt deleted file mode 100644 index a02c6a4e..00000000 --- a/orx-composition/src/commonMain/kotlin/Composition.kt +++ /dev/null @@ -1,641 +0,0 @@ -package org.openrndr.extra.composition - -import org.openrndr.draw.* -import org.openrndr.math.* -import org.openrndr.math.transforms.* -import org.openrndr.shape.Rectangle -import org.openrndr.shape.Shape -import org.openrndr.shape.ShapeContour -import org.openrndr.shape.bounds -import kotlin.math.* -import kotlin.reflect.* - -/** - * Describes a node in a composition - */ -sealed class CompositionNode { - - var id: String? = null - - var parent: CompositionNode? = null - - /** This CompositionNode's own style. */ - var style: Style = Style() - - /** - * This CompositionNode's computed style. - * Where every style attribute is obtained by - * overwriting the Style in the following order: - * 1. Default style attributes. - * 2. Parent Node's computed style's inheritable attributes. - * 3. This Node's own style attributes. - */ - val effectiveStyle: Style - get() = when (val p = parent) { - is CompositionNode -> style inherit p.effectiveStyle - else -> style - } - - /** - * Custom attributes to be applied to the Node in addition to the Style attributes. - */ - var attributes = mutableMapOf() - - /** - * a map that stores user data - */ - val userData = mutableMapOf() - - /** - * a [Rectangle] that describes the bounding box of the contents - */ - abstract val bounds: Rectangle - - val effectiveStroke get() = effectiveStyle.stroke.value - val effectiveStrokeOpacity get() = effectiveStyle.strokeOpacity.value - val effectiveStrokeWeight get() = effectiveStyle.strokeWeight.value - val effectiveMiterLimit get() = effectiveStyle.miterLimit.value - val effectiveLineCap get() = effectiveStyle.lineCap.value - val effectiveLineJoin get() = effectiveStyle.lineJoin.value - val effectiveFill get() = effectiveStyle.fill.value - val effectiveFillOpacity get() = effectiveStyle.fillOpacity.value - val effectiveDisplay get() = effectiveStyle.display.value - val effectiveOpacity get() = effectiveStyle.opacity.value - val effectiveVisibility get() = effectiveStyle.visibility.value - val effectiveShadeStyle get() = effectiveStyle.shadeStyle.value - - /** Calculates the absolute transformation of the current node. */ - val effectiveTransform: Matrix44 - get() = when (val p = parent) { - is CompositionNode -> transform * p.effectiveTransform - else -> transform - } - - var stroke - get() = style.stroke.value - set(value) { - style.stroke = when (value) { - null -> Paint.None - else -> Paint.RGB(value) - } - } - var strokeOpacity - get() = style.strokeOpacity.value - set(value) { - style.strokeOpacity = Numeric.Rational(value) - } - var strokeWeight - get() = style.strokeWeight.value - set(value) { - style.strokeWeight = Length.Pixels(value) - } - var miterLimit - get() = style.miterLimit.value - set(value) { - style.miterLimit = Numeric.Rational(value) - } - var lineCap - get() = style.lineCap.value - set(value) { - style.lineCap = when (value) { - org.openrndr.draw.LineCap.BUTT -> LineCap.Butt - org.openrndr.draw.LineCap.ROUND -> LineCap.Round - org.openrndr.draw.LineCap.SQUARE -> LineCap.Square - } - } - var lineJoin - get() = style.lineJoin.value - set(value) { - style.lineJoin = when (value) { - org.openrndr.draw.LineJoin.BEVEL -> LineJoin.Bevel - org.openrndr.draw.LineJoin.MITER -> LineJoin.Miter - org.openrndr.draw.LineJoin.ROUND -> LineJoin.Round - } - } - var fill - get() = style.fill.value - set(value) { - style.fill = when (value) { - null -> Paint.None - else -> Paint.RGB(value) - } - } - var fillOpacity - get() = style.fillOpacity.value - set(value) { - style.fillOpacity = Numeric.Rational(value) - } - var opacity - get() = style.opacity.value - set(value) { - style.opacity = Numeric.Rational(value) - } - var shadeStyle - get() = style.shadeStyle.value - set(value) { - style.shadeStyle = Shade.Value(value) - } - var transform - get() = style.transform.value - set(value) { - style.transform = Transform.Matrix(value) - } -} - -// TODO: Deprecate this? -operator fun KMutableProperty0.setValue(thisRef: Style, property: KProperty<*>, value: ShadeStyle) { - this.set(Shade.Value(value)) -} - -fun transform(node: CompositionNode): Matrix44 = - (node.parent?.let { transform(it) } ?: Matrix44.IDENTITY) * node.transform - -/** - * a [CompositionNode] that holds a single image [ColorBuffer] - */ -class ImageNode(var image: ColorBuffer, var x: Double, var y: Double, var width: Double, var height: Double) : - CompositionNode() { - override val bounds: Rectangle - get() = Rectangle(0.0, 0.0, width, height).contour.transform(transform(this)).bounds -} - -/** - * a [CompositionNode] that holds a single [Shape] - */ -class ShapeNode(var shape: Shape) : CompositionNode() { - override val bounds: Rectangle - get() { - val t = effectiveTransform - return if (t === Matrix44.IDENTITY) { - shape.bounds - } else { - shape.bounds.contour.transform(t).bounds - } - } - - /** - * apply transforms of all ancestor nodes and return a new detached org.openrndr.shape.ShapeNode with conflated transform - */ - fun conflate(): ShapeNode { - return ShapeNode(shape).also { - it.id = id - it.parent = parent - it.style = style - it.transform = transform(this) - it.attributes = attributes - } - } - - - /** - * apply transforms of all ancestor nodes and return a new detached shape node with identity transform and transformed Shape - * @param composition use viewport transform - */ - fun flatten(composition: Composition? = null): ShapeNode { - - val viewport = composition?.calculateViewportTransform() ?: Matrix44.IDENTITY - - return ShapeNode(shape.transform(viewport * transform(this))).also { - it.id = id - it.parent = parent - it.style = effectiveStyle - it.attributes = attributes - } - } - - fun copy( - id: String? = this.id, - parent: CompositionNode? = null, - style: Style = this.style, - attributes: MutableMap = this.attributes, - shape: Shape = this.shape - ): ShapeNode { - return ShapeNode(shape).also { - it.id = id - it.parent = parent - it.style = style - it.attributes = attributes - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is ShapeNode) return false - if (shape != other.shape) return false - return true - } - - override fun hashCode(): Int { - return shape.hashCode() - } - - /** - * the local [Shape] with the [effectiveTransform] applied to it - */ - val effectiveShape - get() = shape.transform(effectiveTransform) -} - -/** - * a [CompositionNode] that holds a single text - */ -data class TextNode(var text: String, var contour: ShapeContour?) : CompositionNode() { - // TODO: This should not be Rectangle.EMPTY - override val bounds: Rectangle - get() = Rectangle.EMPTY -} - - -/** - * Represents a group node in a composition hierarchy. - * A `GroupNode` itself does not have explicit contents but serves as a container for managing child nodes. - * It allows grouping of multiple `CompositionNode` instances and provides functionalities like calculating - * the bounds for all its child elements and copying itself with overrides. - * - * @property children A mutable list of child nodes belonging to this group. Defaults to an empty list. - */ -open class GroupNode(open val children: MutableList = mutableListOf()) : CompositionNode() { - override val bounds: Rectangle - get() { - return children.map { it.bounds }.bounds - } - - fun copy( - id: String? = this.id, - parent: CompositionNode? = null, - style: Style = this.style, - children: MutableList = this.children - ): GroupNode { - return GroupNode(children).also { - it.id = id - it.parent = parent - it.style = style - it.attributes = attributes - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is GroupNode) return false - - if (children != other.children) return false - return true - } - - override fun hashCode(): Int { - return children.hashCode() - } -} - -data class CompositionDimensions(val x: Length, val y: Length, val width: Length, val height: Length) { - val position = Vector2((x as Length.Pixels).value, (y as Length.Pixels).value) - val dimensions = Vector2((width as Length.Pixels).value, (height as Length.Pixels).value) - - constructor(rectangle: Rectangle) : this( - rectangle.corner.x.pixels, - rectangle.corner.y.pixels, - rectangle.dimensions.x.pixels, - rectangle.dimensions.y.pixels - ) - - override fun toString(): String = "$x $y $width $height" - - // I'm not entirely sure why this is needed but - // but otherwise equality checks will never succeed - override fun equals(other: Any?): Boolean { - return other is CompositionDimensions - && x.value == other.x.value - && y.value == other.y.value - && width.value == other.width.value - && height.value == other.height.value - } - - override fun hashCode(): Int { - var result = x.hashCode() - result = 31 * result + y.hashCode() - result = 31 * result + width.hashCode() - result = 31 * result + height.hashCode() - return result - } -} - -val defaultCompositionDimensions = CompositionDimensions(0.0.pixels, 0.0.pixels, 768.0.pixels, 576.0.pixels) - - -/** - * Represents a specialized type of `GroupNode` in a composition hierarchy, serving as a container for child nodes. - * - * `GroupNodeStop` inherits from `GroupNode` and extends its functionality. It can be used to define a specific - * grouping behavior or semantic grouping in a composition system. Instances of this class hold a mutable list - * of `CompositionNode` entities as children. - * - * @constructor Creates a `GroupNodeStop` with the given child nodes. - * @param children A mutable list of `CompositionNode` instances to be managed by this group. - */ -class GroupNodeStop(children: MutableList) : GroupNode(children) - -/** - * A vector composition. - * @param root the root node of the composition - * @param bounds the dimensions of the composition - */ -class Composition(val root: CompositionNode, var bounds: CompositionDimensions = defaultCompositionDimensions) { - constructor(root: CompositionNode, bounds: Rectangle) : this(root, CompositionDimensions(bounds)) - - /** SVG/XML namespaces */ - val namespaces = mutableMapOf() - - var style: Style = Style() - - /** - * The style attributes affecting the whole document, such as the viewBox area and aspect ratio. - */ - var documentStyle: DocumentStyle = DocumentStyle() - - init { - val (x, y, width, height) = bounds - style.x = x - style.y = y - style.width = width - style.height = height - } - - fun findShapes() = root.findShapes() - fun findShape(id: String): ShapeNode? { - return (root.find { it is ShapeNode && it.id == id }) as? ShapeNode - } - - fun findImages() = root.findImages() - fun findImage(id: String): ImageNode? { - return (root.find { it is ImageNode && it.id == id }) as? ImageNode - } - - fun findGroups(): List = root.findGroups() - fun findGroup(id: String): GroupNode? { - return (root.find { it is GroupNode && it.id == id }) as? GroupNode - } - - fun clear() = (root as? GroupNode)?.children?.clear() - - /** Calculates the equivalent of `1%` in pixels. */ - internal fun normalizedDiagonalLength(): Double = sqrt(bounds.dimensions.squaredLength / 2.0) - - /** - * Calculates effective viewport transformation using [viewBox] and [preserveAspectRatio]. - * As per [the SVG 2.0 spec](https://svgwg.org/svg2-draft/single-page.html#coords-ComputingAViewportsTransform). - */ - fun calculateViewportTransform(): Matrix44 { - return when (documentStyle.viewBox) { - ViewBox.None -> Matrix44.IDENTITY - is ViewBox.Value -> { - when (val vb = (documentStyle.viewBox as ViewBox.Value).value) { - Rectangle.EMPTY -> { - // The intent is to not display the element - Matrix44.ZERO - } - - else -> { - val vbCorner = vb.corner - val vbDims = vb.dimensions - val eCorner = bounds.position - val eDims = bounds.dimensions - val (align, meetOrSlice) = documentStyle.preserveAspectRatio - - val scale = (eDims / vbDims).let { - if (align != Align.NONE) { - if (meetOrSlice == MeetOrSlice.MEET) { - Vector2(min(it.x, it.y)) - } else { - Vector2(max(it.x, it.y)) - } - } else { - it - } - } - - val translate = (eCorner - (vbCorner * scale)).let { - val cx = eDims.x - vbDims.x * scale.x - val cy = eDims.y - vbDims.y * scale.y - it + when (align) { - // TODO: This first one probably doesn't comply with the spec - Align.NONE -> Vector2.ZERO - Align.X_MIN_Y_MIN -> Vector2.ZERO - Align.X_MID_Y_MIN -> Vector2(cx / 2, 0.0) - Align.X_MAX_Y_MIN -> Vector2(cx, 0.0) - Align.X_MIN_Y_MID -> Vector2(0.0, cy / 2) - Align.X_MID_Y_MID -> Vector2(cx / 2, cy / 2) - Align.X_MAX_Y_MID -> Vector2(cx, cy / 2) - Align.X_MIN_Y_MAX -> Vector2(0.0, cy) - Align.X_MID_Y_MAX -> Vector2(cx / 2, cy) - Align.X_MAX_Y_MAX -> Vector2(cx, cy) - } - } - - buildTransform { - translate(translate) - scale(scale.x, scale.y, 1.0) - } - } - } - } - } - } -} - -/** - * remove node from its parent [CompositionNode] - */ -fun CompositionNode.remove() { - require(parent != null) { "parent is null" } - val parentGroup = (parent as? GroupNode) - if (parentGroup != null) { - val filtered = parentGroup.children.filter { - it != this - } - parentGroup.children.clear() - parentGroup.children.addAll(filtered) - } - parent = null -} - -/** - * Recursively finds all terminal nodes within the composition tree starting from the current node - * and applies the provided filter to determine which nodes to include in the result. - * - * @param filter A predicate function used to filter terminal nodes. Only nodes that satisfy this - * predicate will be included in the result. - * @return A list of terminal nodes within the composition tree that satisfy the given filter. - */ -fun CompositionNode.findTerminals(filter: (CompositionNode) -> Boolean): List { - val result = mutableListOf() - fun find(node: CompositionNode) { - when (node) { - is GroupNode -> node.children.forEach { find(it) } - else -> if (filter(node)) { - result.add(node) - } - } - } - find(this) - return result -} - -/** - * Finds all `CompositionNode` instances in the current node hierarchy that satisfy the given filter. - * Traverses the hierarchy recursively, evaluating each node and its children. - * - * @param filter A predicate function to determine whether a node should be included in the result. - * It takes a `CompositionNode` as input and returns a Boolean. - * @return A list of `CompositionNode` instances that satisfy the provided filter condition. - */ -fun CompositionNode.findAll(filter: (CompositionNode) -> Boolean): List { - val result = mutableListOf() - fun find(node: CompositionNode) { - if (filter(node)) { - result.add(node) - } - if (node is GroupNode) { - node.children.forEach { find(it) } - } - } - find(this) - return result -} - -/** - * Finds first [CompositionNode] to match the given [predicate]. - */ -fun CompositionNode.find(predicate: (CompositionNode) -> Boolean): CompositionNode? { - if (predicate(this)) { - return this - } else if (this is GroupNode) { - val deque: ArrayDeque = ArrayDeque(children) - while (deque.isNotEmpty()) { - val node = deque.removeFirst() - if (predicate(node)) { - return node - } else if (node is GroupNode) { - deque.addAll(node.children) - } - } - } - return null -} - -/** - * find all descendant [ShapeNode] nodes, including potentially this node - * @return a [List] of [ShapeNode] nodes - */ -fun CompositionNode.findShapes(): List = findTerminals { it is ShapeNode }.map { it as ShapeNode } - -/** - * find all descendant [ImageNode] nodes, including potentially this node - * @return a [List] of [ImageNode] nodes - */ -fun CompositionNode.findImages(): List = findTerminals { it is ImageNode }.map { it as ImageNode } - -/** - * find all descendant [GroupNode] nodes, including potentially this node - * @return a [List] of [GroupNode] nodes - */ -fun CompositionNode.findGroups(): List = findAll { it is GroupNode }.map { it as GroupNode } - -/** - * visit this [CompositionNode] and all descendant nodes and execute [visitor] - */ -fun CompositionNode.visitAll(visitor: (CompositionNode.() -> Unit)) { - visitor() - if (this is GroupNode) { - for (child in children) { - child.visitAll(visitor) - } - } -} - -/** - * org.openrndr.shape.UserData delegate - */ -class UserData( - val name: String, val initial: T -) { - @Suppress("UNCHECKED_CAST") - operator fun getValue(node: CompositionNode, property: KProperty<*>): T { - val value: T? = node.userData[name] as? T - return value ?: initial - } - - operator fun setValue(stylesheet: CompositionNode, property: KProperty<*>, value: T) { - stylesheet.userData[name] = value - } -} - -/** - * Filters a `CompositionNode` and its hierarchy based on the provided filter function. - * The method recursively applies the filter to the node and its children, creating - * a new hierarchy that contains only the nodes for which the filter returns true. - * If the filter condition fails for the root node, null is returned. - * - * For `GroupNode` instances, the method applies the filter to its children and - * creates a new `GroupNode` containing filtered children that satisfy the filter condition. - * For `ShapeNode` instances, a copy is created if the filter condition is met. - * - * @param filter A lambda function that takes a `CompositionNode` and returns a `Boolean`. - * The function determines if a node should be included in the resulting hierarchy. - * - * @return A new filtered `CompositionNode` tree, or null if the root node does not pass the filter. - */ -fun CompositionNode.filter(filter: (CompositionNode) -> Boolean): CompositionNode? { - val f = filter(this) - - if (!f) { - return null - } - - if (this is GroupNode) { - val copies = mutableListOf() - children.forEach { - val filtered = it.filter(filter) - if (filtered != null) { - when (filtered) { - is ShapeNode -> { - copies.add(filtered.copy(parent = this)) - } - - is GroupNode -> { - copies.add(filtered.copy(parent = this)) - } - - else -> { - - } - } - } - } - return GroupNode(children = copies) - } else { - return this - } -} - -fun CompositionNode.map(mapper: (CompositionNode) -> CompositionNode): CompositionNode { - val r = mapper(this) - return when (r) { - is GroupNodeStop -> { - r.copy().also { copy -> - copy.children.forEach { - it.parent = copy - } - } - } - - is GroupNode -> { - val copy = r.copy(children = r.children.map { it.map(mapper) }.toMutableList()) - copy.children.forEach { - it.parent = copy - } - copy - } - - else -> r - } -} \ No newline at end of file diff --git a/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt b/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt deleted file mode 100644 index 64bb8583..00000000 --- a/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt +++ /dev/null @@ -1,821 +0,0 @@ -package org.openrndr.extra.composition - -import org.openrndr.collections.pflatMap -import org.openrndr.collections.pmap -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.LineCap -import org.openrndr.draw.LineJoin -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.YPolarity -import org.openrndr.math.transforms.* -import org.openrndr.shape.* -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.jvm.JvmRecord - -/** - * Used internally to define [ClipMode]s. - */ -enum class ClipOp { - DISABLED, - DIFFERENCE, - REVERSE_DIFFERENCE, - INTERSECT, - UNION -} - -/** - * Specifies if transformations should be kept separate - * or applied to the clipped object and reset to identity. - */ -enum class TransformMode { - KEEP, - APPLY -} - -/** - * Specifies in which way to combine [Shape]s - * to form a [Composition] - */ -enum class ClipMode(val grouped: Boolean, val op: ClipOp) { - DISABLED(false, ClipOp.DISABLED), - DIFFERENCE(false, ClipOp.DIFFERENCE), - DIFFERENCE_GROUP(true, ClipOp.DIFFERENCE), - REVERSE_DIFFERENCE(false, ClipOp.REVERSE_DIFFERENCE), - REVERSE_DIFFERENCE_GROUP(true, ClipOp.REVERSE_DIFFERENCE), - INTERSECT(false, ClipOp.INTERSECT), - INTERSECT_GROUP(true, ClipOp.INTERSECT), - UNION(false, ClipOp.UNION), - UNION_GROUP(true, ClipOp.UNION) -} - -/** - * The set of draw style properties used for rendering a [Composition] - */ -private data class CompositionDrawStyle( - var fill: ColorRGBa? = null, - var fillOpacity: Double = 1.0, - var stroke: ColorRGBa? = ColorRGBa.BLACK, - var strokeOpacity: Double = 1.0, - var strokeWeight: Double = 1.0, - var opacity: Double = 1.0, - var clipMode: ClipMode = ClipMode.DISABLED, - var mask: Shape? = null, - var transformMode: TransformMode = TransformMode.APPLY, - var lineCap: LineCap = LineCap.BUTT, - var lineJoin: LineJoin = LineJoin.MITER, - var miterlimit: Double = 4.0, - var visibility: Visibility = Visibility.Visible -) - -/** - * Data structure containing intersection information. - */ -@JvmRecord -data class ShapeNodeIntersection(val node: ShapeNode, val intersection: ContourIntersection) - -/** - * Data structure containing information about a point - * in a [ShapeContour] closest to some other 2D point. - */ -@JvmRecord -data class ShapeNodeNearestContour( - val node: ShapeNode, - val point: ContourPoint, - val distanceDirection: Vector2, - val distance: Double -) - -/** - * Merges two lists of [ShapeNodeIntersection] removing duplicates under the - * given [threshold]. Used internally by [intersections]. - */ -fun List.merge(threshold: Double = 0.5): List { - val result = mutableListOf() - for (i in this) { - val nearest = result.minByOrNull { it.intersection.position.squaredDistanceTo(i.intersection.position) } - if (nearest == null) { - result.add(i) - } else if (nearest.intersection.position.squaredDistanceTo(i.intersection.position) >= threshold * threshold) { - result.add(i) - } - } - return result -} - - -/** - * A Drawer-like interface for the creation of Compositions - * This should be easier than creating Compositions manually - */ -class CompositionDrawer( - documentBounds: CompositionDimensions = defaultCompositionDimensions, - composition: Composition? = null, - cursor: GroupNode? = composition?.root as? GroupNode -) { - val root = (composition?.root as? GroupNode) ?: GroupNode() - val composition = composition ?: Composition(root, documentBounds) - - var cursor = cursor ?: root - private set - - private val modelStack = ArrayDeque() - private val styleStack = ArrayDeque().apply { } - private var drawStyle = CompositionDrawStyle() - - var model = Matrix44.IDENTITY - - var fill - get() = drawStyle.fill?.opacify(drawStyle.fillOpacity)?.opacify(drawStyle.opacity) - set(value) = run { - drawStyle.fill = value?.copy(alpha = 1.0) - drawStyle.fillOpacity = value?.alpha ?: 1.0 - } - - var fillOpacity - get() = drawStyle.fillOpacity - set(value) = run { drawStyle.fillOpacity = value } - - var stroke - get() = drawStyle.stroke?.opacify(drawStyle.strokeOpacity)?.opacify(drawStyle.opacity) - set(value) = run { - drawStyle.stroke = value?.copy(alpha = 1.0) - drawStyle.strokeOpacity = value?.alpha ?: 1.0 - } - - var strokeOpacity - get() = drawStyle.strokeOpacity - set(value) = run { drawStyle.strokeOpacity = value } - - var strokeWeight - get() = drawStyle.strokeWeight - set(value) = run { drawStyle.strokeWeight = value } - - var miterlimit - get() = drawStyle.miterlimit - set(value) = run { drawStyle.miterlimit = value } - - var lineCap - get() = drawStyle.lineCap - set(value) = run { drawStyle.lineCap = value } - - var lineJoin - get() = drawStyle.lineJoin - set(value) = run { drawStyle.lineJoin = value } - - var opacity - get() = drawStyle.opacity - set(value) = run { drawStyle.opacity = value } - - var visibility - get() = drawStyle.visibility - set(value) = run { drawStyle.visibility = value } - - var clipMode - get() = drawStyle.clipMode - set(value) = run { drawStyle.clipMode = value } - - var mask: Shape? - get() = drawStyle.mask - set(value) = run { drawStyle.mask = value } - - var transformMode - get() = drawStyle.transformMode - set(value) = run { drawStyle.transformMode = value } - - fun pushModel() { - modelStack.addLast(model) - } - - fun popModel() { - model = modelStack.removeLast() - } - - fun pushStyle() { - styleStack.addLast(drawStyle.copy()) - } - - fun popStyle() { - drawStyle = styleStack.removeLast() - } - - @OptIn(ExperimentalContracts::class) - fun isolated(draw: CompositionDrawer.() -> Unit) { - contract { - callsInPlace(draw, InvocationKind.EXACTLY_ONCE) - } - pushModel() - pushStyle() - draw() - popModel() - popStyle() - } - - @OptIn(ExperimentalContracts::class) - fun GroupNode.with(builder: CompositionDrawer.() -> Unit): GroupNode { - contract { - callsInPlace(builder, InvocationKind.EXACTLY_ONCE) - } - val oldCursor = cursor - cursor = this - builder() - cursor = oldCursor - return this - } - - /** - * Create a group node and run `builder` inside its context - * @param insert if true the created group will be inserted at [cursor] - * @param id an optional identifier - * @param builder the function that is executed inside the group context - */ - @OptIn(ExperimentalContracts::class) - fun group(insert: Boolean = true, id: String? = null, builder: CompositionDrawer.() -> Unit): GroupNode { - contract { - callsInPlace(builder, InvocationKind.EXACTLY_ONCE) - } - - val group = GroupNode() - group.id = id - val oldCursor = cursor - - if (insert) { - cursor.children.add(group) - group.parent = cursor - } - cursor = group - builder() - - cursor = oldCursor - return group - } - - fun translate(x: Double, y: Double) = translate(Vector2(x, y)) - - fun rotate(rotationInDegrees: Double) { - model *= Matrix44.rotateZ(rotationInDegrees) - } - - fun scale(s: Double) { - model *= Matrix44.scale(s, s, s) - } - - fun scale(x: Double, y: Double) { - model *= Matrix44.scale(x, y, 1.0) - } - - fun translate(t: Vector2) { - model *= Matrix44.translate(t.vector3()) - } - - fun contour(contour: ShapeContour, insert: Boolean = true): ShapeNode? { - if (contour.empty) { - return null - } - val shape = Shape(listOf(contour)) - return shape(shape, insert) - } - - fun contours(contours: List, insert: Boolean = true) = contours.map { contour(it, insert) } - - /** - * Search for a point on a contour in the composition tree that's nearest to `point` - * @param point the query point - * @param searchFrom a node from which the search starts, defaults to composition root - * @return an optional org.openrndr.shape.ShapeNodeNearestContour instance - */ - fun nearest( - point: Vector2, - searchFrom: CompositionNode = composition.root as GroupNode - ): ShapeNodeNearestContour? { - return distances(point, searchFrom).firstOrNull() - } - - fun CompositionNode.nearest(point: Vector2) = nearest(point, searchFrom = this) - - fun difference( - shape: Shape, - searchFrom: CompositionNode = composition.root as GroupNode - ): Shape { - val shapes = searchFrom.findShapes() - var from = shape - - for (subtract in shapes) { - if (shape.bounds.intersects(subtract.shape.bounds)) { - from = difference(from, subtract.shape) - } - } - return from - } - - /** - * Find distances to each contour in the composition tree (or starting node) - * @param point the query point - * @param searchFrom a node from which the search starts, defaults to composition root - * @return a sorted list of [ShapeNodeNearestContour] describing distance to every contour - */ - fun distances( - point: Vector2, - searchFrom: CompositionNode = composition.root as GroupNode - ): List { - return searchFrom.findShapes().flatMap { node -> - node.shape.contours.filter { !it.empty } - .map { it.nearest(point) } - .map { ShapeNodeNearestContour(node, it, point - it.position, it.position.distanceTo(point)) } - }.sortedBy { it.distance } - } - - fun CompositionNode.distances(point: Vector2): List = distances(point, searchFrom = this) - - /** - * Test a given `contour` against org.openrndr.shape.contours in the composition tree - * @param contour the query contour - * @param searchFrom a node from which the search starts, defaults to composition root - * @param mergeThreshold minimum distance between intersections before they are merged together, - * 0.0 or lower means no org.openrndr.shape.merge - * @return a list of `org.openrndr.shape.ShapeNodeIntersection` - */ - fun intersections( - contour: ShapeContour, - searchFrom: CompositionNode = composition.root as GroupNode, - mergeThreshold: Double = 0.5 - ): List { - return searchFrom.findShapes().pflatMap { node -> - if (node.bounds.intersects(contour.bounds)) { - node.shape.contours.flatMap { nodeContour -> - intersections(contour, nodeContour).map { - ShapeNodeIntersection(node, it) - } - } - } else { - emptyList() - } - }.let { - if (mergeThreshold > 0.0) { - it.merge(mergeThreshold) - } else { - it - } - } - } - - fun CompositionNode.intersections(contour: ShapeContour, mergeThreshold: Double = 0.5) = - intersections(contour, this, mergeThreshold) - - /** - * Test a given `shape` against org.openrndr.shape.contours in the composition tree - * @param shape the query shape - * @param searchFrom a node from which the search starts, defaults to composition root - * @return a list of `org.openrndr.shape.ShapeNodeIntersection` - */ - fun intersections( - shape: Shape, - searchFrom: CompositionNode = composition.root as GroupNode, - mergeThreshold: Double = 0.5 - ): List { - return shape.contours.flatMap { - intersections(it, searchFrom, mergeThreshold) - } - } - - fun CompositionNode.intersections(shape: Shape, mergeThreshold: Double = 0.5) = - intersections(shape, this, mergeThreshold) - - - fun shape(shape: Shape, insert: Boolean = true): ShapeNode? { - if (shape.empty) { - return null - } - - val inverseModel = model.inversed - val postShape = mask?.let { intersection(shape, it.transform(inverseModel)) } ?: shape - - if (postShape.empty) { - return null - } - - // only use clipping for open shapes - val clipMode = if (postShape.topology == ShapeTopology.CLOSED) clipMode else ClipMode.DISABLED - - return when (clipMode.op) { - ClipOp.DISABLED, ClipOp.REVERSE_DIFFERENCE -> { - val shapeNode = ShapeNode(postShape) - - val shapeTransform: Matrix44 = when (transformMode) { - TransformMode.KEEP -> { - shapeNode.transform = model - Matrix44.IDENTITY - } - - TransformMode.APPLY -> { - shapeNode.transform = Matrix44.IDENTITY - model - } - } - shapeNode.shape = when (clipMode.op) { - ClipOp.DISABLED -> postShape.transform(shapeTransform) - ClipOp.REVERSE_DIFFERENCE -> { - val shapeNodes = (if (!clipMode.grouped) composition.findShapes() else cursor.findShapes()) - var toInsert = shape - val inverse = model.inversed - for (node in shapeNodes) { - if (toInsert.empty) { - break - } else { - toInsert = difference(toInsert, node.effectiveShape.transform(inverse)) - } - } - toInsert - } - - else -> error("unreachable") - } - shapeNode.stroke = stroke - shapeNode.strokeOpacity = strokeOpacity - shapeNode.strokeWeight = strokeWeight - shapeNode.miterLimit = miterlimit - shapeNode.lineCap = lineCap - shapeNode.lineJoin = lineJoin - shapeNode.fill = fill - shapeNode.fillOpacity = fillOpacity - - if (insert) { - cursor.children.add(shapeNode) - shapeNode.parent = cursor - } - shapeNode - } - - else -> { - val shapeNodes = (if (!clipMode.grouped) composition.findShapes() else cursor.findShapes()) - val toRemove = shapeNodes.pmap { shapeNode -> - val inverse = shapeNode.effectiveTransform.inversed - val transformedShape = postShape.transform(inverse * model) - val operated = - when (clipMode.op) { - ClipOp.INTERSECT -> intersection(shapeNode.shape, transformedShape) - ClipOp.UNION -> union(shapeNode.shape, transformedShape) - ClipOp.DIFFERENCE -> difference(shapeNode.shape, transformedShape) - else -> error("unsupported base op ${clipMode.op}") - } - return@pmap if (!operated.empty) { - shapeNode.shape = operated - null - } else { - shapeNode - } - } - for (node in toRemove) { - node?.remove() - } - null - } - } - } - - fun shapes(shapes: List, insert: Boolean = true) = shapes.map { shape(it, insert) } - - fun rectangle(rectangle: Rectangle, closed: Boolean = true, insert: Boolean = true) = - contour(rectangle.contour.let { - if (closed) { - it - } else { - it.open - } - }, insert = insert) - - fun rectangle(x: Double, y: Double, width: Double, height: Double, closed: Boolean = true, insert: Boolean = true) = - rectangle( - Rectangle(x, y, width, height), closed, insert - ) - - fun rectangles(rectangles: List, insert: Boolean = true) = rectangles.map { rectangle(it, insert) } - - fun rectangles(positions: List, width: Double, height: Double, insert: Boolean = true) = - rectangles(positions.map { - Rectangle(it, width, height) - }, insert) - - fun rectangles(positions: List, dimensions: List, insert: Boolean) = - rectangles((positions zip dimensions).map { - Rectangle(it.first, it.second.x, it.second.y) - }, insert) - - fun circle(x: Double, y: Double, radius: Double, closed: Boolean = true, insert: Boolean = true) = circle( - Circle( - Vector2(x, y), - radius - ), closed, insert - ) - - fun circle(position: Vector2, radius: Double, closed: Boolean = true, insert: Boolean = true) = circle( - Circle( - position, - radius - ), closed, insert - ) - - fun circle(circle: Circle, closed: Boolean = true, insert: Boolean = true) = contour(circle.contour.let { - if (closed) { - it - } else { - it.open - } - }, insert) - - fun circles(circles: List, insert: Boolean = true) = circles.map { circle(it, insert) } - - fun circles(positions: List, radius: Double, insert: Boolean = true) = circles(positions.map { - Circle( - it, - radius - ) - }, insert) - - fun circles(positions: List, radii: List, insert: Boolean = true) = - circles((positions zip radii).map { - Circle( - it.first, - it.second - ) - }, insert) - - /* - fun ellipse( - x: Double, - y: Double, - xRadius: Double, - yRadius: Double, - rotationInDegrees: Double = 0.0, - closed: Boolean = true, - insert: Boolean = true - ) = ellipse(Vector2(x, y), xRadius, yRadius, rotationInDegrees, closed, insert) - - fun ellipse( - center: Vector2, - xRadius: Double, - yRadius: Double, - rotationInDegrees: Double, - closed: Boolean = true, - insert: Boolean = true - ) = contour(OrientedEllipse(center, xRadius, yRadius, rotationInDegrees).contour.let { - if (closed) { - it - } else { - it.open - } - }, insert) - */ - - - fun lineSegment( - startX: Double, - startY: Double, - endX: Double, - endY: Double, - insert: Boolean = true - ) = lineSegment(LineSegment(startX, startY, endX, endY), insert) - - fun lineSegment( - start: Vector2, - end: Vector2, - insert: Boolean = true - ) = lineSegment(LineSegment(start, end), insert) - - fun lineSegment( - lineSegment: LineSegment, - insert: Boolean = true - ) = contour(lineSegment.contour, insert) - - fun lineSegments( - lineSegments: List, - insert: Boolean = true - ) = lineSegments.map { - lineSegment(it, insert) - } - - fun segment( - start: Vector2, - c0: Vector2, - c1: Vector2, - end: Vector2, - insert: Boolean = true - ) = segment(Segment2D(start, c0, c1, end), insert) - - fun segment( - start: Vector2, - c0: Vector2, - end: Vector2, - insert: Boolean = true - ) = segment(Segment2D(start, c0, end), insert) - - fun segment( - start: Vector2, - end: Vector2, - insert: Boolean = true - ) = segment(Segment2D(start, end), insert) - - fun segment( - segment: Segment2D, - insert: Boolean = true - ) = contour(segment.contour, insert) - - fun segments( - segments: List, - insert: Boolean = true - ) = segments.map { - segment(it, insert) - } - - fun lineStrip( - points: List, - insert: Boolean = true - ) = contour(ShapeContour.fromPoints(points, false, YPolarity.CW_NEGATIVE_Y), insert) - - fun lineLoop( - points: List, - insert: Boolean = true - ) = contour(ShapeContour.fromPoints(points, true, YPolarity.CW_NEGATIVE_Y), insert) - - fun text( - text: String, - position: Vector2, - insert: Boolean = true - ): TextNode { - val g = GroupNode() - g.style.transform = Transform.Matrix(transform { translate(position.xy0) }) - val textNode = TextNode(text, null).apply { - this.style.fill = when (val f = this@CompositionDrawer.fill) { - is ColorRGBa -> Paint.RGB(f) - else -> Paint.None - } - - } - g.children.add(textNode) - if (insert) { - cursor.children.add(g) - } - return textNode - } - - fun textOnContour( - text: String, - contour: ShapeContour, - insert: Boolean = true - ): TextNode { - val textNode = TextNode(text, contour) - if (insert) { - cursor.children.add(textNode) - } - return textNode - } - - fun texts(text: List, positions: List) = - (text zip positions).map { - text(it.first, it.second) - } - - /** - * Adds an image to the composition tree - */ - fun image( - image: ColorBuffer, - x: Double = 0.0, - y: Double = 0.0, - insert: Boolean = true - ): ImageNode { - val node = ImageNode(image, x, y, width = image.width.toDouble(), height = image.height.toDouble()) - node.style.transform = Transform.Matrix(this.model) - if (insert) { - cursor.children.add(node) - } - return node - } - - fun composition(composition: Composition): CompositionNode { - val rootContainer = GroupNode() - val newRoot = composition.root.duplicate(insert = false) - newRoot.parent = rootContainer - rootContainer.children.add(newRoot) - rootContainer.transform *= model - rootContainer.parent = cursor - cursor.children.add(rootContainer) - - return rootContainer - } - - fun CompositionNode.translate(x: Double, y: Double, z: Double = 0.0) { - transform = transform.transform { - translate(x, y, z) - } - } - - fun CompositionNode.rotate(angleInDegrees: Double, pivot: Vector2 = Vector2.ZERO) { - transform = transform.transform { - translate(pivot.xy0) - rotate(Vector3.UNIT_Z, angleInDegrees) - translate(-pivot.xy0) - } - } - - fun CompositionNode.scale(scale: Double, pivot: Vector2 = Vector2.ZERO) { - transform = transform.transform { - translate(pivot.xy0) - scale(scale, scale, scale) - translate(-pivot.xy0) - } - } - - @OptIn(ExperimentalContracts::class) - fun CompositionNode.transform(builder: TransformBuilder.() -> Unit) { - contract { - callsInPlace(builder, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - return this.transform(builder) - } - - /** - * Returns a deep copy of a [CompositionNode]. - * If [insert] is true the copy is inserted at [cursor]. - * @return a deep copy of the node - */ - // TODO: Include new features - fun CompositionNode.duplicate(insert: Boolean = true): CompositionNode { - fun nodeCopy(node: CompositionNode): CompositionNode { - val copy = when (node) { - is ImageNode -> { - ImageNode(node.image, node.x, node.y, node.width, node.height) - } - - is ShapeNode -> { - ShapeNode(node.shape) - } - - is TextNode -> { - TextNode(node.text, node.contour) - } - - is GroupNode -> { - val children = node.children.map { nodeCopy(it) }.toMutableList() - val groupNode = GroupNode(children) - groupNode.children.forEach { - it.parent = groupNode - } - groupNode.attributes.putAll(node.attributes) - groupNode - } - } - copy.style = node.style - return copy - } - - val copy = nodeCopy(this) - if (insert) { - this@CompositionDrawer.cursor.children.add(copy) - copy.parent = cursor - } - return copy - } -} - -/** - * Draws a vector composition by applying a provided drawing function. - * - * @param documentBounds Defines the dimensions and bounds of the composition. Defaults to `defaultCompositionDimensions`. - * @param composition The target composition to be drawn on. If null, a new composition will be created. - * @param cursor Specifies the current position within the composition structure. Defaults to the root of the given composition cast as a `GroupNode`. - * @param drawFunction The actual drawing logic that will be executed in the drawing context of the `CompositionDrawer`. - * @return The resulting `Composition` after applying the drawing function. - */ -@OptIn(ExperimentalContracts::class) -fun drawComposition( - documentBounds: CompositionDimensions = defaultCompositionDimensions, - composition: Composition? = null, - cursor: GroupNode? = composition?.root as? GroupNode, - drawFunction: CompositionDrawer.() -> Unit -): Composition { - contract { - callsInPlace(drawFunction, InvocationKind.EXACTLY_ONCE) - } - return CompositionDrawer(documentBounds, composition, cursor).apply { drawFunction() }.composition -} - -/** - * Draws content into an existing composition using the provided drawing function. - * - * @param cursor an optional [GroupNode] that serves as the starting point for drawing. - * Defaults to the root of the composition if not provided. - * @param drawFunction the drawing logic to be executed using a [CompositionDrawer]. - * This function should contain instructions to draw content into the composition. - */ -@OptIn(ExperimentalContracts::class) -fun Composition.draw(cursor: GroupNode? = this.root as? GroupNode, drawFunction: CompositionDrawer.() -> Unit) { - contract { - callsInPlace(drawFunction, InvocationKind.EXACTLY_ONCE) - } - drawComposition(composition = this, drawFunction = drawFunction) -} diff --git a/orx-composition/src/commonMain/kotlin/CompositionStyleSheet.kt b/orx-composition/src/commonMain/kotlin/CompositionStyleSheet.kt deleted file mode 100644 index 0a64619c..00000000 --- a/orx-composition/src/commonMain/kotlin/CompositionStyleSheet.kt +++ /dev/null @@ -1,434 +0,0 @@ -@file:Suppress("RemoveExplicitTypeArguments") - -package org.openrndr.extra.composition -import org.openrndr.color.* -import org.openrndr.draw.* -import org.openrndr.extra.composition.AttributeOrPropertyKey.* -import org.openrndr.extra.composition.Inheritance.* -import org.openrndr.math.* -import org.openrndr.shape.Rectangle -import kotlin.jvm.JvmRecord -import kotlin.reflect.* - -enum class Inheritance { - INHERIT, - RESET -} - -sealed interface AttributeOrPropertyValue { - val value: Any? - override fun toString(): String -} - -sealed interface Paint : AttributeOrPropertyValue { - override val value: ColorRGBa? - - class RGB(override val value: ColorRGBa) : Paint { - override fun toString(): String { - val hexs = listOf(value.r, value.g, value.b).map { - (it.coerceIn(0.0, 1.0) * 255.0).toInt().toString(16).padStart(2, '0') - } - return hexs.joinToString(prefix = "#", separator = "") - } - } - - // This one is kept just in case, it's not handled in any way yet - object CurrentColor : Paint { - override val value: ColorRGBa - get() = TODO("Not yet implemented") - - override fun toString(): String = "currentcolor" - } - - object None : Paint { - override val value: ColorRGBa? = null - override fun toString(): String = "none" - } -} - -sealed interface Shade : AttributeOrPropertyValue { - override val value: ShadeStyle - - class Value(override val value: ShadeStyle) : Shade { - override fun toString(): String = "" - } -} - -sealed interface Length : AttributeOrPropertyValue { - override val value: Double - - class Pixels(override val value: Double) : Length { - companion object { - fun fromInches(value: Double) = Pixels(value * 96.0) - fun fromPicas(value: Double) = Pixels(value * 16.0) - fun fromPoints(value: Double) = Pixels(value * (4.0 / 3.0)) - fun fromCentimeters(value: Double) = Pixels(value * (96.0 / 2.54)) - fun fromMillimeters(value: Double) = Pixels(value * (96.0 / 25.4)) - fun fromQuarterMillimeters(value: Double) = Pixels(value * (96.0 / 101.6)) - } - - override fun toString(): String = "$value" - } - - class Percent(override val value: Double) : Length { - override fun toString(): String { - return "${value}%" - } - } - - enum class UnitIdentifier { - IN, - PC, - PT, - PX, - CM, - MM, - Q - } -} - -inline val Double.pixels: Length.Pixels - get() = Length.Pixels(this) -inline val Double.percent: Length.Percent - get() = Length.Percent(this) - -sealed interface Numeric : AttributeOrPropertyValue { - override val value: Double - - class Rational(override val value: Double) : Numeric { - override fun toString(): String = "$value" - } -} - -sealed interface Transform : AttributeOrPropertyValue { - override val value: Matrix44 - - class Matrix(override val value: Matrix44) : Transform { - override fun toString(): String { - return if (value == Matrix44.IDENTITY) { - "" - } else { - "matrix(${value.c0r0} ${value.c0r1} " + - "${value.c1r0} ${value.c1r1} " + - "${value.c3r0} ${value.c3r1})" - } - } - } - - object None : Transform { - override val value = Matrix44.IDENTITY - override fun toString(): String = "" - } -} - -sealed interface Visibility : AttributeOrPropertyValue { - override val value: Boolean - - object Visible : Visibility { - override val value = true - override fun toString() = "visible" - } - - object Hidden : Visibility { - override val value = false - override fun toString() = "hidden" - } - - // This exists because the spec specifies so, - // it is effectively Hidden. - object Collapse : Visibility { - override val value = false - override fun toString() = "collapse" - } -} - -sealed interface Display : AttributeOrPropertyValue { - override val value: Boolean - - object Inline : Display { - override val value = true - override fun toString() = "inline" - } - - object Block : Display { - override val value = true - override fun toString() = "block" - } - - object None : Display { - override val value = false - override fun toString() = "none" - } -} - -sealed interface LineCap : AttributeOrPropertyValue { - override val value: org.openrndr.draw.LineCap - - object Round : LineCap { - override val value = org.openrndr.draw.LineCap.ROUND - override fun toString() = "round" - } - - object Butt : LineCap { - override val value = org.openrndr.draw.LineCap.BUTT - override fun toString() = "butt" - } - - object Square : LineCap { - override val value = org.openrndr.draw.LineCap.SQUARE - override fun toString() = "square" - } -} - -sealed interface LineJoin : AttributeOrPropertyValue { - override val value: org.openrndr.draw.LineJoin - - object Miter : LineJoin { - override val value = org.openrndr.draw.LineJoin.MITER - override fun toString() = "miter" - } - - object Bevel : LineJoin { - override val value = org.openrndr.draw.LineJoin.BEVEL - override fun toString() = "bevel" - } - - object Round : LineJoin { - override val value = org.openrndr.draw.LineJoin.ROUND - override fun toString() = "round" - } -} - -enum class Align { - NONE, - X_MIN_Y_MIN, - X_MID_Y_MIN, - X_MAX_Y_MIN, - X_MIN_Y_MID, - X_MID_Y_MID, - X_MAX_Y_MID, - X_MIN_Y_MAX, - X_MID_Y_MAX, - X_MAX_Y_MAX -} - -enum class MeetOrSlice { - MEET, - SLICE -} - -@JvmRecord -data class AspectRatio(val align: Align, val meetOrSlice: MeetOrSlice) : AttributeOrPropertyValue { - override val value: AspectRatio - get() = this - - companion object { - val DEFAULT = AspectRatio(Align.X_MID_Y_MID, MeetOrSlice.MEET) - } - - override fun toString(): String { - if (this == DEFAULT) { - return "" - } - - val a = when (align) { - Align.NONE -> "none" - Align.X_MIN_Y_MIN -> "xMinYMin" - Align.X_MID_Y_MIN -> "xMidYMin" - Align.X_MAX_Y_MIN -> "xMaxYMin" - Align.X_MIN_Y_MID -> "xMinYMid" - Align.X_MID_Y_MID -> "xMidYMid" - Align.X_MAX_Y_MID -> "xMaxYMid" - Align.X_MIN_Y_MAX -> "xMinYMax" - Align.X_MID_Y_MAX -> "xMidYMax" - Align.X_MAX_Y_MAX -> "xMaxYMax" - } - val m = when (meetOrSlice) { - MeetOrSlice.MEET -> "meet" - MeetOrSlice.SLICE -> "slice" - } - - return "$a $m" - } -} - -sealed interface ViewBox : AttributeOrPropertyValue { - override val value: Rectangle? - - class Value(override val value: Rectangle) : ViewBox { - override fun toString(): String = - "${value.x.toInt()} ${value.y.toInt()} ${value.width.toInt()} ${value.height.toInt()}" - } - - /** - * The viewBox has not been defined, - * **not** that it doesn't exist. - */ - object None : ViewBox { - override val value: Rectangle? = null - override fun toString(): String = "" - } -} - -@JvmRecord -private data class PropertyBehavior(val inherit: Inheritance, val initial: AttributeOrPropertyValue) - -private object PropertyBehaviors { - val behaviors = HashMap() -} - -private class PropertyDelegate( - val name: AttributeOrPropertyKey, - inheritance: Inheritance, - val initial: T -) { - init { - PropertyBehaviors.behaviors[name] = PropertyBehavior(inheritance, initial) - } - - @Suppress("UNCHECKED_CAST") - operator fun getValue(style: Styleable, property: KProperty<*>): T { - return (style[name] ?: PropertyBehaviors.behaviors[name]!!.initial) as T - } - - operator fun setValue(style: Styleable, property: KProperty<*>, value: T?) { - style[name] = value - } -} - -sealed class Styleable { - val properties = HashMap() - - operator fun get(name: AttributeOrPropertyKey) = properties[name] - - operator fun set(name: AttributeOrPropertyKey, value: AttributeOrPropertyValue?) { - properties[name] = value - } - - infix fun inherit(from: Style): Style { - return Style().also { - from.properties.forEach { (name, value) -> - if (PropertyBehaviors.behaviors[name]?.inherit == INHERIT) { - it.properties[name] = value - } - } - it.properties.putAll(properties) - } - } - - // Because AttributeOrPropertyValue has a toString override, - // we can abuse it for equality checks. - fun isInherited(from: Styleable, attributeKey: AttributeOrPropertyKey): Boolean = - when (this.properties[attributeKey].toString()) { - from.properties[attributeKey].toString() -> true - PropertyBehaviors.behaviors[attributeKey]?.initial.toString() -> true - else -> false - } -} - -class DocumentStyle : Styleable() -class Style : Styleable() - -var DocumentStyle.viewBox by PropertyDelegate(VIEW_BOX, RESET, ViewBox.None) -var DocumentStyle.preserveAspectRatio by PropertyDelegate( - PRESERVE_ASPECT_RATIO, - RESET, AspectRatio.DEFAULT -) - -var Style.stroke by PropertyDelegate(STROKE, INHERIT, Paint.None) -var Style.strokeOpacity by PropertyDelegate(STROKE_OPACITY, INHERIT, Numeric.Rational(1.0)) -var Style.strokeWeight by PropertyDelegate(STROKE_WIDTH, INHERIT, 1.0.pixels) -var Style.miterLimit by PropertyDelegate(STROKE_MITERLIMIT, INHERIT, Numeric.Rational(4.0)) -var Style.lineCap by PropertyDelegate(STROKE_LINECAP, INHERIT, LineCap.Butt) -var Style.lineJoin by PropertyDelegate(STROKE_LINEJOIN, INHERIT, LineJoin.Miter) - -var Style.fill by PropertyDelegate(FILL, INHERIT, Paint.RGB(ColorRGBa.BLACK)) -var Style.fillOpacity by PropertyDelegate(FILL_OPACITY, INHERIT, Numeric.Rational(1.0)) - -var Style.transform by PropertyDelegate(TRANSFORM, RESET, Transform.None) - -// Okay so the spec says `display` isn't inheritable, but effectively acts so -// when the element and its children are excluded from the rendering tree. -var Style.display by PropertyDelegate(DISPLAY, RESET, Display.Inline) -var Style.opacity by PropertyDelegate(OPACITY, RESET, Numeric.Rational(1.0)) -var Style.visibility by PropertyDelegate(VISIBILITY, INHERIT, Visibility.Visible) - -var Style.x by PropertyDelegate(X, RESET, 0.0.pixels) -var Style.y by PropertyDelegate(Y, RESET, 0.0.pixels) -var Style.width by PropertyDelegate(WIDTH, RESET, 768.0.pixels) -var Style.height by PropertyDelegate(HEIGHT, RESET, 576.0.pixels) - -var Style.shadeStyle by PropertyDelegate(SHADESTYLE, INHERIT, Shade.Value(ShadeStyle())) - -enum class AttributeOrPropertyKey { - // @formatter:off - // Attributes - BASE_PROFILE { override fun toString() = "baseProfile" }, - CLASS { override fun toString() = "class" }, - CX { override fun toString() = "cx" }, - CY { override fun toString() = "cy" }, - D { override fun toString() = "d" }, - DX { override fun toString() = "dx" }, - DY { override fun toString() = "dy" }, - GRADIENT_UNITS { override fun toString() = "gradientUnits" }, - HEIGHT { override fun toString() = "height" }, - ID { override fun toString() = "id" }, - OFFSET { override fun toString() = "offset" }, - PATH_LENGTH { override fun toString() = "pathLength" }, - POINTS { override fun toString() = "points" }, - PRESERVE_ASPECT_RATIO { override fun toString() = "preserveAspectRatio" }, - R { override fun toString() = "r" }, - ROTATE { override fun toString() = "rotate" }, - RX { override fun toString() = "rx" }, - RY { override fun toString() = "ry" }, - SPACE { override fun toString() = "xml:space" }, - STYLE { override fun toString() = "style" }, - TRANSFORM { override fun toString() = "transform" }, - VERSION { override fun toString() = "version" }, - VIEW_BOX { override fun toString() = "viewBox" }, - WIDTH { override fun toString() = "width" }, - X { override fun toString() = "x" }, - X1 { override fun toString() = "x1" }, - X2 { override fun toString() = "x2" }, - Y { override fun toString() = "y" }, - Y1 { override fun toString() = "y1" }, - Y2 { override fun toString() = "y2" }, - - // Properties - COLOR { override fun toString() = "color" }, - DIRECTION { override fun toString() = "direction" }, - DISPLAY { override fun toString() = "display" }, - DISPLAY_ALIGN { override fun toString() = "display-align" }, - FILL { override fun toString() = "fill" }, - FILL_OPACITY { override fun toString() = "fill-opacity" }, - FILL_RULE { override fun toString() = "fill-rule" }, - FONT_FAMILY { override fun toString() = "font-family" }, - FONT_SIZE { override fun toString() = "font-size" }, - FONT_STYLE { override fun toString() = "font-style" }, - FONT_VARIANT { override fun toString() = "font-variant" }, - FONT_WEIGHT { override fun toString() = "font-weight" }, - OPACITY { override fun toString() = "opacity" }, - STOP_COLOR { override fun toString() = "stop-color" }, - STOP_OPACITY { override fun toString() = "stop-opacity" }, - STROKE { override fun toString() = "stroke" }, - STROKE_DASHARRAY { override fun toString() = "stroke-dasharray" }, - STROKE_DASHOFFSET { override fun toString() = "stroke-dashoffset" }, - STROKE_LINECAP { override fun toString() = "stroke-linecap" }, - STROKE_LINEJOIN { override fun toString() = "stroke-linejoin" }, - STROKE_MITERLIMIT { override fun toString() = "stroke-miterlimit" }, - STROKE_OPACITY { override fun toString() = "stroke-opacity" }, - STROKE_WIDTH { override fun toString() = "stroke-width" }, - TEXT_ALIGN { override fun toString() = "text-align" }, - TEXT_ANCHOR { override fun toString() = "text-anchor" }, - UNICODE_BIDI { override fun toString() = "unicode-bidi" }, - VECTOR_EFFECT { override fun toString() = "vector-effect" }, - VISIBILITY { override fun toString() = "visibility" }, - - // Made-up properties - // because "Compositions aren't SVGs and yadda yadda" - // this one's for you, edwin - SHADESTYLE { override fun toString() = "" }; - - abstract override fun toString(): String - // @formatter:on -} \ No newline at end of file diff --git a/orx-composition/src/commonMain/kotlin/DrawerExtensions.kt b/orx-composition/src/commonMain/kotlin/DrawerExtensions.kt deleted file mode 100644 index 1a35363c..00000000 --- a/orx-composition/src/commonMain/kotlin/DrawerExtensions.kt +++ /dev/null @@ -1,93 +0,0 @@ -package org.openrndr.extra.composition - -import org.openrndr.draw.Drawer - - -/** - * Renders a vector `Composition` onto the `Drawer`. This method applies transformations, styles, - * and renders the hierarchy of nodes from the given `Composition` object. - * - * @param composition The vector composition containing the root node and associated dimensions. - * It includes the styling and viewport transformation details necessary for rendering. - */ -fun Drawer.composition(composition: Composition) { - pushModel() - pushStyle() - - // viewBox transformation - model *= composition.calculateViewportTransform() - - fun node(compositionNode: CompositionNode) { - pushModel() - pushStyle() - model *= compositionNode.style.transform.value - - shadeStyle = (compositionNode.style.shadeStyle as Shade.Value).value - - when (compositionNode) { - is ShapeNode -> { - - compositionNode.style.stroke.let { - stroke = when (it) { - is Paint.RGB -> it.value.copy(alpha = 1.0) - Paint.None -> null - Paint.CurrentColor -> null - } - } - compositionNode.style.strokeOpacity.let { - stroke = when (it) { - is Numeric.Rational -> stroke?.opacify(it.value) - } - } - compositionNode.style.strokeWeight.let { - strokeWeight = when (it) { - is Length.Pixels -> it.value - is Length.Percent -> composition.normalizedDiagonalLength() * it.value / 100.0 - } - } - compositionNode.style.miterLimit.let { - miterLimit = when (it) { - is Numeric.Rational -> it.value - } - } - compositionNode.style.lineCap.let { - lineCap = it.value - } - compositionNode.style.lineJoin.let { - lineJoin = it.value - } - compositionNode.style.fill.let { - fill = when (it) { - is Paint.RGB -> it.value.copy(alpha = 1.0) - is Paint.None -> null - is Paint.CurrentColor -> null - } - } - compositionNode.style.fillOpacity.let { - fill = when (it) { - is Numeric.Rational -> fill?.opacify(it.value) - } - } - compositionNode.style.opacity.let { - when (it) { - is Numeric.Rational -> { - stroke = stroke?.opacify(it.value) - fill = fill?.opacify(it.value) - } - } - } - shape(compositionNode.shape) - } - is ImageNode -> { - image(compositionNode.image) - } - is TextNode -> TODO() - is GroupNode -> compositionNode.children.forEach { node(it) } - } - popModel() - popStyle() - } - node(composition.root) - popModel() - popStyle() -} \ No newline at end of file diff --git a/orx-composition/src/commonMain/kotlin/ProgramExtensions.kt b/orx-composition/src/commonMain/kotlin/ProgramExtensions.kt deleted file mode 100644 index da266380..00000000 --- a/orx-composition/src/commonMain/kotlin/ProgramExtensions.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.openrndr.extra.composition - -import org.openrndr.Program -import org.openrndr.shape.Rectangle -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -/** - * Draws a composition within the specified document bounds or an existing composition. - * This function utilizes a customizable draw function to define the drawing behavior. - * - * @param documentBounds Specifies the dimensions for the drawing area. Defaults to the full drawable area of the program. - * @param composition An optional existing composition to draw onto. If not provided, a new composition is created. - * @param cursor An optional cursor representing the current position in the composition hierarchy. Defaults to the root of the provided composition. - * @param drawFunction A lambda function defining the drawing operations to be performed using the `CompositionDrawer`. - * @return The resulting composition after applying the draw function. - */ -@OptIn(ExperimentalContracts::class) -fun Program.drawComposition( - documentBounds: CompositionDimensions = CompositionDimensions(0.0.pixels, 0.0.pixels, this.drawer.width.toDouble().pixels, this.drawer.height.toDouble().pixels), - composition: Composition? = null, - cursor: GroupNode? = composition?.root as? GroupNode, - drawFunction: CompositionDrawer.() -> Unit -): Composition { - contract { - callsInPlace(drawFunction, InvocationKind.EXACTLY_ONCE) - } - return CompositionDrawer(documentBounds, composition, cursor).apply { drawFunction() }.composition -} - -/** - * Draws a composition using the specified document bounds and drawing logic. - * Optionally, an existing composition and cursor can be passed to update or build upon them. - * - * @param documentBounds The bounding rectangle representing the area to be drawn. - * @param composition An optional existing composition to update. If null, a new composition will be created. - * @param cursor An optional cursor `GroupNode` used as the starting position for appending new elements. Defaults to the root of the provided composition if available. - * @param drawFunction A lambda function containing the drawing operations to be applied. - * @return The resulting `Composition` object after performing the drawing operations. - */ -@OptIn(ExperimentalContracts::class) -fun Program.drawComposition( - documentBounds: Rectangle, - composition: Composition? = null, - cursor: GroupNode? = composition?.root as? GroupNode, - drawFunction: CompositionDrawer.() -> Unit -): Composition { - contract { - callsInPlace(drawFunction, InvocationKind.EXACTLY_ONCE) - } - return CompositionDrawer(CompositionDimensions(documentBounds), composition, cursor).apply { drawFunction() }.composition -} \ No newline at end of file diff --git a/orx-composition/src/commonTest/kotlin/TestComposition.kt b/orx-composition/src/commonTest/kotlin/TestComposition.kt deleted file mode 100644 index b7374f19..00000000 --- a/orx-composition/src/commonTest/kotlin/TestComposition.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.openrndr.extra.composition - -import org.openrndr.shape.Shape -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNull - -class TestComposition { - val composition = let { _ -> - val root = GroupNode().also { it.id = "outer" } - root.children += GroupNode().also { - it.id = "inner" - } - root.children += ShapeNode(Shape.EMPTY).also { - it.id = "shape" - } - Composition(root) - } - - @Test - fun findGroup() { - assertEquals("outer", composition.findGroup("outer")?.id) - assertEquals("inner", composition.findGroup("inner")?.id) - assertNull(composition.findGroup("shape")) - } - - @Test - fun findShape() { - assertEquals("shape", composition.findShape("shape")?.id) - assertNull(composition.findShape("inner")) - assertNull(composition.findShape("outer")) - } - - @Test - fun findImage() { - assertNull(composition.findImage("inner")) - assertNull(composition.findImage("outer")) - assertNull(composition.findImage("shape")) - } -} diff --git a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer01.kt b/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer01.kt deleted file mode 100644 index 154e9892..00000000 --- a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.drawComposition -import org.openrndr.extra.svg.toSVG -import org.openrndr.math.Vector2 - -/** - * Demonstrates how to - * - * - Create a Composition - * - Draw it on the program window - * - Save it to an SVG file - * - Print the SVG content as text - */ -fun main() = application { - program { - val composition = drawComposition { - fill = ColorRGBa.PINK - stroke = ColorRGBa.BLACK - strokeWeight = 10.0 - circle(Vector2(width / 2.0, height / 2.0), 100.0) - circle(Vector2(200.0, 200.0), 50.0) - } - - // print the svg to the console - println(composition.toSVG()) - - // save svg to a File - //composition.saveToFile(File("/path/to/design.svg")) - - extend { - drawer.clear(ColorRGBa.WHITE) - - // draw the composition to the screen - drawer.composition(composition) - } - } -} diff --git a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer02.kt b/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer02.kt deleted file mode 100644 index f8b32370..00000000 --- a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer02.kt +++ /dev/null @@ -1,32 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.ClipMode -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.drawComposition - -/** - * Demonstrates how to draw a Composition and how to use - * `ClipMode.REVERSE_DIFFERENCE` to clip shapes. - * - * The first shape clips part of the second one away, - * producing a shape that seems to be behind the first one. - * - * Without clipping, the second circle would cover part of the first one. - */ -fun main() = application { - program { - val composition = drawComposition { - fill = null - circle(width / 2.0, height / 2.0, 100.0) - - fill = ColorRGBa.BLACK - clipMode = ClipMode.REVERSE_DIFFERENCE - circle(width / 2.0 + 50.0, height / 2.0, 100.0) - } - - extend { - drawer.clear(ColorRGBa.PINK) - drawer.composition(composition) - } - } -} diff --git a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer03.kt b/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer03.kt deleted file mode 100644 index d9266f17..00000000 --- a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer03.kt +++ /dev/null @@ -1,42 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.ClipMode -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.drawComposition -import org.openrndr.extra.svg.saveToFile -import java.io.File - -/** - * Draws a composition using 3 circles and `ClipMode.REVERSE_DIFFERENCE`. - * - * A println() demonstrates that the result contains 3 shapes: - * a complete circle, a moon-like shape, and a shape with two small black areas. - * - * One way to verify this is by saving the design as an SVG file and opening - * it in vector editing software. - * - */ -fun main() = application { - program { - val composition = drawComposition { - fill = null - clipMode = ClipMode.REVERSE_DIFFERENCE - - circle(width / 2.0 - 50.0, height / 2.0, 100.0) - circle(width / 2.0 + 50.0, height / 2.0, 100.0) - - fill = ColorRGBa.BLACK - circle(width / 2.0, height / 2.0, 100.0) - } - - println(composition.findShapes().size) - - // save svg to a File - //composition.saveToFile(File("/path/to/design.svg")) - - extend { - drawer.clear(ColorRGBa.PINK) - drawer.composition(composition) - } - } -} diff --git a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer04.kt b/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer04.kt deleted file mode 100644 index 01d04c1d..00000000 --- a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer04.kt +++ /dev/null @@ -1,61 +0,0 @@ -import org.openrndr.MouseButton -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.draw -import org.openrndr.extra.composition.drawComposition -import org.openrndr.math.Polar -import org.openrndr.math.Vector2 -import kotlin.math.sin - -/** - * Demonstrates how to add content to and how to clear an existing Composition. - * - * A number of circles are added when the program starts. - * Dragging the mouse button adds more circles. - * Right-clicking the mouse clears the Composition. - */ -fun main() = application { - program { - val composition = drawComposition { } - - // initial Composition content - repeat(360) { - composition.draw { - fill = ColorRGBa.WHITE - val r = sin(it / 90.0) * 30 + 40 - circle( - drawer.bounds.center + Polar(it * 5.0, r * 2).cartesian, - r - ) - } - } - - extend { - drawer.clear(ColorRGBa.PINK) - drawer.composition(composition) - } - - // To avoid drawing too many circles when dragging the mouse, - // we require a minimum separation between them - var lastPosition = Vector2.INFINITY - val minSeparation = 10.0 - - mouse.dragged.listen { - if(it.position.distanceTo(lastPosition) > minSeparation) { - composition.draw { - fill = ColorRGBa.WHITE - // the drag speed affects the radius - circle(it.position, 5.0 + it.dragDisplacement.length * 5.0) - } - lastPosition = it.position - } - } - - mouse.buttonDown.listen { - if (it.button == MouseButton.RIGHT) { - composition.clear() - } - } - } -} diff --git a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer05.kt b/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer05.kt deleted file mode 100644 index 5bea2f58..00000000 --- a/orx-composition/src/jvmDemo/kotlin/DemoCompositionDrawer05.kt +++ /dev/null @@ -1,43 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.composition.composition -import org.openrndr.extra.composition.drawComposition -import org.openrndr.math.Vector2 -import org.openrndr.extra.svg.saveToFile -import java.io.File - -/** - * Demonstrates how to - * - * - Create a Composition with a group - * - Add XML attributes so the group appears as a layer in Inkscape - */ -fun main() = application { - program { - val composition = drawComposition { - val layer = group { - fill = ColorRGBa.PINK - stroke = ColorRGBa.BLACK - strokeWeight = 10.0 - circle(Vector2(width / 2.0, height / 2.0), 100.0) - circle(Vector2(200.0, 200.0), 50.0) - } - // Demonstrate how to set custom attributes on the `GroupNode` - // These are stored in the SVG file. - - layer.id = "Layer_2" - layer.attributes["inkscape:label"] = "Layer 1" - layer.attributes["inkscape:groupmode"] = "layer" - } - - // save svg to a File - //composition.saveToFile(File("/path/to/design.svg")) - - extend { - drawer.clear(ColorRGBa.WHITE) - - // draw the composition to the screen - drawer.composition(composition) - } - } -} diff --git a/orx-compositor/README.md b/orx-compositor/README.md deleted file mode 100644 index 94e34a14..00000000 --- a/orx-compositor/README.md +++ /dev/null @@ -1,275 +0,0 @@ -# orx-compositor - -Toolkit to make composite (layered) images using blend modes and filters. - -## Usage - -A `Composite` is made using the `compose {}` builder. We start with a very simple example: -```kotlin -fun main() = application { - program { - val composite = compose { - // this is only executed once - val position = Vector2(100.0, 100.0) - - draw { - // code inside draw blocks is executed whenever the composite is drawn - drawer.circle(position, 100.0) - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` - -### Layers - -A `Composite` with two layers looks like this. - -```kotlin -fun main() = application { - program { - val composite = compose { - // this layer is drawn first - layer { - val position = Vector2(100.0, 100.0) - draw { - drawer.circle(position, 100.0) - } - } - - // this layer is drawn second - layer { - val position = Vector2(150.0, 150.0) - draw { - drawer.circle(position, 100.0) - } - blend(Multiply()) - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` - -Layers can be nested: - -```kotlin -fun main() = application { - program { - val composite = compose { - layer { - layer { - // this draw is processed first - draw { } - } - layer { - // this draw is processed second - draw { } - } - val position = Vector2(100.0, 100.0) - draw { - // this draw is processed third - drawer.circle(position, 100.0) - } - } - - // this layer is drawn second - layer { - val position = Vector2(150.0, 150.0) - draw { - drawer.circle(position, 100.0) - } - blend(Multiply()) - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` - -### Asides - -An aside is a layer which output is not directly included in the composite drawing. The contents of an aside can be used in layers and post-processing. - -```kotlin -fun main() = application { - program { - val composite = compose { - - val a = aside { - val position = Vector2(250.0, 250.0) - draw { - drawer.circle(position, 100.0) - } - } - - // this layer is drawn second - layer { - val position = Vector2(150.0, 150.0) - draw { - drawer.image(a) - drawer.circle(position, 100.0) - } - blend(Multiply()) - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` - - -### Post-processing - -```kotlin -fun main() = application { - program { - val composite = compose { - layer { - draw { - - } - // the first Filter1to1 to apply - post(ApproximateGaussianBlur()) { - // here is code that is executed everytime the layer is drawn - } - - // the second Filter1to1 to apply - post(ColorCorrection()) { - // here is code that is executed everytime the layer is drawn - } - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` -#### Using filters with multiple inputs - -Some filters use more than a single input in producing their output, these filters inherit from Filter2to1, Filter3to1, Filter4to1 etc. -One such filter is `DirectionalBlur` which has image and direction field inputs. In the following example we use an aside to -draw a direction field which is fed into the blur filter. - -```kotlin -fun main() = application { - program { - val composite = compose { - val directionField = aside { - draw { - // [...] - } - } - layer { - draw { - // [...] - } - post(DirectionalBlur(), directionField) - } - } - extend { - // draw the composite - composite.draw(drawer) - } - } -} -``` - -##### Example - -```kotlin -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.compositor.* -import org.openrndr.extra.fx.blend.Add -import org.openrndr.extra.fx.edges.EdgesWork -import org.openrndr.extra.gui.GUI -import org.openrndr.math.Vector2 - -fun main() = application { - configure { - width = 768 - height = 768 - } - program { - val w2 = width / 2.0 - val h2 = height / 2.0 - - val c = compose { - draw { - drawer.fill = ColorRGBa.PINK - drawer.circle(width / 2.0, height / 2.0, 10.0) - } - - layer { - blend(Add()) - - draw { - drawer.circle(width / 2.0, height / 2.0, 100.0) - } - post(ApproximateGaussianBlur()) { - window = 10 - sigma = Math.cos(seconds * 10.0) * 10.0 + 10.0 - } - } - } - extend(gui) - extend { - c.draw(drawer) - } - } -} -``` - -## Demos -### DemoAside01 - -Demonstrates how to reuse a layer in the Compositor by using `aside { }`. - -The `aside` block can make use of `draw`, `mask` and `post`. In this demo -only the latter is used to apply a full-window animated `Checkers` effect. -The `aside` is not displayed by default. - -Next, a white, centered circle is drawn. - -Finally, a `HashBlurDynamic` post-processing effect is applied. The dynamic -version of the HashBlur effect multiplies its `radius` argument by the red component -of the provided texture (containing the animated checkers in this case). - -![DemoAside01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-compositor/images/DemoAside01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoAside01.kt) - -### DemoCompositor01 - -Compositor demo showing 3 layers of moving items -with a different amount of blur in each layer, -simulating depth of field - -![DemoCompositor01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-compositor/images/DemoCompositor01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositor01.kt) - -### DemoCompositor02 - -Demonstration of using [BufferMultisample] on a per layer basis. -Try changing which layer has multisampling applied and observe the results. - -![DemoCompositor02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-compositor/images/DemoCompositor02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositor02.kt) diff --git a/orx-compositor/build.gradle.kts b/orx-compositor/build.gradle.kts deleted file mode 100644 index a62892c6..00000000 --- a/orx-compositor/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-fx")) - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-fx")) - implementation(project(":orx-compositor")) - } - } - } -} \ No newline at end of file diff --git a/orx-compositor/src/commonMain/kotlin/Compositor.kt b/orx-compositor/src/commonMain/kotlin/Compositor.kt deleted file mode 100644 index 43da674f..00000000 --- a/orx-compositor/src/commonMain/kotlin/Compositor.kt +++ /dev/null @@ -1,396 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.compositor - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.SourceIn -import org.openrndr.extra.fx.blend.SourceOut -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import kotlin.jvm.JvmRecord - - -enum class LayerType { - LAYER, - ASIDE -} - -private val sourceOut = persistent { SourceOut() } -private val sourceIn = persistent { SourceIn() } - -/** - * A single layer representation - */ -@Description("Layer") -open class Layer internal constructor( - val type: LayerType, - private val bufferMultisample: BufferMultisample = BufferMultisample.Disabled -) { - var maskLayer: Layer? = null - var drawFunc: () -> Unit = {} - val children: MutableList = mutableListOf() - var blendFilter: Pair Unit>? = null - val postFilters: MutableList, Filter.() -> Unit>> = mutableListOf() - var colorType = ColorType.UINT8_SRGB - private var unresolvedAccumulation: ColorBuffer? = null - var accumulation: ColorBuffer? = null - - @BooleanParameter("enabled") - var enabled = true - - @BooleanParameter("Invert mask") - var invertMask = false - var clearColor: ColorRGBa? = ColorRGBa.TRANSPARENT - private var layerTarget: RenderTarget? = null - - val result: ColorBuffer - get() { - return layerTarget?.colorBuffer(0) ?: error("layer result not ready") - } - - /** - * draw the layer - */ - protected fun drawLayer(drawer: Drawer, cache: ColorBufferCache) { - if (!enabled) { - return - } - - val activeRenderTarget = RenderTarget.active - - if (shouldCreateLayerTarget(activeRenderTarget)) { - createLayerTarget(activeRenderTarget, drawer, bufferMultisample) - } - - layerTarget?.let { target -> - maskLayer?.let { - if (it.shouldCreateLayerTarget(activeRenderTarget)) { - it.createLayerTarget(activeRenderTarget, drawer, it.bufferMultisample) - } - - it.layerTarget?.let { maskRt -> - drawer.isolatedWithTarget(maskRt) { - drawer.fill = ColorRGBa.WHITE - drawer.stroke = ColorRGBa.WHITE - drawer.clear(ColorRGBa.TRANSPARENT) - it.drawFunc() - } - } - } - - drawer.isolatedWithTarget(target) { - children.filter { it.type == LayerType.ASIDE }.forEach { - it.drawLayer(drawer, cache) - } - - clearColor?.let { - drawer.clear(it) - } - drawFunc() - children.filter { it.type == LayerType.LAYER }.forEach { - it.drawLayer(drawer, cache) - } - } - - val layerPost = if (postFilters.isEmpty()) target.colorBuffer(0) else postFilters.let { filters -> - val targets = cache[ColorBufferCacheKey(colorType, target.contentScale)] - targets.forEach { - it.fill(ColorRGBa.TRANSPARENT) - } - var localSource = target.colorBuffer(0) - for ((i, filter) in filters.withIndex()) { - filter.first.apply(filter.third) - val sources = - arrayOf(localSource) + filter.second.map { it.result } - .toTypedArray() - filter.first.apply(sources, arrayOf(targets[i % targets.size])) - localSource = targets[i % targets.size] - } - targets[postFilters.lastIndex % targets.size] - } - - maskLayer?.let { - val maskFilter = if (invertMask) sourceOut else sourceIn - maskFilter.apply(arrayOf(layerPost, it.layerTarget!!.colorBuffer(0)), layerPost) - } - - if (type == LayerType.ASIDE) { - if (postFilters.isNotEmpty()) { - require(layerPost != result) - layerPost.copyTo(result) - } - } else if (type == LayerType.LAYER) { - val localBlendFilter = blendFilter - if (localBlendFilter == null) { - drawer.isolated { - drawer.defaults() - if (bufferMultisample == BufferMultisample.Disabled) { - drawer.image(layerPost, layerPost.bounds, drawer.bounds) - } else { - layerPost.copyTo(accumulation!!) - drawer.image(accumulation!!, layerPost.bounds, drawer.bounds) - } - } - } else { - localBlendFilter.first.apply(localBlendFilter.second) - activeRenderTarget.colorBuffer(0).copyTo(unresolvedAccumulation!!) - if (bufferMultisample == BufferMultisample.Disabled) { - localBlendFilter.first.apply( - arrayOf(unresolvedAccumulation!!, layerPost), - unresolvedAccumulation!! - ) - } else { - layerPost.copyTo(accumulation!!) - localBlendFilter.first.apply( - arrayOf(unresolvedAccumulation!!, accumulation!!), - unresolvedAccumulation!! - ) - } - - if (activeRenderTarget !is ProgramRenderTarget) { - unresolvedAccumulation!!.copyTo(target.colorBuffer(0)) - } - unresolvedAccumulation!!.copyTo(activeRenderTarget.colorBuffer(0)) - } - } - } - } - - private fun shouldCreateLayerTarget(activeRenderTarget: RenderTarget): Boolean { - return layerTarget == null - || ((layerTarget?.width != activeRenderTarget.width || layerTarget?.height != activeRenderTarget.height) - && activeRenderTarget.width > 0 && activeRenderTarget.height > 0) - } - - private fun createLayerTarget( - activeRenderTarget: RenderTarget, drawer: Drawer, bufferMultisample: BufferMultisample - ) { - layerTarget?.destroy() - layerTarget = renderTarget( - activeRenderTarget.width, activeRenderTarget.height, - activeRenderTarget.contentScale, bufferMultisample - ) { - colorBuffer(type = colorType) - depthBuffer() - } - if (bufferMultisample != BufferMultisample.Disabled) { - accumulation?.destroy() - accumulation = colorBuffer( - activeRenderTarget.width, activeRenderTarget.height, - activeRenderTarget.contentScale, type = colorType - ) - } - unresolvedAccumulation?.destroy() - unresolvedAccumulation = colorBuffer( - activeRenderTarget.width, activeRenderTarget.height, - activeRenderTarget.contentScale, type = colorType - ) - layerTarget?.let { - drawer.withTarget(it) { - drawer.clear(ColorRGBa.TRANSPARENT) - } - } - } - - fun Drawer.image(layer: Layer) { - val cb = layer.result - image(cb) - } -} - -/** - * Creates a new layer within the current layer, allowing for hierarchical composition of drawings. - * The newly created layer inherits properties such as color type and multisample from the parent layer - * unless explicitly overridden. A custom lambda function can be applied to configure the new layer. - * - * @param colorType The color type for the new layer. Defaults to the color type of the parent layer. - * @param multisample Specifies the multisampling mode for the new layer to control antialiasing. - * Defaults to [BufferMultisample.Disabled]. - * @param function A configuration block where the properties and behavior of the new layer - * can be defined. - * @return The newly created layer, which is also added as a child of the parent layer. - */ -@OptIn(ExperimentalContracts::class) -fun Layer.layer( - colorType: ColorType = this.colorType, - multisample: BufferMultisample = BufferMultisample.Disabled, - function: Layer.() -> Unit -): Layer { - contract { - callsInPlace(function, InvocationKind.EXACTLY_ONCE) - } - val layer = Layer(LayerType.LAYER, multisample).apply { function() } - layer.colorType = colorType - children.add(layer) - return layer -} - -/** - * Creates a new `Layer` of type `ASIDE` as a child of the current layer, applies the specified function - * to configure it, and returns the created layer. - * - * @param colorType The color type for the new layer. Defaults to the color type of the parent layer. - * @param multisample Multisampling configuration for the new layer. Defaults to `BufferMultisample.Disabled`. - * @param function Configuration function applied to the newly created layer. - * @return The newly created `Layer` of type `ASIDE`. - */ -@OptIn(ExperimentalContracts::class) -fun Layer.aside( - colorType: ColorType = this.colorType, - multisample: BufferMultisample = BufferMultisample.Disabled, - function: Layer.() -> Unit -): Layer { - contract { - callsInPlace(function, InvocationKind.EXACTLY_ONCE) - } - val layer = Layer(LayerType.ASIDE, multisample).apply { function() } - layer.colorType = colorType - children.add(layer) - return layer -} - -fun Layer.apply(drawer: Drawer, - filter: T, source: Layer, colorType: ColorType = this.colorType, - function: T.() -> Unit -): Layer { - val layer = Layer(LayerType.ASIDE) - layer.colorType = colorType - layer.draw { - drawer.image(source.result) - } - layer.post(filter, function) - children.add(layer) - return layer -} - -fun Layer.apply(drawer: Drawer, - filter: T, source0: Layer, source1:Layer, colorType: ColorType = this.colorType, - function: T.() -> Unit -): Layer { - val layer = Layer(LayerType.ASIDE) - layer.colorType = colorType - layer.draw { - drawer.image(source0.result) - } - layer.post(filter, source1, function) - children.add(layer) - return layer -} - - -/** - * set the draw contents of the layer - */ -fun Layer.draw(function: () -> Unit) { - drawFunc = function -} - - -/** - * the drawing acts as a mask on the layer - */ -fun Layer.mask(function: () -> Unit) { - maskLayer = Layer(LayerType.LAYER).apply { - this.drawFunc = function - } -} - -/** - * add a post-processing filter to the layer - */ -fun Layer.post(filter: F, configure: F.() -> Unit = {}): F { - @Suppress("UNCHECKED_CAST") - postFilters.add(Triple(filter as Filter, emptyArray(), configure as Filter.() -> Unit)) - return filter -} - -fun Layer.post(filter: F, input1: Layer, configure: F.() -> Unit = {}): F { - require(input1.type == LayerType.ASIDE) - @Suppress("UNCHECKED_CAST") - postFilters.add(Triple(filter as Filter, arrayOf(input1), configure as Filter.() -> Unit)) - return filter -} - -fun Layer.post(filter: F, input1: Layer, input2: Layer, configure: F.() -> Unit = {}): F { - require(input1.type == LayerType.ASIDE) - require(input2.type == LayerType.ASIDE) - @Suppress("UNCHECKED_CAST") - postFilters.add(Triple(filter as Filter, arrayOf(input1, input2), configure as Filter.() -> Unit)) - return filter -} - - -/** - * add a blend filter to the layer - */ -fun Layer.blend(filter: F, configure: F.() -> Unit = {}): F { - @Suppress("UNCHECKED_CAST") - blendFilter = Pair(filter as Filter, configure as Filter.() -> Unit) - return filter -} - -@JvmRecord -data class ColorBufferCacheKey( - val colorType: ColorType, - val contentScale: Double -) - -class ColorBufferCache(val width: Int, val height: Int) { - val cache = mutableMapOf>() - - operator fun get(key: ColorBufferCacheKey): List { - return cache.getOrPut(key) { - listOf( - colorBuffer(width, height, type = key.colorType, contentScale = key.contentScale), - colorBuffer(width, height, type = key.colorType, contentScale = key.contentScale), - ) - } - } - - fun destroy() { - cache.forEach { - it.value.forEach { cb -> cb.destroy() } - } - } -} - -class Composite(val session: Session?) : Layer(LayerType.LAYER), AutoCloseable { - private var cache = ColorBufferCache(RenderTarget.active.width, RenderTarget.active.height) - fun draw(drawer: Drawer) { - - session?.push() - if (cache.width != RenderTarget.active.width || cache.height != RenderTarget.active.height) { - cache.destroy() - cache = ColorBufferCache(RenderTarget.active.width, RenderTarget.active.height) - } - drawLayer(drawer, cache) - session?.pop() - } - - override fun close() { - session?.close() - } -} - -/** - * Creates a `Composite` object and allows configuration of its layers and effects within the provided `function`. - * - * @param function the lambda function used to configure the `Composite`. It is invoked with the `Composite` instance as the receiver. - * @return the configured `Composite` object. - */ -@OptIn(ExperimentalContracts::class) -fun compose(function: Composite.() -> Unit): Composite { - contract { - callsInPlace(function, InvocationKind.EXACTLY_ONCE) - } - - val session = Session.active.fork() - val root = Composite(session) - root.function() - session.pop() - return root -} \ No newline at end of file diff --git a/orx-compositor/src/jvmDemo/kotlin/DemoAside01.kt b/orx-compositor/src/jvmDemo/kotlin/DemoAside01.kt deleted file mode 100644 index be5c078f..00000000 --- a/orx-compositor/src/jvmDemo/kotlin/DemoAside01.kt +++ /dev/null @@ -1,49 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorType -import org.openrndr.extra.compositor.* -import org.openrndr.extra.fx.blur.HashBlurDynamic -import org.openrndr.extra.fx.patterns.Checkers -import kotlin.math.cos - -/** - * Demonstrates how to reuse a layer in the Compositor by using `aside { }`. - * - * The `aside` block can make use of `draw`, `mask` and `post`. In this demo - * only the latter is used to apply a full-window animated `Checkers` effect. - * The `aside` is not displayed by default. - * - * Next, a white, centered circle is drawn. - * - * Finally, a `HashBlurDynamic` post-processing effect is applied. The dynamic - * version of the HashBlur effect multiplies its `radius` argument by the red component - * of the provided texture (containing the animated checkers in this case). - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val c = compose { - layer { - val a = aside(colorType = ColorType.FLOAT32) { - post(Checkers()) { - this.size = cos(seconds + 2.0) * 0.5 + 0.5 - } - } - draw { - drawer.clear(ColorRGBa.GRAY.shade(0.5)) - drawer.circle(width / 2.0, height / 2.0, 100.0) - } - post(HashBlurDynamic(), a) { - time = seconds - radius = 25.0 - } - } - } - extend { - c.draw(drawer) - } - } -} diff --git a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor01.kt b/orx-compositor/src/jvmDemo/kotlin/DemoCompositor01.kt deleted file mode 100644 index 986ca540..00000000 --- a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor01.kt +++ /dev/null @@ -1,87 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.Drawer -import org.openrndr.extra.compositor.compose -import org.openrndr.extra.compositor.draw -import org.openrndr.extra.compositor.layer -import org.openrndr.extra.compositor.post -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import org.openrndr.math.Vector3 -import kotlin.random.Random - -/** - * Compositor demo showing 3 layers of moving items - * with a different amount of blur in each layer, - * simulating depth of field - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - data class Item(var pos: Vector3, val color: ColorRGBa) { - fun draw(drawer: Drawer) { - pos -= Vector3(pos.z * 3.0, 0.0, 0.0) - if (pos.x < -260.0) { - pos = Vector3(width + 260.0, pos.y, pos.z) - } - drawer.fill = null - drawer.stroke = color - drawer.strokeWeight = 2.0 + 30.0 * pos.z * pos.z - drawer.circle(pos.xy, 10.0 + 250.0 * pos.z * pos.z) - } - } - - val items = List(50) { - val pos = Vector3(Random.nextDouble() * width, - Random.nextDouble(0.3, 0.7) * height, - Random.nextDouble()) - Item(pos, ColorRGBa.PINK.shade(Random.nextDouble(0.2, 0.9))) - }.sortedBy { it.pos.z } - - val composite = compose { - layer { - draw { - drawer.stroke = null - items.filter { it.pos.z < 0.33 }.forEach { - it.draw(drawer) - } - } - post(ApproximateGaussianBlur()) { - window = 25 - sigma = 5.00 - } - } - - layer { - draw { - drawer.stroke = null - items.filter { it.pos.z in 0.33..0.66 }.forEach { - it.draw(drawer) - } - } - } - - layer { - draw { - drawer.stroke = null - items.filter { it.pos.z > 0.66 }.forEach { - it.draw(drawer) - } - } - post(ApproximateGaussianBlur()) { - window = 25 - sigma = 5.00 - } - } - } - - extend { - drawer.clear(rgb(0.2)) - composite.draw(drawer) - } - } -} diff --git a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt b/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt deleted file mode 100644 index 7f6bb58d..00000000 --- a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt +++ /dev/null @@ -1,50 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.BufferMultisample -import org.openrndr.extra.compositor.blend -import org.openrndr.extra.compositor.compose -import org.openrndr.extra.compositor.draw -import org.openrndr.extra.compositor.layer -import org.openrndr.extra.fx.blend.Normal -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -/** - * Demonstration of using [BufferMultisample] on a per layer basis. - * Try changing which layer has multisampling applied and observe the results. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val layers = compose { - layer(multisample = BufferMultisample.SampleCount(4)) { - draw { - drawer.translate(drawer.bounds.center) - drawer.rotate(seconds + 5) - drawer.fill = ColorRGBa.PINK - drawer.rectangle(Rectangle.fromCenter(Vector2.ZERO, 200.0)) - } - - layer() { - blend(Normal()) { - clip = true - } - draw { - drawer.rotate((seconds + 5) * -2) - drawer.fill = ColorRGBa.WHITE - drawer.rectangle(Rectangle.fromCenter(Vector2.ZERO, 200.0)) - } - } - } - } - - extend { - drawer.clear(ColorRGBa.WHITE) - layers.draw(drawer) - } - } -} \ No newline at end of file diff --git a/orx-delegate-magic/README.md b/orx-delegate-magic/README.md deleted file mode 100644 index 9bd42caf..00000000 --- a/orx-delegate-magic/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# orx-delegate magic - -Collection of magical property delegators. For tracking variable change or -interpolate towards the value of a variable. - -## Delegated properties - -[Kotlin documentation](https://kotlinlang.org/docs/delegated-properties.html) - -## Property smoothing - -```kotlin -val state = object { - var radius = 10.0 -} - -val smoothRadius by smoothing(state::radius) -``` - - -## Property dynamics - -```kotlin -val state = object { - var radius = 10.0 -} - -val dynamicRadius by springForcing(state::radius) -``` - -## Property tracking - -```kotlin -val state = object { - var radius = 10.0 -} - -val radiusHistory by tracking(state::radius) -``` - -## Demos -### DemoDifferencing01 - - - -![DemoDifferencing01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-delegate-magic/images/DemoDifferencing01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDifferencing01.kt) - -### DemoFollowing01 - -Demonstrates using delegate-magic tools with -[Double] and [Vector2]. - -The white circle's position uses [following]. -The red circle's position uses [smoothing]. - -`following` uses physics (velocity and acceleration). -`smoothing` eases values towards the target. - -Variables using delegates (`by`) interpolate -toward target values, shown as gray lines. - -The behavior of the delegate-magic functions can be configured -via arguments that affect their output. - -The arguments come in pairs of similar name: -The first one, often of type [Double], is constant, -The second one contains `Property` in its name and can be -modified after its creation and even be linked to a UI -to modify the behavior of the delegate function in real time. -The `Property` argument overrides the other. - -![DemoFollowing01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-delegate-magic/images/DemoFollowing01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFollowing01.kt) - -### DemoSmoothing01 - - - -![DemoSmoothing01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-delegate-magic/images/DemoSmoothing01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoSmoothing01.kt) - -### DemoSpring01 - - - -![DemoSpring01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-delegate-magic/images/DemoSpring01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoSpring01.kt) diff --git a/orx-delegate-magic/build.gradle.kts b/orx-delegate-magic/build.gradle.kts deleted file mode 100644 index 7713770d..00000000 --- a/orx-delegate-magic/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-delegate-magic")) - implementation(project(":orx-jvm:orx-gui")) - } - } - } -} \ No newline at end of file diff --git a/orx-delegate-magic/src/commonMain/kotlin/aggregation/Aggregators.kt b/orx-delegate-magic/src/commonMain/kotlin/aggregation/Aggregators.kt deleted file mode 100644 index a17ba445..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/aggregation/Aggregators.kt +++ /dev/null @@ -1,49 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.aggregation - -import kotlin.math.abs - -/** - * Return element with largest magnitude - * @since 0.4.3 - */ -fun List.maxMag(): Double { - - this.max() - if (isEmpty()) { - error("list is empty") - } - var maxMag = Double.NEGATIVE_INFINITY - var maxMagWithSign = 0.0 - - for (i in indices) { - val a = abs(this[i]) - if (a > maxMag) { - maxMag = a - maxMagWithSign = this[i] - } - } - return maxMagWithSign -} - -/** - * Return element with smallest magnitude - * @since 0.4.3 - */ -fun List.minMag(): Double { - if (isEmpty()) { - error("list is empty") - } - var minMag = Double.POSITIVE_INFINITY - var minMagWithSign = 0.0 - - for (i in indices) { - val a = abs(this[i]) - if (a < minMag) { - minMag = a - minMagWithSign = this[i] - } - } - return minMagWithSign -} \ No newline at end of file diff --git a/orx-delegate-magic/src/commonMain/kotlin/aggregation/ListAggregation.kt b/orx-delegate-magic/src/commonMain/kotlin/aggregation/ListAggregation.kt deleted file mode 100644 index 5260db33..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/aggregation/ListAggregation.kt +++ /dev/null @@ -1,46 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.aggregation - -import org.openrndr.Clock -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -/** - * Property delegation by list aggregation - */ -class ListPropertyAggregation( - private val clock: Clock, - private val property: KProperty0>, - val aggregationFunction: (List) -> R -) { - private var output: R? = null - private var lastTime: Double? = null - - operator fun getValue(any: Any?, property: KProperty<*>): R { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - output = aggregationFunction(this.property.get()) - } - } else { - output = aggregationFunction(this.property.get()) - } - - lastTime = clock.seconds - return output!! - } -} - -/** - * Aggregate list property - * @param property the list property to aggregate - * @param aggregationFunction the function that is - * @since 0.4.3 - */ -fun Clock.aggregating( - property: KProperty0>, - aggregationFunction: (List) -> R -): ListPropertyAggregation { - return ListPropertyAggregation(this, property, aggregationFunction) -} \ No newline at end of file diff --git a/orx-delegate-magic/src/commonMain/kotlin/difference/PropertyDifferencer.kt b/orx-delegate-magic/src/commonMain/kotlin/difference/PropertyDifferencer.kt deleted file mode 100644 index 82a3e40d..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/difference/PropertyDifferencer.kt +++ /dev/null @@ -1,30 +0,0 @@ -package difference - -import org.openrndr.Clock -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -class DoublePropertyDifferencer( - private val clock: Clock, - private val property: KProperty0, -) { - private var lastValue: Double? = null - private var output: Double? = null - private var lastTime: Double? = null - operator fun getValue(any: Any?, property: KProperty<*>): Double { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - output = this.property.get() - lastValue!! - lastValue = this.property.get() - } - } else { - lastValue = this.property.get() - output = lastValue!! - lastValue!! - } - lastTime = clock.seconds - return output ?: error("no value") - } -} - -fun Clock.differencing(property: KProperty0) = DoublePropertyDifferencer(this, property) diff --git a/orx-delegate-magic/src/commonMain/kotlin/dynamics/PropertySpringForcer.kt b/orx-delegate-magic/src/commonMain/kotlin/dynamics/PropertySpringForcer.kt deleted file mode 100644 index 44a7e579..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/dynamics/PropertySpringForcer.kt +++ /dev/null @@ -1,128 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.dynamics - -import org.openrndr.Clock -import org.openrndr.math.LinearType -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -class DoublePropertySpringForcer( - private val clock: Clock, - private val property: KProperty0, - private val k: Double, - private val kProperty: KProperty0?, - private val decay: Double, - private val decayProperty: KProperty0? - -) { - private var output: Double? = null - private var lastTime: Double? = null - private var velocity = 0.0 - operator fun getValue(any: Any?, property: KProperty<*>): Double { - val k = kProperty?.get() ?: k - val decay = decayProperty?.get() ?: decay - - val anchor = this.property.get() - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 0.0) { - val sfY = -k * (output!! - anchor) - velocity = velocity * decay + sfY * dt * 10.0 - output = output!! + velocity * dt * 10.0 - } - } else { - output = this.property.get() - } - lastTime = clock.seconds - return output ?: error("no value") - } -} - -class LinearTypePropertySpringForcer>( - private val clock: Clock, - private val property: KProperty0, - private val k: Double, - private val kProperty: KProperty0?, - private val decay: Double, - private val decayProperty: KProperty0? -) { - private var output: T? = null - private var lastTime: Double? = null - private var velocity: T? = null - operator fun getValue(any: Any?, property: KProperty<*>): T { - val k = kProperty?.get() ?: k - val decay = decayProperty?.get() ?: decay - - val anchor = this.property.get() - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 0.0) { - val sfY = (output!! - anchor) * -k - - velocity = if (velocity != null) { - velocity!! * decay + sfY * dt * 10.0 - } else { - sfY * dt * 10.0 - } - output = output!! + velocity!! * dt * 10.0 - } - } else { - output = this.property.get() - } - lastTime = clock.seconds - return output ?: error("no value") - } -} - -/** - * Create a property spring force delegate - * @param property the property that is used as the spring anchor - * @param k the spring stiffness - * @param kProperty the spring stiffness property, overrides [k] - * @param decay velocity decay, best to set to < 1 - * @param decayProperty velocity decay property, overrides [decay] - * @since 0.4.3 - */ -fun Clock.springForcing( - property: KProperty0, - k: Double = 1.0, - kProperty: KProperty0? = null, - decay: Double = 0.9, - decayProperty: KProperty0? = null -): DoublePropertySpringForcer { - return DoublePropertySpringForcer( - clock = this, - property = property, - k = k, - kProperty = kProperty, - decay = decay, - decayProperty = decayProperty - ) -} - -/** - * Create a property spring force delegate - * @param property the property that is used as the spring anchor - * @param k the spring stiffness - * @param kProperty the spring stiffness property, overrides [k] - * @param decay velocity decay, best to set to < 1 - * @param decayProperty velocity decay property, overrides [decay] - * @since 0.4.3 - */ -fun > Clock.springForcing( - property: KProperty0, - k: Double = 1.0, - kProperty: KProperty0? = null, - decay: Double = 0.9, - decayProperty: KProperty0? = null -): LinearTypePropertySpringForcer { - return LinearTypePropertySpringForcer( - clock = this, - property = property, - k = k, - kProperty = kProperty, - decay = decay, - decayProperty = decayProperty - ) -} \ No newline at end of file diff --git a/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertyFollower.kt b/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertyFollower.kt deleted file mode 100644 index 041998f7..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertyFollower.kt +++ /dev/null @@ -1,163 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.smoothing - -import org.openrndr.Clock -import org.openrndr.math.EuclideanVector -import org.openrndr.math.LinearType -import org.openrndr.math.clamp -import org.openrndr.math.map -import kotlin.math.abs -import kotlin.math.min -import kotlin.math.sign -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -class DoublePropertyFollower( - private val clock: Clock, - private val property: KProperty0, - private val maxAccel: Double, - private val maxAccelProperty: KProperty0?, - private val maxSpeed: Double, - private val maxSpeedProperty: KProperty0?, - private val dampDist: Double, - private val dampDistProperty: KProperty0? -) { - private var current: Double? = null - private var lastTime: Double? = null - private var velocity = 0.0 - operator fun getValue(any: Any?, property: KProperty<*>): Double { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - val maxAccel = maxAccelProperty?.get() ?: maxAccel - val maxSpeed = maxSpeedProperty?.get() ?: maxSpeed - val dampDist = dampDistProperty?.get() ?: dampDist - - var offset = this.property.get() - current!! - val len = abs(offset) - val dist = min(dampDist, len) // 0.0 .. dampDist - - // convert dist to desired speed - offset = offset.sign * - dist.map(0.0, dampDist, 0.0, maxSpeed) - - val acceleration = clamp( - offset - velocity, - -maxAccel, maxAccel - ) - - velocity = clamp( - velocity + acceleration, - -maxSpeed, maxSpeed - ) - - current = current!! + velocity - } - } else { - current = this.property.get() - } - lastTime = clock.seconds - return current ?: error("no value") - } -} - -class PropertyFollower( - private val clock: Clock, - private val property: KProperty0, - private val maxAccel: Double, - private val maxAccelProperty: KProperty0?, - private val maxSpeed: Double, - private val maxSpeedProperty: KProperty0?, - private val dampDist: Double, - private val dampDistProperty: KProperty0? -) where T : LinearType, T : EuclideanVector { - private var current: T? = null - private var lastTime: Double? = null - private var velocity = property.get().zero - operator fun getValue(any: Any?, property: KProperty<*>): T { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - val maxAccel = maxAccelProperty?.get() ?: maxAccel - val maxSpeed = maxSpeedProperty?.get() ?: maxSpeed - val dampDist = dampDistProperty?.get() ?: dampDist - - var offset = this.property.get() - current!! - val len = offset.length - val dist = min(dampDist, len) // 0.0 .. dampDist - - // convert dist to desired speed - offset = offset.normalized * - dist.map(0.0, dampDist, 0.0, maxSpeed) - - var acceleration = offset - velocity - if (acceleration.length > maxAccel) { - acceleration = acceleration.normalized * maxAccel - } - - velocity += acceleration - if (velocity.length > maxSpeed) { - velocity = velocity.normalized * maxSpeed - } - - current = current!! + velocity - } - } else { - current = this.property.get() - } - lastTime = clock.seconds - return current ?: error("no value") - } -} - -/** - * Create a property follower delegate - * @param property the property to smooth - * @param cfg the simulation parameters - * @since 0.4.3 - */ -fun Clock.following( - property: KProperty0, - maxAccel: Double = 0.1, - maxAccelProperty: KProperty0? = null, - maxSpeed: Double = 10.0, - maxSpeedProperty: KProperty0? = null, - dampDist: Double = 400.0, - dampDistProperty: KProperty0? = null -) = DoublePropertyFollower( - clock = this, - property = property, - maxAccel = maxAccel, - maxAccelProperty = maxAccelProperty, - maxSpeed = maxSpeed, - maxSpeedProperty = maxSpeedProperty, - dampDist = dampDist, - dampDistProperty = dampDistProperty -) - -/** - * Create a property follower delegate - * @param property the property to smooth - * @param cfg the simulation parameters - * @since 0.4.3 - */ -fun Clock.following( - property: KProperty0, - maxAccel: Double = 0.1, - maxAccelProperty: KProperty0? = null, - maxSpeed: Double = 10.0, - maxSpeedProperty: KProperty0? = null, - dampDist: Double = 400.0, - dampDistProperty: KProperty0? = null -) where T : LinearType, T : EuclideanVector = - PropertyFollower( - clock = this, - property = property, - maxAccel = maxAccel, - maxAccelProperty = maxAccelProperty, - maxSpeed = maxSpeed, - maxSpeedProperty = maxSpeedProperty, - dampDist = dampDist, - dampDistProperty = dampDistProperty - ) diff --git a/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertySmoother.kt b/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertySmoother.kt deleted file mode 100644 index b5c67533..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/smoothing/PropertySmoother.kt +++ /dev/null @@ -1,102 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.smoothing - -import org.openrndr.Clock -import org.openrndr.math.LinearType -import kotlin.math.pow -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -class DoublePropertySmoother( - private val clock: Clock, - private val property: KProperty0, - private val factor: Double = 0.99, - private val factorProperty: KProperty0? -) { - private var output: Double? = null - private var lastTime: Double? = null - operator fun getValue(any: Any?, property: KProperty<*>): Double { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - val steps = dt * 60.0 - val ef = (factorProperty?.get() ?: factor).pow(steps) - output = output!! * ef + this.property.get() * (1.0 - ef) - } - } else { - output = this.property.get() - } - lastTime = clock.seconds - return output ?: error("no value") - } -} - -class PropertySmoother>( - private val clock: Clock, - private val property: KProperty0, - private val factor: Double = 0.99, - private val factorProperty: KProperty0? -) { - private var output: T? = null - private var lastTime: Double? = null - operator fun getValue(any: Any?, property: KProperty<*>): T { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - val steps = dt * 60.0 - val ef = (factorProperty?.get() ?: factor).pow(steps) - - val target = this.property.get() - output = output!! * ef + target * (1.0 - ef) - } - } else { - output = this.property.get() - } - lastTime = clock.seconds - return output ?: error("no value") - } -} - -/** - * Create a property smoother delegate - * @param property the property to smooth - * @param factor the smoothing factor - * @since 0.4.3 - */ -fun Clock.smoothing(property: KProperty0, factor: Double = 0.99): DoublePropertySmoother { - return DoublePropertySmoother(this, property, factor, null) -} - -/** - * Create a property smoother delegate - * @param property the property to smooth - * @param factor the smoothing factor property - * @since 0.4.3 - */ -fun Clock.smoothing( - property: KProperty0, - factor: KProperty0 -): DoublePropertySmoother { - return DoublePropertySmoother(this, property, 1E10, factor) -} - -/** - * Create a property smoother delegate - * @param property the property to smooth - * @param factor the smoothing factor - * @since 0.4.3 - */ -fun > Clock.smoothing(property: KProperty0, factor: Double = 0.99): PropertySmoother { - return PropertySmoother(this, property, factor, null) -} - -/** - * Create a property smoother delegate - * @param property the property to smooth - * @param factor the smoothing factor property - * @since 0.4.3 - */ -fun > Clock.smoothing(property: KProperty0, factor: KProperty0): PropertySmoother { - return PropertySmoother(this, property, 1E10, factor) -} \ No newline at end of file diff --git a/orx-delegate-magic/src/commonMain/kotlin/tracking/PropertyTracker.kt b/orx-delegate-magic/src/commonMain/kotlin/tracking/PropertyTracker.kt deleted file mode 100644 index 0c012c11..00000000 --- a/orx-delegate-magic/src/commonMain/kotlin/tracking/PropertyTracker.kt +++ /dev/null @@ -1,39 +0,0 @@ -@file:Suppress("PackageDirectoryMismatch") - -package org.openrndr.extra.delegatemagic.tracking - -import org.openrndr.Clock -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty0 - -class PropertyTracker(private val clock: Clock, private val property: KProperty0, val length: Int = 30) { - private val track = mutableListOf() - private var lastTime: Double? = null - - operator fun getValue(any: Any?, property: KProperty<*>): List { - if (lastTime != null) { - val dt = clock.seconds - lastTime!! - if (dt > 1E-10) { - track.add(this.property.get()) - } - } else { - track.add(this.property.get()) - } - if (track.size > length) { - track.removeAt(0) - } - lastTime = clock.seconds - return track - } -} - -/** - * Create a property tracker - * @param property the property to track - * @param length the maximum length of the tracked history - * @return a property tracker - * @since 0.4.3 - */ -fun Clock.tracking(property: KProperty0, length: Int = 30): PropertyTracker { - return PropertyTracker(this, property, length) -} \ No newline at end of file diff --git a/orx-delegate-magic/src/jvmDemo/kotlin/DemoDifferencing01.kt b/orx-delegate-magic/src/jvmDemo/kotlin/DemoDifferencing01.kt deleted file mode 100644 index bd7b42dc..00000000 --- a/orx-delegate-magic/src/jvmDemo/kotlin/DemoDifferencing01.kt +++ /dev/null @@ -1,38 +0,0 @@ -import difference.differencing -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.delegatemagic.aggregation.aggregating -import org.openrndr.extra.delegatemagic.aggregation.maxMag -import org.openrndr.extra.delegatemagic.tracking.tracking -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 - -fun main() = application { - program { - val gui = GUI() - - val state = object { - @DoubleParameter("radius", 0.0, 200.0) - var radius = 100.0 - - val difference by differencing(::radius) - val differenceHistory by tracking(::difference) - val differenceMax by aggregating(::differenceHistory) { - it.maxMag() - } - } - - gui.add(state, "state") - - extend(gui) - extend { - drawer.circle(drawer.bounds.center, state.radius) - drawer.stroke = ColorRGBa.GREEN - drawer.lineSegment(drawer.bounds.center, drawer.bounds.center + Vector2(state.difference, 0.0)) - drawer.translate(0.0, 4.0) - drawer.stroke = ColorRGBa.BLUE - drawer.lineSegment(drawer.bounds.center, drawer.bounds.center + Vector2(state.differenceMax, 0.0)) - } - } -} diff --git a/orx-delegate-magic/src/jvmDemo/kotlin/DemoFollowing01.kt b/orx-delegate-magic/src/jvmDemo/kotlin/DemoFollowing01.kt deleted file mode 100644 index 63d93ac4..00000000 --- a/orx-delegate-magic/src/jvmDemo/kotlin/DemoFollowing01.kt +++ /dev/null @@ -1,59 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.delegatemagic.smoothing.following -import org.openrndr.extra.delegatemagic.smoothing.smoothing -import org.openrndr.math.Vector2 -import kotlin.random.Random - -/** - * Demonstrates using delegate-magic tools with - * [Double] and [Vector2]. - * - * The white circle's position uses [following]. - * The red circle's position uses [smoothing]. - * - * `following` uses physics (velocity and acceleration). - * `smoothing` eases values towards the target. - * - * Variables using delegates (`by`) interpolate - * toward target values, shown as gray lines. - * - * The behavior of the delegate-magic functions can be configured - * via arguments that affect their output. - * - * The arguments come in pairs of similar name: - * The first one, often of type [Double], is constant, - * The second one contains `Property` in its name and can be - * modified after its creation and even be linked to a UI - * to modify the behavior of the delegate function in real time. - * The `Property` argument overrides the other. - */ -fun main() = application { - program { - val target = object { - var pos = drawer.bounds.center - } - - val spos by smoothing(target::pos) - val fpos by following(target::pos) - - extend { - if (frameCount % 90 == 0) { - target.pos = Vector2( - Random.nextDouble(0.0, width.toDouble()), - Random.nextDouble(10.0, height.toDouble()) - ) - } - drawer.fill = ColorRGBa.WHITE - drawer.circle(fpos, 15.0) - - drawer.fill = ColorRGBa.RED - drawer.circle(spos, 10.0) - - drawer.fill = null - drawer.stroke = ColorRGBa.GRAY.opacify(0.5) - drawer.lineSegment(0.0, target.pos.y, width.toDouble(), target.pos.y) - drawer.lineSegment(target.pos.x, 0.0, target.pos.x, height.toDouble()) - } - } -} diff --git a/orx-delegate-magic/src/jvmDemo/kotlin/DemoSmoothing01.kt b/orx-delegate-magic/src/jvmDemo/kotlin/DemoSmoothing01.kt deleted file mode 100644 index 9708374f..00000000 --- a/orx-delegate-magic/src/jvmDemo/kotlin/DemoSmoothing01.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.delegatemagic.smoothing.smoothing -import kotlin.random.Random - -fun main() = application { - program { - val state = object { - var x = width / 2.0 - var y = height / 2.0 - var radius = 5.0 - } - - val sx by smoothing(state::x) - val sy by smoothing(state::y) - val sradius by smoothing(state::radius) - extend { - if (Random.nextDouble() < 0.01) { - state.radius = Random.nextDouble(10.0, 200.0) - } - if (Random.nextDouble() < 0.01) { - state.x = Random.nextDouble(0.0, width.toDouble()) - } - if (Random.nextDouble() < 0.01) { - state.y = Random.nextDouble(10.0, height.toDouble()) - } - drawer.circle(sx, sy, sradius) - } - } -} \ No newline at end of file diff --git a/orx-delegate-magic/src/jvmDemo/kotlin/DemoSpring01.kt b/orx-delegate-magic/src/jvmDemo/kotlin/DemoSpring01.kt deleted file mode 100644 index 533adddf..00000000 --- a/orx-delegate-magic/src/jvmDemo/kotlin/DemoSpring01.kt +++ /dev/null @@ -1,32 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.delegatemagic.dynamics.springForcing -import kotlin.random.Random - -fun main() = application { - program { - val state = object { - var x = width / 2.0 - var y = height / 2.0 - var radius = 5.0 - } - - val sx by springForcing(state::x, k = 10.0) - val sy by springForcing(state::y) - val sradius by springForcing(state::radius) - extend { - if (Random.nextDouble() < 0.01) { - state.radius = Random.nextDouble(10.0, 200.0) - } - - if (Random.nextDouble() < 0.01) { - state.x = Random.nextDouble(0.0, width.toDouble()) - } - - if (Random.nextDouble() < 0.01) { - state.y = Random.nextDouble(10.0, height.toDouble()) - } - - drawer.circle(sx, sy, sradius) - } - } -} \ No newline at end of file diff --git a/orx-depth-camera/build.gradle.kts b/orx-depth-camera/build.gradle.kts deleted file mode 100644 index e84da1f8..00000000 --- a/orx-depth-camera/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - } - } - } -} \ No newline at end of file diff --git a/orx-depth-camera/src/commonMain/kotlin/DepthCamera.kt b/orx-depth-camera/src/commonMain/kotlin/DepthCamera.kt deleted file mode 100644 index 07452b88..00000000 --- a/orx-depth-camera/src/commonMain/kotlin/DepthCamera.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.openrndr.extra.depth.camera - -import org.openrndr.draw.ColorBuffer -import org.openrndr.math.IntVector2 - -/** - * Defines how pixel values encoded in depth [ColorBuffer] will be interpreted. - */ -enum class DepthMeasurement { - - /** - * Raw values, but normalized to the range 0-1. - * Useful for debugging, because full range of captured values can be rendered - * as a texture. Therefore it's a default setting. - */ - RAW_NORMALIZED, - - /** - * Raw values, exactly as they are provided by the device. - * Note: it might imply that [ColorBuffer] of the depth camera frame - * is provided in integer-based format (for example in case of Kinect devices). - */ - RAW, - - /** - * Expressed in meters. - * It is using floating point numbers. - * Note: values above `1.0` will not be visible if displayed as a texture. - */ - METERS, - -} - -/** - * General API of any depth camera. - */ -interface DepthCamera { - - /** - * Current operating resolution. - */ - val resolution: IntVector2 - - /** - * The units/mapping in which depth is expressed on received frames. - */ - var depthMeasurement: DepthMeasurement - - /** - * Flips source depth data image in horizontal axis (mirror). - */ - var flipH: Boolean - - /** - * Flips source depth data image in vertical axis (upside-down). - */ - var flipV: Boolean - - /** - * The most recent frame received from the depth camera. - */ - val currentFrame: ColorBuffer - - /** - * Will execute the supplied block of code with each most recent frame - * from the depth camera as an input. - * - * @param block the code to execute when the new frame is received. - */ - fun onFrameReceived(block: (frame: ColorBuffer) -> Unit) - -} diff --git a/orx-easing/README.md b/orx-easing/README.md deleted file mode 100644 index 0c2ec173..00000000 --- a/orx-easing/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# orx-easing - -Easing functions for smooth animation or non-linear interpolation. - -Similar to those on https://easings.net - -| type | | -|:-----------|:-------------| -| linear | `easeLinear` | -| constant 0 | `easeZero` | -| constant 1 | `easeOne` | - -| type | in | in out | out | -|---------|----------------:|-------------------:|-----------------:| -| quad | `easeQuadIn` | `easeQuadInOut` | `easeQuadOut` | -| cubic | `easeCubicIn` | `easeCubicInOut` | `easeCubicOut` | -| quart | `easeQuartIn` | `easeQuartInOut` | `easeQuartOut` | -| quint | `easeQuintIn` | `easeQuintInOut` | `easeQuintOut` | -| circ | `easeCircIn` | `easeCircInOut` | `easeCircOut` | -| expo | `easeExpoIn` | `easeExpoInOut` | `easeExpoOut` | -| sine | `easeSineIn` | `easeSineInOut` | `easeSineOut` | -| back | `easeBackIn` | `easeBackInOut` | `easeBackOut` | -| bounce | `easeBounceIn` | `easeBounceInOut` | `easeBounceOut` | -| elastic | `easeElasticIn` | `easeElasticInOut` | `easeElasticOut` | - -## Usage - -```kotlin -fun easeX( - t: Double, // current time - b: Double = 0.0, // beginning (output value when t is 0.0) - c: Double = 1.0, // change (output delta) - d: Double = 1.0 // duration = end time -) -``` - -The most common usage involves repeatedly calling the easing function increasing -the `t` argument while keeping other arguments unchanged. When `t` increases from 0.0 up to `d`, the returned value slides from `b` to `b + c`. - -### Example - -For accelerating from 40.0 down to 10.0 in 10 steps: - -```kotlin -repeat(10) { - val y = easeQuadIn(it.toDouble(), 40.0, -30.0, 9.0) - println("$it -> $y") -} -``` - -Outputs - -``` -0 -> 40.0 -1 -> 39.629629629629626 -2 -> 38.51851851851852 -3 -> 36.666666666666664 -4 -> 34.074074074074076 -5 -> 30.74074074074074 -6 -> 26.666666666666668 -7 -> 21.85185185185185 -8 -> 16.2962962962963 -9 -> 10.0 -``` - -Note how most result values are closer to 40.0 than to 10.0, due to the usage of -an `In` easing function. `easeCubicIn`, `easeQuartIn` and `easeQuinticIn` functions would make this even more obvious. - -### Default arguments - -When `t` is in `[0, 1]` we can omit most arguments - -```kotlin -val e0 = easeQuadIn(t, 0.0, 1.0, 1.0) -val e1 = easeQuadIn(t) -``` - -### Using the `Easing` enumeration - -The `Easing` enum contains all easing functions. - -```kotlin -val et = Easing.QuadIn.function(t, 0.0, 1.0, 1.0) - -// list all easing function names -Easing.values().forEach { easing -> - println(easing.name) -} - -// find out how many easing functions are available -println(Easing.values().size) -``` - - -## Demos -### DemoEasings01 - -# Visualizes Easing types as a graph and as motion. - -[grid] is used to layout graphs on rows and columns. - - -![DemoEasings01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-easing/images/DemoEasings01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoEasings01.kt) diff --git a/orx-easing/build.gradle.kts b/orx-easing/build.gradle.kts deleted file mode 100644 index 9a82c702..00000000 --- a/orx-easing/build.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - implementation(sharedLibs.kotlin.serialization.core) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-shapes")) - } - } - } -} \ No newline at end of file diff --git a/orx-easing/src/commonMain/kotlin/Easing.kt b/orx-easing/src/commonMain/kotlin/Easing.kt deleted file mode 100644 index 56ef783c..00000000 --- a/orx-easing/src/commonMain/kotlin/Easing.kt +++ /dev/null @@ -1,347 +0,0 @@ -package org.openrndr.extra.easing - -import kotlinx.serialization.Serializable -import kotlin.math.* - -typealias EasingFunction = (Double, Double, Double, Double) -> Double - -/** - * # Easing function arguments - * - * @param t current Time - * @param b Beginning value - * @param c Change in value (the final value is `b+c`) - * @param d Duration (maximum time) - */ - -fun easeLinear(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0) = c * (t / d) + b - -// -- constant - -fun easeZero(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0) = b -fun easeOne(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0) = b + c - -// -- back - -fun easeBackIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val s = 1.70158 - val td = t / d - return c * (td) * td * ((s + 1) * td - s) + b -} - -fun easeBackInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val s = 1.70158 * 1.525 - val s2 = s * 1.525 - val td2 = t / (d / 2) - val td22 = td2 - 2 - return if (td2 < 1) { - c / 2 * (td2 * td2 * ((s + 1) * td2 - s)) + b - } else { - c / 2 * ((td22) * td22 * (((s2) + 1) * td22 + s2) + 2) + b - } -} - -fun easeBackOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val s = 1.70158 - val td1 = t / d - 1 - return c * (td1 * td1 * ((s + 1) * td1 + s) + 1) + b -} - -// -- bounce - -fun easeBounceIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - var t1 = d - t - val result: Double - t1 /= d - if (t1 < 1 / 2.75) { - result = c * (7.5625 * t1 * t1) + 0.toDouble() - } else if (t1 < 2 / 2.75) { - t1 -= (1.5 / 2.75) - result = c * (7.5625 * (t1) * t1 + .75) - } else if (t1 < 2.5 / 2.75) { - t1 -= 2.25 / 2.75 - result = c * (7.5625 * (t1) * t1 + .9375) - } else { - t1 -= (2.625 / 2.75) - result = c * (7.5625 * (t1) * t1 + .984375) - } - return c - result + b -} - -fun easeBounceInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - var t1 = d - t * 2 - val result: Double - t1 /= d - if (t1 < 1 / 2.75) { - result = c * (7.5625 * t1 * t1) + 0.toDouble() - } else if (t1 < 2 / 2.75) { - t1 -= 1.5 / 2.75 - result = c * (7.5625 * (t1) * t1 + .75) + 0.toDouble() - } else if (t1 < 2.5 / 2.75) { - t1 -= 2.25 / 2.75 - result = c * (7.5625 * (t1) * t1 + .9375) + 0.toDouble() - } else { - t1 -= 2.625 / 2.75 - result = c * (7.5625 * (t1) * t1 + .984375) + 0.toDouble() - //return c * (7.5625 * pow((t/d) -(2.625 / 2.75),2) + .984375) + b; - - } - var t2 = t * 2 - d - val result1: Double - t2 /= d - if (t2 < 1 / 2.75) result1 = c * (7.5625 * t2 * t2) + 0.toDouble() else if (t2 < 2 / 2.75) { - t2 -= 1.5 / 2.75 - result1 = c * (7.5625 * t2 * t2 + .75) - } else if (t2 < 2.5 / 2.75) { - t2 -= 2.25 / 2.75 - result1 = c * (7.5625 * t2 * t2 + .9375) - } else { - t2 -= 2.626 / 2.75 - result1 = c * (7.5625 * t2 * t2 + .984375) - } - return if (t < d / 2) - (c - result) * .5 + b - else - result1 * .5 + c * .5 + b - -} - -fun easeBounceOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - - var td = t / d - - return if (td < (1 / 2.75)) { - c * (7.5625 * td * td) + b - } else if (t < (2 / 2.75)) { - td -= 1.5 / 2.75 - c * (7.5625 * td * td + .75) + b - } else if (t < (2.5 / 2.75)) { - td -= 2.25 / 2.75 - c * (7.5625 * td * td + .9375) + b - } else { - td -= 2.625 / 2.75 - c * (7.5625 * td * td + .984375) + b - } -} - -// -- circ - -fun easeCircIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - return -c * (sqrt(1 - td * td) - 1) + b -} - -fun easeCircInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - var td2 = t / (d / 2.0) - if (td2 < 1) - return -c / 2 * (sqrt(1 - td2 * td2) - 1) + b - td2 -= 2 - return c / 2 * (sqrt(1 - td2 * td2) + 1) + b -} - -fun easeCircOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - 1 - return c * sqrt(1 - td * td) + b -} - -// -- cubic - -fun easeCubicIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - return c * td * td * td + b -} - -fun easeCubicOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - 1.0 - return c * (td * td * td + 1) + b -} - -fun easeCubicInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / (d / 2) - val td2 = td - 2.0 - return if (td < 1) c / 2 * td * td * td + b else c / 2 * (td2 * td2 * td2 + 2) + b -} - -// -- elastic - -fun easeElasticIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - if (t == 0.0) { - return b - } else if (t / d == 1.0) { - return b + c - } else { - var td = t / d - val p = d * .3 - val s = p / 4 - td -= 1.0 - return -(c * 2.0.pow(10 * (td)) * sin((td * d - s) * (2 * PI) / p)) + b - } -} - -fun easeElasticInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td2 = t / (d / 2) - - if (t == 0.0) - return b - if (td2 == 2.0) - return b + c - val p = d * (.3 * 1.5) - val s = p / 4 - val td3 = td2 - 1.0 - return if (td2 < 1) { - -.5 * (c * 2.0.pow(10 * (td3)) * sin((td3 - s) * (2 * PI) / p)) + b - } else { - c * 2.0.pow(-10 * (td3) * sin(td3 - s) * (2 * PI) / p) * .5 + c + b - } - -} - -fun easeElasticOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - if (t == 0.0) - return b - if (td == 1.0) - return b + c - val p = d * .3 - val s = p / 4 - return c * 2.0.pow(-10 * td) * sin((td * d - s) * (2 * PI) / p) + c + b -} - -// -- expo - -fun easeExpoIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = - if (t == 0.0) b else c * 2.0.pow(10 * (t / d - 1)) + b - -fun easeExpoInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td2 = t / (d / 2) - val t2 = t * 2 - return if (t == 0.0) { - b - } else if (t == d) { - b + c - } else if (t < d / 2) { - (c / 2) * 2.0.pow(10 * (t2 - 1)) + b - } else { - - (c / 2) * (-(2.0.pow(-10 * (t2 - 1.0))) + 2) + b - } -} - -fun easeExpoOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = - if (t == d) b + c else c * (-(2.0.pow(-10 * t / d)) + 1) + b - -// -- quad - -fun easeQuadIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = c * (t / d) * (t / d) + b - -fun easeQuadInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / (d / 2) - return if (td < 1) { - c / 2 * td * td + b - } else { - -c / 2 * ((td - 1) * (td - 3) - 1) + b - } -} - -fun easeQuadOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = -c * (t / d) * (t / d - 2) + b - -// -- quart - -fun easeQuartIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val n = t / d - return c * n * n * n * n + b -} - -fun easeQuartInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / (d / 2) - val td2 = td - 2.0 - return if (td < 1) c / 2 * td * td * td * td + b else -c / 2 * (td2 * td2 * td2 * td2 - 2) + b -} - -fun easeQuartOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - 1 - return -c * (td * td * td * td - 1) + b -} - -// -- quint - -fun easeQuintIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - return c * td * td * td * td * td + b -} - -fun easeQuintInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / (d / 2) - val td2 = td - 2.0 - return if (td < 1) c / 2 * td * td * td * td * td + b else c / 2 * (td2 * td2 * td2 * td2 * td2 + 2) + b -} - -fun easeQuintOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double { - val td = t / d - 1 - return c * ((td) * td * td * td * td + 1) + b -} - -// -- sine - -fun easeSineIn(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = - -c * cos(t / d * (PI / 2)) + c + b - -fun easeSineOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = - c * sin(t / d * (PI / 2)) + b - -fun easeSineInOut(t: Double, b: Double = 0.0, c: Double = 1.0, d: Double = 1.0): Double = - -c / 2 * (cos(PI * t / d) - 1) + b - -/** - * Enum containing all easing functions - * - * Use the `Easing.values()` list to iterate over available functions, - * query its `.size` property or get functions by index. - */ -@Serializable -enum class Easing(val function: EasingFunction) { - Linear(::easeLinear), - - Zero(::easeZero), - One(::easeOne), - - BackIn(::easeBackIn), - BackInOut(::easeBackInOut), - BackOut(::easeBackOut), - - BounceIn(::easeBounceIn), - BounceInOut(::easeBounceInOut), - BounceOut(::easeBounceOut), - - CircIn(::easeCircIn), - CircInOut(::easeCircInOut), - CircOut(::easeCircOut), - - CubicIn(::easeCubicIn), - CubicInOut(::easeCubicInOut), - CubicOut(::easeCubicOut), - - ElasticIn(::easeElasticIn), - ElasticInOut(::easeElasticInOut), - ElasticOut(::easeElasticOut), - - ExpoIn(::easeExpoIn), - ExpoInOut(::easeExpoInOut), - ExpoOut(::easeExpoOut), - - QuadIn(::easeQuadIn), - QuadInOut(::easeQuadInOut), - QuadOut(::easeQuadOut), - - QuartIn(::easeQuartIn), - QuartInOut(::easeQuartInOut), - QuartOut(::easeQuartOut), - - QuintIn(::easeQuintIn), - QuintInOut(::easeQuintInOut), - QuintOut(::easeQuintOut), - - SineIn(::easeSineIn), - SineInOut(::easeSineInOut), - SineOut(::easeSineOut), -} diff --git a/orx-easing/src/jvmDemo/kotlin/DemoEasings01.kt b/orx-easing/src/jvmDemo/kotlin/DemoEasings01.kt deleted file mode 100644 index fc0e3a45..00000000 --- a/orx-easing/src/jvmDemo/kotlin/DemoEasings01.kt +++ /dev/null @@ -1,78 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.shapes.primitives.grid -import org.openrndr.math.Vector2 -import org.openrndr.math.map - -/** - * # Visualizes Easing types as a graph and as motion. - * - * [grid] is used to layout graphs on rows and columns. - * - */ -fun main() = application { - configure { - width = 1280 - height = 1080 - } - program { - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0) - - // grid `columns * rows` must be >= Easing.values().size - val grid = drawer.bounds.grid( - 3, 11, 10.0, 10.0, 10.0, 10.0 - ).flatten() - - // make pairs of (easing function, grid rectangle) - val pairs = Easing.entries.toTypedArray() zip grid - - extend { - // ~4 seconds animation loop - val animT = (frameCount % 240) / 60.0 - - pairs.forEach { (easing, gridRect) -> - - // background rectangle - drawer.stroke = null - drawer.fill = ColorRGBa.WHITE.opacify(0.3) - drawer.rectangle(gridRect) - - // graph - drawer.stroke = ColorRGBa.PINK - val points = List(40) { - val curveT = it / 39.0 - gridRect.position( - curveT, easing.function(curveT, 1.0, -1.0, 1.0) - ) - } - drawer.lineStrip(points) - - // label - drawer.fill = ColorRGBa.WHITE - drawer.stroke = null - drawer.fontMap = font - drawer.text( - easing.name, - // text position rounded for crisp font rendering - gridRect.position(0.02, 0.25).toInt().vector2 - ) - - // animation - drawer.fill = ColorRGBa.WHITE.opacify( - when { // 4-stage opacity - animT > 3.0 -> 0.0 // invisible - animT > 2.0 -> 3.0 - animT // fade-out - animT < 1.0 -> animT // fade-in - else -> 1.0 // visible - } - ) - // move only while visible (when loop time in 1.0..2.0) - val t = animT.map(1.0, 2.0, 0.0, 1.0, true) - val xy = Vector2(1.0, easing.function(t, 1.0, -1.0, 1.0)) - drawer.circle(gridRect.position(xy), 5.0) - } - } - } -} diff --git a/orx-envelopes/README.md b/orx-envelopes/README.md deleted file mode 100644 index c271f1df..00000000 --- a/orx-envelopes/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# orx-envelopes - -ADSR (Attack, Decay, Sustain, Release) envelopes and tools. - -## ADSR - -Attack, decay, sustain, release - -## Demos -### DemoADSRTracker01 - - - -![DemoADSRTracker01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-envelopes/images/DemoADSRTracker01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoADSRTracker01.kt) - -### DemoADSRTracker02 - - - -![DemoADSRTracker02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-envelopes/images/DemoADSRTracker02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoADSRTracker02.kt) diff --git a/orx-envelopes/build.gradle.kts b/orx-envelopes/build.gradle.kts deleted file mode 100644 index 30d05825..00000000 --- a/orx-envelopes/build.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-envelopes")) - implementation(project(":orx-noise")) - } - } - } -} \ No newline at end of file diff --git a/orx-envelopes/src/commonMain/kotlin/ADSR.kt b/orx-envelopes/src/commonMain/kotlin/ADSR.kt deleted file mode 100644 index f84fcbad..00000000 --- a/orx-envelopes/src/commonMain/kotlin/ADSR.kt +++ /dev/null @@ -1,50 +0,0 @@ -package org.openrndr.extra.envelopes - -import org.openrndr.math.mix -import kotlin.math.min - -data class ADSR( - val attackDuration: Double, - val decayDuration: Double, - val sustainValue: Double, - val releaseDuration: Double -) : Envelope() { - override fun value(t: Double, tOff: Double): Double { - return adsr(attackDuration, decayDuration, sustainValue, releaseDuration, t, tOff) - } - - override fun position(t: Double, tOff: Double): Double { - return adsrPosition(attackDuration, decayDuration, releaseDuration, t, tOff) - } - - override fun isActive(t: Double, tOff: Double): Boolean { - return !(t - tOff > releaseDuration) - } -} - -fun adsr( - attackDuration: Double, - decayDuration: Double, - sustainValue: Double, - releaseDuration: Double, - t: Double, - tOff: Double = 1E10 -): Double { - val da = t / attackDuration - val dc = (t - attackDuration) / decayDuration - val vOn = mix(min(1.0, da), sustainValue, dc.coerceIn(0.0..1.0)) - return mix(vOn, 0.0, ((t - tOff) / releaseDuration).coerceIn(0.0..1.0)) -} - -fun adsrPosition( - attackDuration: Double, - decayDuration: Double, - releaseDuration: Double, - t: Double, - tOff: Double -): Double { - val ta = (t / attackDuration).coerceIn(0.0..1.0) - val td = ((t - attackDuration) / decayDuration).coerceIn(0.0..1.0) - val tr = ((t - tOff) / releaseDuration).coerceIn(0.0..1.0) - return (ta + td + tr) / 3.0 -} \ No newline at end of file diff --git a/orx-envelopes/src/commonMain/kotlin/Envelope.kt b/orx-envelopes/src/commonMain/kotlin/Envelope.kt deleted file mode 100644 index c4c0c6a2..00000000 --- a/orx-envelopes/src/commonMain/kotlin/Envelope.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.openrndr.extra.envelopes - -abstract class Envelope { - abstract fun value(t: Double, tOff: Double): Double - - abstract fun position(t: Double, tOff: Double): Double - - abstract fun isActive(t: Double, tOff: Double): Boolean - - var objectFunction: ((time: Double, value: Double, position: Double) -> Unit) = { _, _, _ -> } -} \ No newline at end of file diff --git a/orx-envelopes/src/commonMain/kotlin/MPPSynchronize.kt b/orx-envelopes/src/commonMain/kotlin/MPPSynchronize.kt deleted file mode 100644 index 0a5f0b57..00000000 --- a/orx-envelopes/src/commonMain/kotlin/MPPSynchronize.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.openrndr.extra.envelopes - -expect fun mppSynchronized(lock:Any, f:()->V) : V \ No newline at end of file diff --git a/orx-envelopes/src/commonMain/kotlin/Tracker.kt b/orx-envelopes/src/commonMain/kotlin/Tracker.kt deleted file mode 100644 index a650a585..00000000 --- a/orx-envelopes/src/commonMain/kotlin/Tracker.kt +++ /dev/null @@ -1,108 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.envelopes - -import org.openrndr.Clock -import org.openrndr.extra.parameters.DoubleParameter - -class Trigger(val id: Int, val on: Double, var off: Double, val envelope: Envelope) - -class TrackerValue( - val time: Double, - val value: Double, - val position: Double, - val envelope: Envelope -) { - operator fun invoke() { - draw() - } - - fun draw() { - envelope.objectFunction(time, value, position) - } -} - -abstract class Tracker(val clock: Clock) { - val triggers = mutableListOf() - - protected abstract fun createEnvelope(objectFunction: (time: Double, value: Double, position: Double) -> Unit): T - - fun triggerOn( - triggerId: Int = 0, - objectFunction: (time: Double, value: Double, position: Double) -> Unit = { _, _, _ -> } - ) { - mppSynchronized(triggers) { - val t = clock.seconds - triggers.removeAll { !it.envelope.isActive(t - it.on, it.off - it.on) } - triggers.add(Trigger(triggerId, clock.seconds, 1E30, createEnvelope(objectFunction))) - } - } - - fun triggerOff(triggerId: Int = 0) { - mppSynchronized(triggers) { - val t = clock.seconds - triggers.removeAll { !it.envelope.isActive(t - it.on, it.off - it.on) } - triggers.findLast { it.id == triggerId }?.let { - it.off = clock.seconds - } - } - } - - fun values(): List { - val t = clock.seconds - return mppSynchronized(triggers) { - triggers.mapNotNull { - val tOn = t - it.on - val tOff = it.off - it.on - - if (it.envelope.isActive(tOn, tOff)) { - val v = it.envelope.value(tOn, tOff) - TrackerValue(t, v, it.envelope.position(tOn, tOff), it.envelope) - } else { - null - } - } - } - } - - fun value(): Double { - return values().sumOf { it.value } - } -} - - -class ADSRTracker(clock: Clock) : Tracker(clock) { - - /** - * The time it takes to transition to 1.0 when calling [triggerOn], usually in seconds. - */ - @DoubleParameter("attack", 0.0, 20.0, order = 1) - var attack: Double = 0.1 - - /** - * The time it takes to transition from 1.0 to the [sustain] level, usually in seconds. - * The decay happens immediately after the attack. - */ - @DoubleParameter("decay", 0.0, 20.0, order = 2) - var decay: Double = 0.1 - - /** - * The sustain level, between 0.0 and 1.0. - * The tracker will keep this value until [triggerOff] is called. - */ - @DoubleParameter("sustain", 0.0, 1.0, order = 3) - var sustain: Double = 0.9 - - /** - * The time it takes to transition back to 0.0 when calling [triggerOff], usually in seconds. - */ - @DoubleParameter("release", 0.0, 20.0, order = 4) - var release: Double = 0.9 - - override fun createEnvelope(objectFunction: (time: Double, value: Double, position: Double) -> Unit): ADSR { - return ADSR(attack, decay, sustain, release).apply { - this.objectFunction = objectFunction - } - } -} - diff --git a/orx-envelopes/src/jsMain/kotlin/MPPSynchronize.kt b/orx-envelopes/src/jsMain/kotlin/MPPSynchronize.kt deleted file mode 100644 index 23bf70ac..00000000 --- a/orx-envelopes/src/jsMain/kotlin/MPPSynchronize.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.openrndr.extra.envelopes - -actual fun mppSynchronized(lock: Any, f: () -> V): V { - return f() -} \ No newline at end of file diff --git a/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker01.kt b/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker01.kt deleted file mode 100644 index 8245075f..00000000 --- a/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker01.kt +++ /dev/null @@ -1,33 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.loadFont -import org.openrndr.extra.envelopes.ADSRTracker - -fun main() = application { - program { - val tracker = ADSRTracker(this) - tracker.attack = 1.0 - tracker.decay = 0.2 - tracker.sustain = 0.8 - tracker.release = 2.0 - - keyboard.keyDown.listen { - if (it.name == "t") - tracker.triggerOn() - } - keyboard.keyUp.listen { - if (it.name == "t") - tracker.triggerOff() - } - extend { - tracker.values().forEach { - drawer.circle(40.0, 40.0, 20.0 * it.value) - drawer.translate(40.0, 0.0) - } - drawer.defaults() - drawer.circle(drawer.bounds.center, 100.0 * tracker.value()) - - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - drawer.text("press and hold 't'", 20.0, height - 20.0) - } - } -} diff --git a/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker02.kt b/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker02.kt deleted file mode 100644 index 3711a70a..00000000 --- a/orx-envelopes/src/jvmDemo/kotlin/DemoADSRTracker02.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.loadFont -import org.openrndr.extra.envelopes.ADSRTracker -import org.openrndr.extra.noise.shapes.uniform -import org.openrndr.shape.Rectangle - -fun main() = application { - program { - val tracker = ADSRTracker(this) - tracker.attack = 1.0 - tracker.decay = 0.2 - tracker.sustain = 0.8 - tracker.release = 2.0 - - keyboard.keyDown.listen { - if (it.name == "t") { - val center = drawer.bounds.offsetEdges(-30.0).uniform() - tracker.triggerOn(0) { time, value, position -> - drawer.circle(center, value * 100.0) - } - } - if (it.name == "r") { - val center = drawer.bounds.offsetEdges(-30.0).uniform() - tracker.triggerOn(1) { time, value, position -> - val r = Rectangle.fromCenter(center, width = value * 100.0, height = value * 100.0) - drawer.rectangle(r) - } - } - } - keyboard.keyUp.listen { - if (it.name == "t") - tracker.triggerOff(0) - if (it.name == "r") - tracker.triggerOff(1) - } - extend { - tracker.values().forEach { - it() - } - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - drawer.text("press and hold 't' and/or 'r'", 20.0, height - 20.0) - } - } -} diff --git a/orx-envelopes/src/jvmMain/kotlin/MPPSynchronize.kt b/orx-envelopes/src/jvmMain/kotlin/MPPSynchronize.kt deleted file mode 100644 index b23742f3..00000000 --- a/orx-envelopes/src/jvmMain/kotlin/MPPSynchronize.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.openrndr.extra.envelopes - -actual fun mppSynchronized(lock: Any, f: () -> V): V { - return synchronized(lock) { - f() - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/README.md b/orx-expression-evaluator-typed/README.md deleted file mode 100644 index 83024e8c..00000000 --- a/orx-expression-evaluator-typed/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# orx-expression-evaluator-typed - -Tools to evaluate strings containing typed mathematical expressions. - -# Expression evaluator - -Supported types: - * `Double` - * `String` - * `Vector2` - * `Vector3` - * `Vector4` - * `ColorRGBa` \ No newline at end of file diff --git a/orx-expression-evaluator-typed/build.gradle.kts b/orx-expression-evaluator-typed/build.gradle.kts deleted file mode 100644 index 0ed23705..00000000 --- a/orx-expression-evaluator-typed/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - val commonMain by getting { - dependencies { - implementation(libs.antlr.kotlin.runtime) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) - implementation(project(":orx-property-watchers")) - implementation(project(":orx-noise")) - implementation(project(":orx-expression-evaluator")) - } - } - val jvmDemo by getting { - dependencies { - implementation(project(":orx-jvm:orx-gui")) - } - } - } -} diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/CompiledFunctions.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/CompiledFunctions.kt deleted file mode 100644 index ed888b56..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/CompiledFunctions.kt +++ /dev/null @@ -1,268 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.antlr.v4.kotlinruntime.tree.ParseTreeWalker - - -/** - * Compiles a string expression into a single-parameter function capable of evaluating the expression. - * - * @param T0 The type of the single parameter that will be passed to the compiled function. - * @param R The return type of the compiled function. - * @param expression The string representation of the expression to be compiled. - * @param parameter0 The name of the required parameter in the expression. - * @param constants A lambda function to resolve constants in the expression by their names. Defaults to a function returning null for all names. - * @param functions A set of function extensions that can be used within the expression. Defaults to an empty set. - * @return A single-parameter function that takes an argument of type [T0] and evaluates the expression to return a result of type [R]. - */ -fun compileFunction1( - expression: String, - parameter0: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY -): ((T0) -> R) { -// require(constants(parameter0) == null) { -// "${parameter0} is in constants with value '${constants(parameter0)}" -// } - val root = expressionRoot(expression) - - var varP0: T0? = null - val constantValues = fun(p: String): Any? { - return if (p == parameter0) { - varP0 - } else { - constants(p) - } - } - val listener = TypedExpressionListener(functions, constantValues) - - return { p0 -> - varP0 = p0 - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - } catch(e: Throwable) { - throw RuntimeException("Error while evaluating '$expression' with parameter $parameter0=$p0. ${e.message}", e) - } - @Suppress("UNCHECKED_CAST") - listener.state.lastExpressionResult as? R ?: error("No result while evaluating '$expression' with parameter $parameter0=$p0") - } -} - -/** - * Tries to compile a given string expression into a single-parameter function. Returns the compiled function if successful, - * or `null` if an error occurs during compilation. Errors are handled using the provided [onError] callback. - * - * @param T0 The type of the single parameter that will be passed to the compiled function. - * @param R The return type of the compiled function. - * @param expression The string representation of the expression to be compiled. - * @param parameter0 The name of the required parameter in the expression. - * @param constants A lambda function to resolve constants in the expression by their names. Defaults to a function returning null for all names. - * @param functions A set of function extensions that can be used within the expression. Defaults to an empty set. - * @param onError A callback function that will be invoked when an error occurs during compilation. - * The error is passed to this function. - * @return A single-parameter function that takes an argument of type [T0] and evaluates the expression to return a result of type [R], - * or `null` if the compilation fails. - */ -fun compileFunction1OrNull( - expression: String, - parameter0: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY, - onError: (Throwable) -> Unit = { } -): ((T0) -> R)? { - try { - return compileFunction1(expression, parameter0, constants, functions) - } catch (e: Throwable) { - onError(e) - return null - } -} - -/** - * Compiles a string expression into a lambda function with two parameters. - * - * This function takes an expression as a string, as well as two parameter names, - * and returns a lambda that evaluates the expression with the provided parameter values. - * Optionally, a map of constants and custom functions can be provided for use in the expression. - * - * @param T0 The type of the first parameter. - * @param T1 The type of the second parameter. - * @param R The return type of the resulting lambda function. - * @param expression The string expression to compile. - * @param parameter0 The name of the first parameter in the expression. - * @param parameter1 The name of the second parameter in the expression. - * @param constants A lambda function that provides constant values by variable name. Defaults to returning null for all names. - * @param functions The custom functions available in the context of the expression. Defaults to an empty set of functions. - * @return A lambda function that takes two parameters of types T0 and T1 and returns a result of type R, - * based on the compiled expression. - * @throws IllegalArgumentException if either parameter name exists within the constants map. - */ -fun compileFunction2( - expression: String, - parameter0: String, - parameter1: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY -): ((T0, T1) -> R) { - require(constants(parameter0) == null) { - "${parameter0} is in constants with value '${constants(parameter0)}" - } - require(constants(parameter1) == null) { - "${parameter1} is in constants with value '${constants(parameter1)}" - } - - val root = expressionRoot(expression) - - var varP0: T0? = null - var varP1: T1? = null - val constantValues = fun(p: String): Any? { - return if (p == parameter0) { - varP0 - } else if (p == parameter1) { - varP1 - } else { - constants(p) - } - } - val listener = TypedExpressionListener(functions, constantValues) - - return { p0, p1 -> - varP0 = p0 - varP1 = p1 - ParseTreeWalker.DEFAULT.walk(listener, root) - @Suppress("UNCHECKED_CAST") - listener.state.lastExpressionResult as? R ?: error("no result") - } -} - -/** - * Attempts to compile a string expression into a lambda function with two parameters, - * returning null if an error occurs during compilation. - * - * This function is a safe wrapper around `compileFunction2`, catching any exceptions - * that may be thrown during the compilation process. If an error occurs, the provided - * `onError` callback is invoked with the exception, and the function returns null. - * - * @param T0 The type of the first parameter. - * @param T1 The type of the second parameter. - * @param R The return type of the resulting lambda function. - * @param expression The string expression to compile. - * @param parameter0 The name of the first parameter in the expression. - * @param parameter1 The name of the second parameter in the expression. - * @param constants A lambda function that provides constant values for variables by name. Defaults to returning null for all names. - * @param functions The custom functions available in the context of the expression. Defaults to an empty set of functions. - * @param onError A callback invoked with the exception if an error occurs during compilation. Defaults to an empty function. - * @return A lambda function that takes two parameters of types T0 and T1 and returns a result of type R if the compilation is successful. - * Returns null if an error occurs during compilation. - */ -fun compileFunction2OrNull( - expression: String, - parameter0: String, - parameter1: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY, - onError: (Throwable) -> Unit = { } -): ((T0, T1) -> R)? { - try { - return compileFunction2(expression, parameter0, parameter1, constants, functions) - } catch (e: Throwable) { - onError(e) - return null - } -} - -/** - * Compiles a 3-parameter function from a given string expression, allowing dynamic evaluation with specified parameters, constants, and external function extensions. - * - * @param T0 The type of the first parameter. - * @param T1 The type of the second parameter. - * @param T2 The type of the third parameter. - * @param R The return type of the compiled function. - * @param expression The string representation of the expression to be compiled. - * @param parameter0 The name of the first parameter referenced in the expression. - * @param parameter1 The name of the second parameter referenced in the expression. - * @param parameter2 The name of the third parameter referenced in the expression. - * @param constants A lambda function providing constant values for variable names used in the expression. Defaults to a function returning null. - * @param functions An optional container of external functions that can be called within the expression. Defaults to an empty set of functions. - * @return A lambda function that takes three parameters of types T0, T1, and T2, and returns a result of type R after evaluating the compiled expression. - * @throws IllegalArgumentException If any of the parameter names are found in the constants map. - * @throws ExpressionException If there is a syntax error in the provided expression. - */ -fun compileFunction3( - expression: String, - parameter0: String, - parameter1: String, - parameter2: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY -): ((T0, T1, T2) -> R) { - require(constants(parameter0) == null) { - "${parameter0} is in constants with value '${constants(parameter0)}" - } - require(constants(parameter1) == null) { - "${parameter1} is in constants with value '${constants(parameter1)}" - } - require(constants(parameter2) == null) { - "${parameter2} is in constants with value '${constants(parameter2)}" - } - - val root = expressionRoot(expression) - - var varP0: T0? = null - var varP1: T1? = null - var varP2: T2? = null - val constantValues = fun(p: String): Any? { - return if (p == parameter0) { - varP0 - } else if (p == parameter1) { - varP1 - } else if (p == parameter2) { - varP2 - } else { - constants(p) - } - } - val listener = TypedExpressionListener(functions, constantValues) - - return { p0, p1, p2 -> - varP0 = p0 - varP1 = p1 - varP2 = p2 - ParseTreeWalker.DEFAULT.walk(listener, root) - @Suppress("UNCHECKED_CAST") - listener.state.lastExpressionResult as? R ?: error("no result") - } -} - -/** - * Compiles a 3-parameter function from a given string expression, returning null if an error occurs during compilation. - * - * @param T0 The type of the first parameter. - * @param T1 The type of the second parameter. - * @param T2 The type of the third parameter. - * @param R The return type of the compiled function. - * @param expression The string representation of the expression to be compiled. - * @param parameter0 The name of the first parameter referenced in the expression. - * @param parameter1 The name of the second parameter referenced in the expression. - * @param parameter2 The name of the third parameter referenced in the expression. - * @param constants A lambda function providing constant values for variable names used in the expression. Defaults to a function returning null. - * @param functions An optional container of external functions that can be called within the expression. Defaults to an empty set of functions. - * @param onError A lambda function that will be invoked with the exception if an error occurs during compilation. Defaults to an empty function. - * @return A lambda function that takes three parameters of types T0, T1, and T2, and returns a result of type R after evaluating the compiled expression, or null if an error occurs - * . - */ -fun compileFunction3OrNull( - expression: String, - parameter0: String, - parameter1: String, - parameter2: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY, - onError: (Throwable) -> Unit = { } -): ((T0, T1, T2) -> R)? { - try { - return compileFunction3(expression, parameter0, parameter1, parameter2, constants, functions) - } catch (e: Throwable) { - onError(e) - return null - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function0.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function0.kt deleted file mode 100644 index 283379a3..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function0.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.extra.noise.uniform - -/** - * Dispatches a function without arguments based on its name. - * - * @param name The name of the function to dispatch. - * @param functions A map containing functions of type `TypedFunction0` associated with their names. - * @return A callable lambda that takes an array of `Any` as input and returns a result if the function is found, - * or null if there is no match. - */ -internal fun dispatchFunction0(name: String, functions: Map): ((Array) -> Any)? { - return when (name) { - "random" -> { x -> Double.uniform(0.0, 1.0) } - else -> functions[name]?.let { { x: Array -> it.invoke() } } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function1.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function1.kt deleted file mode 100644 index 162f0409..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function1.kt +++ /dev/null @@ -1,210 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.transforms.scale -import org.openrndr.math.transforms.translate -import kotlin.math.abs as abs_ -import kotlin.math.cos as cos_ -import kotlin.math.sin as sin_ -import kotlin.math.sqrt as sqrt_ - -internal fun vec2(x: Any): Vector2 { - return when (x) { - is Double -> Vector2(x, x) - is List<*> -> { - when (x.size) { - 2 -> { - @Suppress("UNCHECKED_CAST") - x as List; Vector2(x[0], x[1]) - } - - else -> error("vec2(): unsupported argument: '$x'") - } - } - - else -> error("vec2(): unsupported argument: '$x'") - } -} - -internal fun vec3(x: Any): Vector3 { - return when (x) { - is Double -> Vector3(x, x, x) - is List<*> -> { - when (x.size) { - 2 -> { - vec3(x[0]!!, x[1]!!) - } - - 3 -> { - vec3(x[0]!!, x[1]!!, x[2]!!) - } - - else -> error("vec3(): unsupported argument: '$x'") - } - } - - else -> error("vec3(): unsupported argument: '$x'") - } -} - - -internal fun vec4(x: Any): Vector4 { - return when (x) { - is Double -> Vector4(x, x, x, x) - is List<*> -> { - when (x.size) { - 2 -> { - vec4(x[0]!!, x[1]!!) - } - - 3 -> { - vec4(x[0]!!, x[1]!!, x[2]!!) - } - - 4 -> { - vec4(x[0]!!, x[1]!!, x[2]!!, x[3]!!) - } - - else -> error("vec4(): unsupported argument: '$x'") - } - } - - else -> error("vec4(): unsupported argument: '$x'") - } -} - -internal fun rgba(x: Any): ColorRGBa { - return when (x) { - is Double -> ColorRGBa(x, x, x, 1.0) - is Vector3 -> ColorRGBa(x.x, x.y, x.z, 1.0) - is Vector4 -> ColorRGBa(x.x, x.y, x.z, x.w) - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun cos(x: Any): Any { - return when (x) { - is Double -> cos_(x) - is Vector2 -> x.map { cos_(it) } - is Vector3 -> x.map { cos_(it) } - is Vector4 -> x.map { cos_(it) } - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun sin(x: Any): Any { - return when (x) { - is Double -> sin_(x) - is Vector2 -> x.map { sin_(it) } - is Vector3 -> x.map { sin_(it) } - is Vector4 -> x.map { sin_(it) } - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun normalize(x: Any): Any { - return when (x) { - is Vector2 -> x.normalized - is Vector3 -> x.normalized - is Vector4 -> x.normalized - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun inverse(x: Any): Any { - return when (x) { - is Matrix44 -> x.inversed - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun transpose(x: Any): Any { - return when (x) { - is Matrix44 -> x.transposed - else -> error("type not supported ${x::class.simpleName}") - } -} - - -fun abs(x: Any): Any { - return when (x) { - is Double -> abs_(x) - is Vector2 -> x.map { abs_(it) } - is Vector3 -> x.map { abs_(it) } - is Vector4 -> x.map { abs_(it) } - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun scale(scale: Any): Matrix44 { - @Suppress("NAME_SHADOWING") val scale = when (scale) { - is Double -> Vector3(scale, scale, scale) - is Vector2 -> scale.xy1 - is Vector3 -> scale - else -> error("unsupported axis argument") - } - return Matrix44.scale(scale) -} - - -internal fun sqrt(x: Any): Any { - return when (x) { - is Double -> sqrt_(x) - is Vector2 -> x.map { sqrt_(it) } - is Vector3 -> x.map { sqrt_(it) } - is Vector4 -> x.map { sqrt_(it) } - else -> error("type not supported ${x::class.simpleName}") - } -} - -internal fun translate(translation: Any): Matrix44 { - @Suppress("NAME_SHADOWING") val translation = when (translation) { - is Vector2 -> translation.xy0 - is Vector3 -> translation - else -> error("unsupported axis argument") - } - return Matrix44.translate(translation) -} - -internal fun mat4(x: Any): Matrix44 { - return when (x) { - is List<*> -> { - @Suppress("UNCHECKED_CAST") - when (x.size) { - 16 -> Matrix44.fromDoubleArray((x as List).toDoubleArray()) - 4 -> { - (x as List) - Matrix44.fromColumnVectors(x[0], x[1], x[2], x[3]) - } - - else -> error("mat4(): unsupported argument: '$x'") - } - } - - else -> error("mat4(): unsupported argument: '$x'") - } -} - -internal fun dispatchFunction1(name: String, functions: Map): ((Array) -> Any)? { - return when (name) { - "vec2" -> { x -> vec2(x[0]) } - "vec3" -> { x -> vec3(x[0]) } - "vec4" -> { x -> vec4(x[0]) } - "mat4" -> { x -> mat4(x[0]) } - "cos" -> { x -> cos(x[0]) } - "sin" -> { x -> sin(x[0]) } - "sqrt" -> { v -> sqrt(v[0]) } - "abs" -> { v -> abs(v[0]) } - "scale" -> { x -> scale(x[0]) } - "rgb", "rgba" -> { x -> rgba(x[0]) } - "translate" -> { x -> translate(x[0]) } - "transpose" -> { x -> transpose(x[0]) } - "inverse" -> { x -> inverse(x[0]) } - "normalize" -> { x -> normalize(x[0]) } - else -> functions[name]?.let { { x: Array -> it.invoke(x[0]) } } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function2.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function2.kt deleted file mode 100644 index fa9711d6..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function2.kt +++ /dev/null @@ -1,86 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.transforms.rotate -import org.openrndr.math.max as max_ -import org.openrndr.math.min as min_ -import kotlin.math.max as max_ -import kotlin.math.min as min_ - -internal fun rotate(axis: Any, angleInDegrees:Any): Matrix44 { - require(angleInDegrees is Double) - @Suppress("NAME_SHADOWING") val axis = when(axis) { - is Vector2 -> axis.xy0 - is Vector3 -> axis - else -> error("unsupported axis argument") - } - return Matrix44.rotate(axis, angleInDegrees) -} - - -internal fun min(x: Any, y: Any): Any { - return when { - x is Double && y is Double -> min_(x, y) - x is Vector2 && y is Vector2 -> min_(x, y) - x is Vector3 && y is Vector3 -> min_(x, y) - x is Vector4 && y is Vector4 -> min_(x, y) - else -> error("unsupported arguments") - } -} - -internal fun max(x: Any, y: Any): Any { - return when { - x is Double && y is Double -> max_(x, y) - x is Vector2 && y is Vector2 -> max_(x, y) - x is Vector3 && y is Vector3 -> max_(x, y) - x is Vector4 && y is Vector4 -> max_(x, y) - else -> error("unsupported arguments") - } -} - -internal fun vec2(x: Any, y: Any): Vector2 { - require(x is Double) - require(y is Double) - return Vector2(x, y) -} - -internal fun vec3(x: Any, y: Any): Vector3 = when { - x is Double && y is Vector2 -> { - Vector3(x, y.x, y.y) - } - x is Vector2 && y is Double -> { - Vector3(x.x, x.y, y) - } - else -> { - error("unsupported arguments, '$x' (${x::class}) '$y' (${y::class}") - } -} - -internal fun vec4(x: Any, y: Any): Vector4 = when { - x is Double && y is Vector3 -> { - Vector4(x, y.x, y.y, y.z) - } - x is Vector2 && y is Vector2 -> { - Vector4(x.x, x.y, y.x, y.y) - } - x is Vector3 && y is Double -> { - Vector4(x.x, x.y, x.z, y) - } - else -> { - error("unsupported arguments, '$x' (${x::class}) '$y' (${y::class}") - } -} - -internal fun dispatchFunction2(name: String, functions: Map): ((Array) -> Any)? { - return when (name) { - "min" -> { x -> min(x[0], x[1]) } - "max" -> { x -> max(x[0], x[1]) } - "vec2" -> { x -> vec2(x[0], x[1]) } - "vec3" -> { x -> vec3(x[0], x[1]) } - "rotate" -> { x -> rotate(x[0], x[1]) } - else -> functions[name]?.let { { x: Array -> it.invoke(x[0], x[1]) } } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function3.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function3.kt deleted file mode 100644 index d2345144..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function3.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.mix as mix_ - -internal fun mix(x: Any, y: Any, f: Any): Any { - return when { - x is Double && y is Double && f is Double -> mix_(x, y, f) - x is Vector2 && y is Vector2 && f is Double -> mix_(x, y, f) - x is Vector3 && y is Vector3 && f is Double -> mix_(x, y, f) - x is Vector4 && y is Vector4 && f is Double -> mix_(x, y, f) - else -> error("unsupported arguments") - } -} - -internal fun vec3(x: Any, y: Any, z: Any): Vector3 { - require(x is Double && y is Double && z is Double) - return Vector3(x, y, z) -} - -internal fun vec4(x: Any, y: Any, z: Any): Vector4 { - return when { - x is Vector2 && y is Double && z is Double -> Vector4(x.x, x.y, y, z) - x is Double && y is Vector2 && z is Double -> Vector4(x, y.x, y.y, z) - x is Double && y is Double && z is Vector2 -> Vector4(x, y, z.x, z.y) - else -> error("unsupported arguments") - } -} - -internal fun dispatchFunction3(name: String, functions: Map): ((Array) -> Any)? { - return when (name) { - "vec3" -> { x -> vec3(x[0], x[1], x[2]) } - "vec4" -> { x -> vec4(x[0], x[1], x[2]) } - "mix" -> { x -> mix(x[0], x[1], x[2]) } - else -> functions[name]?.let { - { x: Array -> - it.invoke(x[0], x[1], x[2]) - } - } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function4.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function4.kt deleted file mode 100644 index 122dbb69..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Function4.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector4 - -internal fun vec4(x: Any, y: Any, z: Any, w: Any): Vector4 { - require(x is Double && y is Double && z is Double && w is Double) - return Vector4(x, y, z, w) -} - -internal fun mat4(x: Any, y: Any, z: Any, w: Any): Matrix44 { - require(x is Vector4 && y is Vector4 && z is Vector4 && w is Vector4) - return Matrix44.fromColumnVectors(x, y, z, w) -} - -internal fun rgba(r: Any, g: Any, b: Any, a: Any): ColorRGBa { - require(r is Double && g is Double && b is Double && a is Double) - return ColorRGBa(r, g, b, a) -} - - -internal fun dispatchFunction4(name: String, functions: Map): ((Array) -> Any)? { - return when (name) { - "vec4" -> { x -> vec4(x[0], x[1], x[2], x[3]) } - "mat4" -> { x -> mat4(x[0], x[1], x[2], x[3]) } - "rgba" -> { x -> rgba(x[0], x[1], x[2], x[3]) } - else -> functions[name]?.let { { x: Array -> it.invoke(x[0], x[1], x[2], x[3]) } } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/MemberFunctions.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/MemberFunctions.kt deleted file mode 100644 index 54f19559..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/MemberFunctions.kt +++ /dev/null @@ -1,83 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import kotlin.math.roundToInt - -internal fun String.memberFunctions(n: String): ((Array) -> Any)? { - return when (n) { - "take" -> { nn -> this.take((nn[0] as Number).toInt()) } - "drop" -> { nn -> this.drop((nn[0] as Number).toInt()) } - "takeLast" -> { nn -> this.takeLast((nn[0] as Number).toInt()) } - "dropLast" -> { nn -> this.takeLast((nn[0] as Number).toInt()) } - else -> null - } -} - -internal fun List<*>.memberFunctions(n: String): ((Array) -> Any)? { - return when (n) { - "first" -> { _ -> this.first() ?: error("empty list") } - "last" -> { _ -> this.last() ?: error("empty list") } - "take" -> { nn -> this.take((nn[0] as Number).toInt()) } - "drop" -> { nn -> this.drop((nn[0] as Number).toInt()) } - "takeLast" -> { nn -> this.takeLast((nn[0] as Number).toInt()) } - "dropLast" -> { nn -> this.takeLast((nn[0] as Number).toInt()) } - "map" -> { nn -> @Suppress("UNCHECKED_CAST") val lambda = (nn[0] as (Any) -> Any); this.map { lambda(it!!) } } - "filter" -> { nn -> - @Suppress("UNCHECKED_CAST", "UNCHECKED_CAST") val lambda = - (nn[0] as (Any) -> Any); this.filter { (lambda(it!!) as Double).roundToInt() != 0 } - } - - "max" -> { _ -> - @Suppress("UNCHECKED_CAST") - (this as List>).max() - } - - "min" -> { _ -> - @Suppress("UNCHECKED_CAST") - (this as List>).min() - } - - "maxBy" -> { nn -> - @Suppress("UNCHECKED_CAST") val lambda = - (nn[0] as (Any) -> Any); this.maxByOrNull { - @Suppress("UNCHECKED_CAST") - lambda(it!!) as Comparable - } ?: error("no max") - } - - "minBy" -> { nn -> - @Suppress("UNCHECKED_CAST") val lambda = - (nn[0] as (Any) -> Any); this.minByOrNull { - @Suppress("UNCHECKED_CAST") - lambda(it!!) as Comparable - } ?: error("no max") - } - - "sorted" -> { _ -> - @Suppress("UNCHECKED_CAST") - (this as List>).sorted() - } - - "sortedBy" -> { nn -> - @Suppress("UNCHECKED_CAST") val lambda = - (nn[0] as (Any) -> Any); this.sortedBy { - @Suppress("UNCHECKED_CAST") - lambda(it!!) as Comparable - } - } - - "sortedByDescending" -> { nn -> - @Suppress("UNCHECKED_CAST") val lambda = (nn[0] as (Any) -> Any); this.sortedByDescending { - @Suppress("UNCHECKED_CAST") - lambda(it!!) as Comparable - } - } - - "reversed" -> { _ -> this.reversed() } - "zip" -> { nn -> - @Suppress("UNCHECKED_CAST") - this.zip(nn[0] as List).map { listOf(it.first, it.second) } - } - - else -> null - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Properties.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Properties.kt deleted file mode 100644 index 4782094f..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/Properties.kt +++ /dev/null @@ -1,92 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 - -internal fun String.property(property: String): Any { - return when (property) { - "length" -> this.length.toDouble() - "uppercase" -> this.uppercase() - "lowercase" -> this.lowercase() - "reversed" -> this.reversed() - else -> error("unknown property '$property'") - } -} - -internal fun Vector2.property(property: String): Any { - return when (property) { - "x" -> x - "y" -> y - "xx" -> xx - "yx" -> yx - "yy" -> yy - "xy" -> this - "xxx" -> Vector3(x, x, x) - "xxy" -> Vector3(x, x, y) - "length" -> length - "normalized" -> normalized - else -> error("unknown property '$property") - } -} - -internal fun Vector3.property(property: String): Any { - return when (property) { - "x" -> x - "y" -> y - "z" -> z - "xx" -> Vector2(x, x) - "yx" -> Vector2(y, x) - "yy" -> Vector2(y, y) - "xy" -> Vector2(x, y) - "zx" -> Vector2(z, x) - "xz" -> Vector2(x, z) - "xxx" -> Vector3(x, x, x) - "xxy" -> Vector3(x, x, y) - "length" -> length - "normalized" -> normalized - - else -> error("unknown property '$property") - } -} - -internal fun Vector4.property(property: String): Any { - return when (property) { - "x" -> x - "y" -> y - "z" -> z - "xx" -> Vector2(x, x) - "yx" -> Vector2(y, x) - "yy" -> Vector2(y, y) - "xy" -> Vector2(x, y) - "zx" -> Vector2(z, x) - "xz" -> Vector2(x, z) - "xyz" -> Vector3(x, y, z) - "xxy" -> Vector3(x, x, y) - "length" -> length - "normalized" -> normalized - else -> error("unknown property '$property") - } -} - -internal fun ColorRGBa.property(property: String): Any { - return when (property) { - "r" -> r - "g" -> g - "b" -> b - "a" -> alpha - "linear" -> toLinear() - "srgb" -> toSRGB() - else -> error("unknown property '$property") - } -} - -internal fun Matrix44.property(property: String): Any { - return when (property) { - "inversed" -> inversed - "transposed" -> transposed - else -> error("unknown property '$property") - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/TypedExpressions.kt b/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/TypedExpressions.kt deleted file mode 100644 index 7677098d..00000000 --- a/orx-expression-evaluator-typed/src/commonMain/kotlin/typed/TypedExpressions.kt +++ /dev/null @@ -1,1091 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import org.antlr.v4.kotlinruntime.* -import org.antlr.v4.kotlinruntime.tree.ParseTreeWalker -import org.antlr.v4.kotlinruntime.tree.TerminalNode -import org.openrndr.collections.pop -import org.openrndr.collections.push -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.expressions.parser.KeyLangLexer -import org.openrndr.extra.expressions.parser.KeyLangLexer.Tokens.RANGE_DOWNTO -import org.openrndr.extra.expressions.parser.KeyLangLexer.Tokens.RANGE_EXCLUSIVE -import org.openrndr.extra.expressions.parser.KeyLangLexer.Tokens.RANGE_EXCLUSIVE_UNTIL -import org.openrndr.extra.expressions.parser.KeyLangLexer.Tokens.RANGE_INCLUSIVE -import org.openrndr.extra.expressions.parser.KeyLangParser -import org.openrndr.extra.expressions.parser.KeyLangParserBaseListener -import org.openrndr.math.* -import kotlin.math.PI -import kotlin.math.roundToInt - -typealias TypedFunction0 = () -> Any -typealias TypedFunction1 = (Any) -> Any -typealias TypedFunction2 = (Any, Any) -> Any -typealias TypedFunction3 = (Any, Any, Any) -> Any -typealias TypedFunction4 = (Any, Any, Any, Any) -> Any -typealias TypedFunction5 = (Any, Any, Any, Any, Any) -> Any - - -private fun ArrayDeque.pushChecked(item: Any) { -// require(item is Double || item is Vector2 || item is Vector3 || item is Vector4 || item is Map<*, *> || item is Matrix44) { -// -// "$item ${item::class}" -// } - push(item) -} - -class TypedFunctionExtensions( - val functions0: Map = emptyMap(), - val functions1: Map = emptyMap(), - val functions2: Map = emptyMap(), - val functions3: Map = emptyMap(), - val functions4: Map = emptyMap(), - val functions5: Map = emptyMap() -) { - companion object { - val EMPTY = TypedFunctionExtensions() - } -} - -enum class IDType { - VARIABLE, - PROPERTY, - MEMBER_FUNCTION0, - MEMBER_FUNCTION1, - MEMBER_FUNCTION2, - MEMBER_FUNCTION3, - FUNCTION0, - FUNCTION1, - FUNCTION2, - FUNCTION3, - FUNCTION4, - FUNCTION5, - FUNCTION_ARGUMENT -} - -/** - * A base class for handling typed expressions in a custom language parser. - * This class provides an extensive set of overrides for various parser rules - * to allow custom implementation when these rules are triggered during parsing. - * - * @property functions Represents a mapping of functions categorized by their arity. - * @property constants Tracks constants identified during parsing. - * @property state Maintains the current state of the listener, preserving contextual information. - * - * Methods primarily handle entering and exiting parser rules for expressions, statements, and - * function calls, offering hooks to extend or modify behavior for each parsing scenario. Additionally, - * utility methods are provided to handle and propagate errors during parsing. - */ -abstract class TypedExpressionListenerBase( - val functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY, - val constants: (String) -> Any? = { null } -) : - KeyLangParserBaseListener() { - - class State { - val valueStack = ArrayDeque() - val functionStack = ArrayDeque<(Array) -> Any>() - val propertyStack = ArrayDeque() - - val idTypeStack = ArrayDeque() - var lastExpressionResult: Any? = null - - val exceptionStack = ArrayDeque() - - var inFunctionLiteral = 0 - - fun reset() { - valueStack.clear() - functionStack.clear() - propertyStack.clear() - idTypeStack.clear() - lastExpressionResult = null - exceptionStack.clear() - inFunctionLiteral = 0 - } - } - - abstract val state: State - override fun enterLine(ctx: KeyLangParser.LineContext) { - val s = state - s.reset() - } - - override fun exitRangeExpression(ctx: KeyLangParser.RangeExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val step: Any? - if (ctx.step != null) { - step = s.valueStack.pop() - } else { - step = null - } - - val right = s.valueStack.pop() - val left = s.valueStack.pop() - - - val lower = (left as Double).toInt() - val upper = (right as Double).toInt() - val list = if (step == null) { - when (ctx.operator?.type) { - RANGE_INCLUSIVE -> (lower..upper).toList().map { it.toDouble() } - RANGE_EXCLUSIVE -> (lower.. (lower until upper).toList().map { it.toDouble() } - RANGE_DOWNTO -> (lower downTo upper).toList().map { it.toDouble() } - else -> error("unsupported operator: '${ctx.operator?.text}'") - } - } else { - val stepSize = (step as Double).toInt() - when (ctx.operator?.type) { - RANGE_INCLUSIVE -> (lower..upper step stepSize).toList().map { it.toDouble() } - RANGE_EXCLUSIVE -> (lower.. (lower until upper step stepSize).toList().map { it.toDouble() } - RANGE_DOWNTO -> (lower downTo upper step stepSize).toList().map { it.toDouble() } - else -> error("unsupported operator: '${ctx.operator?.text}'") - } - } - s.valueStack.push(list) - - } - - override fun exitListLiteral(ctx: KeyLangParser.ListLiteralContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - val list = (0 until ctx.expressionRoot().size).map { s.valueStack.pop() } - s.valueStack.push(list.reversed()) - } - - override fun exitIndexExpression(ctx: KeyLangParser.IndexExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - val index = (s.valueStack.pop() as? Double)?.roundToInt() ?: error("index is not a number") - val listValue = s.valueStack.pop() - - @Suppress("UNCHECKED_CAST") val value = when (listValue) { - is List<*> -> listValue[index] ?: error("got null") - is Function<*> -> (listValue as (Int) -> Any)(index) - else -> error("can't index on '$listValue'") - } - s.valueStack.push(value) - } - - override fun enterFunctionLiteral(ctx: KeyLangParser.FunctionLiteralContext) { - val s = state - s.inFunctionLiteral++ - } - - override fun exitFunctionLiteral(ctx: KeyLangParser.FunctionLiteralContext) { - val s = state - s.inFunctionLiteral-- - val functionExpr = ctx.expression().text - - val ids = ctx.ID() - val f = when (ids.size) { - 0 -> compileFunction1(functionExpr, "it", constants, functions) - 1 -> compileFunction1(functionExpr, ids[0].text, constants, functions) - 2 -> compileFunction2(functionExpr, ids[0].text, ids[1].text, constants, functions) - else -> error("functions with ${ids.size} parameters are not supported") - - } - s.valueStack.push(f) - } - - override fun exitExpressionStatement(ctx: KeyLangParser.ExpressionStatementContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - throw ExpressionException("error in evaluation of '${ctx.text}': ${it.message ?: ""}") - } - val result = state.valueStack.pop() - s.lastExpressionResult = result - } - - override fun exitMinusExpression(ctx: KeyLangParser.MinusExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - val op = s.valueStack.pop() - s.valueStack.pushChecked( - when (op) { - is Double -> -op - is Vector3 -> -op - is Vector2 -> -op - is Vector4 -> -op - is Matrix44 -> op * -1.0 - else -> error("unsupported type") - } - ) - } - - @Suppress("IMPLICIT_CAST_TO_ANY") - override fun exitBinaryOperation1(ctx: KeyLangParser.BinaryOperation1Context) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val right = s.valueStack.pop() - val left = s.valueStack.pop() - - val result = when (val operator = ctx.operator?.type) { - KeyLangLexer.Tokens.ASTERISK -> when { - left is Double && right is Double -> left * right - left is Vector2 && right is Vector2 -> left * right - left is Vector2 && right is Double -> left * right - left is Vector3 && right is Vector3 -> left * right - left is Vector3 && right is Double -> left * right - left is Vector4 && right is Vector4 -> left * right - left is Vector4 && right is Double -> left * right - left is Matrix44 && right is Matrix44 -> left * right - left is Matrix44 && right is Vector4 -> left * right - left is Matrix44 && right is Double -> left * right - left is ColorRGBa && right is Double -> left * right - left is String && right is Double -> left.repeat(right.roundToInt()) - left is List<*> && right is Double -> (0 until right.roundToInt()).flatMap { left } - else -> error("unsupported operands for * operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.DIVISION -> when { - left is Double && right is Double -> left / right - left is Vector2 && right is Vector2 -> left / right - left is Vector2 && right is Double -> left / right - left is Vector3 && right is Vector3 -> left / right - left is Vector3 && right is Double -> left / right - left is Vector4 && right is Vector4 -> left / right - left is Vector4 && right is Double -> left / right - left is ColorRGBa && right is Double -> left / right - else -> error("unsupported operands for - operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.PERCENTAGE -> when { - left is Double && right is Double -> left.mod(right) - left is Vector2 && right is Vector2 -> left.mod(right) - left is Vector3 && right is Vector3 -> left.mod(right) - left is Vector4 && right is Vector4 -> left.mod(right) - else -> error("unsupported operands for - operator left:${left::class} right:${right::class}") - } - - else -> error("operator '$operator' not implemented") - } - s.valueStack.pushChecked(result) - } - - @Suppress("IMPLICIT_CAST_TO_ANY") - override fun exitBinaryOperation2(ctx: KeyLangParser.BinaryOperation2Context) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - - ifError { - pushError(it.message ?: "") - return - } - - val right = s.valueStack.pop() - val left = s.valueStack.pop() - - val result = when (val operator = ctx.operator?.type) { - KeyLangLexer.Tokens.PLUS -> when { - left is Double && right is Double -> left + right - left is Vector2 && right is Vector2 -> left + right - left is Vector3 && right is Vector3 -> left + right - left is Vector4 && right is Vector4 -> left + right - left is Matrix44 && right is Matrix44 -> left + right - left is ColorRGBa && right is ColorRGBa -> left + right - left is String && right is String -> left + right - left is List<*> && right is List<*> -> left + right - else -> error("unsupported operands for + operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.MINUS -> when { - left is Double && right is Double -> left - right - left is Vector2 && right is Vector2 -> left - right - left is Vector3 && right is Vector3 -> left - right - left is Vector4 && right is Vector4 -> left - right - left is Matrix44 && right is Matrix44 -> left - right - left is ColorRGBa && right is ColorRGBa -> left - right - else -> error("unsupported operands for - operator left:${left::class} right:${right::class}") - } - - else -> error("operator '$operator' not implemented") - } - s.valueStack.pushChecked(result) - } - - override fun exitJoinOperation(ctx: KeyLangParser.JoinOperationContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val right = (s.valueStack.pop() as Double).roundToInt() - val left = (s.valueStack.pop() as Double).roundToInt() - - val result = when (val operator = ctx.operator?.type) { - KeyLangLexer.Tokens.AND -> right != 0 && left != 0 - KeyLangLexer.Tokens.OR -> right != 0 || left != 0 - else -> error("operator '$operator' not implemented") - } - s.valueStack.pushChecked(if (result) 1.0 else 0.0) - } - - override fun exitComparisonOperation(ctx: KeyLangParser.ComparisonOperationContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val right = s.valueStack.pop() - val left = s.valueStack.pop() - - val result = when (val operator = ctx.operator?.type) { - KeyLangLexer.Tokens.EQ -> when { - left is Double && right is Double -> left == right - left is Vector2 && right is Vector2 -> left == right - left is Vector3 && right is Vector3 -> left == right - left is Vector4 && right is Vector4 -> left == right - left is ColorRGBa && right is ColorRGBa -> left == right - left is String && right is String -> left == right - else -> error("unsupported operands for == operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.LTEQ -> when { - left is Double && right is Double -> left <= right - else -> error("unsupported operands for <= operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.LT -> when { - left is Double && right is Double -> left < right - else -> error("unsupported operands for < operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.GTEQ -> when { - left is Double && right is Double -> left >= right - else -> error("unsupported operands for >= operator left:${left::class} right:${right::class}") - } - - KeyLangLexer.Tokens.GT -> when { - left is Double && right is Double -> left > right - else -> error("unsupported operands for > operator left:${left::class} right:${right::class}") - } - - else -> error("operator '$operator' not implemented") - } - s.valueStack.pushChecked(if (result) 1.0 else 0.0) - } - - override fun exitNegateExpression(ctx: KeyLangParser.NegateExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val operand = (s.valueStack.pop() as Double).roundToInt() - s.valueStack.pushChecked(if (operand == 0) 1.0 else 0.0) - } - - override fun exitTernaryExpression(ctx: KeyLangParser.TernaryExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val right = s.valueStack.pop() - val left = s.valueStack.pop() - val comp = s.valueStack.pop() - - val result = when (comp) { - is Double -> if (comp.roundToInt() != 0) left else right - else -> error("can't compare") - } - s.valueStack.pushChecked(result) - } - - override fun enterValueReference(ctx: KeyLangParser.ValueReferenceContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.VARIABLE) - } - - override fun enterMemberFunctionCall0Expression(ctx: KeyLangParser.MemberFunctionCall0ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.MEMBER_FUNCTION1) - } - - override fun exitMemberFunctionCall0Expression(ctx: KeyLangParser.MemberFunctionCall0ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - s.valueStack.pushChecked(s.functionStack.pop().invoke(emptyArray())) - } - - override fun enterMemberFunctionCall1Expression(ctx: KeyLangParser.MemberFunctionCall1ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.MEMBER_FUNCTION1) - } - - override fun exitMemberFunctionCall1Expression(ctx: KeyLangParser.MemberFunctionCall1ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - s.valueStack.pushChecked(s.functionStack.pop().invoke(arrayOf(s.valueStack.pop()))) - } - - override fun enterMemberFunctionCall2Expression(ctx: KeyLangParser.MemberFunctionCall2ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.MEMBER_FUNCTION2) - } - - override fun exitMemberFunctionCall2Expression(ctx: KeyLangParser.MemberFunctionCall2ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - s.valueStack.pushChecked(s.functionStack.pop().invoke(arrayOf(argument0, argument1))) - } - - override fun enterMemberFunctionCall3Expression(ctx: KeyLangParser.MemberFunctionCall3ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.MEMBER_FUNCTION3) - } - - override fun exitMemberFunctionCall3Expression(ctx: KeyLangParser.MemberFunctionCall3ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - val argument2 = s.valueStack.pop() - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - s.valueStack.pushChecked(s.functionStack.pop().invoke(arrayOf(argument0, argument1, argument2))) - } - - override fun enterMemberFunctionCall0LambdaExpression(ctx: KeyLangParser.MemberFunctionCall0LambdaExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.MEMBER_FUNCTION1) - } - - override fun exitMemberFunctionCall0LambdaExpression(ctx: KeyLangParser.MemberFunctionCall0LambdaExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - s.valueStack.pushChecked(s.functionStack.pop().invoke(arrayOf(s.valueStack.pop()))) - } - - - override fun enterFunctionCall0Expression(ctx: KeyLangParser.FunctionCall0ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.FUNCTION0) - } - - override fun exitFunctionCall0Expression(ctx: KeyLangParser.FunctionCall0ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val result = function.invoke(arrayOf()) - s.valueStack.pushChecked(result) - } - - override fun enterFunctionCall1Expression(ctx: KeyLangParser.FunctionCall1ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.FUNCTION1) - } - - override fun exitFunctionCall1Expression(ctx: KeyLangParser.FunctionCall1ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val argument = s.valueStack.pop() - - val result = function.invoke(arrayOf(argument)) - s.valueStack.pushChecked(result) - } - - override fun enterFunctionCall2Expression(ctx: KeyLangParser.FunctionCall2ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - s.idTypeStack.push(IDType.FUNCTION2) - } - - - override fun exitFunctionCall2Expression(ctx: KeyLangParser.FunctionCall2ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - val result = function.invoke(arrayOf(argument0, argument1)) - s.valueStack.pushChecked(result) - } - - override fun enterFunctionCall3Expression(ctx: KeyLangParser.FunctionCall3ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.FUNCTION3) - } - - override fun exitFunctionCall3Expression(ctx: KeyLangParser.FunctionCall3ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val argument2 = s.valueStack.pop() - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - val result = function.invoke(arrayOf(argument0, argument1, argument2)) - s.valueStack.pushChecked(result) - } - - override fun enterFunctionCall4Expression(ctx: KeyLangParser.FunctionCall4ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.FUNCTION4) - } - - override fun exitFunctionCall4Expression(ctx: KeyLangParser.FunctionCall4ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val argument3 = s.valueStack.pop() - val argument2 = s.valueStack.pop() - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - val result = function.invoke(arrayOf(argument0, argument1, argument2, argument3)) - s.valueStack.pushChecked(result) - } - - - override fun enterFunctionCall5Expression(ctx: KeyLangParser.FunctionCall5ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.FUNCTION5) - } - - override fun exitFunctionCall5Expression(ctx: KeyLangParser.FunctionCall5ExpressionContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - ifError { - pushError(it.message ?: "") - return - } - - val function = s.functionStack.pop() - val argument4 = s.valueStack.pop() - val argument3 = s.valueStack.pop() - val argument2 = s.valueStack.pop() - val argument1 = s.valueStack.pop() - val argument0 = s.valueStack.pop() - - val result = function.invoke(arrayOf(argument0, argument1, argument2, argument3, argument4)) - s.valueStack.pushChecked(result) - } - - private fun errorValue(message: String, value: T): T { - pushError(message) - return value - } - - private fun pushError(message: String) { - val s = state - - s.exceptionStack.push(ExpressionException(message)) - } - - private inline fun ifError(f: (e: Throwable) -> Unit) { - val s = state - if (s.exceptionStack.isNotEmpty()) { - val e = s.exceptionStack.pop() - f(e) - } - } - - override fun enterPropReference(ctx: KeyLangParser.PropReferenceContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - s.idTypeStack.push(IDType.PROPERTY) - } - - override fun exitPropReference(ctx: KeyLangParser.PropReferenceContext) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - val root = s.valueStack.pop() - var current = root - val property = s.propertyStack.pop() - @Suppress("UNCHECKED_CAST") - current = when (current) { - is Map<*, *> -> current[property] ?: error("property '$property' not found") - is Function<*> -> (current as ((String) -> Any?)).invoke(property) - ?: error("property '$property' not found") - - is Vector2 -> current.property(property) - is Vector3 -> current.property(property) - is Vector4 -> current.property(property) - is ColorRGBa -> current.property(property) - is Matrix44 -> current.property(property) - is String -> current.property(property) - else -> error("can't look up: ${current::class} '$current', root:'$root' ${ctx.text} ") - } - s.valueStack.push(current) - } - - - @Suppress("MoveLambdaOutsideParentheses") - override fun visitTerminal(node: TerminalNode) { - val s = state - if (s.inFunctionLiteral > 0) { - return - } - - - fun handleFunction( - name: String, - dispatchFunction: (String, Map) -> ((Array) -> Any)?, - functionMap: Map, - adapter: (T) -> (Array) -> Any, - errorMessage: String - ) { - val function = dispatchFunction(name, functionMap) - - if (function != null) { - s.functionStack.push(function) - } else { - val cfunction = constants(name) as? T - if (cfunction != null) { - s.functionStack.push(adapter(cfunction)) - } else { - s.functionStack.push(errorValue("unresolved function: '$errorMessage'") { _ -> - error("this is the error function") - }) - } - } - } - - - - val type = node.symbol.type - if (type == KeyLangParser.Tokens.INTLIT) { - s.valueStack.pushChecked(node.text.toDouble()) - } else if (type == KeyLangParser.Tokens.DECLIT) { - s.valueStack.pushChecked(node.text.toDouble()) - } else if (type == KeyLangParser.Tokens.STRING_CONTENT) { - s.valueStack.pushChecked(node.text) - } else if (type == KeyLangParser.Tokens.ID) { - val name = node.text.replace("`", "") - @Suppress("DIVISION_BY_ZERO") - when (val idType = s.idTypeStack.pop()) { - IDType.VARIABLE -> s.valueStack.pushChecked( - when (name) { - "PI" -> PI - else -> constants(name) - ?: errorValue("unresolved value: '${name}'. Available constant: ${constants}", Unit) - } - ) - - IDType.PROPERTY -> s.propertyStack.push(name) - - IDType.MEMBER_FUNCTION0, - IDType.MEMBER_FUNCTION1, - IDType.MEMBER_FUNCTION2, - IDType.MEMBER_FUNCTION3 -> { - val receiver = s.valueStack.pop() - when (receiver) { - is String -> { - s.functionStack.push( - receiver.memberFunctions(name) - ?: error("no member function '$receiver.$name()'") - ) - } - - is List<*> -> { - s.functionStack.push( - receiver.memberFunctions(name) - ?: error("no member function '$receiver.$name()'") - ) - } - - is ColorRGBa -> { - when (idType) { - IDType.MEMBER_FUNCTION1 -> { - s.functionStack.push( - when (name) { - "shade" -> { x -> receiver.shade(x[0] as Double) } - "opacify" -> { x -> receiver.opacify(x[0] as Double) } - else -> error("no member function '$receiver.$name()'") - }) - } - - else -> error("no member function $idType '$receiver.$name()") - } - } - - is Function<*> -> { - - fun input(): String { - return "in '${node.getParent()?.text}'" - } - - @Suppress("UNCHECKED_CAST") - receiver as (String) -> Any? - val function = - receiver.invoke(name) ?: error("Unresolved function '${name} ${input()}") - - when (idType) { - IDType.MEMBER_FUNCTION0 -> { - @Suppress("UNCHECKED_CAST") - function as () -> Any - s.functionStack.push({ function() }) - } - - IDType.MEMBER_FUNCTION1 -> { - @Suppress("UNCHECKED_CAST") - (function as? (Any) -> Any) - ?: error("Cannot cast function '$name' ($function) to (Any) -> Any ${input()}") - s.functionStack.push({ x -> function(x[0]) }) - } - - IDType.MEMBER_FUNCTION2 -> { - @Suppress("UNCHECKED_CAST") - function as? (Any, Any) -> Any - ?: error("Cannot cast function '$name' ($function) to (Any, Any) -> Any ${input()}") - s.functionStack.push({ x -> function(x[0], x[1]) }) - } - - IDType.MEMBER_FUNCTION3 -> { - @Suppress("UNCHECKED_CAST") - function as? (Any, Any, Any) -> Any - ?: error("Cannot cast function '$name' ($function) to (Any, Any, Any) -> Any ${input()}") - s.functionStack.push({ x -> function(x[0], x[1], x[2]) }) - } - - else -> error("unreachable") - } - } - else -> error( - "receiver for '$name' '${ - receiver.toString().take(30) - }' ${receiver::class} not supported" - ) - } - } - - IDType.FUNCTION0 -> handleFunction( - name, - ::dispatchFunction0, - functions.functions0, - { f -> { x -> f() } }, - "${name}()" - ) - - IDType.FUNCTION1 -> handleFunction( - name, - ::dispatchFunction1, - functions.functions1, - { f -> { x -> f(x[0]) } }, - "${name}(x0)" - ) - - IDType.FUNCTION2 -> handleFunction( - name, - ::dispatchFunction2, - functions.functions2, - { f -> { x -> f(x[0], x[1]) } }, - "${name}(x0, x1)" - ) - - IDType.FUNCTION3 -> handleFunction( - name, - ::dispatchFunction3, - functions.functions3, - { f -> { x -> f(x[0], x[1], x[2]) } }, - "${name}(x0, x1, x2)" - ) - - IDType.FUNCTION4 -> handleFunction( - name, - ::dispatchFunction4, - functions.functions4, - { f -> { x -> f(x[0], x[1], x[2], x[3]) } }, - "${name}(x0, x1, x2, x3)" - ) - - IDType.FUNCTION5 -> { - val cfunction = constants(name) as? (Any, Any, Any, Any, Any) -> Any - if (cfunction != null) { - s.functionStack.push({ x -> cfunction(x[0], x[1], x[2], x[3], x[4]) }) - } else { - s.functionStack.push(errorValue("unresolved function: '${name}(x0, x1, x2, x3, x4)'") { _ -> - error("this is the error function") - }) - } - } - - IDType.FUNCTION_ARGUMENT -> { - - } - - else -> error("unsupported id-type $idType") - } - } - } -} - -expect class TypedExpressionListener( - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY, - constants: (String) -> Any? = { null } -) : TypedExpressionListenerBase { - - override val state: State -} - -class ExpressionException(message: String) : RuntimeException(message) - -/** - * Evaluates a typed expression based on the provided string input, constants, - * and function definitions. - * - * @param expression The string representation of the expression to evaluate. - * @param constants A lambda function providing constant values for specific - * variables. Returns null if a constant is not found. Defaults to a function - * returning null for any input. - * @param functions A `TypedFunctionExtensions` instance encapsulating function - * definitions for 0 to 5 arguments. Defaults to an empty set of functions. - * @return The result of the evaluated expression as an `Any?` type. - * Returns null if the evaluation produces no result. - * @throws ExpressionException If a syntax error occurs in the input expression - * or during expression evaluation. - */ -fun evaluateTypedExpression( - expression: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY -): Any? { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - - val root = parser.keyLangFile() - val listener = TypedExpressionListener(functions, constants) - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - } catch (e: ExpressionException) { - throw ExpressionException(e.message ?: "") - } - - return listener.state.lastExpressionResult -} - -/** - * Compiles a typed expression and returns a lambda that can execute the compiled expression. - * - * @param expression The string representation of the expression to compile. - * @param constants A lambda function to resolve constants by their names. Defaults to a resolver that returns null. - * @param functions An instance of `TypedFunctionExtensions` containing the supported custom functions for the expression. Defaults to an empty set of functions. - * @return A lambda function that evaluates the compiled expression and returns its result. - * @throws ExpressionException If there is a syntax error or a parsing issue in the provided expression. - */ -fun compileTypedExpression( - expression: String, - constants: (String) -> Any? = { null }, - functions: TypedFunctionExtensions = TypedFunctionExtensions.EMPTY -): () -> Any { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - val root = parser.keyLangFile() - val listener = TypedExpressionListener(functions, constants) - - return { - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - } catch (e: ExpressionException) { - throw ExpressionException(e.message ?: "") - } - listener.state.lastExpressionResult ?: error("no result") - } -} - -internal fun expressionRoot(expression: String): KeyLangParser.KeyLangFileContext { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - return parser.keyLangFile() -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jsMain/kotlin/typed/TypedExpressions.js.kt b/orx-expression-evaluator-typed/src/jsMain/kotlin/typed/TypedExpressions.js.kt deleted file mode 100644 index 8c0ccefe..00000000 --- a/orx-expression-evaluator-typed/src/jsMain/kotlin/typed/TypedExpressions.js.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.openrndr.extra.expressions.typed - -actual class TypedExpressionListener actual constructor( - functions: TypedFunctionExtensions, - constants: (String) -> Any? -) : TypedExpressionListenerBase(functions, constants) { - actual override val state: State = State() -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jvmMain/kotlin/typed/TypedExpressions.jvm.kt b/orx-expression-evaluator-typed/src/jvmMain/kotlin/typed/TypedExpressions.jvm.kt deleted file mode 100644 index 8516183f..00000000 --- a/orx-expression-evaluator-typed/src/jvmMain/kotlin/typed/TypedExpressions.jvm.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.openrndr.extra.expressions.typed - -import kotlin.concurrent.getOrSet - -/* -Thread safe TypeExpressionListener - */ -actual class TypedExpressionListener actual constructor( - functions: TypedFunctionExtensions, - constants: (String) -> Any? -) : TypedExpressionListenerBase(functions, constants) { - private val threadLocalState = ThreadLocal() - actual override val state: State - get() = threadLocalState.getOrSet { State() } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestListLiteralExpression.kt b/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestListLiteralExpression.kt deleted file mode 100644 index 9321b321..00000000 --- a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestListLiteralExpression.kt +++ /dev/null @@ -1,24 +0,0 @@ -package typed - -import org.junit.jupiter.api.Assertions.assertEquals -import org.openrndr.extra.expressions.typed.evaluateTypedExpression -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestListLiteralExpression { - - @Test - fun testSimpleList() { - val r = evaluateTypedExpression("[0, 1, 2]") - assertTrue(r is List<*>) - assertEquals(3, r.size ) - } - - @Test - fun testRangesList() { - val r = evaluateTypedExpression("[0..1, 1..2, 2..3]") - assertTrue(r is List<*>) - assertEquals(3, r.size ) - } - -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestRangeExpression.kt b/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestRangeExpression.kt deleted file mode 100644 index 6bf7669c..00000000 --- a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestRangeExpression.kt +++ /dev/null @@ -1,72 +0,0 @@ -package typed - -import org.junit.jupiter.api.Assertions.assertEquals -import org.openrndr.extra.expressions.typed.evaluateTypedExpression -import kotlin.test.Test -import kotlin.test.assertTrue - -class TestRangeExpression { - @Test - fun testRangeInclusive() { - val r = evaluateTypedExpression("(0..10)") - assertTrue(r is List<*>) - assertEquals(11, r.size) - } - - @Test - fun testRangeDownTo() { - val r = evaluateTypedExpression("(10 downTo 0)") - assertTrue(r is List<*>) - assertEquals(11, r.size) - assertEquals(0.0, r.last()) - } - - @Test - fun testRangeExclusive() { - val r = evaluateTypedExpression("(0..<10)") - assertTrue(r is List<*>) - assertEquals(10, r.size) - } - - @Test - fun testRangeInclusivePrecedenceRight() { - val r = evaluateTypedExpression("(0..10+2)") - assertTrue(r is List<*>) - assertEquals(13, r.size) - } - - @Test - fun testRangeInclusivePrecedenceLeft() { - val r = evaluateTypedExpression("1+2..10") - assertTrue(r is List<*>) - assertEquals(8, r.size) - } - - @Test - fun testRangeInclusivePrecedenceLeftRight() { - val r = evaluateTypedExpression("1+2..10+2") - assertTrue(r is List<*>) - assertEquals(10, r.size) - } - - @Test - fun testRangeUntilPrecedenceLeftRight() { - val r = evaluateTypedExpression("1+2 until 10+2") - assertTrue(r is List<*>) - assertEquals(9, r.size) - } - - @Test - fun testRangeUntilPrecedenceLeftRightMap() { - val r = evaluateTypedExpression("(1+2 until 10+2).map { x -> x * 2 }") - assertTrue(r is List<*>) - assertEquals(9, r.size) - } - - @Test - fun testRangeExclusiveStep() { - val r = evaluateTypedExpression("(0..10 step 2)") - assertTrue(r is List<*>) - assertEquals(6, r.size) - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedCompiledExpression.kt b/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedCompiledExpression.kt deleted file mode 100644 index 5184c3f3..00000000 --- a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedCompiledExpression.kt +++ /dev/null @@ -1,117 +0,0 @@ -package typed - -import org.openrndr.extra.expressions.typed.compileFunction1OrNull -import org.openrndr.extra.noise.uniform -import org.openrndr.math.Vector2 -import kotlin.math.cos -import kotlin.test.Test -import kotlin.test.assertEquals - -class TestTypedCompiledExpression { - - @Test - fun testStringLiteral() { - run { - val c = compileFunction1OrNull(""""hoi"""", "t")!! - val v = c(0.0) - assertEquals("hoi", v) - } - run { - val c = compileFunction1OrNull(""""hoi" + " " + "doei" * t""", "t")!! - val v = c(2.0) - assertEquals("hoi doeidoei", v) - } - - run { - val c = compileFunction1OrNull(""""hoi".take(t)""", "t")!! - val v = c(2.0) - assertEquals("ho", v) - } - } - - @Test - fun testComparison() { - run { - val c = compileFunction1OrNull("""t == t""", "t")!! - val v = c(0.0) - assertEquals(1.0, v) - } - } - - @Test - fun testFunction1() { - run { - val c = compileFunction1OrNull("x + 3.0", "x")!! - assertEquals(1.0 + 3.0, c(1.0)) - assertEquals(2.0 + 3.0, c(2.0)) - } - run { - val c = compileFunction1OrNull("x.x + x.y", "x")!! - assertEquals(1.0 + 3.0, c(Vector2(1.0, 3.0))) - assertEquals(2.0 + 3.0, c(Vector2(2.0, 3.0))) - } - run { - val c = compileFunction1OrNull("x.x + x.y", "x")!! - val start = System.currentTimeMillis() - for (i in 0 until 1000) { - val r0 = Double.uniform(0.0, 1.0) - val r1 = Double.uniform(0.0, 1.0) - assertEquals(r0 + r1, c(Vector2(r0, r1))) - } - val end = System.currentTimeMillis() - println("that took ${end - start}") - } - } - - @Test - fun testFunction2() { - run { - val c = compileFunction1OrNull, Double>("x.x + 3.0", "x")!! - assertEquals(1.0 + 3.0, c(mapOf("x" to 1.0))) - //assertEquals(2.0 + 3.0, c(mapOf("x" to 2.0)) - } - } - - @Test - fun testDynamicConstants() { - - val env = { n: String -> - when (n) { - "a" -> { nn: String -> - when (nn) { - "a" -> { nnn: String -> - when (nnn) { - "b" -> 7.0 - "c" -> { x: Double -> x + 1.0 } - else -> null - } - } - - "b" -> 5.0 - "c" -> { x: Double -> x * 2.0 } - else -> null - } - - } - "c" -> { x: Double -> x * 3.0 } - else -> null - } - } - - val c0 = compileFunction1OrNull, Double>("a.a.c(2.0)", "x", constants = env)!! - val r0 = c0(emptyMap()) - assertEquals(3.0, r0) - - val c1 = compileFunction1OrNull, Double>("a.c(2.0)", "x", constants = env)!! - val r1 = c1(emptyMap()) - assertEquals(4.0, r1) - - val c2 = compileFunction1OrNull, Double>("c(2.0)", "x", constants = env)!! - val r2 = c2(emptyMap()) - assertEquals(6.0, r2) - - val c3 = compileFunction1OrNull, Double>("cos(2.0)", "x", constants = env)!! - val r3 = c3(emptyMap()) - assertEquals(cos(2.0), r3, 1E-6) - } -} \ No newline at end of file diff --git a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedExpression.kt b/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedExpression.kt deleted file mode 100644 index e7a121a5..00000000 --- a/orx-expression-evaluator-typed/src/jvmTest/kotlin/typed/TestTypedExpression.kt +++ /dev/null @@ -1,178 +0,0 @@ -package typed - -import org.junit.jupiter.api.Assertions.assertEquals -import org.openrndr.extra.expressions.typed.evaluateTypedExpression -import org.openrndr.math.Vector2 -import kotlin.test.Test - -class TestTypedExpression { - - @Test - fun funTestFunction() { - run { - val r = evaluateTypedExpression("{ x -> 2.0 + x }") - @Suppress("UNCHECKED_CAST") val f = r as (Double) -> Double - println(f(3.0)) - } - run { - val r = evaluateTypedExpression("{ { 2.0 + it } }") - @Suppress("UNCHECKED_CAST") val f0 = r as (Any) -> ((Any) -> Any) - val f1 = f0(0.0) - println(f1(3.0)) - } - } - - @Test - fun funTestLambdaArg() { - run { - val r = evaluateTypedExpression("[0.0, 1.0].map { x -> 2.0 + x }") - assertEquals(listOf(2.0, 3.0), r) - } - - run { - val r = evaluateTypedExpression("[0.0, 1.0].map { x -> vec2(2.0 + x, 2.0 + x) }") - assertEquals(listOf(Vector2(2.0, 2.0), Vector2(3.0, 3.0)), r) - } - - run { - val r = evaluateTypedExpression("[0.0, 1.0, 2.0].filter { x -> x >= 1.0 }") - assertEquals(listOf(1.0, 2.0), r) - } - } - - - - @Test - fun testList() { - println("result is: ${evaluateTypedExpression("[]")}") - println("result is: ${evaluateTypedExpression("[1.0, 2.0]")}") - println("result is: ${evaluateTypedExpression("[1.0, 2.0].take(1)")}") - println("result is: ${evaluateTypedExpression("[1.0 + 2.0, 2.0 * 3.0].take(1 + 1)")}") - - println("result is: ${evaluateTypedExpression("[] + []")}") - println("result is: ${evaluateTypedExpression("([1] * 2 + [2] * 1)*5")}" ) - - println("result is: ${evaluateTypedExpression("[] + []")}") - println("result is: ${evaluateTypedExpression("[[0, 1, 2][1]]")}" ) - - println("result is: ${evaluateTypedExpression("[0, 1, 2].max()")}" ) - println("result is: ${evaluateTypedExpression("[0, 1, 2].maxBy { x -> x }")}" ) - println("result is: ${evaluateTypedExpression("""["one", "two", "three"].maxBy { x -> x.length }""")}") - - } - - - @Test - fun testTernary() { - println("result is: ${evaluateTypedExpression("2.0 > 0.5 ? 1.3 : 0.7")}") - } - - @Test - fun testJoin() { - assertEquals(0.0, evaluateTypedExpression("1.0 && 0.0")) - assertEquals(1.0, evaluateTypedExpression("1.0 && 1.0")) - assertEquals(0.0, evaluateTypedExpression("0.0 && 0.0")) - assertEquals(0.0, evaluateTypedExpression("0.0 && 1.0")) - - assertEquals(1.0, evaluateTypedExpression("1.0 || 0.0")) - assertEquals(1.0, evaluateTypedExpression("1.0 || 1.0")) - assertEquals(0.0, evaluateTypedExpression("0.0 || 0.0")) - assertEquals(1.0, evaluateTypedExpression("0.0 || 1.0")) - - assertEquals(1.0, evaluateTypedExpression("(0.0 || 1.0) && (1.0 || 0.0)")) - } - - @Test - fun testNegate() { - assertEquals(0.0, evaluateTypedExpression("!1.0")) - assertEquals(1.0, evaluateTypedExpression("!0.0")) - assertEquals(1.0, evaluateTypedExpression("!!2.0")) - } - - @Test - fun testTyped() { - println(evaluateTypedExpression("vec2(1.0, 1.0) + vec2(1.0, 1.0)")) - println(evaluateTypedExpression("vec3(1.0, 1.0, 1.0) + vec3(2.0, 3.0, 4.0)")) - println(evaluateTypedExpression("vec3(1.0, 1.0, 1.0) * vec3(2.0, 3.0, 4.0)")) - println(evaluateTypedExpression("translate(vec3(1.0, 0.0, 0.0)) * mat4(vec4(1,0,0,0), vec4(0,1,0,0), vec4(0,0,1,0), vec4(0.0, 0.0, 0.0, 1.0))")) - println(evaluateTypedExpression("(translate(vec3(1.0, 0.0, 0.0)) * vec4(0.0, 0.0, 0.0, 1.0)).xyz")) - } - - fun Map.function(): (String) -> Any? { - return fun(p: String): Any? { - val v = this[p] - if (v is Map<*, *>) { - @Suppress("UNCHECKED_CAST") - return (v as Map).function() - } else { - return v - } - } - } - - @Test - fun testPropref() { - println(evaluateTypedExpression("a.b.c", constants = mapOf("a" to mapOf("b" to mapOf("c" to 8.0))).function())) - println( - evaluateTypedExpression( - "a.yx.yx.normalized * -5.0", - constants = mapOf("a" to Vector2(1.0, 2.0)).function() - ) - ) - println( - evaluateTypedExpression( - "vec2(2.0, 3.0).normalized", - constants = mapOf("a" to Vector2(1.0, 2.0)).function() - ) - ) - } - - @Test - fun testMethodCall() { - println( - evaluateTypedExpression( - "a.b.c(5.0) + a.b.sum(3.0, 5.0)", - constants = mapOf( - "a" to - mapOf( - "b" to - mapOf( - "c" to { x: Double -> x * 5.0 }, - "sum" to { x: Double, y: Double -> x + y } - ) - ) - ).function() - ) - ) - } - - @Suppress("NAME_SHADOWING") - @Test - fun testMethodCallF() { - println( - evaluateTypedExpression( - "vec2(2.0, 3.0) * (a.b.c(5.0) + a.b.sum(3.0, 5.0))", - constants = { name: String -> - when (name) { - "a" -> { name: String -> - when (name) { - "b" -> { name: String -> - when (name) { - "c" -> { x: Double -> x * 5.0 } - "sum" -> { x: Double, y: Double -> x + y } - else -> null - } - } - - else -> null - } - } - - else -> null - } - } - ) - ) - } - -} \ No newline at end of file diff --git a/orx-expression-evaluator/.gitignore b/orx-expression-evaluator/.gitignore deleted file mode 100644 index f0dd3232..00000000 --- a/orx-expression-evaluator/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.tokens -gen/ \ No newline at end of file diff --git a/orx-expression-evaluator/README.md b/orx-expression-evaluator/README.md deleted file mode 100644 index cdfdcd1e..00000000 --- a/orx-expression-evaluator/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# orx-expression-evaluator - -Tools to evaluate strings containing mathematical expressions. - -# Expression evaluator - -```kotlin -val expression = "x + y" -val constants = mapOf("x" to 1.0, "y" to 2.0) -evaluateExpression(expression, constants) -``` -## Built-in expression functions - -Unary functions: - * `abs(x)` - * `acos(x)` - * `asin(x)` - * `atan(x)` - * `ceil(x)` - * `cos(x)` - * `degrees(x)` - * `exps(x)` - * `floor(x)` - * `radians(x)` - * `round(x)` - * `saturate(x)`, clamp x to [0.0, 1.0] - * `sqrt(x)` - * `tan(x)` - -Binary functions: - * `atan2(x, y)` - * `length(x, y)`, the Euclidean length of the vector (x,y) - * `max(x, y)`, - * `min(x, y)`, - * `pow(x, n)` - * `random(x, y)`, return a random number in [x, y) - -Ternary functions: - * `length(x, y, z)`, the Euclidean length of the vector (x, y, z) - * `max(x, y, z)` - * `min(x, y, z)` - * `mix(l, r, f)` - * `smoothstep(e0, e1, x)` - * `sum(x, y, z)` - -Quaternary functions: -* `length(x, y, z, w)`, the Euclidean length of the vector (x, y, z) -* `max(a, b, c, d)` -* `min(a, b, c, d)` -* `sum(a, b, c, d)` - -Quinary functions: -* `map(x0, x1, y0, y1, v)` -* `max(a, b, c, d, e)` -* `min(a, b, c, d, e)` -* `sum(a, b, c, d, e)` - -# Compiled functions - -```kotlin -val expression = "x * 5.0 + cos(x)" -val f = compileFunction1(expression, "x") -f(0.0) -``` - -```kotlin -val expression = "x * 5.0 + cos(x) * y" -val f = compileFunction2(expression, "x", "y") -f(0.0, 0.4) -``` - -# Property delegates - -```kotlin -val constants = mutableMapOf("width" to 300.0) -val settings = object { - var xExpression = "cos(t) * 50.0 + width / 2.0" -} -val xFunction by watchingExpression1(settings::xExpression, "t", constants) - -xFunction(1.0) -``` - -## Demos -### DemoExpressionEvaluator01 - - - -![DemoExpressionEvaluator01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-expression-evaluator/images/DemoExpressionEvaluator01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoExpressionEvaluator01.kt) - -### DemoExpressionEvaluator02 - -Improved version of DemoExpressionEvaluator01, it uses [watchingExpression1] to automatically convert an expression -string into a function with a parameter "t". - -![DemoExpressionEvaluator02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-expression-evaluator/images/DemoExpressionEvaluator02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoExpressionEvaluator02.kt) diff --git a/orx-expression-evaluator/build.gradle.kts b/orx-expression-evaluator/build.gradle.kts deleted file mode 100644 index d1dfb39b..00000000 --- a/orx-expression-evaluator/build.gradle.kts +++ /dev/null @@ -1,56 +0,0 @@ -import com.strumenta.antlrkotlin.gradle.AntlrKotlinTask -import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask - -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.antlr.kotlin) -} - -val generateKotlinGrammarSource = tasks.register("generateKotlinGrammarSource") { - dependsOn("cleanGenerateKotlinGrammarSource") - - source = fileTree(layout.projectDirectory.dir("src/commonMain/antlr")) { - include("**/*.g4") - } - - // We want the generated source files to have this package name - val pkgName = "org.openrndr.extra.expressions.parser" - packageName = pkgName - - // We want visitors alongside listeners. - // The Kotlin target language is implicit, as is the file encoding (UTF-8) - arguments = listOf("-visitor") - - // Generated files are outputted inside build/generatedAntlr/{package-name} - val outDir = "generatedAntlr/${pkgName.replace(".", "/")}" - outputDirectory = layout.buildDirectory.dir(outDir).get().asFile -} - - -kotlin { - sourceSets { - val commonMain by getting { - dependencies { - implementation(libs.antlr.kotlin.runtime) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) - implementation(project(":orx-property-watchers")) - implementation(project(":orx-noise")) - } - kotlin { - srcDir(layout.buildDirectory.dir("generatedAntlr")) - } - } - val jvmDemo by getting { - dependencies { - implementation(project(":orx-jvm:orx-gui")) - } - } - } -} - -tasks.withType> { dependsOn(generateKotlinGrammarSource) } -tasks.withType { dependsOn(generateKotlinGrammarSource) } -tasks.named("dokkaGeneratePublicationHtml") { dependsOn(generateKotlinGrammarSource) } -tasks.named("dokkaGenerateModuleHtml") { dependsOn(generateKotlinGrammarSource) } diff --git a/orx-expression-evaluator/src/commonMain/antlr/KeyLangLexer.g4 b/orx-expression-evaluator/src/commonMain/antlr/KeyLangLexer.g4 deleted file mode 100644 index 563e2c08..00000000 --- a/orx-expression-evaluator/src/commonMain/antlr/KeyLangLexer.g4 +++ /dev/null @@ -1,71 +0,0 @@ -lexer grammar KeyLangLexer; - -channels { WHITESPACE } - -// Whitespace -NEWLINE : '\r\n' | '\r' | '\n' ; -WS : [\t ]+ -> channel(WHITESPACE) ; - - -RANGE_INCLUSIVE : '..' ; -RANGE_EXCLUSIVE_UNTIL : 'until' ; -RANGE_EXCLUSIVE : '..<' ; -RANGE_DOWNTO : 'downTo' ; - -STEP : 'step' ; - - -// Identifiers -ID : [$_]*[a-zA-Z][A-Za-z0-9_]* | '`'[$_]*[A-Za-z0-9_-]*'`'; -FUNCTION_ID : [$_]*[a-z][A-Za-z0-9_]* ; - -// Literals - -DECLIT : [0-9][0-9]* '.' [0-9]+ ; -INTLIT : '0'|[0-9][0-9]* ; - -// Operators -PLUS : '+' ; -PERCENTAGE : '%' ; -MINUS : '-' ; -ASTERISK : '*' ; -DIVISION : '/' ; -ASSIGN : '=' ; -LPAREN : '(' ; -RPAREN : ')' ; -LBRACKET : '[' ; -RBRACKET : ']' ; -LCURLY : '{' ; -RCURLY : '}' ; - -QUESTION_MARK : '?' ; -COLON : ':' ; - -ARROW : '->' ; - -COMMA : ',' ; -DOT : '.' ; - -EQ : '==' ; -LT : '<' ; -LTEQ : '<=' ; -GT : '>' ; -GTEQ : '>=' ; - -AND : '&&' ; -OR : '||' ; -NOT : '!' ; - -STRING_OPEN : '"' -> pushMode(MODE_IN_STRING); - -UNMATCHED : . ; - -mode MODE_IN_STRING; - -ESCAPE_STRING_DELIMITER : '\\"' ; -ESCAPE_SLASH : '\\\\' ; -ESCAPE_NEWLINE : '\\n' ; -ESCAPE_SHARP : '\\#' ; -STRING_CLOSE : '"' -> popMode ; -STRING_CONTENT : ~["\n\r\t\\#]+ ; - diff --git a/orx-expression-evaluator/src/commonMain/antlr/KeyLangParser.g4 b/orx-expression-evaluator/src/commonMain/antlr/KeyLangParser.g4 deleted file mode 100644 index 18e370c1..00000000 --- a/orx-expression-evaluator/src/commonMain/antlr/KeyLangParser.g4 +++ /dev/null @@ -1,50 +0,0 @@ - -parser grammar KeyLangParser; - -options { tokenVocab=KeyLangLexer; } - -keyLangFile : lines=line+ ; - -line : statement (NEWLINE | EOF) ; - -statement : - expressionRoot # expressionStatement ; - -rangeExpression: expression operator=(RANGE_INCLUSIVE|RANGE_EXCLUSIVE|RANGE_EXCLUSIVE_UNTIL|RANGE_DOWNTO) expression (step=STEP expression)?; - -expressionRoot: rangeExpression - | expression - ; - -lambda: LCURLY (ID ( COMMA ID )* ARROW )? expression RCURLY # functionLiteral; - -expression : INTLIT # intLiteral - | DECLIT # decimalLiteral - | LBRACKET (expressionRoot ( COMMA expressionRoot )*)? RBRACKET # listLiteral - | expression DOT ID lambda # memberFunctionCall0LambdaExpression - | lambda # lambdaExpression - | expression DOT ID LPAREN RPAREN # memberFunctionCall0Expression - | expression DOT ID LPAREN expression RPAREN # memberFunctionCall1Expression - | expression DOT ID LPAREN expression COMMA expression RPAREN # memberFunctionCall2Expression - | expression DOT ID LPAREN expression COMMA expression COMMA expression RPAREN # memberFunctionCall3Expression - | expression DOT ID LPAREN expression COMMA expression COMMA expression COMMA expression RPAREN # memberFunctionCall4Expression - | expression LBRACKET expression RBRACKET # indexExpression - | ID LPAREN RPAREN # functionCall0Expression - | ID LPAREN expression RPAREN # functionCall1Expression - | ID LPAREN expression COMMA expression RPAREN # functionCall2Expression - | ID LPAREN expression COMMA expression COMMA expression RPAREN # functionCall3Expression - | ID LPAREN expression COMMA expression COMMA expression COMMA expression RPAREN # functionCall4Expression - | ID LPAREN expression COMMA expression COMMA expression COMMA expression COMMA expression RPAREN # functionCall5Expression - | ID # valueReference - | STRING_OPEN (parts+=stringLiteralContent)* STRING_CLOSE # stringLiteral - | expression DOT ID # propReference - | LPAREN expressionRoot RPAREN # parenExpression - | MINUS expression # minusExpression - | NOT expression # negateExpression - | expression operator=(DIVISION|ASTERISK|PERCENTAGE) expression # binaryOperation1 - | expression operator=(PLUS|MINUS) expression # binaryOperation2 - | expression operator=(EQ|LT|LTEQ|GT|GTEQ) expression # comparisonOperation - | expression operator=(AND|OR) expression # joinOperation - | expression QUESTION_MARK expression COLON expression # ternaryExpression; - -stringLiteralContent : STRING_CONTENT; \ No newline at end of file diff --git a/orx-expression-evaluator/src/commonMain/kotlin/CompiledFunctions.kt b/orx-expression-evaluator/src/commonMain/kotlin/CompiledFunctions.kt deleted file mode 100644 index 4fa07ac0..00000000 --- a/orx-expression-evaluator/src/commonMain/kotlin/CompiledFunctions.kt +++ /dev/null @@ -1,125 +0,0 @@ -package org.openrndr.extra.expressions - -import org.antlr.v4.kotlinruntime.tree.ParseTreeWalker - - -/** - * Compile a (Double)->Double function from an expression string - * @param expression the expression string to be compiled - * @param parameter0 the name of the first parameter - * @param constants a map of named constant values that can be referred from the expression - * @param functions a map of named functions that can be invoked from the expression - * @param error in case the expression fails to compile or evaluate, this function is invoked instead - */ -fun compileFunction1( - expression: String, - parameter0: String, - constants: Map = mapOf(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (Double) -> Double = { 0.0 }, -): (Double) -> Double { - require(!constants.containsKey(parameter0)) - try { - val root = expressionRoot(expression) - val variables = mutableMapOf() - variables.putAll(constants) - val listener = ExpressionListener(functions, variables) - - return { p0 -> - variables[parameter0] = p0 - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - listener.lastExpressionResult ?: error("no result") - } catch (e: ExpressionException) { - error(p0) - } - } - } catch (e: ExpressionException) { - return error - } -} - -/** - * Compile a (Double, Double)->Double function from an expression string - * @param expression the expression string to be compiled - * @param parameter0 the name of the first parameter - * @param parameter1 the name of the second parameter - * @param constants a map of named constant values that can be referred from the expression - * @param functions a map of named functions that can be invoked from the expression - * @param error in case the expression fails to compile or evaluate, this function is invoked instead - */ -fun compileFunction2( - expression: String, - parameter0: String, - parameter1: String, - constants: Map = mapOf(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (p0: Double, p1: Double) -> Double = { _, _ -> 0.0 }, -): (p0: Double, p1: Double) -> Double { - require(!constants.containsKey(parameter0)) - require(!constants.containsKey(parameter1)) - try { - val root = expressionRoot(expression) - val variables = mutableMapOf() - variables.putAll(constants) - val listener = ExpressionListener(functions, variables) - - return { p0, p1 -> - variables[parameter0] = p0 - variables[parameter1] = p1 - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - listener.lastExpressionResult ?: error("no result") - } catch (e: ExpressionException) { - error(p0, p1) - } - } - } catch (e: ExpressionException) { - return error - } -} - -/** - * Compile a (Double, Double, Double)->Double function from an expression string - * @param expression the expression string to be compiled - * @param parameter0 the name of the first parameter - * @param parameter1 the name of the second parameter - * @param parameter2 the name of the third parameter - * @param constants a map of named constant values that can be referred from the expression - * @param functions a map of named functions that can be invoked from the expression - * @param error in case the expression fails to compile or evaluate, this function is invoked instead - */ -fun compileFunction3( - expression: String, - parameter0: String, - parameter1: String, - parameter2: String, - constants: Map = mapOf(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (p0: Double, p1: Double, p2: Double) -> Double = { _, _, _ -> 0.0 } -): (p0: Double, p1: Double, p2: Double) -> Double { - require(!constants.containsKey(parameter0)) - require(!constants.containsKey(parameter1)) - require(!constants.containsKey(parameter2)) - - try { - val root = expressionRoot(expression) - val variables = mutableMapOf() - variables.putAll(constants) - val listener = ExpressionListener(functions, variables) - - return { p0, p1, p2 -> - variables[parameter0] = p0 - variables[parameter1] = p1 - variables[parameter2] = p2 - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - listener.lastExpressionResult ?: error("no result") - } catch (e: ExpressionException) { - error(p0, p1, p2) - } - } - } catch(e: ExpressionException) { - return error - } -} diff --git a/orx-expression-evaluator/src/commonMain/kotlin/ExpressionDelegate.kt b/orx-expression-evaluator/src/commonMain/kotlin/ExpressionDelegate.kt deleted file mode 100644 index 0b2ced2a..00000000 --- a/orx-expression-evaluator/src/commonMain/kotlin/ExpressionDelegate.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.openrndr.extra.expressions - -import org.openrndr.extra.propertywatchers.watchingProperty -import kotlin.reflect.KProperty0 - -fun watchingExpression1( - expressionProperty: KProperty0, - parameter0: String = "x", - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (p0: Double) -> Double = { 0.0 } -) = - watchingProperty(expressionProperty) { - compileFunction1(it, parameter0, constants, functions, error) - } - -fun watchingExpression2( - expressionProperty: KProperty0, - parameter0: String = "x", - parameter1: String = "y", - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (p0: Double, p1: Double) -> Double = { _, _ -> 0.0 } -) = - watchingProperty(expressionProperty) { - compileFunction2(it, parameter0, parameter1, constants, functions, error) - } - -fun watchingExpression3( - expressionProperty: KProperty0, - parameter0: String = "x", - parameter1: String = "y", - parameter2: String = "z", - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY, - error: (p0: Double, p1: Double, p2: Double) -> Double = { _, _, _ -> 0.0 } -) = - watchingProperty(expressionProperty) { - compileFunction3(it, parameter0, parameter1, parameter2, constants, functions, error) - } \ No newline at end of file diff --git a/orx-expression-evaluator/src/commonMain/kotlin/Expressions.kt b/orx-expression-evaluator/src/commonMain/kotlin/Expressions.kt deleted file mode 100644 index 6a3f6b61..00000000 --- a/orx-expression-evaluator/src/commonMain/kotlin/Expressions.kt +++ /dev/null @@ -1,488 +0,0 @@ -package org.openrndr.extra.expressions - - - -import org.antlr.v4.kotlinruntime.* -import org.antlr.v4.kotlinruntime.tree.ParseTreeWalker -import org.antlr.v4.kotlinruntime.tree.TerminalNode -import org.openrndr.collections.pop -import org.openrndr.collections.push -import org.openrndr.extra.expressions.parser.KeyLangLexer -import org.openrndr.extra.expressions.parser.KeyLangParser -import org.openrndr.extra.expressions.parser.KeyLangParserBaseListener - -import org.openrndr.extra.noise.uniform -import org.openrndr.math.* -import kotlin.math.* - -typealias Function0 = () -> Double -typealias Function1 = (Double) -> Double -typealias Function2 = (Double, Double) -> Double -typealias Function3 = (Double, Double, Double) -> Double -typealias Function4 = (Double, Double, Double, Double) -> Double -typealias Function5 = (Double, Double, Double, Double, Double) -> Double - -class FunctionExtensions( - val functions0: Map = emptyMap(), - val functions1: Map = emptyMap(), - val functions2: Map = emptyMap(), - val functions3: Map = emptyMap(), - val functions4: Map = emptyMap(), - val functions5: Map = emptyMap() -) { - companion object { - val EMPTY = FunctionExtensions() - } -} - -internal enum class IDType { - VARIABLE, - FUNCTION0, - FUNCTION1, - FUNCTION2, - FUNCTION3, - FUNCTION4, - FUNCTION5 -} - -internal class ExpressionListener( - val functions: FunctionExtensions = FunctionExtensions.EMPTY, - val constants: Map = mapOf() -) : - KeyLangParserBaseListener() { - val doubleStack = ArrayDeque() - val functionStack = ArrayDeque<(DoubleArray) -> Double>() - - - val idTypeStack = ArrayDeque() - var lastExpressionResult: Double? = null - - val exceptionStack = ArrayDeque() - - - override fun exitExpressionStatement(ctx: KeyLangParser.ExpressionStatementContext) { - ifError { - throw ExpressionException("error in evaluation of '${ctx.text}': ${it.message ?: ""}") - } - val result = doubleStack.pop() - lastExpressionResult = result - } - -// override fun exitAssignment(ctx: KeyLangParser.AssignmentContext) { -// val value = doubleStack.pop() -// variables[ctx.ID()?.text ?: error("buh")] = value -// } - - override fun exitMinusExpression(ctx: KeyLangParser.MinusExpressionContext) { - val op = doubleStack.pop() - doubleStack.push(-op) - } - - override fun exitBinaryOperation1(ctx: KeyLangParser.BinaryOperation1Context) { - ifError { - pushError(it.message ?: "") - return - } - - val right = doubleStack.pop() - val left = doubleStack.pop() - val result = when (val operator = ctx.operator?.type) { - KeyLangLexer.Tokens.PLUS -> left + right - KeyLangParser.Tokens.MINUS -> left - right - KeyLangParser.Tokens.ASTERISK -> left * right - KeyLangParser.Tokens.DIVISION -> left / right - KeyLangParser.Tokens.PERCENTAGE -> left.mod(right) - else -> error("operator '$operator' not implemented") - } - doubleStack.push(result) - } - - override fun exitBinaryOperation2(ctx: KeyLangParser.BinaryOperation2Context) { - ifError { - pushError(it.message ?: "") - return - } - - val left = doubleStack.pop() - val right = doubleStack.pop() - val result = when (val operator = ctx.operator?.type) { - KeyLangParser.Tokens.PLUS -> left + right - KeyLangParser.Tokens.MINUS -> right - left - KeyLangParser.Tokens.ASTERISK -> left * right - KeyLangParser.Tokens.DIVISION -> left / right - else -> error("operator '$operator' not implemented") - } - doubleStack.push(result) - } - - override fun enterValueReference(ctx: KeyLangParser.ValueReferenceContext) { - idTypeStack.push(IDType.VARIABLE) - } - - override fun enterFunctionCall0Expression(ctx: KeyLangParser.FunctionCall0ExpressionContext) { - idTypeStack.push(IDType.FUNCTION0) - } - - override fun exitFunctionCall0Expression(ctx: KeyLangParser.FunctionCall0ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val result = function.invoke(doubleArrayOf()) - doubleStack.push(result) - } - - override fun enterFunctionCall1Expression(ctx: KeyLangParser.FunctionCall1ExpressionContext) { - idTypeStack.push(IDType.FUNCTION1) - } - - override fun exitFunctionCall1Expression(ctx: KeyLangParser.FunctionCall1ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val argument = doubleStack.pop() - - val result = function.invoke(doubleArrayOf(argument)) - doubleStack.push(result) - } - - override fun enterFunctionCall2Expression(ctx: KeyLangParser.FunctionCall2ExpressionContext) { - idTypeStack.push(IDType.FUNCTION2) - } - - override fun exitFunctionCall2Expression(ctx: KeyLangParser.FunctionCall2ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val argument1 = doubleStack.pop() - val argument0 = doubleStack.pop() - - val result = function.invoke(doubleArrayOf(argument0, argument1)) - doubleStack.push(result) - } - - override fun enterFunctionCall3Expression(ctx: KeyLangParser.FunctionCall3ExpressionContext) { - idTypeStack.push(IDType.FUNCTION3) - } - - override fun exitFunctionCall3Expression(ctx: KeyLangParser.FunctionCall3ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val argument2 = doubleStack.pop() - val argument1 = doubleStack.pop() - val argument0 = doubleStack.pop() - - val result = function.invoke(doubleArrayOf(argument0, argument1, argument2)) - doubleStack.push(result) - } - - override fun enterFunctionCall4Expression(ctx: KeyLangParser.FunctionCall4ExpressionContext) { - idTypeStack.push(IDType.FUNCTION4) - } - - override fun exitFunctionCall4Expression(ctx: KeyLangParser.FunctionCall4ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val argument3 = doubleStack.pop() - val argument2 = doubleStack.pop() - val argument1 = doubleStack.pop() - val argument0 = doubleStack.pop() - - val result = function.invoke(doubleArrayOf(argument0, argument1, argument2, argument3)) - doubleStack.push(result) - } - - - override fun enterFunctionCall5Expression(ctx: KeyLangParser.FunctionCall5ExpressionContext) { - idTypeStack.push(IDType.FUNCTION5) - } - - override fun exitFunctionCall5Expression(ctx: KeyLangParser.FunctionCall5ExpressionContext) { - ifError { - pushError(it.message ?: "") - return - } - - val function = functionStack.pop() - val argument4 = doubleStack.pop() - val argument3 = doubleStack.pop() - val argument2 = doubleStack.pop() - val argument1 = doubleStack.pop() - val argument0 = doubleStack.pop() - - val result = function.invoke(doubleArrayOf(argument0, argument1, argument2, argument3, argument4)) - doubleStack.push(result) - } - - private fun errorValue(message: String, value: T): T { - pushError(message) - return value - } - - private fun pushError(message: String) { - exceptionStack.push(ExpressionException(message)) - } - - private inline fun ifError(f: (e: Throwable) -> Unit) { - if (exceptionStack.isNotEmpty()) { - val e = exceptionStack.pop() - f(e) - } - } - - override fun visitTerminal(node: TerminalNode) { - val type = node.symbol?.type - if (type == KeyLangParser.Tokens.INTLIT) { - doubleStack.push(node.text.toDouble()) - } - if (type == KeyLangParser.Tokens.DECLIT) { - doubleStack.push(node.text.toDouble()) - } - if (type == KeyLangParser.Tokens.ID) { - val name = node.text.replace("`", "") - @Suppress("DIVISION_BY_ZERO") - when (val idType = idTypeStack.pop()) { - IDType.VARIABLE -> doubleStack.push( - when (name) { - "PI" -> PI - else -> constants[name] ?: errorValue("unresolved value: '${name}'. available values: ${constants}", 0.0 / 0.0) - } - ) - - IDType.FUNCTION0 -> { - val function: (DoubleArray) -> Double = - when (name) { - "random" -> { _ -> Double.uniform(0.0, 1.0) } - else -> functions.functions0[name]?.let { { _: DoubleArray -> it.invoke() } } - ?: errorValue( - "unresolved function: '${name}()'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - IDType.FUNCTION1 -> { - val function: (DoubleArray) -> Double = - when (name) { - "sqrt" -> { x -> sqrt(x[0]) } - "radians" -> { x -> x[0].asRadians } - "degrees" -> { x -> x[0].asDegrees } - "cos" -> { x -> cos(x[0]) } - "sin" -> { x -> sin(x[0]) } - "tan" -> { x -> tan(x[0]) } - "atan" -> { x -> atan(x[0]) } - "acos" -> { x -> acos(x[0]) } - "asin" -> { x -> asin(x[0]) } - "exp" -> { x -> exp(x[0]) } - "abs" -> { x -> abs(x[0]) } - "floor" -> { x -> floor(x[0]) } - "round" -> { x -> round(x[0]) } - "ceil" -> { x -> ceil(x[0]) } - "saturate" -> { x -> x[0].coerceIn(0.0, 1.0) } - else -> functions.functions1[name]?.let { { x: DoubleArray -> it.invoke(x[0]) } } - ?: errorValue( - "unresolved function: '${name}(x0)'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - IDType.FUNCTION2 -> { - val function: (DoubleArray) -> Double = - when (name) { - "max" -> { x -> max(x[0], x[1]) } - "min" -> { x -> min(x[0], x[1]) } - "pow" -> { x -> x[0].pow(x[1]) } - "mod" -> { x -> x[0].mod(x[1]) } - "atan2" -> { x -> atan2(x[0], x[1]) } - "random" -> { x -> Double.uniform(x[0], x[1]) } - "length" -> { x -> Vector2(x[0], x[1]).length } - else -> functions.functions2[name]?.let { { x: DoubleArray -> it.invoke(x[0], x[1]) } } - ?: errorValue( - "unresolved function: '${name}(x0, x1)'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - IDType.FUNCTION3 -> { - val function: (DoubleArray) -> Double = - when (name) { - "mix" -> { x -> mix(x[0], x[1], x[2]) } - "min" -> { x -> x.minOrNull()!! } - "max" -> { x -> x.maxOrNull()!! } - "sum" -> { x -> x.sum() } - "smoothstep" -> { x -> smoothstep(x[0], x[1], x[2]) } - "length" -> { x -> Vector3(x[0], x[1], x[2]).length } - else -> functions.functions3[name]?.let { - { x: DoubleArray -> - it.invoke( - x[0], - x[1], - x[2] - ) - } - } - ?: errorValue( - "unresolved function: '${name}(x0, x1, x2)'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - IDType.FUNCTION4 -> { - val function: (DoubleArray) -> Double = - when (name) { - "min" -> { x -> x.minOrNull()!! } - "max" -> { x -> x.maxOrNull()!! } - "sum" -> { x -> x.sum() } - else -> functions.functions4[name]?.let { - { x: DoubleArray -> - it.invoke( - x[0], - x[1], - x[2], - x[3] - ) - } - } - ?: errorValue( - "unresolved function: '${name}(x0, x1, x2, x3)'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - IDType.FUNCTION5 -> { - val function: (DoubleArray) -> Double = - when (name) { - "min" -> { x -> x.minOrNull()!! } - "max" -> { x -> x.maxOrNull()!! } - "sum" -> { x -> x.sum() } - "map" -> { x -> map(x[0], x[1], x[2], x[3], x[4]) } - else -> functions.functions5[name]?.let { - { x: DoubleArray -> - it.invoke( - x[0], - x[1], - x[2], - x[3], - x[4] - ) - } - } - ?: errorValue( - "unresolved function: '${name}(x0, x1, x2, x3, x4)'" - ) { _ -> error("this is the error function") } - } - functionStack.push(function) - } - - else -> error("unsupported id-type $idType") - } - } - } -} - -class ExpressionException(message: String) : RuntimeException(message) - -fun evaluateExpression( - expression: String, - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY -): Double? { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - - val root = parser.keyLangFile() - val listener = ExpressionListener(functions, constants) - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - } catch (e: ExpressionException) { - throw ExpressionException(e.message ?: "") - } - return listener.lastExpressionResult -} - -fun compileExpression( - expression: String, - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY -): () -> Double { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - val root = parser.keyLangFile() - val listener = ExpressionListener(functions, constants) - - - return { - try { - ParseTreeWalker.DEFAULT.walk(listener, root) - } catch (e: ExpressionException) { - throw ExpressionException(e.message ?: "") - } - listener.lastExpressionResult ?: error("no result") - } -} - -internal fun expressionRoot(expression: String): KeyLangParser.KeyLangFileContext { - val lexer = KeyLangLexer(CharStreams.fromString(expression)) - val parser = KeyLangParser(CommonTokenStream(lexer)) - parser.removeErrorListeners() - parser.addErrorListener(object : BaseErrorListener() { - override fun syntaxError( - recognizer: Recognizer<*, *>, - offendingSymbol: Any?, - line: Int, - charPositionInLine: Int, - msg: String, - e: RecognitionException? - ) { - throw ExpressionException("parser error in expression: '$expression'; [line: $line, character: $charPositionInLine ${offendingSymbol?.let { ", near: $it" } ?: ""} ]") - } - }) - return parser.keyLangFile() -} - diff --git a/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator01.kt b/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator01.kt deleted file mode 100644 index d3132b23..00000000 --- a/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator01.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.expressions.evaluateExpression -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.addTo -import org.openrndr.extra.parameters.TextParameter - -fun main() = application { - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val settings = object { - @TextParameter("x expression", order = 10) - var xExpression = "cos(t) * 50.0 + width / 2.0" - - @TextParameter("y expression", order = 20) - var yExpression = "sin(t) * 50.0 + height / 2.0" - - @TextParameter("radius expression", order = 30) - var radiusExpression = "cos(t) * 50.0 + 50.0" - }.addTo(gui) - - extend(gui) - extend { - //gui.visible = mouse.position.x < 200.0 - - val expressionContext = - mapOf("t" to seconds, "width" to drawer.bounds.width, "height" to drawer.bounds.height) - - fun eval(expression: String): Double = - try { - evaluateExpression(expression, expressionContext) ?: 0.0 - } catch (e: Throwable) { - 0.0 - } - - val x = eval(settings.xExpression) - val y = eval(settings.yExpression) - val radius = eval(settings.radiusExpression) - - drawer.circle(x, y, radius) - } - } -} diff --git a/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator02.kt b/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator02.kt deleted file mode 100644 index 2bb1788e..00000000 --- a/orx-expression-evaluator/src/jvmDemo/kotlin/DemoExpressionEvaluator02.kt +++ /dev/null @@ -1,42 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.expressions.watchingExpression1 -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.addTo -import org.openrndr.extra.parameters.TextParameter - -/** - * Improved version of DemoExpressionEvaluator01, it uses [watchingExpression1] to automatically convert an expression - * string into a function with a parameter "t". - */ -fun main() = application { - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - // the constants used in our expressions - val constants = mutableMapOf("width" to drawer.width.toDouble(), "height" to drawer.height.toDouble()) - - val settings = object { - @TextParameter("x expression", order = 10) - var xExpression = "cos(t) * 50.0 + width / 2.0" - - @TextParameter("y expression", order = 20) - var yExpression = "sin(t) * 50.0 + height / 2.0" - - @TextParameter("radius expression", order = 30) - var radiusExpression = "cos(t) * 50.0 + 50.0" - }.addTo(gui) - - val xFunction by watchingExpression1(settings::xExpression, "t", constants) - val yFunction by watchingExpression1(settings::yExpression, "t", constants) - val radiusFunction by watchingExpression1(settings::radiusExpression, "t", constants) - - extend(gui) - extend { - val x = xFunction(seconds) - val y = yFunction(seconds) - val radius = radiusFunction(seconds) - drawer.circle(x, y, radius) - } - } -} diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledExpression.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledExpression.kt deleted file mode 100644 index 3abcc478..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledExpression.kt +++ /dev/null @@ -1,32 +0,0 @@ -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.openrndr.extra.expressions.ExpressionException -import org.openrndr.extra.expressions.compileExpression -import kotlin.test.assertEquals - -class TestCompiledExpression { - @Test - fun `a simple compiled expression`() { - val expression = "someValue" - val function = compileExpression(expression, constants = mutableMapOf("someValue" to 5.0)) - assertEquals(5.0, function()) - } - - @Test - fun `a compiled expression with updated context`() { - val expression = "someValue" - val context = mutableMapOf("someValue" to 5.0) - val function = compileExpression(expression, constants = context) - assertEquals(5.0, function()) - context["someValue"] = 6.0 - assertEquals(6.0, function()) - } - - @Test - fun `an erroneous compiled expression`() { - val expression = "1bork" - assertThrows { - compileExpression(expression, constants = mutableMapOf("someValue" to 5.0)) - } - } -} \ No newline at end of file diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledFunctions.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledFunctions.kt deleted file mode 100644 index 709db5da..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestCompiledFunctions.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.junit.jupiter.api.Test -import org.openrndr.extra.expressions.compileFunction1 -import org.openrndr.extra.expressions.compileFunction2 -import org.openrndr.extra.expressions.compileFunction3 -import kotlin.test.assertEquals - -class TestCompiledFunctions { - @Test - fun `a simple compiled function1`() { - val expression = "t" - val function = compileFunction1(expression, "t") - assertEquals(-5.0, function(-5.0)) - assertEquals(5.0, function(5.0)) - } - - @Test - fun `a simple compiled function2`() { - val expression = "x + y" - val function = compileFunction2(expression, "x", "y") - assertEquals(3.0, function(1.0, 2.0)) - } - - @Test - fun `a simple compiled function3`() { - val expression = "x + y + z" - val function = compileFunction3(expression, "x", "y", "z") - assertEquals(6.0, function(1.0, 2.0, 3.0)) - } -} \ No newline at end of file diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionDelegates.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionDelegates.kt deleted file mode 100644 index c69b8405..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionDelegates.kt +++ /dev/null @@ -1,15 +0,0 @@ -import org.openrndr.extra.expressions.watchingExpression1 -import kotlin.test.Test -import kotlin.test.assertEquals - -class TestExpressionDelegates { - - @Test - fun test() { - val state = object { - var expression = "x * x" - val function1 by watchingExpression1(::expression, "x") - } - assertEquals(25.0, state.function1(5.0)) - } -} \ No newline at end of file diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionErrors.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionErrors.kt deleted file mode 100644 index d4876af0..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressionErrors.kt +++ /dev/null @@ -1,51 +0,0 @@ -import org.junit.jupiter.api.assertThrows -import org.openrndr.extra.expressions.ExpressionException -import org.openrndr.extra.expressions.evaluateExpression - -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith - -class TestExpressionErrors { - - @Test - fun `an expression with non-sensible writing`() { - val expression = ")(" - assertThrows { - evaluateExpression(expression) - } - } - - - @Test - fun `an expression trying to reassign a number`() { - val expression = "3 = 5" - assertThrows { - evaluateExpression(expression) - } - } - - @Test - fun `an expression that uses non-existing functions`() { - val expression = "notExisting(5)" - val exception = assertFailsWith { - evaluateExpression(expression) - } - assertEquals( - "error in evaluation of 'notExisting(5)': unresolved function: 'notExisting(x0)'", - exception.message - ) - } - - @Test - fun `an expression that uses non-existing variables`() { - val expression = "notExisting + 4" - val exception = assertFailsWith { - evaluateExpression(expression) - } - assertEquals( - "error in evaluation of 'notExisting+4': unresolved value: 'notExisting'. available values: {}", - exception.message - ) - } -} diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressions.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressions.kt deleted file mode 100644 index 1a4b9549..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestExpressions.kt +++ /dev/null @@ -1,198 +0,0 @@ -import org.openrndr.extra.expressions.FunctionExtensions -import org.openrndr.extra.expressions.evaluateExpression - -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNotNull - -class TestExpressions { - @Test - fun `a value reference`() { - val expression = "someValue" - val result = evaluateExpression(expression, constants = mapOf("someValue" to 5.0)) - assertEquals(5.0, result) - } - - @Test - fun `a backticked value reference`() { - val expression = "`some-value`" - val result = evaluateExpression(expression, constants = mapOf("some-value" to 5.0)) - assertEquals(5.0, result) - } - - - @Test - fun `a function call`() { - val expression = "sqrt(4.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `a function call with the name in backticks`() { - val expression = "`sqrt`(4.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `two function calls`() { - val expression = "sqrt(4.0) * sqrt(4.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(4.0, result, 10E-6) - } - - @Test - fun `two argument max function call`() { - val expression = "max(0.0, 4.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(4.0, result, 10E-6) - } - - @Test - fun `two argument min function call`() { - val expression = "min(8.0, 4.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(4.0, result, 10E-6) - } - - @Test - fun `three argument function call`() { - val expression = "mix(8.0, 4.0, 0.5)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(6.0, result, 10E-6) - } - - @Test - fun `five argument function call`() { - val expression = "map(0.0, 1.0, 0.0, 8.0, 0.5)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(4.0, result, 10E-6) - } - - @Test - fun `two argument function call, where argument order matters`() { - val expression = "pow(2.0, 3.0)" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(8.0, result, 10E-6) - } - - @Test - fun `nested function call`() { - val expression = "sqrt(min(8.0, 4.0))" - val result = evaluateExpression(expression) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `extension function0 call`() { - val expression = "extension()" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions0 = mapOf("extension" to { 2.0 }) - ) - ) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `extension function1 call`() { - val expression = "extension(1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions1 = mapOf("extension" to { x -> - x * 2.0 - }) - ) - ) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `extension function1 call with dashed name in backticks`() { - val expression = "`extension-function`(1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions1 = mapOf("extension-function" to { x -> - x * 2.0 - }) - ) - ) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `extension function2 call`() { - val expression = "extension(1.0, 1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions2 = mapOf("extension" to { x, y -> - x + y - }) - ) - ) - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `extension function3 call`() { - val expression = "extension(1.0, 1.0, 1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions3 = mapOf("extension" to { x, y, z -> - x + y + z - }) - ) - ) - assertNotNull(result) - assertEquals(3.0, result, 10E-6) - } - - @Test - fun `extension function4 call`() { - val expression = "extension(1.0, 1.0, 1.0, 1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions4 = mapOf("extension" to { x, y, z, w -> - x + y + z + w - }) - ) - ) - assertNotNull(result) - assertEquals(4.0, result, 10E-6) - } - - @Test - fun `extension function5 call`() { - val expression = "extension(1.0, 1.0, 1.0, 1.0, 1.0)" - val result = evaluateExpression( - expression, - functions = FunctionExtensions( - functions5 = mapOf("extension" to { x, y, z, w, u -> - x + y + z + w + u - }) - ) - ) - assertNotNull(result) - assertEquals(5.0, result, 10E-6) - } -} \ No newline at end of file diff --git a/orx-expression-evaluator/src/jvmTest/kotlin/TestOperators.kt b/orx-expression-evaluator/src/jvmTest/kotlin/TestOperators.kt deleted file mode 100644 index 9f01a60d..00000000 --- a/orx-expression-evaluator/src/jvmTest/kotlin/TestOperators.kt +++ /dev/null @@ -1,62 +0,0 @@ -import org.openrndr.extra.expressions.evaluateExpression -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNotNull - -class TestOperators { - @Test - fun `an addition operation`() { - val result = evaluateExpression("1 + 2") - assertNotNull(result) - assertEquals(3.0, result, 10E-6) - } - - @Test - fun `a subtraction operation`() { - val result = evaluateExpression("1 - 2") - assertNotNull(result) - assertEquals(-1.0, result, 10E-6) - } - - @Test - fun `a modulus operation`() { - val result = evaluateExpression("4 % 2") - assertNotNull(result) - assertEquals(0.0, result, 10E-6) - } - - @Test - fun `a multiplication operation`() { - val result = evaluateExpression("4 * 2") - assertNotNull(result) - assertEquals(8.0, result, 10E-6) - } - - @Test - fun `a division operation`() { - val result = evaluateExpression("4 / 2") - assertNotNull(result) - assertEquals(2.0, result, 10E-6) - } - - @Test - fun `a multiplication and addition operation`() { - val result = evaluateExpression("4 * 2 + 1") - assertNotNull(result) - assertEquals(9.0, result, 10E-6) - } - - @Test - fun `an addition and multiplication`() { - val result = evaluateExpression("4 + 2 * 3") - assertNotNull(result) - assertEquals(10.0, result, 10E-6) - } - - @Test - fun `unary minus`() { - val result = evaluateExpression("-4.0") - assertNotNull(result) - assertEquals(-4.0, result, 10E-6) - } -} diff --git a/orx-fcurve/README.md b/orx-fcurve/README.md deleted file mode 100644 index 0e135606..00000000 --- a/orx-fcurve/README.md +++ /dev/null @@ -1,233 +0,0 @@ -# orx-fcurve - -FCurves are 1 dimensional function curves constructed from 2D bezier functions. -They are often used to control a property over time. -`x` values don't have any units, but they often represent a duration in seconds. - -The language to express FCurves is similar to SVG's path language. - -| Relative command | Absolute command | Description | -|---------------------|---------------------|--------------------------------------------------------------| -| `m y` | `M y` | move the pen only in the y-direction | -| `h x` | | hold a value to draw a horizontal line | -| | `H x` | shift curve in time by x. Can only be used as first command. | -| `l x,y` | `L x,y` | line to (x, y) | -| `q x0,y0,x,y` | `Q x0,y0,x,y` | quadratic bezier to (x,y) and control-point (x0, y0) | -| `c x0,y0,x1,y1,x,y` | `C x0,y0,x1,y1,x,y` | cubic bezier to (x,y) and control-points (x0, y0), (x1, y1) | -| `t x,y` | `T x,y` | quadratic smooth to (x, y) | -| `s x1,y1,x,y` | `S x1,y1,x,y` | cubic smooth to (x,y) and control point (x1, y1) | - -## Examples - -This is an example of a flat horizontal FCurve: - -```kotlin -// set the initial value to 0.5, hold that value for 1 seconds -val sizeCurve = fcurve("M0.5 h1") -``` - -Two horizontal segments at different heights: - -```kotlin -// hold value 0.4 for half second, then hold value 0.6 for half second -val sizeCurve = fcurve("M0.4 h0.5 M0.6 h0.5") -``` - -Note that `x` values are relative, except for `H` where `x` is absolute. -For `y` values, lower case commands are relative and upper case commands are absolute. - - -### Line - -We can interpolate from height 0.2 to 0.8 in 2 seconds like this: - -```kotlin -// set initial value to 0.2, then interpolate linearly to value 0.8 over 2 seconds -val sizeCurve = fcurve("M0.2 L2,0.8") -``` - -Easily visualize the curves by calling the `.contours()` method. It will convert -the curve into a list of `ShapeContour` instances which are easy to draw using -`drawer.contours()`: - -```kotlin -val sizeCurve = fcurve("M0.2 L2,0.8") -drawer.contours(sizeCurve.contours()) -``` - -### Drawing scale - -Note that the bounding box of this last curve will have a width of 2.0 pixels and a height under 1.0 pixel. -In other words, almost invisible at its original scale. -Since this is a common situation the `.contours()` method accepts a -`Vector2` scale argument to control the rendering size: - -```kotlin -val sizeCurve = fcurve("M0.2 L2,0.8") -drawer.contours(sizeCurve.contours(Vector2(drawer.width / sizeCurve.duration, drawer.height.toDouble()))) -``` - -### Quadratic and Cubic curves - -The `Q` and `C` commands (and their lowercase counterparts) allow us to draw quadratic (one control point) -and cubic (two control points) curves. - -```kotlin -// A quadratic curve that starts at zero, with a control point at 1,0 and ending at 1,1. -// That's a curve that stays near the 0.0 value and quickly raises to 1.0 at the end. -val easeOutCurve = fcurve("M0.0 Q1.0,0.0,1.0,1.0") - -// A cubic s-shaped curve spending more time at both ends with a quick transition between them in the middle. -val easeInOutCurve = fcurve("M0.0 C1,0,0,1,1,1") -``` - -Note that new lines, white space and commas are optional. They can help with readability: -``` -M0 h10 -c 3,10 5,-10 8,0.5 -L 5,5 -``` - -### Smooth curves - -The `T` and `S` commands (and their lowercase counterparts) allow us to create smooth curves, where -one control point is automatically calculated to maintain the curve direction. The smooth curve -commands require the presence of a previous segment, otherwise the program will not run. - -```kotlin -// Hold the value 0.5 during 0.2 seconds -// then draw a smooth curve down to 0.5, up to 0.7 down to 0.3 and up to 0.7 -val smoothCurveT = fcurve("M0.5 h0.2 T0.2,0.3 T0.2,0.7 T0.2,0.3 T0.2,0.7") - -// Hold the value 0.5 during 0.2 seconds -// then draw a smooth with 4 repetitions where we move up slowly and down quickly -val smoothCurveS = fcurve("M0.5 h0.2 S0.2,0.0,0.2,0.5 S0.2,0.0,0.2,0.5 S0.2,0.0,0.2,0.5 S0.2,0.0,0.2,0.5") -``` - -## Useful FCurve methods - -Useful methods provided by FCurve: - -- `smoothCurveS.reverse()` returns a new reversed FCurve. -- `smoothCurveS.changeSpeed(0.5)` returns a new FCurve scaled horizontally. -- `smoothCurveS.duration` returns the duration of the FCurve. - -# Sampler - -Drawing FCurves is useful for debugging, but their typical use is for animation. -The FCurve sampler allows us to query values for the given time value like this: - -```kotlin -fun main() = application { - program { - val xCurve = fcurve( - """ - M320 H0.4 - S2,0, 2,320 - S2,0, 2,320 - S2,0, 2,320 - S2,0, 2,320 - T0.6,320 - """ - ) - val xCurveSampler = xCurve.sampler() - extend { - drawer.circle( - xCurveSampler(seconds % 9.0), - 240.0, - 20.0 - ) - } - } -} -``` - -In this example we used `% 9.0` to loop the time between 0.0 and 9.0, repeating the animation over and over. - -# EFCurves - -Extended Fcurves have an additional preprocessing step in which scalar expressions are evaluated. - -## Comments - -EFCurves support comments using the `#` character. - -`M0 h10 c3,10,5,-10,8,0.5 # L5,5` - - -``` -M0 h10 # setup the initial y value and hold it for 10 units. -c3,10,5,-10,8,0.5 # relative cubic bezier curve -# and a final line-to -L5,5 -``` - -## Expressions - -Expressions within curly brackets are evaluated using `orx-expression-evaluator`. -Please refer to its [documentation](https://github.com/openrndr/orx/tree/master/orx-expression-evaluator) for details on the expression language used. - -For example: `M0 L{3 * 4},4` evaluates to `M0 L12,4`. - -## Repetitions - -EFCurves add support for repetitions. Repetitions are expanded by replacing -occurrences of `()[]` with `number-of-repetitions` copies -of `text-to-repeat`. - -For example: - * `M0 (h1 m1)[3]` expands to `M0 h1 m1 h1 m1 h1 m1` - * `M0 (h1 m1)[0]` expands to `M0` - -### Nested repetitions - -Repetitions can be nested. - -For example `(M0 (h1 m1)[3])[2]` expands to `M0 h1 m1 h1 m1 h1 m1 M0 h1 m1 h1 m1 h1 m1`. - -### Interaction between repetitions and expressions - -`M0 (H{it + 1} m1)[3]` expands to `M0 H1 m1 H2 m1 H3 m1` - -`M0 (H{index + 1} m{it}){1.2, 1.3, 1.4}` expands to `M0 H1 m1.2 H2 m1.3 H3 m1.4` - - -# References - - * https://x.com/ruby0x1/status/1258252352672247814 - * https://blender.stackexchange.com/questions/52403/what-is-the-mathematical-basis-for-f-curves/52468#52468 - * https://pomax.github.io/bezierinfo/#yforx - - -## Demos -### DemoFCurve01 - - - -![DemoFCurve01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fcurve/images/DemoFCurve01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFCurve01.kt) - -### DemoFCurve02 - - - -![DemoFCurve02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fcurve/images/DemoFCurve02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFCurve02.kt) - -### DemoFCurveSheet01 - - - -![DemoFCurveSheet01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fcurve/images/DemoFCurveSheet01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFCurveSheet01.kt) - -### DemoMultiFCurve01 - - - -![DemoMultiFCurve01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fcurve/images/DemoMultiFCurve01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoMultiFCurve01.kt) diff --git a/orx-fcurve/build.gradle.kts b/orx-fcurve/build.gradle.kts deleted file mode 100644 index c738682c..00000000 --- a/orx-fcurve/build.gradle.kts +++ /dev/null @@ -1,29 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-expression-evaluator")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - implementation(sharedLibs.kotlin.serialization.core) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-fcurve")) - implementation(project(":orx-noise")) - } - } - } -} \ No newline at end of file diff --git a/orx-fcurve/src/commonMain/kotlin/CompoundFCurve.kt b/orx-fcurve/src/commonMain/kotlin/CompoundFCurve.kt deleted file mode 100644 index ddb154f0..00000000 --- a/orx-fcurve/src/commonMain/kotlin/CompoundFCurve.kt +++ /dev/null @@ -1,229 +0,0 @@ -package org.openrndr.extra.fcurve - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.* - -abstract class CompoundFCurve(val compounds: List, val compoundNames: List) { - val duration: Double - get() { - return compounds.maxOf { it?.duration ?: 0.0 } - } - - abstract fun value(t: Double, overrides: Map? = null): T - abstract fun sampler(normalized: Boolean = false): (Double) -> T -} - -class BooleanFCurve(value: Pair, val default: Boolean = true) : - CompoundFCurve(listOf(value.second), listOf(value.first)) { - override fun value(t: Double, overrides: Map?): Boolean { - val d = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) - return if (d != null) { - d >= 1.0 - } else { - default - } - } - - override fun sampler(normalized: Boolean): (Double) -> Boolean { - val sampler = compounds[0]?.sampler(normalized) ?: { if (default) 1.0 else 0.0 } - return { t -> sampler(t) >= 1.0 } - } -} - -class DoubleFCurve(value: Pair, val default: Double = 0.0) : - CompoundFCurve(listOf(value.second), listOf(value.first)) { - - override fun value(t: Double, overrides: Map?): Double { - return overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default - } - - override fun sampler(normalized: Boolean): (Double) -> Double { - val sampler = compounds[0]?.sampler(normalized) ?: { default } - return { t -> sampler(t) } - } -} - -class IntFCurve(value: Pair, val default: Int = 0) : - CompoundFCurve(listOf(value.second), listOf(value.first)) { - - override fun value(t: Double, overrides: Map?): Int { - val d = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) - return if (d != null) { - d.toInt() - } else { - default - } - } - - override fun sampler(normalized: Boolean): (Double) -> Int { - val sampler = compounds[0]?.sampler(normalized) ?: { default.toDouble() } - return { t -> sampler(t).toInt() } - } -} - -class Vector2FCurve( - x: Pair, y: Pair, - val default: Vector2 = Vector2.ZERO -) : - CompoundFCurve(listOf(x.second, y.second), listOf(x.first, y.first)) { - override fun value(t: Double, overrides: Map?): Vector2 { - val x = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.x - val y = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.y - return Vector2(x, y) - } - - override fun sampler(normalized: Boolean): (Double) -> Vector2 { - val xSampler = compounds[0]?.sampler(normalized) ?: { default.x } - val ySampler = compounds[1]?.sampler(normalized) ?: { default.y } - return { t -> Vector2(xSampler(t), ySampler(t)) } - } -} - -class Vector3FCurve( - x: Pair, - y: Pair, - z: Pair, - val default: Vector3 = Vector3.ZERO -) : - CompoundFCurve(listOf(x.second, y.second, z.second), listOf(x.first, y.first, z.first)) { - override fun value(t: Double, overrides: Map?): Vector3 { - val x = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.x - val y = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.y - val z = overrides?.get(compoundNames[2]) ?: compounds[2]?.value(t) ?: default.z - return Vector3(x, y, z) - } - - override fun sampler(normalized: Boolean): (Double) -> Vector3 { - val xSampler = compounds[0]?.sampler(normalized) ?: { default.x } - val ySampler = compounds[1]?.sampler(normalized) ?: { default.y } - val zSampler = compounds[2]?.sampler(normalized) ?: { default.z } - return { t -> Vector3(xSampler(t), ySampler(t), zSampler(t)) } - } -} - -class Vector4FCurve( - x: Pair, - y: Pair, - z: Pair, - w: Pair, - val default: Vector4 = Vector4.ZERO -) : - CompoundFCurve( - listOf(x.second, y.second, z.second, w.second), - listOf(x.first, y.first, z.first, w.first) - ) { - - override fun value(t: Double, overrides: Map?): Vector4 { - val x = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.x - val y = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.y - val z = overrides?.get(compoundNames[2]) ?: compounds[2]?.value(t) ?: default.z - val w = overrides?.get(compoundNames[3]) ?: compounds[3]?.value(t) ?: default.w - return Vector4(x, y, z, w) - } - - override fun sampler(normalized: Boolean): (Double) -> Vector4 { - val xSampler = compounds[0]?.sampler(normalized) ?: { default.x } - val ySampler = compounds[1]?.sampler(normalized) ?: { default.y } - val zSampler = compounds[2]?.sampler(normalized) ?: { default.z } - val wSampler = compounds[3]?.sampler(normalized) ?: { default.w } - return { t -> Vector4(xSampler(t), ySampler(t), zSampler(t), wSampler(t)) } - } -} - -class RgbFCurve( - r: Pair, - g: Pair, - b: Pair, - val default: ColorRGBa = ColorRGBa.WHITE -) : - CompoundFCurve(listOf(r.second, g.second, b.second), listOf(r.first, g.first, b.first)) { - - override fun value(t: Double, overrides: Map?): ColorRGBa { - val r = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.r - val g = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.g - val b = overrides?.get(compoundNames[2]) ?: compounds[2]?.value(t) ?: default.g - return ColorRGBa(r, g, b) - } - - override fun sampler(normalized: Boolean): (Double) -> ColorRGBa { - val rSampler = compounds[0]?.sampler(normalized) ?: { default.r } - val gSampler = compounds[1]?.sampler(normalized) ?: { default.g } - val bSampler = compounds[2]?.sampler(normalized) ?: { default.b } - return { t -> ColorRGBa(rSampler(t), gSampler(t), bSampler(t)) } - } -} - -class RgbaFCurve( - r: Pair, - g: Pair, - b: Pair, - a: Pair, - val default: ColorRGBa = ColorRGBa.WHITE -) : - CompoundFCurve( - listOf(r.second, g.second, b.second, a.second), - listOf(r.first, g.first, b.first, a.first) - ) { - - override fun value(t: Double, overrides: Map?): ColorRGBa { - val r = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.r - val g = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.g - val b = overrides?.get(compoundNames[2]) ?: compounds[2]?.value(t) ?: default.g - val a = overrides?.get(compoundNames[3]) ?: compounds[3]?.value(t) ?: default.alpha - return ColorRGBa(r, g, b, a) - } - - override fun sampler(normalized: Boolean): (Double) -> ColorRGBa { - val rSampler = compounds[0]?.sampler(normalized) ?: { default.r } - val gSampler = compounds[1]?.sampler(normalized) ?: { default.g } - val bSampler = compounds[2]?.sampler(normalized) ?: { default.b } - val aSampler = compounds[3]?.sampler(normalized) ?: { default.alpha } - return { t -> ColorRGBa(rSampler(t), gSampler(t), bSampler(t), aSampler(t)) } - } -} - -class PolarFCurve( - angleInDegrees: Pair, - radius: Pair, - val default: Polar = Polar(0.0, 1.0) -) : - CompoundFCurve(listOf(angleInDegrees.second, radius.second), listOf(angleInDegrees.first, radius.first)) { - - override fun value(t: Double, overrides: Map?): Polar { - val theta = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.theta - val radius = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.radius - return Polar(theta, radius) - } - - override fun sampler(normalized: Boolean): (Double) -> Polar { - val angleSampler = compounds[0]?.sampler(normalized) ?: { default.theta } - val radiusSampler = compounds[1]?.sampler(normalized) ?: { default.radius } - return { t -> Polar(angleSampler(t), radiusSampler(t)) } - } -} - -class SphericalFCurve( - thetaInDegrees: Pair, - phiInDegrees: Pair, - radius: Pair, - val default: Spherical = Spherical(0.0, 1.0, 1.0) -) : - CompoundFCurve( - listOf(thetaInDegrees.second, phiInDegrees.second, radius.second), - listOf(thetaInDegrees.first, phiInDegrees.first, radius.first) - ) { - override fun value(t: Double, overrides: Map?): Spherical { - val theta = overrides?.get(compoundNames[0]) ?: compounds[0]?.value(t) ?: default.theta - val phi = overrides?.get(compoundNames[1]) ?: compounds[1]?.value(t) ?: default.phi - val radius = overrides?.get(compoundNames[2]) ?: compounds[2]?.value(t) ?: default.radius - return Spherical(theta, phi, radius) - } - - override fun sampler(normalized: Boolean): (Double) -> Spherical { - val thetaSampler = compounds[0]?.sampler(normalized) ?: { default.theta } - val phiSampler = compounds[0]?.sampler(normalized) ?: { default.theta } - val radiusSampler = compounds[2]?.sampler(normalized) ?: { default.radius } - return { t -> Spherical(thetaSampler(t), phiSampler(t), radiusSampler(t)) } - } -} - diff --git a/orx-fcurve/src/commonMain/kotlin/EFCurve.kt b/orx-fcurve/src/commonMain/kotlin/EFCurve.kt deleted file mode 100644 index e5eb1a2b..00000000 --- a/orx-fcurve/src/commonMain/kotlin/EFCurve.kt +++ /dev/null @@ -1,126 +0,0 @@ -package org.openrndr.extra.fcurve - -import org.openrndr.extra.expressions.FunctionExtensions -import org.openrndr.extra.expressions.evaluateExpression - -/** - * expand mfcurve to fcurve - */ -fun mfcurve( - mf: String, - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY -): String { - /** - * perform comment substitution - */ - val stripped = Regex("(#.*)$", RegexOption.MULTILINE).replace(mf, "") - - /** - * detect modifier - */ - val parts = stripped.split("|") - - val efcurve = parts.getOrElse(0) { "" } - val modifier = parts.getOrNull(1) - - var fcurve = efcurve(efcurve, constants, functions) - if (modifier != null) { - fcurve = modifyFCurve(fcurve, modifier, constants, functions) - } - return fcurve -} - -/** - * Processes and expands a formatted string based on specific expressions and rules such as comments, lists, - * and repetitions. The method allows for recursive evaluation of expressions within the string. - * - * @param ef The input string to be processed, containing expression placeholders, lists, or repetitions. - * @param constants A map of constants used for substituting and evaluating expressions. - * @param functions An object containing user-defined functions for expression evaluation. - * @return A processed string with all expressions, lists, and repetitions evaluated and expanded. - */ -fun efcurve( - ef: String, - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY -): String { - // IntelliJ falsely reports a redundant escape character. the escape character is required when running the regular - // expression on a javascript target. Removing the escape character will result in a `Lone quantifier brackets` - // syntax error. - - @Suppress("RegExpRedundantEscape") - val expression = Regex("\\{([^{}]+)\\}") - - @Suppress("RegExpRedundantEscape") - val repetition = Regex("""\(([^()]+)\)\[([^\[\]]+)\]""") - - @Suppress("RegExpRedundantEscape") - val list = Regex("\\(([^()]+)\\)\\{([^\\[\\]]+)\\}") - - /** - * perform comment substitution - */ - var curve = Regex("(#.*)$", RegexOption.MULTILINE).replace(ef, "") - - /** - * Allow for nested repetitions and lists - */ - do { - val referenceCurve = curve - - /** - * perform list expansion |text|{items} - */ - curve = list.replace(curve) { occ -> - val listText = expression.replace(occ.groupValues[2]) { exp -> - val expressionText = exp.groupValues[1] - evaluateExpression(expressionText, constants, functions)?.toString() - ?: error("parse error in repetition count expression '$expressionText'") - } - val listTokens = listText.split(Regex("[,;][\t\n ]*|[\t\n ]+")) - val listItems = listTokens.filter { it.isNotEmpty() } - .map { it.trim().toDoubleOrNull() ?: error("'$it' is not a number in $listTokens") } - - listItems.mapIndexed { index, value -> - expression.replace(occ.groupValues[1]) { exp -> - val expressionText = exp.groupValues[1] - evaluateExpression( - exp.groupValues[1], - constants + mapOf("index" to index.toDouble(), "it" to value), - functions - )?.toString() ?: error("parse error in repeated expression '$expressionText'") - } - }.joinToString(" ") - } - - /** - * perform repetition expansion |text|[repeat-count] - */ - curve = repetition.replace(curve) { occ -> - val repetitions = expression.replace(occ.groupValues[2]) { exp -> - val expressionText = exp.groupValues[1] - evaluateExpression(expressionText, constants)?.toInt()?.toString() - ?: error("parse error in repetition count expression '$expressionText'") - }.toInt() - List(repetitions) { repetition -> - expression.replace(occ.groupValues[1]) { exp -> - val expressionText = exp.groupValues[1] - evaluateExpression( - exp.groupValues[1], - constants + mapOf("it" to repetition.toDouble()), - functions - )?.toString() - ?: error("parse error in repeated expression '$expressionText'") - } - }.joinToString(" ") - } - } while (curve != referenceCurve) - - /** - * evaluate expression in expansion - */ - return (expression.replace(curve) { exp -> - evaluateExpression(exp.groupValues[1], constants, functions)?.toString() ?: error("parse error in '$curve") - }) -} \ No newline at end of file diff --git a/orx-fcurve/src/commonMain/kotlin/FCurve.kt b/orx-fcurve/src/commonMain/kotlin/FCurve.kt deleted file mode 100644 index 625a3312..00000000 --- a/orx-fcurve/src/commonMain/kotlin/FCurve.kt +++ /dev/null @@ -1,619 +0,0 @@ -package org.openrndr.extra.fcurve - -import kotlinx.serialization.Serializable -import org.openrndr.math.Vector2 -import org.openrndr.math.transforms.buildTransform -import org.openrndr.shape.Segment2D -import org.openrndr.shape.ShapeContour -import org.openrndr.shape.bounds -import kotlin.math.abs - -/** - * Find the (first) t value for a given [x] value - */ -private fun Segment2D.tForX(x: Double): Double { - if (x == start.x) return 0.0 - if (x == end.x) return 1.0 - - if (linear) { - return (x - start.x) / (end.x - start.x) - } else { - val cb = this.cubic - val a = cb.start.x - x - val b = cb.control[0].x - x - val c = cb.control[1].x - x - val d = cb.end.x - x - - val t = getCubicRoots(a, b, c, d).firstOrNull() ?: 0.0 - - return t - } -} - -/** - * Find the y value for a given [x] value - */ -private fun Segment2D.yForX(x: Double): Double { - val t = tForX(x) - return position(t).y -} - -/** - * Scale tangents such that tangent lines do not overlap - */ -fun Segment2D.scaleTangents(axis: Vector2 = Vector2.UNIT_X): Segment2D { - if (linear) { - return this - } else { - val c = this.cubic - val width = end.distanceTo(start) - - val cd0 = (c.control[0] - c.start).projectedOn(axis) - val cd0a = cd0.dot(axis) - val cd1 = (c.control[1] - c.end).projectedOn(-axis) - val cd1a = cd1.dot(-axis) - val handleWidth = cd0.length + cd1.length - - val r = width / handleWidth - val c0 = (if (handleWidth > width) (c.control[0] - c.start) * r + c.start else c.control[0]).let { - if (cd0a <= 0.0) { - (it - c.start).projectedOn((axis).perpendicular()) + c.start - } else { - it - } - } - val c1 = (if (handleWidth > width) (c.control[1] - c.end) * r + c.end else c.control[1]).let { - if (cd1a <= 0.0) { - (it - c.end).projectedOn((-axis).perpendicular()) + c.end - } else { - it - } - } - return copy(control = listOf(c0, c1)) - } -} - - -/** - * Represents a functional curve composed of multiple 2D segments. It provides utilities to - * manipulate and query the curve, such as reversing its direction, changing its speed, - * sampling values, and visualizing it as contours. - * - * @param segments a list of 2D segments that define the curve - */ -@Serializable -data class FCurve(val segments: List) { - - /** - * Reverse the fcurve - */ - fun reverse(): FCurve { - val d = duration - val t = buildTransform { - translate(d, 0.0) - scale(-1.0, 1.0) - } - return FCurve(segments.map { it.reverse.transform(t) }) - } - - val bounds by lazy { - segments.map { it.bounds }.bounds - } - - /** - * Represents the minimum value of the curve. - * - * This property evaluates to the minimum vertical position (y-coordinate) - * of the FCurve based on its `segments` and `bounds`. If the `segments` - * list is empty, the value defaults to `0.0`. Otherwise, it calculates - * the minimum as the y-coordinate at the starting position of the bounds. - */ - val min: Double - get() { - if (segments.isEmpty()) return 0.0 else return bounds.position(0.0, 0.0).y - } - - /** - * Represents the maximum y-coordinate value of the FCurve at its bounds. - * - * If the `segments` list of the FCurve is empty, the returned value is 0.0. - * Otherwise, it calculates the y-coordinate of the furthest extent of the curve - * by evaluating the position of the `bounds` at the upper-right corner (1.0, 1.0). - */ - val max: Double - get() { - if (segments.isEmpty()) return 0.0 else return bounds.position(1.0, 1.0).y - } - - /** - * Change the duration of the Fcurve - */ - fun changeSpeed(speed: Double): FCurve { - val c = if (speed < 0.0) reverse() else this - return if (speed == 1.0) c else { - val t = buildTransform { - scale(1.0 / speed, 1.0) - } - FCurve(c.segments.map { it.transform(t) }) - } - } - - /** - * Shifts the FCurve along the x-axis by a specified amount. - * - * @param x The amount to shift the FCurve along the x-axis. - * @return A new FCurve instance with all segments shifted by the specified amount. - */ - fun shift(x: Double): FCurve { - val t = buildTransform { - translate(x, 0.0) - } - return FCurve(segments.map { it.transform(t) }) - } - - /** - * Offsets the FCurve by a specified amount along the y-axis. - * - * @param y The amount to offset the FCurve along the y-axis. - * @return A new FCurve instance with all segments transformed by the offset. - */ - fun offset(y: Double): FCurve { - val t = buildTransform { - translate(0.0, y) - } - return FCurve(segments.map { it.transform(t) }) - } - - /** - * Scales the FCurve by the specified factors along the x-axis and y-axis. - * - * @param sx The scaling factor along the x-axis. - * @param sy The scaling factor along the y-axis. - * @return A new FCurve instance with all segments scaled by the specified factors. - */ - fun scale(sx: Double, sy: Double): FCurve { - val t = buildTransform { - scale(sx, sy) - } - return FCurve(segments.map { it.transform(t) }) - } - - /** - * Creates a function to sample the FCurve at a specific time. - * - * @param normalized Specifies whether the sampling is normalized to the range [0, 1]. - * If `true`, the time parameter will be scaled to the duration of the curve. - * If `false`, the raw time parameter is used directly. - * @return A lambda function that takes a `Double` representing the time and returns a `Double` - * corresponding to the sampled value from the FCurve at that specific time. - */ - fun sampler(normalized: Boolean = false): (Double) -> Double { - var cachedSegment: Segment2D? = null - if (!normalized) { - return { t -> - val r = valueWithSegment(t, cachedSegment) - cachedSegment = r.second - r.first - } - } else { - val d = duration - return { t -> - val r = valueWithSegment(t * d, cachedSegment) - cachedSegment = r.second - r.first - } - } - } - - /** - * The duration of the FCurve, calculated as the difference between its start and end points. - * Returns 0.0 if the FCurve has no segments. - */ - val duration: Double - get() { - return if (segments.isEmpty()) { - 0.0 - } else { - end - start - } - } - - - /** - * Represents the starting x-coordinate of the first segment in the FCurve. - * If the `segments` list is empty, it defaults to `0.0`. - */ - val start: Double - get() { - return if (segments.isEmpty()) { - 0.0 - } else { - segments.first().start.x - } - } - - - /** - * Represents the x-coordinate of the endpoint of the last segment in the FCurve. - * - * If the `segments` list is empty, the value defaults to `0.0`. - * Otherwise, it returns the x-coordinate of the endpoint (`end.x`) of the last segment. - */ - val end: Double - get() { - return if (segments.isEmpty()) { - 0.0 - } else { - segments.last().end.x - } - } - - - /** - * Evaluate the Fcurve at [t] - * @param segment an optional segment that can be used to speed up scanning for the relevant segment - * @see valueWithSegment - */ - fun value(t: Double, segment: Segment2D? = null): Double = valueWithSegment(t, segment).first - - /** - * Evaluate the Fcurve at [t] - * @param cachedSegment an optional segment that can be used to speed up scanning for the relevant segment - */ - fun valueWithSegment(t: Double, cachedSegment: Segment2D? = null): Pair { - if (cachedSegment != null) { - if (t >= cachedSegment.start.x && t < cachedSegment.end.x) { - return Pair(cachedSegment.yForX(t), cachedSegment) - } - } - - if (segments.isEmpty()) { - return Pair(0.0, null) - } - if (t <= segments.first().start.x) { - val segment = segments.first() - return Pair(segment.start.y, segment) - } else if (t > segments.last().end.x) { - val segment = segments.last() - return Pair(segment.end.y, segment) - } else { - val segmentIndex = segments.binarySearch { - if (t < it.start.x) { - 1 - } else if (t > it.end.x) { - -1 - } else { - 0 - } - } - val segment = segments.getOrNull(segmentIndex) - return Pair(segment?.yForX(t) ?: 0.0, segment) - } - } - - /** - * Return a list of contours that can be used to visualize the Fcurve - */ - fun contours(scale: Vector2 = Vector2(1.0, -1.0), offset: Vector2 = Vector2.ZERO): List { - var active = mutableListOf() - val result = mutableListOf() - - for (segment in segments) { - - val tsegment = segment.transform( - buildTransform { - translate(offset) - scale(scale.x, scale.y) - } - ) - - if (active.isEmpty()) { - active.add(tsegment) - } else { - val dy = abs(active.last().end.y - tsegment.start.y) - if (dy > 1E-3) { - result.add(ShapeContour.fromSegments(active, false)) - active = mutableListOf() - } - active.add(tsegment) - } - } - if (active.isNotEmpty()) { - result.add(ShapeContour.fromSegments(active, false)) - } - return result - } -} - -/** - * Fcurve builder - */ -class FCurveBuilder { - val segments = mutableListOf() - var cursor = Vector2(0.0, 0.0) - - var path = "" - - fun moveTo(y: Double, relative: Boolean = false) { - cursor = if (!relative) cursor.copy(y = y) else cursor.copy(y = cursor.y + y) - path += "${if (relative) "m" else "M"}$y" - } - - fun lineTo(x: Double, y: Double, relative: Boolean = false) { - val r = if (relative) 1.0 else 0.0 - segments.add(Segment2D(cursor, Vector2(x + cursor.x, y + cursor.y * r))) - cursor = Vector2(cursor.x + x, cursor.y * r + y) - path += "${if (relative) "l" else "L"}$x,$y" - } - - fun curveTo( - x0: Double, y0: Double, - x: Double, y: Double, - relative: Boolean = false - ) { - val r = if (relative) 1.0 else 0.0 - segments.add( - Segment2D( - cursor, - Vector2(cursor.x + x0, cursor.y * r + y0), - Vector2(cursor.x + x, cursor.y * r + y) - ) - ) - cursor = Vector2(cursor.x + x, cursor.y * r + y) - path += "${if (relative) "q" else "Q"}$x0,$y0,$x,$y" - } - - fun curveTo( - x0: Double, y0: Double, - x1: Double, y1: Double, - x: Double, y: Double, relative: Boolean = false - ) { - val r = if (relative) 1.0 else 0.0 - segments.add( - Segment2D( - cursor, - Vector2(cursor.x + x0, cursor.y * r + y0), - Vector2(cursor.x + x1, cursor.y * r + y1), - Vector2(cursor.x + x, cursor.y * r + y) - ).scaleTangents() - ) - cursor = Vector2(cursor.x + x, cursor.y * r + y) - path += "${if (relative) "c" else "C"}$x0,$y0,$x,$y" - } - - fun continueTo(x: Double, y: Double, relative: Boolean = false) { - val r = if (relative) 1.0 else 0.0 - - if (segments.isNotEmpty()) { - val lastSegment = segments.last() - val outTangent = if (segments.last().linear) lastSegment.end else segments.last().control.last() - val outPos = lastSegment.end - val d = outPos - outTangent - val ts = 1.0// x / lastDuration - segments.add( - Segment2D( - cursor, - cursor + d * ts, - Vector2(cursor.x + x, cursor.y * r + y) - ).scaleTangents() - ) - } else { - segments.add( - Segment2D(cursor, - Vector2(cursor.x + x, cursor.y * r + y)).quadratic - ) - } - cursor = Vector2(cursor.x + x, cursor.y * r + y) - path += "${if (relative) "t" else "T"}$x,$y" - } - - fun continueTo(x1: Double, y1: Double, x: Double, y: Double, relative: Boolean = false) { - val r = if (relative) 1.0 else 0.0 - val lastSegment = segments.last() - val outTangent = if (lastSegment.linear) lastSegment.position(0.5) else segments.last().control.last() - val dx = cursor.x - outTangent.x - val dy = cursor.y - outTangent.y - segments.add( - Segment2D( - cursor, - Vector2(cursor.x + dx, cursor.y + dy), - Vector2(cursor.x + x1, cursor.y * r + y1), - Vector2(cursor.x + x, cursor.y * r + y) - ).scaleTangents() - ) - cursor = Vector2(cursor.x + x, cursor.y * r + y) - path += "${if (relative) "s" else "S"}$x1,$y1,$x,$y" - } - - fun hold(x: Double, relative: Boolean = true) { - if (relative) { - lineTo(x, cursor.y) - } else { - require(segments.isEmpty()) { "absolute hold (H $x) is only allowed when used as first command" } - cursor = cursor.copy(x = x) - } - path += "h$x" - } - - /** - * build the Fcurve - */ - fun build(): FCurve { - return FCurve(segments) - } -} - -/** - * build an Fcurve - * @see FCurveBuilder - */ -fun fcurve(builder: FCurveBuilder.() -> Unit): FCurve { - val fb = FCurveBuilder() - fb.builder() - return fb.build() -} - - -/** - * Splits an input string containing fcurve path commands and numbers into individual components, - * preserving the order of commands and associated numbers. - * The splitting considers the relations between commands and numbers, ensuring proper separation. - * - * @param d The input string representing fcurve path commands and numbers. - * @return A list of strings where each element is either an fcurve path command or a related numerical value. - */ -fun fCurveCommands(d: String): List { - val fcurveCommands = "mMlLqQsStTcChH" - val number = "0-9.\\-E%" - - return d.split(Regex("(?:[\t ,]|\r?\n)+|(?<=[$fcurveCommands])(?=[$number])|(?<=[$number])(?=[$fcurveCommands])")) - .filter { it.isNotBlank() } -} - -private fun evaluateFCurveCommands(parts: List): FCurve { - val mparts = parts.reversed().toMutableList() - - fun popToken(): String = mparts.removeLast() - - fun popNumber(): Double = mparts.removeLast().toDoubleOrNull() ?: error("not a number") - - fun String.numberOrFactorOf(percentageOf: (Double) -> Double): Double { - return if (endsWith("%")) { - val f = (dropLast(1).toDoubleOrNull() ?: error("'$this' is not a percentage")) / 100.0 - percentageOf(f) - } else { - toDoubleOrNull() ?: error("'$this' is not a number") - } - } - - fun String.numberOrPercentageOf(percentageOf: () -> Double): Double { - return numberOrFactorOf { f -> f * percentageOf() } - } - - fun popNumberOrPercentageOf(percentageOf: () -> Double): Double { - return mparts.removeLast().numberOrPercentageOf(percentageOf) - } - - /** - * Use the [fcurve] builder to construct the FCurve - */ - return fcurve { - fun dx(): Double { - val lastSegment = segments.lastOrNull() ?: Segment2D(Vector2.ZERO, Vector2.ZERO) - return lastSegment.end.x - lastSegment.start.x - } - - while (mparts.isNotEmpty()) { - val command = mparts.removeLast() - when (command) { - - /** - * Handle move cursor command - */ - "m", "M" -> { - val isRelative = command.first().isLowerCase() - moveTo(popNumberOrPercentageOf { cursor.y }, isRelative) - } - - /** - * Handle line command - */ - "l", "L" -> { - val isRelative = command.first().isLowerCase() - val x = popNumber() - val y = popNumber() - lineTo(x, y, isRelative) - } - - /** - * Handle cubic bezier command - */ - "c", "C" -> { - val relative = command.first().isLowerCase() - val tcx0 = popToken() - val tcy0 = popToken() - val tcx1 = popToken() - val tcy1 = popToken() - val x = popNumber() - val y = popNumber() - val x0 = tcx0.numberOrPercentageOf { x } - val y0 = tcy0.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } - val x1 = tcx1.numberOrPercentageOf { x } - val y1 = tcy1.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } - curveTo(x0, y0, x1, y1, x, y, relative) - } - - /** - * Handle quadratic bezier command - */ - "q", "Q" -> { - val relative = command.first().isLowerCase() - val tcx0 = popToken() - val tcy0 = popToken() - val x = popNumberOrPercentageOf { dx() } - val y = popNumberOrPercentageOf { cursor.y } - val x0 = tcx0.numberOrPercentageOf { x } - val y0 = tcy0.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } - curveTo(x0, y0, x, y, relative) - } - - /** - * Handle horizontal line (or hold) command - */ - "h", "H" -> { - val isRelative = command.first().isLowerCase() - hold(popNumberOrPercentageOf { dx() }, isRelative) - } - - /** - * Handle cubic smooth to command - */ - "s", "S" -> { - val relative = command.first().isLowerCase() - val tcx0 = popToken() - val tcy0 = popToken() - val x = popNumber() - val y = popNumber() - val x1 = tcx0.numberOrPercentageOf { x } - val y1 = tcy0.numberOrPercentageOf { y } - continueTo(x1, y1, x, y, relative) - } - - /** - * Handle quadratic smooth to command - */ - "t", "T" -> { - val isRelative = command.first().isLowerCase() - val x = popNumber() - val y = popNumber() - continueTo(x, y, isRelative) - } - - else -> error("unknown command: $command in ${parts}") - } - } - } -} - -/** - * Parses the provided string to create an FCurve. This function attempts to either interpret the - * input as a constant value or evaluate it as a series of functional curve commands. - * - * @param d A string representing either a constant value or functional curve commands. - * If the string can be converted to a double, it is treated as a constant value for the FCurve. - * Otherwise, it is parsed as functional curve commands. - * @return An FCurve constructed based on the input string. - */ -fun fcurve(d: String): FCurve { - val constantExpression = d.toDoubleOrNull() - if (constantExpression != null) { - return FCurve(listOf(Segment2D(Vector2(0.0, constantExpression), Vector2(0.0, constantExpression)))) - } - return evaluateFCurveCommands(fCurveCommands(d)) -} diff --git a/orx-fcurve/src/commonMain/kotlin/FCurveModifier.kt b/orx-fcurve/src/commonMain/kotlin/FCurveModifier.kt deleted file mode 100644 index c295f96f..00000000 --- a/orx-fcurve/src/commonMain/kotlin/FCurveModifier.kt +++ /dev/null @@ -1,200 +0,0 @@ -package org.openrndr.extra.fcurve - -import org.openrndr.extra.expressions.FunctionExtensions -import org.openrndr.extra.expressions.compileFunction1 -import org.openrndr.math.Vector2 - -/** - * Modify an [fcurve] string using a [modifiers] string - */ -fun modifyFCurve( - fcurve: String, - modifiers: String, - constants: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY -): String { - val parts = fCurveCommands(fcurve) - val mparts = parts.reversed().toMutableList() - - @Suppress("RegExpRedundantEscape") - val modifier = Regex("([xy])=\\{([^{}]+)\\}") - - val modifierExpressions = modifier.findAll(modifiers).map { it.groupValues[1] to it.groupValues[2] }.toMap() - - val xModifierExpression = modifierExpressions["x"] - val xModifier = - if (xModifierExpression != null) compileFunction1(xModifierExpression, "x", constants, functions) else { - { x: Double -> x } - } - - val yModifierExpression = modifierExpressions["y"] - val yModifier = - if (yModifierExpression != null) compileFunction1(yModifierExpression, "y", constants, functions) else { - { y: Double -> y } - } - - fun popToken(): String = mparts.removeLast() - fun popNumber(): Double = mparts.removeLast().toDoubleOrNull() ?: error("not a number") - - fun String.numberOrFactorOf(percentageOf: (Double) -> Double): Double { - return if (endsWith("%")) { - val f = (dropLast(1).toDoubleOrNull() ?: error("'$this' is not a percentage")) / 100.0 - percentageOf(f) - } else { - toDoubleOrNull() ?: error("'$this' is not a number") - } - } - - fun String.numberOrPercentageOf(percentageOf: () -> Double): Double { - return numberOrFactorOf { f -> f * percentageOf() } - } - - var cursor = Vector2.ZERO - var modified = "" - fun emit(command: String, vararg ops: Double, relative: Boolean, x: Double, y: Double) { - modified = modified + " " + command + " " + ops.joinToString(" ") - cursor = if (relative) { - Vector2(x + cursor.x, y + cursor.y) - } else { - Vector2(x + cursor.x, y) - } - } - - while (mparts.isNotEmpty()) { - val command = mparts.removeLast() - - when (command) { - - /** - * Handle move cursor command - */ - "m", "M" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - val y = popNumber() + rf * cursor.y - emit("M", yModifier(y), relative = false, x = 0.0, y = y) - } - - /** - * Handle line command - */ - "l", "L" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - val x = popNumber() - val y = popNumber() + rf * cursor.y - - emit("L", xModifier(x), yModifier(y), relative = false, x = x, y = y) - } - - /** - * Handle cubic bezier command - */ - "c", "C" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - - val tcx0 = popToken() - val tcy0 = popToken() - val tcx1 = popToken() - val tcy1 = popToken() - val x = popNumber() - val y = popNumber() - val ay = y + cursor.y * rf - val x0 = tcx0.numberOrPercentageOf { x } - val y0 = tcy0.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } + cursor.y * rf - val x1 = tcx1.numberOrPercentageOf { x } - val y1 = tcy1.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } + cursor.y * rf - emit( - "C", - xModifier(x0), - yModifier(y0), - xModifier(x1), - yModifier(y1), - xModifier(x), - xModifier(ay), - relative = false, - x = x, - y = ay - ) - } - - /** - * Handle quadratic bezier command - */ - "q", "Q" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - val tcx0 = popToken() - val tcy0 = popToken() - val x = popNumber() - val y = popNumber() - val ay = y + cursor.y * rf - val x0 = tcx0.numberOrPercentageOf { x } - val y0 = tcy0.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } + rf * cursor.y - emit("Q", xModifier(x0), yModifier(y0), xModifier(x), yModifier(ay), relative = false, x = x, y = ay) - } - - /** - * Handle horizontal line (or hold) command - */ - "h", "H" -> { - if (command == "H") { - val x = popNumber() - emit(command, xModifier(x), relative = false, x = x, y = cursor.y) - cursor = Vector2(x, cursor.y) - } else { - val x = popNumber() - emit(command, xModifier(x), relative = false, x = x, y = cursor.y) - } - } - - /** - * Handle cubic smooth to command - */ - "s", "S" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - val tcx0 = popToken() - val tcy0 = popToken() - val x = popNumber() - val y = popNumber() - val ay = y + cursor.y * rf - val x1 = tcx0.numberOrPercentageOf { x } - val y1 = tcy0.numberOrFactorOf { factor -> - if (relative) y * factor else cursor.y * (1.0 - factor).coerceAtLeast(0.0) + y * factor - } + rf * cursor.y - emit("S", xModifier(x1), yModifier(y1), xModifier(x), yModifier(ay), relative = false, x = x, y = ay) - } - - /** - * Handle quadratic smooth to command - */ - "t", "T" -> { - val relative = command.first().isLowerCase() - val rf = if (relative) 1.0 else 0.0 - val x = popNumber() - val y = popNumber() + cursor.y * rf - emit("T", xModifier(x), yModifier(y), relative = false, x = x, y = y) - } - - else -> error("unknown command: $command in ${parts}") - } - } - return modified -} - -fun main() { - val f = "l 10 10 h 4 t 20.0 20.0 s 5% 50% 30.0 30.0" - println(modifyFCurve(f, "x={sqrt(x)} y={y * 2.0}")) - - val mf = "l 10 10 h 4 t 20.0 20.0 s 5% 50% 30.0 30.0 | x={2.0 * x} y={-3.0 * y}" - val f2 = mfcurve(mf) - println(f2) -} \ No newline at end of file diff --git a/orx-fcurve/src/commonMain/kotlin/MultiFCurve.kt b/orx-fcurve/src/commonMain/kotlin/MultiFCurve.kt deleted file mode 100644 index e19af9aa..00000000 --- a/orx-fcurve/src/commonMain/kotlin/MultiFCurve.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.openrndr.extra.fcurve - -/** - * Represents a collection of named `FCurve` objects, enabling the manipulation and - * querying of multiple functional curves as a unified entity. Each `FCurve` in the - * collection is identified by a unique string key, allowing structured access and control. - * - * @param compounds A map containing string keys associated with `FCurve` instances. - */ -open class MultiFCurve(val compounds: Map) { - fun changeSpeed(speed: Double): MultiFCurve { - return if (speed == 1.0) { - this - } else { - MultiFCurve(compounds.mapValues { it.value?.changeSpeed(speed) }) - } - } - - /** - * Duration of the [MultiFCurve] - */ - val duration by lazy { compounds.values.maxOfOrNull { it?.duration ?: 0.0 } ?: 0.0 } - - - /** - * Start position of the [MultiFCurve] - */ - val start by lazy { compounds.values.minOfOrNull { it?.start ?: 0.0 } ?: 0.0 } - - /** - * End position of the [MultiFCurve] - */ - val end by lazy { compounds.values.maxOfOrNull { it?.end ?: 0.0 } ?: 0.0 } - - operator fun get(name: String): FCurve? { - return compounds[name] - } -} - diff --git a/orx-fcurve/src/commonMain/kotlin/MultiFCurveExtensions.kt b/orx-fcurve/src/commonMain/kotlin/MultiFCurveExtensions.kt deleted file mode 100644 index 96bfc4e5..00000000 --- a/orx-fcurve/src/commonMain/kotlin/MultiFCurveExtensions.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.openrndr.extra.fcurve - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.* - -fun MultiFCurve.boolean(value: String, default: Boolean = true) = BooleanFCurve(value to this[value], default) -fun MultiFCurve.double(value: String, default: Double = 0.0) = DoubleFCurve(value to this[value], default) - -fun MultiFCurve.int(value: String, default: Int = 0) = IntFCurve(value to this[value], default) - -fun MultiFCurve.vector2(x: String, y: String, default: Vector2 = Vector2.ZERO) = - Vector2FCurve(x to this[x], y to this[y], default) - -fun MultiFCurve.vector3(x: String, y: String, z: String, default: Vector3 = Vector3.ZERO) = - Vector3FCurve(x to this[x], y to this[y], z to this[z], default) - -fun MultiFCurve.vector4(x: String, y: String, z: String, w: String, default: Vector4 = Vector4.ZERO) = - Vector4FCurve(x to this[x], y to this[y], z to this[z], w to this[w], default) - -fun MultiFCurve.rgb(r: String, g: String, b: String, default: ColorRGBa = ColorRGBa.WHITE) = - RgbFCurve(r to this[r], g to this[g], b to this[b], default) - -fun MultiFCurve.rgba(r: String, g: String, b: String, a: String, default: ColorRGBa = ColorRGBa.WHITE) = - RgbaFCurve(r to this[r], g to this[g], b to this[b], a to this[a], default) - -fun MultiFCurve.polar(angleInDegrees: String, radius: String, default: Polar = Polar(0.0, 1.0)) = - PolarFCurve(angleInDegrees to this[angleInDegrees], radius to this[radius], default) - -fun MultiFCurve.spherical( - thetaInDegrees: String, - phiInDegrees: String, - radius: String, - default: Spherical = Spherical(0.0, 0.0, 1.0) -) = SphericalFCurve( - thetaInDegrees to this[thetaInDegrees], - phiInDegrees to this[phiInDegrees], - radius to this[radius], - default -) \ No newline at end of file diff --git a/orx-fcurve/src/commonMain/kotlin/Roots.kt b/orx-fcurve/src/commonMain/kotlin/Roots.kt deleted file mode 100644 index 66c604b1..00000000 --- a/orx-fcurve/src/commonMain/kotlin/Roots.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* -This is a direct port of the root finding code from https://pomax.github.io/bezierinfo/#extremities - -A copy of the original license: -The following license terms apply to this repository and its derivative website and repositories: - -- you may use any illustrative code found in the `docs/chapters` directories without crediting. -- you may use any illustrative graphics found in the `docs/images` directories without crediting. -- you may quote up to two paragraphs from the `docs/chapters` markdown documents without crediting. -- you may quote an entire section from any chapter, as long as it's credited and links back to the chapter that section is in on the official website. - -If you wish to quote more than one section of a chapter (such as an entire chapter, or more than one chapter), you may do so only after requesting, and getting, explicit permission. Permission should be sought by filing an issue in this repository, which will act as permanent record of the granted permissions. - -Outside of the above permissions, the following prohibitions and copyrights apply: - -- You may not put up a clone of the entire work (meaning that if you fork the project, you may not turn on gh-pages to get it automatically hosted by github itself on your own account domain). -- The code in `docs/js/graphics-element/lib` consists of third party libraries governed by their own licenses. - -Any other material not explicitly covered by this license is to be treated as having all rights reserved. -Please file an issue for license clarification questions. - - */ - -package org.openrndr.extra.fcurve -import kotlin.math.* - -// A helper function to filter for values in the [0,1] interval: -private fun accept(t: Double): Boolean { - return t in 0.0..1.0 -} - - -// A real-cuberoots-only function: -private fun cuberoot(v: Double): Double { - if (v < 0) return -(-v).pow(1.0 / 3); - return v.pow(1.0 / 3) -} - -internal fun approximately(a: Double, b: Double, epsilon: Double = 1E-8): Boolean { - return abs(a - b) < epsilon -} - -// Now then: given cubic coordinates {pa, pb, pc, pd} find all roots. -internal fun getCubicRoots(pa: Double, pb: Double, pc: Double, pd: Double): List { - var a = (3 * pa - 6 * pb + 3 * pc) - var b = (-3 * pa + 3 * pb) - var c = pa - val d = (-pa + 3 * pb - 3 * pc + pd); - - // do a check to see whether we even need cubic solving: - if (approximately(d, 0.0)) { - // this is not a cubic curve. - if (approximately(a, 0.0)) { - // in fact, this is not a quadratic curve either. - if (approximately(b, 0.0)) { - // in fact in fact, there are no solutions. - return emptyList() - } - // linear solution - return listOf(-c / b).filter(::accept) - } - // quadratic solution - val q = sqrt(b * b - 4 * a * c) - val twoA = 2 * a - return listOf((q - b) / twoA, (-b - q) / twoA).filter(::accept) - } - - // at this point, we know we need a cubic solution. - - a /= d - b /= d - c /= d - - val p = (3 * b - a * a) / 3 - val p3 = p / 3 - val q = (2 * a * a * a - 9 * a * b + 27 * c) / 27 - val q2 = q / 2 - val discriminant = q2 * q2 + p3 * p3 * p3 - - // and some variables we're going to use later on: - var u1 = 0.0 - var v1 = 0.0 - var root1 = 0.0 - var root2 = 0.0 - var root3 = 0.0 - - // three possible real roots: - if (discriminant < 0) { - var mp3 = -p / 3 - val mp33 = mp3 * mp3 * mp3 - val r = sqrt(mp33) - val t = -q / (2 * r) - val cosphi = if (t < -1) -1.0 else if (t > 1) 1.0 else t - val phi = acos(cosphi) - val crtr = cuberoot(r) - val t1 = 2 * crtr - root1 = t1 * cos(phi / 3) - a / 3 - root2 = t1 * cos((phi + 2 * PI) / 3) - a / 3 - root3 = t1 * cos((phi + 4 * PI) / 3) - a / 3 - return listOf(root1, root2, root3).filter(::accept) - } - - // three real roots, but two of them are equal: - if (discriminant == 0.0) { - u1 = if(q2 < 0) cuberoot(-q2) else -cuberoot(q2) - root1 = 2 * u1 - a / 3 - root2 = -u1 - a / 3 - return listOf(root1, root2).filter(::accept) - } - - // one real root, two complex roots - val sd = sqrt(discriminant) - u1 = cuberoot(sd - q2) - v1 = cuberoot(sd + q2) - root1 = u1 - v1 - a / 3 - return listOf(root1).filter(::accept) -} \ No newline at end of file diff --git a/orx-fcurve/src/commonTest/kotlin/TestEFCurve.kt b/orx-fcurve/src/commonTest/kotlin/TestEFCurve.kt deleted file mode 100644 index dac64d1f..00000000 --- a/orx-fcurve/src/commonTest/kotlin/TestEFCurve.kt +++ /dev/null @@ -1,68 +0,0 @@ -import org.openrndr.extra.fcurve.efcurve -import org.openrndr.extra.fcurve.fcurve -import kotlin.test.Test -import kotlin.test.assertEquals - -class TestEFCurve { - @Test - fun comments() { - val text = """M1 (h5 m3){ - |10.3 # toch wel handig zo'n comment - |11.2 - |14.5 - |} - """.trimMargin() - assertEquals("M1 h5 m3 h5 m3 h5 m3", efcurve(text)) - } - - @Test - fun expressions() { - //assertEquals("M${9.toDouble()}", efcurve("M{4.0 + 5.0}")) - } - - @Test - fun listExpansion() { - //assertEquals("M0 L1.0, ${3.toDouble()} L1.0, ${6.0}", efcurve("M0 (L1.0, {it}){3, 6}")) - } - - @Test - fun repetition() { - //assertEquals("M0 L1.0, 3.0 L1.0, 3.0", efcurve("M0 (L1.0, 3.0)[2]")) - //assertEquals("M0 L1.0, ${0.0} L1.0, ${1.0}", efcurve("M0 (L1.0, {it})[2]")) - //assertEquals("M0 L1.0, ${0.0} L1.0, ${1.0} L1.0, ${0.0} L1.0, ${1.0} L1.0, ${0.0} L1.0, ${1.0}", efcurve("M0 ((L1.0, {it})[2])[3]")) - } - - @Test - fun testContinuity() { - val fc = fcurve("Q1 25% 3 100 Q1 25% 3 0 Q1 25% 3 100 Q1 25% 3 0") - val s = fc.sampler() - assertEquals(0.0, s(6.0)) - } - - @Test - fun testConstantValue() { - val text = "10.5" - val fc = fcurve(efcurve(text)) - assertEquals(10.5, fc.value(0.0, null)) - assertEquals(10.5, fc.value(1.0, null)) - assertEquals(10.5, fc.value(-1.0, null)) - - val normalizedSampler = fc.sampler(true) - assertEquals(10.5, normalizedSampler(0.0)) - assertEquals(10.5, normalizedSampler(1.0)) - assertEquals(10.5, normalizedSampler(-1.0)) - } - @Test - fun testConstantExpression() { - val text = "${21.0 / 2.0}" - val fc = fcurve(efcurve(text)) - assertEquals(10.5, fc.value(0.0, null)) - assertEquals(10.5, fc.value(1.0, null)) - assertEquals(10.5, fc.value(-1.0, null)) - - val normalizedSampler = fc.sampler(true) - assertEquals(10.5, normalizedSampler(0.0)) - assertEquals(10.5, normalizedSampler(1.0)) - assertEquals(10.5, normalizedSampler(-1.0)) - } -} \ No newline at end of file diff --git a/orx-fcurve/src/commonTest/kotlin/TestFCurve.kt b/orx-fcurve/src/commonTest/kotlin/TestFCurve.kt deleted file mode 100644 index 962ec51b..00000000 --- a/orx-fcurve/src/commonTest/kotlin/TestFCurve.kt +++ /dev/null @@ -1,41 +0,0 @@ -import org.openrndr.extra.fcurve.fcurve -import kotlin.test.Test -import kotlin.test.assertEquals - -class TestFCurve { - @Test - fun testConstantExpression() { - val text = "10.5" - val fc = fcurve(text) - assertEquals(10.5, fc.value(0.0, null)) - assertEquals(10.5, fc.value(1.0, null)) - assertEquals(10.5, fc.value(-1.0, null)) - - val normalizedSampler = fc.sampler(true) - assertEquals(10.5, normalizedSampler(0.0)) - assertEquals(10.5, normalizedSampler(1.0)) - assertEquals(10.5, normalizedSampler(-1.0)) - } - - @Test - fun testAbsoluteHold() { - run { - val text = "H-1 L 5 5" - val fc = fcurve(text) - assertEquals(0.0, fc.value(-1.0, null)) - assertEquals(5.0, fc.value(4.0, null)) - assertEquals(-1.0, fc.start) - assertEquals(4.0, fc.end) - assertEquals(5.0, fc.duration) - } - run { - val text = "H1 L 5 5" - val fc = fcurve(text) - assertEquals(0.0, fc.value(1.0, null)) - assertEquals(5.0, fc.value(6.0, null)) - assertEquals(1.0, fc.start) - assertEquals(6.0, fc.end) - assertEquals(5.0, fc.duration) - } - } -} \ No newline at end of file diff --git a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve01.kt b/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve01.kt deleted file mode 100644 index 0efec09e..00000000 --- a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve01.kt +++ /dev/null @@ -1,17 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.fcurve.fcurve - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val xpos = fcurve("M0 Q4,360,5,720").sampler() - val ypos = fcurve("M360 h5").sampler() - - extend { - drawer.circle(xpos(seconds.mod(5.0)), ypos(seconds.mod(5.0)), 100.0) - } - } -} diff --git a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve02.kt b/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve02.kt deleted file mode 100644 index cd9cce7c..00000000 --- a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurve02.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.fcurve.fcurve -import org.openrndr.math.Vector2 - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val xposCurve = fcurve("M0 Q4,360,5,720") - val xpos = xposCurve.sampler() - val yposCurve = fcurve("M360 h5") - val ypos = yposCurve.sampler() - - extend { - drawer.circle(xpos(seconds.mod(5.0)), ypos(seconds.mod(5.0)), 100.0) - drawer.stroke = ColorRGBa.PINK - drawer.contours(xposCurve.contours(Vector2(720.0 / 5.0, -1.0), Vector2(0.0, height * 1.0))) - drawer.contours(yposCurve.contours(Vector2(720.0 / 5.0, -1.0), Vector2(0.0, height * 1.0))) - drawer.translate(seconds.mod(5.0) * (720.0 / 5.0), 0.0) - drawer.lineSegment(0.0, 0.0, 0.0, 720.0) - } - } -} diff --git a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurveSheet01.kt b/orx-fcurve/src/jvmDemo/kotlin/DemoFCurveSheet01.kt deleted file mode 100644 index 4f565d7d..00000000 --- a/orx-fcurve/src/jvmDemo/kotlin/DemoFCurveSheet01.kt +++ /dev/null @@ -1,54 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.fcurve.efcurve -import org.openrndr.extra.fcurve.fcurve -import org.openrndr.math.Vector2 - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val fcurveTexts = listOf( - //"(l 35.0 25.0 h {175-35})[4]", // linear steps - "(c 33% 0% 67% 67% 35.0 25.0 h {175-35})[4]", // ease-in steps - "(c 50% 50% 50% 100% 35.0 25.0 h {175-35})[4]", // ease-out steps - "(c 50% 0% 50% 100% 35.0 25.0 h {175-35})[4]", // ease-in-out steps - "(c 95% 0% 100% 100% 35.0 25.0 h {175-35})[4]", // arc-in steps - "(c 0% 0% 5% 100% 35.0 25.0 h {175-35})[4]", // arc-out steps - "(c 95% 0% 100% 100% 17.5 12.5 c 0% 0% 5% 100% 17.5 12.5 h {175-35})[4]", // arc-out steps - ) - - val fcurves = fcurveTexts.map { fcurve(efcurve(it)) } - - extend { - drawer.clear(ColorRGBa.WHITE) - - drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - drawer.translate(10.0, 20.0) - - drawer.stroke = ColorRGBa.PINK - drawer.lineSegment(mouse.position.x - 10.0, 0.0, mouse.position.x - 10.0, height * 1.0) - - fun color(i: Int): ColorRGBa = - ColorRGBa.BLUE.toHSVa().shiftHue(i * 30.0).saturate(0.5).shade(0.9).toRGBa() - - for (i in fcurveTexts.indices) { - drawer.fill = color(i) - drawer.text(fcurveTexts[i], 0.0, 120.0) - - drawer.stroke = color(i).opacify(0.25) - drawer.lineSegment(0.0, 100.0, width - 20.0, 100.0) - - drawer.stroke = color(i) - val y = 100.0 - fcurves[i].value(mouse.position.x - 10.0) - drawer.contours(fcurves[i].contours(offset = Vector2(0.0, 100.0))) - drawer.circle(mouse.position.x - 10.0, y, 10.0) - - drawer.translate(0.0, 110.0) - } - } - } -} \ No newline at end of file diff --git a/orx-fcurve/src/jvmDemo/kotlin/DemoMultiFCurve01.kt b/orx-fcurve/src/jvmDemo/kotlin/DemoMultiFCurve01.kt deleted file mode 100644 index 0941784e..00000000 --- a/orx-fcurve/src/jvmDemo/kotlin/DemoMultiFCurve01.kt +++ /dev/null @@ -1,28 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.fcurve.MultiFCurve -import org.openrndr.extra.fcurve.fcurve -import org.openrndr.extra.fcurve.vector2 - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - class XYAnimation : MultiFCurve( - mapOf( - "x" to fcurve("M0 Q4,360,5,720"), - "y" to fcurve("M360 h5") - ) - ) { - val position = vector2("x", "y") - } - - val xyAnimation = XYAnimation() - val position = xyAnimation.position.sampler() - - extend { - drawer.circle(position(seconds.mod(5.0)), 100.0) - } - } -} diff --git a/orx-fft/README.md b/orx-fft/README.md deleted file mode 100644 index a210a2aa..00000000 --- a/orx-fft/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# orx-fft - -Simple forward and inverse FFT routine - -The FFT routine found in `orx-fft` is a Kotlin port of Minim's FFT routine. - -## Demos -### DemoFFTShape01 - -Demonstration of using FFT to filter a two-dimensional shape. Mouse xy-position is mapped -to lowpass and highpass settings of the filter. - -![DemoFFTShape01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fft/images/DemoFFTShape01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFFTShape01.kt) diff --git a/orx-fft/build.gradle.kts b/orx-fft/build.gradle.kts deleted file mode 100644 index 14aaca0f..00000000 --- a/orx-fft/build.gradle.kts +++ /dev/null @@ -1,23 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-shapes")) - implementation(project(":orx-noise")) - - } - } - } -} \ No newline at end of file diff --git a/orx-fft/src/commonMain/kotlin/FFT.kt b/orx-fft/src/commonMain/kotlin/FFT.kt deleted file mode 100644 index 6bda6de5..00000000 --- a/orx-fft/src/commonMain/kotlin/FFT.kt +++ /dev/null @@ -1,225 +0,0 @@ -package org.openrndr.extra.fft - -import kotlin.math.* - -/* -Based on https://github.com/ddf/Minim/blob/e294e2881a20340603ee0156cb9188c15b5915c2/src/main/java/ddf/minim/analysis/FFT.java -I (EJ) stripped away spectrum and averages. - -This is the original license (GPLv2). I am not sure if my low-effort Kotlin port falls under the same license. - - * Copyright (c) 2007 - 2008 by Damien Di Fede - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -class FFT(val size: Int, private val windowFunction: WindowFunction = IdentityWindow()) { - - var real = FloatArray(size) - var imag = FloatArray(size) - - private fun setComplex(r: FloatArray, i: FloatArray) { - if (real.size != r.size && imag.size != i.size) { - error("FourierTransform.setComplex: the two arrays must be the same length as their member counterparts.") - } else { - r.copyInto(real) - i.copyInto(imag) - } - } - - fun magnitudeSum(includeDC: Boolean = false): Double { - var sum = 0.0 - for (i in (if (includeDC) 0 else 1)..size / 2) { - sum += magnitude(i) - } - return sum - } - - fun scaleAll(sr: Float, includeDC: Boolean = false) { - for (i in (if (includeDC) 0 else 1)..size / 2) { - scaleBand(i, sr) - } - } - - fun magnitude(i: Int): Float { - return sqrt(real[i] * real[i] + imag[i] * imag[i]) - } - - fun phase(i: Int): Float { - return atan2(imag[i], real[i]) - } - - fun shiftPhase(i: Int, shift: Double) { - val m = magnitude(i) - val phase = phase(i) - real[i] = (cos(phase + shift) * m).toFloat() - imag[i] = (sin(phase + shift) * m).toFloat() - - if (i != 0 && i != size / 2) { - real[(size - i)] = real[i] - imag[(size - i)] = -imag[i] - } - } - - fun scaleBand(i: Int, sr: Float) { - if (sr < 0) { - error("Can't scale a frequency band by a negative value.") - } - - real[i] *= sr - imag[i] *= sr - - if (i != 0 && i != size / 2) { - real[(size - i)] = real[i] - imag[(size - i)] = -imag[i] - } - } - - - // performs an in-place fft on the data in the real and imag arrays - // bit reversing is not necessary as the data will already be bit reversed - private fun fft() { - var halfSize = 1 - while (halfSize < real.size) { - // float k = -(float)Math.PI/halfSize; - // phase shift step - // float phaseShiftStepR = (float)Math.cos(k); - // float phaseShiftStepI = (float)Math.sin(k); - // using lookup table - val phaseShiftStepR = cos[halfSize] - val phaseShiftStepI = sin[halfSize] - // current phase shift - var currentPhaseShiftR = 1.0f - var currentPhaseShiftI = 0.0f - for (fftStep in 0 until halfSize) { - var i = fftStep - while (i < real.size) { - val off = i + halfSize - val tr = (currentPhaseShiftR * real[off]) - (currentPhaseShiftI * imag[off]) - val ti = (currentPhaseShiftR * imag[off]) + (currentPhaseShiftI * real[off]) - real[off] = real[i] - tr - imag[off] = imag[i] - ti - real[i] += tr - imag[i] += ti - i += 2 * halfSize - } - val tmpR = currentPhaseShiftR - currentPhaseShiftR = (tmpR * phaseShiftStepR) - (currentPhaseShiftI * phaseShiftStepI) - currentPhaseShiftI = (tmpR * phaseShiftStepI) + (currentPhaseShiftI * phaseShiftStepR) - } - halfSize *= 2 - } - } - - private fun doWindow(samples: FloatArray) { - windowFunction.apply(samples) - } - - - fun forward(buffer: FloatArray) { - if (buffer.size != size) { - error("FFT.forward: The length of the passed sample buffer must be equal to timeSize().") - } - doWindow(buffer) - // copy samples to real/imag in bit-reversed order - bitReverseSamples(buffer, 0) - // perform the fft - fft() - } - - fun forward(buffer: FloatArray, startAt: Int) { - if (buffer.size - startAt < size) { - error( - "FourierTransform.forward: not enough samples in the buffer between " + - startAt + " and " + buffer.size + " to perform a transform." - ) - } - windowFunction.apply(buffer, startAt, size) - bitReverseSamples(buffer, startAt) - fft() - } - - /** - * Performs a forward transform on the passed buffers. - * - * @param buffReal the real part of the time domain signal to transform - * @param buffImag the imaginary part of the time domain signal to transform - */ - fun forward(buffReal: FloatArray, buffImag: FloatArray) { - if (buffReal.size != size || buffImag.size != size) { - error("FFT.forward: The length of the passed buffers must be equal to timeSize().") - } - setComplex(buffReal, buffImag) - bitReverseComplex() - fft() - } - - fun inverse(buffer: FloatArray) { - if (buffer.size > real.size) { - error("FFT.inverse: the passed array's length must equal FFT.timeSize().") - } - // conjugate - for (i in 0 until size) { - imag[i] *= -1.0f - } - bitReverseComplex() - fft() - // copy the result in real into buffer, scaling as we do - for (i in buffer.indices) { - buffer[i] = real[i] / real.size - } - } - - private val reverse by lazy { buildReverseTable() } - - private fun buildReverseTable(): IntArray { - val reverse = IntArray(size) - // set up the bit reversing table - reverse[0] = 0 - var limit = 1 - var bit = size / 2 - while (limit < size) { - for (i in 0 until limit) reverse[i + limit] = reverse[i] + bit - limit = limit shl 1 - bit = bit shr 1 - } - return reverse - } - - // copies the values in the samples array into the real array - // in bit reversed order. the imag array is filled with zeros. - private fun bitReverseSamples(samples: FloatArray, startAt: Int) { - for (i in 0 until size) { - real[i] = samples[startAt + reverse[i]] - imag[i] = 0.0f - } - } - - // bit reverse real[] and imag[] - private fun bitReverseComplex() { - val revReal = FloatArray(real.size) - val revImag = FloatArray(imag.size) - for (i in real.indices) { - revReal[i] = real[reverse[i]] - revImag[i] = imag[reverse[i]] - } - real = revReal - imag = revImag - } - - // lookup tables - private val sin by lazy { FloatArray(size) { i -> sin((-PI.toFloat() / i).toDouble()).toFloat() } } - private val cos by lazy { FloatArray(size) { i -> cos((-PI.toFloat() / i).toDouble()).toFloat() } } -} \ No newline at end of file diff --git a/orx-fft/src/commonMain/kotlin/HannWindow.kt b/orx-fft/src/commonMain/kotlin/HannWindow.kt deleted file mode 100644 index 87a2c429..00000000 --- a/orx-fft/src/commonMain/kotlin/HannWindow.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.openrndr.extra.fft - -import kotlin.math.PI -import kotlin.math.cos - -class HannWindow : WindowFunction() { - override fun value(length: Int, index: Int): Float = 0.5f * (1f - cos((PI * 2.0 * index / (length - 1f))) - .toFloat()) -} \ No newline at end of file diff --git a/orx-fft/src/commonMain/kotlin/IdentityWindow.kt b/orx-fft/src/commonMain/kotlin/IdentityWindow.kt deleted file mode 100644 index a5949796..00000000 --- a/orx-fft/src/commonMain/kotlin/IdentityWindow.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.openrndr.extra.fft - -class IdentityWindow - : WindowFunction() { - override fun value(length: Int, index: Int): Float = 1.0f -} \ No newline at end of file diff --git a/orx-fft/src/commonMain/kotlin/WindowFunction.kt b/orx-fft/src/commonMain/kotlin/WindowFunction.kt deleted file mode 100644 index 71939641..00000000 --- a/orx-fft/src/commonMain/kotlin/WindowFunction.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.openrndr.extra.fft - -abstract class WindowFunction { - private var length: Int = 0 - - /** - * Apply the window function to a sample buffer. - * - * @param samples a sample buffer - */ - fun apply(samples: FloatArray) { - this.length = samples.size - - for (n in samples.indices) { - samples[n] *= value(samples.size, n) - } - } - - /** - * Apply the window to a portion of this sample buffer, - * given an offset from the beginning of the buffer - * and the number of samples to be windowed. - * - * @param samples - * float[]: the array of samples to apply the window to - * @param offset - * int: the index in the array to begin windowing - * @param length - * int: how many samples to apply the window to - */ - fun apply(samples: FloatArray, offset: Int, length: Int) { - this.length = length - - for (n in offset until offset + length) { - samples[n] *= value(length, n - offset) - } - } - protected abstract fun value(length: Int, index: Int): Float -} \ No newline at end of file diff --git a/orx-fft/src/jvmDemo/kotlin/DemoFFTShape01.kt b/orx-fft/src/jvmDemo/kotlin/DemoFFTShape01.kt deleted file mode 100644 index ad29f35f..00000000 --- a/orx-fft/src/jvmDemo/kotlin/DemoFFTShape01.kt +++ /dev/null @@ -1,156 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.fft.FFT -import org.openrndr.extra.noise.scatter -import org.openrndr.extra.shapes.hobbycurve.hobbyCurve -import org.openrndr.extra.shapes.splines.catmullRom -import org.openrndr.extra.shapes.splines.toContour -import org.openrndr.math.Vector2 -import org.openrndr.math.smoothstep -import org.openrndr.math.transforms.buildTransform -import org.openrndr.shape.LineSegment -import kotlin.math.max -import kotlin.random.Random - -/** - * Demonstration of using FFT to filter a two-dimensional shape. Mouse xy-position is mapped - * to lowpass and highpass settings of the filter. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val fftSize = 512 - val fft = FFT(fftSize) - fun List.toFloatArrays(x: FloatArray, y: FloatArray) { - for ((index, segment) in this.withIndex()) { - x[index] = segment.x.toFloat() - y[index] = segment.y.toFloat() - } - } - - fun vectorsFromFloatArrays(x: FloatArray, y: FloatArray): List { - val n = x.size - val result = mutableListOf() - for (i in 0 until n) { - result.add(Vector2(x[i].toDouble(), y[i].toDouble())) - } - return result - } - - fun lp(t: Double, c: Double): Double { - return smoothstep(c, c - 0.1, t) - } - - fun hp(t: Double, c: Double): Double { - return smoothstep(c, c + 0.1, t) - } - - val c = hobbyCurve( - drawer.bounds.scatter(30.0, distanceToEdge = 100.0, random = Random(3)).filter { - Random.nextBoolean() - }, - true - ).transform(buildTransform { translate(-drawer.bounds.center) }) - - val x = FloatArray(fftSize) - val y = FloatArray(fftSize) - - val xFiltered = FloatArray(fftSize) - val yFiltered = FloatArray(fftSize) - - extend { - c.equidistantPositions(fftSize).toFloatArrays(x, y) - - // process x-component - fft.forward(x) - - drawer.stroke = ColorRGBa.GRAY.shade(0.5) - drawer.lineSegments((0 until fft.size / 2).map { - LineSegment( - it.toDouble() * 2.0 + 0.5, - height * 0.5, - it.toDouble() * 2.0 + 0.5, - height * 0.5 - fft.magnitude(it) / 200.0, - ) - }) - - - val xpower = fft.magnitudeSum() - - val hpc = mouse.position.x / width - val lpc = mouse.position.y / height - - for (i in 1..fftSize / 2) { - val t = i.toDouble() / (fftSize / 2 - 1) - val f = if (hpc <= lpc) lp(t, lpc) * hp(t, hpc) else max(lp(t, lpc), hp(t, hpc)) - fft.scaleBand(i, f.toFloat()) - } - val xfpower = fft.magnitudeSum().coerceAtLeast(1.0) - - fft.scaleAll((xpower / xfpower).toFloat()) - drawer.stroke = ColorRGBa.PINK.opacify(0.8) - drawer.lineSegments((0 until fft.size / 2).map { - LineSegment( - it.toDouble() * 2.0 + 0.5, - height * 0.5, - it.toDouble() * 2.0 + 0.5, - height * 0.5 - fft.magnitude(it) / 200.0 - ) - }) - - fft.inverse(xFiltered) - - // process y-component - fft.forward(y) - val ypower = fft.magnitudeSum() - - drawer.stroke = ColorRGBa.GRAY.shade(0.5) - drawer.lineSegments((0 until fft.size / 2).map { - LineSegment( - it * 2.0 + 0.5, - height * 0.5, - it * 2.0 + 0.5, - height * 0.5 + fft.magnitude(it) / 200.0, - ) - }) - - - for (i in 1..fftSize / 2) { - val t = i.toDouble() / (fftSize / 2 - 1) - val f = if (hpc <= lpc) lp(t, lpc) * hp(t, hpc) else max(lp(t, lpc), hp(t, hpc)) - fft.scaleBand(i, f.toFloat()) - } - - val yfpower = fft.magnitudeSum().coerceAtLeast(1.0) - - fft.scaleAll((ypower / yfpower).toFloat()) - drawer.stroke = ColorRGBa.PINK.opacify(0.7) - drawer.lineSegments((0 until fft.size / 2).map { - LineSegment( - it * 2.0 + 0.5, - height * 0.5, - it * 2.0 + 0.5, - height * 0.5 + fft.magnitude(it) / 200.0, - ) - }) - fft.inverse(yFiltered) - - val cr = vectorsFromFloatArrays(xFiltered, yFiltered).catmullRom(closed = true).toContour() - //val cr = ShapeContour.fromPoints(vectorsFromFloatArrays(xr, yr), closed=true) - - val recenteredShape = cr.transform(buildTransform { - translate(drawer.bounds.center) - }) - drawer.fill = null - drawer.stroke = ColorRGBa.WHITE - - drawer.lineSegment(mouse.position.x / width * 512, 0.0, mouse.position.x / width * 512, height * 1.0) - drawer.lineSegment(mouse.position.y / height * 512, 0.0, mouse.position.y / height * 512, height * 1.0) - - drawer.contour(recenteredShape) - } - } -} diff --git a/orx-fx/README.md b/orx-fx/README.md deleted file mode 100644 index c7e6a64c..00000000 --- a/orx-fx/README.md +++ /dev/null @@ -1,457 +0,0 @@ -# orx-fx - -Ready-to-use GPU-based visual effects or filters. Most include -[orx-parameters](https://github.com/openrndr/orx/tree/master/orx-parameters) annotations -so they can be easily controlled via orx-gui. - -The provided filters are based on OPENRNDR's -[`Filter` class](https://api.openrndr.org/openrndr-draw/org.openrndr.draw/-filter/index.html) - -All filters provided by orx-fx assume pre-multiplied alpha inputs, which is OPENRNDR's default. - -## Effects index - -Here's a (potentially incomplete) list of the effects provided by orx-fx. Explore [the source](https://github.com/openrndr/orx/tree/master/orx-fx/src/commonMain/kotlin) for an up-to-date list. - -### Anti-alias - - - `FXAA`, fast approximate anti-aliasing. - -### Blends - -Blend filters take two inputs ("source" and "destination"), they are intended to be used in `orx-compositor`'s layer blend. All blend filters are opacity preserving. - -#### Photoshop-style blends - - - `ColorBurn` - - `ColorDodge` - - `Darken` - - `HardLight` - - `Lighten` - - `Multiply` - - `Normal` - - `Overlay` - - `Screen` - - `Add`, add source and destination inputs - - `Subtract`, substract destination color from source color - -#### Porter-Duff blends - - - `SourceIn`, Porter-Duff source-in blend, intersect source and destination opacity and keep source colors - - `SourceOut`, Porter-Duff source-out blend, subtract destination from source opacity and keep source colors - - `SourceAtop`, Porter-Duff source-atop blend, uses destination opacity, layers source on top and keeps both colors - - `DestinationIn`, Porter-Duff destination-in blend, intersect source and destination opacity and keep source colors - - `DestinationOut`, Porter-Duff destination-out blend, subtract destination from source opacity and keep destination colors - - `DestinationAtop`, Porter-Duff destination-atop blend, uses source opacity, layers destination on top and keeps both colors - - `Xor`, Porter-Duff xor blend, picks colors from input with highest opacity or none with opacities are equal - -#### Various blends - - - `Passthrough`, pass source color and opacity. - -### Blurs - -Most blur effects are opacity preserving - - - `ApproximateGaussianBlur`, a somewhat faster but less precise implementation of `GaussianBlur` - - `Bloom`, a multi-pass bloom/glow effect - - `BoxBlur`, a simple but fast box blur - - `FrameBlur` - - `GaussianBlur`, a slow but precise Gaussian blur - - `HashBlur`, a noisy blur effect - - `LaserBlur` - - `LineBlur` - - `MipBloom` - - `ZoomBlur`, a directional blur with a zooming effect - - -### Color - - - `ChromaticAberration`, a chromatic aberration effect based on RGB color separation - - `ColorCorrection`, corrections for brightness, contrast, saturation and hue - - `ColorLookup`, Color LUT filter - - `ColorMix`, filter implementation of OPENRNDR's color matrix mixing - - `Duotone`, maps luminosity to two colors, very similar to `LumaMap` but uses LAB color interpolation. - - `DuotoneGradient`, a two-point gradient version of `Duotone` - - `Invert` - - `LumaMap`, maps luminosity to two colors - - `LumaOpacity`, maps luminosity to opacity but retains source color - - `LumaThreshold`, applies a treshold on the input luminosity and maps to two colors - - `Posterize`, a posterize effect - - `Sepia`, applies a reddish-brown monochrome tint that imitates an old photograph - - `SetBackground` - - `SubtractConstant`, subtract a constant color from the source color - -### Color conversion - - - `OkLabToRgb` - - `RgbToOkLab` - -### Distortion - -All distortion effects are opacity preserving - - - `BlockRepeat` - repeats a single configurable block of the source input - - `DisplaceBlend` - - `Fisheye` - - `FluidDistort` - - `Lenses` - - `HorizontalWave` - applies a horizontal wave effect on the source input - - `VerticalWave` - applies a vertical wave effect on the source input - - `PerspectivePlane` - applies a planar perspective distortion on the source input - - `Perturb` - - `PolarToRectangular` - - `RectangularToPolar` - - `StackRepeat` - repeats the source input in a stack fashion - - `StretchWaves` - - `TapeNoise` - - `Tiles` - - `VideoGlitch` - -### Dither - - - `ADither` - a selection of dithering effects - - `CMYKHalftone` - a configurable CMYK halftoning effect - - `Crosshatch` - crosshatching effect - - `LumaHalftone` - a halftoning effect based on luminosity - -### Edges - - - `LumaSobel` - A Sobel-kernel based luminosity edge detector - - `EdgesWork` - An edges filter doubling as erosion - - `Contour` - detects multi-level contours - - New: `CannyEdgeDetector` - -### Grain - - - `FilmGrain` - adds film-like grain to the source input - -### Shadow - - - `DropShadow` - adds a drop shadow based on the opacity in the input image - -### Tonemap - - - `Uncharted2Tonemap` - implements the Uncharted2 tonemapper - -### Transform - - - `FlipVertically` - flips the source input vertically. - -## `Post` extension - -The `Post` extension provides an easy way to apply filters to your drawings. Allocating -and resizing color buffers is all taken care of by `Post`. - -To get additional intermediate color buffers one can access `intermediate[x]` -```kotlin -fun main() = application { - configure { - windowResizable = true - } - program { - extend(Post()) { - val blur = ApproximateGaussianBlur() - val add = Add() - post { input, output -> - blur.window = 50 - blur.sigma = 50.0 - blur.apply(input, intermediate[0]) - add.apply(arrayOf(input, intermediate[0]), output) - } - } - extend { - drawer.circle(width / 2.0, height / 2.0, 100.0) - } - } -} -``` - -### Colormap - -Colormap filters operate only on the RED color channel. For example -depth maps from -[orx-depth-camera](https://github.com/openrndr/orx/tree/master/orx-depth-camera). - -They allow selection of `min` / `max` value range and applying exponential -shaping `curve` within this range: - -- `GrayscaleColormap` - maps to gray tones -- `SpectralZucconiColormap` - maps to natural light dispersion spectrum as described - by Alan Zucconi in the - [Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) - article. -- `TurboColormap` - maps to Turbo Colormap according to - [Turbo, An Improved Rainbow Colormap for Visualization](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html) - by Google. - - - - -## Demos -### DemoApproximateGaussianBlur01 - -Demonstrates how to use the [ApproximateGaussianBlur] effect to blur -a `colorBuffer`, in this case, an image loaded from disk. - -Notice the use of `createEquivalent()`, which creates a new `colorBuffer` -with the same size and properties as a source `colorBuffer`. - - -![DemoApproximateGaussianBlur01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoApproximateGaussianBlur01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoApproximateGaussianBlur01.kt) - -### DemoBlur01 - -Demonstrates 9 different blur effects. -The program draws two moving circles into a [RenderTarget], -then applies various blurs drawing them in 3 columns and 3 rows. - -Each type of blur has different parameters. -Not all parameters are demonstrated. - -![DemoBlur01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoBlur01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoBlur01.kt) - -### DemoCannyEdgeDetector01 - -Demonstrates the [CannyEdgeDetector] effect applied to a loaded -color photograph. - -![DemoCannyEdgeDetector01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoCannyEdgeDetector01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCannyEdgeDetector01.kt) - -### DemoColorDuotone01 - -This demo shows how to use the [Duotone] filter, -toggling the `labInterpolation` parameter every second on and off. - -The `foregroundColor` and `backgroundColor` parameters are -left to their defaults. - -![DemoColorDuotone01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColorDuotone01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorDuotone01.kt) - -### DemoColorDuotoneGradient01 - -The [DuotoneGradient] effect combines the Duotone effect -and a linear gradient: two duotone colors are applied on -one part of the image, and those colors are interpolated -to two other colors, applied in a different part of the image. - -The `rotation` parameter lets us specify in which direction -the interpolation happens (vertical, horizontal, or something else). - -![DemoColorDuotoneGradient01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColorDuotoneGradient01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorDuotoneGradient01.kt) - -### DemoColormapGrayscale - -The [GrayscaleColormap] uses the red channel of a colorBuffer -to produce a gray scale image. The `curve` parameter is used as -an exponent to bias the result up or down. 1.0 produces a linear -transformation. - -![DemoColormapGrayscaleKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColormapGrayscaleKt.png) - -[source code](src/jvmDemo/kotlin/DemoColormapGrayscale.kt) - -### DemoColormapSpectralZucconi - -Demonstrates the [SpectralZucconiColormap], which -maps values of the RED color channel to the natural light dispersion -spectrum as described by Alan Zucconi in his -[Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) -article. - -![DemoColormapSpectralZucconiKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColormapSpectralZucconiKt.png) - -[source code](src/jvmDemo/kotlin/DemoColormapSpectralZucconi.kt) - -### DemoColormapTurbo - -Demonstrates the use of the [TurboColormap] effect, which -maps values of the RED color channel to Turbo Colormap according to -[Turbo, An Improved Rainbow Colormap for Visualization](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html) -by Google. - -![DemoColormapTurboKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColormapTurboKt.png) - -[source code](src/jvmDemo/kotlin/DemoColormapTurbo.kt) - -### DemoColorPosterize01 - -Demonstration of the [Posterize] effect to reduce the number of colors -present in an image. - -![DemoColorPosterize01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoColorPosterize01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoColorPosterize01.kt) - -### DemoCompositeFilter01 - -Advanced demonstration of composite filters, created by chaining -several filters together using the `.then()` operator. - -The demo applies a [FilmGrain] effect and a [DirectionalBlur] effect twice -with different parameters. - -The [DirectionalBlur] requires a color buffer to define the displacement -directions. In this program, the direction color buffer is populated by writing -into its `shadow` property pixel by pixel. - -Notice the use of `frameCount` and `seconds` to animate the effects. - -The composite effect is installed as a post-processing effect -using `extend(Post())`, so anything drawn in following `extend` -blocks is affected by it. - -![DemoCompositeFilter01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoCompositeFilter01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoCompositeFilter01.kt) - -### DemoContour01 - -Demonstrates the [Contour] filter. -@author Edwin Jakobs - -This demo creates a grid of 2x2 to draw a loaded image four times, -each using the [Contour] effect with different parameters. - -`actions` is a variable containing a list of 4 functions. -Each of these functions sets the effect parameters to different values. - -The 4 grid cells and the 4 actions are used in pairs: -first the action is called to set the effect parameters, the -effect is applied, and the result is drawn in a cell. - -![DemoContour01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoContour01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoContour01.kt) - -### DemoDirectionalBlur01 - -Demonstrates how to use [DirectionalBlur] by creating a `direction` -ColorBuffer in which the red and green components of the pixels point -in various directions where to sample pixels from. All the pixel colors -of the ColorBuffer are set one by one using two for loops. - -Note the FLOAT32 color type of the buffer to allow for negative values, -so sampling can happen from every direction. - -Every 60 animation frames the `centerWindow` property is toggled -between true and false to demonstrate how the result changes. - - -![DemoDirectionalBlur01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoDirectionalBlur01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDirectionalBlur01.kt) - -### DemoDirectionalDisplace01 - -Demonstrate how to use [DirectionalDisplace]. - -The direction map is populated using `drawImage` instead of -pixel by pixel. A grid of circles is drawn, each circle with a -color based on simplex noise. The R and G channels of the colors -control the direction of the sampling. By animating the sampling -distance the result oscillates between no-effect and a noticeable one. - -![DemoDirectionalDisplace01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoDirectionalDisplace01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDirectionalDisplace01.kt) - -### DemoDirectionalDisplace02 - -Demonstrate how to use [DirectionalDisplace]. - -The program draws 12 overlapping translucent circles on the -`direction` color buffer to produce new color combinations -on the overlapping areas. Those colors specify where the -`DirectionalDisplace` effect will sample pixels from. - -![DemoDirectionalDisplace02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoDirectionalDisplace02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDirectionalDisplace02.kt) - -### DemoDistortLenses01 - -Demonstrates the [Lenses] effect, which by default subdivides a color buffer -in 8 columns and 6 rows, and displaces the source texture inside each rectangle. -Try experimenting with some of the other parameters, like `distort`. -You can even animate them. - -![DemoDistortLenses01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoDistortLenses01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDistortLenses01.kt) - -### DemoDitherLumaHalftone01 - -Demonstrates the [LumaHalftone] effect and moste of its parameters. -The `invert` parameter toggles between true and false once per second. -The `phase0` and `phase1` parameters depend on `seconds`, which makes -the pattern wobble slowly. - -![DemoDitherLumaHalftone01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoDitherLumaHalftone01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt) - -### DemoFluidDistort01 - -Demonstrates [FluidDistort], a fluid simulation real time effect. -All pixels are slowly displaced in a turbulent manner as if they were a gas or a liquid. - -![DemoFluidDistort01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoFluidDistort01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFluidDistort01.kt) - -### DemoOkLab01 - -This demonstrates converting a [ColorBuffer] from and to (OK)LAB color space using the [RgbToOkLab] and [OkLabToRgb] -filters. The (OK)Lab representation is signed and requires a floating point representation. - -![DemoOkLab01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoOkLab01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoOkLab01.kt) - -### DemoPost01 - -Demonstrates how to create an `extend` block to apply a post-processing effect. -The effect is an [ApproximateGaussianBlur] and its `sigma` parameter -is animated. The Blur effect is combined with whatever the user draws -in the regular `extend` block using the `Add` filter, resulting in -an additive composition. - -This demo also shows how to make a program window resizable. - -![DemoPost01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoPost01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoPost01.kt) - -### DemoSpectralBlend01 - -Demonstration of how to use the [BlendSpectral] filter to combine two images, using -this pigment-simulation color mixing approach. - -The program: -- generates two images -- blurs one of them -- creates and draws a checkers-pattern as the background -- mixes and draws both images - -The `fill` factor, which controls how the top and the bottom colors are mixed, is animated. - -The `clip` parameter is also animated and toggles every 6 seconds. - -![DemoSpectralBlend01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-fx/images/DemoSpectralBlend01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoSpectralBlend01.kt) diff --git a/orx-fx/build.gradle.kts b/orx-fx/build.gradle.kts deleted file mode 100644 index 0df4f6cd..00000000 --- a/orx-fx/build.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -val embedShaders = tasks.register("embedShaders") { - inputDir.set(file("$projectDir/src/shaders/glsl")) - outputDir.set(layout.buildDirectory.dir("generated/shaderKotlin")) - defaultPackage.set("org.openrndr.extra.fx") - defaultVisibility.set("internal") - namePrefix.set("fx_") -}.get() - - -kotlin { - kotlin.sourceSets.getByName("commonMain").kotlin.srcDir(embedShaders.outputDir) - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(project(":orx-color")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-color")) - implementation(project(":orx-fx")) - implementation(project(":orx-noise")) - implementation(project(":orx-shapes")) - implementation(project(":orx-image-fit")) - } - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/FilterTools.kt b/orx-fx/src/commonMain/kotlin/FilterTools.kt deleted file mode 100644 index 646e4f65..00000000 --- a/orx-fx/src/commonMain/kotlin/FilterTools.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.openrndr.extra.fx - -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.Shader -import org.openrndr.draw.filterShaderFromCode - -fun mppFilterShader(code: String, name: String) : Shader = filterShaderFromCode(code, name, includeShaderConfiguration = true) - -internal data class ColorBufferDescription(val width: Int, val height: Int, val contentScale: Double, val format: ColorFormat, val type: ColorType) diff --git a/orx-fx/src/commonMain/kotlin/Post.kt b/orx-fx/src/commonMain/kotlin/Post.kt deleted file mode 100644 index ca1b93a9..00000000 --- a/orx-fx/src/commonMain/kotlin/Post.kt +++ /dev/null @@ -1,118 +0,0 @@ -package org.openrndr.extra.fx - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -class Post : Extension { - override var enabled = true - - private var inputTarget: RenderTarget? = null - private var resolved: ColorBuffer? = null - - /** - * The color type to use for the intermediate color buffers - */ - var intermediateType = ColorType.UINT8_SRGB - - /** - * The color type to use for the output color buffer - */ - var outputType = ColorType.UINT8_SRGB - - /** - * The color type to use for the input buffer - */ - var inputType = ColorType.UINT8_SRGB - - /** - * The depth format to use for the input buffer - */ - var inputDepthFormat = DepthFormat.DEPTH_STENCIL - - private var output: ColorBuffer? = null - private var postFunction = { input: ColorBuffer, output: ColorBuffer -> input.copyTo(output) } - - inner class IntermediateBuffers { - internal val buffers = mutableMapOf() - operator fun get(index: Int): ColorBuffer { - return buffers.getOrPut(index) { - colorBuffer(output!!.width, output!!.height, output!!.contentScale, type = intermediateType) - } - } - } - - /** - * Intermediate buffer pool, provides automatically allocated color buffers - */ - val intermediate = IntermediateBuffers() - - /** - * Set the post function - * @param function the post function - */ - fun post(function: (input: ColorBuffer, output: ColorBuffer) -> Unit) { - postFunction = function - } - - override fun beforeDraw(drawer: Drawer, program: Program) { - val art = RenderTarget.active - val lit = inputTarget - if (lit != null) { - // in case the attributes of the existing buffers no longer match those of the active render target - if (lit.width != art.width || lit.height != art.height || lit.contentScale != art.contentScale || lit.multisample != art.multisample) { - lit.colorBuffer(0).destroy() - lit.depthBuffer?.destroy() - lit.detachDepthBuffer() - lit.detachColorAttachments() - lit.destroy() - inputTarget = null - - resolved?.destroy() - resolved = null - - output?.destroy() - output = null - - for (buffer in intermediate.buffers.values) { - buffer.destroy() - } - intermediate.buffers.clear() - } - } - if (inputTarget == null) { - // create new targets and buffers - inputTarget = renderTarget(art.width, art.height, art.contentScale, multisample = art.multisample) { - colorBuffer(type = inputType) - depthBuffer(format = inputDepthFormat) - } - if (art.multisample != BufferMultisample.Disabled) { - resolved = colorBuffer(art.width, art.height, art.contentScale) - } - output = colorBuffer(art.width, art.height, art.contentScale, type = outputType) - } - // bind input target, the next extensions will draw into it - inputTarget!!.bind() - drawer.clear(ColorRGBa.TRANSPARENT) - } - - override fun afterDraw(drawer: Drawer, program: Program) { - inputTarget!!.unbind() - - if (resolved != null) { - inputTarget!!.colorBuffer(0).copyTo(resolved!!) - } - - val postInput = resolved ?: inputTarget!!.colorBuffer(0) - - // invoke the user provided post-processing function - postFunction(postInput, output!!) - - // visualize the results - drawer.isolated { - drawer.defaults() - drawer.image(output!!) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/antialias/FXAA.kt b/orx-fx/src/commonMain/kotlin/antialias/FXAA.kt deleted file mode 100644 index 5ca822b2..00000000 --- a/orx-fx/src/commonMain/kotlin/antialias/FXAA.kt +++ /dev/null @@ -1,46 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.antialias - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_fxaa -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * FXAA approximate antialiasing filter. Only works on LDR inputs - */ -@Description("FXAA") -class FXAA : Filter1to1( mppFilterShader(fx_fxaa, "fxaa")) { - /** - * luma threshold, default value is 0.5 - */ - @DoubleParameter("luma threshold", 0.0, 1.0) - var lumaThreshold: Double by parameters - - /** - * max search span, default value is 8.0 - */ - @DoubleParameter("max search span", 1.0, 16.0) - var maxSpan: Double by parameters - - /** - * direction reduce multiplier, default value is 0.0 - */ - @DoubleParameter("direction reduce multiplier", 0.0, 1.0) - var directionReduceMultiplier: Double by parameters - - /** - * direction reduce minimum, default value is 0.0 - */ - @DoubleParameter("direction reduce minium", 0.0, 1.0) - var directionReduceMinimum: Double by parameters - - init { - lumaThreshold = 0.5 - maxSpan = 8.0 - directionReduceMinimum = 0.0 - directionReduceMultiplier = 0.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blend/BlendFilters.kt b/orx-fx/src/commonMain/kotlin/blend/BlendFilters.kt deleted file mode 100644 index c72d0738..00000000 --- a/orx-fx/src/commonMain/kotlin/blend/BlendFilters.kt +++ /dev/null @@ -1,127 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blend - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.Filter2to1 -import org.openrndr.extra.fx.* -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.DoubleParameter - -class ColorBurn : Filter2to1(mppFilterShader(fx_color_burn, "color-burn")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class ColorDodge : Filter2to1(mppFilterShader(fx_color_dodge, "color-dodge")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class Darken : Filter2to1(mppFilterShader(fx_darken, "darken")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class HardLight : Filter2to1(mppFilterShader(fx_hard_light, "hard-light")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class Lighten : Filter2to1(mppFilterShader(fx_lighten, "lighten")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class Multiply : Filter2to1(mppFilterShader(fx_multiply,"multiply")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class Normal : Filter2to1(mppFilterShader(fx_normal, "normal")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - @DoubleParameter("opacity A", 0.0, 1.0) - var opacityA: Double by parameters - - @DoubleParameter("opacity B", 0.0, 1.0) - var opacityB: Double by parameters - - init { - clip = false - opacityA = 1.0 - opacityB = 1.0 - } -} - -class Overlay : Filter2to1(mppFilterShader(fx_overlay, "overlay")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - -class Screen : Filter2to1(mppFilterShader(fx_screen, "screen")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} - - -class SourceIn : Filter2to1(mppFilterShader(fx_source_in, "source-in")) -class SourceOut : Filter2to1(mppFilterShader(fx_source_out,"source-out")) -class SourceAtop : Filter2to1(mppFilterShader(fx_source_atop, "source-atop")) -class DestinationIn : Filter2to1(mppFilterShader(fx_destination_in, "destination-in")) -class DestinationOut : Filter2to1(mppFilterShader(fx_destination_out, "destination-out")) -class DestinationAtop : Filter2to1(mppFilterShader(fx_destination_atop, "destination-atop")) -class Xor : Filter2to1(mppFilterShader(fx_xor, "xor")) - -class MultiplyContrast : Filter2to1(mppFilterShader(fx_multiply_contrast, "multiply-contrast")) - -class Passthrough : Filter1to1(mppFilterShader(fx_passthrough, "passthrough")) -class Add : Filter2to1(mppFilterShader(fx_add, "add")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} -class Subtract : Filter2to1(mppFilterShader(fx_subtract,"subtract")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - init { - clip = false - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt b/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt deleted file mode 100644 index 84837fff..00000000 --- a/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt +++ /dev/null @@ -1,82 +0,0 @@ -package org.openrndr.extra.fx.blend - -import org.openrndr.draw.Filter2to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_spectral -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -private val spectralBlendShader = """// includes -${fx_spectral} -// filter code -uniform sampler2D tex0; -uniform sampler2D tex1; -in vec2 v_texCoord0; - -out vec4 o_color; - -uniform float fill; -uniform bool clip; - -void main() { - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - - // depremultiply alpha - vec4 na = a.a == 0.0 ? vec4(0.0): vec4(a.rgb / a.a,a.a); - vec4 nb = b.a == 0.0 ? vec4(0.0): vec4(b.rgb / b.a,b.a); - - - - vec4 mixed = vec4(spectral_mix(na.rgb, nb.rgb, min(1.0, fill)), 1.0); - - if (!clip) { - na.rgb *= a.a; - nb.rgb *= b.a; - mixed = na * (1.0 - nb.a) + nb * (1.0 - na.a) + mixed * na.a * nb.a; - } else { - mixed = mixed * na.a * nb.a; - } - - mixed.rgb = mixed.a == 0.0 ? vec3(0.0): mixed.rgb / mixed.a; - - -// premultiply alpha - mixed.rgb *= mixed.a; - - - o_color = mixed; -} - -""" - -/** - * Blend based on pigment simulation - */ -@Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") -@Description("Blend spectral") -class BlendSpectral : Filter2to1(filterShaderFromCode(spectralBlendShader, "blend-spectral")) { - @BooleanParameter("source clip") - var clip: Boolean by parameters - - @BooleanParameter("linearize input A") - var linearizeInputA: Boolean by parameters - - @BooleanParameter("linearize input B") - var linearizeInputB: Boolean by parameters - - @BooleanParameter("delinearize output") - var delinearizeOutput: Boolean by parameters - - @DoubleParameter("fill", 0.0, 1.0) - var fill: Double by parameters - - init { - clip = false - linearizeInputA = true - linearizeInputB = true - delinearizeOutput = true - fill = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/ApproximateGaussianBlur.kt b/orx-fx/src/commonMain/kotlin/blur/ApproximateGaussianBlur.kt deleted file mode 100644 index b2fe5fae..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/ApproximateGaussianBlur.kt +++ /dev/null @@ -1,85 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.ColorBufferDescription -import org.openrndr.extra.fx.fx_approximate_gaussian_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -/** - * Approximate separated Gaussian blur - */ -@Description("Approximate Gaussian blur") -class ApproximateGaussianBlur : Filter1to1(mppFilterShader(fx_approximate_gaussian_blur, "approximate gaussian blur")) { - - @BooleanParameter("wrap u") - var wrapU = false - - @BooleanParameter("wrap v") - var wrapV = false - - - /** - * blur sample window, default value is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int by parameters - - /** - * spread multiplier, default value is 1.0 - */ - @DoubleParameter("kernel spread", 1.0, 4.0) - var spread: Double by parameters - - /** - * blur sigma, default value is 1.0 - */ - @DoubleParameter("kernel sigma", 0.0, 25.0) - var sigma: Double by parameters - - /** - * post blur gain, default value is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - private var intermediateCache = mutableMapOf() - - init { - window = 5 - spread = 1.0 - gain = 1.0 - sigma = 1.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - val intermediateDescription = ColorBufferDescription(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - val intermediate = intermediateCache.getOrPut(intermediateDescription) { - colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - intermediate.let { - parameters["wrapU"] = if (wrapU) 1 else 0 - parameters["wrapV"] = if (wrapV) 1 else 0 - parameters["blurDirection"] = Vector2(1.0, 0.0) - super.apply(source, arrayOf(it), clip) - - parameters["blurDirection"] = Vector2(0.0, 1.0) - super.apply(arrayOf(it), target, clip) - } - } - - override fun close() { - intermediateCache.values.forEach { it.close() } - intermediateCache.clear() - super.close() - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/Bloom.kt b/orx-fx/src/commonMain/kotlin/blur/Bloom.kt deleted file mode 100644 index 530e1773..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/Bloom.kt +++ /dev/null @@ -1,89 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Add -import org.openrndr.extra.fx.fx_bloom -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -@Description("Bloom") -class Bloom(blur: Filter = ApproximateGaussianBlur()) : Filter1to1(mppFilterShader(fx_bloom, "bloom")) { - /** - * the blur filter to use for the bloom, default is Approximate Gaussian Blur - */ - var blur: Filter = blur - - /** - * number of downsampled textures to use, default value is 2 - */ - @IntParameter("blur iterations", 1, 8) - var downsamples: Int = 2 - - /** - * rate of downsampling, f.ex: 4 -> 4x, 8x, 16x.., default value is 2 - */ - @IntParameter("downsamping rate", 1, 4) - var downsampleRate: Int = 2 - - /** - * blending amount between original image and blurred, default value is 0.5 - */ - @DoubleParameter("blend factor", 0.0, 1.0) - var blendFactor: Double by parameters - - /** - * brightness of the resulting image, default value is 0.5 - */ - @DoubleParameter("brightness", 0.0, 1.0) - var brightness: Double by parameters - - init { - blendFactor = 0.5 - brightness = 0.5 - } - - private val samplers: MutableList> = mutableListOf() - private var lastDownsampleRate = 0 - - private val blendAdd = Add() - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - val src = source[0] - val dest = target[0] - - if (samplers.isEmpty() || samplers.size != downsamples || lastDownsampleRate != downsampleRate) { - samplers.clear() - - lastDownsampleRate = downsampleRate - - for (downsample in 0 until downsamples) { - val div = 1 shl downsample - val bufferA = colorBuffer(dest.width / div, dest.height / div, 1.0, target[0].format, ColorType.FLOAT16) - val bufferB = colorBuffer(dest.width / div, dest.height / div, 1.0, target[0].format, ColorType.FLOAT16) - samplers.add(Pair(bufferA, bufferB)) - } - } - - for ((bufferA, _) in samplers) { - blur.apply(src, bufferA) - } - - for ((index, buffers) in samplers.asReversed().withIndex()) { - val (bufferCurrA) = buffers - - if (index + 1 <= samplers.lastIndex) { - val (bufferNextA, bufferNextB) = samplers.asReversed()[index + 1] - - blur.apply(bufferCurrA, bufferNextB) - blendAdd.apply(arrayOf(bufferNextA, bufferNextB), bufferNextA) - } else { - super.apply(arrayOf(src, bufferCurrA), target, clip) - } - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/BoxBlur.kt b/orx-fx/src/commonMain/kotlin/blur/BoxBlur.kt deleted file mode 100644 index 5d37a29d..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/BoxBlur.kt +++ /dev/null @@ -1,65 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_box_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -/** - * BoxBlur implemented as a separable filter - */ -@Description("Box-blur") -class BoxBlur : Filter1to1(mppFilterShader(fx_box_blur,"box-blur")) { - - data class ColorBufferDescription(val width: Int, val height: Int, val contentScale: Double, val format: ColorFormat, val type: ColorType) - - /** - * The sample window, default is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int by parameters - - /** - * Spread multiplier, default is 1.0 - */ - @DoubleParameter("kernel spread", 1.0, 4.0) - var spread: Double by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - private var intermediateCache = mutableMapOf() - - init { - window = 5 - spread = 1.0 - gain = 1.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - val intermediateDescription = ColorBufferDescription(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - val intermediate = intermediateCache.getOrPut(intermediateDescription) { - colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - parameters["wrapX"] = false - parameters["wrapY"] = false - intermediate.let { - parameters["blurDirection"] = Vector2(1.0, 0.0) - super.apply(source, arrayOf(it), clip) - - parameters["blurDirection"] = Vector2(0.0, 1.0) - super.apply(arrayOf(it), target, clip) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/DirectionalBlur.kt b/orx-fx/src/commonMain/kotlin/blur/DirectionalBlur.kt deleted file mode 100644 index d723db15..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/DirectionalBlur.kt +++ /dev/null @@ -1,71 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - - -import org.openrndr.draw.Filter2to1 -import org.openrndr.extra.fx.fx_directional_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -/** - * Directional blur filter. Takes source image and direction buffer inputs - */ -@Description("Directional blur") -class DirectionalBlur : Filter2to1(mppFilterShader(fx_directional_blur, "directional-blur")) { - - /** - * Should the blur window be centered, default is false - */ - @BooleanParameter("center window") - var centerWindow: Boolean by parameters - - /** - * The sample window: how many samples to mix. The default is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int by parameters - - /** - * Spread multiplier: the distance in pixels between sampled pixels. The default is 1.0 - */ - @DoubleParameter("kernel spread", 1.0, 4.0) - var spread: Double by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - /** - * Should filter use directions perpendicular to those in the direction buffer? default is false - */ - @BooleanParameter("perpendicular") - var perpendicular: Boolean by parameters - - /** - * Wrap around left and right edges - */ - @BooleanParameter("wrapX") - var wrapX: Boolean by parameters - - /** - * Wrap around top and bottom edges - */ - @BooleanParameter("wrapY") - var wrapY: Boolean by parameters - - init { - window = 5 - spread = 1.0 - gain = 1.0 - perpendicular = false - centerWindow = false - wrapX = false - wrapY = false - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/FrameBlur.kt b/orx-fx/src/commonMain/kotlin/blur/FrameBlur.kt deleted file mode 100644 index 00e5b0e9..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/FrameBlur.kt +++ /dev/null @@ -1,61 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.extra.fx.fx_frame_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.shape.Rectangle - -@Description("Frame blur") -class FrameBlur(val colorType: ColorType = ColorType.FLOAT16) : - Filter1to1(mppFilterShader(fx_frame_blur, "frame-blur")) { - - @DoubleParameter("blend", 0.0, 1.0) - var blend: Double by parameters - - - val pt = Passthrough() - private var intermediate: ColorBuffer? = null - private var intermediate2: ColorBuffer? = null - - init { - blend = 0.5 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - if (source.isNotEmpty() && target.isNotEmpty()) { - intermediate?.let { - if (it.isEquivalentTo(target[0], ignoreFormat = true, ignoreLevels = true)) { - it.destroy() - intermediate = null - } - } - intermediate2?.let { - if (it.isEquivalentTo(target[0], ignoreFormat = true, ignoreLevels = true)) { - it.destroy() - intermediate2 = null - } - } - - if (intermediate == null) { - intermediate = target[0].createEquivalent(type = colorType) - intermediate?.fill(ColorRGBa.TRANSPARENT) - } - if (intermediate2 == null) { - intermediate2 = target[0].createEquivalent(type = colorType) - intermediate2?.fill(ColorRGBa.TRANSPARENT) - } - - super.apply(arrayOf(source[0], intermediate!!), arrayOf(intermediate2!!), clip) - - pt.apply(intermediate2!!, intermediate!!) - pt.apply(intermediate!!, target[0]) - } - } -} diff --git a/orx-fx/src/commonMain/kotlin/blur/GaussianBlur.kt b/orx-fx/src/commonMain/kotlin/blur/GaussianBlur.kt deleted file mode 100644 index 0fe32c82..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/GaussianBlur.kt +++ /dev/null @@ -1,49 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_gaussian_blur -import org.openrndr.extra.fx.mppFilterShader - -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -/** - * Exact Gaussian blur, implemented as a single pass filter - */ -@Description("Gaussian blur") -class GaussianBlur : Filter1to1(mppFilterShader(fx_gaussian_blur,"gaussian-blur")) { - - /** - * The sample window, default value is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int by parameters - - /** - * Spread multiplier, default value is 1.0 - */ - @DoubleParameter("kernel spread", 1.0, 4.0) - var spread: Double by parameters - - /** - * Blur kernel sigma, default value is 1.0 - */ - @DoubleParameter("kernel sigma", 0.0, 25.0) - var sigma: Double by parameters - - /** - * Post-blur gain, default value is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - init { - window = 5 - spread = 1.0 - sigma = 1.0 - gain = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/HashBlur.kt b/orx-fx/src/commonMain/kotlin/blur/HashBlur.kt deleted file mode 100644 index 54692899..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/HashBlur.kt +++ /dev/null @@ -1,165 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.Filter2to1 -import org.openrndr.draw.Filter3to1 -import org.openrndr.extra.fx.fx_directional_hash_blur -import org.openrndr.extra.fx.fx_hash_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -@Description("Hash blur") -class HashBlur : Filter1to1(mppFilterShader(fx_hash_blur, "hash-blur")) { - private var dynamic: Boolean by parameters - - - /** - * Blur radius in pixels, default is 5.0 - */ - @DoubleParameter("blur radius", 1.0, 25.0) - var radius: Double by parameters - - /** - * Time/seed, this should be fed with seconds, default is 0.0 - */ - var time: Double by parameters - - /** - * Number of samples, default is 30 - */ - @IntParameter("number of samples", 1, 100) - var samples: Int by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("image gain", 0.0, 2.0) - var gain: Double by parameters - - init { - dynamic = false - radius = 5.0 - time = 0.0 - samples = 30 - gain = 1.0 - } -} - -@Description("Hash blur") -class HashBlurDynamic: Filter2to1(mppFilterShader(fx_hash_blur, "hash-blur")) { - - private var dynamic: Boolean by parameters - - /** - * Blur radius in pixels, default is 5.0 - */ - @DoubleParameter("blur radius", 1.0, 25.0) - var radius: Double by parameters - - /** - * Time/seed, this should be fed with seconds, default is 0.0 - */ - var time: Double by parameters - - /** - * Number of samples, default is 30 - */ - @IntParameter("number of samples", 1, 100) - var samples: Int by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("image gain", 0.0, 2.0) - var gain: Double by parameters - - init { - dynamic = true - radius = 5.0 - time = 0.0 - samples = 30 - gain = 1.0 - } -} - -@Description("Directional hash blur") -class DirectionalHashBlur : Filter2to1(mppFilterShader(fx_directional_hash_blur, "directional-hash-blur")) { - - /** - * Blur radius in pixels, default is 5.0 - */ - @DoubleParameter("blur radius", 0.0, 25.0) - var radius: Double by parameters - - @DoubleParameter("blur spread", 0.0, 25.0) - var spread: Double by parameters - - - /** - * Time/seed, this should be fed with seconds, default is 0.0 - */ - var time: Double by parameters - - /** - * Number of samples, default is 30 - */ - @IntParameter("number of samples", 1, 100) - var samples: Int by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("image gain", 0.0, 2.0) - var gain: Double by parameters - - init { - radius = 5.0 - spread = 25.0 - time = 0.0 - samples = 30 - gain = 1.0 - } -} - -@Description("Directional hash blur") -class DirectionalHashBlurDynamic : Filter3to1(mppFilterShader("#define RADIUS_FROM_TEXTURE\n${fx_directional_hash_blur}", "directional-hash-blur")) { - - /** - * Blur radius in pixels, default is 5.0 - */ - @DoubleParameter("blur radius", 0.0, 25.0) - var radius: Double by parameters - - @DoubleParameter("blur spread", 0.0, 25.0) - var spread: Double by parameters - - - /** - * Time/seed, this should be fed with seconds, default is 0.0 - */ - var time: Double by parameters - - /** - * Number of samples, default is 30 - */ - @IntParameter("number of samples", 1, 100) - var samples: Int by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("image gain", 0.0, 2.0) - var gain: Double by parameters - - init { - radius = 5.0 - spread = 25.0 - time = 0.0 - samples = 30 - gain = 1.0 - } -} diff --git a/orx-fx/src/commonMain/kotlin/blur/LaserBlur.kt b/orx-fx/src/commonMain/kotlin/blur/LaserBlur.kt deleted file mode 100644 index 63b8b01a..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/LaserBlur.kt +++ /dev/null @@ -1,105 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_laser_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle -import kotlin.math.pow - -private class LaserBlurPass : Filter(mppFilterShader(fx_laser_blur, "laser-blur")) { - var radius: Double by parameters - var amp0: Double by parameters - var amp1: Double by parameters - var center: Vector2 by parameters - var vignette: Double by parameters - var vignetteSize: Double by parameters - var aberration: Double by parameters - - init { - radius = 0.0 - amp0 = 1.0 - amp1 = 1.0 - center = Vector2.ZERO - vignette = 0.0 - vignetteSize = 1.0 - aberration = 0.0 - } -} - -@Description("Laser blur") -class LaserBlur : Filter1to1(null) { - @Vector2Parameter("center", order = 0) - var center = Vector2.ZERO - - @DoubleParameter("radius", -2.0, 2.0, order = 1) - var radius = -0.18 - - @DoubleParameter("amp0", 0.0, 1.0, order = 2) - var amp0 = 0.5 - - @DoubleParameter("amp1", 0.0, 1.0, order = 3) - var amp1 = 0.5 - - @DoubleParameter("vignette", 0.0, 1.0, order = 4) - var vignette = 0.0 - - @DoubleParameter("vignette size", 0.0, 1.0, order = 5) - var vignetteSize = 0.0 - - @DoubleParameter("aberration", -1.0, 1.0, order = 6) - var aberration = 0.006 - - @DoubleParameter("exp", -1.0, 1.0, order = 7) - var exp = 0.739 - - @DoubleParameter("phase", -1.0, 1.0, order = 7) - var phase = 0.0 - - - private val pass = LaserBlurPass() - - @IntParameter("passes", 2, 32, order = 4) - var passes = 15 - - val intermediates = mutableListOf() - - override fun apply(source: Array, target: Array, clip:Rectangle?) { - pass.center = center - pass.radius = radius - pass.amp0 = amp0 - pass.amp1 = amp1 - pass.vignette = vignette - pass.vignetteSize = vignetteSize - pass.aberration = aberration - - if ((!intermediates.all { it.isEquivalentTo(source[0], ignoreFormat = true, ignoreType = true) })) { - intermediates.forEach { - it.destroy() - } - intermediates.clear() - } - if (intermediates.size == 0) { - intermediates.add(source[0].createEquivalent(type = ColorType.FLOAT16)) - intermediates.add(source[0].createEquivalent(type = ColorType.FLOAT16)) - } - - pass.radius = 1.0 + pow(exp, 0.0) * radius - - pass.apply(source[0], intermediates[0], clip) - for (i in 0 until passes - 1) { - - pass.radius = 1.0 + pow(exp, i + 1.0) * radius //(1.0 + simplex(0, phase + i)) / 2.0 - pass.apply(intermediates[i % 2], intermediates[(i + 1) % 2], clip) - } - pass.radius = 1.0 + pow(exp, (passes) * 1.0) * radius - pass.apply(intermediates[(passes + 1) % 2], target[0], clip) - } -} - -private fun pow(a: Double, x: Double): Double { - return a.pow(x) -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/LineBlur.kt b/orx-fx/src/commonMain/kotlin/blur/LineBlur.kt deleted file mode 100644 index a3d439a5..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/LineBlur.kt +++ /dev/null @@ -1,68 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_box_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter - -import org.openrndr.math.Vector2 -import org.openrndr.math.asRadians -import org.openrndr.shape.Rectangle -import kotlin.math.cos -import kotlin.math.sin - -/** - * BoxBlur implemented as a separable filter - */ -@Description("Line blur") -class LineBlur : Filter1to1(mppFilterShader(fx_box_blur, "line-blur")) { - - /** - * The sample window, default is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int by parameters - - /** - * Spread multiplier, default is 1.0 - */ - @DoubleParameter("kernel spread", 1.0, 4.0) - var spread: Double by parameters - - /** - * Post-blur gain, default is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - - @DoubleParameter("blur angle", -180.0, 180.0) - var blurAngle: Double by parameters - - @BooleanParameter("wrap x", order = 9) - var wrapX: Boolean by parameters - - @BooleanParameter("wrap y", order = 10) - var wrapY: Boolean by parameters - - - - init { - window = 5 - spread = 1.0 - gain = 1.0 - blurAngle = 0.0 - wrapX = false - wrapY = false - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - parameters["blurDirection"] = Vector2(cos(blurAngle.asRadians), sin(blurAngle.asRadians)) - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/MipBloom.kt b/orx-fx/src/commonMain/kotlin/blur/MipBloom.kt deleted file mode 100644 index 94849f99..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/MipBloom.kt +++ /dev/null @@ -1,155 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_bloom_combine -import org.openrndr.extra.fx.fx_bloom_downscale -import org.openrndr.extra.fx.fx_bloom_upscale -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -class BloomDownscale : Filter(mppFilterShader(fx_bloom_downscale,"bloom-downscale")) - -class BloomUpscale : Filter(mppFilterShader(fx_bloom_upscale, "bloom-upscale")) { - var gain: Double by parameters - var shape: Double by parameters - var noiseSeed: Double by parameters - var noiseGain: Double by parameters - - init { - gain = 1.0 - shape = 1.0 - noiseSeed = 1.0 - noiseGain = 0.25 - } -} - -class BloomCombine : Filter(mppFilterShader(fx_bloom_combine, "bloom-combine")) { - var gain: Double by parameters - var pregain: Double by parameters - var bias: ColorRGBa by parameters - - init { - bias = ColorRGBa.BLACK - gain = 1.0 - pregain = 1.0 - } -} - -@Description("MipBloom") -open class MipBloom(val blur: T) : Filter1to1(mppFilterShader(fx_bloom_combine, "bloom-combine")) { - var passes = 6 - - @DoubleParameter("shape", 0.0, 4.0) - var shape: Double = 1.0 - - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double = 1.0 - - @DoubleParameter("pregain", 0.0, 4.0) - var pregain: Double = 1.0 - - - /** - * noise gain. low noise gains will result in visible banding of the image. default value is 0.25 - */ - @DoubleParameter("noise gain", 0.0, 1.0) - var noiseGain: Double = 0.25 - - @DoubleParameter("noise seed", 0.0, 1000.0) - var noiseSeed: Double = 0.0 - var intermediates = mutableListOf() - var blurred = mutableListOf() - - val upscale = BloomUpscale() - val downScale = BloomDownscale() - val combine = BloomCombine() - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - - upscale.shape = shape - if (intermediates.size != passes - || (intermediates.isNotEmpty() && (!intermediates[0].isEquivalentTo(target[0], ignoreType = true, ignoreFormat = true)))) { - intermediates.forEach { - it.destroy() - } - blurred.forEach { - it.destroy() - } - intermediates.clear() - blurred.clear() - - for (pass in 0 until passes) { - val tdiv = 1 shl (pass + 1) - val cb = colorBuffer(target[0].width / tdiv, target[0].height / tdiv, type = ColorType.FLOAT32) - intermediates.add(cb) - val cbb = colorBuffer(target[0].width / tdiv, target[0].height / tdiv, type = ColorType.FLOAT32) - blurred.add(cbb) - } - } - - upscale.noiseGain = noiseGain - upscale.noiseSeed = noiseSeed - downScale.apply(source[0], intermediates[0], clip) - blur.apply(intermediates[0], blurred[0], clip) - - for (pass in 1 until passes) { - downScale.apply(blurred[pass - 1], intermediates[pass], clip) - blur.apply(intermediates[pass], blurred[pass], clip) - } - - upscale.apply(blurred.toTypedArray(), arrayOf(target[0]), clip) - combine.gain = gain - combine.pregain = pregain - combine.apply(arrayOf(source[0], target[0]), target, clip) - } -} - -@Description("Hash bloom") -class HashBloom : MipBloom(blur = HashBlur()) { - - /** - * Blur radius in pixels, default is 5.0 - */ - @DoubleParameter("blur radius", 1.0, 25.0) - var radius: Double = 5.0 - - /** - * Number of samples, default is 30 - */ - @IntParameter("number of samples", 1, 100) - var samples: Int = 30 - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - blur.radius = radius - blur.samples = samples - super.apply(source, target, clip) - } -} - -@Description("Gaussian bloom") -class GaussianBloom : MipBloom(blur = GaussianBlur()) { - /** - * blur sample window, default value is 5 - */ - @IntParameter("window size", 1, 25) - var window: Int = 5 - - /** - * blur sigma, default value is 1.0 - */ - @DoubleParameter("kernel sigma", 0.0, 25.0) - var sigma: Double = 1.0 - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - blur.window = window - blur.sigma = sigma - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/blur/ZoomBlur.kt b/orx-fx/src/commonMain/kotlin/blur/ZoomBlur.kt deleted file mode 100644 index 7b8b673f..00000000 --- a/orx-fx/src/commonMain/kotlin/blur/ZoomBlur.kt +++ /dev/null @@ -1,46 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.blur - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_zoom_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -@Description("Zoom Blur") -class ZoomBlur : Filter1to1(mppFilterShader(fx_zoom_blur, "zoom-blur")) { - var center: Vector2 by parameters - - @DoubleParameter("strength", 0.0, 1.0) - var strength: Double by parameters - - init { - center = Vector2.ONE / 2.0 - strength = 0.2 - } - - private var intermediate: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - intermediate?.let { - if (it.width != target[0].width || it.height != target[0].height) { - intermediate = null - } - } - - if (intermediate == null) { - intermediate = - colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - intermediate?.let { - parameters["dimensions"] = Vector2(it.effectiveWidth.toDouble(), it.effectiveHeight.toDouble()) - super.apply(source, arrayOf(it), clip) - it.copyTo(target[0]) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/ChromaticAberration.kt b/orx-fx/src/commonMain/kotlin/color/ChromaticAberration.kt deleted file mode 100644 index 3736306b..00000000 --- a/orx-fx/src/commonMain/kotlin/color/ChromaticAberration.kt +++ /dev/null @@ -1,46 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_chromatic_aberration -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -@Description("Chromatic Aberration") -class ChromaticAberration : Filter1to1(mppFilterShader(fx_chromatic_aberration, "chromatic-aberration")) { - /** - * aberration factor, default value is 8.0 - */ - @DoubleParameter("aberration factor", 0.0, 16.0) - var aberrationFactor: Double by parameters - - init { - aberrationFactor = 8.0 - } - - private var intermediate: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - - intermediate?.let { - if (it.width != target[0].width || it.height != target[0].height) { - intermediate = null - } - } - - if (intermediate == null) { - intermediate = colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - intermediate?.let { - parameters["dimensions"] = Vector2(it.effectiveWidth.toDouble(), it.effectiveHeight.toDouble()) - super.apply(source, arrayOf(it), clip) - it.copyTo(target[0]) - } - } -} diff --git a/orx-fx/src/commonMain/kotlin/color/ColorCorrection.kt b/orx-fx/src/commonMain/kotlin/color/ColorCorrection.kt deleted file mode 100644 index 96d61386..00000000 --- a/orx-fx/src/commonMain/kotlin/color/ColorCorrection.kt +++ /dev/null @@ -1,44 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_color_correction -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Color correction") -class ColorCorrection : Filter1to1(mppFilterShader(fx_color_correction, "color-correction")) { - @DoubleParameter("brightness", -1.0, 1.0, order = 0) - var brightness: Double by parameters - - @DoubleParameter("contrast", -1.0, 1.0, order = 1) - var contrast: Double by parameters - - @DoubleParameter("saturation", -1.0, 1.0, order = 2) - var saturation: Double by parameters - - @DoubleParameter("hue shift", -180.0, 180.0, order = 3) - var hueShift: Double by parameters - - @DoubleParameter("gamma", 0.0, 5.0, order = 4) - var gamma: Double by parameters - - @DoubleParameter("opacity", 0.0, 1.0, order = 5) - var opacity: Double by parameters - - @BooleanParameter("clamp", order = 6) - var clamped: Boolean by parameters - - init { - contrast = 0.0 - brightness = 0.0 - saturation = 0.0 - hueShift = 0.0 - gamma = 1.0 - opacity = 1.0 - clamped = true - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/ColorLookup.kt b/orx-fx/src/commonMain/kotlin/color/ColorLookup.kt deleted file mode 100644 index 9bcef9da..00000000 --- a/orx-fx/src/commonMain/kotlin/color/ColorLookup.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.openrndr.extra.fx.color - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_color_lookup -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.shape.Rectangle - -class ColorLookup(lookup: ColorBuffer) : Filter1to1(mppFilterShader(fx_color_lookup, "color-lookup")) { - /** a color look-up texture */ - var lookup: ColorBuffer by parameters - - /** - * noise gain in look-up, default value is 0.0 - */ - var noiseGain: Double by parameters - - /** - * noise seed, default value is 0.0 - */ - var seed: Double by parameters - - init { - this.lookup = lookup - this.noiseGain = 0.0 - this.seed = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - lookup.filter(MinifyingFilter.LINEAR, MagnifyingFilter.LINEAR) - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/ColorMix.kt b/orx-fx/src/commonMain/kotlin/color/ColorMix.kt deleted file mode 100644 index 7a92b2f1..00000000 --- a/orx-fx/src/commonMain/kotlin/color/ColorMix.kt +++ /dev/null @@ -1,23 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_color_mix -import org.openrndr.extra.fx.fx_color_tint -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description - -class ColorMix : Filter1to1(mppFilterShader(fx_color_mix, "color-mix")) - -@Description("Tint") -class ColorTint : Filter1to1(mppFilterShader(fx_color_tint, "color-tint")) { - @ColorParameter("tint") - var tint: ColorRGBa by parameters - - init { - tint = ColorRGBa.PINK - } -} diff --git a/orx-fx/src/commonMain/kotlin/color/Colorspaces.kt b/orx-fx/src/commonMain/kotlin/color/Colorspaces.kt deleted file mode 100644 index b87fe690..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Colorspaces.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.color.phrases.ColorPhraseBook -import org.openrndr.extra.fx.* -import org.openrndr.extra.shaderphrases.preprocess - -class RgbToYCbcr : Filter1to1(mppFilterShader(fx_rgb_to_ycbcr, "rgb-to-ycbcr")) -class YcbcrToRgb : Filter1to1(mppFilterShader(fx_ycbcr_to_rgb, "ycbcr_to_rgb")) - -class RgbToOkLab : Filter1to1(mppFilterShader(run { - ColorPhraseBook.register() - fx_rgb_to_oklab.preprocess() -}, "rgb-to-oklab")) - -class OkLabToRgb : Filter1to1(mppFilterShader(run { - ColorPhraseBook.register() - fx_oklab_to_rgb.preprocess() -}, "oklab-to-rgb")) diff --git a/orx-fx/src/commonMain/kotlin/color/Duotone.kt b/orx-fx/src/commonMain/kotlin/color/Duotone.kt deleted file mode 100644 index 36a0bb05..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Duotone.kt +++ /dev/null @@ -1,37 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.color.phrases.ColorPhraseBook -import org.openrndr.extra.color.presets.CORAL -import org.openrndr.extra.color.presets.NAVY -import org.openrndr.extra.fx.fx_duotone -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.shaderphrases.preprocess - -@Description("Duotone") -class Duotone : Filter1to1(filterShaderFromCode(run { - ColorPhraseBook.register() - fx_duotone.preprocess() -}, "duotone")) { - - @ColorParameter("background", order = 0) - var backgroundColor: ColorRGBa by parameters - - @ColorParameter("foreground", order = 1) - var foregroundColor: ColorRGBa by parameters - - @BooleanParameter("LAB interpolation", order = 2) - var labInterpolation: Boolean by parameters - - init { - backgroundColor = ColorRGBa.NAVY - foregroundColor = ColorRGBa.CORAL - labInterpolation = true - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/DuotoneGradient.kt b/orx-fx/src/commonMain/kotlin/color/DuotoneGradient.kt deleted file mode 100644 index 52c56868..00000000 --- a/orx-fx/src/commonMain/kotlin/color/DuotoneGradient.kt +++ /dev/null @@ -1,50 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.color.phrases.ColorPhraseBook -import org.openrndr.extra.color.presets.CORAL -import org.openrndr.extra.color.presets.NAVY -import org.openrndr.extra.fx.fx_duotone_gradient -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.shaderphrases.preprocess - -@Description("Duotone Gradient") -class DuotoneGradient : Filter1to1(filterShaderFromCode(run { - ColorPhraseBook.register() - fx_duotone_gradient.preprocess() -}, "duotone-gradient")) { - - @ColorParameter("background 0", order = 0) - var backgroundColor0: ColorRGBa by parameters - - @ColorParameter("foreground 0", order = 1) - var foregroundColor0: ColorRGBa by parameters - - @ColorParameter("background 1", order = 2) - var backgroundColor1: ColorRGBa by parameters - - @ColorParameter("foreground 1", order = 3) - var foregroundColor1: ColorRGBa by parameters - - @BooleanParameter("LAB interpolation", order = 4) - var labInterpolation: Boolean by parameters - - @DoubleParameter("rotation", -180.0, 180.0, order = 5) - var rotation: Double by parameters - - init { - backgroundColor0 = ColorRGBa.NAVY - foregroundColor0 = ColorRGBa.CORAL - backgroundColor1 = ColorRGBa.BLACK - foregroundColor1 = ColorRGBa.WHITE - rotation = 0.0 - labInterpolation = true - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/Invert.kt b/orx-fx/src/commonMain/kotlin/color/Invert.kt deleted file mode 100644 index 8eb06357..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Invert.kt +++ /dev/null @@ -1,19 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_invert -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Invert") -class Invert : Filter1to1(mppFilterShader(fx_invert, "invert")) { - @DoubleParameter("amount", 0.0, 1.0) - var amount: Double by parameters - - init { - amount = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/LumaMap.kt b/orx-fx/src/commonMain/kotlin/color/LumaMap.kt deleted file mode 100644 index 9ad50c50..00000000 --- a/orx-fx/src/commonMain/kotlin/color/LumaMap.kt +++ /dev/null @@ -1,33 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_luma_map -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Luma map ") -class LumaMap : Filter1to1(mppFilterShader(fx_luma_map, "luma-map")) { - @ColorParameter("foreground color") - var foreground: ColorRGBa by parameters - - @ColorParameter("background color") - var background: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("foreground opacity", 0.0, 1.0) - var foregroundOpacity: Double by parameters - - init { - foreground = ColorRGBa.WHITE - background = ColorRGBa.BLACK - foregroundOpacity = 1.0 - backgroundOpacity = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/LumaOpacity.kt b/orx-fx/src/commonMain/kotlin/color/LumaOpacity.kt deleted file mode 100644 index a57f5103..00000000 --- a/orx-fx/src/commonMain/kotlin/color/LumaOpacity.kt +++ /dev/null @@ -1,31 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_luma_opacity -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Luma map ") -class LumaOpacity : Filter1to1(mppFilterShader(fx_luma_opacity, "luma-opacity")) { - @DoubleParameter("foreground luma",0.0, 1.0) - var foregroundLuma: Double by parameters - - @DoubleParameter("background luma", 0.0,1.0) - var backgroundLuma: Double by parameters - - @DoubleParameter("background opacity", 0.0, 1.0, order = 0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("foreground opacity", 0.0, 1.0, order = 1) - var foregroundOpacity: Double by parameters - - init { - foregroundLuma = 1.0 - backgroundLuma = 0.0 - foregroundOpacity = 1.0 - backgroundOpacity = 0.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/LumaThreshold.kt b/orx-fx/src/commonMain/kotlin/color/LumaThreshold.kt deleted file mode 100644 index dcb13a0e..00000000 --- a/orx-fx/src/commonMain/kotlin/color/LumaThreshold.kt +++ /dev/null @@ -1,37 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_luma_threshold -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Luma threshold ") -class LumaThreshold : Filter1to1(mppFilterShader(fx_luma_threshold, "luma-threshold")) { - @DoubleParameter("threshold value", 0.0, 1.0) - var threshold: Double by parameters - - @ColorParameter("foreground color") - var foreground: ColorRGBa by parameters - - @ColorParameter("background color") - var background: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("foreground opacity", 0.0, 1.0) - var foregroundOpacity: Double by parameters - - init { - threshold = 0.5 - foreground = ColorRGBa.WHITE - background = ColorRGBa.BLACK - foregroundOpacity = 1.0 - backgroundOpacity = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/Pal.kt b/orx-fx/src/commonMain/kotlin/color/Pal.kt deleted file mode 100644 index a5e223db..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Pal.kt +++ /dev/null @@ -1,27 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_pal -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Pal TV Effect") -class Pal : Filter1to1(mppFilterShader(fx_pal,"pal")) { - @DoubleParameter("amount", 0.0, 1.0) - var amount: Double by parameters - @DoubleParameter("pixelation", 0.0, 1.0) - var pixelation: Double by parameters - @DoubleParameter("filter_gain", 0.0, 10.0) - var filter_gain: Double by parameters - @DoubleParameter("filter_invgain", 0.0, 10.0) - var filter_invgain: Double by parameters - init { - amount = 1.0 - pixelation = 0.0 - filter_gain = 1.0 - filter_invgain = 1.6 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/Posterize.kt b/orx-fx/src/commonMain/kotlin/color/Posterize.kt deleted file mode 100644 index dfa340a1..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Posterize.kt +++ /dev/null @@ -1,24 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_posterize -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.IntParameter - -@Description("Posterize") -class Posterize : Filter1to1(filterShaderFromCode(fx_posterize, "posterize")) { - - @IntParameter("levels", 2, 32, order = 0) - var levels: Int by parameters - - @IntParameter("window", 1, 8, order = 0) - var window: Int by parameters - - init { - levels = 4 - window = 1 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/Sepia.kt b/orx-fx/src/commonMain/kotlin/color/Sepia.kt deleted file mode 100644 index 8af108cc..00000000 --- a/orx-fx/src/commonMain/kotlin/color/Sepia.kt +++ /dev/null @@ -1,19 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_sepia -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Sepia") -class Sepia : Filter1to1(mppFilterShader(fx_sepia, "sepia")) { - @DoubleParameter("amount", 0.0, 1.0) - var amount: Double by parameters - - init { - amount = 0.5 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/color/SetBackground.kt b/orx-fx/src/commonMain/kotlin/color/SetBackground.kt deleted file mode 100644 index 9ba43772..00000000 --- a/orx-fx/src/commonMain/kotlin/color/SetBackground.kt +++ /dev/null @@ -1,25 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_set_background -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Set background") -class SetBackground : Filter1to1(mppFilterShader(fx_set_background, "set-background")) { - @ColorParameter("background color") - var background: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - init { - background = ColorRGBa.GRAY - backgroundOpacity = 1.0 - } -} diff --git a/orx-fx/src/commonMain/kotlin/color/SubtractConstant.kt b/orx-fx/src/commonMain/kotlin/color/SubtractConstant.kt deleted file mode 100644 index 3d2b9f68..00000000 --- a/orx-fx/src/commonMain/kotlin/color/SubtractConstant.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.openrndr.extra.fx.color - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_subtract_constant -import org.openrndr.extra.fx.mppFilterShader - -class SubtractConstant : Filter1to1(mppFilterShader(fx_subtract_constant, "subtract-constant")) { - var constant: ColorRGBa by parameters - - init { - constant = ColorRGBa(1.0, 1.0, 1.0, 0.0) - } -} diff --git a/orx-fx/src/commonMain/kotlin/colormap/ColormapFilter.kt b/orx-fx/src/commonMain/kotlin/colormap/ColormapFilter.kt deleted file mode 100644 index 1600905e..00000000 --- a/orx-fx/src/commonMain/kotlin/colormap/ColormapFilter.kt +++ /dev/null @@ -1,26 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.colormap - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.DoubleParameter - -abstract class ColormapFilter(code: String, name: String) : Filter1to1(mppFilterShader(code, name)) { - - @DoubleParameter(label = "min value", low = 0.0, high = 1.0, order = 0) - var minValue: Double by parameters - - @DoubleParameter(label = "max value", low = 0.0, high = 1.0, order = 1) - var maxValue: Double by parameters - - @DoubleParameter(label = "curve", low = 0.001, high = 10.0, order = 2) - var curve: Double by parameters - - init { - minValue = 0.0 - maxValue = 1.0 - curve = 1.0 - } - -} diff --git a/orx-fx/src/commonMain/kotlin/colormap/GrayscaleColormap.kt b/orx-fx/src/commonMain/kotlin/colormap/GrayscaleColormap.kt deleted file mode 100644 index 2a082e73..00000000 --- a/orx-fx/src/commonMain/kotlin/colormap/GrayscaleColormap.kt +++ /dev/null @@ -1,12 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.colormap - -import org.openrndr.extra.fx.fx_grayscale_colormap -import org.openrndr.extra.parameters.Description - -/** - * Maps values of the RED color channel to grayscale. - */ -@Description("grayscale colormap") -class GrayscaleColormap : ColormapFilter(fx_grayscale_colormap, "grayscale-colormap") diff --git a/orx-fx/src/commonMain/kotlin/colormap/SpectralZucconiColormap.kt b/orx-fx/src/commonMain/kotlin/colormap/SpectralZucconiColormap.kt deleted file mode 100644 index 81fd81ee..00000000 --- a/orx-fx/src/commonMain/kotlin/colormap/SpectralZucconiColormap.kt +++ /dev/null @@ -1,26 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.colormap - -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.fx.fx_spectral_zucconi_colormap -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.shaderphrases.preprocess - -/** - * Maps values of the RED color channel to natural light dispersion spectrum as described - * by Alan Zucconi in the - * [Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) - * article. - * - * @see ColormapPhraseBook.spectralZucconi6 - * @see org.openrndr.extra.color.colormaps.spectralZucconi6 - */ -@Description("spectral colormap") -class SpectralZucconiColormap : ColormapFilter( - code = run { - ColormapPhraseBook.register() - fx_spectral_zucconi_colormap.preprocess() - }, - name = "spectral-zucconi-colormap" -) diff --git a/orx-fx/src/commonMain/kotlin/colormap/TurboColormap.kt b/orx-fx/src/commonMain/kotlin/colormap/TurboColormap.kt deleted file mode 100644 index 771e5677..00000000 --- a/orx-fx/src/commonMain/kotlin/colormap/TurboColormap.kt +++ /dev/null @@ -1,25 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.colormap - -import org.openrndr.extra.color.colormaps.ColormapPhraseBook -import org.openrndr.extra.fx.fx_turbo_colormap -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.shaderphrases.preprocess - -/** - * Maps values of the RED color channel to Turbo Colormap according to - * [Turbo, An Improved Rainbow Colormap for Visualization](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html) - * by Google. - * - * @see ColormapPhraseBook.spectralZucconi6 - * @see org.openrndr.extra.color.colormaps.spectralZucconi6 - */ -@Description("turbo colormap") -class TurboColormap : ColormapFilter( - code = run { - ColormapPhraseBook.register() - fx_turbo_colormap.preprocess() - }, - name = "turbo-colormap" -) diff --git a/orx-fx/src/commonMain/kotlin/composite/CompositeFilter.kt b/orx-fx/src/commonMain/kotlin/composite/CompositeFilter.kt deleted file mode 100644 index 9a56715b..00000000 --- a/orx-fx/src/commonMain/kotlin/composite/CompositeFilter.kt +++ /dev/null @@ -1,123 +0,0 @@ -package org.openrndr.extra.fx.composite - -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Filter -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.isEquivalentTo -import org.openrndr.shape.Rectangle - -/** - * @param first the filter that is applied first - * @param second the filter that is applied second - * @param firstSource a function that maps source color buffers for the [first] filter - * @param secondSource a function that maps source color buffers for the [second] filter - * @param firstParameters a function that sets parameters for the [first] filter - * @param secondParameters a function that sets parameters for the [second] fillter - * @param useIntermediateBuffer should an intermediate buffer be maintained? when set to false the [first] filter will - * write to the target color buffer - */ -class CompositeFilter( - val first: F0, - val second: F1, - private val firstSource: (List) -> List, - private val secondSource: (List, ColorBuffer) -> List, - private val firstParameters: F0.() -> Unit, - private val secondParameters: F1.() -> Unit, - private val useIntermediateBuffer: Boolean = false -) : Filter(null) { - private var intermediate: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - val firstSource = firstSource(source.toList()).toTypedArray() - if (!useIntermediateBuffer) { - first.firstParameters() - first.apply(firstSource, target, clip) - - second.secondParameters() - val secondSource = secondSource(source.toList(), target.first()).toTypedArray() - second.apply(secondSource, target, clip) - } else { - val li = intermediate - if (li != null && !li.isEquivalentTo(target.first())) { - li.destroy() - intermediate = null - } - if (intermediate == null) { - intermediate = target.first().createEquivalent() - } - first.firstParameters() - first.apply(firstSource, arrayOf(intermediate!!), clip) - val secondSource = secondSource(source.toList(), intermediate!!).toTypedArray() - second.secondParameters() - second.apply(secondSource, target, clip) - } - } - - override fun destroy() { - intermediate?.destroy() - super.destroy() - } -} - -class CompositeFilterBuilder(val first: F0, val second: F1) { - private var firstSourceFunction: (inputs: List) -> List = { inputs -> inputs } - private var secondSourceFunction: (inputs: List, intermediate: ColorBuffer) -> List = - { inputs, intermediate -> listOf(intermediate) + inputs.drop(1) } - - private var firstParametersFunction: (F0.() -> Unit) = {} - private var secondParametersFunction: (F1.() -> Unit) = {} - - - /** Supply the function that sets the source color buffers for the [first] filter */ - fun firstSource(function: (source: List) -> List) { - firstSourceFunction = function - } - - /** Supply the function that sets the source color buffers for the [second] filter */ - fun secondSource(function: (source: List, intermediate: ColorBuffer) -> List) { - secondSourceFunction = function - } - - /** - * Supply the function that sets the filter parameters for the [first] filter - */ - fun firstParameters(function: (F0.() -> Unit)) { - firstParametersFunction = function - } - - /** - * Supply the function that sets the filter parameter the [second] filter - */ - fun secondParameters(function: (F1.() -> Unit)) { - secondParametersFunction = function - } - - /** - * Should an intermediate color buffer be used? - */ - var useIntermediateBuffer = true - - fun build(): CompositeFilter { - return CompositeFilter( - first, - second, - firstSourceFunction, - secondSourceFunction, - firstParametersFunction, - secondParametersFunction, - useIntermediateBuffer - ) - } -} - -/** - * Create a composite filter that first applies [this] filter and then the [next] filter. - */ -fun F0.then( - next: F1, - builder: CompositeFilterBuilder.() -> Unit = {} -): CompositeFilter { - val compositeFilterBuilder = CompositeFilterBuilder(this, next) - compositeFilterBuilder.builder() - return compositeFilterBuilder.build() -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/BlockRepeat.kt b/orx-fx/src/commonMain/kotlin/distort/BlockRepeat.kt deleted file mode 100644 index 6a8d61cf..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/BlockRepeat.kt +++ /dev/null @@ -1,60 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_block_repeat -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.shape.Rectangle - -@Description("Block repeat") -class BlockRepeat : Filter1to1(mppFilterShader(fx_block_repeat, "block-repeat")) { - @DoubleParameter("block width", 0.0, 1.0, order = 0) - var blockWidth: Double by parameters - - @DoubleParameter("block height", 0.0, 1.0, order = 1) - var blockHeight: Double by parameters - - @DoubleParameter("block x-offset", -0.5, 0.5, order = 2) - var blockOffsetX: Double by parameters - - @DoubleParameter("block y-offset", -0.5, 0.5, order = 3) - var blockOffsetY: Double by parameters - - /** - * Source scale, 0.0 is a 1:1 mapping, 1.0 fits entire source image in block - */ - @DoubleParameter("source scale", 0.0, 1.0, order = 4) - var sourceScale: Double by parameters - - @DoubleParameter("source x-offset", -0.5, 0.5, order = 5) - var sourceOffsetX: Double by parameters - - @DoubleParameter("source y-offset", -.5, .5, order = 6) - var sourceOffsetY: Double by parameters - - @BooleanParameter("bicubic filtering") - var bicubicFiltering: Boolean by parameters - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } - - init { - blockWidth = 0.25 - blockHeight = 0.25 - blockOffsetX = 0.0 - blockOffsetY = 0.0 - sourceOffsetX = 0.0 - sourceOffsetY = 0.0 - sourceScale = 0.0 - bicubicFiltering = true - } -} diff --git a/orx-fx/src/commonMain/kotlin/distort/DirectionalDisplace.kt b/orx-fx/src/commonMain/kotlin/distort/DirectionalDisplace.kt deleted file mode 100644 index cba6e9b8..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/DirectionalDisplace.kt +++ /dev/null @@ -1,55 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.Filter2to1 -import org.openrndr.extra.fx.fx_directional_displace -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * Directional displace filter. Takes source image and direction buffer inputs - */ -@Description("Directional displace") -class DirectionalDisplace : Filter2to1(mppFilterShader(fx_directional_displace, "directional-displace")) { - - /** - * The distance of the sampled pixel. The default is 1.0 - */ - @DoubleParameter("distance", 1.0, 1000.0) - var distance: Double by parameters - - /** - * Post-displace gain, default is 1.0 - */ - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - /** - * Should filter use directions perpendicular to those in the direction buffer? default is false - */ - @BooleanParameter("perpendicular") - var perpendicular: Boolean by parameters - - /** - * Wrap around left and right edges - */ - @BooleanParameter("wrapX") - var wrapX: Boolean by parameters - - /** - * Wrap around top and bottom edges - */ - @BooleanParameter("wrapY") - var wrapY: Boolean by parameters - - init { - distance = 1.0 - gain = 1.0 - perpendicular = false - wrapX = false - wrapY = false - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/DisplaceBlend.kt b/orx-fx/src/commonMain/kotlin/distort/DisplaceBlend.kt deleted file mode 100644 index fed7e1e4..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/DisplaceBlend.kt +++ /dev/null @@ -1,62 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_displace_blend -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector3 -import org.openrndr.shape.Rectangle - -@Description("Displace blend") -class DisplaceBlend : Filter2to1(mppFilterShader(fx_displace_blend, "displace-blend")) { - var seed: Vector3 by parameters - - @DoubleParameter("offset", -1.0, 1.0) - var offset: Double by parameters - - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - @DoubleParameter("feather", 1.0, 100.0) - var feather: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0) - var rotation: Double by parameters - - @DoubleParameter("source opacity", 0.0, 1.0) - var sourceOpacity: Double by parameters - - @DoubleParameter("target opacity", 0.0, 1.0) - var targetOpacity: Double by parameters - - init { - gain = 0.1 - offset = 0.5 - rotation = 0.0 - feather = 1.0 - sourceOpacity = 1.0 - targetOpacity = 1.0 - } - - var bicubicFiltering = true - private var intermediate: ColorBuffer? = null - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - if (source.size >= 2) { - if (target[0] === source[0] || target[0] === source[1]) { - if (intermediate == null) { - intermediate = colorBuffer(target[0].width, target[0].height, type = target[0].type, format = target[0].format) - } - } - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, arrayOf(intermediate ?: target[0]), clip) - intermediate?.copyTo(target[0]) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/Fisheye.kt b/orx-fx/src/commonMain/kotlin/distort/Fisheye.kt deleted file mode 100644 index 3c50a3f4..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/Fisheye.kt +++ /dev/null @@ -1,41 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_fisheye -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.shape.Rectangle - -@Description("Fisheye") -class Fisheye : Filter1to1(mppFilterShader(fx_fisheye, "fisheye")) { - @DoubleParameter("strength", -1.0, 1.0, order = 0) - var strength: Double by parameters - - @DoubleParameter("scale", 0.0, 2.0, order = 0) - var scale: Double by parameters - - @DoubleParameter("feather", 0.0, 100.0, order = 1) - var feather: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0, order = 1) - var rotation: Double by parameters - - init { - strength = 0.1 - feather = 1.0 - scale = 1.0 - rotation = 0.0 - } - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} diff --git a/orx-fx/src/commonMain/kotlin/distort/FluidDistort.kt b/orx-fx/src/commonMain/kotlin/distort/FluidDistort.kt deleted file mode 100644 index e4c82980..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/FluidDistort.kt +++ /dev/null @@ -1,66 +0,0 @@ -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_fluid_distort -import org.openrndr.extra.fx.fx_uvmap -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.shape.Rectangle -import kotlin.math.cos - -private class UVMap: Filter( mppFilterShader(fx_uvmap, "uvmap")) - -private class FluidDistortFilter : Filter(mppFilterShader(fx_fluid_distort, "fluid-distort")) { - var blend : Double by parameters - var random: Double by parameters - init { - blend = 0.0 - random = 0.0 - } -} - -class FluidDistort : Filter1to1(null) { - var blend: Double = 1.0 - - var outputUV = false - - private val distort = FluidDistortFilter() - private val uvmap = UVMap() - - private var buffer0: ColorBuffer? = null - private var buffer1: ColorBuffer? = null - private var index = 0 - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - distort.blend = blend - distort.random = cos(index*0.5)*0.5+0.5 - - buffer0?.let { - if (!it.isEquivalentTo(target[0])) { - it.destroy() - } - } - if (buffer0 == null) { - buffer0 = target[0].createEquivalent() - } - - buffer1?.let { - if (!it.isEquivalentTo(target[0])) { - it.destroy() - } - } - if (buffer1 == null) { - buffer1 = target[0].createEquivalent() - } - val buffers = arrayOf(buffer0!!, buffer1!!) - distort.apply(buffers[index%2], buffers[(index+1)%2], clip) - - if (!outputUV) { - uvmap.apply(arrayOf(buffers[(index + 1) % 2], source[0]), target[0], clip) - } else { - buffers[(index+1)%2]. copyTo(target[0]) - } - index++ - blend = 0.0 - } - -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt b/orx-fx/src/commonMain/kotlin/distort/Lenses.kt deleted file mode 100644 index 68be3d86..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt +++ /dev/null @@ -1,50 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_lenses -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -@Description("Lenses") -class Lenses : Filter1to1(mppFilterShader(fx_lenses, "lenses")) { - @IntParameter("rows", 1, 64, order = 0) - var rows: Int by parameters - - @IntParameter("columns", 1, 64, order = 1) - var columns: Int by parameters - - @DoubleParameter("scale", 0.5, 1.5, order = 2) - var scale: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0, order = 3) - var rotation: Double by parameters - - @DoubleParameter("distort", -1.0, 1.0, order = 4) - var distort: Double by parameters - - @BooleanParameter("bicubic filtering") - var bicubicFiltering: Boolean by parameters - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } - - init { - rows = 6 - columns = 8 - distort = 0.0 - scale = 1.0 - rotation = 0.0 - bicubicFiltering = true - } -} diff --git a/orx-fx/src/commonMain/kotlin/distort/PerspectivePlane.kt b/orx-fx/src/commonMain/kotlin/distort/PerspectivePlane.kt deleted file mode 100644 index 387f5c37..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/PerspectivePlane.kt +++ /dev/null @@ -1,61 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_perspective_plane -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import org.openrndr.shape.Rectangle - -@Description("Perspective plane") -class PerspectivePlane : Filter1to1(mppFilterShader(fx_perspective_plane, "perspective-plane")) { - // @DoubleParameter("camera x", -1.0, 1.0, order = 0) - var cameraX: Double = 0.0 - // @DoubleParameter("camera y", -1.0, 1.0, order = 1) - var cameraY: Double = 0.0 - // @DoubleParameter("camera z", -1.0, 1.0, order = 2) - var cameraZ: Double = 1.0 - - - @DoubleParameter("plane x", -1.0, 1.0, order = 3) - var planeX: Double = 0.0 - @DoubleParameter("plane y", -1.0, 1.0, order = 4) - var planeY: Double = 0.0 - @DoubleParameter("plane z", -1.0, 1.0, order = 5) - var planeZ: Double = 0.5 - - @DoubleParameter("plane yaw", -180.0, 180.0, order = 6) - var planeYaw: Double = 0.0 - @DoubleParameter("plane pitch", -180.0, 180.0, order = 7) - var planePitch: Double = 0.0 - @DoubleParameter("plane roll", -180.0, 180.0, order = 8) - var planeRoll: Double = 0.0 - - - @BooleanParameter("tile input") - var tile: Boolean by parameters - - init { - tile = false - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - source[0].wrapU = WrapMode.REPEAT - source[0].wrapV = WrapMode.REPEAT - parameters["cameraPosition"] = Vector3(cameraX, cameraY, cameraZ) - parameters["planePosition"] = Vector3(planeX, planeY, planeZ) - parameters["planeMatrix"] = transform { - rotate(Vector3.UNIT_X, planePitch) - rotate(Vector3.UNIT_Y, planeYaw) - rotate(Vector3.UNIT_Z, planeRoll) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/Perturb.kt b/orx-fx/src/commonMain/kotlin/distort/Perturb.kt deleted file mode 100644 index affd06ad..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/Perturb.kt +++ /dev/null @@ -1,82 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_perturb -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.shape.Rectangle - -@Description("Perturb") -class Perturb : Filter1to1(mppFilterShader(fx_perturb, "perturb")) { - var seed: Vector3 by parameters - /** - * base noise scale, default is Vector3(1.0, 1.0, 1.0) - */ - @DoubleParameter("scale", 0.01, 8.0, order = 0) - var scale: Double by parameters - - @DoubleParameter("phase", -2.0, 2.0, order = 1) - var phase: Double by parameters - - @DoubleParameter("radius", 0.0, 2.0, order = 1) - var radius: Double by parameters - - /** - * lacunarity is the amount by which scale is modulated per octave, default is Vector3(2.0, 2.0, 2.0) - */ - @DoubleParameter("lacunarity", 0.0, 1.0, order = 2) - var lacunarity: Double by parameters - - @DoubleParameter("gain", 0.0, 1.0, order = 3) - var gain: Double by parameters - - @DoubleParameter("decay", 0.0, 1.0, order = 4) - var decay: Double by parameters - - /** - * the number of octaves of noise to generate, default is 4 - */ - @IntParameter("octaves", 1, 10, order = 5) - var octaves: Int by parameters - - @IntParameter("x segments", 0, 256, order = 6) - var xSegments: Int by parameters - - @IntParameter("y segments", 0, 256, order = 7) - var ySegments: Int by parameters - - @BooleanParameter("output UV", order = 8) - var outputUV: Boolean by parameters - - @Vector2Parameter("offset", -1.0, 1.0, order = 9) - var offset: Vector2 by parameters - - - init { - seed = Vector3.ZERO - scale = 1.0 - lacunarity = 2.0 - gain = 0.5 - decay = 0.5 - octaves = 4 - phase = 0.0 - xSegments = 0 - ySegments = 0 - outputUV = false - offset = Vector2.ZERO - radius = 1.0 - - } - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/PolarToRectangular.kt b/orx-fx/src/commonMain/kotlin/distort/PolarToRectangular.kt deleted file mode 100644 index e520132e..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/PolarToRectangular.kt +++ /dev/null @@ -1,33 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.MagnifyingFilter -import org.openrndr.draw.MinifyingFilter -import org.openrndr.extra.fx.fx_polar_to_rectangular -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.shape.Rectangle - -@Description("Polar to rectangular") -class PolarToRectangular : Filter1to1(mppFilterShader(fx_polar_to_rectangular, "polar-to-rectangular")) { - @BooleanParameter("log polar") - var logPolar:Boolean by parameters - - init { - logPolar = true - } - - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/RectangularToPolar.kt b/orx-fx/src/commonMain/kotlin/distort/RectangularToPolar.kt deleted file mode 100644 index a5f71ed6..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/RectangularToPolar.kt +++ /dev/null @@ -1,34 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.MagnifyingFilter -import org.openrndr.draw.MinifyingFilter -import org.openrndr.extra.fx.fx_rectangular_to_polar -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.shape.Rectangle - -@Description("Rectangular to polar") -class RectangularToPolar : Filter1to1(mppFilterShader(fx_rectangular_to_polar, "rectangular-to-polar")) { - - @BooleanParameter("log polar") - var logPolar:Boolean by parameters - - init { - logPolar = true - } - - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/StackRepeat.kt b/orx-fx/src/commonMain/kotlin/distort/StackRepeat.kt deleted file mode 100644 index 98d2e464..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/StackRepeat.kt +++ /dev/null @@ -1,54 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_stack_repeat -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -@Description("Stack repeat") -class StackRepeat : Filter1to1(mppFilterShader(fx_stack_repeat, "stack-repeat")) { - @DoubleParameter("zoom", -1.0, 1.0, order = 0) - var zoom: Double by parameters - - @DoubleParameter("x-origin", -1.0, 1.0, order = 1) - var xOrigin: Double by parameters - - @DoubleParameter("y-origin", -1.0, 1.0, order = 2) - var yOrigin: Double by parameters - - @DoubleParameter("x-offset", -1.0, 1.0, order = 3) - var xOffset: Double by parameters - - @DoubleParameter("y-offset", -1.0, 1.0, order = 4) - var yOffset: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0, order = 5) - var rotation: Double by parameters - - @IntParameter("repeats", 0, 16, order = 6) - var repeats: Int by parameters - - init { - zoom = 0.0 - repeats = 2 - xOffset = 0.0 - yOffset = 0.0 - xOrigin = 0.0 - yOrigin = 0.0 - rotation = 0.0 - } - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} diff --git a/orx-fx/src/commonMain/kotlin/distort/StretchWaves.kt b/orx-fx/src/commonMain/kotlin/distort/StretchWaves.kt deleted file mode 100644 index 12ce2976..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/StretchWaves.kt +++ /dev/null @@ -1,45 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_stretch_waves -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.shape.Rectangle - -@Description("Stretch waves") -class StretchWaves : Filter1to1(mppFilterShader(fx_stretch_waves, "stretch-waves")) { - @DoubleParameter("distortion", -0.0,1.0, 1) - var distortion: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0) - var rotation: Double by parameters - - @DoubleParameter("phase", -1.0, 1.0) - var phase: Double by parameters - - @DoubleParameter("frequency", 0.0, 100.0) - var frequency: Double by parameters - - @DoubleParameter("feather", 0.0, 100.0, order = 1) - var feather: Double by parameters - - init { - distortion = 0.0 - rotation = 0.0 - phase = 0.0 - frequency = 10.0 - feather = 1.0 - } - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/TapeNoise.kt b/orx-fx/src/commonMain/kotlin/distort/TapeNoise.kt deleted file mode 100644 index c06d6519..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/TapeNoise.kt +++ /dev/null @@ -1,57 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_tape_noise -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Tape noise") -class TapeNoise : Filter1to1(mppFilterShader(fx_tape_noise, "tape-noise")) { - var time: Double by parameters - - @DoubleParameter("gain", 0.0, 1.0) - var gain: Double by parameters - - @DoubleParameter("noise low", 0.0, 1.0) - var noiseLow: Double by parameters - - @DoubleParameter("noise high", 0.0, 1.0) - var noiseHigh: Double by parameters - - @DoubleParameter("gap frequency", 0.0, 2.0) - var gapFrequency: Double by parameters - - @DoubleParameter("gap low", -1.0, 1.0) - var gapLow: Double by parameters - @DoubleParameter("gap high", -1.0, 1.0) - var gapHigh: Double by parameters - - @DoubleParameter("deform amplitude", 0.0, 1.0) - var deformAmplitude: Double by parameters - - @DoubleParameter("deform frequency", 0.0, 1.0) - var deformFrequency: Double by parameters - - @ColorParameter("tint") - var tint: ColorRGBa by parameters - - @BooleanParameter("monochrome") - var monochrome: Boolean by parameters - - init { - gain = 0.5 - noiseLow = 0.5 - noiseHigh = 0.8 - tint = ColorRGBa.WHITE - monochrome = false - gapFrequency = 10.0 - gapLow = -1.0 - gapHigh = -0.99 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/Tiles.kt b/orx-fx/src/commonMain/kotlin/distort/Tiles.kt deleted file mode 100644 index 6cb43207..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/Tiles.kt +++ /dev/null @@ -1,38 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_tiles -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -@Description("Tiles") -class Tiles : Filter1to1(mppFilterShader(fx_tiles, "tiles")) { - @DoubleParameter("rotation", -180.0, 180.0, order = 2) - var rotation: Double by parameters - - @IntParameter("x segments", 0, 256, order = 0) - var xSegments: Int by parameters - - @IntParameter("y segments", 0, 256, order = 0) - var ySegments: Int by parameters - - init { - rotation = 0.0 - xSegments = 32 - ySegments = 32 - } - - var bicubicFiltering = false - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} diff --git a/orx-fx/src/commonMain/kotlin/distort/VideoGlitch.kt b/orx-fx/src/commonMain/kotlin/distort/VideoGlitch.kt deleted file mode 100644 index 1a8f2404..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/VideoGlitch.kt +++ /dev/null @@ -1,49 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_video_glitch -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Video glitch") -class VideoGlitch : Filter1to1(mppFilterShader(fx_video_glitch, "video-glitch")) { - var time: Double by parameters - - @DoubleParameter("amplitude", 0.0, 10.0) - var amplitude: Double by parameters - - @DoubleParameter("border height", 0.0, 0.5) - var borderHeight: Double by parameters - - @DoubleParameter("vertical frequency", 0.0, 10.0) - var vfreq: Double by parameters - - @DoubleParameter("horizontal frequency", 0.0, 80.0) - var hfreq: Double by parameters - - @DoubleParameter("p frequency", 0.0, 10.0) - var pfreq: Double by parameters - - @DoubleParameter("p offset", -1.0, 1.0) - var poffset: Double by parameters - - @DoubleParameter("scroll offset 0", 0.0, 1.0) - var scrollOffset0: Double by parameters - - @DoubleParameter("scroll offset 1", 0.0, 1.0) - var scrollOffset1: Double by parameters - - init { - amplitude = 1.0 - vfreq = 4.0 - pfreq = 10.0 - hfreq = 80.0 - poffset = 0.0 - scrollOffset0 = 0.0 - scrollOffset1 = 0.0 - borderHeight = 0.05 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/distort/Wave.kt b/orx-fx/src/commonMain/kotlin/distort/Wave.kt deleted file mode 100644 index 82c84f7e..00000000 --- a/orx-fx/src/commonMain/kotlin/distort/Wave.kt +++ /dev/null @@ -1,74 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.distort - -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_horizontal_wave -import org.openrndr.extra.fx.fx_vertical_wave -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.shape.Rectangle - -@Description("Horizontal wave") -class HorizontalWave : Filter1to1(mppFilterShader(fx_horizontal_wave, "horizontal-wave")) { - @DoubleParameter("frequency", 0.0, 64.0, order = 1) - var frequency: Double by parameters - - @DoubleParameter("amplitude", 0.0, 1.0, order = 0) - var amplitude: Double by parameters - - @DoubleParameter("phase", -0.5, 0.5, order = 2) - var phase: Double by parameters - - @IntParameter("segments", 0, 256, order = 3) - var segments: Int by parameters - - init { - frequency = 1.0 - amplitude = 0.1 - phase = 0.0 - segments = 0 - } - - var bicubicFiltering = true - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} - -@Description("Vertical wave") -class VerticalWave : Filter1to1(mppFilterShader(fx_vertical_wave, "vertical-wave")) { - @DoubleParameter("frequency", 0.0, 64.0, order = 1) - var frequency: Double by parameters - - @DoubleParameter("amplitude", 0.0, 1.0, order = 0) - var amplitude: Double by parameters - - @DoubleParameter("phase", -0.5, 0.5, order = 2) - var phase: Double by parameters - - @IntParameter("segments", 0, 256, order = 3) - var segments: Int by parameters - - init { - frequency = 1.0 - amplitude = 0.1 - phase = 0.0 - segments = 0 - } - var bicubicFiltering = true - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (bicubicFiltering && source.isNotEmpty()) { - source[0].generateMipmaps() - source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - } - super.apply(source, target, clip) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/dither/ADither.kt b/orx-fx/src/commonMain/kotlin/dither/ADither.kt deleted file mode 100644 index dc3b274a..00000000 --- a/orx-fx/src/commonMain/kotlin/dither/ADither.kt +++ /dev/null @@ -1,23 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.dither - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_a_dither -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.IntParameter - -@Description("ADither") -class ADither: Filter1to1(mppFilterShader(fx_a_dither, "a-dither")) { - @IntParameter("pattern index", 0, 3) - var pattern: Int by parameters - - @IntParameter("levels", 1, 64) - var levels: Int by parameters - - init { - levels = 4 - pattern = 3 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/dither/CMYKHalftone.kt b/orx-fx/src/commonMain/kotlin/dither/CMYKHalftone.kt deleted file mode 100644 index f2278869..00000000 --- a/orx-fx/src/commonMain/kotlin/dither/CMYKHalftone.kt +++ /dev/null @@ -1,80 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.dither - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_cmyk_halftone -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.shaderphrases.sdf.sdCirclePhrase - -@Description("CMYK Halftone") -class CMYKHalftone( - domainWarpFunction: String = "vec2 domainWarp(vec2 p) { return p; }", - elementFunction: String = """ - $sdCirclePhrase - float element(in vec2 p, float v) { - return sdCircle(p, v * dotSize); - }""".trimIndent() -) : Filter1to1( - filterShaderFromCode( - fx_cmyk_halftone.split("#pragma INSERT_PHRASES").let { - listOf(it[0], elementFunction, domainWarpFunction, it[1]) - }.joinToString("\n"), - "cmyk-halftone" - ) -) { - @DoubleParameter("scale", 1.0, 30.0, precision = 4) - var scale: Double by parameters - - @DoubleParameter("dotSize", 1.0, 3.0, precision = 4) - var dotSize: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0) - var rotation: Double by parameters - - @DoubleParameter("cyan rotation", -180.0, 180.0, precision = 4) - var cyanRotation: Double by parameters - - @DoubleParameter("magenta rotation", -180.0, 180.0, precision = 4) - var magentaRotation: Double by parameters - - @DoubleParameter("yellow rotation", -180.0, 180.0, precision = 4) - var yellowRotation: Double by parameters - - @DoubleParameter("black rotation", -180.0, 180.0, precision = 4) - var blackRotation: Double by parameters - - @ColorParameter("cyan color") - var cyanColor: ColorRGBa by parameters - - @ColorParameter("magenta color") - var magentaColor: ColorRGBa by parameters - - @ColorParameter("yellow color") - var yellowColor: ColorRGBa by parameters - - @ColorParameter("black color") - var blackColor: ColorRGBa by parameters - - var phase: Double by parameters - - init { - blackRotation = 45.0 - magentaRotation = 75.0 - cyanRotation = 15.0 - yellowRotation = 0.0 - cyanColor = ColorRGBa.CYAN - magentaColor = ColorRGBa.MAGENTA - yellowColor = ColorRGBa.YELLOW - blackColor = ColorRGBa.BLACK - - scale = 3.0 - rotation = 0.0 - dotSize = 0.9 - phase = 0.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/dither/Crosshatch.kt b/orx-fx/src/commonMain/kotlin/dither/Crosshatch.kt deleted file mode 100644 index 74e858d6..00000000 --- a/orx-fx/src/commonMain/kotlin/dither/Crosshatch.kt +++ /dev/null @@ -1,31 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.dither - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_crosshatch -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Crosshatch") -class Crosshatch : Filter1to1(mppFilterShader(fx_crosshatch, "crosshatch")) { - @DoubleParameter("threshold 1", 0.0, 1.0) - var t1: Double by parameters - - @DoubleParameter("threshold 2", 0.0, 1.0) - var t2: Double by parameters - - @DoubleParameter("threshold 3", 0.0, 1.0) - var t3: Double by parameters - - @DoubleParameter("threshold 4", 0.0, 1.0) - var t4: Double by parameters - - init { - t1 = 1.0 - t2 = 0.75 - t3 = 0.5 - t4 = 0.3 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/dither/LumaHalftone.kt b/orx-fx/src/commonMain/kotlin/dither/LumaHalftone.kt deleted file mode 100644 index 865dc7bb..00000000 --- a/orx-fx/src/commonMain/kotlin/dither/LumaHalftone.kt +++ /dev/null @@ -1,55 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.dither - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_luma_halftone -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - - -@Description("Luma Halftone") -class LumaHalftone: Filter1to1(filterShaderFromCode(fx_luma_halftone, "luma-halftone")) { - @DoubleParameter("scale", 1.0, 30.0, precision = 4) - var scale: Double by parameters - - @DoubleParameter("threshold", 0.0, 1.0, precision = 4) - var threshold: Double by parameters - - @DoubleParameter("rotation", -180.0, 180.0) - var rotation: Double by parameters - - @DoubleParameter("freq0", 1.0, 400.0) - var freq0: Double by parameters - - @DoubleParameter("freq1", 1.0, 400.0) - var freq1: Double by parameters - - @DoubleParameter("gain1", -2.0, 2.0) - var gain1: Double by parameters - - @DoubleParameter("phase0", -1.0, 1.0) - var phase0: Double by parameters - - @DoubleParameter("phase1", -1.0, 1.0) - var phase1: Double by parameters - - - @BooleanParameter("invert") - var invert: Boolean by parameters - - - init { - scale = 3.0 - rotation = 0.0 - threshold = 0.5 - freq1 = 20.0 - freq0 = 10.0 - gain1 = 0.1 - phase0 = 0.0 - phase1 = 0.0 - invert = true - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/edges/CannyEdgeDetector.kt b/orx-fx/src/commonMain/kotlin/edges/CannyEdgeDetector.kt deleted file mode 100644 index 01dc766c..00000000 --- a/orx-fx/src/commonMain/kotlin/edges/CannyEdgeDetector.kt +++ /dev/null @@ -1,54 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.edges - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_canny_edge_detector -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Canny Edge Detector") -class CannyEdgeDetector : Filter1to1( - filterShaderFromCode(fx_canny_edge_detector, "canny-edge-detector") -) { - - @DoubleParameter("threshold 0", 0.0, 100.0, order = 0) - var threshold0: Double by parameters - - @DoubleParameter("threshold 1", 0.0, 100.0, order = 1) - var threshold1: Double by parameters - - @DoubleParameter("thickness", 0.0, 10.0, order = 2) - var thickness: Double by parameters - - @ColorParameter("foreground color", order = 3) - var foregroundColor: ColorRGBa by parameters - - @DoubleParameter("foreground opacity", 0.0, 1.0, order = 4) - var foregroundOpacity: Double by parameters - - @ColorParameter("background color", order = 5) - var backgroundColor: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0, order = 6) - var backgroundOpacity: Double by parameters - - - @DoubleParameter("fade", 0.0, 1.0, order = 7) - var fade: Double by parameters - - init { - threshold0 = 2.0 - threshold1 = 0.0 - thickness = 1.0 - foregroundColor = ColorRGBa.WHITE - backgroundColor = ColorRGBa.BLACK - backgroundOpacity = 1.0 - foregroundOpacity = 1.0 - fade = 1.0 - } - -} diff --git a/orx-fx/src/commonMain/kotlin/edges/Contour.kt b/orx-fx/src/commonMain/kotlin/edges/Contour.kt deleted file mode 100644 index 75dece26..00000000 --- a/orx-fx/src/commonMain/kotlin/edges/Contour.kt +++ /dev/null @@ -1,51 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.edges - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_contour -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.* - -@Description("Contour") -class Contour : Filter1to1(mppFilterShader(fx_contour, "contour")) { - @DoubleParameter("levels", 0.0, 16.0) - var levels: Double by parameters - - @DoubleParameter("contour width", 0.0, 4.0) - var contourWidth: Double by parameters - - @DoubleParameter("contour opacity", 0.0, 1.0) - var contourOpacity: Double by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("bias", -1.0, 1.0) - var bias: Double by parameters - - @ColorParameter("contour color") - var contourColor: ColorRGBa by parameters - - @IntParameter("window", 0, 10) - var window: Int by parameters - - @BooleanParameter("output bands", order = 100) - var outputBands: Boolean by parameters - - @DoubleParameter("fade", 0.0, 1.0, order = 200) - var fade: Double by parameters - - init { - levels = 6.0 - contourWidth = 0.4 - contourColor = ColorRGBa.BLACK - backgroundOpacity = 1.0 - contourOpacity = 1.0 - window = 1 - bias = 0.0 - outputBands = false - fade = 1.0 - } -} diff --git a/orx-fx/src/commonMain/kotlin/edges/EdgesWork.kt b/orx-fx/src/commonMain/kotlin/edges/EdgesWork.kt deleted file mode 100644 index 3d0d4535..00000000 --- a/orx-fx/src/commonMain/kotlin/edges/EdgesWork.kt +++ /dev/null @@ -1,63 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.edges - -import org.openrndr.draw.* -import org.openrndr.extra.fx.ColorBufferDescription -import org.openrndr.extra.fx.fx_edges_work_1 -import org.openrndr.extra.fx.fx_edges_work_2 -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -internal class EdgesWork1 : Filter(mppFilterShader(fx_edges_work_1, "edges-work-1")) { - var delta: Vector2 by parameters - - init { - delta = Vector2.ZERO - } -} - -@Description("Edges Work") -open class EdgesWork : Filter1to1(mppFilterShader(fx_edges_work_2, "edges-work-2")) { - /** - * radius, default value is 1.0 - */ - @IntParameter("radius", 1, 400) - var radius: Int by parameters - - private var delta: Vector2 by parameters - - private val work1 = EdgesWork1() - - private var intermediateCache = mutableMapOf() - - init { - radius = 1 - delta = Vector2.ZERO - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - val intermediateDescription = ColorBufferDescription( - target[0].width, - target[0].height, - target[0].contentScale, - target[0].format, - target[0].type - ) - val intermediate = intermediateCache.getOrPut(intermediateDescription) { - colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - intermediate.let { - work1.delta = Vector2(radius / it.effectiveWidth.toDouble(), 0.0) - work1.apply(source, arrayOf(it), clip) - - parameters["delta"] = Vector2(0.0, radius / it.effectiveHeight.toDouble()) - super.apply(arrayOf(it), target, clip) - } - } -} - diff --git a/orx-fx/src/commonMain/kotlin/edges/LumaLaplacian.kt b/orx-fx/src/commonMain/kotlin/edges/LumaLaplacian.kt deleted file mode 100644 index ce8a67c9..00000000 --- a/orx-fx/src/commonMain/kotlin/edges/LumaLaplacian.kt +++ /dev/null @@ -1,33 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.edges - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_luma_laplacian -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Luma Sobel") -class LumaLaplacian : Filter1to1(mppFilterShader(fx_luma_laplacian, "luma-laplacian")) { - @ColorParameter("background color") - var backgroundColor: ColorRGBa by parameters - - @ColorParameter("edge color") - var edgeColor: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("edge opacity", 0.0, 1.0) - var edgeOpacity: Double by parameters - - init { - backgroundColor = ColorRGBa.BLACK - edgeColor = ColorRGBa.WHITE - edgeOpacity = 1.0 - backgroundOpacity = 1.0 - } -} diff --git a/orx-fx/src/commonMain/kotlin/edges/LumaSobel.kt b/orx-fx/src/commonMain/kotlin/edges/LumaSobel.kt deleted file mode 100644 index a871c4e9..00000000 --- a/orx-fx/src/commonMain/kotlin/edges/LumaSobel.kt +++ /dev/null @@ -1,33 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.edges - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_luma_sobel -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Luma Sobel") -class LumaSobel : Filter1to1(mppFilterShader(fx_luma_sobel, "luma-sobel")) { - @ColorParameter("background color") - var backgroundColor: ColorRGBa by parameters - - @ColorParameter("edge color") - var edgeColor: ColorRGBa by parameters - - @DoubleParameter("background opacity", 0.0, 1.0) - var backgroundOpacity: Double by parameters - - @DoubleParameter("edge opacity", 0.0, 1.0) - var edgeOpacity: Double by parameters - - init { - backgroundColor = ColorRGBa.BLACK - edgeColor = ColorRGBa.WHITE - edgeOpacity = 1.0 - backgroundOpacity = 1.0 - } -} diff --git a/orx-fx/src/commonMain/kotlin/grain/FilmGrain.kt b/orx-fx/src/commonMain/kotlin/grain/FilmGrain.kt deleted file mode 100644 index 8f39776d..00000000 --- a/orx-fx/src/commonMain/kotlin/grain/FilmGrain.kt +++ /dev/null @@ -1,45 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.grain - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_film_grain -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * Film grain filter - */ -@Description("film grain") -class FilmGrain : Filter1to1(mppFilterShader(fx_film_grain, "film-grain")) { - @BooleanParameter("use color") - var useColor: Boolean by parameters - - var time: Double by parameters; - - @DoubleParameter("grain lift ratio", 0.0, 1.0) - var grainLiftRatio: Double by parameters - - @DoubleParameter("grain strength", 0.0, 1.0) - var grainStrength: Double by parameters - - @DoubleParameter("grain rate", 0.0, 1.0) - var grainRate: Double by parameters - - @DoubleParameter("grain pitch", 0.0, 1.0) - var grainPitch: Double by parameters - - @DoubleParameter("color level", 0.0, 1.0) - var colorLevel: Double by parameters - - init { - useColor = false - grainLiftRatio = 0.5 - grainStrength = 1.0 - grainRate = 1.0 - grainPitch = 1.0 - colorLevel = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/math/MultiplyU.kt b/orx-fx/src/commonMain/kotlin/math/MultiplyU.kt deleted file mode 100644 index 5064d4f0..00000000 --- a/orx-fx/src/commonMain/kotlin/math/MultiplyU.kt +++ /dev/null @@ -1,19 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_multiply_u -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * Multiply by u coordinate - */ -@Description("multiply u") -class MultiplyU : Filter1to1(filterShaderFromCode(fx_multiply_u, "multiply-u")) { - @DoubleParameter("multiplication bias", 0.0, 2.0) - var bias: Double by parameters - init { - bias = 0.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/math/MultiplyV.kt b/orx-fx/src/commonMain/kotlin/math/MultiplyV.kt deleted file mode 100644 index 9e24ff09..00000000 --- a/orx-fx/src/commonMain/kotlin/math/MultiplyV.kt +++ /dev/null @@ -1,25 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_multiply_v -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * Multiply by v coordinate - */ -@Description("multiply v") -class MultiplyV : Filter1to1(filterShaderFromCode(fx_multiply_v, "multiply-v")) { - @DoubleParameter("multiplication bias", 0.0, 2.0) - var bias: Double by parameters - - @BooleanParameter("invert v") - var invertV: Boolean by parameters - - init { - bias = 0.0 - invertV = false - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/math/Square.kt b/orx-fx/src/commonMain/kotlin/math/Square.kt deleted file mode 100644 index 9f0c7c46..00000000 --- a/orx-fx/src/commonMain/kotlin/math/Square.kt +++ /dev/null @@ -1,13 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -import org.openrndr.draw.Filter1to1 -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.fx.fx_square -import org.openrndr.extra.parameters.Description - -/** - * Square input texture values - */ -@Description("square") -class Square : Filter1to1(filterShaderFromCode(fx_square, "square")) { -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/patterns/Checkers.kt b/orx-fx/src/commonMain/kotlin/patterns/Checkers.kt deleted file mode 100644 index 8df4f53d..00000000 --- a/orx-fx/src/commonMain/kotlin/patterns/Checkers.kt +++ /dev/null @@ -1,29 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.patterns - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_checkers -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("Checkers pattern") -class Checkers : Filter1to1(mppFilterShader(fx_checkers, "checkers")) { - var background: ColorRGBa by parameters - var foreground: ColorRGBa by parameters - - @DoubleParameter("size", 0.0, 1.0) - var size: Double by parameters - - @DoubleParameter("opacity", 0.0, 1.0) - var opacity: Double by parameters - - init { - size = 1.0 / 64.0 - opacity = 1.0 - foreground = ColorRGBa.WHITE.shade(0.9) - background = ColorRGBa.WHITE.shade(0.8) - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/shadow/DropShadow.kt b/orx-fx/src/commonMain/kotlin/shadow/DropShadow.kt deleted file mode 100644 index f9288abe..00000000 --- a/orx-fx/src/commonMain/kotlin/shadow/DropShadow.kt +++ /dev/null @@ -1,78 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.shadow - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.fx_dropshadow_blend -import org.openrndr.extra.fx.fx_dropshadow_blur -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class Blend : Filter(mppFilterShader(fx_dropshadow_blend, "dropshadow-blend")) { - var shift: Vector2 by parameters -} - -@Description("Drop shadow") -class DropShadow : Filter1to1(mppFilterShader(fx_dropshadow_blur, "dropshadow-blur")) { - @IntParameter("blur window", 1, 25) - var window: Int by parameters - var spread: Double by parameters - @DoubleParameter("gain", 0.0, 4.0) - var gain: Double by parameters - - @DoubleParameter("x shift", -30.0, 30.0) - var xShift: Double = 0.0 - - @DoubleParameter("y shift", -30.0, 30.0) - var yShift: Double = 0.0 - - @ColorParameter("color") - var color: ColorRGBa by parameters - - private var intermediate: ColorBuffer? = null - private var intermediate2: ColorBuffer? = null - private var b = Blend() - - init { - color = ColorRGBa.BLACK - window = 5 - spread = 1.0 - gain = 1.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - intermediate?.let { - if (it.width != target[0].width || it.height != target[0].height) { - intermediate = null - } - } - intermediate2?.let { - if (it.width != target[0].width || it.height != target[0].height) { - intermediate2 = null - } - } - if (intermediate == null) { - intermediate = colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - if (intermediate2 == null) { - intermediate2 = colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) - } - - intermediate?.let { - parameters["blurDirection"] = Vector2(1.0, 0.0) - super.apply(source, arrayOf(it), clip) - - parameters["blurDirection"] = Vector2(0.0, 1.0) - super.apply(arrayOf(it), arrayOf(intermediate2!!), clip) - - b.shift = (Vector2(xShift,yShift)) / Vector2(target[0].width * 1.0, target[0].height * 1.0) - b.apply(arrayOf(intermediate2!!, source[0]), target, clip) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/tonemap/ACESTonemap.kt b/orx-fx/src/commonMain/kotlin/tonemap/ACESTonemap.kt deleted file mode 100644 index 2ed0b061..00000000 --- a/orx-fx/src/commonMain/kotlin/tonemap/ACESTonemap.kt +++ /dev/null @@ -1,18 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.tonemap - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_aces_tonemap -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("ACES tonemap") -class ACESTonemap : Filter1to1(mppFilterShader(fx_aces_tonemap, "aces-tonemap")) { - @DoubleParameter("exposure bias", 0.0, 128.0) - var exposureBias:Double by parameters - init { - exposureBias = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/tonemap/ReinhardTonemap.kt b/orx-fx/src/commonMain/kotlin/tonemap/ReinhardTonemap.kt deleted file mode 100644 index d4adb55a..00000000 --- a/orx-fx/src/commonMain/kotlin/tonemap/ReinhardTonemap.kt +++ /dev/null @@ -1,22 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.tonemap - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_reinhard_tonemap -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("ACES tonemap") -class ReinhardTonemap : Filter1to1(mppFilterShader(fx_reinhard_tonemap, "reinhard-tonemap")) { - @DoubleParameter("exposure bias", 0.0, 128.0) - var exposureBias:Double by parameters - - @DoubleParameter("maximum luminance", 0.0, 128.0) - var maxLuminance:Double by parameters - init { - exposureBias = 1.0 - maxLuminance = 1.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/tonemap/Uncharted2Tonemap.kt b/orx-fx/src/commonMain/kotlin/tonemap/Uncharted2Tonemap.kt deleted file mode 100644 index fd175595..00000000 --- a/orx-fx/src/commonMain/kotlin/tonemap/Uncharted2Tonemap.kt +++ /dev/null @@ -1,21 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.fx.tonemap - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_uncharted2_tonemap -import org.openrndr.extra.fx.mppFilterShader -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -/** - * Uncharted 2 tonemap filter - */ -@Description("Uncharted 2 tonemap") -class Uncharted2Tonemap : Filter1to1(mppFilterShader(fx_uncharted2_tonemap, "uncharted2-tonemap")) { - @DoubleParameter("exposure bias", 0.0, 128.0) - var exposureBias:Double by parameters - init { - exposureBias = 2.0 - } -} \ No newline at end of file diff --git a/orx-fx/src/commonMain/kotlin/transform/FlipVertically.kt b/orx-fx/src/commonMain/kotlin/transform/FlipVertically.kt deleted file mode 100644 index 6f7ee767..00000000 --- a/orx-fx/src/commonMain/kotlin/transform/FlipVertically.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.openrndr.extra.fx.transform - -import org.openrndr.draw.Filter1to1 -import org.openrndr.extra.fx.fx_flip_vertically -import org.openrndr.extra.fx.mppFilterShader - -/** - * Vertically flips in the input image - */ -class FlipVertically : Filter1to1(mppFilterShader(fx_flip_vertically, "flip-vertically")) \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoApproximateGaussianBlur01.kt b/orx-fx/src/jvmDemo/kotlin/DemoApproximateGaussianBlur01.kt deleted file mode 100644 index 7e8258a2..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoApproximateGaussianBlur01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import org.openrndr.extra.imageFit.imageFit - -/** - * Demonstrates how to use the [ApproximateGaussianBlur] effect to blur - * a `colorBuffer`, in this case, an image loaded from disk. - * - * Notice the use of `createEquivalent()`, which creates a new `colorBuffer` - * with the same size and properties as a source `colorBuffer`. - * - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - val blurred = image.createEquivalent() - val blur = ApproximateGaussianBlur() - - var enableWrap = false - - mouse.buttonDown.listen { - enableWrap = !enableWrap - } - extend { - blur.wrapU = enableWrap - blur.wrapV = enableWrap - blur.sigma = 15.0 - blur.window = 15 - blur.apply(image, blurred) - drawer.imageFit(blurred, drawer.bounds) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoBlend01.kt b/orx-fx/src/jvmDemo/kotlin/DemoBlend01.kt deleted file mode 100644 index c8e49d06..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoBlend01.kt +++ /dev/null @@ -1,28 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.fx.blend.* - -fun main() = application { - program { - val add = Add() - val colorBurn = ColorBurn() - val colorDodge = ColorDodge() - val darken = Darken() - val destIn = DestinationIn() - val destOut = DestinationOut() - val destAtop = DestinationAtop() - val hardLight = HardLight() - val lighten = Lighten() - val multiply = Multiply() - val multiplyContrast = MultiplyContrast() - val normal = Normal() - val overlay = Overlay() - val passthrough = Passthrough() - val screen = Screen() - val sourceIn = SourceIn() - val sourceAtop = SourceAtop() - val sourceOut = SourceOut() - val subtract = Subtract() - val xor = Xor() - application.exit() - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt b/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt deleted file mode 100644 index 355812cc..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt +++ /dev/null @@ -1,136 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blur.* -import org.openrndr.math.Polar -import kotlin.math.sin - -/** - * Demonstrates 9 different blur effects. - * The program draws two moving circles into a [RenderTarget], - * then applies various blurs drawing them in 3 columns and 3 rows. - * - * Each type of blur has different parameters. - * Not all parameters are demonstrated. - */ -fun main() = application { - program { - // In this buffer we will draw some simple shapes - val dry = renderTarget(width / 3, height / 3) { - colorBuffer() - } - - // The list of effects to demo - val effects = listOf( - BoxBlur(), - ApproximateGaussianBlur(), - HashBlur(), - GaussianBlur(), - GaussianBloom(), - FrameBlur(), - ZoomBlur(), - LaserBlur(), - LineBlur() - ) - - // On this buffer we will draw the dry buffer with an effect applied - val wet = colorBuffer(dry.width, dry.height) - - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - - extend { - // Draw two moving circles - drawer.isolatedWithTarget(dry) { - ortho(dry) - - clear(ColorRGBa.BLACK) - - fill = null - stroke = ColorRGBa.PINK - strokeWeight = 20.0 - circle( - bounds.center + - Polar(seconds * 50.0, 100.0).cartesian, - 100.0 + 50.0 * sin(seconds * 2.0) - ) - - fill = ColorRGBa.PINK - stroke = null - circle( - bounds.center + - Polar(seconds * 50.0 + 60, 100.0).cartesian, - 70.0 + 20.0 * sin(seconds * 2.0 + 1) - ) - } - - effects.forEachIndexed { i, blur -> - // Adjust the effect settings. - // All the values could be animated. - when (blur) { - is BoxBlur -> { - blur.window = 30 - } - - is ApproximateGaussianBlur -> { - blur.window = 25 - blur.sigma = 15.0 - } - - is HashBlur -> { - blur.samples = 50 - blur.radius = 5.0 - blur.time = seconds - } - - is GaussianBlur -> { - blur.window = 25 - blur.sigma = 15.0 - } - - is GaussianBloom -> { - blur.window = 5 - blur.sigma = 3.0 - blur.gain = 3.0 - blur.noiseSeed = seconds - } - - is FrameBlur -> { - blur.blend = 0.05 - } - - is ZoomBlur -> { - blur.center = Polar(seconds * 77.0, 0.5) - .cartesian - blur.strength = 0.8 - } - - is LaserBlur -> { - blur.center = Polar(seconds * 77.0, 0.5) - .cartesian - blur.aberration = 0.03 - blur.radius = 0.5 - - } - is LineBlur -> { - blur.blurAngle = seconds * 30.0 - blur.spread = 8.0 - } - } - - // Apply the effect on `dry` writing the result to `wet` - blur.apply(dry.colorBuffer(0), wet) - - // Draw `wet` and write the effect name on top - drawer.isolated { - translate( - (i % 3) * width / 3.0, - (i / 3) * height / 3.0 - ) - image(wet) - fontMap = font - text(blur.javaClass.simpleName, 20.0, 30.0) - } - } - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoCannyEdgeDetector01.kt b/orx-fx/src/jvmDemo/kotlin/DemoCannyEdgeDetector01.kt deleted file mode 100644 index 59ffe983..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoCannyEdgeDetector01.kt +++ /dev/null @@ -1,20 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.edges.CannyEdgeDetector - -/** - * Demonstrates the [CannyEdgeDetector] effect applied to a loaded - * color photograph. - */ -fun main() = application { - program { - val image = loadImage("demo-data/images/image-001.png") - val ced = CannyEdgeDetector() - val edges = image.createEquivalent() - extend { - ced.apply(image, edges) - drawer.image(edges) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColorDuotone01.kt b/orx-fx/src/jvmDemo/kotlin/DemoColorDuotone01.kt deleted file mode 100644 index f2739cab..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColorDuotone01.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.color.Duotone - -/** - * This demo shows how to use the [Duotone] filter, - * toggling the `labInterpolation` parameter every second on and off. - * - * The `foregroundColor` and `backgroundColor` parameters are - * left to their defaults. - */ -fun main() = application { - program { - - val image = loadImage("demo-data/images/image-001.png") - val filteredImage = image.createEquivalent() - val duotone = Duotone() - - extend { - duotone.labInterpolation = seconds.mod(2.0) < 1.0 - duotone.apply(image, filteredImage) - drawer.image(filteredImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColorDuotoneGradient01.kt b/orx-fx/src/jvmDemo/kotlin/DemoColorDuotoneGradient01.kt deleted file mode 100644 index fd0a2fd5..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColorDuotoneGradient01.kt +++ /dev/null @@ -1,34 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.color.DuotoneGradient - -/** - * The [DuotoneGradient] effect combines the Duotone effect - * and a linear gradient: two duotone colors are applied on - * one part of the image, and those colors are interpolated - * to two other colors, applied in a different part of the image. - * - * The `rotation` parameter lets us specify in which direction - * the interpolation happens (vertical, horizontal, or something else). - */ -fun main() = application { - program { - val image = loadImage("demo-data/images/image-001.png") - val filteredImage = image.createEquivalent() - val duotone = DuotoneGradient() - duotone.labInterpolation = false - - extend { - duotone.labInterpolation = true - duotone.backgroundColor0 = ColorRGBa.BLACK - duotone.foregroundColor0 = ColorRGBa.RED - duotone.backgroundColor1 = ColorRGBa.BLUE - duotone.foregroundColor1 = ColorRGBa.WHITE - duotone.rotation = seconds * 45.0 - duotone.apply(image, filteredImage) - drawer.image(filteredImage) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColorPosterize01.kt b/orx-fx/src/jvmDemo/kotlin/DemoColorPosterize01.kt deleted file mode 100644 index 88e6f794..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColorPosterize01.kt +++ /dev/null @@ -1,22 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.color.Posterize - -/** - * Demonstration of the [Posterize] effect to reduce the number of colors - * present in an image. - */ -fun main() = application { - program { - val image = loadImage("demo-data/images/image-001.png") - val filteredImage = image.createEquivalent() - val posterize = Posterize() - - extend { - posterize.levels = 2 - posterize.apply(image, filteredImage) - drawer.image(filteredImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColormapGrayscale.kt b/orx-fx/src/jvmDemo/kotlin/DemoColormapGrayscale.kt deleted file mode 100644 index 06dda92c..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColormapGrayscale.kt +++ /dev/null @@ -1,25 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.colormap.GrayscaleColormap -import kotlin.math.sin - -/** - * The [GrayscaleColormap] uses the red channel of a colorBuffer - * to produce a gray scale image. The `curve` parameter is used as - * an exponent to bias the result up or down. 1.0 produces a linear - * transformation. - */ -fun main() = application { - program { - val colormap = GrayscaleColormap() - val image = loadImage("demo-data/images/image-001.png") - val colormapImage = image.createEquivalent(type = ColorType.FLOAT32) - extend { - colormap.curve = 1.0 + sin(seconds) * .5 - colormap.apply(image, colormapImage) - drawer.image(colormapImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColormapSpectralZucconi.kt b/orx-fx/src/jvmDemo/kotlin/DemoColormapSpectralZucconi.kt deleted file mode 100644 index 61a64c9d..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColormapSpectralZucconi.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.colormap.SpectralZucconiColormap -import kotlin.math.sin - -/** - * Demonstrates the [SpectralZucconiColormap], which - * maps values of the RED color channel to the natural light dispersion - * spectrum as described by Alan Zucconi in his - * [Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) - * article. - */ -fun main() = application { - program { - val colormap = SpectralZucconiColormap() - val image = loadImage("demo-data/images/image-001.png") - val colormapImage = image.createEquivalent(type = ColorType.FLOAT32) - extend { - colormap.curve = 1.0 + sin(seconds) * .5 - colormap.apply(image, colormapImage) - drawer.image(colormapImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoColormapTurbo.kt b/orx-fx/src/jvmDemo/kotlin/DemoColormapTurbo.kt deleted file mode 100644 index fcdb6930..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoColormapTurbo.kt +++ /dev/null @@ -1,25 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.colormap.TurboColormap -import kotlin.math.sin - -/** - * Demonstrates the use of the [TurboColormap] effect, which - * maps values of the RED color channel to Turbo Colormap according to - * [Turbo, An Improved Rainbow Colormap for Visualization](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html) - * by Google. - */ -fun main() = application { - program { - val colormap = TurboColormap() - val image = loadImage("demo-data/images/image-001.png") - val colormapImage = image.createEquivalent(type = ColorType.FLOAT32) - extend { - colormap.curve = 1.0 + sin(seconds) * .5 - colormap.apply(image, colormapImage) - drawer.image(colormapImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoCompositeFilter01.kt b/orx-fx/src/jvmDemo/kotlin/DemoCompositeFilter01.kt deleted file mode 100644 index 547ea766..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoCompositeFilter01.kt +++ /dev/null @@ -1,85 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.Post -import org.openrndr.extra.fx.blur.DirectionalBlur -import org.openrndr.extra.fx.composite.then -import org.openrndr.extra.fx.grain.FilmGrain -import org.openrndr.extra.noise.* -import org.openrndr.math.smoothstep -import kotlin.math.cos -import kotlin.math.sin - -/** - * Advanced demonstration of composite filters, created by chaining - * several filters together using the `.then()` operator. - * - * The demo applies a [FilmGrain] effect and a [DirectionalBlur] effect twice - * with different parameters. - * - * The [DirectionalBlur] requires a color buffer to define the displacement - * directions. In this program, the direction color buffer is populated by writing - * into its `shadow` property pixel by pixel. - * - * Notice the use of `frameCount` and `seconds` to animate the effects. - * - * The composite effect is installed as a post-processing effect - * using `extend(Post())`, so anything drawn in following `extend` - * blocks is affected by it. - */ -fun main() = application { - program { - // -- create a color buffer and fill it with random direction vectors - val direction = colorBuffer(width, height, type = ColorType.FLOAT32) - val s = direction.shadow - val n = simplex2D.bipolar().fbm().scaleShiftInput(0.01, 0.0, 0.01, 0.0).withVector2Output() - val ng = simplex2D.unipolar().scaleShiftInput(0.005, 0.0, 0.005, 0.0) - for (y in 0 until height) { - for (x in 0 until width) { - val nv = n(2320, x.toDouble(), y.toDouble()) * smoothstep( - 0.45, - 0.55, - ng(1032, x.toDouble(), y.toDouble()) - ) - s[x, y] = ColorRGBa(nv.x, nv.y, 0.0, 1.0) - } - } - s.upload() - - val directional = DirectionalBlur() - - // -- create a bidirectional composite filter by using a directional filter twice - val bidirectional = directional.then(directional) { - firstParameters { - window = 50 - spread = 1.5 + sin(seconds) - perpendicular = false - } - secondParameters { - window = 3 - spread = 1.5 + cos(seconds) - perpendicular = true - } - } - - val grain = FilmGrain() - grain.grainStrength = 1.0 - - // -- create a grain-blur composite filter - val grainBlur = bidirectional.then(grain) - - extend(Post()) { - post { input, output -> - grain.time = frameCount * 1.0 - grainBlur.apply(arrayOf(input, direction), output) - } - } - - val image = loadImage("demo-data/images/image-001.png") - extend { - drawer.image(image) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoContour01.kt b/orx-fx/src/jvmDemo/kotlin/DemoContour01.kt deleted file mode 100644 index ee81f248..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoContour01.kt +++ /dev/null @@ -1,64 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.edges.Contour -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - -/** - * Demonstrates the [Contour] filter. - * @author Edwin Jakobs - * - * This demo creates a grid of 2x2 to draw a loaded image four times, - * each using the [Contour] effect with different parameters. - * - * `actions` is a variable containing a list of 4 functions. - * Each of these functions sets the effect parameters to different values. - * - * The 4 grid cells and the 4 actions are used in pairs: - * first the action is called to set the effect parameters, the - * effect is applied, and the result is drawn in a cell. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - val contour = Contour() - contour.window = 1 - contour.contourColor = ColorRGBa.PINK - contour.backgroundOpacity = 0.0 - - val edges = image.createEquivalent() - - val cells = drawer.bounds.grid(2, 2).flatten() - val actions = listOf( - { - contour.outputBands = true - contour.levels = 2.0 - }, - { - contour.outputBands = false - contour.levels = 2.0 - }, - { - contour.outputBands = false - contour.levels = 8.0 - }, - { - contour.outputBands = true - contour.levels = 8.0 - }, - ) - extend { - for ((cell, action) in cells zip actions) { - action() - contour.apply(image, edges) - drawer.imageFit(edges, cell) - } - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalBlur01.kt b/orx-fx/src/jvmDemo/kotlin/DemoDirectionalBlur01.kt deleted file mode 100644 index d305b18f..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalBlur01.kt +++ /dev/null @@ -1,52 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blur.DirectionalBlur -import org.openrndr.math.smoothstep -import kotlin.math.cos -import kotlin.math.sin - -/** - * Demonstrates how to use [DirectionalBlur] by creating a `direction` - * ColorBuffer in which the red and green components of the pixels point - * in various directions where to sample pixels from. All the pixel colors - * of the ColorBuffer are set one by one using two for loops. - * - * Note the FLOAT32 color type of the buffer to allow for negative values, - * so sampling can happen from every direction. - * - * Every 60 animation frames the `centerWindow` property is toggled - * between true and false to demonstrate how the result changes. - * - */ -fun main() = application { - program { - val db = DirectionalBlur() - val rt = renderTarget(width, height) { - colorBuffer() - } - - val blurred = colorBuffer(width, height) - val direction = colorBuffer(width, height, type = ColorType.FLOAT32) - val s = direction.shadow - for (y in 0 until height) { - for (x in 0 until width) { - val a = smoothstep(0.45, 0.55, cos((x + y) * 0.01) * 0.5 + 0.5) - s[x, y] = ColorRGBa(cos(y * .1) * a, sin(x * 0.1) * a, 0.0, 1.0) - } - } - - s.upload() - val image = loadImage("demo-data/images/image-001.png") - extend { - drawer.isolatedWithTarget(rt) { - clear(ColorRGBa.BLACK) - drawer.image(image) - } - db.window = 10 - db.centerWindow = frameCount % 120 > 60 - db.apply(arrayOf(rt.colorBuffer(0), direction), blurred) - drawer.image(blurred) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace01.kt b/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace01.kt deleted file mode 100644 index fa65dbe5..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace01.kt +++ /dev/null @@ -1,50 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.loadImage -import org.openrndr.drawImage -import org.openrndr.extra.fx.distort.DirectionalDisplace -import org.openrndr.extra.noise.simplex -import org.openrndr.extra.shapes.primitives.grid -import kotlin.math.cos - -/** - * Demonstrate how to use [DirectionalDisplace]. - * - * The direction map is populated using `drawImage` instead of - * pixel by pixel. A grid of circles is drawn, each circle with a - * color based on simplex noise. The R and G channels of the colors - * control the direction of the sampling. By animating the sampling - * distance the result oscillates between no-effect and a noticeable one. - */ -fun main() = application { - program { - val displace = DirectionalDisplace() - - val displaced = colorBuffer(width, height) - val direction = drawImage(width, height, type = ColorType.FLOAT32) { - clear(ColorRGBa.BLACK) - bounds.grid(32, 24).flatten().forEach { - fill = rgb( - simplex(133, it.center * 0.004), - simplex(197, it.center * 0.004), - 0.0 - ) - stroke = null - - //rectangle(it) - circle(it.center, 8.0) - } - } - val image = loadImage("demo-data/images/image-001.png") - extend { - displace.distance = 100.0 + 100.0 * cos(seconds) - displace.wrapX = true - displace.wrapX = true - displace.apply(arrayOf(image, direction), displaced) - drawer.image(displaced) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace02.kt b/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace02.kt deleted file mode 100644 index 50cc280d..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoDirectionalDisplace02.kt +++ /dev/null @@ -1,45 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.loadImage -import org.openrndr.drawImage -import org.openrndr.extra.fx.distort.DirectionalDisplace -import org.openrndr.math.Polar - -/** - * Demonstrate how to use [DirectionalDisplace]. - * - * The program draws 12 overlapping translucent circles on the - * `direction` color buffer to produce new color combinations - * on the overlapping areas. Those colors specify where the - * `DirectionalDisplace` effect will sample pixels from. - */ - -fun main() = application { - program { - val displace = DirectionalDisplace() - - val displaced = colorBuffer(width, height) - val direction = drawImage(width, height, type = ColorType.FLOAT32) { - clear(ColorRGBa.BLACK) - for(x in 0 until 6) { - val offset = Polar(x * 60.0).cartesian - fill = rgb(offset.y, offset.x, 0.0, 0.3) - stroke = null - - val pos = bounds.center - offset * 110.0 - circle(pos, 120.0) - circle(pos, 80.0) - } - } - val image = loadImage("demo-data/images/image-001.png") - extend { - displace.distance = 250.0 - displace.apply(arrayOf(image, direction), displaced) - drawer.image(displaced) - //drawer.image(direction) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDistortLenses01.kt b/orx-fx/src/jvmDemo/kotlin/DemoDistortLenses01.kt deleted file mode 100644 index 8b5fa656..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoDistortLenses01.kt +++ /dev/null @@ -1,30 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.distort.Lenses - -/** - * Demonstrates the [Lenses] effect, which by default subdivides a color buffer - * in 8 columns and 6 rows, and displaces the source texture inside each rectangle. - * Try experimenting with some of the other parameters, like `distort`. - * You can even animate them. - */ -fun main() = application { - configure { - width = 640 - height = 480 - - } - program { - val image = loadImage("demo-data/images/image-001.png") - val lenses = Lenses() - val edges = image.createEquivalent() - extend { - lenses.rotation = 30.0 - lenses.scale = 1.5 - - lenses.apply(image, edges) - drawer.image(edges) - } - } -} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt b/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt deleted file mode 100644 index b1ea9558..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.dither.LumaHalftone - -/** - * Demonstrates the [LumaHalftone] effect and moste of its parameters. - * The `invert` parameter toggles between true and false once per second. - * The `phase0` and `phase1` parameters depend on `seconds`, which makes - * the pattern wobble slowly. - */ -fun main() = application { - program { - val image = loadImage("demo-data/images/image-001.png") - val filteredImage = image.createEquivalent() - val lumaHalftone = LumaHalftone() - extend { - lumaHalftone.rotation = -15.0 - lumaHalftone.freq0 = 100.0 - lumaHalftone.gain1 = 1.0 - lumaHalftone.threshold = 0.5 - lumaHalftone.phase0 = seconds * 0.1 - lumaHalftone.phase1 = -seconds * 0.1 - lumaHalftone.apply(image, filteredImage) - lumaHalftone.invert = seconds.mod(2.0) < 1.0 - drawer.image(filteredImage) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt b/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt deleted file mode 100644 index f30c3bb4..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt +++ /dev/null @@ -1,34 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.createEquivalent -import org.openrndr.extensions.SingleScreenshot -import org.openrndr.extra.fx.distort.FluidDistort -import org.openrndr.extra.fx.patterns.Checkers - -/** - * Demonstrates [FluidDistort], a fluid simulation real time effect. - * All pixels are slowly displaced in a turbulent manner as if they were a gas or a liquid. - */ -fun main() = application { - program { - val fd = FluidDistort() - val checkers = Checkers() - - val image = colorBuffer(width, height) - val distorted = image.createEquivalent() - checkers.size = 64.0 - checkers.apply(emptyArray(), image) - - if (System.getProperty("takeScreenshot") == "true") { - extensions.filterIsInstance().forEach { - it.delayFrames = 150 - } - } - extend { - // Ensure >0.01 for a better screenshot - fd.blend = (mouse.position.x / width).coerceAtLeast(0.01) - fd.apply(image, distorted) - drawer.image(distorted) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoLaserBlur01.kt b/orx-fx/src/jvmDemo/kotlin/DemoLaserBlur01.kt deleted file mode 100644 index 2c844a5a..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoLaserBlur01.kt +++ /dev/null @@ -1,57 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.compositor.compose -//import org.openrndr.extra.compositor.draw -//import org.openrndr.extra.compositor.layer -//import org.openrndr.extra.compositor.post -//import org.openrndr.extra.fx.blur.GaussianBloom -//import org.openrndr.extra.fx.blur.LaserBlur -//import org.openrndr.extra.gui.GUI -//import org.openrndr.extra.gui.addTo -//import org.openrndr.extra.noise.simplex -//import org.openrndr.math.Vector2 -//import kotlin.math.absoluteValue -// -//fun main() = application { -// configure { -// width = 1280 -// height = 720 -// } -// -// program { -// val gui = GUI() -// val c = compose { -// layer { -// draw { -// drawer.fill = null -// drawer.strokeWeight = 4.0 -// drawer.translate(width/2.0, height/2.0) -// drawer.rotate(seconds*45.0 + simplex(0, seconds)*45.0) -// drawer.translate(-width/2.0, -height/2.0) -// for (y in -1..1) { -// for (x in -1..1) { -// drawer.stroke = ColorRGBa.RED.toHSVa() -// .shiftHue(0.0 + simplex(500+x+y,seconds)*5.0) -// .shade(0.5 + 0.5 * simplex(300+x+y,seconds*4.0).absoluteValue) -// .toRGBa() -// val r = simplex(400+x+y, seconds) * 150.0 + 150.0 -// drawer.circle(width / 2.0 + x * 100.0, height / 2.0 + y * 100.0, r) -// } -// } -// } -// post(LaserBlur()) { -// center = Vector2(simplex(2, seconds*0.1), simplex(100, seconds*0.1)) -// aberration = simplex(5, seconds) * 0.01 -// radius = simplex(7, seconds) -// }.addTo(gui) -// post(GaussianBloom()).addTo(gui) -// } -// } -// extend(gui) { -// doubleBind = true -// } -// extend { -// c.draw(drawer) -// } -// } -//} \ No newline at end of file diff --git a/orx-fx/src/jvmDemo/kotlin/DemoOkLab01.kt b/orx-fx/src/jvmDemo/kotlin/DemoOkLab01.kt deleted file mode 100644 index d987d22c..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoOkLab01.kt +++ /dev/null @@ -1,25 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.loadImage -import org.openrndr.extra.fx.color.OkLabToRgb -import org.openrndr.extra.fx.color.RgbToOkLab - -/** - * This demonstrates converting a [ColorBuffer] from and to (OK)LAB color space using the [RgbToOkLab] and [OkLabToRgb] - * filters. The (OK)Lab representation is signed and requires a floating point representation. - */ - -fun main() = application { - program { - val rgbToOkLab = RgbToOkLab() - val okLabToRgb = OkLabToRgb() - val image = loadImage("demo-data/images/image-001.png") - val labImage = image.createEquivalent(type = ColorType.FLOAT32) - rgbToOkLab.apply(image, labImage) - okLabToRgb.apply(labImage, image) - extend { - drawer.image(image) - } - } -} diff --git a/orx-fx/src/jvmDemo/kotlin/DemoPost01.kt b/orx-fx/src/jvmDemo/kotlin/DemoPost01.kt deleted file mode 100644 index 0de32bb4..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoPost01.kt +++ /dev/null @@ -1,36 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.fx.Post -import org.openrndr.extra.fx.blend.Add -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import kotlin.math.cos - -/** - * Demonstrates how to create an `extend` block to apply a post-processing effect. - * The effect is an [ApproximateGaussianBlur] and its `sigma` parameter - * is animated. The Blur effect is combined with whatever the user draws - * in the regular `extend` block using the `Add` filter, resulting in - * an additive composition. - * - * This demo also shows how to make a program window resizable. - */ -fun main() = application { - configure { - windowResizable = true - } - program { - extend(Post()) { - val blur = ApproximateGaussianBlur() - val add = Add() - post { input, output -> - blur.window = 50 - blur.sigma = 50.0 * (cos(seconds) * 0.5 + 0.5) - blur.apply(input, intermediate[0]) - add.apply(arrayOf(input, intermediate[0]), output) - } - } - extend { - drawer.circle(width / 2.0, height / 2.0, 100.0) - } - } -} - diff --git a/orx-fx/src/jvmDemo/kotlin/DemoSpectralBlend01.kt b/orx-fx/src/jvmDemo/kotlin/DemoSpectralBlend01.kt deleted file mode 100644 index d343107b..00000000 --- a/orx-fx/src/jvmDemo/kotlin/DemoSpectralBlend01.kt +++ /dev/null @@ -1,57 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.createEquivalent -import org.openrndr.drawImage -import org.openrndr.extra.fx.blend.BlendSpectral -import org.openrndr.extra.fx.blur.BoxBlur -import org.openrndr.extra.fx.patterns.Checkers -import org.openrndr.math.Vector2 -import kotlin.math.sin - -/** - * Demonstration of how to use the [BlendSpectral] filter to combine two images, using - * this pigment-simulation color mixing approach. - * - * The program: - * - generates two images - * - blurs one of them - * - creates and draws a checkers-pattern as the background - * - mixes and draws both images - * - * The `fill` factor, which controls how the top and the bottom colors are mixed, is animated. - * - * The `clip` parameter is also animated and toggles every 6 seconds. - */ -fun main() = application { - configure { - width = 800 - height = 800 - } - program { - val a = drawImage(width, height) { - drawer.stroke = null - drawer.fill = ColorRGBa.BLUE - drawer.circle(drawer.bounds.center - Vector2(100.0, 0.0), drawer.width * 0.25) - } - val b = drawImage(width, height) { - drawer.clear(ColorRGBa.TRANSPARENT) - drawer.stroke = ColorRGBa.RED - drawer.strokeWeight = 10.0 - drawer.fill = ColorRGBa.YELLOW.opacify(1.0) - drawer.circle(drawer.bounds.center + Vector2(100.0, 0.0), drawer.width * 0.25) - } - BoxBlur().apply { window = 10 }.apply(b, b) - val checked = a.createEquivalent() - Checkers().apply(emptyArray(), checked) - - val mixed = a.createEquivalent() - val blendSpectral = BlendSpectral() - extend { - drawer.image(checked) - blendSpectral.fill = sin(seconds) * 0.5 + 0.5 - blendSpectral.clip = seconds.mod(12.0) > 6.0 - blendSpectral.apply(a, b, mixed) - drawer.image(mixed) - } - } -} diff --git a/orx-fx/src/shaders/glsl/antialias/fxaa.frag b/orx-fx/src/shaders/glsl/antialias/fxaa.frag deleted file mode 100644 index bf854232..00000000 --- a/orx-fx/src/shaders/glsl/antialias/fxaa.frag +++ /dev/null @@ -1,111 +0,0 @@ -uniform float lumaThreshold; -uniform float maxSpan; -uniform float directionReduceMultiplier; -uniform float directionReduceMinimum; - -uniform sampler2D tex0; - -in vec2 v_texCoord0; - - -out vec4 fragColor; - -// see FXAA -// http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf -// http://iryoku.com/aacourse/downloads/09-FXAA-3.11-in-15-Slides.pdf -// http://horde3d.org/wiki/index.php5?title=Shading_Technique_-_FXAA - -void main(void) { - const int u_showEdges = 0; - const int u_fxaaOn = 1; - - vec2 u_texelStep = 1.0 / textureSize(tex0, 0); - vec3 rgbM = min(vec3(1), texture(tex0, v_texCoord0).rgb); - - // Possibility to toggle FXAA on and off. - if (u_fxaaOn == 0) - { - fragColor = vec4(rgbM, 1.0); - return; - } - - // Sampling neighbour texels. Offsets are adapted to OpenGL texture coordinates. - vec3 rgbNW = min(vec3(1),textureOffset(tex0, v_texCoord0, ivec2(-1, 1)).rgb); - vec3 rgbNE = min(vec3(1),textureOffset(tex0, v_texCoord0, ivec2(1, 1)).rgb); - vec3 rgbSW = min(vec3(1),textureOffset(tex0, v_texCoord0, ivec2(-1, -1)).rgb); - vec3 rgbSE = min(vec3(1),textureOffset(tex0, v_texCoord0, ivec2(1, -1)).rgb); - - // see http://en.wikipedia.org/wiki/Grayscale - const vec3 toLuma = vec3(0.299, 0.587, 0.114); - - // Convert from RGB to luma. - float lumaNW = dot(rgbNW, toLuma); - float lumaNE = dot(rgbNE, toLuma); - float lumaSW = dot(rgbSW, toLuma); - float lumaSE = dot(rgbSE, toLuma); - float lumaM = dot(rgbM, toLuma); - - // Gather minimum and maximum luma. - float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); - float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); - - // If contrast is lower than a maximum threshold ... - if (lumaMax - lumaMin < lumaMax * lumaThreshold) - { - // ... do no AA and return. - fragColor = vec4(rgbM, 1.0); - - return; - } - - // Sampling is done along the gradient. - vec2 samplingDirection; - samplingDirection.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); - samplingDirection.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); - - // Sampling step distance depends on the luma: The brighter the sampled texels, the smaller the final sampling step direction. - // This results, that brighter areas are less blurred/more sharper than dark areas. - float samplingDirectionReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * 0.25 * directionReduceMultiplier, directionReduceMinimum); - - // Factor for norming the sampling direction plus adding the brightness influence. - float minSamplingDirectionFactor = 1.0 / (min(abs(samplingDirection.x), abs(samplingDirection.y)) + samplingDirectionReduce); - - // Calculate final sampling direction vector by reducing, clamping to a range and finally adapting to the texture size. - samplingDirection = clamp(samplingDirection * minSamplingDirectionFactor, vec2(-maxSpan, -maxSpan), vec2(maxSpan, maxSpan)) * u_texelStep; - - // Inner samples on the tab. - vec3 rgbSampleNeg = min(vec3(1),texture(tex0, v_texCoord0 + samplingDirection * (1.0/3.0 - 0.5)).rgb); - vec3 rgbSamplePos = min(vec3(1),texture(tex0, v_texCoord0 + samplingDirection * (2.0/3.0 - 0.5)).rgb); - - vec3 rgbTwoTab = (rgbSamplePos + rgbSampleNeg) * 0.5; - - // Outer samples on the tab. - vec3 rgbSampleNegOuter = min(vec3(1),texture(tex0, v_texCoord0 + samplingDirection * (0.0/3.0 - 0.5)).rgb); - vec3 rgbSamplePosOuter = min(vec3(1),texture(tex0, v_texCoord0 + samplingDirection * (3.0/3.0 - 0.5)).rgb); - - vec3 rgbFourTab = (rgbSamplePosOuter + rgbSampleNegOuter) * 0.25 + rgbTwoTab * 0.5; - - // Calculate luma for checking against the minimum and maximum value. - float lumaFourTab = dot(rgbFourTab, toLuma); - - // Are outer samples of the tab beyond the edge ... - if (lumaFourTab < lumaMin || lumaFourTab > lumaMax) - { - // ... yes, so use only two samples. - fragColor = vec4(rgbTwoTab, 1.0); -// fragColor.r = 1.0; - } - else - { - // ... no, so use four samples. - fragColor = vec4(rgbFourTab, 1.0); -// fragColor.g = 1.0; - } - - // Show edges for debug purposes. - if (u_showEdges != 0) - { - fragColor.r = 1.0; - } - //fragColor.rgb = vec3(fragColor.rgb-rgbM)*40.0; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/add.frag b/orx-fx/src/shaders/glsl/blend/add.frag deleted file mode 100644 index f557b46e..00000000 --- a/orx-fx/src/shaders/glsl/blend/add.frag +++ /dev/null @@ -1,40 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a > 0.0 ? a.rgb/a.a : vec3(0.0); - vec3 nb = b.a > 0.0 ? b.rgb/b.a : vec3(0.0); - - vec3 addColor = b.rgb; - - vec4 result; - if (clip) { - result = vec4((na + addColor), 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(min(na + nb, vec3(1.0)), 1.0) + (1.0-b.a) * a; - } - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/color-burn.frag b/orx-fx/src/shaders/glsl/blend/color-burn.frag deleted file mode 100644 index 509bb390..00000000 --- a/orx-fx/src/shaders/glsl/blend/color-burn.frag +++ /dev/null @@ -1,48 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -float blendColorBurn(float base, float blend) { - return (blend==0.0) ? blend : max((1.0 - ((1.0 - base) / blend)), 0.0); -} - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - blendColorBurn(na.r, nb.r), - blendColorBurn(na.g, nb.g), - blendColorBurn(na.b, nb.b) - ); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/color-dodge.frag b/orx-fx/src/shaders/glsl/blend/color-dodge.frag deleted file mode 100644 index 6effa55d..00000000 --- a/orx-fx/src/shaders/glsl/blend/color-dodge.frag +++ /dev/null @@ -1,50 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -float dodge(float base, float blend) { - return (blend==1.0)?blend:min(base/(1.0-blend),1.0); -} - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - dodge(na.r, nb.r), - dodge(na.g, nb.g), - dodge(na.b, nb.b) - ); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif - -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/darken.frag b/orx-fx/src/shaders/glsl/blend/darken.frag deleted file mode 100644 index b2b6e8d4..00000000 --- a/orx-fx/src/shaders/glsl/blend/darken.frag +++ /dev/null @@ -1,43 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - nb.r <= na.r? nb.r : na.r, - nb.g <= na.g? nb.g : na.g, - nb.b <= na.b? nb.b : na.b); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/destination-atop.frag b/orx-fx/src/shaders/glsl/blend/destination-atop.frag deleted file mode 100644 index d727961d..00000000 --- a/orx-fx/src/shaders/glsl/blend/destination-atop.frag +++ /dev/null @@ -1,32 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float lsrc = src.a * (1.0 - dest.a); - float lboth = src.a * dest.a; - - vec4 result = src * lsrc + dest * 0.0 + dest * lboth; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/destination-in.frag b/orx-fx/src/shaders/glsl/blend/destination-in.frag deleted file mode 100644 index 6b0a58c6..00000000 --- a/orx-fx/src/shaders/glsl/blend/destination-in.frag +++ /dev/null @@ -1,30 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float lboth = src.a * dest.a; - vec4 result = dest * lboth; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/destination-out.frag b/orx-fx/src/shaders/glsl/blend/destination-out.frag deleted file mode 100644 index ab5a6d3e..00000000 --- a/orx-fx/src/shaders/glsl/blend/destination-out.frag +++ /dev/null @@ -1,31 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float ldest = dest.a * (1.0 - src.a); - - vec4 result = dest * ldest; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/hard-light.frag b/orx-fx/src/shaders/glsl/blend/hard-light.frag deleted file mode 100644 index ca8cb2bc..00000000 --- a/orx-fx/src/shaders/glsl/blend/hard-light.frag +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - nb.r <= 0.5? 2.0*na.r * nb.r : 1.0 - 2.0*(1.0 - na.r)*(1.0 - nb.r), - nb.g <= 0.5? 2.0*na.g * nb.g : 1.0 - 2.0*(1.0 - na.g)*(1.0 - nb.g), - nb.b <= 0.5? 2.0*na.b * nb.b : 1.0 - 2.0*(1.0 - na.b)*(1.0 - nb.b) - ); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/lighten.frag b/orx-fx/src/shaders/glsl/blend/lighten.frag deleted file mode 100644 index 5484d5b1..00000000 --- a/orx-fx/src/shaders/glsl/blend/lighten.frag +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - nb.r >= na.r? nb.r : na.r, - nb.g >= na.g? nb.g : na.g, - nb.b >= na.b? nb.b : na.b); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/multiply-contrast.frag b/orx-fx/src/shaders/glsl/blend/multiply-contrast.frag deleted file mode 100644 index a0b1e12e..00000000 --- a/orx-fx/src/shaders/glsl/blend/multiply-contrast.frag +++ /dev/null @@ -1,37 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - float ai = max(a.z, max(a.x, a.y)); - float bi = max(b.z, max(b.x, b.y)); - - vec3 f = a.rgb - (1.0-b.rgb)*2.0*b.a; - - vec4 result; - result.rgb = max(vec3(0.0), f) * (1.0) + b.rgb * (1.0-a.a); - result.a = 1.0; - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/multiply.frag b/orx-fx/src/shaders/glsl/blend/multiply.frag deleted file mode 100644 index 0c25658f..00000000 --- a/orx-fx/src/shaders/glsl/blend/multiply.frag +++ /dev/null @@ -1,46 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -vec3 u(vec4 x) { - return x.a == 0.0? vec3(0.0) : x.rgb / x.a; -} - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = u(a); - vec3 nb = u(b); - vec3 mulColor = mix(vec3(1.0), nb, b.a); - - vec4 result; - if (clip) { - result = vec4(a.rgb * mulColor, a.a); - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(na * nb, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} - diff --git a/orx-fx/src/shaders/glsl/blend/normal.frag b/orx-fx/src/shaders/glsl/blend/normal.frag deleted file mode 100644 index cd9f6a5e..00000000 --- a/orx-fx/src/shaders/glsl/blend/normal.frag +++ /dev/null @@ -1,46 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -uniform float opacityA; -uniform float opacityB; - - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - a *= opacityA; - b *= opacityB; - - float alpha = min(1.0, max(0.0, b.a)); - - vec4 result; - if (!clip) { - result = a * (1.0 - alpha) + b; - result.a = clamp(result.a, 0.0, 1.0); - } else { - result = a * (1.0 - alpha) + b * clamp(a.a, 0.0, 1.0); - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/overlay.frag b/orx-fx/src/shaders/glsl/blend/overlay.frag deleted file mode 100644 index 11b14196..00000000 --- a/orx-fx/src/shaders/glsl/blend/overlay.frag +++ /dev/null @@ -1,55 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -vec3 demul(vec4 c) { - if (c.a == 0.0) { - return vec3(0.0); - } else { - return c.rgb / c.a; - } -} - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = demul(a); - vec3 nb = demul(b); - - vec3 m = vec3( - na.r <= 0.5? 2.0 * na.r * nb.r : (1.0 - 2.0 * (1.0 - na.r) * (1.0 - nb.r)), - na.g <= 0.5? 2.0 * na.g * nb.g : (1.0 - 2.0 * (1.0 - na.g) * (1.0 - nb.g)), - na.b <= 0.5? 2.0 * na.b * nb.b : (1.0 - 2.0 * (1.0 - na.b) * (1.0 - nb.b)) - ); - - vec4 result; - if (clip) { - vec3 fc = na * (1.0 - b.a) + m * b.a; - result = vec4(fc, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif - -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/passthrough.frag b/orx-fx/src/shaders/glsl/blend/passthrough.frag deleted file mode 100644 index 667ad4fb..00000000 --- a/orx-fx/src/shaders/glsl/blend/passthrough.frag +++ /dev/null @@ -1,25 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 result = texture(tex0, v_texCoord0); - #else - vec4 result = texture2D(tex0, v_texCoord0); - #endif - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/screen.frag b/orx-fx/src/shaders/glsl/blend/screen.frag deleted file mode 100644 index cd946913..00000000 --- a/orx-fx/src/shaders/glsl/blend/screen.frag +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a; - vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; - - vec3 m = vec3( - 1.0-((1.0-na.r)*(1.0-nb.r)), - 1.0-((1.0-na.g)*(1.0-nb.g)), - 1.0-((1.0-na.b)*(1.0-nb.b))); - - vec4 result; - if (clip) { - result = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(m, 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/source-atop.frag b/orx-fx/src/shaders/glsl/blend/source-atop.frag deleted file mode 100644 index e157a6b0..00000000 --- a/orx-fx/src/shaders/glsl/blend/source-atop.frag +++ /dev/null @@ -1,32 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float ldest = dest.a * (1.0 - src.a); - float lboth = src.a * dest.a; - - vec4 result = dest * ldest + src * lboth; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/source-in.frag b/orx-fx/src/shaders/glsl/blend/source-in.frag deleted file mode 100644 index 572786bd..00000000 --- a/orx-fx/src/shaders/glsl/blend/source-in.frag +++ /dev/null @@ -1,31 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float lboth = src.a * dest.a; - vec4 result = src * lboth; - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/source-out.frag b/orx-fx/src/shaders/glsl/blend/source-out.frag deleted file mode 100644 index 49ff7168..00000000 --- a/orx-fx/src/shaders/glsl/blend/source-out.frag +++ /dev/null @@ -1,31 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float lsrc = src.a * (1.0 - dest.a); - - vec4 result = src * lsrc; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/spectral.frag b/orx-fx/src/shaders/glsl/blend/spectral.frag deleted file mode 100644 index eb63d200..00000000 --- a/orx-fx/src/shaders/glsl/blend/spectral.frag +++ /dev/null @@ -1,209 +0,0 @@ -// Based on -// https://github.com/rvanwijnen/spectral.js/blob/5fb74962ea348f7385edb32bfd0fd55d8585451c/shaders/spectral.glsl - -// MIT License -// -// Copyright (c) 2023 Ronald van Wijnen -// -// 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. - -#ifndef SPECTRAL -#define SPECTRAL - -const int SPECTRAL_SIZE = 38; -const float SPECTRAL_GAMMA = 2.4; -const float SPECTRAL_EPSILON = 0.0001; - -float spectral_uncompand(float x) { - return (x < 0.04045) ? x / 12.92 : pow((x + 0.055) / 1.055, SPECTRAL_GAMMA); -} - -float spectral_compand(float x) { - return (x < 0.0031308) ? x * 12.92 : 1.055 * pow(x, 1.0 / SPECTRAL_GAMMA) - 0.055; -} - -vec3 spectral_srgb_to_linear(vec3 srgb) { - return vec3(spectral_uncompand(srgb[0]), spectral_uncompand(srgb[1]), spectral_uncompand(srgb[2])); -} - -vec3 spectral_linear_to_srgb(vec3 lrgb) { - return clamp(vec3(spectral_compand(lrgb[0]), spectral_compand(lrgb[1]), spectral_compand(lrgb[2])), 0.0, 1.0); -} - -void spectral_upsampling(vec3 lrgb, out float w, out float c, out float m, out float y, out float r, out float g, out float b) { - // EJ: I patched this up to handle out of gamut RGB better. - w = min(lrgb.r, min(lrgb.g, lrgb.b)); - - lrgb -= w; - w = max(0.0, w); - c = max(0.0, min(lrgb.g, lrgb.b)); - m = max(0.0, min(lrgb.r, lrgb.b)); - y = max(0.0, min(lrgb.r, lrgb.g)); - r = min(max(0., lrgb.r - lrgb.b), max(0., lrgb.r - lrgb.g)); - g = min(max(0., lrgb.g - lrgb.b), max(0., lrgb.g - lrgb.r)); - b = min(max(0., lrgb.b - lrgb.g), max(0., lrgb.b - lrgb.r)); -} - -void spectral_linear_to_reflectance(vec3 lrgb, inout float R[SPECTRAL_SIZE]) { - float w, c, m, y, r, g, b; - - spectral_upsampling(lrgb, w, c, m, y, r, g, b); - - R[0] = max(SPECTRAL_EPSILON, w + c * 0.96853629 + m * 0.51567122 + y * 0.02055257 + r * 0.03147571 + g * 0.49108579 + b * 0.97901834); - R[1] = max(SPECTRAL_EPSILON, w + c * 0.96855103 + m * 0.54015520 + y * 0.02059936 + r * 0.03146636 + g * 0.46944057 + b * 0.97901649); - R[2] = max(SPECTRAL_EPSILON, w + c * 0.96859338 + m * 0.62645502 + y * 0.02062723 + r * 0.03140624 + g * 0.40165780 + b * 0.97901118); - R[3] = max(SPECTRAL_EPSILON, w + c * 0.96877345 + m * 0.75595012 + y * 0.02073387 + r * 0.03119611 + g * 0.24490420 + b * 0.97892146); - R[4] = max(SPECTRAL_EPSILON, w + c * 0.96942204 + m * 0.92826996 + y * 0.02114202 + r * 0.03053888 + g * 0.06826880 + b * 0.97858555); - R[5] = max(SPECTRAL_EPSILON, w + c * 0.97143709 + m * 0.97223624 + y * 0.02233154 + r * 0.02856855 + g * 0.02732883 + b * 0.97743705); - R[6] = max(SPECTRAL_EPSILON, w + c * 0.97541862 + m * 0.98616174 + y * 0.02556857 + r * 0.02459485 + g * 0.01360600 + b * 0.97428075); - R[7] = max(SPECTRAL_EPSILON, w + c * 0.98074186 + m * 0.98955255 + y * 0.03330189 + r * 0.01929520 + g * 0.01000187 + b * 0.96663223); - R[8] = max(SPECTRAL_EPSILON, w + c * 0.98580992 + m * 0.98676237 + y * 0.05185294 + r * 0.01423112 + g * 0.01284127 + b * 0.94822893); - R[9] = max(SPECTRAL_EPSILON, w + c * 0.98971194 + m * 0.97312575 + y * 0.10087639 + r * 0.01033111 + g * 0.02636635 + b * 0.89937713); - R[10] = max(SPECTRAL_EPSILON, w + c * 0.99238027 + m * 0.91944277 + y * 0.24000413 + r * 0.00765876 + g * 0.07058713 + b * 0.76070164); - R[11] = max(SPECTRAL_EPSILON, w + c * 0.99409844 + m * 0.32564851 + y * 0.53589066 + r * 0.00593693 + g * 0.70421692 + b * 0.46420440); - R[12] = max(SPECTRAL_EPSILON, w + c * 0.99517200 + m * 0.13820628 + y * 0.79874659 + r * 0.00485616 + g * 0.85473994 + b * 0.20123039); - R[13] = max(SPECTRAL_EPSILON, w + c * 0.99576545 + m * 0.05015143 + y * 0.91186529 + r * 0.00426186 + g * 0.95081565 + b * 0.08808402); - R[14] = max(SPECTRAL_EPSILON, w + c * 0.99593552 + m * 0.02912336 + y * 0.95399623 + r * 0.00409039 + g * 0.97170370 + b * 0.04592894); - R[15] = max(SPECTRAL_EPSILON, w + c * 0.99564041 + m * 0.02421691 + y * 0.97137099 + r * 0.00438375 + g * 0.97651888 + b * 0.02860373); - R[16] = max(SPECTRAL_EPSILON, w + c * 0.99464769 + m * 0.02660696 + y * 0.97939505 + r * 0.00537525 + g * 0.97429245 + b * 0.02060067); - R[17] = max(SPECTRAL_EPSILON, w + c * 0.99229579 + m * 0.03407586 + y * 0.98345207 + r * 0.00772962 + g * 0.97012917 + b * 0.01656701); - R[18] = max(SPECTRAL_EPSILON, w + c * 0.98638762 + m * 0.04835936 + y * 0.98553736 + r * 0.01366120 + g * 0.94258630 + b * 0.01451549); - R[19] = max(SPECTRAL_EPSILON, w + c * 0.96829712 + m * 0.00011720 + y * 0.98648905 + r * 0.03181352 + g * 0.99989207 + b * 0.01357964); - R[20] = max(SPECTRAL_EPSILON, w + c * 0.89228016 + m * 0.00008554 + y * 0.98674535 + r * 0.10791525 + g * 0.99989891 + b * 0.01331243); - R[21] = max(SPECTRAL_EPSILON, w + c * 0.53740239 + m * 0.85267882 + y * 0.98657555 + r * 0.46249516 + g * 0.13823139 + b * 0.01347661); - R[22] = max(SPECTRAL_EPSILON, w + c * 0.15360445 + m * 0.93188793 + y * 0.98611877 + r * 0.84604333 + g * 0.06968113 + b * 0.01387181); - R[23] = max(SPECTRAL_EPSILON, w + c * 0.05705719 + m * 0.94810268 + y * 0.98559942 + r * 0.94275572 + g * 0.05628787 + b * 0.01435472); - R[24] = max(SPECTRAL_EPSILON, w + c * 0.03126539 + m * 0.94200977 + y * 0.98507063 + r * 0.96860996 + g * 0.06111561 + b * 0.01479836); - R[25] = max(SPECTRAL_EPSILON, w + c * 0.02205445 + m * 0.91478045 + y * 0.98460039 + r * 0.97783966 + g * 0.08987709 + b * 0.01515250); - R[26] = max(SPECTRAL_EPSILON, w + c * 0.01802271 + m * 0.87065445 + y * 0.98425301 + r * 0.98187757 + g * 0.13656016 + b * 0.01540513); - R[27] = max(SPECTRAL_EPSILON, w + c * 0.01613460 + m * 0.78827548 + y * 0.98403909 + r * 0.98377315 + g * 0.22169624 + b * 0.01557233); - R[28] = max(SPECTRAL_EPSILON, w + c * 0.01520947 + m * 0.65738359 + y * 0.98388535 + r * 0.98470202 + g * 0.32176956 + b * 0.01565710); - R[29] = max(SPECTRAL_EPSILON, w + c * 0.01475977 + m * 0.59909403 + y * 0.98376116 + r * 0.98515481 + g * 0.36157329 + b * 0.01571025); - R[30] = max(SPECTRAL_EPSILON, w + c * 0.01454263 + m * 0.56817268 + y * 0.98368246 + r * 0.98537114 + g * 0.48361920 + b * 0.01571916); - R[31] = max(SPECTRAL_EPSILON, w + c * 0.01444459 + m * 0.54031997 + y * 0.98365023 + r * 0.98546685 + g * 0.46488579 + b * 0.01572133); - R[32] = max(SPECTRAL_EPSILON, w + c * 0.01439897 + m * 0.52110241 + y * 0.98361309 + r * 0.98550011 + g * 0.47440306 + b * 0.01572502); - R[33] = max(SPECTRAL_EPSILON, w + c * 0.01437620 + m * 0.51041094 + y * 0.98357259 + r * 0.98551031 + g * 0.48576990 + b * 0.01571717); - R[34] = max(SPECTRAL_EPSILON, w + c * 0.01436343 + m * 0.50526577 + y * 0.98353856 + r * 0.98550741 + g * 0.49267971 + b * 0.01571905); - R[35] = max(SPECTRAL_EPSILON, w + c * 0.01435687 + m * 0.50255080 + y * 0.98351247 + r * 0.98551323 + g * 0.49625685 + b * 0.01571059); - R[36] = max(SPECTRAL_EPSILON, w + c * 0.01435370 + m * 0.50126452 + y * 0.98350101 + r * 0.98551563 + g * 0.49807754 + b * 0.01569728); - R[37] = max(SPECTRAL_EPSILON, w + c * 0.01435408 + m * 0.50083021 + y * 0.98350852 + r * 0.98551547 + g * 0.49889859 + b * 0.01570020); -} - -vec3 spectral_xyz_to_srgb(vec3 xyz) { - mat3 XYZ_RGB; - - XYZ_RGB[0] = vec3( 3.24306333, -1.53837619, -0.49893282); - XYZ_RGB[1] = vec3(-0.96896309, 1.87542451, 0.04154303); - XYZ_RGB[2] = vec3( 0.05568392, -0.20417438, 1.05799454); - - float r = dot(XYZ_RGB[0], xyz); - float g = dot(XYZ_RGB[1], xyz); - float b = dot(XYZ_RGB[2], xyz); - - return spectral_linear_to_srgb(vec3(r, g, b)); -} - -vec3 spectral_reflectance_to_xyz(float R[SPECTRAL_SIZE]) { - vec3 xyz = vec3(0.0); - - xyz += R[0] * vec3(0.00006469, 0.00000184, 0.00030502); - xyz += R[1] * vec3(0.00021941, 0.00000621, 0.00103681); - xyz += R[2] * vec3(0.00112057, 0.00003101, 0.00531314); - xyz += R[3] * vec3(0.00376661, 0.00010475, 0.01795439); - xyz += R[4] * vec3(0.01188055, 0.00035364, 0.05707758); - xyz += R[5] * vec3(0.02328644, 0.00095147, 0.11365162); - xyz += R[6] * vec3(0.03455942, 0.00228226, 0.17335873); - xyz += R[7] * vec3(0.03722379, 0.00420733, 0.19620658); - xyz += R[8] * vec3(0.03241838, 0.00668880, 0.18608237); - xyz += R[9] * vec3(0.02123321, 0.00988840, 0.13995048); - xyz += R[10] * vec3(0.01049099, 0.01524945, 0.08917453); - xyz += R[11] * vec3(0.00329584, 0.02141831, 0.04789621); - xyz += R[12] * vec3(0.00050704, 0.03342293, 0.02814563); - xyz += R[13] * vec3(0.00094867, 0.05131001, 0.01613766); - xyz += R[14] * vec3(0.00627372, 0.07040208, 0.00775910); - xyz += R[15] * vec3(0.01686462, 0.08783871, 0.00429615); - xyz += R[16] * vec3(0.02868965, 0.09424905, 0.00200551); - xyz += R[17] * vec3(0.04267481, 0.09795667, 0.00086147); - xyz += R[18] * vec3(0.05625475, 0.09415219, 0.00036904); - xyz += R[19] * vec3(0.06947040, 0.08678102, 0.00019143); - xyz += R[20] * vec3(0.08305315, 0.07885653, 0.00014956); - xyz += R[21] * vec3(0.08612610, 0.06352670, 0.00009231); - xyz += R[22] * vec3(0.09046614, 0.05374142, 0.00006813); - xyz += R[23] * vec3(0.08500387, 0.04264606, 0.00002883); - xyz += R[24] * vec3(0.07090667, 0.03161735, 0.00001577); - xyz += R[25] * vec3(0.05062889, 0.02088521, 0.00000394); - xyz += R[26] * vec3(0.03547396, 0.01386011, 0.00000158); - xyz += R[27] * vec3(0.02146821, 0.00810264, 0.00000000); - xyz += R[28] * vec3(0.01251646, 0.00463010, 0.00000000); - xyz += R[29] * vec3(0.00680458, 0.00249138, 0.00000000); - xyz += R[30] * vec3(0.00346457, 0.00125930, 0.00000000); - xyz += R[31] * vec3(0.00149761, 0.00054165, 0.00000000); - xyz += R[32] * vec3(0.00076970, 0.00027795, 0.00000000); - xyz += R[33] * vec3(0.00040737, 0.00014711, 0.00000000); - xyz += R[34] * vec3(0.00016901, 0.00006103, 0.00000000); - xyz += R[35] * vec3(0.00009522, 0.00003439, 0.00000000); - xyz += R[36] * vec3(0.00004903, 0.00001771, 0.00000000); - xyz += R[37] * vec3(0.00002000, 0.00000722, 0.00000000); - - return xyz; -} - -float spectral_linear_to_concentration(float l1, float l2, float t) { - float t1 = l1 * pow(1.0 - t, 2.0); - float t2 = l2 * pow(t, 2.0); - - return t2 / (t1 + t2); -} - -vec3 spectral_mix(vec3 color1, vec3 color2, float t) { - // EJ: Assume provided arguments are linear rgb - vec3 lrgb1 = color1; - vec3 lrgb2 = color2; - - float R1[SPECTRAL_SIZE]; - float R2[SPECTRAL_SIZE]; - - spectral_linear_to_reflectance(lrgb1, R1); - spectral_linear_to_reflectance(lrgb2, R2); - - float l1 = spectral_reflectance_to_xyz(R1)[1]; - float l2 = spectral_reflectance_to_xyz(R2)[1]; - - t = spectral_linear_to_concentration(l1, l2, t); - - float R[SPECTRAL_SIZE]; - - for (int i = 0; i < SPECTRAL_SIZE; i++) { - float KS = (1.0 - t) * (pow(1.0 - R1[i], 2.0) / (2.0 * R1[i])) + t * (pow(1.0 - R2[i], 2.0) / (2.0 * R2[i])); - float KM = 1.0 + KS - sqrt(pow(KS, 2.0) + 2.0 * KS); - - //Saunderson correction - // let S = ((1.0 - K1) * (1.0 - K2) * KM) / (1.0 - K2 * KM); - - R[i] = KM; - } - - return spectral_xyz_to_srgb(spectral_reflectance_to_xyz(R)); -} - -vec4 spectral_mix(vec4 color1, vec4 color2, float t) { - return vec4(spectral_mix(color1.rgb, color2.rgb, t), mix(color1.a, color2.a, t)); -} - -#endif \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/subtract.frag b/orx-fx/src/shaders/glsl/blend/subtract.frag deleted file mode 100644 index d4f2189a..00000000 --- a/orx-fx/src/shaders/glsl/blend/subtract.frag +++ /dev/null @@ -1,39 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform bool clip; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - vec4 b = texture2D(tex1, v_texCoord0); - #endif - - vec3 na = a.a > 0.0 ? a.rgb/a.a : vec3(0.0); - vec3 nb = b.a > 0.0 ? b.rgb/b.a : vec3(0.0); - vec3 subColor = b.rgb; - vec4 result; - if (clip) { - result = vec4(max(na - subColor, vec3(0.0)), 1) * a.a; - } else { - result = (1.0-a.a) * b + a.a * b.a * vec4(max(na - nb, vec3(0.0)), 1.0) + (1.0-b.a) * a; - } - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blend/xor.frag b/orx-fx/src/shaders/glsl/blend/xor.frag deleted file mode 100644 index 7159d843..00000000 --- a/orx-fx/src/shaders/glsl/blend/xor.frag +++ /dev/null @@ -1,32 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 src = texture(tex0, v_texCoord0); - vec4 dest = texture(tex1, v_texCoord0); - #else - vec4 src = texture2D(tex0, v_texCoord0); - vec4 dest = texture2D(tex1, v_texCoord0); - #endif - - float lsrc = src.a * (1.0 - dest.a); - float ldest = dest.a * (1.0 - src.a); - - vec4 result = src * lsrc + dest * ldest; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag b/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag deleted file mode 100644 index d4b7562f..00000000 --- a/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag +++ /dev/null @@ -1,36 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec2 blurDirection; - -uniform int window; -uniform float sigma; -uniform float spread; -uniform float gain; -uniform int wrapU; -uniform int wrapV; - -uniform int sourceLevel; - -out vec4 o_color; -void main() { - vec2 s = 1.0 / vec2(textureSize(tex0, sourceLevel).xy); - int w = window; - - vec4 sum = vec4(0.0); - float weight = 0.0; - for (int x = -w; x <= w; ++x) { - float lw = exp( float(-(x*x)) / (2.0 * sigma * sigma) ) ; - vec2 tc = v_texCoord0 + float(x) * blurDirection * s;// * spread; - - if (wrapU != 0) { - tc.x = mod(tc.x, 1.0); - } - if (wrapV != 0) { - tc.y = mod(tc.y, 1.0); - } - - sum += texture(tex0, tc) * lw; - weight += lw; - } - o_color = (sum / weight) * gain; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/bloom-combine.frag b/orx-fx/src/shaders/glsl/blur/bloom-combine.frag deleted file mode 100644 index 44e68223..00000000 --- a/orx-fx/src/shaders/glsl/blur/bloom-combine.frag +++ /dev/null @@ -1,14 +0,0 @@ -out vec4 o_output; -in vec2 v_texCoord0; - -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform float gain; -uniform float pregain; -uniform vec4 bias; - -void main() { - o_output = texture(tex0, v_texCoord0) * pregain + texture(tex1, v_texCoord0)*gain; - o_output.a = clamp(o_output.a, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag b/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag deleted file mode 100644 index 42d3e15b..00000000 --- a/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag +++ /dev/null @@ -1,19 +0,0 @@ -highp out vec4 o_output; -highp in vec2 v_texCoord0; -uniform highp sampler2D tex0; - - -// -- based on https://github.com/excess-demogroup/even-laster-engine/blob/a451a89f6bd6d3c6017d5890b92d9f72823bc742/src/shaders/bloom.fra -void main() -{ - float centerWeight = 0.16210282163712664; - vec2 diagonalOffsets = vec2(0.3842896354828526, 1.2048616327242379); - vec4 offsets = vec4(-diagonalOffsets.xy, +diagonalOffsets.xy) / vec2(textureSize(tex0, 0)).xyxy; - float diagonalWeight = 0.2085034734347498; - - o_output = texture(tex0, v_texCoord0) * centerWeight + - texture(tex0, v_texCoord0 + offsets.xy) * diagonalWeight + - texture(tex0, v_texCoord0 + offsets.wx) * diagonalWeight + - texture(tex0, v_texCoord0 + offsets.zw) * diagonalWeight + - texture(tex0, v_texCoord0 + offsets.yz) * diagonalWeight; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag b/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag deleted file mode 100644 index 1a806d39..00000000 --- a/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag +++ /dev/null @@ -1,80 +0,0 @@ -float nrand(vec2 n) { - return fract(sin(dot(n.xy, vec2(12.9898, 78.233))) * 43758.5453); -} - -// -- based on https://github.com/excess-demogroup/even-laster-engine/blob/a451a89f6bd6d3c6017d5890b92d9f72823bc742/src/shaders/bloom_upscale.frag -uniform float noiseSeed; -uniform float shape; -uniform float gain; -uniform float noiseGain; - -in vec2 v_texCoord0; -out vec4 o_output; - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform sampler2D tex2; -uniform sampler2D tex3; -uniform sampler2D tex4; -uniform sampler2D tex5; - -vec4 sampleBloom(vec2 pos, float shape) { - vec4 sum = vec4(0.0); - float total = 0.0; - - { - float weight = pow(0.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex0, pos + rnd * noiseGain) * weight; - total += weight; - } - { - float weight = pow(1.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex1, pos + rnd * noiseGain, 0.0) * weight; - total += weight; - } - { - float weight = pow(2.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex2, pos + rnd * noiseGain) * weight; - total += weight; - } - - { - float weight = pow(3.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex3, pos + rnd * noiseGain) * weight; - total += weight; - } - { - float weight = pow(4.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex4, pos + rnd * noiseGain) * weight; - total += weight; - } - { - float weight = pow(5.0, shape); - vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), - nrand(5.0 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); - sum += texture(tex5, pos + rnd * noiseGain) * weight; - total += weight; - } - - return sum / total; -} - -void main() { - o_output = sampleBloom(v_texCoord0, shape) * gain; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/bloom.frag b/orx-fx/src/shaders/glsl/blur/bloom.frag deleted file mode 100644 index 607c0733..00000000 --- a/orx-fx/src/shaders/glsl/blur/bloom.frag +++ /dev/null @@ -1,18 +0,0 @@ -in vec2 v_texCoord0; -out vec4 o_color; - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform float blendFactor; -uniform float brightness; - -void main() { - vec3 original = texture(tex0, v_texCoord0).rgb; - vec3 bloom = texture(tex1, v_texCoord0).rgb; - - vec3 hdrColor = mix(original, bloom, blendFactor); - - vec3 result = vec3(1.0) - exp(-hdrColor * brightness); - - o_color = vec4(result, 1.0); -} diff --git a/orx-fx/src/shaders/glsl/blur/box-blur.frag b/orx-fx/src/shaders/glsl/blur/box-blur.frag deleted file mode 100644 index 83c48c98..00000000 --- a/orx-fx/src/shaders/glsl/blur/box-blur.frag +++ /dev/null @@ -1,69 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform vec2 textureSize0; -uniform vec2 blurDirection; - -uniform int window; -uniform float sigma; -uniform float gain; -uniform vec4 subtract; -uniform float spread; - -uniform bool wrapX; -uniform bool wrapY; - - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -vec2 wrap(vec2 uv) { - vec2 res = uv; - if (wrapX) { - res.x = mod(res.x, 1.0); - } - if (wrapY) { - res.y = mod(res.y, 1.0); - } - return res; - -} -void main() { - vec2 s = textureSize0; - s = vec2(1.0 / s.x, 1.0 / s.y); - - #ifndef OR_WEBGL1 - int w = window; - int WS = -window; - int WE = window; - #else - int w = 3; - #define WS -3 - #define WE 3 - #endif - - vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); - float weight = 0.0; - for (int x = WS; x<= WE; ++x) { - float lw = 1.0; - #ifndef OR_GL_TEXTURE2D - sum += texture(tex0, wrap(v_texCoord0 + float(x) * blurDirection * s * spread)); - #else - sum += texture2D(tex0, wrap(v_texCoord0 + float(x) * blurDirection * s * spread)); - #endif - - weight += lw; - } - - vec4 result = (sum / weight) * gain; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/directional-blur.frag b/orx-fx/src/shaders/glsl/blur/directional-blur.frag deleted file mode 100644 index 447f8329..00000000 --- a/orx-fx/src/shaders/glsl/blur/directional-blur.frag +++ /dev/null @@ -1,46 +0,0 @@ -in vec2 v_texCoord0; - -uniform bool centerWindow; -uniform sampler2D tex0; // image -uniform sampler2D tex1; // blurDirection -uniform vec2 textureSize0; - -uniform int window; -uniform float gain; -uniform float spread; - -uniform bool wrapX; -uniform bool wrapY; -uniform bool perpendicular; - -out vec4 o_color; - -vec2 wrap(vec2 uv) { - vec2 res = uv; - if (wrapX) { res.x = fract(res.x); } - if (wrapY) { res.y = fract(res.y); } - return res; -} - -void main() { - vec2 s = textureSize0; - s = vec2(1.0 / s.x, 1.0 / s.y); - - vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); - vec2 blurDirection = texture(tex1, v_texCoord0).xy; - if (perpendicular) { - blurDirection = vec2(-blurDirection.y, blurDirection.x); - } - float weight = 0.0; - - int start = centerWindow ? -window / 2 : 0; - int end = centerWindow ? window / 2 + 1 : window; - - for (int x = start; x < end; ++x) { - sum += texture(tex0, wrap(v_texCoord0 + float(x) * blurDirection * s * spread)); - weight += 1.0; - } - - vec4 result = (sum / weight) * gain; - o_color = result; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/directional-hash-blur.frag b/orx-fx/src/shaders/glsl/blur/directional-hash-blur.frag deleted file mode 100644 index 8b8a143a..00000000 --- a/orx-fx/src/shaders/glsl/blur/directional-hash-blur.frag +++ /dev/null @@ -1,79 +0,0 @@ -// based on Hashed blur by David Hoskins. -// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. - -in vec2 v_texCoord0; - -layout(binding = 0) uniform sampler2D tex0; -layout(binding = 1) uniform sampler2D tex1; - -#ifdef RADIUS_FROM_TEXTURE -layout(binding = 2) uniform sampler2D tex2; -#endif - - -uniform vec2 textureSize0; -uniform float radius; -uniform float spread; - -uniform float time; -uniform int samples; -uniform float gain; - -out vec4 o_color; - -#define TAU 6.28318530718 - -//------------------------------------------------------------------------------------------- -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - - -vec2 sampleOffset(inout vec2 r, vec2 direction) { - r = fract(r * vec2(33.3983, 43.4427)); - return (r.x+.001) * direction; -} - -vec2 sampleCircle(inout vec2 r) { - r = fract(r * vec2(33.3983, 43.4427)); - return sqrt(r.x+.001) * vec2(sin(r.y * TAU), cos(r.y * TAU))*.5; // <<=== circular sampling. -} - - -//------------------------------------------------------------------------------------------- -vec4 blur(vec2 uv, float r) { - float radius = r; - #ifdef RADIUS_FROM_TEXTURE - radius *= texture(tex2, uv).r; - #endif - vec2 direction = texture(tex1, uv).xy; - - vec2 line = vec2(spread) * (vec2(1.0) / textureSize0); - vec2 circle = vec2(radius) * (vec2(1.0) / textureSize0); - vec2 randomL = hash22(uv + vec2(time)); - vec2 randomC = hash22(uv + vec2(time)); - - vec4 acc = vec4(0.0); - - for (int i = 0; i < samples; i++) { - vec2 lineOffset = line * sampleOffset(randomL, direction); - vec2 circleOffset = circle * sampleCircle(randomC); - acc += textureLod(tex0, uv + circleOffset + lineOffset, 0 ); - } - return acc / float(samples); -} - -//------------------------------------------------------------------------------------------- -void main() { - vec2 uv = v_texCoord0; - float radiusSqr = pow(radius, 2.0); - - vec4 result = blur(uv, radiusSqr); - result.rgb *= gain; - - - o_color = result; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/frame-blur.frag b/orx-fx/src/shaders/glsl/blur/frame-blur.frag deleted file mode 100644 index 15d55795..00000000 --- a/orx-fx/src/shaders/glsl/blur/frame-blur.frag +++ /dev/null @@ -1,10 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input image -uniform sampler2D tex1; // accumulator image -uniform float blend; -out vec4 o_color; -void main() { - vec4 inputColor = texture(tex0, v_texCoord0); - vec4 accumulator = texture(tex1, v_texCoord0); - o_color = accumulator * (1.0 - blend) + inputColor * blend; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag b/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag deleted file mode 100644 index 13cb3d0f..00000000 --- a/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag +++ /dev/null @@ -1,25 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; - -uniform int window; -uniform float sigma; -uniform float spread; -uniform float gain; - -out vec4 o_color; -void main() { - vec2 s = vec2(textureSize(tex0, 0).xy); - s = vec2(1.0 / s.x, 1.0 / s.y); - int w = window; - - vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); - float weight = 0.0; - for (int y = -w; y <= w; ++y) { - for (int x = -w; x <= w; ++x) { - float lw = exp(-float(x * x + y * y) / (2.0 * sigma * sigma)); - sum += texture(tex0, v_texCoord0 + vec2(x, y) * s * 1.0) * lw; - weight += lw; - } - } - o_color = (sum / weight) * gain; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/hash-blur.frag b/orx-fx/src/shaders/glsl/blur/hash-blur.frag deleted file mode 100644 index 2f52eb88..00000000 --- a/orx-fx/src/shaders/glsl/blur/hash-blur.frag +++ /dev/null @@ -1,71 +0,0 @@ -// based on Hashed blur by David Hoskins. -// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. - -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform vec2 textureSize0; -uniform float radius; -uniform float time; -uniform int samples; -uniform float gain; -uniform bool dynamic; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -#define TAU 6.28318530718 - -//------------------------------------------------------------------------------------------- -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -vec2 sampleTexture(inout vec2 r) { - r = fract(r * vec2(33.3983, 43.4427)); - //return r-.5; - return sqrt(r.x+.001) * vec2(sin(r.y * TAU), cos(r.y * TAU))*.5; // <<=== circular sampling. -} - - -//------------------------------------------------------------------------------------------- -vec4 blur(vec2 uv, float radius) { - float r = radius; - if (dynamic) { - r *= texture(tex1, uv).r; - } - - vec2 circle = vec2(r) * (vec2(1.0) / textureSize0); - vec2 random = hash22(uv + vec2(time)); - - vec4 acc = vec4(0.0); - - for (int i = 0; i < samples; i++) { - acc += texture(tex0, uv + circle * sampleTexture(random)); - } - return acc / float(samples); -} - -//------------------------------------------------------------------------------------------- -void main() { - vec2 uv = v_texCoord0; - float radiusSqr = pow(radius, 2.0); - - vec4 result = blur(uv, radiusSqr); - result.rgb *= gain; - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/kawase-blur.frag b/orx-fx/src/shaders/glsl/blur/kawase-blur.frag deleted file mode 100644 index e88794b9..00000000 --- a/orx-fx/src/shaders/glsl/blur/kawase-blur.frag +++ /dev/null @@ -1,23 +0,0 @@ -out vec4 o_color; -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform int iteration; -uniform float spread; - -void main() { - ivec2 size = textureSize(tex0, 0); - vec2 pixelSize = vec2(1.0/float(size.x), 1.0/float(size.y)); - vec2 halfPixelSize = pixelSize / 2.0f; - vec2 d = (pixelSize.xy * vec2(iteration, iteration)) + halfPixelSize.xy; - d *= spread; - - vec4 dec = vec4(2.2); - vec4 enc = vec4(1.0/2.2); - - vec4 cOut = pow(texture(tex0, v_texCoord0+ vec2(-1, 1)*d), dec); - cOut += pow(texture(tex0, v_texCoord0 + vec2(1, 1)*d), dec); - cOut += pow(texture(tex0, v_texCoord0 + vec2(1, -1)*d), dec); - cOut += pow(texture(tex0, v_texCoord0+ vec2(-1, -1)*d), dec); - - o_color = pow(cOut/4.0, enc); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/laser-blur.frag b/orx-fx/src/shaders/glsl/blur/laser-blur.frag deleted file mode 100644 index 30e43a9c..00000000 --- a/orx-fx/src/shaders/glsl/blur/laser-blur.frag +++ /dev/null @@ -1,36 +0,0 @@ -out vec4 o_output; -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float radius; -uniform float amp0; -uniform float amp1; -uniform vec2 center; -uniform float vignette; -uniform float vignetteSize; -uniform float aberration; - -void main() { - vec4 i0 = texture(tex0, v_texCoord0); - vec2 vt = (v_texCoord0 - vec2(0.5, 0.5) + center) * radius + vec2(0.5, 0.5) - center; - - vec2 size = vec2(textureSize(tex0, 0)); - vec2 l = (v_texCoord0 - vec2(0.5, 0.5) + center) * vec2(1.0, size.y/size.x); - float d = length(l); - - if (vt.x >= 0.0 && vt.y >= 0.0 && vt.x <= 1.0 && vt.y <= 1.0) { - vec4 i1r = texture(tex0, (v_texCoord0 - vec2(0.5, 0.5) + center) * (radius*(1.0 + aberration)) + vec2(0.5, 0.5) - center); - vec4 i1g = texture(tex0, (v_texCoord0 - vec2(0.5, 0.5) + center) * (radius*(1.0)) + vec2(0.5, 0.5) - center); - vec4 i1b = texture(tex0, (v_texCoord0 - vec2(0.5, 0.5) + center) * (radius*(1.0 - aberration)) + vec2(0.5, 0.5) - center); - - i1r.rgb = i1r.a > 0.0 ? i1r.rgb / i1r.a : vec3(0.0); - i1g.rgb = i1g.a > 0.0 ? i1g.rgb / i1g.a : vec3(0.0); - i1b.rgb = i1b.a > 0.0 ? i1b.rgb / i1b.a : vec3(0.0); - - vec4 i1 = vec4(i1r.r, i1g.g, i1b.b, 1.0) * (i1r.a + i1g.a + i1b.a) / 3.0; - o_output = i0 * amp0 + i1 * amp1; - } else { - o_output = i0 * 0.5; - } - - o_output.rgb *= mix(1.0, smoothstep(vignetteSize, 0.0, d), vignette); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/zoom-blur.frag b/orx-fx/src/shaders/glsl/blur/zoom-blur.frag deleted file mode 100644 index 7230d4f3..00000000 --- a/orx-fx/src/shaders/glsl/blur/zoom-blur.frag +++ /dev/null @@ -1,39 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform vec2 center; -uniform float strength; -uniform vec2 dimensions; - -out vec4 o_color; - -float random(vec3 scale, float seed) { - /* use the fragment position for a different seed per-pixel */ - return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed); -} - -// Implementation by Evan Wallace (glfx.js) -void main() { - vec4 color = vec4(0.0); - float total = 0.0; - vec2 toCenter = center - v_texCoord0; - - /* randomize the lookup values to hide the fixed number of samples */ - float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0); - - for (float t = 0.0; t <= 40.0; t++) { - float percent = (t + offset) / 40.0; - float weight = 4.0 * (percent - percent * percent); - vec4 tex = texture(tex0, v_texCoord0 + toCenter * percent * strength); - - /* switch to pre-multiplied alpha to correctly blur transparent images */ - tex.rgb *= tex.a; - - color += tex * weight; - total += weight; - } - - o_color = color / total; - - /* switch back from pre-multiplied alpha */ - o_color.rgb /= o_color.a + 0.00001; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/chromatic-aberration.frag b/orx-fx/src/shaders/glsl/color/chromatic-aberration.frag deleted file mode 100644 index 52d5490e..00000000 --- a/orx-fx/src/shaders/glsl/color/chromatic-aberration.frag +++ /dev/null @@ -1,21 +0,0 @@ -in vec2 v_texCoord0; - -uniform sampler2D tex0; - -uniform float aberrationFactor; -uniform vec2 dimensions; - -out vec4 o_color; - -void main() { - vec2 uv = v_texCoord0; - float factor = (1.0 / dimensions.x) * aberrationFactor; - - vec4 tex = texture(tex0, uv); - - float r = texture(tex0, vec2(uv.x - factor, uv.y)).r; - float g = tex.g; - float b = texture(tex0, vec2(uv.x + factor, uv.y)).b; - - o_color = vec4(vec3(r, g, b), tex.a); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/color-correction.frag b/orx-fx/src/shaders/glsl/color/color-correction.frag deleted file mode 100644 index 8c3a5ba1..00000000 --- a/orx-fx/src/shaders/glsl/color/color-correction.frag +++ /dev/null @@ -1,67 +0,0 @@ -/* based on "Brightness, contrast, saturation" by WojtaZam: https://www.shadertoy.com/view/XdcXzn */ -uniform float brightness; -uniform float saturation; -uniform float contrast; -uniform float hueShift; -uniform float gamma; -uniform float opacity; -uniform bool clamped; - -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_color; - -mat4 brightnessMatrix(float brightness) { - return mat4(1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - brightness, brightness, brightness, 1); -} - -mat4 contrastMatrix(float contrast) { - float t = (1.0 - contrast) / 2.0; - return mat4(contrast, 0, 0, 0, - 0, contrast, 0, 0, - 0, 0, contrast, 0, - t, t, t, 1 ); -} - -mat4 saturationMatrix(float saturation) { - vec3 luminance = vec3(0.3086, 0.6094, 0.0820); - float oneMinusSat = 1.0 - saturation; - vec3 red = vec3(luminance.x * oneMinusSat); - red += vec3(saturation, 0, 0); - - vec3 green = vec3(luminance.y * oneMinusSat); - green += vec3(0, saturation, 0); - - vec3 blue = vec3(luminance.z * oneMinusSat); - blue += vec3(0, 0, saturation); - - return mat4(red, 0, - green, 0, - blue, 0, - 0, 0, 0, 1 ); -} - -// from starea's https://www.shadertoy.com/view/MdjBRy, which in turn remixed it from mAlk's https://www.shadertoy.com/view/MsjXRt -vec3 shiftHue(in vec3 col, in float Shift) { - vec3 P = vec3(0.55735) * dot(vec3(0.55735), col); - vec3 U = col - P; - vec3 V = cross(vec3(0.55735), U); - col = U * cos(Shift * 6.2832) + V * sin(Shift * 6.2832) + P; - return col; -} - -void main() { - vec4 color = texture(tex0, v_texCoord0); - vec4 nc = (color.a == 0.0) ? vec4(0.0) : vec4(color.rgb / color.a, color.a); - nc.rgb = pow(nc.rgb, vec3(gamma)); - nc.rgb = shiftHue(nc.rgb, (hueShift/360.0)); - vec4 cc = brightnessMatrix(brightness) * contrastMatrix((contrast + 1.0)) * saturationMatrix(saturation + 1.0) * nc; - if(clamped) { - o_color = clamp(vec4(cc.rgb, 1.0) * color.a * opacity, 0.0, 1.0); - } else { - o_color = vec4(cc.rgb, 1.0) * color.a * opacity; - } -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/color-lookup.frag b/orx-fx/src/shaders/glsl/color/color-lookup.frag deleted file mode 100644 index 7e57abf3..00000000 --- a/orx-fx/src/shaders/glsl/color/color-lookup.frag +++ /dev/null @@ -1,40 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform sampler2D lookup; -uniform float seed; -uniform float noiseGain; - - -out vec4 o_color; - -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -// -- from https://github.com/jeromeetienne/threex.coloradjust/blob/master/threex.coloradjust.js -vec4 sampleAs3DTexture(sampler2D lut, vec3 uv, float width) { - float sliceSize = 1.0 / width; // space of 1 slice - float slicePixelSize = sliceSize / width; // space of 1 pixel - float sliceInnerSize = slicePixelSize * (width - 1.0); // space of width pixels - float zSlice0 = min(floor(uv.z * width), width - 1.0); - float zSlice1 = min(zSlice0 + 1.0, width - 1.0); - float xOffset = slicePixelSize * 0.5 + uv.x * sliceInnerSize; - float s0 = xOffset + (zSlice0 * sliceSize); - float s1 = xOffset + (zSlice1 * sliceSize); - vec4 slice0Color = texture(lut, vec2(s0, 1.0-uv.y)); - vec4 slice1Color = texture(lut, vec2(s1, 1.0-uv.y)); - float zOffset = mod(uv.z * width, 1.0); - vec4 result = mix(slice0Color, slice1Color, zOffset); - return result; -} - -void main() { - vec4 color = texture(tex0, v_texCoord0); - vec3 noise = vec3(hash22(v_texCoord0-vec2(seed)), hash22(-v_texCoord0+vec2(seed)).x); - vec3 graded = sampleAs3DTexture(lookup, min(vec3(1.0), max(vec3(0.0),color.rgb + noise * noiseGain)), 16.0).rgb; - o_color.rgb = min(vec3(1.0), max(vec3(0.0), graded)); - o_color.a = color.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/color-mix.frag b/orx-fx/src/shaders/glsl/color/color-mix.frag deleted file mode 100644 index 9c1edbf9..00000000 --- a/orx-fx/src/shaders/glsl/color/color-mix.frag +++ /dev/null @@ -1,18 +0,0 @@ -uniform float[25] colorMatrix; - -vec4 colorTransform(vec4 color, float[25] matrix) { - float r = color.r * matrix[0] + color.g * matrix[5] + color.b * matrix[10] + color.a * matrix[15] + matrix[20]; - float g = color.r * matrix[1] + color.g * matrix[6] + color.b * matrix[11] + color.a * matrix[16] + matrix[21]; - float b = color.r * matrix[2] + color.g * matrix[7] + color.b * matrix[12] + color.a * matrix[17] + matrix[22]; - float a = color.r * matrix[3] + color.g * matrix[8] + color.b * matrix[13] + color.a * matrix[18] + matrix[23]; - return vec4(r, g, b, a); -} - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - o_color = colorTransform(c, colorMatrix); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/color-tint.frag b/orx-fx/src/shaders/glsl/color/color-tint.frag deleted file mode 100644 index b7377985..00000000 --- a/orx-fx/src/shaders/glsl/color/color-tint.frag +++ /dev/null @@ -1,9 +0,0 @@ -uniform vec4 tint; -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - o_color = vec4(c.rgb * tint.rgb, c.a) * tint.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/duotone-gradient.frag b/orx-fx/src/shaders/glsl/color/duotone-gradient.frag deleted file mode 100644 index 23c6a356..00000000 --- a/orx-fx/src/shaders/glsl/color/duotone-gradient.frag +++ /dev/null @@ -1,64 +0,0 @@ -#pragma import color.oklab_to_linear_rgb -#pragma import color.linear_rgb_to_oklab -#pragma import color.linear_rgb_to_srgb -#pragma import color.srgb_to_linear_rgb - -uniform vec4 tint; -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec4 backgroundColor0; -uniform vec4 foregroundColor0; - -uniform vec4 backgroundColor1; -uniform vec4 foregroundColor1; - -uniform bool labInterpolation; -uniform float rotation; -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - if (c.a != 0.0) { - c.rgb /= c.a; - } - float ca = cos(radians(rotation)); - float sa = sin(radians(rotation)); - mat2 rm = mat2(vec2(ca, sa), vec2(-sa, ca)); - - float f = (rm * (v_texCoord0 - vec2(0.5)) + vec2(0.5)).x; - - vec4 bg0 = backgroundColor0; - bg0.rgb *= backgroundColor0.a; - vec4 fg0 = foregroundColor0; - fg0.rgb *= foregroundColor0.a; - - vec4 bg1 = backgroundColor1; - bg1.rgb *= backgroundColor1.a; - vec4 fg1 = foregroundColor1; - fg1.rgb *= foregroundColor1.a; - - - if (!labInterpolation) { - vec4 bg = mix(bg0, bg1, f); - vec4 fg = mix(fg0, fg1, f); - - o_color = mix(bg, fg, c.r) * c.a; - } else { - bg0 = srgb_to_linear_rgb(bg0); - bg0 = linear_rgb_to_oklab(bg0); - fg0 = srgb_to_linear_rgb(fg0); - fg0 = linear_rgb_to_oklab(fg0); - bg1 = srgb_to_linear_rgb(bg1); - bg1 = linear_rgb_to_oklab(bg1); - fg1 = srgb_to_linear_rgb(fg1); - fg1 = linear_rgb_to_oklab(fg1); - - vec4 bg = mix(bg0, bg1, f); - vec4 fg = mix(fg0, fg1, f); - - vec4 m = mix(bg, fg, c.r); - m = oklab_to_linear_rgb(m); - m *= c.a; - m = linear_rgb_to_srgb(m); - o_color = m; - } -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/duotone.frag b/orx-fx/src/shaders/glsl/color/duotone.frag deleted file mode 100644 index e80b1b37..00000000 --- a/orx-fx/src/shaders/glsl/color/duotone.frag +++ /dev/null @@ -1,35 +0,0 @@ -#pragma import color.oklab_to_linear_rgb -#pragma import color.linear_rgb_to_oklab -#pragma import color.linear_rgb_to_srgb -#pragma import color.srgb_to_linear_rgb - -uniform vec4 tint; -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec4 backgroundColor; -uniform vec4 foregroundColor; -uniform bool labInterpolation; -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - if (c.a != 0.0) { - c.rgb /= c.a; - } - - vec4 bg = backgroundColor; - bg.rgb *= backgroundColor.a; - vec4 fg = foregroundColor; - fg.rgb *= foregroundColor.a; - - if (!labInterpolation) { - o_color = mix(bg, fg, c.r) * c.a; - } else { - bg = linear_rgb_to_oklab(bg); - fg = linear_rgb_to_oklab(fg); - - vec4 m = mix(bg, fg, c.r); - m = oklab_to_linear_rgb(m); - m *= c.a; - o_color = m; - } -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/invert.frag b/orx-fx/src/shaders/glsl/color/invert.frag deleted file mode 100644 index 414cd401..00000000 --- a/orx-fx/src/shaders/glsl/color/invert.frag +++ /dev/null @@ -1,14 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float amount; -out vec4 o_color; - -void main() { - vec4 color = texture(tex0, v_texCoord0); - - float a = color.a; - vec3 rgb = a > 0.0 ? color.rgb / a : vec3(0.0); - rgb = mix(rgb, 1.0 - rgb, amount); - - o_color = vec4(rgb * a, a); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/luma-map.frag b/orx-fx/src/shaders/glsl/color/luma-map.frag deleted file mode 100644 index 64c63ed2..00000000 --- a/orx-fx/src/shaders/glsl/color/luma-map.frag +++ /dev/null @@ -1,15 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform vec4 foreground; -uniform vec4 background; -uniform float foregroundOpacity; -uniform float backgroundOpacity; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - vec4 fgc = foreground * foregroundOpacity; - vec4 bgc = background * backgroundOpacity; - float luma = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0)); - o_color = mix(bgc, fgc, luma) * c.a; -} diff --git a/orx-fx/src/shaders/glsl/color/luma-opacity.frag b/orx-fx/src/shaders/glsl/color/luma-opacity.frag deleted file mode 100644 index 2cbb16b0..00000000 --- a/orx-fx/src/shaders/glsl/color/luma-opacity.frag +++ /dev/null @@ -1,15 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float foregroundLuma; -uniform float backgroundLuma; -uniform float foregroundOpacity; -uniform float backgroundOpacity; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - float l = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0)); - float mf = smoothstep(backgroundLuma, foregroundLuma, l); - float o = mix(backgroundOpacity, foregroundOpacity, mf); - o_color = c * o; -} diff --git a/orx-fx/src/shaders/glsl/color/luma-threshold.frag b/orx-fx/src/shaders/glsl/color/luma-threshold.frag deleted file mode 100644 index 557c803a..00000000 --- a/orx-fx/src/shaders/glsl/color/luma-threshold.frag +++ /dev/null @@ -1,16 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform vec4 foreground; -uniform vec4 background; -uniform float foregroundOpacity; -uniform float backgroundOpacity; -uniform float threshold; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - vec4 fgc = foreground * foregroundOpacity; - vec4 bgc = background * backgroundOpacity; - float luma = dot(c.rgb, vec3(1.0/3.0)); - o_color = mix(bgc, fgc, step(threshold, luma )); -} diff --git a/orx-fx/src/shaders/glsl/color/oklab-to-rgb.frag b/orx-fx/src/shaders/glsl/color/oklab-to-rgb.frag deleted file mode 100644 index 501e03f6..00000000 --- a/orx-fx/src/shaders/glsl/color/oklab-to-rgb.frag +++ /dev/null @@ -1,12 +0,0 @@ -#pragma import color.oklab_to_linear_rgb -#pragma import color.linear_rgb_to_srgb -out vec4 o_output; - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -void main() { - vec4 lab = texture(tex0, v_texCoord0); - vec4 rgba = oklab_to_linear_rgb(lab); - o_output = linear_rgb_to_srgb(rgba); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/pal.frag b/orx-fx/src/shaders/glsl/color/pal.frag deleted file mode 100644 index 6d24f0c2..00000000 --- a/orx-fx/src/shaders/glsl/color/pal.frag +++ /dev/null @@ -1,121 +0,0 @@ -// based on https://github.com/svofski/CRT - -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float amount; -uniform float pixelation; -out vec4 o_color; - -// Implementation by Evan Wallace (glfx.js) - -uniform float filter_gain; // 1.0 is kind of normal -uniform float filter_invgain; // 1.6 is normal - -#define PI 3.14159265358 -#define FSC 4433618.75 -#define FLINE 15625 -#define VISIBLELINES 312 - -#define RGB_to_YIQ mat3x3( 0.299 , 0.595716 , 0.211456 , 0.587 , -0.274453 , -0.522591 , 0.114 , -0.321263 , 0.311135 ) -#define YIQ_to_RGB mat3x3( 1.0 , 1.0 , 1.0 , 0.9563 , -0.2721 , -1.1070 , 0.6210 , -0.6474 , 1.7046 ) - -#define RGB_to_YUV mat3x3( 0.299 , -0.14713 , 0.615 , 0.587 , -0.28886 , -0.514991 , 0.114 , 0.436 , -0.10001 ) -#define YUV_to_RGB mat3x3( 1.0 , 1.0 , 1.0 , 0.0 , -0.39465 , 2.03211 , 1.13983 , -0.58060 , 0.0 ) - -#define fetch(ofs,center,invx) texture(tex0, vec2((ofs) * (invx) + center.x, center.y)) - -#define FIRTAPS 20 -const float FIR[FIRTAPS] = float[FIRTAPS] (-0.008030271,0.003107906,0.016841352,0.032545161,0.049360136,0.066256720,0.082120150,0.095848433,0.106453014,0.113151423,0.115441842,0.113151423,0.106453014,0.095848433,0.082120150,0.066256720,0.049360136,0.032545161,0.016841352,0.003107906); - -//#define FIR_GAIN 2.0 -//#define FIR_INVGAIN 1.02 -#define FIR_GAIN filter_gain -#define FIR_INVGAIN filter_invgain - -float width_ratio; -float height_ratio; -float altv; -float invx; - - -float modulated(vec2 xy, float sinwt, float coswt) { - vec3 rgb = fetch(0.0, xy, invx).xyz; - vec3 yuv = RGB_to_YUV * rgb; - - // scanline modulation hack - // yuv.x *= 0.8 + 0.2 * sin(xy.y*2.0*3.1415*200.0); - - return clamp(yuv.x + yuv.y * sinwt + yuv.z * coswt, 0.0, 1.0); -} - -vec2 modem_uv(vec2 xy, int ofs) { - float t = (xy.x + float(ofs) * invx) * float(textureSize(tex0, 0).x); - float wt = t * 2.0 * PI / width_ratio; - - float sinwt = sin(wt); - float coswt = cos(wt + altv); - - vec3 rgb = fetch(float(ofs), xy, invx).xyz; - vec3 yuv = RGB_to_YUV * rgb; - float signal = clamp(yuv.x + yuv.y * sinwt + yuv.z * coswt, 0.0, 1.0); - - return vec2(signal * sinwt, signal * coswt); -} - - -vec3 shadow_mask(vec2 pos){ - const mat2 rot = mat2(0.707,0.707,-0.707,0.707); - vec3 offset = vec3( 0. , 1./3. , 2./3. ); - vec2 spos = pos * rot * vec2(200.0); - vec3 ret = vec3(1); - ret.r = length( fract( spos + vec2(offset.r) ) -.5); - ret.g = length( fract( spos + vec2(offset.g) ) -.5); - ret.b = length( fract( spos + vec2(offset.b) ) -.5); - return clamp( 1.5-ret*2.5 , 0.0, 1.0 ); -} - -// -//void mainmaskImage(out vec4 fragColor, in vec2 fragCoord ){ -// vec2 xy = fragCoord.st / iResolution.xy; -// -// fragColor.rgb = shadow_mask( fragCoord.st/ iResolution.y ) * texture(iChannel0, xy).rgb; -// -// -// if ( fragCoord.y > iResolution.y*.5 ) { -// fragColor = texture(iChannel0, xy); -// } -//} - - -void main() { - // vec2 xy = fragCoord.st / iResolution.xy; - vec2 xy = v_texCoord0; - width_ratio = float(textureSize(tex0, 0).x) / (float(FSC) / float(FLINE)); - height_ratio = float(textureSize(tex0, 0).y) / float(VISIBLELINES); - altv = mod(floor(xy.y * float(VISIBLELINES) + 0.5), 2.0) * PI; - invx = 0.25 / (float(FSC)/float(FLINE)); // equals 4 samples per Fsc period - - // lowpass U/V at baseband - vec2 filtered = vec2(0.0, 0.0); - for (int i = 0; i < FIRTAPS; i++) { - vec2 uv = modem_uv(xy, i - FIRTAPS/2); - filtered += FIR_GAIN * uv * FIR[i]; - } - - float t = xy.x * float(textureSize(tex0, 0).x); - float wt = t * 2.0 * PI / width_ratio; - - float sinwt = sin(wt); - float coswt = cos(wt + altv); - - float luma = modulated(xy, sinwt, coswt) - FIR_INVGAIN * (filtered.x * sinwt + filtered.y * coswt); - vec3 yuv_result = vec3(luma, filtered.x, filtered.y); - - vec3 rgbmask = shadow_mask( xy * vec2(1.0, float(textureSize(tex0,0).x) / float(textureSize(tex0,0).y)) ); // needs anisotropy like: fragCoord.st/ iResolution.y ); - rgbmask = vec3(1.0,1.0,1.0) * (1.0-pixelation) + rgbmask * pixelation; - o_color = texture(tex0,xy) * (1.0-amount) + amount * vec4(rgbmask * ( YUV_to_RGB * yuv_result ), 1.0); - -// if (xy.y>0.5) { -// o_color = texture(tex0, xy); -// } -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/posterize.frag b/orx-fx/src/shaders/glsl/color/posterize.frag deleted file mode 100644 index 40f1ba58..00000000 --- a/orx-fx/src/shaders/glsl/color/posterize.frag +++ /dev/null @@ -1,24 +0,0 @@ -in vec2 v_texCoord0; -uniform int window; -uniform sampler2D tex0; -uniform int levels; -out vec4 o_output; -void main() { - vec4 c = texture(tex0, v_texCoord0); - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - float w = 0.0; - vec3 s = vec3(0.0); - for (int v = -window; v <= window; ++v) { - for (int u = -window; u <= window; ++u) { - vec4 c = texture(tex0, v_texCoord0 + (step/(2.0*float(window))) * vec2(u,v) ); - if (c.a != 0.0) { - c.rgb /= c.a; - } - vec3 q = min(floor(c.rgb * float(levels))/float(levels-1), vec3(1.0)); - s += q; - w += 1.0; - } - } - vec3 q = s / w; - o_output = vec4(q * c.a, c.a); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/rgb-to-oklab.frag b/orx-fx/src/shaders/glsl/color/rgb-to-oklab.frag deleted file mode 100644 index 41192b3f..00000000 --- a/orx-fx/src/shaders/glsl/color/rgb-to-oklab.frag +++ /dev/null @@ -1,12 +0,0 @@ -#pragma import color.linear_rgb_to_oklab -#pragma import color.srgb_to_linear_rgb -out vec4 o_output; - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -void main() { - vec4 srgba = texture(tex0, v_texCoord0); - vec4 rgba = srgb_to_linear_rgb(srgba); - o_output = linear_rgb_to_oklab(rgba); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag b/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag deleted file mode 100644 index 546fe9bf..00000000 --- a/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag +++ /dev/null @@ -1,16 +0,0 @@ -uniform vec4 tint; -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - if (c.a != 0.0) { - c.rgb /= c.a; - } - c.rgb *= 255.0; - float y = 0.0 + 0.299 * c.r + 0.587 * c.g + 0.114 * c.b; - float cb = 128.0 - (0.168736 * c.r) - (0.331264 * c.g) + (0.5 * c.b); - float cr = 128.0 + (0.5 * c.r) - 0.418688 * c.g - 0.081312 * c.b; - o_color = vec4(y/255.0, cb/255.0, cr/255.0, 1.0) * c.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/sepia.frag b/orx-fx/src/shaders/glsl/color/sepia.frag deleted file mode 100644 index 0149c8fb..00000000 --- a/orx-fx/src/shaders/glsl/color/sepia.frag +++ /dev/null @@ -1,18 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float amount; -out vec4 o_color; - -// Implementation by Evan Wallace (glfx.js) -void main() { - vec4 color = texture(tex0, v_texCoord0); - float r = color.r; - float g = color.g; - float b = color.b; - - color.r = min(1.0, (r * (1.0 - (0.607 * amount))) + (g * (0.769 * amount)) + (b * (0.189 * amount))); - color.g = min(1.0, (r * 0.349 * amount) + (g * (1.0 - (0.314 * amount))) + (b * 0.168 * amount)); - color.b = min(1.0, (r * 0.272 * amount) + (g * 0.534 * amount) + (b * (1.0 - (0.869 * amount)))); - - o_color = color; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/set-background.frag b/orx-fx/src/shaders/glsl/color/set-background.frag deleted file mode 100644 index f00e7f85..00000000 --- a/orx-fx/src/shaders/glsl/color/set-background.frag +++ /dev/null @@ -1,10 +0,0 @@ -uniform vec4 background; -uniform float backgroundOpacity; -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - o_color = c + (1.0 - c.a) * background * backgroundOpacity; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/subtract-constant.frag b/orx-fx/src/shaders/glsl/color/subtract-constant.frag deleted file mode 100644 index 3c865a43..00000000 --- a/orx-fx/src/shaders/glsl/color/subtract-constant.frag +++ /dev/null @@ -1,9 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec4 constant; - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - o_color = max(vec4(0.0), c - constant); -} diff --git a/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag b/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag deleted file mode 100644 index 28cabf82..00000000 --- a/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag +++ /dev/null @@ -1,24 +0,0 @@ -uniform vec4 tint; -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; -void main() { - vec2 ts = vec2(textureSize(tex0, 0)); - vec4 c = texture(tex0, v_texCoord0); - - if (c.a != 0.0) { - c.rgb /= c.a; - } - c.rgb *= 255.0; - - float y = c.r; - float cb = c.g; - float cr = c.b; - - float r = y + 1.402 * (cr - 128.0); - float g = y - 0.344136 * (cb - 128.0) - 0.714136 * (cr - 128.0); - float b = y + 1.772 * (cb - 128.0); - - o_color = vec4(r/255.0, g/255.0, b/255.0, 1.0) * c.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/colormap/grayscale-colormap.frag b/orx-fx/src/shaders/glsl/colormap/grayscale-colormap.frag deleted file mode 100644 index 9bd502d1..00000000 --- a/orx-fx/src/shaders/glsl/colormap/grayscale-colormap.frag +++ /dev/null @@ -1,31 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform float minValue; -uniform float maxValue; -uniform float curve; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - float red = texture(tex0, v_texCoord0).r; - #else - float red = texture2D(tex0, v_texCoord0).r; - #endif - float value = (red - minValue) / (maxValue - minValue); - vec3 color = vec3(pow(value, curve)); - color *= step(value, 1.) * step(0., value); - vec4 result = vec4(color, 1.); - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} diff --git a/orx-fx/src/shaders/glsl/colormap/spectral-zucconi-colormap.frag b/orx-fx/src/shaders/glsl/colormap/spectral-zucconi-colormap.frag deleted file mode 100644 index 5d562f01..00000000 --- a/orx-fx/src/shaders/glsl/colormap/spectral-zucconi-colormap.frag +++ /dev/null @@ -1,33 +0,0 @@ -#pragma import colormap.spectral_zucconi6 - -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; // kinect raw -uniform float minValue; -uniform float maxValue; -uniform float curve; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - float red = texture(tex0, v_texCoord0).r; - #else - float red = texture2D(tex0, v_texCoord0).r; - #endif - float value = (red - minValue) / (maxValue - minValue); - vec3 color = spectral_zucconi6(pow(value, curve)); - color *= step(value, 1.) * step(0., value); - vec4 result = vec4(color, 1.); - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} diff --git a/orx-fx/src/shaders/glsl/colormap/turbo-colormap.frag b/orx-fx/src/shaders/glsl/colormap/turbo-colormap.frag deleted file mode 100644 index 0d2c8c7e..00000000 --- a/orx-fx/src/shaders/glsl/colormap/turbo-colormap.frag +++ /dev/null @@ -1,33 +0,0 @@ -#pragma import colormap.turbo_colormap - -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform float minValue; -uniform float maxValue; -uniform float curve; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - float red = texture(tex0, v_texCoord0).r; - #else - float red = texture2D(tex0, v_texCoord0).r; - #endif - float value = (red - minValue) / (maxValue - minValue); - vec3 color = turbo_colormap(pow(value, curve)); - color *= step(value, 1.) * step(0., value); - vec4 result = vec4(color, 1.); - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} diff --git a/orx-fx/src/shaders/glsl/distort/block-repeat.frag b/orx-fx/src/shaders/glsl/distort/block-repeat.frag deleted file mode 100644 index 27fb27bf..00000000 --- a/orx-fx/src/shaders/glsl/distort/block-repeat.frag +++ /dev/null @@ -1,41 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// input -uniform float blockWidth; -uniform float blockHeight; -uniform float blockOffsetX; -uniform float blockOffsetY; -uniform float sourceOffsetX; -uniform float sourceOffsetY; -uniform float sourceScale; - -out vec4 o_color; -void main() { - vec2 uv = v_texCoord0; - vec2 blockSize = vec2(blockWidth, blockHeight); - vec2 blockOffset = vec2(blockOffsetX, blockOffsetY); - vec2 blockCoord = uv / blockSize + blockOffset; - - ivec2 blockIndex = ivec2(blockCoord); - vec2 blockUV = mod(blockCoord - vec2(blockIndex), vec2(1.0)); - vec2 blockAspect = vec2(1.0); - - - if (blockWidth < blockHeight) { - blockAspect = vec2(blockWidth / blockHeight, 1.0); - } - - if (blockHeight < blockWidth) { - blockAspect = vec2(1.0, blockHeight/blockWidth); - } - - vec2 tUV = mix(blockUV * blockSize, blockUV * blockAspect, sourceScale); - -// vec2 fw = fwidth(blockCoord); -// float f = smoothstep(0.0, 0.01, blockUV.x) * smoothstep(0.0, 0.01, blockUV.y); - - vec2 sourceOffset = vec2(sourceOffsetX, sourceOffsetY); - vec2 gx = dFdx(tUV); - vec2 gy = dFdy(tUV); - vec4 c = textureGrad(tex0, mod(tUV + sourceOffset, vec2(1.0)), gx, gy ); - o_color = c; -} diff --git a/orx-fx/src/shaders/glsl/distort/directional-displace.frag b/orx-fx/src/shaders/glsl/distort/directional-displace.frag deleted file mode 100644 index 4b4757f0..00000000 --- a/orx-fx/src/shaders/glsl/distort/directional-displace.frag +++ /dev/null @@ -1,37 +0,0 @@ -in vec2 v_texCoord0; - -uniform sampler2D tex0; // image -uniform sampler2D tex1; // displaceDirection -uniform vec2 textureSize0; - -uniform float gain; -uniform float distance; - -uniform bool wrapX; -uniform bool wrapY; -uniform bool perpendicular; - -out vec4 o_color; - -vec2 wrap(vec2 uv) { - vec2 res = uv; - if (wrapX) { res.x = fract(res.x); } - if (wrapY) { res.y = fract(res.y); } - return res; -} - -void main() { - vec2 s = textureSize0; - s = vec2(1.0 / s.x, 1.0 / s.y); - - vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); - vec2 blurDirection = texture(tex1, v_texCoord0).xy; - if (perpendicular) { - blurDirection = vec2(-blurDirection.y, blurDirection.x); - } - - vec4 result = texture(tex0, wrap(v_texCoord0 + blurDirection * s * distance)) - * gain; - - o_color = result; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/displace-blend.frag b/orx-fx/src/shaders/glsl/distort/displace-blend.frag deleted file mode 100644 index 2990a9be..00000000 --- a/orx-fx/src/shaders/glsl/distort/displace-blend.frag +++ /dev/null @@ -1,42 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// input -uniform sampler2D tex1;// input -uniform float offset; -uniform float gain; -uniform vec2 targetSize; -uniform float rotation; -uniform float feather; -uniform float sourceOpacity; -uniform float targetOpacity; -out vec4 o_color; -void main() { - - - float phi = radians(rotation); - float cp = cos(phi); - float sp = sin(phi); - mat2 rm = mat2(vec2(cp,sp), vec2(-sp,cp)); - - vec4 oa = texture(tex0, v_texCoord0); - vec4 b = texture(tex1, v_texCoord0); - - float ar = targetSize.y / targetSize.x; - - vec4 nb = b.a > 0.0? b/b.a : vec4(0.0); - - vec2 offset = (nb.rg - vec2(offset))*vec2(gain) * nb.a; - offset = rm * offset * vec2(1.0, ar); - - - vec2 step = fwidth(v_texCoord0) * feather; - - vec2 displaced = v_texCoord0 + offset; - - float fx = smoothstep(0.0, step.x, displaced.x) * smoothstep(1.0, 1.0-step.x, displaced.x); - float fy = smoothstep(0.0, step.y, displaced.y) * smoothstep(1.0, 1.0-step.y, displaced.y); - - vec4 a = texture(tex0, displaced) * mix(1.0, fx * fy, b.a); - - o_color = (a + (1.0-a.a) * oa * sourceOpacity) * b.a * targetOpacity + (1.0-b.a*targetOpacity) * oa * sourceOpacity; - -} diff --git a/orx-fx/src/shaders/glsl/distort/fisheye.frag b/orx-fx/src/shaders/glsl/distort/fisheye.frag deleted file mode 100644 index 7faca0b5..00000000 --- a/orx-fx/src/shaders/glsl/distort/fisheye.frag +++ /dev/null @@ -1,41 +0,0 @@ -uniform sampler2D tex0; -uniform float strength; -uniform float feather; -uniform float scale; -uniform float rotation; -in vec2 v_texCoord0; -out vec4 o_color; - -void main() { - vec2 uv = v_texCoord0; - vec2 ts = vec2(textureSize(tex0, 0)); - vec2 step = 1.0 / ts; - - float phi = radians(rotation); - float cp = cos(phi); - float sp = sin(phi); - mat2 rm = mat2(vec2(cp, sp), vec2(-sp, cp)); - - float aspectRatio = ts.y / ts.x; - step.y /= aspectRatio; - step *= feather; - - vec2 intensity = vec2(strength, strength); - - vec2 coords = uv; - coords = (coords - 0.5) * 2.0; - - coords = rm * coords; - - vec2 realCoordOffs; - realCoordOffs.x = (1.0 - coords.y * coords.y) * intensity.y * (coords.x); - realCoordOffs.y = (1.0 - coords.x * coords.x) * intensity.x * (coords.y); - - vec2 fuv = ((uv - realCoordOffs) - vec2(0.5)) * scale + vec2(0.5); - - float fx = smoothstep(0.0, step.x, fuv.x) * smoothstep(1.0, 1.0 - step.x, fuv.x); - float fy = smoothstep(0.0, step.y, fuv.y) * smoothstep(1.0, 1.0 - step.y, fuv.y); - - vec4 color = texture(tex0, fuv) * fx * fy; - o_color = color; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/fluid-distort.frag b/orx-fx/src/shaders/glsl/distort/fluid-distort.frag deleted file mode 100644 index da87c220..00000000 --- a/orx-fx/src/shaders/glsl/distort/fluid-distort.frag +++ /dev/null @@ -1,71 +0,0 @@ -// created by florian berger (flockaroo) - 2016 -// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. - -// single pass CFD -// --------------- -// this is some "computational flockarooid dynamics" ;) -// the self-advection is done purely rotational on all scales. -// therefore i dont need any divergence-free velocity field. -// with stochastic sampling i get the proper "mean values" of rotations -// over time for higher order scales. -// -// try changing "RotNum" for different accuracies of rotation calculation -// for even RotNum uncomment the line #define SUPPORT_EVEN_ROTNUM - -#define RotNum 5 -//#define SUPPORT_EVEN_ROTNUM - -//#define keyTex iChannel3 -//#define KEY_I texture(keyTex,vec2((105.5-32.0)/256.0,(0.5+0.0)/3.0)).x - -const float ang = 2.0*3.1415926535/float(RotNum); -mat2 m = mat2(cos(ang), sin(ang), -sin(ang), cos(ang)); -mat2 mh = mat2(cos(ang*0.5), sin(ang*0.5), -sin(ang*0.5), cos(ang*0.5)); - -uniform sampler2D tex0; -uniform float time; -uniform float random; - -in vec2 v_texCoord0; -uniform vec2 targetSize; - -uniform float blend; - -out vec4 o_color; - -float getRot(vec2 pos, vec2 b) { - vec2 Res = vec2(textureSize(tex0, 0)); - vec2 p = b; - float rot = 0.0; - for (int i = 0; i < RotNum; i++) { - rot += dot(texture(tex0, fract((pos + p) / Res.xy)).xy -vec2(0.5), p.yx * vec2(1.0, -1.0)); - p = m * p; - } - return rot / float(RotNum)/dot(b, b); -} - -void main() { - vec2 pos = v_texCoord0 * targetSize; - vec2 Res = vec2(textureSize(tex0, 0)); - - vec2 b = vec2(cos(ang * random), sin(ang * random)); - vec2 v = vec2(0.0); - float bbMax = 0.5 * Res.y; - bbMax *= bbMax; - for (int l = 0; l < 20; l++) { - if (dot(b, b) > bbMax) break; - vec2 p = b; - for (int i = 0; i < RotNum; i++) { - #ifdef SUPPORT_EVEN_ROTNUM - v += p.yx * getRot(pos + p, -mh * b); - #else - // this is faster but works only for odd RotNum - v += p.yx * getRot(pos + p, b); - #endif - p = m*p; - } - b *= 2.0; - } - o_color = vec4(0.0, 0.0, 0.0, 1.0); - o_color.xy = texture(tex0, fract((pos + v * vec2(-1, 1) * 2.0) / Res.xy)).xy * (1.0-blend) + v_texCoord0 * blend; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/horizontal-wave.frag b/orx-fx/src/shaders/glsl/distort/horizontal-wave.frag deleted file mode 100644 index cb14eadf..00000000 --- a/orx-fx/src/shaders/glsl/distort/horizontal-wave.frag +++ /dev/null @@ -1,30 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// input -uniform float phase; -uniform float amplitude; -uniform float frequency; - -out vec4 o_color; - -uniform int segments; -float truncate(float x, int segments) { - if (segments == 0) { - return x; - } else { - return floor(x * float(segments)) / float(segments); - } -} - -void main() { - vec2 uv = v_texCoord0; - uv.x += amplitude * cos(truncate(uv.y, segments) * 3.1415926535 * frequency + phase * 3.1415926535); - if (uv.x >= 0.0 && uv.x < 1.0) { - if (segments == 0) { - o_color = texture(tex0, uv); - } else { - o_color = textureLod(tex0, uv, 0.0); - } - } else { - o_color = vec4(0.0); - } -} diff --git a/orx-fx/src/shaders/glsl/distort/lenses.frag b/orx-fx/src/shaders/glsl/distort/lenses.frag deleted file mode 100644 index 8240e9fe..00000000 --- a/orx-fx/src/shaders/glsl/distort/lenses.frag +++ /dev/null @@ -1,34 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// input -uniform float scale; -uniform float rotation; -uniform int rows; -uniform int columns; -uniform float distort; - -out vec4 o_color; -void main() { - vec2 uv = v_texCoord0; - vec2 blockSize = vec2(1.0 / float(columns), 1.0 / float(rows)); - vec2 blockIndex = floor(uv / blockSize); - vec2 blockUV = mod(uv/blockSize, vec2(1.0)); - vec2 blockUVC1 = (blockUV - vec2(0.5)) * 2.0; - vec2 blockCenter = (blockIndex + 0.5) * blockSize; - - float ca = cos(radians(rotation)); - float sa = sin(radians(rotation)); - - vec2 ts = vec2(textureSize(tex0, 0)); - mat2 rm = mat2(1.0, 0.0, 0.0, ts.x / ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y / ts.x); - vec2 ruv = (uv - blockCenter); - vec2 luv; - luv.x = (1.0 - blockUVC1.y * blockUVC1.y * distort) * ruv.x; - luv.y = (1.0 - blockUVC1.x * blockUVC1.x * distort) * ruv.y; - vec2 cuv = (rm * luv * scale + blockCenter); - - float sx = step(0.0, cuv.x) * (1.0 - step(1.0, cuv.x)); - float sy = step(0.0, cuv.y) * (1.0 - step(1.0, cuv.y)); - vec4 c = texture(tex0, cuv) * sx * sy; - - o_color = c; -} diff --git a/orx-fx/src/shaders/glsl/distort/perspective-plane.frag b/orx-fx/src/shaders/glsl/distort/perspective-plane.frag deleted file mode 100644 index e1fde908..00000000 --- a/orx-fx/src/shaders/glsl/distort/perspective-plane.frag +++ /dev/null @@ -1,43 +0,0 @@ -// based on https://www.shadertoy.com/view/wsBSWG by bloxard - -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform vec3 cameraPosition; -uniform vec3 planePosition; -uniform mat4 planeMatrix; -uniform bool tile; -uniform vec2 targetSize; -out vec4 o_color; - -void main() { - vec3 vCamPos = cameraPosition; - vec3 vPlanePos = planePosition; - vec3 vPlaneRight = vec3(1.0, 0.0, 0.0); - vec3 vPlaneUp = vec3(0.0, 1.0, 0.0); - - mat3 m = mat3(planeMatrix); - vPlaneUp *= m; - vPlaneRight *= m; - - vec3 vPlaneNormal = normalize(cross(vPlaneRight, vPlaneUp)); - float fPlaneDeltaNormalDistance = dot(vPlanePos, vPlaneNormal) - dot(vPlaneNormal, vCamPos); - vec4 color = vec4(0.); - for (int m = 0; m < 2; m++) { - for (int n = 0; n < 2; n++) { - vec2 s = (v_texCoord0 - vec2(0.5)) * 2.0; - s*= vec2(1.0, targetSize.y / targetSize.x); - vec3 vRayDir = normalize(vec3(s, -1.0)); - float t = fPlaneDeltaNormalDistance / dot(vPlaneNormal, vRayDir); - vec3 hitPos = vCamPos + vRayDir * t; - vec3 delta = hitPos - vPlanePos; - vec2 bary = vec2(dot(delta, vPlaneRight), dot(delta, vPlaneUp)); - - bary /= vec2(1.0, targetSize.y / targetSize.x); - bary += vec2(0.5); - if ((tile || (bary.x >= 0.0 && bary.x <= 1.0 && bary.y >=0.0 && bary.y <= 1.0)) && t > 0.0) { - color += texture(tex0, bary); - } - } - } - o_color = color * 0.25; -} diff --git a/orx-fx/src/shaders/glsl/distort/perturb.frag b/orx-fx/src/shaders/glsl/distort/perturb.frag deleted file mode 100644 index c5305df9..00000000 --- a/orx-fx/src/shaders/glsl/distort/perturb.frag +++ /dev/null @@ -1,173 +0,0 @@ -// uniforms -uniform float gain; -uniform vec3 seed; -uniform float phase; -uniform float radius; -uniform float scale; - -uniform float lacunarity; -uniform float decay; - -uniform int octaves; -uniform sampler2D tex0; - -uniform int xSegments; -uniform int ySegments; - -uniform bool outputUV; -uniform vec2 offset; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -// Simplex Noise 3D Implementation -// Description : Array and textureless GLSL 2D/3D/4D simplex -// noise functions. -// Author : Ian McEwan, Ashima Arts. -// Maintainer : ijm -// Lastmod : 20110822 (ijm) -// License : Copyright (C) 2011 Ashima Arts. All rights reserved. -// Distributed under the MIT License. See LICENSE file. -// https://github.com/ashima/webgl-noise -// https://github.com/stegu/webgl-noise -// -// -vec3 mod289(vec3 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; -} - -vec4 mod289(vec4 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; -} - -vec4 permute(vec4 x) { - return mod289(((x*34.0)+1.0)*x); -} - -vec4 taylorInvSqrt(vec4 r) -{ - return 1.79284291400159 - 0.85373472095314 * r; -} - -float snoise(vec3 v) -{ - const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; - const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); - - // First corner - vec3 i = floor(v + dot(v, C.yyy) ); - vec3 x0 = v - i + dot(i, C.xxx) ; - - // Other corners - vec3 g = step(x0.yzx, x0.xyz); - vec3 l = 1.0 - g; - vec3 i1 = min( g.xyz, l.zxy ); - vec3 i2 = max( g.xyz, l.zxy ); - - // x0 = x0 - 0.0 + 0.0 * C.xxx; - // x1 = x0 - i1 + 1.0 * C.xxx; - // x2 = x0 - i2 + 2.0 * C.xxx; - // x3 = x0 - 1.0 + 3.0 * C.xxx; - vec3 x1 = x0 - i1 + C.xxx; - vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y - vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y - - // Permutations - i = mod289(i); - vec4 p = permute( permute( permute( - i.z + vec4(0.0, i1.z, i2.z, 1.0 )) - + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) - + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); - - // Gradients: 7x7 points over a square, mapped onto an octahedron. - // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) - float n_ = 0.142857142857; // 1.0/7.0 - vec3 ns = n_ * D.wyz - D.xzx; - - vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7) - - vec4 x_ = floor(j * ns.z); - vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) - - vec4 x = x_ *ns.x + ns.yyyy; - vec4 y = y_ *ns.x + ns.yyyy; - vec4 h = 1.0 - abs(x) - abs(y); - - vec4 b0 = vec4( x.xy, y.xy ); - vec4 b1 = vec4( x.zw, y.zw ); - - //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; - //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; - vec4 s0 = floor(b0)*2.0 + 1.0; - vec4 s1 = floor(b1)*2.0 + 1.0; - vec4 sh = -step(h, vec4(0.0)); - - vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; - vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; - - vec3 p0 = vec3(a0.xy,h.x); - vec3 p1 = vec3(a0.zw,h.y); - vec3 p2 = vec3(a1.xy,h.z); - vec3 p3 = vec3(a1.zw,h.w); - - //Normalise gradients - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - - // Mix final noise value - vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); - m = m * m; - return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), - dot(p2,x2), dot(p3,x3) ) ); -} - -vec3 segment(vec3 t, int x, int y) { - float sx = x == 0? t.x : floor(t.x * float(x)) / float(x); - float sy = y == 0? t.y : floor(t.y * float(y)) / float(y); - return vec3(sx,sy, t.z); -} - -void main() { - float tx = 0.0; - float ty = 0.0; - - float _gain = gain; - float shift = 100.0; - - vec3 xseed = vec3(seed.xy, seed.z+radius*cos(phase*3.1415926535)); - vec3 yseed = vec3(seed.yx, seed.z+radius*sin(phase*3.1415926535)); - - vec3 uv = vec3(v_texCoord0 + offset, 1.0) * 2.0 - 1.0; - vec3 px = ((segment(uv, xSegments, ySegments) + xseed) * scale); - vec3 py = ((segment(uv, xSegments, ySegments) + yseed + vec3(100.37, 40.51, 9.43)) * scale); - - for (int o = 0; o < octaves; ++o) { - tx += snoise(px) * _gain; - ty += snoise(py) * _gain; - px = px * lacunarity + shift; - py = py * lacunarity + shift; - _gain *= decay; - } - - vec2 distCoord = v_texCoord0 + vec2(tx, ty); - - if (!outputUV) { - if (distCoord.x >= 0.0 && distCoord.y >= 0.0 && distCoord.x < 1.0 && distCoord.y < 1.0) { - if (xSegments == 0 && ySegments == 0) { - o_output = texture(tex0, distCoord); - } else { - o_output = textureLod(tex0, distCoord, 0.0); - } - } else { - o_output = vec4(0.0); - } - } else { - o_output = vec4(distCoord, 0.0, 1.0); - } -} diff --git a/orx-fx/src/shaders/glsl/distort/polar-to-rectangular.frag b/orx-fx/src/shaders/glsl/distort/polar-to-rectangular.frag deleted file mode 100644 index 8f617524..00000000 --- a/orx-fx/src/shaders/glsl/distort/polar-to-rectangular.frag +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform vec2 textureSize0; -uniform sampler2D tex0; - -uniform bool logPolar; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -#define PI 3.141592653589793 - -void main() { - vec2 uv = v_texCoord0 - vec2(0.5); - float arg = atan(uv.y, uv.x); - - float bias = 0.0; - float radius = logPolar? log(1.0 + length(uv)*(exp(1.0)-bias)) / log(1.0+(exp(1.0)-bias)*sqrt(0.5)) : (length(uv) / sqrt(0.5)); - - vec2 sourceUV = vec2(arg / (2.0 * PI) + 0.5, radius); - - #ifndef OR_GL_TEXTURE2D - vec4 result = texture(tex0, sourceUV); - #else - vec4 result = texture2D(tex0, sourceUV); - #endif - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/rectangular-to-polar.frag b/orx-fx/src/shaders/glsl/distort/rectangular-to-polar.frag deleted file mode 100644 index 6286dd8b..00000000 --- a/orx-fx/src/shaders/glsl/distort/rectangular-to-polar.frag +++ /dev/null @@ -1,41 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform vec2 textureSize0; -uniform sampler2D tex0; -uniform vec2 origin; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -#define PI 3.141592653589793 - -uniform int angleLevels; -uniform int radiusLevels; - -uniform bool logPolar; - -void main() { - vec2 uv = v_texCoord0; - float arg = (uv.x-0.5) * 2.0 * PI; - float radius = logPolar? (((exp(uv.y)-1.0) / (exp(1.0)-1.0))) : uv.y; - - vec2 sourceUV = (radius * sqrt(0.5) * vec2(cos(arg), sin(arg)) + vec2(0.5)); - - #ifndef OR_GL_TEXTURE2D - vec4 result = texture(tex0, sourceUV); - #else - vec4 result = texture2D(tex0, sourceUV); - #endif - - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} - diff --git a/orx-fx/src/shaders/glsl/distort/stack-repeat.frag b/orx-fx/src/shaders/glsl/distort/stack-repeat.frag deleted file mode 100644 index debd0ba6..00000000 --- a/orx-fx/src/shaders/glsl/distort/stack-repeat.frag +++ /dev/null @@ -1,38 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// input -uniform int repeats; -uniform float zoom; -uniform float xOrigin; -uniform float yOrigin; -uniform float xOffset; -uniform float yOffset; -uniform float rotation; - -out vec4 o_color; -void main() { - vec2 origin = vec2((xOrigin+1.0)/2.0, (yOrigin+1.0)/2.0); - vec2 ts = vec2(textureSize(tex0, 0)); - float r = ts.x/ts.y; - vec2 offset = vec2(1.0, r) * vec2(xOffset, yOffset); - vec2 uv = v_texCoord0 - vec2(origin); - float rad = (rotation / 180.0) * 3.1415926535; - vec2 cs0 = vec2(cos(rad), -sin(rad)); - vec2 cs1 = vec2(sin(rad), cos(rad)); - mat2 rotStep = mat2(cs0, cs1); - - mat2 rot = rotStep; - vec4 c = texture(tex0, v_texCoord0); - for (int i = 1; i <= repeats; ++i) { - //vec2 s = (uv * (1.0 + zoom) * i) + vec2(0.5); - vec2 s = (rot * uv * pow(1.0 + zoom, float(i) * 1.0))+ vec2(origin) + vec2(offset) * float(i); - float f = s.x >= 0.0 && s.y > 0.0 && s.x < 1.0 && s.y < 1.0? 1.0 : 0.0; - vec4 sc = texture(tex0, s) * f; - - c = c * (1.0-sc.a) + sc; - if (c.a > 1.0) { - c.a = 1.0; - } - rot *= rotStep; - } - o_color = c; -} diff --git a/orx-fx/src/shaders/glsl/distort/stretch-waves.frag b/orx-fx/src/shaders/glsl/distort/stretch-waves.frag deleted file mode 100644 index 62d4fbe5..00000000 --- a/orx-fx/src/shaders/glsl/distort/stretch-waves.frag +++ /dev/null @@ -1,40 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; - -uniform float phase; -uniform float rotation; -uniform float distortion; -uniform float frequency; -uniform float feather; -out vec4 o_color; - -void main() { - float phi = radians(rotation); - float cp = cos(phi); - float sp = sin(phi); - mat2 rm = mat2(vec2(cp, sp), vec2(-sp, cp)); - mat2 irm = transpose(rm); - - float tw = 1.0 / frequency; - vec2 uv = rm * (v_texCoord0 - vec2(0.5)) + vec2(0.5) + vec2(phase * tw, 0.0); - - float xd = (uv.x) * frequency; - float xo = (fract(xd) - 0.5) * 2.0; - float xf = fract(xd); - - float offs = (1.0- xo * xo) * 1.0 * xo * distortion * 0.5; - float f = mix(1.0, (1.0 - xo * xo), distortion); - - vec2 fuv = uv; - fuv.x = floor(uv.x * frequency) / frequency; - fuv.x += (xf - offs) * tw; - - fuv = irm * (fuv - vec2(0.5) - vec2(phase * tw, 0.0)) + vec2(0.5); - - vec2 step = fwidth(fuv) * feather; - float fx = smoothstep(0.0, step.x, fuv.x) * smoothstep(1.0, 1.0 - step.x, fuv.x); - float fy = smoothstep(0.0, step.y, fuv.y) * smoothstep(1.0, 1.0 - step.y, fuv.y); - - vec4 c = texture(tex0, fuv) * f * fx * fy; - o_color = c; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/tape-noise.frag b/orx-fx/src/shaders/glsl/distort/tape-noise.frag deleted file mode 100644 index edc00ef8..00000000 --- a/orx-fx/src/shaders/glsl/distort/tape-noise.frag +++ /dev/null @@ -1,64 +0,0 @@ -out vec4 o_output; -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float time; - -uniform float gain; -uniform float noiseLow; -uniform float noiseHigh; -uniform vec4 tint; -uniform bool monochrome; -uniform float deformAmplitude; -uniform float deformFrequency; -uniform float gapFrequency; -uniform float gapLow; -uniform float gapHigh; - -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -vec3 saturate(vec3 x) { - return clamp(x, vec3(0.0), vec3(1.0)); -} - -vec3 aberrationColor(float f) { - f = f * 3.0 - 1.5; - return saturate(vec3(-f, 1.0 - abs(f), f)); -} - -void main() { - float dk = 1.0/600.0; - o_output = vec4(0.0); - for (int k = 0; k < 10; ++k ) { - vec2 duv = v_texCoord0; - duv.y += smoothstep(pow(cos(time+float(k)*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.0, v_texCoord0.x)*deformAmplitude * cos((time+float(k)*dk)*deformFrequency); - duv.y += smoothstep(pow(1.0-cos(time+float(k)*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.9, v_texCoord0.x)*deformAmplitude * cos((time+float(k)*dk)*deformFrequency); - duv.y += sin(v_texCoord0.x*3.1415926535)*0.0; - float bc = floor(hash22(vec2(time+float(k)*dk, (time+float(k)*dk)*0.1)).x*20.0); - - float gb3 = floor(duv.y*bc)/bc; - - vec2 v = hash22(duv.xy*0.003+time+float(k)*dk); - vec2 v2 = hash22(duv.xy*0.03+time+float(k)*dk); - vec2 v2b = hash22(duv.yx*0.03+time+float(k)*dk); - float stretch = (cos(time+float(k)*dk)*0.001+0.002)*0.3+0.001; - vec2 h = hash22(duv.yy*stretch+time+float(k)*dk); - float gap = smoothstep(gapLow, gapHigh, cos(gb3*(gapFrequency+duv.y*gapFrequency + (time+float(k)*dk)*gapFrequency) +duv.x*gapFrequency)) * (cos(gb3)*0.5+0.5); - - float r = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.x)*1.0; - float g = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.y)*1.0; - float b = smoothstep(noiseLow, noiseHigh, h.x*gap*v2b.x)*1.0; - float a = smoothstep(noiseLow, noiseHigh, h.x*gap*v2b.y)*1.0; - if (!monochrome) { - o_output += vec4(r, g, b, a)*gain * tint; - } else { - o_output += vec4(r, r, r, a)*gain * tint; - } - } - o_output *= o_output.a; - o_output += texture(tex0, v_texCoord0); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/distort/tiles.frag b/orx-fx/src/shaders/glsl/distort/tiles.frag deleted file mode 100644 index 39173079..00000000 --- a/orx-fx/src/shaders/glsl/distort/tiles.frag +++ /dev/null @@ -1,35 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float rotation; -uniform int xSegments; -uniform int ySegments; - -out vec4 o_color; - -uniform int segments; -float truncate(float x, int segments) { - if (segments == 0) { - return x; - } else { - return floor(x * float(segments)) / float(segments); - } -} - -void main() { - vec2 uv = v_texCoord0 - vec2(0.5); - float cr = cos(radians(rotation)); - float sr = sin(radians(rotation)); - - mat2 rm = mat2(cr, -sr, sr, cr); - - vec2 ruv = rm * uv; - vec2 truv = vec2(truncate(ruv.x, xSegments), truncate(ruv.y, ySegments)); - vec2 tuv = transpose(rm) * truv + vec2(0.5); - - vec4 c = vec4(0.0); - tuv.x = clamp(tuv.x, 0.0, 1.0); - tuv.y = clamp(tuv.y, 0.0, 1.0); - c = texture(tex0, tuv); - - o_color = c * texture(tex0, v_texCoord0).a; -} diff --git a/orx-fx/src/shaders/glsl/distort/uvmap.frag b/orx-fx/src/shaders/glsl/distort/uvmap.frag deleted file mode 100644 index 482012cf..00000000 --- a/orx-fx/src/shaders/glsl/distort/uvmap.frag +++ /dev/null @@ -1,9 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0;// uvmap -uniform sampler2D tex1;// input -out vec4 o_color; - -void main() { - vec2 uv = texture(tex0, v_texCoord0).xy; - o_color = texture(tex1, uv); -} diff --git a/orx-fx/src/shaders/glsl/distort/vertical-wave.frag b/orx-fx/src/shaders/glsl/distort/vertical-wave.frag deleted file mode 100644 index 1eff2f4d..00000000 --- a/orx-fx/src/shaders/glsl/distort/vertical-wave.frag +++ /dev/null @@ -1,30 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; // input -uniform float phase; -uniform float amplitude; -uniform float frequency; - -out vec4 o_color; - -uniform int segments; -float truncate(float x, int segments) { - if (segments == 0) { - return x; - } else { - return floor(x * float(segments)) / float(segments); - } -} - -void main() { - vec2 uv = v_texCoord0; - uv.y += amplitude * sin(truncate(uv.x, segments) * 3.1415926535 * frequency + phase * 3.1415926535); - if (uv.y >= 0.0 && uv.y < 1.0) { - if (segments == 0) { - o_color = texture(tex0, uv); - } else { - o_color = textureLod(tex0, uv, 0.0); - } - } else { - o_color = vec4(0.0); - } -} diff --git a/orx-fx/src/shaders/glsl/distort/video-glitch.frag b/orx-fx/src/shaders/glsl/distort/video-glitch.frag deleted file mode 100644 index 9e5f514e..00000000 --- a/orx-fx/src/shaders/glsl/distort/video-glitch.frag +++ /dev/null @@ -1,56 +0,0 @@ -out vec4 o_output; -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float time; -uniform float amplitude; -uniform float vfreq; -uniform float pfreq; -uniform float hfreq; -uniform float poffset; -uniform float scrollOffset0; -uniform float scrollOffset1; - -uniform float borderHeight; - -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -vec3 saturate(vec3 x) { - return clamp(x, vec3(0.0), vec3(1.0)); -} - -vec4 getVideo(vec2 uv, float amplitude, float seconds) { - float iTime = seconds; - vec2 look = mod(uv, vec2(1.0)); - float window = 1.0/(1.0 + 20.0*(look.y-mod(iTime*vfreq, 1.0))*(look.y-mod(iTime*vfreq, 1.))); - look.x = look.x + sin(look.y*pfreq + poffset * 3.1415)/50.0 *(1.0+cos(iTime*hfreq))*window*amplitude; - look.y = mod(look.y, 1.0); - - vec4 video = texture(tex0, look); - return video; -} - -vec4 aberrationColor(float f) { - f = f * 3.0 - 1.5; - return vec4(saturate(vec3(-f, 1.0 - abs(f), f)), 1.0); -} - -void main() { - vec4 c = vec4(0.0); - float aa = amplitude + smoothstep(borderHeight, 0.0, v_texCoord0.y)*4.0 + smoothstep(1.0-borderHeight, 1.0, v_texCoord0.y)*4.0; - float ds = scrollOffset1 - scrollOffset0; - if (aa > 0.0 || ds > 0.0) { - for (int i = 1; i < 16; ++i) { - vec4 lc = getVideo(v_texCoord0 + vec2(0.0, scrollOffset0+ds*float(i)), aa, time-float(i)/(16.0*60.0)); - c += lc * (3.0/16.0) * aberrationColor(float(i)/16.0); - } - o_output = c; - } else { - vec4 lc = texture(tex0, mod(v_texCoord0 + vec2(0.0, scrollOffset1), vec2(1.0))); - o_output = lc; - } -} diff --git a/orx-fx/src/shaders/glsl/dither/a-dither.frag b/orx-fx/src/shaders/glsl/dither/a-dither.frag deleted file mode 100644 index 8789895e..00000000 --- a/orx-fx/src/shaders/glsl/dither/a-dither.frag +++ /dev/null @@ -1,49 +0,0 @@ -// this shader is based on the "a dither" work by Øyvind Kolås -// https://pippin.gimp.org/a_dither/ - -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform int pattern; -uniform int levels; - -float mask1(int levels, float l, int x, int y, int c) { - float mask = float((x ^ y * 149) * 1234& 511)/511.0; - return floor(float(levels) * l + mask)/float(levels); -} - -float mask2(int levels, float l, int x, int y, int c) { - float mask = float(((x+c*17) ^ y * 149) * 1234 & 511)/511.0; - return floor(float(levels) * l + mask)/float(levels); -} -float mask3(int levels, float l, int x, int y, int c) { - float mask = float((x + y * 237) * 119 & 255)/255.0; - return floor(float(levels) * float(l) + mask)/float(levels); -} - -float mask4(int levels, float l, int x, int y, int c) { - float mask = float(((x+c*67) + y * 236) * 119 & 255)/255.0; - return floor(float(levels) * float(l) + mask)/float(levels); -} - -out vec4 o_color; -void main() { - vec4 c = texture(tex0, v_texCoord0); - if (c.a > 0.0) { - c.rgb/=c.a; - } - ivec2 ic = ivec2(v_texCoord0 * vec2(textureSize(tex0, 0))); - - vec4 rgba = vec4(0.0); - if (pattern == 0) { - rgba = vec4(mask1(levels, c.r, ic.x, ic.y, 0), mask1(levels, c.g, ic.x, ic.y, 1), mask1(levels, c.b, ic.x, ic.y, 2), mask1(levels, c.a, ic.x, ic.y, 3)); - } else if (pattern == 1) { - rgba = vec4(mask2(levels, c.r, ic.x, ic.y, 0), mask2(levels, c.g, ic.x, ic.y, 1), mask2(levels, c.b, ic.x, ic.y, 2), mask2(levels, c.a, ic.x, ic.y, 3)); - } else if (pattern == 2) { - rgba = vec4(mask3(levels, c.r, ic.x, ic.y, 0), mask3(levels, c.g, ic.x, ic.y, 1), mask3(levels, c.b, ic.x, ic.y, 2), mask3(levels, c.a, ic.x, ic.y, 3)); - } else { - rgba = vec4(mask4(levels, c.r, ic.x, ic.y, 0), mask4(levels, c.g, ic.x, ic.y, 1), mask4(levels, c.b, ic.x, ic.y, 2), mask4(levels, c.a, ic.x, ic.y, 3)); - } - - rgba.rgb *= rgba.a; - o_color = rgba; -} diff --git a/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag b/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag deleted file mode 100644 index bd99ff28..00000000 --- a/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag +++ /dev/null @@ -1,111 +0,0 @@ -/* Based on CMYK Halftone by tsone https://www.shadertoy.com/view/Mdf3Dn */ -uniform float dotSize; - -uniform float scale; -uniform float rotation; -uniform float phase; - -uniform float blackRotation; -uniform float yellowRotation; -uniform float magentaRotation; -uniform float cyanRotation; - -uniform vec4 blackColor; -uniform vec4 yellowColor; -uniform vec4 magentaColor; -uniform vec4 cyanColor; - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_color; - -#pragma INSERT_PHRASES - -vec4 rgb2cmyki(in vec3 c) -{ - float k = max(max(c.r, c.g), c.b); - return min(vec4(c.rgb / k, k), 1.0); -} - -vec3 cmyki2rgb(in vec4 c) -{ - return c.rgb * c.a; -} -vec3 u(vec4 c) { - if (c.a == 0.0) { - return vec3(0.0); - } else { - return c.rgb / c.a; - } - -} -vec4 cmyki2rgba(in vec4 cmyk) { - vec4 c = cyanColor * (1.0 - cmyk.r); - vec4 m = magentaColor * (1.0 - cmyk.g); - vec4 y = yellowColor * (1.0 - cmyk.b); - vec4 k = blackColor * (1.0 - cmyk.a); - - vec4 f = c; - f = (1.0 - f.a) * m + f.a * vec4(u(f) * u(m), 1.0) * m.a + (1.0 - m.a) * f; - f = (1.0 - f.a) * y + f.a * vec4(u(f) * u(y), 1.0) * y.a + (1.0 - y.a) * f; - f = (1.0 - f.a) * k + f.a * vec4(u(f) * u(k), 1.0) * k.a + (1.0 - k.a) * f; - return f; -} - - -vec2 px2uv(in vec2 px) -{ - return vec2(px / vec2(textureSize(tex0, 0))); -} - -vec2 grid(in vec2 px) -{ - return px - mod(px, scale); -} - -vec4 ss(in vec4 v) -{ - vec4 vw = fwidth(v); - return smoothstep(vec4(-vw), vec4(vw), v); -} - - -float halftone(in vec2 fc, in mat2 m, int channel) -{ - vec2 smp = (grid(m * fc) + 0.5 * scale) * m; - - float s = length(fc - smp) / (dotSize * 2.0 * scale); - vec2 d2 = m * ((fc) - smp) / (dotSize * 0.5 * scale); - vec3 texc = texture(tex0, px2uv(smp + vec2(textureSize(tex0, 0)) / 2.0)).rgb; - float c = 1.0 - rgb2cmyki(texc)[channel]; - return element(d2, c); -} - -mat2 rotm(in float r) { - float cr = cos(r); - float sr = sin(r); - return mat2(cr, -sr, sr, cr); -} - -void main() { - vec2 fc = (v_texCoord0 - vec2(0.5)) * vec2(textureSize(tex0, 0)); - fc = domainWarp(fc); - - mat2 mc = rotm(rotation + radians(cyanRotation)); - mat2 mm = rotm(rotation + radians(magentaRotation)); - mat2 my = rotm(rotation + radians(yellowRotation)); - mat2 mk = rotm(rotation + radians(blackRotation)); - - vec4 c = cmyki2rgba( - ss(vec4( - halftone(fc, mc, 0), - halftone(fc, mm, 1), - halftone(fc, my, 2), - halftone(fc, mk, 3) - ) - ) - ); - - o_color = c; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/dither/crosshatch.frag b/orx-fx/src/shaders/glsl/dither/crosshatch.frag deleted file mode 100644 index f2847c17..00000000 --- a/orx-fx/src/shaders/glsl/dither/crosshatch.frag +++ /dev/null @@ -1,53 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -out vec4 o_color; - -// thresholds -uniform float t1; -uniform float t2; -uniform float t3; -uniform float t4; - - -// glsl-luma -float luma(vec3 color) { - return dot(color, vec3(0.299, 0.587, 0.114)); -} - -float luma(vec4 color) { - return dot(color.rgb, vec3(0.299, 0.587, 0.114)); -} - -// glsl-crosshatch -vec3 crosshatch(vec3 texColor, float t1, float t2, float t3, float t4) { - float lum = luma(texColor); - vec3 color = vec3(1.0); - if (lum < t1) { - if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) { - color = vec3(0.0); - } - } - if (lum < t2) { - if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) { - color = vec3(0.0); - } - } - if (lum < t3) { - if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) { - color = vec3(0.0); - } - } - if (lum < t4) { - if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) { - color = vec3(0.0); - } - } - return color; -} - - -void main() { - vec4 color = texture(tex0, v_texCoord0); - vec3 demultiplied = color.a == 0.0 ? vec3(0.0) : color.rgb/color.a; - o_color = vec4(crosshatch(demultiplied, t1, t2, t3, t4), 1.0) * color.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/dither/luma-halftone.frag b/orx-fx/src/shaders/glsl/dither/luma-halftone.frag deleted file mode 100644 index ba835e74..00000000 --- a/orx-fx/src/shaders/glsl/dither/luma-halftone.frag +++ /dev/null @@ -1,62 +0,0 @@ -uniform float scale; -uniform float rotation; -in vec2 v_texCoord0; -uniform sampler2D tex0; -out vec4 o_color; -uniform float threshold; - -uniform float freq0; -uniform float freq1; -uniform float gain1; -uniform float phase0; -uniform float phase1; -uniform bool invert; - -float cosine_sample(vec2 uv){ - float ca = cos(radians(rotation)); - float sa = sin(radians(rotation)); - - vec2 ts = vec2(textureSize(tex0, 0)); - mat2 rm = mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x); - - vec2 cuv = (rm * (uv - vec2(0.5))) + vec2(0.5); - - float m = fract(phase0 + cuv.x*freq0 + cos(cuv.y*freq1+phase1*3.141592653)*gain1); - vec4 c = texture(tex0, v_texCoord0); - if (c.a != 0.0) { - c.rgb /= c.a; - } - float l = dot(vec3(1.0/3.0), c.rgb); - if (invert) { - l = 1.0 - l; - } - - float t = 0.0; - t = step(threshold, l * m); - return t; -} - -float cosine_halftone(vec2 uv) { - int w = 3; - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - step /= (2.0*float(w)); - float weight = 0.0; - float sum = 0.0; - for (int v = -w; v <= w; ++v) { - for (int u = -w; u <= w; ++u) { - sum += cosine_sample(uv + step * vec2(u, v)); - weight+=1.0; - } - } - return sum / weight; -} - - -void main() { - vec4 c = texture(tex0, v_texCoord0); - float t = cosine_halftone(v_texCoord0); - if (invert) { - t = 1.0 - t; - } - o_color = vec4(t, t, t, 1.0) * c.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag b/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag deleted file mode 100644 index 6915556c..00000000 --- a/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag +++ /dev/null @@ -1,116 +0,0 @@ -// https://www.shadertoy.com/view/sdcSz2 -// ref: (in japanese) -// https://imagingsolution.net/imaging/canny-edge-detector/ -uniform float thickness; -uniform sampler2D tex0; - -in vec2 v_texCoord0; -out vec4 o_output; - -uniform float threshold0; -uniform float threshold1; - -uniform vec4 backgroundColor; -uniform vec4 foregroundColor; -uniform float backgroundOpacity; -uniform float foregroundOpacity; - -uniform float fade; - -vec2 iResolution; - -float getAve(vec2 uv) { - vec3 rgb = texture(tex0, uv).rgb; - vec3 lum = vec3(0.299, 0.587, 0.114); - return dot(lum, rgb); -} - -// Detect edge. -vec4 sobel(vec2 fragCoord, vec2 dir) { - vec2 uv = fragCoord / iResolution.xy; - vec2 texel = 1. / iResolution.xy; - float np = getAve(uv + (vec2(-1, + 1) + dir) * texel * thickness); - float zp = getAve(uv + (vec2(0, + 1) + dir) * texel * thickness); - float pp = getAve(uv + (vec2(+ 1, + 1) + dir) * texel * thickness); - - float nz = getAve(uv + (vec2(-1, 0) + dir) * texel * thickness); - // zz = 0 - float pz = getAve(uv + (vec2(+ 1, 0) + dir) * texel * thickness); - - float nn = getAve(uv + (vec2(-1, -1) + dir) * texel * thickness); - float zn = getAve(uv + (vec2(0, -1) + dir) * texel * thickness); - float pn = getAve(uv + (vec2(+ 1, -1) + dir) * texel * thickness); - - // np zp pp - // nz zz pz - // nn zn pn - - #if 0 - float gx = (np * -1. + nz * -2. + nn * -1. + pp * 1. + pz * 2. + pn * 1.); - float gy = (np * -1. + zp * -2. + pp * -1. + nn * 1. + zn * 2. + pn * 1.); - #else - // https://www.shadertoy.com/view/Wds3Rl - float gx = (np * -3. + nz * -10. + nn * -3. + pp * 3. + pz * 10. + pn * 3.); - float gy = (np * -3. + zp * -10. + pp * -3. + nn * 3. + zn * 10. + pn * 3.); - #endif - - vec2 G = vec2(gx, gy); - - float grad = length(G); - - float angle = atan(G.y, G.x); - - return vec4(G, grad, angle); -} - -// Make edge thinner. -vec2 hysteresisThr(vec2 fragCoord, float mn, float mx) { - - vec4 edge = sobel(fragCoord, vec2(0)); - - vec2 dir = vec2(cos(edge.w), sin(edge.w)); - dir *= vec2(-1, 1); // rotate 90 degrees. - - vec4 edgep = sobel(fragCoord, dir); - vec4 edgen = sobel(fragCoord, -dir); - - if (edge.z < edgep.z || edge.z < edgen.z) edge.z = 0.; - - return vec2( - (edge.z > mn) ? edge.z : 0., - (edge.z > mx) ? edge.z : 0. - ); -} - -float cannyEdge(vec2 fragCoord, float mn, float mx) { - - vec2 np = hysteresisThr(fragCoord + vec2(-1, + 1), mn, mx); - vec2 zp = hysteresisThr(fragCoord + vec2(0, + 1), mn, mx); - vec2 pp = hysteresisThr(fragCoord + vec2(+ 1, + 1), mn, mx); - - vec2 nz = hysteresisThr(fragCoord + vec2(-1, 0), mn, mx); - vec2 zz = hysteresisThr(fragCoord + vec2(0, 0), mn, mx); - vec2 pz = hysteresisThr(fragCoord + vec2(+ 1, 0), mn, mx); - - vec2 nn = hysteresisThr(fragCoord + vec2(-1, -1), mn, mx); - vec2 zn = hysteresisThr(fragCoord + vec2(0, -1), mn, mx); - vec2 pn = hysteresisThr(fragCoord + vec2(+ 1, -1), mn, mx); - - // np zp pp - // nz zz pz - // nn zn pn - //return min(1., step(1e-3, zz.x) * (zp.y + nz.y + pz.y + zn.y)*8.); - //return min(1., step(1e-3, zz.x) * (np.y + pp.y + nn.y + pn.y)*8.); - return min(1., step(1e-2, zz.x * 8.) * smoothstep(.0, .3, np.y + zp.y + pp.y + nz.y + pz.y + nn.y + zn.y + pn.y) * 8.); -} - -void main() { - iResolution = vec2(textureSize(tex0, 0)); - vec4 original = texture(tex0, v_texCoord0); - vec2 fragCoord = v_texCoord0 * iResolution; - float edge = cannyEdge(fragCoord, threshold0, threshold1); - o_output = mix(original, - mix(foregroundColor * foregroundOpacity, - backgroundColor * backgroundOpacity, 1. - edge), - fade); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/contour.frag b/orx-fx/src/shaders/glsl/edges/contour.frag deleted file mode 100644 index ef54cf33..00000000 --- a/orx-fx/src/shaders/glsl/edges/contour.frag +++ /dev/null @@ -1,51 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_output; -uniform float levels; -uniform float contourWidth; -uniform float contourOpacity; -uniform vec4 contourColor; -uniform float backgroundOpacity; -uniform int window; -uniform float bias; -uniform bool outputBands; -uniform float fade; - -vec2 calc_contour(vec2 uv) { - vec4 box = texture(tex0, uv); - float v = sin(3.1415926535 * levels * (dot(vec3(1.0 / 3.0), box.xyz) + bias)); - float level = floor((dot(vec3(1.0 / 3.0), box.xyz) + bias) * levels); - float contour = 1.0 - smoothstep(0., contourWidth, 0.5 * abs(v) / fwidth(v)); - return vec2(contour, level); -} - -void main() { - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - float contour = 0.0; - float weight = 0.0; - float level = 0.0; - - for (int i = -window; i <= window; ++i) { - for (int j = -window; j <= window; ++j) { - vec2 c = calc_contour(v_texCoord0 + step / (float(window) + 1.0) * vec2(float(i), float(j))); - contour += c.x; - level += c.y; - weight += 1.0; - } - } - contour /= weight; - - vec4 t = texture(tex0, v_texCoord0); - - if (outputBands) { - level /= weight; - - level = 1.0 - max(0.0, fract(level / 2.0) * 2.0); - contour = level; - } - - o_output = mix(t, - t * backgroundOpacity * (1.0 - contour) + contour * contourColor * contourOpacity * clamp(t.a, 0.0, 1.0), - fade); - -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/edges-work-1.frag b/orx-fx/src/shaders/glsl/edges/edges-work-1.frag deleted file mode 100644 index f47c2f21..00000000 --- a/orx-fx/src/shaders/glsl/edges/edges-work-1.frag +++ /dev/null @@ -1,37 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_color; - -uniform vec2 delta; - -float random(vec3 scale, float seed) { - /* use the fragment position for a different seed per-pixel */ - return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed); -} - -// Implementation by Evan Wallace (glfx.js) -void main() { - vec4 center = texture(tex0, v_texCoord0); - vec2 color = vec2(0.0); - vec2 total = vec2(0.0); - - /* randomize the lookup values to hide the fixed number of samples */ - float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0); - - for (float t = -30.0; t <= 30.0; t++) { - float percent = (t + offset - 0.5) / 30.0; - float weight = 1.0 - abs(percent); - vec3 tex = texture(tex0, v_texCoord0 + delta * percent).rgb; - float average = (tex.r + tex.g + tex.b) / 3.0; - color.x += average * weight; - total.x += weight; - - if (abs(t) < 15.0) { - weight = weight * 2.0 - 1.0; - color.y += average * weight; - total.y += weight; - } - } - - o_color = vec4(color / total, 0.0, 1.0) * center.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/edges-work-2.frag b/orx-fx/src/shaders/glsl/edges/edges-work-2.frag deleted file mode 100644 index 35d697e9..00000000 --- a/orx-fx/src/shaders/glsl/edges/edges-work-2.frag +++ /dev/null @@ -1,38 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_color; - -uniform vec2 delta; -uniform int radius; - -float random(vec3 scale, float seed) { - /* use the fragment position for a different seed per-pixel */ - return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed); -} - -// Implementation by Evan Wallace (glfx.js) -void main() { - vec4 center = texture(tex0, v_texCoord0); - vec2 color = vec2(0.0); - vec2 total = vec2(0.0); - - /* randomize the lookup values to hide the fixed number of samples */ - float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0); - - for (float t = -30.0; t <= 30.0; t++) { - float percent = (t + offset - 0.5) / 30.0; - float weight = 1.0 - abs(percent); - vec2 tex = texture(tex0, v_texCoord0 + delta * percent).xy; - color.x += tex.x * weight; - total.x += weight; - - if (abs(t) < 15.0) { - weight = weight * 2.0 - 1.0; - color.y += tex.y * weight; - total.y += weight; - } - } - float c = clamp(10000.0 * (color.y / total.y - color.x / total.x) + 0.5, 0.0, 1.0); - - o_color = vec4(c, c, c, 1.0) * center.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/luma-laplacian.frag b/orx-fx/src/shaders/glsl/edges/luma-laplacian.frag deleted file mode 100644 index 577fc5d6..00000000 --- a/orx-fx/src/shaders/glsl/edges/luma-laplacian.frag +++ /dev/null @@ -1,62 +0,0 @@ -in vec2 v_texCoord0; - -uniform sampler2D tex0; - -uniform vec4 backgroundColor; -uniform vec4 edgeColor; -uniform float backgroundOpacity; -uniform float edgeOpacity; -out vec4 o_output; - -float step = 1.0; - -float luma(vec4 color){ - vec3 n = color.a == 0.0? vec3(0.0) : color.rgb/color.a; - return dot(n, vec3(1.0/3.0)); -} - -/** Denotes if UV coordinates falls outside an image. - \param pos the UV coordinates - \return true if the UV are outside of the image - */ -bool isOutside(vec2 pos){ - return (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0); -} - -/** Compute the Laplacian field of an input RGB image, adding a 1px black border around it before computing the gradients and divergence. */ -void main(){ - float div = 0.0; - ivec2 size = textureSize(tex0, 0).xy; - - vec3 pixelShift = vec3(0.0); - pixelShift.xy = 1.0/vec2(size); - - vec2 uvs = v_texCoord0; - if(!isOutside(uvs)){ - float col = luma(textureLod(tex0, uvs, 0.0)); - div = 4.0 * col; - } - - vec2 uvs110 = uvs + pixelShift.xz; - if(!isOutside(uvs110)){ - float col110 = luma(textureLod(tex0, uvs110, 0.0)); - div -= col110; - } - vec2 uvs101 = uvs + pixelShift.zy; - if(!isOutside(uvs101)){ - float col101 = luma(textureLod(tex0, uvs101, 0.0)); - div -= col101; - } - vec2 uvs010 = uvs - pixelShift.xz; - if(!isOutside(uvs010)){ - float col010 = luma(textureLod(tex0, uvs010, 0.0)); - div -= col010; - } - vec2 uvs001 = uvs - pixelShift.zy; - if(!isOutside(uvs001)){ - float col001 = luma(textureLod(tex0, uvs001, 0.0)); - div -= col001; - } - o_output.rgb = vec3(div); - o_output.a = 1.0f; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/luma-sobel.frag b/orx-fx/src/shaders/glsl/edges/luma-sobel.frag deleted file mode 100644 index 3220633e..00000000 --- a/orx-fx/src/shaders/glsl/edges/luma-sobel.frag +++ /dev/null @@ -1,47 +0,0 @@ -in vec2 v_texCoord0; - -uniform sampler2D tex0; - -uniform vec4 backgroundColor; -uniform vec4 edgeColor; -uniform float backgroundOpacity; -uniform float edgeOpacity; -out vec4 o_color; - -float step = 1.0; - -float luma(vec4 color){ - vec3 n = color.a == 0.0? vec3(0.0) : color.rgb/color.a; - return dot(n, vec3(1.0/3.0)); -} - -void main() { - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - - float tl = luma(texture(tex0, v_texCoord0 + vec2(-step.x, step.y))); - float l = luma(texture(tex0, v_texCoord0 + vec2(-step.x, 0))); - float bl = luma(texture(tex0, v_texCoord0 + vec2(-step.x, -step.y))); - float t = luma(texture(tex0, v_texCoord0 + vec2(0, step.y))); - float b = luma(texture(tex0, v_texCoord0 + vec2(0, -step.y))); - float tr = luma(texture(tex0, v_texCoord0 + vec2(step.x, step.y))); - float r = luma(texture(tex0, v_texCoord0 + vec2(step.x, 0))); - float br = luma(texture(tex0, v_texCoord0 + vec2(step.x, -step.y))); - - // Sobel masks (see http://en.wikipedia.org/wiki/Sobel_operator) - // 1 0 -1 -1 -2 -1 - // X = 2 0 -2 Y = 0 0 0 - // 1 0 -1 1 2 1 - - // You could also use Scharr operator: - // 3 0 -3 3 10 3 - // X = 10 0 -10 Y = 0 0 0 - // 3 0 -3 -3 -10 -3 - - float x = tl + 2.0 * l + bl - tr - 2.0 * r - br; - float y = -tl - 2.0 * t - tr + bl + 2.0 * b + br; - float intensity = sqrt(x*x + y*y) / sqrt(2.0); - vec4 color = mix(vec4(backgroundColor.rgb, backgroundOpacity), vec4(edgeColor.rgb, edgeOpacity), intensity); - - vec4 a = texture(tex0, v_texCoord0); - o_color = vec4(color.rgb, 1.0) * color.a * a.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/grain/film-grain.frag b/orx-fx/src/shaders/glsl/grain/film-grain.frag deleted file mode 100644 index b51d7231..00000000 --- a/orx-fx/src/shaders/glsl/grain/film-grain.frag +++ /dev/null @@ -1,107 +0,0 @@ -// Licensed under the MIT license: -// https://opensource.org/licenses/MIT. - -// Ad[a|o]pted from shader by "noby" https://www.shadertoy.com/view/3sGSWV -uniform sampler2D tex0; - -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform bool useColor;// false -uniform float time; -uniform float grainLiftRatio;// = 0.5; -uniform float grainStrength;//= 1.0; -uniform float grainRate;// = 1.0; -// Range: [0.5, 1.0]. -uniform float grainPitch;// = 1.0; - -uniform float colorLevel;// = 1.0; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_output; -#endif - -// From Dave Hoskins: https://www.shadertoy.com/view/4djSRW. -float hash(vec3 p3){ - p3 = fract(p3 * 0.1031); - p3 += dot(p3, p3.yzx + 19.19); - return fract((p3.x + p3.y) * p3.z); -} - -// From iq: https://www.shadertoy.com/view/4sfGzS. -float noise(vec3 x){ - vec3 i = floor(x); - vec3 f = fract(x); - f = f*f*(3.0-2.0*f); - return mix(mix(mix(hash(i+vec3(0, 0, 0)), - hash(i+vec3(1, 0, 0)), f.x), - mix(hash(i+vec3(0, 1, 0)), - hash(i+vec3(1, 1, 0)), f.x), f.y), - mix(mix(hash(i+vec3(0, 0, 1)), - hash(i+vec3(1, 0, 1)), f.x), - mix(hash(i+vec3(0, 1, 1)), - hash(i+vec3(1, 1, 1)), f.x), f.y), f.z); -} - -// Slightly high-passed continuous value-noise. -float grain_source(vec3 x, float strength, float pitch){ - float center = noise(x); - float v1 = center - noise(vec3(1, 0, 0)/pitch + x) + 0.5; - float v2 = center - noise(vec3(0, 1, 0)/pitch + x) + 0.5; - float v3 = center - noise(vec3(-1, 0, 0)/pitch + x) + 0.5; - float v4 = center - noise(vec3(0, -1, 0)/pitch + x) + 0.5; - - float total = (v1 + v2 + v3 + v4) / 4.0; - return mix(1.0, 0.5 + total, strength); -} - -void main() { - vec2 uv = v_texCoord0; - vec2 x = gl_FragCoord.xy; - - // Alternatively use iTime here instead and change the grain_rate - // parameter to correspond to frames-per-second. - float t = time; - #ifndef OR_GL_TEXTURE2D - vec4 colorAlpha = texture(tex0, uv); - #else - vec4 colorAlpha = texture2D(tex0, uv); - #endif - - vec3 color = colorAlpha.rgb; - vec3 grain = vec3(0); - - if (useColor) { - float rg = grain_source(vec3(x, floor(grainRate*(t))), grainStrength, grainPitch); - float gg = grain_source(vec3(x, floor(grainRate*(t+9.0))), grainStrength, grainPitch); - float bg = grain_source(vec3(x, floor(grainRate*(t-9.0))), grainStrength, grainPitch); - - // Consider using values outside the [0, 1] range as well - // to introduce interesting color shifts to the source. - - vec3 color_grain = vec3(rg, gg, bg); - color_grain = mix(vec3(dot(color_grain, vec3(0.2126, 0.7152, 0.0722))), color_grain, colorLevel); - grain = color_grain; - } else { - const float neutral_grain_factor = sqrt(2.0); - grain = vec3(grain_source(vec3(x, floor(grainRate*t)), grainStrength/neutral_grain_factor, grainPitch)); - } - - // Control whether to add or multiply or lift the source with the grain. - // Multiply (0.0) should be more true to life, but adjust to taste. - - color = max(mix(color*grain, color+(grain-1.0), grainLiftRatio), 0.0); - - // After this you would normally perform tone mapping, - // apply the grain before that. - #ifndef OR_GL_FRAGCOLOR - o_output.rgb = color; - o_output.a = 1.0; - #else - gl_FragColor.rgb = color; - gl_FragColor.a = 1.0; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/math/multiply-u.frag b/orx-fx/src/shaders/glsl/math/multiply-u.frag deleted file mode 100644 index 46b18ef5..00000000 --- a/orx-fx/src/shaders/glsl/math/multiply-u.frag +++ /dev/null @@ -1,27 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform float bias; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - #endif - - vec4 result = a * (v_texCoord0.x + bias); - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/math/multiply-v.frag b/orx-fx/src/shaders/glsl/math/multiply-v.frag deleted file mode 100644 index 10b29d7c..00000000 --- a/orx-fx/src/shaders/glsl/math/multiply-v.frag +++ /dev/null @@ -1,28 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform float bias; -uniform bool invertV; -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - #endif - - float v = invertV ? (1.0 - v_texCoord0.y) : v_texCoord0.y; - vec4 result = a * (v + bias); - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/math/square.frag b/orx-fx/src/shaders/glsl/math/square.frag deleted file mode 100644 index c20b92f3..00000000 --- a/orx-fx/src/shaders/glsl/math/square.frag +++ /dev/null @@ -1,26 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform sampler2D tex0; -uniform float bias; -uniform float invertV; -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - #ifndef OR_GL_TEXTURE2D - vec4 a = texture(tex0, v_texCoord0); - #else - vec4 a = texture2D(tex0, v_texCoord0); - #endif - vec4 result = a * a; - #ifdef OR_GL_FRAGCOLOR - gl_FragColor = result; - #else - o_color = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/patterns/checkers.frag b/orx-fx/src/shaders/glsl/patterns/checkers.frag deleted file mode 100644 index c6102654..00000000 --- a/orx-fx/src/shaders/glsl/patterns/checkers.frag +++ /dev/null @@ -1,49 +0,0 @@ -#ifdef OR_IN_OUT -in vec2 v_texCoord0; -#else -varying vec2 v_texCoord0; -#endif - -uniform vec4 foreground; -uniform vec4 background; -uniform vec2 targetSize; -uniform float size; -uniform float opacity; - -#ifndef OR_GL_FRAGCOLOR -out vec4 o_color; -#endif - -void main() { - float r = targetSize.x / targetSize.y; - vec2 uv = v_texCoord0 - vec2(0.5); - uv.x *= r; - - vec2 cell = (uv / size); - ivec2 cellIndex = ivec2(floor(cell)); - vec2 cellUV = cell - vec2(cellIndex); - - int c = (cellIndex.x + cellIndex.y) % 2; - vec2 w = fwidth(cell); - - vec4 ca; - vec4 cb; - if (c == 0) { - ca = background; - cb = foreground; - } else { - ca = foreground; - cb = background; - } - float s = w.x; - float fx = smoothstep(s, 0.0, cellUV.x) + smoothstep(1.0 - s, 1.0, cellUV.x); - float fy = smoothstep(s, 0.0, cellUV.y) + smoothstep(1.0 - s, 1.0, cellUV.y); - - vec4 result = mix(ca, cb, min(0.5, fx * 0.5 + fy * 0.5)) * opacity; - - #ifndef OR_GL_FRAGCOLOR - o_color = result; - #else - gl_FragCoord = result; - #endif -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag b/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag deleted file mode 100644 index 99168750..00000000 --- a/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag +++ /dev/null @@ -1,12 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform vec2 shift; - -out vec4 o_color; -void main() { - vec4 a = texture(tex0, v_texCoord0-shift); - vec4 b = texture(tex1, v_texCoord0); - float alpha = min(1.0,max(0.0, b.a)); - o_color = a * (1.0-alpha) + b; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag b/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag deleted file mode 100644 index 42aa1e0e..00000000 --- a/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag +++ /dev/null @@ -1,28 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec2 blurDirection; - -uniform int window; -uniform float sigma; -uniform float gain; -uniform vec4 subtract; -uniform float spread; -uniform vec4 color; -out vec4 o_color; -void main() { - vec2 s = vec2(textureSize(tex0, 0)).xy; - s = vec2(1.0/s.x, 1.0/s.y); - - int w = window; - - vec4 sum = vec4(0, 0, 0, 0); - float weight = 0.0; - for (int x = -w; x<= w; ++x) { - float lw = 1.0; - sum += texture(tex0, v_texCoord0 + float(x) * blurDirection * s * spread); - weight += lw; - } - - o_color = (sum / weight) * gain; - o_color.rgb = color.rgb * o_color.a; -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag deleted file mode 100644 index f08f5936..00000000 --- a/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag +++ /dev/null @@ -1,25 +0,0 @@ -uniform sampler2D tex0; -uniform float exposureBias; - -in vec2 v_texCoord0; -out vec4 o_output; - -vec3 saturate(vec3 x) { - return clamp(x, vec3(0.0), vec3(1.0)); -} - -vec3 ACESFilm(vec3 x) { - float a = 2.51f; - float b = 0.03f; - float c = 2.43f; - float d = 0.59f; - float e = 0.14f; - return saturate((x*(a*x+b))/(x*(c*x+d)+e)); -} - -void main() { - vec3 texColor = texture(tex0,v_texCoord0).rgb; - vec3 color = ACESFilm(texColor * exposureBias); - - o_output = vec4(color, 1.0); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag deleted file mode 100644 index 834e2e50..00000000 --- a/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag +++ /dev/null @@ -1,33 +0,0 @@ -uniform sampler2D tex0; -uniform float exposureBias; -uniform float maxLuminance; - -in vec2 v_texCoord0; -out vec4 o_output; - -vec3 saturate(vec3 x) { - return clamp(x, vec3(0.0), vec3(1.0)); -} - -float luminance(vec3 v) { - return dot(v, vec3(0.2126f, 0.7152f, 0.0722f)); -} - -vec3 change_luminance(vec3 c_in, float l_out) { - float l_in = luminance(c_in); - return c_in * (l_out / l_in); -} - -vec3 reinhard_extended_luminance(vec3 v, float max_white_l) { - float l_old = luminance(v); - float numerator = l_old * (1.0f + (l_old / (max_white_l * max_white_l))); - float l_new = numerator / (1.0f + l_old); - return change_luminance(v, l_new); -} - -void main() { - vec3 texColor = texture(tex0,v_texCoord0).rgb; - vec3 color = reinhard_extended_luminance(texColor * exposureBias, maxLuminance); - vec3 retColor = pow(color, vec3(1.0/2.2)); - o_output = vec4(retColor, 1); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag deleted file mode 100644 index ca5ad2c9..00000000 --- a/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag +++ /dev/null @@ -1,26 +0,0 @@ -// ad[a|o]pted from http://filmicworlds.com/blog/filmic-tonemapping-operators/ -float A = 0.15; -float B = 0.50; -float C = 0.10; -float D = 0.20; -float E = 0.02; -float F = 0.30; -float W = 11.2; - -uniform sampler2D tex0; -uniform float exposureBias; -in vec2 v_texCoord0; -out vec4 o_output; - -vec3 Uncharted2Tonemap(vec3 x) { - return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; -} - -void main() { - vec3 texColor = texture(tex0,v_texCoord0).rgb; - vec3 curr = Uncharted2Tonemap(exposureBias*texColor); - vec3 whiteScale = 1.0f/Uncharted2Tonemap(vec3(W)); - vec3 color = curr*whiteScale; - - o_output = vec4(color, 1); -} \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/transform/flip-vertically.frag b/orx-fx/src/shaders/glsl/transform/flip-vertically.frag deleted file mode 100644 index f5f8a68d..00000000 --- a/orx-fx/src/shaders/glsl/transform/flip-vertically.frag +++ /dev/null @@ -1,10 +0,0 @@ -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform vec4 constant; - -out vec4 o_color; -void main() { - vec2 uv = v_texCoord0; - uv.y = 1.0 - uv.y; - o_color = texture(tex0, uv); -} diff --git a/orx-gradient-descent/README.md b/orx-gradient-descent/README.md deleted file mode 100644 index 0ac82ffc..00000000 --- a/orx-gradient-descent/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# orx-gradient-descent - -Finds equation inputs that output a minimum value: easy to use gradient descent based minimizer. - -## Usage - -```kotlin -// define a model -class Model { - var x = 0.0 - var y = 0.0 -} - -val model = Model() -minimizeModel(model) { m -> - (m.x-4.0)*(m.x-4.0) + (m.y-3.0)*(m.y-3.0) -} - -// model.x is close to 4 and model y is close to 3 at this point -``` - -## Data binding - -Currently we support minimizing model classes that contain -`Double`, `Vector2`, `Vector3` and `Vector4` typed properties, -other types are silently ignored. - -An example of a supported model: -```kotlin -class Model { - var x = 0.0 - var y = 0.0 - var v2 = Vector2.ZERO -} -``` diff --git a/orx-gradient-descent/build.gradle.kts b/orx-gradient-descent/build.gradle.kts deleted file mode 100644 index a5640c12..00000000 --- a/orx-gradient-descent/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") - alias(libs.plugins.kotest.multiplatform) -} - -kotlin { - jvm { - testRuns["test"].executionTask { - useJUnitPlatform { - - } - } - } - sourceSets { - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - val commonTest by getting { - dependencies { - implementation(sharedLibs.kotest.assertions) - implementation(sharedLibs.kotest.framework.engine) - } - } - - val jvmTest by getting { - dependencies { - implementation(sharedLibs.kotest.assertions) - implementation(sharedLibs.kotest.framework.engine) - runtimeOnly(sharedLibs.kotlin.reflect) - } - } - } -} \ No newline at end of file diff --git a/orx-gradient-descent/src/commonMain/kotlin/GradientDescent.kt b/orx-gradient-descent/src/commonMain/kotlin/GradientDescent.kt deleted file mode 100644 index 341466e0..00000000 --- a/orx-gradient-descent/src/commonMain/kotlin/GradientDescent.kt +++ /dev/null @@ -1,177 +0,0 @@ -// Adapted from the numeric.js gradient and uncmin functions -// Numeric Javascript -// Copyright (C) 2011 by Sébastien Loisel - -// 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. -// - -package org.openrndr.extra.gradientdescent - -import kotlin.math.abs -import kotlin.math.max -import kotlin.math.min -import kotlin.math.sqrt - -private fun ten(a: DoubleArray, b: DoubleArray): Array = Array(a.size) { mul(b, a[it]) } -private fun max(a: Double, b: Double, c: Double): Double = max(max(a, b), c) - -private fun max(a: Double, b: Double, c: Double, d: Double, e: Double, f: Double, g: Double, h: Double): Double { - return max(max(max(max(max(max(max(a, b), c), d), e), f), g), h) -} - -fun gradient(x: DoubleArray, objective: (parameters: DoubleArray) -> Double): DoubleArray { - var k = 0 - val tempX = x.copyOf() - val f1 = objective(x) - val grad = DoubleArray(x.size) - require(f1 == f1) - for (i in 0 until x.size) { - var delta = max(1e-6 * f1, 1e-8) - - while (true) { - require(k != 20) { "gradient failed" } - tempX[i] = x[i] + delta - val f0 = objective(tempX) - tempX[i] = x[i] - delta - val f2 = objective(tempX) - tempX[i] = x[i] - - if (f0 == f0 && f2 == f2) { - grad[i] = (f0 - f2) / (2 * delta) - val t0 = x[i] - delta - val t1 = x[i] - val t2 = x[i] + delta - val d1 = (f0 - f1) / delta - val d2 = (f1 - f2) / delta - val err = min(max(abs(d1 - grad[i]), abs(d2 - grad[i]), abs(d1 - d2)), delta) - val normalize = max(abs(grad[i]), abs(f0), abs(f1), abs(f2), abs(t0), abs(t1), abs(t2), 1e-8) - if (err / normalize < 1e-3) - break - } - delta /= 16.0 - k++ - } - } - return grad -} - -private fun identity(n: Int): Array = Array(n) { j -> - DoubleArray(n) { i -> if (i == j) 1.0 else 0.0 } -} - -private fun neg(x: DoubleArray): DoubleArray = DoubleArray(x.size) { -x[it] } -private fun add(x: DoubleArray, y: DoubleArray): DoubleArray = DoubleArray(x.size) { x[it] + y[it] } -private fun sub(x: DoubleArray, y: DoubleArray): DoubleArray = DoubleArray(x.size) { x[it] - y[it] } -private fun add(x: Array, y: Array) = Array(x.size) { add(x[it], y[it]) } -private fun sub(x: Array, y: Array) = Array(x.size) { sub(x[it], y[it]) } -private fun mul(x: Array, y: Double) = Array(x.size) { mul(x[it], y) } -private fun mul(x: DoubleArray, y: Double) = DoubleArray(x.size) { x[it] * y } -private fun mul(x: DoubleArray, y: DoubleArray) = DoubleArray(x.size) { x[it] * y[it] } -private fun div(x: Array, y: Double) = Array(x.size) { div(x[it], y) } -private fun div(x: DoubleArray, y: Double) = DoubleArray(x.size) { x[it] / y } -private fun norm2(x: DoubleArray): Double { - return sqrt(x.sumOf { it * it }) -} - -internal fun dot(x: DoubleArray, y: DoubleArray): Double = (x.mapIndexed { index, it -> it * y[index] }).sum() - -internal fun dot(x: Array, y: DoubleArray): DoubleArray = DoubleArray(x.size) { dot(x[it], y) } - -class MinimizationResult(val solution: DoubleArray, val value: Double, val gradient: DoubleArray, - val inverseHessian: Array, val iterations: Int) - -fun minimize(_x0: DoubleArray, - weights: DoubleArray = DoubleArray(_x0.size) { 1.0 }, - endOnLineSearch: Boolean = false, tol: Double = 1e-8, maxIterations: Int = 1000, f: (DoubleArray) -> Double): MinimizationResult { - val grad = { a: DoubleArray -> gradient(a, f) } - var x0 = _x0.copyOf() - var g0 = grad(x0) - var f0 = f(x0) - require(f0 == f0) - - var H1 = identity(_x0.size) - var iteration = 0 - while (iteration < maxIterations) { - require(g0.all { it == it && it != Double.POSITIVE_INFINITY && it != Double.NEGATIVE_INFINITY }) - val pstep = dot(H1, g0) - require(pstep.all { it == it }) { "pstep contains NaNs" } - require(pstep.all { it != Double.POSITIVE_INFINITY && it != Double.NEGATIVE_INFINITY }) { "pstep contains infs" } - val step = neg(pstep) - - val nstep = norm2(step) - require(nstep == nstep) - if (nstep < tol) { - break - } - var t = 1.0 - val df0 = dot(g0, step) - var x1 = x0 - var s = DoubleArray(0) - var f1 = Double.POSITIVE_INFINITY - while (iteration < maxIterations && t * nstep >= tol) { - s = mul(step, t) - x1 = add(x0, s) - f1 = f(x1) - - require(f1 == f1) { "f1 is NaN" } - if (!(f1 - f0 >= 0.1 * t * df0)) { - break - } - t *= 0.5 - iteration++ - - } - require(s.isNotEmpty()) - if (t * nstep < tol && endOnLineSearch) { - break - } - if (iteration >= maxIterations) break - val g1 = grad(x1) - require(g1.all { it == it }) - val y = sub(g1, g0) - val ys = dot(y, s) - if (ys == 0.0) { - break - } - val Hy = dot(H1, y) - H1 = sub( - add( - H1, - mul( - ten(s, s), - (ys + dot(y, Hy)) / (ys * ys) - ) - ), - div( - add( - ten(Hy, s), - ten(s, Hy) - ), - ys - ) - ) - x0 = x1 - f0 = f1 - g0 = g1 - iteration++ - } - - return MinimizationResult(x0, f0, g0, H1, iteration) -} - diff --git a/orx-gradient-descent/src/jvmMain/kotlin/DataBinding.kt b/orx-gradient-descent/src/jvmMain/kotlin/DataBinding.kt deleted file mode 100644 index 9397dbe1..00000000 --- a/orx-gradient-descent/src/jvmMain/kotlin/DataBinding.kt +++ /dev/null @@ -1,90 +0,0 @@ -package org.openrndr.extra.gradientdescent - -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 - -/** - * converts a model to an array of doubles - */ -fun modelToArray(model: T): DoubleArray { - val doubles = mutableListOf() - model::class.java.declaredFields.forEach { - when { - it.type == DoubleArray::class.java -> { - it.isAccessible = true - val da = it.get(model) as DoubleArray - for (d in da) { - doubles.add(d) - } - } - - it.type == Double::class.java -> { - it.isAccessible = true - doubles.add(it.getDouble(model)) - } - it.type == Vector2::class.java -> { - it.isAccessible = true - val v2 = it.get(model) as Vector2 - doubles.add(v2.x) - doubles.add(v2.y) - } - it.type == Vector3::class.java -> { - it.isAccessible = true - val v3 = it.get(model) as Vector3 - doubles.add(v3.x) - doubles.add(v3.y) - doubles.add(v3.z) - } - it.type == Vector4::class.java -> { - it.isAccessible = true - val v4 = it.get(model) as Vector4 - doubles.add(v4.x) - doubles.add(v4.y) - doubles.add(v4.z) - doubles.add(v4.w) - } - } - } - return doubles.toDoubleArray() -} - -/** - * converts array of doubles to model values - */ -fun arrayToModel(data: DoubleArray, model: T) { - var index = 0 - model::class.java.declaredFields.forEach { - when { - it.type == DoubleArray::class.java -> { - it.isAccessible = true - //it.setDouble(model, data[index]) - val da = it.get(model) as DoubleArray - for (i in 0 until da.size) { - da[i] = data[index] - index++ - } - } - it.type == Double::class.java -> { - it.isAccessible = true - it.setDouble(model, data[index]) - index++ - } - it.type == Vector2::class.java -> { - it.isAccessible = true - it.set(model, Vector2(data[index], data[index+1])) - index+=2 - } - it.type == Vector3::class.java -> { - it.isAccessible = true - it.set(model, Vector3(data[index], data[index+1],data[index+2])) - index+=3 - } - it.type == Vector4::class.java -> { - it.isAccessible = true - it.set(model, Vector4(data[index], data[index+1],data[index+2],data[index+3])) - index+=3 - } - } - } -} \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmMain/kotlin/GradientDescent.kt b/orx-gradient-descent/src/jvmMain/kotlin/GradientDescent.kt deleted file mode 100644 index 0e5729a7..00000000 --- a/orx-gradient-descent/src/jvmMain/kotlin/GradientDescent.kt +++ /dev/null @@ -1,12 +0,0 @@ -@file:JvmName("GradientDescentJvmKt") -package org.openrndr.extra.gradientdescent - -fun minimizeModel(model: T, endOnLineSearch: Boolean = false, tol: Double = 1e-8, maxIterations: Int = 1000, function: (T) -> Double) { - val doubles = modelToArray(model) - val weights = DoubleArray(doubles.size) { 1.0 } - val solution = minimize(doubles, weights, endOnLineSearch, tol, maxIterations) { - arrayToModel(it, model) - function(model) - } - arrayToModel(solution.solution, model) -} \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmTest/kotlin/TestDot.kt b/orx-gradient-descent/src/jvmTest/kotlin/TestDot.kt deleted file mode 100644 index c8ab4cba..00000000 --- a/orx-gradient-descent/src/jvmTest/kotlin/TestDot.kt +++ /dev/null @@ -1,26 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import io.kotest.matchers.equals.shouldBeEqual -import org.openrndr.extra.gradientdescent.dot - - -class TestDot : DescribeSpec({ - describe("some vectors") { - val a = doubleArrayOf(10.0) - val b = doubleArrayOf(4.0) - dot(a, b).shouldBeEqual(40.0) - } - - describe("a matrix and a vector") { - val a = arrayOf(doubleArrayOf(10.0)) - val b = doubleArrayOf(1.0) - val d = dot(a, b) - d[0].shouldBeEqual(10.0) - } - - describe("another matrix and a vector") { - val a = arrayOf(doubleArrayOf(1.0)) - val b = doubleArrayOf(19.99999999995339) - val d = dot(a, b) - d[0].shouldBeEqual(19.99999999995339) - } -}) \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmTest/kotlin/TestGradient.kt b/orx-gradient-descent/src/jvmTest/kotlin/TestGradient.kt deleted file mode 100644 index 91a9ea10..00000000 --- a/orx-gradient-descent/src/jvmTest/kotlin/TestGradient.kt +++ /dev/null @@ -1,41 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import io.kotest.matchers.equals.shouldBeEqual -import org.openrndr.extra.gradientdescent.gradient - -class TestGradient : DescribeSpec({ - describe("a simple 1d function") { - fun parabola(x: DoubleArray): Double { - return x[0] * x[0] - } - it("its gradient at x=0 is 0.0") { - val g0 = gradient(doubleArrayOf(0.0), ::parabola) - g0.size.shouldBeEqual(1) - g0[0].shouldBeEqual(0.0) - } - it("its gradient at x=1 is ~2.0") { - val g1 = gradient(doubleArrayOf(1.0), ::parabola) - } - it("its gradient at x=-1 is ~-2.0") { - val g1 = gradient(doubleArrayOf(-1.0), ::parabola) - } - } - - describe("a simple 2d function") { - fun parabola(x: DoubleArray): Double { - return x[0] * x[0] + x[1] * x[1] - } - - it("its gradient at x=0 is 0.0") { - val g0 = gradient(doubleArrayOf(0.0, 0.0), ::parabola) - g0.size.shouldBeEqual(2) - g0[0].shouldBeEqual(0.0) - } - - it("its gradient at x=1 is ~2.0") { - val g1 = gradient(doubleArrayOf(1.0, 1.0), ::parabola) - } - it("its gradient at x=-1 is ~-2.0") { - val g1 = gradient(doubleArrayOf(-1.0, -1.0), ::parabola) - } - } -}) \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmTest/kotlin/TestMinimize.kt b/orx-gradient-descent/src/jvmTest/kotlin/TestMinimize.kt deleted file mode 100644 index 03de5c7d..00000000 --- a/orx-gradient-descent/src/jvmTest/kotlin/TestMinimize.kt +++ /dev/null @@ -1,13 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import org.openrndr.extra.gradientdescent.minimize - -class TestMinimize : DescribeSpec({ - describe("a simple 1d function") { - fun parabola(x: DoubleArray): Double { - return (x[0] + 1) * (x[0] + 1) - } - it("it can be minimized") { - val result = minimize(doubleArrayOf(10.0), f = ::parabola) - } - } -}) \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmTest/kotlin/TestMinimizeModel.kt b/orx-gradient-descent/src/jvmTest/kotlin/TestMinimizeModel.kt deleted file mode 100644 index 255e3b4b..00000000 --- a/orx-gradient-descent/src/jvmTest/kotlin/TestMinimizeModel.kt +++ /dev/null @@ -1,34 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import io.kotest.matchers.doubles.plusOrMinus -import io.kotest.matchers.shouldBe -import org.openrndr.extra.gradientdescent.minimizeModel -import org.openrndr.math.Vector2 - -class TestMinimizeModel : DescribeSpec({ - describe("a model") { - val m = object { - var x = 0.0 - var y = 0.0 - } - it("can be minimized") { - minimizeModel(m) { m-> - (m.x - 4.0) * (m.x - 4.0) + (m.y - 3.0) * (m.y - 3.0) - } - m.x.shouldBe(4.0.plusOrMinus(0.01)) - m.y.shouldBe(3.0.plusOrMinus(0.01)) - } - } - - describe("a model with a Vector2 property") { - val m = object { - var position = Vector2.ZERO - } - it("can be minimized") { - minimizeModel(m) { m-> - (m.position.x - 4.0) * (m.position.x - 4.0) + (m.position.y - 3.0) * (m.position.y - 3.0) - } - m.position.x.shouldBe(4.0.plusOrMinus(0.01)) - m.position.y.shouldBe(3.0.plusOrMinus(0.01)) - } - } -}) \ No newline at end of file diff --git a/orx-gradient-descent/src/jvmTest/kotlin/TestPlaceholder.kt b/orx-gradient-descent/src/jvmTest/kotlin/TestPlaceholder.kt deleted file mode 100644 index 53683ddf..00000000 --- a/orx-gradient-descent/src/jvmTest/kotlin/TestPlaceholder.kt +++ /dev/null @@ -1,8 +0,0 @@ -import kotlin.test.Test - -class TestPlaceholder { - @Test - fun testPlaceholder() { - assert(true) - } -} \ No newline at end of file diff --git a/orx-hash-grid/README.md b/orx-hash-grid/README.md deleted file mode 100644 index b262c5a3..00000000 --- a/orx-hash-grid/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# orx-hash-grid - -2D space partitioning for fast point queries. - -## Usage - -`orx-hash-grid` provides the classes `HashGrid` and `Cell`, in most cases only `HashGrid` is used. - -Create a hash grid for a given radius. -```kotlin -val grid = HashGrid(radius) -``` - -Check for a given query point if the grid is free, i.e. there is no point in the grid at distance less than `radius` away from the -query point. - -```kotlin -grid.isFree(query) -``` - -Add a point to the hash grid structure: -```kotlin -grid.insert(point) -``` - -Iterate over all points in the hash grid: -```kotlin -for (point in grid.points()) { - // do something with point -} -``` - -## Extensions to standard library - -`orx-hash-grid` provides short-hand extension functions to `List` - -
      - -```kotlin -fun List.filter(radius: Double) : List - ``` - -filters the points in the list such that only points with an inter-distance of `radius` remain. - -```kotlin -val points = (0 until 10_000).map { drawer.bounds.uniform() } -val filtered = points.filter(20.0) -``` - -
      - -```kotlin -fun List.hashGrid(radius: Double) : HashGrid -``` -constructs a (mutable) `HashGrid` containing all points in the list. - -```kotlin -val points = (0 until 10_000).map { drawer.bounds.uniform() } -val hashGrid = points.hashGrid(20.0) -``` - -
      - -## References - - * `orx-noise` uses `HashGrid` to generate Poisson distributed points. [Link](https://github.com/openrndr/orx/blob/master/orx-noise/src/commonMain/kotlin/PoissonDisk.kt) - - -## Demos -### DemoFilter01 - - -The program performs the following steps: -- Generates 10,000 random points uniformly distributed within the drawable bounds. -- Filters the generated points to enforce a minimum distance of 20.0 units between them. -- Visualizes the filtered points as circles with a radius of 10.0 units on the canvas. - -The `filter` method is provided by `orx-hash-grid`. - -![DemoFilter01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-hash-grid/images/DemoFilter01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFilter01.kt) - -### DemoFilter3D01 - -Demonstrates how to use a 3D hash-grid `filter` operation to remove points from a random 3D point-collection -that are too close to each other. The resulting points are displayed as small spheres. - -The program performs the following key steps: -- Generates 10,000 random 3D points located between a minimum and maximum radius. -- Filters the points to ensure a minimum distance between any two points using a spatial hash grid. -- Creates a small sphere mesh that will be instanced for each filtered point. -- Sets up an orbital camera to allow viewing the 3D scene interactively. -- Renders the filtered points by translating the sphere mesh to each point's position and applying a shader that modifies the fragment color based on the view normal. - -![DemoFilter3D01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-hash-grid/images/DemoFilter3D01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoFilter3D01.kt) - -### DemoHashGrid01 - -This demo creates a `HashGrid` to manage points in a 2D space. -Notice the desired cell size in the HashGrid constructor. - -On every animation frame, it attempts to insert 100 random points into the HashGrid. -When a HashGrid cell is free, a point is inserted. - -The visual output includes: -- Rectangles representing the bounds of the occupied cells in the grid. -- Circles representing the generated random points. - -![DemoHashGrid01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-hash-grid/images/DemoHashGrid01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoHashGrid01.kt) diff --git a/orx-hash-grid/build.gradle.kts b/orx-hash-grid/build.gradle.kts deleted file mode 100644 index d322b652..00000000 --- a/orx-hash-grid/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-color")) - implementation(project(":orx-fx")) - implementation(project(":orx-noise")) - implementation(project(":orx-camera")) - implementation(project(":orx-mesh-generators")) - } - } - - } -} \ No newline at end of file diff --git a/orx-hash-grid/src/commonMain/kotlin/HashGrid.kt b/orx-hash-grid/src/commonMain/kotlin/HashGrid.kt deleted file mode 100644 index de85d910..00000000 --- a/orx-hash-grid/src/commonMain/kotlin/HashGrid.kt +++ /dev/null @@ -1,254 +0,0 @@ -package org.openrndr.extra.hashgrid - -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle -import kotlin.jvm.JvmRecord -import kotlin.math.abs -import kotlin.math.max -import kotlin.math.min -import kotlin.math.sqrt -import kotlin.random.Random - -private fun Double.fastFloor(): Int { - return if (this >= 0) this.toInt() else this.toInt() - 1 -} - -@JvmRecord -private data class GridCoords(val x: Int, val y: Int) { - fun offset(i: Int, j: Int): GridCoords = copy(x = x + i, y = y + j) -} - -/** - * Represents a cell in a 2D space, defined by its position and size. - * - * @property x The x-coordinate of the cell in the grid. - * @property y The y-coordinate of the cell in the grid. - * @property cellSize The size of the cell along each axis. - */ -class Cell(val x: Int, val y: Int, val cellSize: Double) { - var xMin: Double = Double.POSITIVE_INFINITY - private set - var xMax: Double = Double.NEGATIVE_INFINITY - private set - var yMin: Double = Double.POSITIVE_INFINITY - private set - var yMax: Double = Double.NEGATIVE_INFINITY - private set - - /** - * Calculates and returns the rectangular bounds of the cell in the 2D grid. - * The bounds are represented as a rectangle with its top-left position and size derived - * from the cell's position (`x`, `y`) and `cellSize`. - */ - val bounds: Rectangle - get() { - return Rectangle(x * cellSize, y * cellSize, cellSize, cellSize) - } - - /** - * Computes the bounds of the content within the cell, considering the points stored in it. - * If no points are present in the cell, the bounds will be represented as an empty rectangle. - * Otherwise, the bounds are determined by the minimum and maximum x and y coordinates - * among the points in the cell. - */ - val contentBounds: Rectangle - get() { - if (points.isEmpty()) { - return Rectangle.EMPTY - } else { - return Rectangle(xMin, yMin, xMax - xMin, yMax - yMin) - } - } - - - internal val points = mutableListOf>() - internal fun insert(point: Vector2, owner: Any?) { - points.add(Pair(point, owner)) - xMin = min(xMin, point.x) - xMax = max(xMax, point.x) - yMin = min(yMin, point.y) - yMax = max(yMax, point.y) - } - - internal fun squaredDistanceTo(query: Vector2): Double { - val width = xMax - xMin - val height = yMax - yMin - val x = (xMin + xMax) / 2.0 - val y = (yMin + yMax) / 2.0 - val dx = max(abs(query.x - x) - width / 2, 0.0) - val dy = max(abs(query.y - y) - height / 2, 0.0) - return dx * dx + dy * dy - } - - /** - * Generates a sequence of points contained within the current cell. - * Iterates over the points stored in the cell and yields each point one by one. - * - * @return A sequence of points in the cell. - */ - fun points() = sequence { - for (point in points) { - yield(point) - } - } -} - -/** - * Represents a 2D spatial hash grid used for efficiently managing and querying points in a sparse space. - * - * @property radius The maximum distance between points for them to be considered neighbors. - */ -class HashGrid(val radius: Double) { - private val cells = mutableMapOf() - - /** - * Returns a sequence of all cells stored in the grid. - * Iterates through the values in the internal `cells` map and yields each cell. - */ - fun cells() = sequence { - for (cell in cells.values) { - yield(cell) - } - } - - /** - * Represents the total number of elements (points or data) that are currently stored in the grid. - * - * This property is managed internally and reflects the current size of the grid data structure. - * It cannot be modified directly from outside the class. - */ - var size: Int = 0 - private set - - /** - * Represents the size of a single cell in the hash grid. - * - * Computed as the radius divided by the square root of 2. - * This value determines the spatial resolution of each cell in the grid. - */ - val cellSize = radius / sqrt(2.0) - private fun coords(v: Vector2): GridCoords { - val x = (v.x / cellSize).fastFloor() - val y = (v.y / cellSize).fastFloor() - return GridCoords(x, y) - } - - /** - * Generates a sequence of all points stored within the grid. - * - * Iterates through each cell in the grid's `cells` map, yielding all points - * contained within each cell. - * - * @return A sequence of points from all cells in the grid. - */ - fun points() = sequence { - for (cell in cells.values) { - for (point in cell.points) { - yield(point) - } - } - } - - /** - * Selects a random point from the grid using the provided random number generator. - * - * @param random The random number generator to use. Defaults to `Random.Default`. - * @return A randomly selected point, represented as a `Vector2`, from the grid's cells. - */ - fun random(random: Random = Random.Default): Vector2 { - return cells.values.random(random).points.random().first - } - - /** - * Inserts a point into the grid, associating it with an owner if provided. - * The method calculates the grid cell corresponding to the provided point and inserts - * the point into that cell. If the cell does not exist, it is created. - * - * @param point The point to insert, represented as a `Vector2` object. - * @param owner An optional object to associate with the point. Defaults to `null` if no owner is specified. - */ - fun insert(point: Vector2, owner: Any? = null) { - val gc = coords(point) - val cell = cells.getOrPut(gc) { Cell(gc.x, gc.y, cellSize) } - cell.insert(point, owner) - size += 1 - } - - /** - * Retrieves the cell corresponding to the given query point in the grid. - * The method calculates the grid coordinates for the query point and returns - * the cell found at those coordinates, if it exists. - * - * @param query The point in 2D space, represented as a `Vector2`, for which - * to retrieve the corresponding cell. - * @return The `Cell` corresponding to the given query point, or `null` if - * no cell exists at the calculated coordinates. - */ - fun cell(query: Vector2): Cell? = cells[coords(query)] - - /** - * Checks if a specific query point in 2D space is free from any nearby points or owners, - * according to the internal grid structure and other constraints. - * - * @param query The 2D point represented as a Vector2 to check for available space. - * @param ignoreOwners A set of owners to be ignored while checking for nearby points. Defaults to an empty set. - * @return `true` if the query point is free, `false` otherwise. - */ - fun isFree(query: Vector2, ignoreOwners: Set = emptySet()): Boolean { - val c = coords(query) - if (cells[c] == null) { - for (j in -2..2) { - for (i in -2..2) { - if (i == 0 && j == 0) { - continue - } - val n = c.offset(i, j) - val nc = cells[n] - if (nc != null && nc.squaredDistanceTo(query) <= radius * radius) { - for (p in nc.points) { - - if (p.second == null || p.second !in ignoreOwners) { - if (p.first.squaredDistanceTo(query) <= radius * radius) { - return false - } - } - } - } - } - } - return true - } else { - return cells[c]!!.points.all { it.second != null && it.second in ignoreOwners } - } - } -} - -/** - * Construct a hash grid containing all points in the list - * @param radius radius of the hash grid - */ -fun List.hashGrid(radius: Double): HashGrid { - val grid = HashGrid(radius) - for (point in this) { - grid.insert(point) - } - return grid -} - -/** - * Return a list that only contains points at a minimum distance. - * @param radius the minimum distance between any two points in the returned list - */ -fun List.filter(radius: Double): List { - return if (size <= 1) { - this - } else { - val grid = HashGrid(radius) - for (point in this) { - if (grid.isFree(point)) { - grid.insert(point) - } - } - grid.points().map { it.first }.toList() - } -} \ No newline at end of file diff --git a/orx-hash-grid/src/commonMain/kotlin/HashGrid3D.kt b/orx-hash-grid/src/commonMain/kotlin/HashGrid3D.kt deleted file mode 100644 index 1b148ade..00000000 --- a/orx-hash-grid/src/commonMain/kotlin/HashGrid3D.kt +++ /dev/null @@ -1,269 +0,0 @@ -package org.openrndr.extra.hashgrid -import org.openrndr.math.Vector3 -import org.openrndr.shape.Box -import kotlin.jvm.JvmRecord -import kotlin.math.abs -import kotlin.math.max -import kotlin.math.min -import kotlin.math.sqrt -import kotlin.random.Random - -private fun Double.fastFloor(): Int { - return if (this >= 0) this.toInt() else this.toInt() - 1 -} - -@JvmRecord -private data class GridCoords3D(val x: Int, val y: Int, val z: Int) { - fun offset(i: Int, j: Int, k : Int): GridCoords3D = copy(x = x + i, y = y + j, z = z + k) -} - -/** - * Represents a 3D cell with a fixed size in a spatial hash grid structure. A `Cell3D` is aligned - * along a grid using its integer coordinates and supports operations to manage points within - * its bounds, calculate distances to a query point, and retrieve its own bounding boxes. - * - * @property x The x-coordinate of the cell within the grid. - * @property y The y-coordinate of the cell within the grid. - * @property z The z-coordinate of the cell within the grid. - * @property cellSize The size of the cell in all dimensions. - */ -class Cell3D(val x: Int, val y: Int, val z: Int, val cellSize: Double) { - var xMin: Double = Double.POSITIVE_INFINITY - private set - var xMax: Double = Double.NEGATIVE_INFINITY - private set - var yMin: Double = Double.POSITIVE_INFINITY - private set - var yMax: Double = Double.NEGATIVE_INFINITY - private set - var zMin: Double = Double.POSITIVE_INFINITY - private set - var zMax: Double = Double.NEGATIVE_INFINITY - private set - - /** - * Represents the 3D bounding box of the cell. - * - * The bounds are calculated based on the cell's position (`x`, `y`, `z`) and - * the uniform size of the cell (`cellSize`). It defines a cuboid in 3D space - * with its origin at `(x * cellSize, y * cellSize, z * cellSize)` and dimensions - * defined by `cellSize` along all three axes. - * - * @return A `Box` representing the spatial boundary of the cell. - */ - val bounds: Box - get() { - return Box(Vector3(x * cellSize, y * cellSize, z * cellSize), cellSize, cellSize, cellSize) - } - - /** - * Provides the bounding 3D box that contains all the points within the cell. - * If the `points` collection is empty, it returns an empty box. Otherwise, - * it calculates the bounding box based on the minimum and maximum coordinates - * of the stored points (`xMin`, `xMax`, `yMin`, `yMax`, `zMin`, `zMax`). - */ - val contentBounds: Box - get() { - return if (points.isEmpty()) { - Box.EMPTY - } else { - Box(Vector3(xMin, yMin, zMin), xMax - xMin, yMax - yMin, zMax - zMin) - } - } - - internal val points = mutableListOf>() - internal fun insert(point: Vector3, owner: Any?) { - points.add(Pair(point, owner)) - xMin = min(xMin, point.x) - xMax = max(xMax, point.x) - yMin = min(yMin, point.y) - yMax = max(yMax, point.y) - zMin = min(zMin, point.z) - zMax = max(zMax, point.z) - } - - internal fun squaredDistanceTo(query: Vector3): Double { - val width = xMax - xMin - val height = yMax - yMin - val depth = zMax - zMin - val x = (xMin + xMax) / 2.0 - val y = (yMin + yMax) / 2.0 - val z = (zMin + zMax) / 2.0 - val dx = max(abs(query.x - x) - width / 2, 0.0) - val dy = max(abs(query.y - y) - height / 2, 0.0) - val dz = max(abs(query.z - z) - depth / 2, 0.0) - return dx * dx + dy * dy + dz * dz - } - - /** - * Generates a sequence of all the points stored in the `points` collection. - * - * This method iterates over the `points` collection and yields each element. - * Useful for lazily accessing the points in the order they are stored. - * - * @return A sequence of points contained within the `points` collection. - */ - fun points() = sequence { - for (point in points) { - yield(point) - } - } -} - -/** - * Represents a 3D Hash Grid structure used for spatial partitioning of points in 3D space. - * This structure organizes points into grid-based cells, enabling efficient spatial querying - * and insertion operations. - * - * @property radius The radius used to determine proximity checks within the grid. - * Points are considered neighbors if their spatial distance is less than or equal to this radius. - */ -class HashGrid3D(val radius: Double) { - private val cells = mutableMapOf() - - - /** - * Returns a sequence of all the cells present in the hash grid. - * Each cell is yielded individually from the internal mapping. - */ - fun cells() = sequence { - for (cell in cells.values) { - yield(cell) - } - } - - /** - * Represents the total number of points currently stored in the hash grid. - * This property is incremented whenever a new point is inserted into the grid. - * It's read-only for external access and cannot be modified outside the class. - */ - var size: Int = 0 - private set - - /** - * The size of a single cell in the 3D hash grid. - * - * The cell size is computed as the radius of the grid divided by the square root of 3, - * which ensures that the cell dimensions are scaled appropriately in a 3D space. - * This value influences the spatial resolution of the grid and determines - * how points are grouped into cells during computations such as insertion or querying. - */ - val cellSize = radius / sqrt(3.0) - private fun coords(v: Vector3): GridCoords3D { - val x = (v.x / cellSize).fastFloor() - val y = (v.y / cellSize).fastFloor() - val z = (v.z / cellSize).fastFloor() - return GridCoords3D(x, y, z) - } - - /** - * Returns a sequence of all points contained in the hash grid. - * - * Iterates over all cells in the grid and yields each contained point. - * Each point is represented as a value yielded by the sequence. - * - * @return A sequence of all points stored in the hash grid. - */ - fun points() = sequence { - for (cell in cells.values) { - for (point in cell.points) { - yield(point) - } - } - } - - /** - * Selects a random 3D vector from the points stored in the hash grid. - * - * @param random A random number generator to use for selection. Defaults to `Random.Default`. - * @return A randomly selected `Vector3` from the hash grid. - */ - fun random(random: Random = Random.Default): Vector3 { - return cells.values.random(random).points.random().first - } - - fun insert(point: Vector3, owner: Any? = null) { - val gc = coords(point) - val cell = cells.getOrPut(gc) { Cell3D(gc.x, gc.y, gc.z, cellSize) } - cell.insert(point, owner) - size += 1 - } - - /** - * Retrieves the 3D cell corresponding to the given query point in the spatial hash grid. - * - * This method computes the grid coordinates of the query vector and attempts to fetch - * the corresponding cell from the internal cell mapping. - * - * @param query A `Vector3` object representing the point used to locate the corresponding cell. - * @return A `Cell3D` object if a cell exists for the given query point, or `null` if no such cell is found. - */ - fun cell(query: Vector3): Cell3D? = cells[coords(query)] - - /** - * Determines whether a specific point in the 3D grid is free, considering the proximity - * to other points and optionally ignoring specified owners. - * - * @param query The `Vector3` representing the point to check for availability. - * @param ignoreOwners A set of owners to ignore during the proximity check. Default is an empty set. - * @return `true` if the point is considered free or not occupied; otherwise, `false`. - */ - fun isFree(query: Vector3, ignoreOwners: Set = emptySet()): Boolean { - val c = coords(query) - if (cells[c] == null) { - for (k in -2..2) { - for (j in -2..2) { - for (i in -2..2) { - if (i == 0 && j == 0 && k == 0) { - continue - } - val n = c.offset(i, j, k) - val nc = cells[n] - if (nc != null && nc.squaredDistanceTo(query) <= radius * radius) { - for (p in nc.points) { - if (p.second == null || p.second !in ignoreOwners) { - if (p.first.squaredDistanceTo(query) <= radius * radius) { - return false - } - } - } - } - } - } - } - return true - } else { - return cells[c]!!.points.all { it.second != null && it.second in ignoreOwners } - } - } -} - -/** - * Construct a hash grid containing all points in the list - * @param radius radius of the hash grid - */ -fun List.hashGrid(radius: Double): HashGrid3D { - val grid = HashGrid3D(radius) - for (point in this) { - grid.insert(point) - } - return grid -} - -/** - * Return a list that only contains points at a minimum distance. - * @param radius the minimum distance between any two points in the returned list - */ -fun List.filter(radius: Double): List { - return if (size <= 1) { - this - } else { - val grid = HashGrid3D(radius) - for (point in this) { - if (grid.isFree(point)) { - grid.insert(point) - } - } - grid.points().map { it.first }.toList() - } -} \ No newline at end of file diff --git a/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter01.kt b/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter01.kt deleted file mode 100644 index 188f5cd4..00000000 --- a/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter01.kt +++ /dev/null @@ -1,30 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.hashgrid.filter -import org.openrndr.extra.noise.shapes.uniform -import kotlin.random.Random - -/** A demo to generate and display filtered random points. - * - * The program performs the following steps: - * - Generates 10,000 random points uniformly distributed within the drawable bounds. - * - Filters the generated points to enforce a minimum distance of 20.0 units between them. - * - Visualizes the filtered points as circles with a radius of 10.0 units on the canvas. - * - * The `filter` method is provided by `orx-hash-grid`. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val r = Random(0) - val points = (0 until 10000).map { - drawer.bounds.uniform(random = r) - } - val filteredPoints = points.filter(20.0) - extend { - drawer.circles(filteredPoints, 10.0) - } - } -} diff --git a/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter3D01.kt b/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter3D01.kt deleted file mode 100644 index 5713bba4..00000000 --- a/orx-hash-grid/src/jvmDemo/kotlin/DemoFilter3D01.kt +++ /dev/null @@ -1,53 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.isolated -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.hashgrid.filter -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.extra.noise.uniformRing -import org.openrndr.math.Vector3 -import kotlin.random.Random - -/** - * Demonstrates how to use a 3D hash-grid `filter` operation to remove points from a random 3D point-collection - * that are too close to each other. The resulting points are displayed as small spheres. - * - * The program performs the following key steps: - * - Generates 10,000 random 3D points located between a minimum and maximum radius. - * - Filters the points to ensure a minimum distance between any two points using a spatial hash grid. - * - Creates a small sphere mesh that will be instanced for each filtered point. - * - Sets up an orbital camera to allow viewing the 3D scene interactively. - * - Renders the filtered points by translating the sphere mesh to each point's position and applying a shader that modifies the fragment color based on the view normal. - */ -fun main() = application { - configure { - width = 720 - height = 720 - multisample = WindowMultisample.SampleCount(4) - } - program { - val r = Random(0) - val points = (0 until 10000).map { - Vector3.uniformRing(0.0, 10.0, r) - } - val sphere = sphereMesh(radius = 0.25) - val filteredPoints = points.filter(0.5) - - extend(Orbital()) { - eye = Vector3(0.0, 0.0, 15.0) - } - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """x_fill.rgb *= abs(v_viewNormal.z);""" - } - for (point in filteredPoints) { - drawer.isolated { - drawer.translate(point) - drawer.vertexBuffer(sphere, DrawPrimitive.TRIANGLES) - } - } - } - } -} \ No newline at end of file diff --git a/orx-hash-grid/src/jvmDemo/kotlin/DemoHashGrid01.kt b/orx-hash-grid/src/jvmDemo/kotlin/DemoHashGrid01.kt deleted file mode 100644 index 45d8be0e..00000000 --- a/orx-hash-grid/src/jvmDemo/kotlin/DemoHashGrid01.kt +++ /dev/null @@ -1,42 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.hashgrid.HashGrid -import org.openrndr.extra.noise.shapes.uniform -import kotlin.random.Random - -/** - * This demo creates a `HashGrid` to manage points in a 2D space. - * Notice the desired cell size in the HashGrid constructor. - * - * On every animation frame, it attempts to insert 100 random points into the HashGrid. - * When a HashGrid cell is free, a point is inserted. - * - * The visual output includes: - * - Rectangles representing the bounds of the occupied cells in the grid. - * - Circles representing the generated random points. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val r = Random(0) - val hashGrid = HashGrid(72.0) - - extend { - for (i in 0 until 100) { - val p = drawer.bounds.uniform(random = r) - if (hashGrid.isFree(p)) { - hashGrid.insert(p) - } - } - - drawer.fill = null - drawer.stroke = ColorRGBa.WHITE - drawer.rectangles(hashGrid.cells().map { it.bounds }.toList()) - drawer.stroke = ColorRGBa.PINK - drawer.circles(hashGrid.points().map { it.first }.toList(), 36.0) - } - } -} diff --git a/orx-image-fit/README.md b/orx-image-fit/README.md deleted file mode 100644 index faab99dd..00000000 --- a/orx-image-fit/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# orx-image-fit - -Draws an image ensuring it fits or covers the specified `Rectangle`. - -Similar to CSS object-fit (https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) - -`orx-image-fit` provides the `Drawer.imageFit` extension function. - -## Usage - -```kotlin -drawer.imageFit( - img: ColorBuffer, - x: Double, y: Double, w: Double, h: Double, - horizontalPosition: Double, - verticalPosition: Double, - fitMethod: FitMethod) -``` - -or - -```kotlin -drawer.imageFit( - img: ColorBuffer, - bounds: Rectangle, - horizontalPosition: Double, - verticalPosition: Double, - fitMethod: FitMethod) -``` - -- `img`: the image to draw -- `x`, `y`, `w`, `h` or `bounds`: the target area where to draw the image -- `fitMethod`: - - `FitMethod.Contain`: fits `img` in the target area. If the aspect ratio of `img` and `bounds` differ it leaves blank horizontal or vertical margins to avoid deforming the image. - - `FitMethod.Cover`: covers the target area. . If the aspect ratio of `img` and `bounds` differ part of the image will be cropped away. - - `FitMethod.Fill`: deforms the image to exactly match the target area. - - `FitMethod.None`: draws the image on the target area without scaling it. -- `horizontalPosition` and `verticalPosition`: controls which part of the image is visible (`Cover`, `None`) or the alignment of the image (`Contain`). - - `horizontalPosition`: `-1.0` = left, `0.0` = center, `1.0` = right. - - `verticalPosition`: `-1.0` = top, `0.0` = center, `1.0` = bottom. - -## Examples - -A quick example that fits an image to the window rectangle with a 10 pixel margin. By default -`imageFit` uses the cover mode, which fills the target rectangle with an image. - -```kotlin -fun main() = application { - program { - val image = loadImage("data/images/pm5544.png") - extend { - drawer.imageFit(image, 10.0, 10.0, width - 20.0, height - 20.0) - } - } -} -``` - -or - -```kotlin -fun main() = application { - program { - val image = loadImage("data/images/pm5544.png") - extend { - drawer.imageFit(image, drawer.bounds.offsetEdges(-10.0)) - } - } -} -``` - - -## Demos -### DemoImageFit01 - -This program uses `drawer.imageFit()` to draw images using nested grid layout. -The main grid features 4 columns for the `Cover`, `Contain`, `Fill` and `None` fit methods, -and two rows for portrait and landscape images. -Each of those 8 cells feature a 3x3 grid, with cells combining `left`, `center` and `right` alignment -with `top`, `center` and `bottom` alignment. - -The image drawn in each cell is a simple image with a white background and two touching circles: -a pink one and a gray one. In some of the cells part of this image is cropped out (due to the fit method used). -In other cells the image does not fully cover the available area, revealing a dark gray background. - -![DemoImageFit01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-image-fit/images/DemoImageFit01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoImageFit01.kt) - -### DemoImageFitSub01 - -Demonstrates the `imageFitSub()` method, which allows specifying not only a target `Rectangle`, -but also a source `Rectangle`, which is used to set the area of the original image we want to fit -into the target. - -The program also demonstrates the `Rectangle.uniformSub` method, which returns a random sub-rectangle -taking into consideration the minimum and maximum width and height arguments. - -Notice the trick used to generate unique random results changing only once per second by using -the current seconds as an integer seed. - -![DemoImageFitSub01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-image-fit/images/DemoImageFitSub01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoImageFitSub01.kt) diff --git a/orx-image-fit/build.gradle.kts b/orx-image-fit/build.gradle.kts deleted file mode 100644 index 3a84ef1c..00000000 --- a/orx-image-fit/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -kotlin { - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-shader-phrases")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-shapes")) - implementation(project(":orx-image-fit")) - implementation(project(":orx-noise")) - } - } - } -} diff --git a/orx-image-fit/src/commonMain/kotlin/ImageFit.kt b/orx-image-fit/src/commonMain/kotlin/ImageFit.kt deleted file mode 100644 index 7dcdc5fb..00000000 --- a/orx-image-fit/src/commonMain/kotlin/ImageFit.kt +++ /dev/null @@ -1,187 +0,0 @@ -package org.openrndr.extra.imageFit - -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Drawer -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.math.transforms.transform -import org.openrndr.shape.Rectangle -import kotlin.math.max -import kotlin.math.min - -/** - * Available `object-fit` methods (borrowed from CSS) - */ -enum class FitMethod { - /** Cover target area. Crop the source image if needed. */ - Cover, - - /** Fit image in target area. Add margins if needed. */ - Contain, - - /** Deform source image to match the target area. */ - Fill, - - /** Maintain original image scale, crop to target area size. */ - None - - /** Not implemented */ - // ScaleDown -} - -/** - * Transforms [src] and [dest] into a Pair in which one of the - * two rectangles is modified to conform with the [fitMethod]. It uses - * [horizontalPosition] and [verticalPosition] to control positioning / cropping. - */ -fun fitRectangle( - src: Rectangle, - dest: Rectangle, - horizontalPosition: Double = 0.0, - verticalPosition: Double = 0.0, - fitMethod: FitMethod = FitMethod.Cover -): Pair { - val positionNorm = Vector2(horizontalPosition, verticalPosition) * 0.5 + 0.5 - val (scaleX, scaleY) = dest.dimensions / src.dimensions - - return when (fitMethod) { - FitMethod.Cover -> { - val actualDimensions = dest.dimensions / max(scaleX, scaleY) - val actualSrc = Rectangle( - src.corner + (src.dimensions - actualDimensions) * positionNorm, - actualDimensions.x, actualDimensions.y - ) - Pair(actualSrc, dest) - } - - FitMethod.Contain -> { - val actualDimensions = src.dimensions * min(scaleX, scaleY) - val actualDest = Rectangle( - dest.corner + (dest.dimensions - actualDimensions) * positionNorm, - actualDimensions.x, actualDimensions.y - ) - Pair(src, actualDest) - } - - FitMethod.Fill -> Pair(src, dest) - FitMethod.None -> { - val actualSrc = Rectangle( - src.corner + (src.dimensions - dest.dimensions) * positionNorm, - dest.width, dest.height - ) - Pair(actualSrc, dest) - } - } -} - -/** - * Helper function that calls [fitRectangle] and returns a [Matrix44] instead - * of a `Pair`. The returned matrix can be used to draw - * scaled `Shape` or `ShapeContour` objects. - * - * Example scaling and centering a collection of ShapeContours inside - * `drawer.bounds` leaving a margin of 50 pixels: - * - * val src = shapeContours.map { it.bounds }.bounds - * val dest = drawer.bounds.offsetEdges(-50.0) - * val mat = src.fit(dest, fitMethod = FitMethod.Contain) - * drawer.view *= mat - * drawer.contours(shapeContours) - */ -fun Rectangle.fit( - dest: Rectangle, - horizontalPosition: Double = 0.0, - verticalPosition: Double = 0.0, - fitMethod: FitMethod = FitMethod.Cover -): Matrix44 { - val (source, target) = fitRectangle( - this, - dest, - horizontalPosition, - verticalPosition, - fitMethod - ) - return transform { - translate(target.corner) - scale((target.dimensions / source.dimensions).vector3(z = 1.0)) - translate(-source.corner) - } -} - -/** - * Draws [img] into the bounding box defined by [x], [y], [width] and [height] - * using the specified [fitMethod] - * and aligned or cropped using [horizontalPosition] and [verticalPosition]. - */ -fun Drawer.imageFit( - img: ColorBuffer, - x: Double = 0.0, - y: Double = 0.0, - width: Double = img.width.toDouble(), - height: Double = img.height.toDouble(), - horizontalPosition: Double = 0.0, - verticalPosition: Double = 0.0, - fitMethod: FitMethod = FitMethod.Cover -) = imageFit( - img, - Rectangle(x, y, width, height), - horizontalPosition, - verticalPosition, - fitMethod -) - -/** - * Draws [img] into the bounding box defined by [bounds] - * using the specified [fitMethod] - * and aligned or cropped using [horizontalPosition] and [verticalPosition]. - */ -fun Drawer.imageFit( - img: ColorBuffer, - bounds: Rectangle = img.bounds, - horizontalPosition: Double = 0.0, - verticalPosition: Double = 0.0, - fitMethod: FitMethod = FitMethod.Cover -): Pair { - val (source, target) = fitRectangle( - img.bounds, - bounds, - horizontalPosition, - verticalPosition, - fitMethod - ) - - image(img, source, target) - return Pair(source, target) -} - -/** - * Draws a subsection of the given image into a target rectangle within the current `Drawer` bounds, - * using the specified fit method and alignment. - * - * @param img The `ColorBuffer` representing the image to draw. - * @param source The subsection of the image to be fitted, defined as a `Rectangle`. Defaults to the full bounds of the image. - * @param target The rectangle within the `Drawer` bounds where the image will be drawn. Defaults to the full bounds of the `Drawer`. - * @param horizontalPosition Horizontal alignment or cropping position for the image as a normalized value from -1.0 to 1.0. - * @param verticalPosition Vertical alignment or cropping position for the image as a normalized value from -1.0 to 1.0. - * @param fitMethod The method to use for fitting the image into the target rectangle. Defaults to `FitMethod.Cover`. - * @return A `Pair` of `Rectangle` objects, where the first element is the transformed source rectangle, and the second element is the target rectangle. - */ -fun Drawer.imageFitSub( - img: ColorBuffer, - source: Rectangle = img.bounds, - target: Rectangle = this.bounds, - horizontalPosition: Double = 0.0, - verticalPosition: Double = 0.0, - fitMethod: FitMethod = FitMethod.Cover -): Pair { - val (fitSource, fitTarget) = fitRectangle( - source, - target, - horizontalPosition, - verticalPosition, - fitMethod - ) - - image(img, fitSource, fitTarget) - return Pair(source, target) -} \ No newline at end of file diff --git a/orx-image-fit/src/jvmDemo/kotlin/DemoImageFit01.kt b/orx-image-fit/src/jvmDemo/kotlin/DemoImageFit01.kt deleted file mode 100644 index 3f64a980..00000000 --- a/orx-image-fit/src/jvmDemo/kotlin/DemoImageFit01.kt +++ /dev/null @@ -1,72 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.drawImage -import org.openrndr.extra.imageFit.FitMethod -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.shapes.primitives.grid - -/** - * This program uses `drawer.imageFit()` to draw images using nested grid layout. - * The main grid features 4 columns for the `Cover`, `Contain`, `Fill` and `None` fit methods, - * and two rows for portrait and landscape images. - * Each of those 8 cells feature a 3x3 grid, with cells combining `left`, `center` and `right` alignment - * with `top`, `center` and `bottom` alignment. - * - * The image drawn in each cell is a simple image with a white background and two touching circles: - * a pink one and a gray one. In some of the cells part of this image is cropped out (due to the fit method used). - * In other cells the image does not fully cover the available area, revealing a dark gray background. - */ -fun main() = application { - configure { - width = 1600 - height = 900 - } - - program { - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 18.0) - - // Create an image with a gray and a pink circle - fun makeImage(cols: Int, rows: Int, side: Int = 400) = drawImage(cols * side, rows * side) { - clear(ColorRGBa.WHITE) - stroke = null - bounds.grid(cols, rows).flatten().forEachIndexed { i, it -> - fill = if (i % 2 == 0) ColorRGBa.PINK else ColorRGBa.GRAY - circle(it.center, side / 2.0) - } - } - - val namedImages = mapOf( - "portrait" to makeImage(1, 2), - "landscape" to makeImage(2, 1) - ) - val fitMethods = FitMethod.entries.toTypedArray() - - val grid = drawer.bounds.grid(fitMethods.size, namedImages.size, 30.0, 30.0, 30.0, 30.0) - - extend { - drawer.fontMap = font - drawer.stroke = null - fitMethods.forEachIndexed { y, fitMethod -> - namedImages.entries.forEachIndexed { x, (layoutName, img) -> - val cell = grid[x][y] - // In each grid cell draw 9 fitted images combining - // [left, center, right] and [top, center, bottom] alignment - val subgrid = cell.grid(3, 3, 0.0, 0.0, 4.0, 4.0) - subgrid.forEachIndexed { yy, rects -> - rects.forEachIndexed { xx, rect -> - // Draw a dark background - drawer.fill = ColorRGBa.WHITE.shade(0.25) - drawer.rectangle(rect) - - // Draw the image using `imageFit` - drawer.imageFit(img, rect, xx - 1.0, yy - 1.0, fitMethod) - } - } - drawer.fill = ColorRGBa.WHITE - drawer.text("${fitMethod.name}, $layoutName", cell.position(0.0, 1.038).toInt().vector2) - } - } - } - } -} \ No newline at end of file diff --git a/orx-image-fit/src/jvmDemo/kotlin/DemoImageFitSub01.kt b/orx-image-fit/src/jvmDemo/kotlin/DemoImageFitSub01.kt deleted file mode 100644 index ad1bc630..00000000 --- a/orx-image-fit/src/jvmDemo/kotlin/DemoImageFitSub01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.loadImage -import org.openrndr.extra.imageFit.imageFitSub - -import org.openrndr.extra.noise.shapes.uniformSub -import org.openrndr.extra.shapes.primitives.grid -import kotlin.random.Random - -/** - * Demonstrates the `imageFitSub()` method, which allows specifying not only a target `Rectangle`, - * but also a source `Rectangle`, which is used to set the area of the original image we want to fit - * into the target. - * - * The program also demonstrates the `Rectangle.uniformSub` method, which returns a random sub-rectangle - * taking into consideration the minimum and maximum width and height arguments. - * - * Notice the trick used to generate unique random results changing only once per second by using - * the current seconds as an integer seed. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val image = loadImage("demo-data/images/image-001.png") - extend { - val grid = drawer.bounds.grid(5, 5).flatten() - val r = Random(seconds.toInt()) - for (cell in grid) { - drawer.imageFitSub( - image, - image.bounds.uniformSub(0.25, 0.75, 0.25, 0.75, random = r), - cell - ) - } - } - } -} \ No newline at end of file diff --git a/orx-integral-image/README.md b/orx-integral-image/README.md deleted file mode 100644 index 085b5680..00000000 --- a/orx-integral-image/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# orx-integral-image - -CPU and GPU-based implementation for integral images (summed area tables) - - -## Demos -### DemoFII01 - -Apply box blurs with large windows - -![DemoFII01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-integral-image/images/DemoFII01Kt.png) - -[source code](src/demo/kotlin/DemoFII01.kt) - -### DemoFII02 - -Implement an FM like video synthesizer using [FastIntegralImage] - -![DemoFII02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-integral-image/images/DemoFII02Kt.png) - -[source code](src/demo/kotlin/DemoFII02.kt) diff --git a/orx-integral-image/build.gradle.kts b/orx-integral-image/build.gradle.kts deleted file mode 100644 index a2404108..00000000 --- a/orx-integral-image/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(project(":orx-fx")) - implementation(openrndr.application.core) - implementation(openrndr.math) - demoImplementation(project(":orx-image-fit")) -} \ No newline at end of file diff --git a/orx-integral-image/src/demo/kotlin/DemoFII01.kt b/orx-integral-image/src/demo/kotlin/DemoFII01.kt deleted file mode 100644 index 82408ad1..00000000 --- a/orx-integral-image/src/demo/kotlin/DemoFII01.kt +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Apply box blurs with large windows - */ - -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.integralimage.* - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val fii = FastIntegralImage() - val integralImage = colorBuffer(width, height, 1.0, ColorFormat.RGBa, ColorType.FLOAT32) - val rt = renderTarget(width, height) { - colorBuffer() - } - extend { - drawer.clear(ColorRGBa.PINK) - drawer.isolatedWithTarget(rt) { - drawer.ortho(rt) - drawer.clear(ColorRGBa.BLACK) - drawer.fill = ColorRGBa.PINK.shade(1.0) - drawer.circle(mouse.position, 128.0) - } - fii.apply(rt.colorBuffer(0), integralImage) - - // -- here we sample from the integral image - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - float w = 64.0; - vec2 step = 1.0 / vec2(textureSize(image, 0)); - vec4 t11 = texture(image, va_texCoord0 + step * vec2(w+1.0,w+1.0)); - vec4 t01 = texture(image, va_texCoord0 + step * vec2(-w,w+1.0)); - vec4 t00 = texture(image, va_texCoord0 + step * vec2(-w,-w)); - vec4 t10 = texture(image, va_texCoord0 + step * vec2(w+1.0,-w)); - x_fill = (t11 - t01 - t10 + t00) / ((2.0 * w +1.0) * (2.0 * w + 1.0)); - """.trimIndent() - } - drawer.image(integralImage) - } - } -} \ No newline at end of file diff --git a/orx-integral-image/src/demo/kotlin/DemoFII02.kt b/orx-integral-image/src/demo/kotlin/DemoFII02.kt deleted file mode 100644 index 30ebf96b..00000000 --- a/orx-integral-image/src/demo/kotlin/DemoFII02.kt +++ /dev/null @@ -1,85 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.integralimage.* -import kotlin.math.PI - -/** - * Implement an FM like video synthesizer using [FastIntegralImage] - */ - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - - val image = loadImage("demo-data/images/image-001.png") - val fii = FastIntegralImage() - val integralImage = colorBuffer(width, height, 1.0, ColorFormat.RGBa, ColorType.FLOAT32) - val rt = renderTarget(width, height) { - colorBuffer() - } - extend { - drawer.clear(ColorRGBa.PINK) - - /* - Draw an input image - */ - drawer.isolatedWithTarget(rt) { - drawer.ortho(rt) - drawer.clear(ColorRGBa.BLACK) - drawer.imageFit(image, drawer.bounds) - drawer.fill = ColorRGBa.PINK.shade(1.0) - drawer.circle(mouse.position, 256.0) - } - - /* - Update the integral image - */ - fii.apply(rt.colorBuffer(0), integralImage) - - - /* - Use a shade style to sample from the integral image - */ - - drawer.shadeStyle = shadeStyle { - fragmentPreamble = """ - vec3 linePhase(vec2 uv) { - vec2 step = 1.0 / vec2(textureSize(image, 0)); - vec4 t11 = texture(image, uv + step * vec2(1.0,1.0)); - vec4 t01 = texture(image, vec2(0.0, uv.y) + step * vec2(0,1.0)); - vec4 t00 = texture(image, vec2(0.0, uv.y)); - vec4 t10 = texture(image, uv + step * vec2(1.0, 0.0)); - vec4 r = (t11 - t01 - t10 + t00); - return r.xyz; - } - - """.trimIndent() - - fragmentTransform = """ - vec2 s = 1.0 / vec2(textureSize(image, 0)); - - float spread = 1.0; - - vec3 phase0 = linePhase(va_texCoord0 + s * vec2(-spread, 0.0)); - vec3 phase1 = linePhase(va_texCoord0); - - float carrierFreq = 40.0 * 2.0 * ${PI}; - float carrierPhase = va_texCoord0.x + va_texCoord0.y; - float signalFreq = s.x * 100.0 * 2.0 * ${PI}; - - vec3 mo0 = cos(phase0 * signalFreq + carrierPhase * carrierFreq); - vec3 mo1 = cos(phase1 * signalFreq + (carrierPhase - s.x * spread) * carrierFreq); - - x_fill.rgb = (mo1 - mo0) * 2.0; - x_fill.a = 1.0; - """.trimIndent() - } - drawer.image(integralImage) - } - } -} \ No newline at end of file diff --git a/orx-integral-image/src/main/kotlin/FastIntegralImage.kt b/orx-integral-image/src/main/kotlin/FastIntegralImage.kt deleted file mode 100644 index 32c986d6..00000000 --- a/orx-integral-image/src/main/kotlin/FastIntegralImage.kt +++ /dev/null @@ -1,146 +0,0 @@ -package org.openrndr.extra.integralimage - -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough - -import org.openrndr.math.Vector2 -import org.openrndr.resourceUrl -import org.openrndr.shape.IntRectangle -import org.openrndr.shape.Rectangle -import kotlin.math.ceil -import kotlin.math.log - - -internal class FastIntegralImageFilter : Filter( - filterShaderFromUrl( - resourceUrl( - "/shaders/gl3/integral-image.frag" - ) - ) -) { - var passIndex: Int by parameters - var passDirection: Vector2 by parameters - var sampleCount: Int by parameters - var sampleCountBase: Int by parameters -} - -/** - * Compute an integral image for the source image - */ -class FastIntegralImage : Filter( - filterShaderFromUrl( - resourceUrl( - "/shaders/gl3/integral-image.frag" - ) - ) -) { - private val passthrough = Passthrough() - - var intermediate: ColorBuffer? = null - var sourceCropped: ColorBuffer? = null - var targetPadded: ColorBuffer? = null - private val filter = FastIntegralImageFilter() - - private fun sampleCounts(size: Int, sampleCountBase: Int): List { - var remainder = size - val sampleCounts = mutableListOf() - while (remainder > 0) { - sampleCounts += if (remainder >= sampleCountBase) { - sampleCountBase - } else { - remainder - } - remainder /= sampleCountBase - } - return sampleCounts - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - require(source[0].isEquivalentTo(target[0], ignoreFormat = true, ignoreType = true)) - - val npotx = ceil(log(source[0].effectiveWidth.toDouble(), 2.0)).toInt() - val npoty = ceil(log(source[0].effectiveHeight.toDouble(), 2.0)).toInt() - - val recWidth = 1 shl npotx - val recHeight = 1 shl npoty - - if (recWidth != source[0].effectiveWidth || recHeight != source[0].effectiveHeight) { - if (sourceCropped?.effectiveWidth != recWidth || sourceCropped?.effectiveHeight != recHeight) { - sourceCropped?.destroy() - targetPadded?.destroy() - } - - if (sourceCropped == null) { - sourceCropped = source[0].createEquivalent(width = recWidth, height = recHeight, contentScale = 1.0) - targetPadded = target[0].createEquivalent( - width = (recWidth / target[0].contentScale).toInt(), - height = (recHeight / target[0].contentScale).toInt(), - contentScale = 1.0 - ) - } - source[0].copyTo(sourceCropped!!, - sourceRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, recHeight-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight) - ) - } - - val sampleCountBase = 16 - val xSampleCounts = sampleCounts(recWidth, sampleCountBase) - val ySampleCounts = sampleCounts(recHeight, sampleCountBase) - - val li = intermediate - if (li == null || (li.effectiveWidth != recWidth || li.effectiveHeight != recHeight)) { - intermediate?.destroy() - intermediate = colorBuffer(recWidth, recHeight, 1.0, ColorFormat.RGBa, ColorType.FLOAT32) - } - - val targets = arrayOf(if (targetPadded == null) target else arrayOf(targetPadded!!), arrayOf(intermediate!!)) - - var targetIndex = 0 - - filter.sampleCountBase = sampleCountBase - - /* - Perform horizontal steps - */ - filter.passDirection = Vector2.UNIT_X - for (pass in xSampleCounts.indices) { - filter.sampleCount = xSampleCounts[pass] - filter.passIndex = pass - filter.apply( - if (pass == 0) { - if (sourceCropped == null) source else arrayOf(sourceCropped!!) - } else targets[targetIndex % 2], targets[(targetIndex + 1) % 2] - ) - targetIndex++ - } - - - /* - Perform vertical steps - */ - filter.passDirection = Vector2.UNIT_Y - for (pass in ySampleCounts.indices) { - filter.sampleCount = ySampleCounts[pass] - filter.passIndex = pass - filter.apply(targets[targetIndex % 2], targets[(targetIndex + 1) % 2]) - targetIndex++ - } - - // this is a bit wasteful - if (targetIndex % 2 == 1) { - passthrough.apply(targets[1], targets[0]) - } - - /* - When the source is not a power of two we copy from the padded target to the target - */ - if (targetPadded != null) { - targetPadded!!.copyTo(target[0], - sourceRectangle = IntRectangle(0, recHeight-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight) - ) - } - } -} \ No newline at end of file diff --git a/orx-integral-image/src/main/kotlin/IntegralImage.kt b/orx-integral-image/src/main/kotlin/IntegralImage.kt deleted file mode 100644 index 4c1df7f2..00000000 --- a/orx-integral-image/src/main/kotlin/IntegralImage.kt +++ /dev/null @@ -1,80 +0,0 @@ -package studio.rndnr.packture - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorBufferShadow -import org.openrndr.shape.IntRectangle - -class IntegralImage(val width: Int, val height: Int, val integral: LongArray) { - - internal val maximum: Long - get() = integral[integral.size - 1] - - companion object { - fun fromColorBufferShadow(shadow: ColorBufferShadow, sampler: (ColorRGBa) -> Long = { (it.r * 255.0).toLong() }): IntegralImage { - val integral = LongArray(shadow.colorBuffer.width * shadow.colorBuffer.height) - - val width = shadow.colorBuffer.width - val height = shadow.colorBuffer.height - - for (i in integral.indices) { - integral[i] = 0 - } - - for (y in 0 until height) { - for (x in 0 until width) { - val i = sampler(shadow.read(x, y)) - - var i10: Long = 0 - if (x > 0) - i10 = integral[x - 1 + y * width] - - var i01: Long = 0 - if (y > 0) { - i01 = integral[x + (y - 1) * width] - } - - var i11: Long = 0 - if (y > 0 && x > 0) { - i11 = integral[x - 1 + (y - 1) * width] - } - - integral[y * width + x] = i + i10 + i01 - i11 - } - } - return IntegralImage(width, height, integral) - } - } - - - private fun clip(x: Int, left: Int, right: Int): Int { - return Math.min(right, Math.max(left, x)) - } - - fun sum(area: IntRectangle): Long { - return sum(area.x, area.y, area.x + area.width - 1, area.y + area.height - 1) - } - - private fun sum(left: Int, top: Int, right: Int, bottom: Int): Long { - var left = left - var top = top - var right = right - var bottom = bottom - top = clip(top, 0, height - 1) - bottom = clip(bottom, 0, height - 1) - - left = clip(left, 0, width - 1) - right = clip(right, 0, width - 1) - - val a = integral[left + top * width] - val b = integral[right + top * width] - val c = integral[right + bottom * width] - val d = integral[left + bottom * width] - - return a + c - b - d - } - - private fun average(left: Int, top: Int, right: Int, bottom: Int): Double { - val area = ((right - left) * (bottom - top)).toDouble() - return sum(left, top, right, bottom) / area - } -} \ No newline at end of file diff --git a/orx-integral-image/src/main/resources/shaders/gl3/integral-image.frag b/orx-integral-image/src/main/resources/shaders/gl3/integral-image.frag deleted file mode 100644 index ade32a47..00000000 --- a/orx-integral-image/src/main/resources/shaders/gl3/integral-image.frag +++ /dev/null @@ -1,26 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_color; - -uniform int passIndex; -uniform int sampleCount; -uniform int sampleCountBase; -uniform vec2 passDirection; - - -void main() { - vec2 passOffset = vec2( - pow(float(sampleCountBase), - float(passIndex))) * (1.0 / vec2(textureSize(tex0, 0)) - ) * passDirection; - - vec2 uv0 = v_texCoord0; -// uv0.y = 1.0 - uv0.y; - vec4 result = vec4(0.0); - for (int i = 0; i < sampleCount; ++i) { - vec2 readUV = v_texCoord0 - vec2(float(i) * passOffset); - float factor = step(0.0, readUV.x) * step(0.0, readUV.y); - result += factor * texture(tex0, readUV); - } - o_color = result; -} \ No newline at end of file diff --git a/orx-interval-tree/README.md b/orx-interval-tree/README.md deleted file mode 100644 index bffad5db..00000000 --- a/orx-interval-tree/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# orx-interval-tree - -For querying a data set containing time segments (start time and end time) -when we need all entries containing a specific time value. Useful when creating a timeline. - -For more information on interval trees read the [wikipedia page](https://en.wikipedia.org/wiki/Interval_tree). - -## Usage - -```kotlin -// -- the item class we want to search for -class Item(val start: Double, val end: Double) - -// -- the items we want to search in -val items = List(100000) { Item(Math.random(), 1.0 + Math.random()) } - -// -- build the interval tree, note how buildIntervalTree accepts a function that returns the start and end of the interval. -val tree = buildIntervalTree(items) { - Pair(it.start, it.end) -} - -// -- search for all items that intersect 0.05 -val results = tree.queryPoint(0.05) -``` - diff --git a/orx-interval-tree/build.gradle.kts b/orx-interval-tree/build.gradle.kts deleted file mode 100644 index d695795a..00000000 --- a/orx-interval-tree/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} \ No newline at end of file diff --git a/orx-interval-tree/src/main/kotlin/IntervalTree.kt b/orx-interval-tree/src/main/kotlin/IntervalTree.kt deleted file mode 100644 index a6e17b72..00000000 --- a/orx-interval-tree/src/main/kotlin/IntervalTree.kt +++ /dev/null @@ -1,95 +0,0 @@ -class IntervalNode(val center: Double) { - val overlapBegin = mutableListOf>() - val overlapEnd = mutableListOf>() - - var left: IntervalNode? = null - var right: IntervalNode? = null - - fun queryPoint(x: Double): MutableList { - val results = mutableListOf() - queryPoint(x, results) - return results - } - - private fun queryPoint(x: Double, results: MutableList) { - if (x < center) { - for ((start, item) in overlapBegin) { - if (start <= x) { - results.add(item) - } else { - break - } - } - left?.queryPoint(x, results) - } else if (x > center) { - for ((end, item) in overlapEnd) { - if (end > x) { - results.add(item) - } else { - break - } - } - right?.queryPoint(x, results) - } else if (x == center) { - results.addAll(overlapBegin.map { it.second }) - } - } -} - - -fun buildIntervalTree(items: List, intervalFunction: (T) -> Pair): IntervalNode { - val ranges = items.map { intervalFunction(it) } - val center = ranges.sumOf { (it.first + it.second) / 2.0 } / ranges.size - val node = IntervalNode(center) - val leftItems = mutableListOf() - val rightItems = mutableListOf() - for (item in items) { - val interval = intervalFunction(item) - if (interval.first <= center && interval.second > center) { - node.overlapBegin.add(Pair(interval.first, item)) - node.overlapEnd.add(Pair(interval.second, item)) - } else if (interval.second <= center) { - leftItems.add(item) - } else if (interval.first > center) { - rightItems.add(item) - } - } - node.overlapBegin.sortBy { it.first } - node.overlapEnd.sortByDescending { it.first } - - if (leftItems.isNotEmpty()) { - node.left = buildIntervalTree(leftItems, intervalFunction) - } - if (rightItems.isNotEmpty()) { - node.right = buildIntervalTree(rightItems, intervalFunction) - } - return node -} - -fun time(f: () -> Unit) { - val start = System.currentTimeMillis() - f() - val end = System.currentTimeMillis() - println("that took ${end - start}ms") -} - -fun main() { - class Test(val start: Double, val end: Double) - - val items = List(100000) { Test(Math.random(), 1.0 + Math.random()) } - val root = buildIntervalTree(items) { - Pair(it.start, it.end) - } - - time { - for (i in 0 until 10000) { - val results = items.filter { it.start <= 0.05 && it.end > 0.05 } - } - } - - time { - for (i in 0 until 10000) { - root.queryPoint(0.05) - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/README.md b/orx-jumpflood/README.md deleted file mode 100644 index 524d42b3..00000000 --- a/orx-jumpflood/README.md +++ /dev/null @@ -1,277 +0,0 @@ -# orx-jumpflood - -Calculates distance or direction fields from an image. -GPU accelerated, 2D. Results are provided as an image. - -[Original jump flooding algorithm](https://www.comp.nus.edu.sg/~tants/jfa.html) - -`orx-jumpflood` focusses on finding 2d distance and directional distance fields. - -## Distance field example - -`distanceFieldFromBitmap()` calculates distances to bitmap contours it stores -the distance in red and the original bitmap in green. - - -```kotlin -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import org.openrndr.extra.jumpfill.DistanceField -import org.openrndr.extra.jumpfill.Threshold -import org.openrndr.ffmpeg.VideoPlayerFFMPEG - -fun main() = application { - configure { - width = 1280 - height = 720 - } - - program { - val blurFilter = ApproximateGaussianBlur() - val blurred = colorBuffer(width, height) - - val thresholdFilter = Threshold() - val thresholded = colorBuffer(width, height) - - val distanceField = DistanceField() - val distanceFieldBuffer = colorBuffer(width, height, type = ColorType.FLOAT32) - - val videoCopy = renderTarget(width, height) { - colorBuffer() - } - val videoPlayer = VideoPlayerFFMPEG.fromDevice(imageWidth = width, imageHeight = height) - videoPlayer.play() - - extend { - // -- copy videoplayer output - drawer.isolatedWithTarget(videoCopy) { - drawer.ortho(videoCopy) - videoPlayer.draw(drawer) - } - - // -- blur the input a bit, this produces less noisy bitmap images - blurFilter.sigma = 9.0 - blurFilter.window = 18 - blurFilter.apply(videoCopy.colorBuffer(0), blurred) - - // -- threshold the blurred image - thresholdFilter.threshold = 0.5 - thresholdFilter.apply(blurred, thresholded) - - distanceField.apply(thresholded, distanceFieldBuffer) - - drawer.isolated { - // -- use a shadestyle to visualize the distance field - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - float d = x_fill.r; - if (x_fill.g > 0.5) { - x_fill.rgb = vec3(cos(d) * 0.5 + 0.5); - } else { - x_fill.rgb = 0.25 * vec3(1.0 - (cos(d) * 0.5 + 0.5)); - } - """ - } - drawer.image(distanceFieldBuffer) - } - } - } -} -``` - -## Direction field example - -`directionFieldFromBitmap()` calculates directions to bitmap contours it stores -x-direction in red, y-direction in green, and the original bitmap in blue. - - -```kotlin -import org.openrndr.application -import org.openrndr.draw.* -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import org.openrndr.extra.jumpfill.DirectionalField -import org.openrndr.extra.jumpfill.Threshold -import org.openrndr.ffmpeg.VideoPlayerFFMPEG - -fun main() = application { - configure { - width = 1280 - height = 720 - } - - program { - val blurFilter = ApproximateGaussianBlur() - val blurred = colorBuffer(width, height) - - val thresholdFilter = Threshold() - val thresholded = colorBuffer(width, height) - - val directionField = DirectionalField() - val directionalFieldBuffer = colorBuffer(width, height, type = ColorType.FLOAT32) - - val videoPlayer = VideoPlayerFFMPEG.fromDevice(imageWidth = width, imageHeight = height) - videoPlayer.play() - - val videoCopy = renderTarget(width, height) { - colorBuffer() - } - - extend { - // -- copy videoplayer output - drawer.isolatedWithTarget(videoCopy) { - drawer.ortho(videoCopy) - videoPlayer.draw(drawer) - } - - // -- blur the input a bit, this produces less noisy bitmap images - blurFilter.sigma = 9.0 - blurFilter.window = 18 - blurFilter.apply(videoCopy.colorBuffer(0), blurred) - - // -- threshold the blurred image - thresholdFilter.threshold = 0.5 - thresholdFilter.apply(blurred, thresholded) - - directionField.apply(thresholded, directionalFieldBuffer) - - drawer.isolated { - // -- use a shadestyle to visualize the direction field - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - float a = atan(x_fill.r, x_fill.g); - if (x_fill.b > 0.5) { - x_fill.rgb = vec3(cos(a)*0.5+0.5, 1.0, sin(a)*0.5+0.5); - } else { - x_fill.rgb = vec3(cos(a)*0.5+0.5, 0.0, sin(a)*0.5+0.5); - } - """ - } - drawer.image(directionalFieldBuffer) - } - } - } -} -``` - -## Demos -### DemoDirectionField01 - -Shows how to use the [DirectionalField] filter. -Draws moving white shapes on black background, -then applies the DirectionalField filter which returns a [ColorBuffer] in which -the red and green components encode the direction to the closest black/white edge. - -Hold down a mouse button to see the raw animation. - -![DemoDirectionField01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoDirectionField01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDirectionField01.kt) - -### DemoDirectionField02 - -Create directional distance field and demonstrate signed distance - -![DemoDirectionField02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoDirectionField02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDirectionField02.kt) - -### DemoDistanceField01 - -Shows how to use the [DistanceField] filter. - -Draws moving white shapes on black background, -then applies the DistanceField filter which returns a [ColorBuffer] in which -the red component encodes the distance to the closest black/white edge. - -The value of the green component is negative when on the black background -and positive when inside white shapes. The sign is used in the [shadeStyle] to choose -between two colors. - -The inverse of the distance is used to obtain a non-linear brightness. - -Hold down a mouse button to see the raw animation. - -![DemoDistanceField01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoDistanceField01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoDistanceField01.kt) - -### DemoShapeSDF01 - - - -![DemoShapeSDF01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoShapeSDF01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoShapeSDF01.kt) - -### DemoShapeSDF02 - - - -![DemoShapeSDF02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoShapeSDF02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoShapeSDF02.kt) - -### DemoShapeSDF03 - - - -![DemoShapeSDF03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoShapeSDF03Kt.png) - -[source code](src/jvmDemo/kotlin/DemoShapeSDF03.kt) - -### DemoShapeSDF04 - - - -![DemoShapeSDF04Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoShapeSDF04Kt.png) - -[source code](src/jvmDemo/kotlin/DemoShapeSDF04.kt) - -### DemoShapeSDF05 - - - -![DemoShapeSDF05Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoShapeSDF05Kt.png) - -[source code](src/jvmDemo/kotlin/DemoShapeSDF05.kt) - -### DemoSkeleton01 - - - -![DemoSkeleton01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoSkeleton01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoSkeleton01.kt) - -### DemoStraightSkeleton01 - - - -![DemoStraightSkeleton01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoStraightSkeleton01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoStraightSkeleton01.kt) - -### DemoVoronoi01 - - - -![DemoVoronoi01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoVoronoi01Kt.png) - -[source code](src/jvmDemo/kotlin/DemoVoronoi01.kt) - -### DemoVoronoi02 - - - -![DemoVoronoi02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoVoronoi02Kt.png) - -[source code](src/jvmDemo/kotlin/DemoVoronoi02.kt) - -### DemoVoronoi03 - - - -![DemoVoronoi03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jumpflood/images/DemoVoronoi03Kt.png) - -[source code](src/jvmDemo/kotlin/DemoVoronoi03.kt) diff --git a/orx-jumpflood/build.gradle.kts b/orx-jumpflood/build.gradle.kts deleted file mode 100644 index eb6c9fc1..00000000 --- a/orx-jumpflood/build.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-multiplatform") -} - -val embedShaders = tasks.register("embedShaders") { - inputDir.set(file("$projectDir/src/shaders/glsl")) - outputDir.set(layout.buildDirectory.dir("generated/shaderKotlin")) - defaultPackage.set("org.openrndr.extra.jumpflood") - defaultVisibility.set("internal") - namePrefix.set("jf_") -}.get() - -kotlin { - kotlin.sourceSets.getByName("commonMain").kotlin.srcDir(embedShaders.outputDir) - sourceSets { - @Suppress("UNUSED_VARIABLE") - val commonMain by getting { - dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-fx")) - implementation(openrndr.application.core) - implementation(openrndr.draw) - implementation(openrndr.filter) - implementation(sharedLibs.kotlin.reflect) - } - } - - @Suppress("UNUSED_VARIABLE") - val jvmDemo by getting { - dependencies { - implementation(project(":orx-color")) - implementation(project(":orx-fx")) - implementation(project(":orx-noise")) - implementation(project(":orx-jumpflood")) - implementation(project(":orx-compositor")) - implementation(project(":orx-jvm:orx-gui")) - implementation(project(":orx-composition")) - implementation(project(":orx-svg")) - } - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/ClusteredField.kt b/orx-jumpflood/src/commonMain/kotlin/ClusteredField.kt deleted file mode 100644 index 98766d86..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/ClusteredField.kt +++ /dev/null @@ -1,127 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill - -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.IntRectangle -import org.openrndr.shape.Rectangle -import kotlin.math.ceil -import kotlin.math.log2 -import kotlin.math.max -import kotlin.math.pow - -@Description("Clustered field") -class ClusteredField(decodeMode: DecodeMode = DecodeMode.DIRECTION, - private val outputDistanceToContours: Boolean = true) : Filter1to1(null) { - @DoubleParameter("threshold", 0.0, 1.0) - var threshold = 0.5 - - @DoubleParameter("distance scale", 0.0, 1.0) - var distanceScale = 1.0 - - @BooleanParameter("normalized distance") - var normalizedDistance = false - - @BooleanParameter("unit direction") - var unitDirection = false - - @BooleanParameter("flip v direction") - var flipV = true - - private val encodeFilter = EncodePoints() - private var encoded: ColorBuffer? = null - private val contourFilter = IdContourPoints() - private var contoured: ColorBuffer? = null - private var jumpFlooder: JumpFlooder? = null - - private val decodeFilter = PixelDirection(decodeMode) - - private var fit: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - val advisedWidth = 2.0.pow(ceil(log2(source[0].effectiveWidth.toDouble()))).toInt() - val advisedHeight = 2.0.pow(ceil(log2(source[0].effectiveHeight.toDouble()))).toInt() - val advisedSize = max(advisedWidth, advisedHeight) - - fit?.let { - if (it.effectiveWidth != advisedSize || it.effectiveHeight != advisedSize) { - it.destroy() - fit = null - encoded?.destroy() - encoded = null - contoured?.destroy() - contoured = null - jumpFlooder?.destroy() - jumpFlooder = null - } - } - - if (fit == null) { - fit = colorBuffer(advisedSize, advisedSize, type=ColorType.FLOAT32) - } - - source[0].copyTo( - fit!!, - sourceRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle( - 0, - advisedSize - source[0].effectiveHeight, - source[0].effectiveWidth, - source[0].effectiveHeight - ) - ) - - if (encoded == null) { - encoded = colorBuffer(advisedSize, advisedSize, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - } - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(advisedSize, advisedSize, encodePoints = Passthrough()) - } - - if (outputDistanceToContours && contoured == null) { - contoured = colorBuffer(advisedSize, advisedSize, type = ColorType.FLOAT32) - } - - encodeFilter.apply(fit!!, encoded!!) - var result = jumpFlooder!!.jumpFlood(encoded!!) - - if (outputDistanceToContours) { - contourFilter.apply(result, contoured!!) - result = jumpFlooder!!.jumpFlood(contoured!!) - } - - decodeFilter.outputIds = true - decodeFilter.originalSize = Vector2(source[0].width.toDouble(), source[0].height.toDouble()) - decodeFilter.distanceScale = distanceScale - decodeFilter.normalizedDistance = normalizedDistance - decodeFilter.unitDirection = unitDirection - decodeFilter.flipV = flipV - decodeFilter.apply(arrayOf(result, encoded!!), arrayOf(result), clip) - - result.copyTo( - target[0], - sourceRectangle = IntRectangle( - 0, - advisedSize - source[0].effectiveHeight, - source[0].effectiveWidth, - source[0].effectiveHeight - ), - targetRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight) - ) - } - - override fun destroy() { - encodeFilter.destroy() - contourFilter.destroy() - fit?.destroy() - encoded?.destroy() - contoured?.destroy() - jumpFlooder?.destroy() - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/DirectionalField.kt b/orx-jumpflood/src/commonMain/kotlin/DirectionalField.kt deleted file mode 100644 index cc71d8ad..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/DirectionalField.kt +++ /dev/null @@ -1,143 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill - -import org.openrndr.draw.* -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.IntRectangle -import org.openrndr.shape.Rectangle -import kotlin.math.ceil -import kotlin.math.log2 -import kotlin.math.max -import kotlin.math.pow - - -/** - * DirectionalField is a filter that generates a directional field representation - * of an input image, utilizing operations such as thresholding, contour detection, - * jump flooding, and direction decoding. The generated output encodes directional - * and distance information from the contours of the input. - * - * The filter supports a variety of configurable properties such as thresholds, - * scaling, and different modes for direction and magnitude representation. - * - * This class extends Filter1to1, processing one input `ColorBuffer` and producing - * one output `ColorBuffer`. - * - * Parameters: - * - `threshold`: The threshold value used during the binary segmentation of the input image. - * - `distanceScale`: The scale factor applied to the distance values encoded in the output. - * - `normalizedDistance`: Whether to normalize the distance values in the output. - * - `unitDirection`: Whether to represent gradient directions as unit vectors. - * - `signedMagnitude`: Whether to encode magnitude with signed values. - * - `flipV`: Whether to flip the vertical component of the direction vectors in the output. - * - * Lifecycle: - * - Resources such as intermediate `ColorBuffer` instances are created dynamically - * based on the dimensions of the input image. These resources are cleaned up - * in the `destroy` method to prevent memory leaks. - * - * Responsibilities: - * - Threshold the input to create a binary image. - * - Detect contours from the thresholded image. - * - Generate a jump flood field to calculate distance and direction information. - * - Decode directional data into the final output. - * - */ -@Description("Directional field") -class DirectionalField : Filter1to1(null) { - @DoubleParameter("threshold", 0.0, 1.0) - var threshold = 0.5 - - @DoubleParameter("distance scale", 0.0, 1.0) - var distanceScale = 1.0 - - @BooleanParameter("normalized distance") - var normalizedDistance = false - - @BooleanParameter("unit direction") - var unitDirection = false - - @BooleanParameter("signed magnitude") - var signedMagnitude = false - - - @BooleanParameter("flip v direction") - var flipV = true - - private val thresholdFilter = Threshold() - private var thresholded: ColorBuffer? = null - private val contourFilter = ContourPoints() - private var contoured: ColorBuffer? = null - private var jumpFlooder: JumpFlooder? = null - - private val decodeFilter = PixelDirection() - - private var fit: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - - val advisedWidth = 2.0.pow(ceil(log2(source[0].effectiveWidth.toDouble()))).toInt() - val advisedHeight = 2.0.pow(ceil(log2(source[0].effectiveHeight.toDouble()))).toInt() - val advisedSize = max(advisedWidth, advisedHeight) - - fit?.let { - if (it.effectiveWidth != advisedSize || it.effectiveHeight != advisedSize) { - it.destroy() - fit = null - thresholded?.destroy() - thresholded = null - contoured?.destroy() - contoured = null - jumpFlooder?.destroy() - jumpFlooder = null - } - } - - if (fit == null) { - fit = colorBuffer(advisedSize, advisedSize) - } - - source[0].copyTo(fit!!, - sourceRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, advisedSize-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight) - ) - - if (thresholded == null) { - thresholded = colorBuffer(advisedSize, advisedSize, format = ColorFormat.R) - } - if (contoured == null) { - contoured = colorBuffer(advisedSize, advisedSize, format = ColorFormat.R) - } - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(advisedSize, advisedSize) - } - thresholdFilter.threshold = threshold - thresholdFilter.apply(fit!!, thresholded!!) - contourFilter.apply(thresholded!!, contoured!!) - val result = jumpFlooder!!.jumpFlood(contoured!!) - decodeFilter.originalSize = Vector2(source[0].width.toDouble(), source[0].height.toDouble()) - decodeFilter.distanceScale = distanceScale - decodeFilter.normalizedDistance = normalizedDistance - decodeFilter.unitDirection = unitDirection - decodeFilter.signedMagnitude = signedMagnitude - decodeFilter.flipV = flipV - decodeFilter.apply(arrayOf(result, thresholded!!), arrayOf(result)) - result.copyTo(target[0], - sourceRectangle = IntRectangle(0, advisedSize-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight)) - } - - override fun destroy() { - thresholdFilter.destroy() - contourFilter.destroy() - fit?.destroy() - thresholded?.destroy() - contoured?.destroy() - jumpFlooder?.destroy() - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/DistanceField.kt b/orx-jumpflood/src/commonMain/kotlin/DistanceField.kt deleted file mode 100644 index d4a70afe..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/DistanceField.kt +++ /dev/null @@ -1,107 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill - -import org.openrndr.draw.* -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.IntRectangle -import org.openrndr.shape.Rectangle -import kotlin.math.ceil -import kotlin.math.log2 -import kotlin.math.max -import kotlin.math.pow - -/** - * The `DistanceField` class provides an implementation for computing a distance field representation of an image. - * The distance field calculation is achieved via mechanisms like thresholding, contour tracing, and jump flooding. - * This class can operate on a single source image and produce a single target image. - * - * The distance field process involves: - * - Applying a threshold filter to the source image to create a binary image representation. - * - Computing the contours of the binary representation. - * - Using a jump flooding algorithm to compute distances from each pixel to the nearest contour point. - * - Optionally utilizing signed distances by distinguishing between pixels inside and outside the contour. - * - * The class uses several configurable parameters and intermediate processing steps: - * - `threshold`: Controls the binary threshold level used in the threshold filter. - * - `distanceScale`: Scales the computed distance field values. - * - `signedDistance`: Indicates whether the distance field should contain signed or unsigned distances. - * - * Internal optimizations include resizing the input to power-of-two dimensions for efficient processing, and reusing - * intermediate buffers to reduce memory allocation overhead. - */ -@Description("Distance field") -class DistanceField : Filter1to1(null) { - @DoubleParameter("threshold", 0.0, 1.0) - var threshold = 0.5 - - @DoubleParameter("distance scale", 0.0, 1.0) - var distanceScale = 1.0 - - private val thresholdFilter = Threshold() - private var thresholded: ColorBuffer? = null - private val contourFilter = ContourPoints() - private var contoured: ColorBuffer? = null - private var jumpFlooder: JumpFlooder? = null - - private val decodeFilter = PixelDistance() - - private var fit: ColorBuffer? = null - - @BooleanParameter("signed distance") - var signedDistance = true - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - val advisedWidth = 2.0.pow(ceil(log2(source[0].effectiveWidth.toDouble()))).toInt() - val advisedHeight = 2.0.pow(ceil(log2(source[0].effectiveHeight.toDouble()))).toInt() - val advisedSize = max(advisedWidth, advisedHeight) - - fit?.let { - if (it.effectiveWidth != advisedSize || it.effectiveHeight != advisedSize) { - it.destroy() - fit = null - thresholded?.destroy() - thresholded = null - contoured?.destroy() - contoured = null - jumpFlooder?.destroy() - jumpFlooder = null - } - } - - if (fit == null) { - fit = colorBuffer(advisedSize, advisedSize) - } - - source[0].copyTo(fit!!, - sourceRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, advisedSize-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight) - ) - - if (thresholded == null) { - thresholded = colorBuffer(advisedSize, advisedSize, format = ColorFormat.R) - } - if (contoured == null) { - contoured = colorBuffer(advisedSize, advisedSize, format = ColorFormat.R) - } - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(advisedSize, advisedSize) - } - - thresholdFilter.threshold = threshold - thresholdFilter.apply(fit!!, thresholded!!) - contourFilter.apply(thresholded!!, contoured!!) - val result = jumpFlooder!!.jumpFlood(contoured!!) - decodeFilter.originalSize = Vector2(source[0].width.toDouble(), source[0].height.toDouble()) - decodeFilter.distanceScale = distanceScale - decodeFilter.apply(arrayOf(result, thresholded!!), arrayOf(result)) - result.copyTo(target[0], - sourceRectangle = IntRectangle(0, advisedSize-source[0].effectiveHeight, source[0].effectiveWidth, source[0].effectiveHeight), - targetRectangle = IntRectangle(0, 0, source[0].effectiveWidth, source[0].effectiveHeight) - ) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/JumpFlood.kt b/orx-jumpflood/src/commonMain/kotlin/JumpFlood.kt deleted file mode 100644 index 8a94bd1c..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/JumpFlood.kt +++ /dev/null @@ -1,190 +0,0 @@ -package org.openrndr.extra.jumpfill - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.extra.jumpflood.* - -import org.openrndr.math.Vector2 -import kotlin.math.* - -class EncodePoints : Filter(filterShaderFromCode(jf_encode_points, "encode-points")) - -class EncodeSubpixel : Filter(filterShaderFromCode(jf_encode_subpixel, "encode-subpixel")) { - var threshold by parameters - - init { - threshold = 0.5 - } -} - -class JumpFlood : Filter(filterShaderFromCode(jf_jumpflood, "jumpflood")) { - var maxSteps: Int by parameters - var step: Int by parameters -} - -enum class DecodeMode(val shaderDefine: String) { - DISTANCE("OUTPUT_DISTANCE"), - DIRECTION("OUTPUT_DIRECTION") -} - -class PixelDirection(val decodeMode: DecodeMode = DecodeMode.DIRECTION) : - Filter( - filterShaderFromCode( - "#define ${decodeMode.shaderDefine}\n $jf_pixel_direction", - "pixel-direction") - ) { - var distanceScale: Double by parameters - var originalSize: Vector2 by parameters - var normalizedDistance: Boolean by parameters - var unitDirection: Boolean by parameters - var signedMagnitude: Boolean by parameters - var flipV: Boolean by parameters - var outputIds: Boolean by parameters - - - init { - distanceScale = 1.0 - originalSize = Vector2(512.0, 512.0) - normalizedDistance = false - unitDirection = false - flipV = true - outputIds = false - signedMagnitude = false - } -} - -class PixelDistance : Filter(filterShaderFromCode(jf_pixel_distance, "pixel-distance")) { - var distanceScale: Double by parameters - var originalSize: Vector2 by parameters - var signedBit: Boolean by parameters - var signedDistance: Boolean by parameters - - init { - distanceScale = 1.0 - originalSize = Vector2(512.0, 512.0) - signedBit = true - signedDistance = false - } -} - -class ContourPoints : Filter(filterShaderFromCode(jf_contour_points, "contour-points")) - -class IdContourPoints : Filter(filterShaderFromCode(jf_id_contours, "id-contour-points")) - - -class Threshold : Filter(filterShaderFromCode(jf_threshold, "threshold")) { - var threshold: Double by parameters - - init { - threshold = 0.5 - } -} - -class AlphaThreshold : Filter(filterShaderFromCode(jf_alpha_threshold, "alpha-threshold")) { - var threshold: Double by parameters - - init { - threshold = 0.5 - } -} - - -private val encodePoints by lazy { persistent { EncodePoints() } } -private val pixelDistance by lazy { persistent { PixelDistance() } } -private val pixelDirection by lazy { persistent { PixelDirection() } } -private val contourPoints by lazy { persistent { ContourPoints() } } -private val threshold by lazy { persistent { Threshold() } } -private val passthrough by lazy { persistent { Passthrough() } } - -class JumpFlooder( - val width: Int, val height: Int, format: ColorFormat = ColorFormat.RGBa, type: ColorType = ColorType.FLOAT32, - val encodePoints: Filter = EncodePoints() -) { - - private val dimension = max(width, height) - private val exp = ceil(log2(dimension.toDouble())).toInt() - val squareDim = 2.0.pow(exp.toDouble()).toInt() - val jumpFlood = JumpFlood() - - private val coordinates = - listOf( - colorBuffer(squareDim, squareDim, format = format, type = type), - colorBuffer(squareDim, squareDim, format = format, type = type) - ) - - - val final = colorBuffer(squareDim, squareDim, format = format, type = type) - - private val square = colorBuffer(squareDim, squareDim, format = ColorFormat.RGBa, type = type).apply { - fill(ColorRGBa.BLACK.opacify(0.0)) - } - - - fun jumpFlood(input: ColorBuffer): ColorBuffer { - if (input.width != width || input.height != height) { - throw IllegalArgumentException("dimensions mismatch") - } - - input.copyTo(square) - encodePoints.apply(square, coordinates[0]) - - jumpFlood.maxSteps = exp - for (i in 0 until exp) { - jumpFlood.step = i - jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) - } - - coordinates[exp % 2].copyTo(final) - - return final - } - - fun destroy() { - coordinates.forEach { it.destroy() } - square.destroy() - final.destroy() - } -} - -private fun encodeDecodeBitmap( - preprocess: Filter, decoder: Filter, bitmap: ColorBuffer, - jumpFlooder: JumpFlooder? = null, - result: ColorBuffer? = null -): ColorBuffer { - val _jumpFlooder = jumpFlooder ?: JumpFlooder(bitmap.width, bitmap.height) - val _result = result ?: colorBuffer(bitmap.width, bitmap.height, type = ColorType.FLOAT16) - - preprocess.apply(bitmap, _result) - - val encoded = _jumpFlooder.jumpFlood(_result) - - decoder.parameters["originalSize"] = Vector2(_jumpFlooder.squareDim.toDouble(), _jumpFlooder.squareDim.toDouble()) - decoder.apply(arrayOf(encoded, bitmap), _result) - if (jumpFlooder == null) { - _jumpFlooder.destroy() - } - return _result -} - -/** - * Creates a color buffer containing the coordinates of the nearest centroids - * @param bitmap a ColorBuffer with centroids in red (> 0) - */ -fun centroidsFromBitmap( - bitmap: ColorBuffer, - jumpFlooder: JumpFlooder? = null, - result: ColorBuffer? = null -): ColorBuffer = encodeDecodeBitmap(passthrough, passthrough, bitmap, jumpFlooder, result) - -fun distanceFieldFromBitmap( - bitmap: ColorBuffer, - jumpFlooder: JumpFlooder? = null, - result: ColorBuffer? = null -): ColorBuffer = encodeDecodeBitmap(contourPoints, pixelDistance, bitmap, jumpFlooder, result) - -fun directionFieldFromBitmap( - bitmap: ColorBuffer, - jumpFlooder: JumpFlooder? = null, - result: ColorBuffer? = null -): ColorBuffer = encodeDecodeBitmap(contourPoints, pixelDirection, bitmap, jumpFlooder, result) \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/draw/SDFDraw.kt b/orx-jumpflood/src/commonMain/kotlin/draw/SDFDraw.kt deleted file mode 100644 index 4cc867ff..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/draw/SDFDraw.kt +++ /dev/null @@ -1,38 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.draw - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Filter -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.jumpflood.jf_sdf_stroke_fill -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter - -@Description("SDF stroke and fill") -class SDFStrokeFill : Filter(filterShaderFromCode(jf_sdf_stroke_fill, "sdf-stroke-fill")) { - @DoubleParameter("stroke weight", 0.0, 20.0, order = 0) - var strokeWeight: Double by parameters - - @DoubleParameter("stroke feather", 0.0, 20.0, order = 0) - var strokeFeather: Double by parameters - - @ColorParameter("stroke color", order = 1) - var strokeColor: ColorRGBa by parameters - - @DoubleParameter("fill feather", 0.0, 20.0, order = 0) - var fillFeather: Double by parameters - - - @ColorParameter("fill color", order = 2) - var fillColor: ColorRGBa by parameters - init { - fillFeather = 1.0 - strokeFeather = 1.0 - strokeWeight = 1.0 - strokeColor = ColorRGBa.BLACK - fillColor = ColorRGBa.WHITE - - } -} diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/InnerBevel.kt b/orx-jumpflood/src/commonMain/kotlin/fx/InnerBevel.kt deleted file mode 100644 index 9433dc61..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/InnerBevel.kt +++ /dev/null @@ -1,67 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.EncodeSubpixel -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDirection -import org.openrndr.extra.jumpflood.jf_inner_bevel -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class InnerBevelFilter : Filter(filterShaderFromCode(jf_inner_bevel, "inner-bevel")) { - var angle: Double by parameters - var width: Double by parameters - - var noise:Double by parameters - init { - angle = 0.0 - width = 5.0 - noise = 0.0 - } -} - -@Description("Inner bevel") -class InnerBevel : Filter1to1(null) { - @DoubleParameter("threshold", 0.0, 1.0) - var threshold = 0.01 - - @DoubleParameter("distance scale", 0.0, 1.0) - var distanceScale = 1.0 - - @DoubleParameter("angle", -180.0, 180.0) - var angle = 0.0 - - @DoubleParameter("width", 0.0, 50.0) - var width = 5.0 - - @DoubleParameter("noise", 0.0, 1.0) - var noise = 0.1 - - private var jumpFlooder: JumpFlooder? = null - private val decodeFilter = PixelDirection() - private val bevelFilter = InnerBevelFilter() - - private var distance: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height, encodePoints = EncodeSubpixel()) - } - if (distance == null) { - distance = colorBuffer(target[0].width, target[0].height, type = ColorType.FLOAT32) - } - val result = jumpFlooder!!.jumpFlood(source[0]) - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = distanceScale - decodeFilter.apply(result, result) - result.copyTo(distance!!) - bevelFilter.angle = angle - bevelFilter.width = width - bevelFilter.noise = noise - bevelFilter.apply(arrayOf(source[0], distance!!), target[0], clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/InnerGlow.kt b/orx-jumpflood/src/commonMain/kotlin/fx/InnerGlow.kt deleted file mode 100644 index 9144c49d..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/InnerGlow.kt +++ /dev/null @@ -1,80 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.EncodeSubpixel -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDirection -import org.openrndr.extra.jumpflood.jf_inner_glow -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class InnerGlowFilter : Filter(filterShaderFromCode(jf_inner_glow, "inner-glow")) { - var angle: Double by parameters - var width: Double by parameters - - var noise: Double by parameters - var color: ColorRGBa by parameters - - var shape: Double by parameters - var imageOpacity: Double by parameters - - init { - angle = 0.0 - width = 5.0 - noise = 0.0 - shape = 1.0 - imageOpacity = 1.0 - } -} - -@Description("Inner glow") -class InnerGlow : Filter1to1(null) { - @DoubleParameter("width", 0.0, 50.0) - var width = 5.0 - - @DoubleParameter("noise", 0.0, 1.0) - var noise = 0.1 - - @DoubleParameter("shape", 0.0, 10.0) - var shape = 1.0 - - @DoubleParameter("opacity", 0.0, 1.0) - var opacity = 1.0 - - @DoubleParameter("image opacity", 0.0, 1.0) - var imageOpacity = 1.0 - - @ColorParameter("color") - var color = ColorRGBa.WHITE - - private var jumpFlooder: JumpFlooder? = null - private val decodeFilter = PixelDirection() - private val glowFilter = InnerGlowFilter() - private var distance: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height, encodePoints = EncodeSubpixel()) - } - if (distance == null) { - distance = colorBuffer(target[0].width, target[0].height, type = ColorType.FLOAT32) - } - val result = jumpFlooder!!.jumpFlood(source[0]) - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = 1.0 - decodeFilter.apply(result, result) - result.copyTo(distance!!) - glowFilter.color = color.opacify(opacity) - glowFilter.width = width - glowFilter.noise = noise - glowFilter.shape = shape - glowFilter.imageOpacity = imageOpacity - glowFilter.apply(arrayOf(source[0], distance!!), target[0], clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/Inpaint.kt b/orx-jumpflood/src/commonMain/kotlin/fx/Inpaint.kt deleted file mode 100644 index a7c40cc1..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/Inpaint.kt +++ /dev/null @@ -1,74 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.EncodeSubpixel -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDirection -import org.openrndr.extra.jumpflood.jf_inpaint -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class InpaintFilter : Filter(filterShaderFromCode(jf_inpaint, "inpaint")) { - - var noise: Double by parameters - var imageOpacity: Double by parameters - var opacity: Double by parameters - var shape: Double by parameters - var width: Double by parameters - - init { - noise = 0.0 - imageOpacity = 1.0 - opacity = 1.0 - shape = 0.0 - width = 0.5 - } -} - -@Description("Inpaint") -class Inpaint : Filter1to1(null) { - @DoubleParameter("width", 0.0, 1.0) - var width = 0.5 - - @DoubleParameter("noise", 0.0, 1.0) - var noise = 0.1 - - @DoubleParameter("opacity", 0.0, 1.0) - var opacity = 1.0 - - @DoubleParameter("image opacity", 0.0, 1.0) - var imageOpacity = 1.0 - - @DoubleParameter("shape", 0.0, 10.0) - var shape = 0.0 - - private var jumpFlooder: JumpFlooder? = null - private val decodeFilter = PixelDirection() - private val inpaintFilter = InpaintFilter() - - private var distance: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height, encodePoints = EncodeSubpixel()) - } - if (distance == null) { - distance = colorBuffer(target[0].width, target[0].height, type = ColorType.FLOAT32) - } - val result = jumpFlooder!!.jumpFlood(source[0]) - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = 1.0 - decodeFilter.apply(result, result) - result.copyTo(distance!!) - inpaintFilter.noise = noise - inpaintFilter.imageOpacity = imageOpacity - inpaintFilter.opacity = opacity - inpaintFilter.shape = shape - inpaintFilter.width = width - inpaintFilter.apply(arrayOf(source[0], distance!!), target[0], clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/OuterGlow.kt b/orx-jumpflood/src/commonMain/kotlin/fx/OuterGlow.kt deleted file mode 100644 index 6804a1cb..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/OuterGlow.kt +++ /dev/null @@ -1,81 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.EncodeSubpixel -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDirection -import org.openrndr.extra.jumpflood.jf_outer_glow -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class OuterGlowFilter : Filter(filterShaderFromCode(jf_outer_glow, "outer-glow")) { - var angle: Double by parameters - var width: Double by parameters - - var noise: Double by parameters - var color: ColorRGBa by parameters - - var shape: Double by parameters - var imageOpacity: Double by parameters - - init { - angle = 0.0 - width = 5.0 - noise = 0.0 - shape = 1.0 - imageOpacity = 1.0 - } -} - -@Description("Outer glow") -class OuterGlow : Filter1to1(null) { - @DoubleParameter("width", 0.0, 50.0) - var width = 5.0 - - @DoubleParameter("noise", 0.0, 1.0) - var noise = 0.1 - - @DoubleParameter("shape", 0.0, 10.0) - var shape = 1.0 - - @DoubleParameter("opacity", 0.0, 1.0) - var opacity = 1.0 - - @DoubleParameter("image opacity", 0.0, 1.0) - var imageOpacity = 1.0 - - @ColorParameter("color") - var color = ColorRGBa.WHITE - - private var jumpFlooder: JumpFlooder? = null - private val decodeFilter = PixelDirection() - private val glowFilter = OuterGlowFilter() - - private var distance: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height, encodePoints = EncodeSubpixel()) - } - if (distance == null) { - distance = colorBuffer(target[0].width, target[0].height, type = ColorType.FLOAT32) - } - val result = jumpFlooder!!.jumpFlood(source[0]) - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = 1.0 - decodeFilter.apply(result, result) - result.copyTo(distance!!) - glowFilter.color = color.opacify(opacity) - glowFilter.width = width - glowFilter.noise = noise - glowFilter.shape = shape - glowFilter.imageOpacity = imageOpacity - glowFilter.apply(arrayOf(source[0], distance!!), target[0], clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/Skeleton.kt b/orx-jumpflood/src/commonMain/kotlin/fx/Skeleton.kt deleted file mode 100644 index a6385c21..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/Skeleton.kt +++ /dev/null @@ -1,90 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.ContourPoints -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDistance -import org.openrndr.extra.jumpfill.Threshold -import org.openrndr.extra.jumpflood.jf_skeleton -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle - -private class SkeletonFilter : Filter(filterShaderFromCode(jf_skeleton, "skeleton")) { - var skeletonColor: ColorRGBa by parameters - var foregroundColor: ColorRGBa by parameters - var backgroundColor: ColorRGBa by parameters - - init { - skeletonColor = ColorRGBa.WHITE - foregroundColor = ColorRGBa.GRAY - backgroundColor = ColorRGBa.TRANSPARENT - } -} - -@Description("Skeleton") -class Skeleton : Filter(null) { - @DoubleParameter("threshold", 0.0, 1.0, order = 0) - var threshold = 0.5 - - @DoubleParameter("distance scale", 0.0, 1.0, order = 1) - var distanceScale = 1.0 - - @ColorParameter("skeleton color", order = 2) - var skeletonColor = ColorRGBa.WHITE - - @ColorParameter("foreground color", order = 3) - var foregroundColor = ColorRGBa.GRAY - - @ColorParameter("background color", order = 4) - var backgroundColor = ColorRGBa.TRANSPARENT - - private val thresholdFilter = Threshold() - private var thresholded: ColorBuffer? = null - private val contourFilter = ContourPoints() - private var contoured: ColorBuffer? = null - private var copied: ColorBuffer? = null - private var jumpFlooder: JumpFlooder? = null - - private val decodeFilter = PixelDistance() - private val skeletonFilter = SkeletonFilter() - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - - if (thresholded == null) { - thresholded = colorBuffer(target[0].width, target[0].height, format = ColorFormat.R) - } - if (contoured == null) { - contoured = colorBuffer(target[0].width, target[0].height, format = ColorFormat.R) - } - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height) - } - if (copied == null) { - copied = target[0].createEquivalent(type = ColorType.FLOAT32) - } - - thresholdFilter.threshold = threshold - thresholdFilter.apply(source[0], thresholded!!) - contourFilter.apply(thresholded!!, contoured!!) - val result = jumpFlooder!!.jumpFlood(contoured!!) - - decodeFilter.signedDistance = true - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = distanceScale - decodeFilter.signedBit = false - decodeFilter.apply(arrayOf(result, thresholded!!), arrayOf(result)) - - result.copyTo(copied!!) - skeletonFilter.skeletonColor = skeletonColor - skeletonFilter.backgroundColor = backgroundColor - skeletonFilter.foregroundColor = foregroundColor - skeletonFilter.apply(copied!!, target[0]) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/fx/StraightSkeleton.kt b/orx-jumpflood/src/commonMain/kotlin/fx/StraightSkeleton.kt deleted file mode 100644 index 0ba25cc9..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/fx/StraightSkeleton.kt +++ /dev/null @@ -1,92 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.fx - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.ContourPoints -import org.openrndr.extra.jumpfill.JumpFlooder -import org.openrndr.extra.jumpfill.PixelDirection -import org.openrndr.extra.jumpfill.Threshold -import org.openrndr.extra.jumpflood.jf_straight_skeleton -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle -import kotlin.math.sqrt - -private class StraightSkeletonFilter : Filter(filterShaderFromCode(jf_straight_skeleton, "straight-skeleton")) { - var angleThreshold: Double by parameters - var skeletonColor: ColorRGBa by parameters - var foregroundColor: ColorRGBa by parameters - var backgroundColor: ColorRGBa by parameters - - init { - skeletonColor = ColorRGBa.WHITE - foregroundColor = ColorRGBa.GRAY - backgroundColor = ColorRGBa.TRANSPARENT - angleThreshold = sqrt(2.0) / 2.0; - } -} - -@Description("Skeleton") -class StraightSkeleton : Filter(null) { - @DoubleParameter("threshold", 0.0, 1.0, order = 0) - var threshold = 0.5 - - @DoubleParameter("distance scale", 0.0, 1.0, order = 1) - var distanceScale = 1.0 - - @DoubleParameter("angle threshold", 0.0, 1.0, order = 2) - var angleThreshold = sqrt(2.0) / 2.0 - - @ColorParameter("skeleton color", order = 3) - var skeletonColor = ColorRGBa.WHITE - - @ColorParameter("foreground color", order = 4) - var foregroundColor = ColorRGBa.GRAY - - @ColorParameter("background color", order = 5) - var backgroundColor = ColorRGBa.TRANSPARENT - - private val thresholdFilter = Threshold() - private var thresholded: ColorBuffer? = null - private val contourFilter = ContourPoints() - private var contoured: ColorBuffer? = null - private var copied: ColorBuffer? = null - private var jumpFlooder: JumpFlooder? = null - - private val decodeFilter = PixelDirection() - private val skeletonFilter = StraightSkeletonFilter() - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - if (thresholded == null) { - thresholded = colorBuffer(target[0].width, target[0].height, format = ColorFormat.R) - } - if (contoured == null) { - contoured = colorBuffer(target[0].width, target[0].height, format = ColorFormat.R) - } - if (jumpFlooder == null) { - jumpFlooder = JumpFlooder(target[0].width, target[0].height) - } - if (copied == null) { - copied = target[0].createEquivalent(type = ColorType.FLOAT32) - } - - thresholdFilter.threshold = threshold - thresholdFilter.apply(source[0], thresholded!!) - contourFilter.apply(thresholded!!, contoured!!) - val result = jumpFlooder!!.jumpFlood(contoured!!) - decodeFilter.originalSize = Vector2(target[0].width * 1.0, target[0].height * 1.0) - decodeFilter.distanceScale = distanceScale - decodeFilter.apply(arrayOf(result, thresholded!!), arrayOf(result)) - result.copyTo(copied!!) - - skeletonFilter.angleThreshold = angleThreshold - skeletonFilter.skeletonColor = skeletonColor - skeletonFilter.backgroundColor = backgroundColor - skeletonFilter.foregroundColor = foregroundColor - skeletonFilter.apply(copied!!, target[0], clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/commonMain/kotlin/ops/SDFOps.kt b/orx-jumpflood/src/commonMain/kotlin/ops/SDFOps.kt deleted file mode 100644 index 4d3f310f..00000000 --- a/orx-jumpflood/src/commonMain/kotlin/ops/SDFOps.kt +++ /dev/null @@ -1,104 +0,0 @@ -@file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") - -package org.openrndr.extra.jumpfill.ops - -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.ColorType -import org.openrndr.draw.Filter -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.jumpflood.* -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.shape.Rectangle - -class SDFSmoothUnion : Filter(filterShaderFromCode(jf_sdf_smooth_union, "sdf-smooth-union")) { - var radius: Double by parameters - - init { - radius = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} - -class SDFSmoothIntersection : Filter(filterShaderFromCode(jf_sdf_smooth_intersection, "sdf-smooth-intersection")) { - var radius: Double by parameters - - init { - radius = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} -@Description("SDF smooth difference") -class SDFSmoothDifference : Filter(filterShaderFromCode(jf_sdf_smooth_difference, "sdf-smooth-differecnce")) { - @DoubleParameter("smooth radius", 0.0, 200.0, order = 0) - var radius: Double by parameters - - init { - radius = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} - -class SDFRound : Filter(filterShaderFromCode(jf_sdf_round, "sdf-round")) { - @DoubleParameter("rounding radius", 0.0, 200.0, order = 0) - var radius: Double by parameters - - init { - radius = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} - -class SDFOnion : Filter(filterShaderFromCode(jf_sdf_onion, "sdf-onion")) { - var radius: Double by parameters - - init { - radius = 0.0 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} - -class SDFBlend : Filter(filterShaderFromCode(jf_sdf_blend, "sdf-blend")) { - var factor: Double by parameters - - init { - factor = 0.5 - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - super.apply(source, target, clip) - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField01.kt deleted file mode 100644 index 296f1715..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField01.kt +++ /dev/null @@ -1,82 +0,0 @@ -import org.openrndr.MouseTracker -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.DirectionalField -import org.openrndr.extra.noise.simplex -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.shape.Rectangle - -/** - * Shows how to use the [DirectionalField] filter. - * Draws moving white shapes on black background, - * then applies the DirectionalField filter which returns a [ColorBuffer] in which - * the red and green components encode the direction to the closest black/white edge. - * - * Hold down a mouse button to see the raw animation. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val rt = renderTarget(width, height) { colorBuffer() } - val directionalField = DirectionalField().also { - it.distanceScale = 0.004 - } - - // Needs to be FLOAT32 so we can have negative values - val result = colorBuffer(width, height, type = ColorType.FLOAT32) - val shader = shadeStyle { - fragmentTransform = """ - x_fill.rgb = vec3(x_fill.rg + 0.5, x_fill.b); - - // interesting when distanceScale = 1.0 - //x_fill.rgb = vec3(1.0 / (x_fill.r + x_fill.g)); - """ - } - val mouseTracker = MouseTracker(mouse) - - extend { - // Draw moving white shapes on a black background - drawer.isolatedWithTarget(rt) { - clear(ColorRGBa.BLACK) - stroke = null - fill = ColorRGBa.WHITE - repeat(10) { - val pos = Vector2.simplex(it, seconds * 0.2) * - bounds.center + bounds.center - val size = (it * it + 5.0) * 2.0 - - isolated { - translate(pos) - if (it % 2 == 0) { - circle(Vector2.ZERO, size) - } else { - rotate(Vector3.UNIT_Z, pos.x) - rectangle( - Rectangle.fromCenter( - Vector2.ZERO, size, size * 2 - ) - ) - } - } - } - } - - directionalField.apply(rt.colorBuffer(0), result) - - drawer.isolated { - if (mouseTracker.pressedButtons.isEmpty()) { - shadeStyle = shader - image(result) - } else { - image(rt.colorBuffer(0)) - } - } - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField02.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField02.kt deleted file mode 100644 index 9c101f4a..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoDirectionField02.kt +++ /dev/null @@ -1,55 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.drawImage -import org.openrndr.extra.color.colormatrix.constant -import org.openrndr.extra.color.colormatrix.tint -import org.openrndr.extra.jumpfill.DirectionalField -import org.openrndr.extra.noise.scatter -import org.openrndr.math.IntVector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.clamp - -/** - * Create directional distance field and demonstrate signed distance - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val input = drawImage(width, height, contentScale = 1.0) { - val points = drawer.bounds.scatter(100.0) - drawer.circles(points, 50.0) - } - - val filter = DirectionalField() - val ddf = input.createEquivalent(type = ColorType.FLOAT32) - - filter.signedMagnitude = true - filter.unitDirection = true - filter.apply(input, ddf) - - ddf.shadow.download() - extend { - val p = (mouse.position * ddf.contentScale).toInt().clamp( - IntVector2.ZERO, - IntVector2(width - 1, height - 1) - ) - val c = ddf.shadow[p.x, p.y] - val sdf3 = Vector3(c.r, c.g, c.b) - - drawer.drawStyle.colorMatrix = constant(ColorRGBa.WHITE.shade(0.5)) * tint(ColorRGBa.WHITE.shade(0.5)) - - drawer.image(ddf) - drawer.fill = null - drawer.stroke = ColorRGBa.WHITE - - drawer.circle(mouse.position, sdf3.z / ddf.contentScale) - drawer.lineSegment(mouse.position, mouse.position + sdf3.xy * sdf3.z) - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoDistanceField01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoDistanceField01.kt deleted file mode 100644 index 2d01bc82..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoDistanceField01.kt +++ /dev/null @@ -1,90 +0,0 @@ -import org.openrndr.MouseTracker -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.jumpfill.DistanceField -import org.openrndr.extra.noise.simplex -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.shape.Rectangle - -/** - * Shows how to use the [DistanceField] filter. - * - * Draws moving white shapes on black background, - * then applies the DistanceField filter which returns a [ColorBuffer] in which - * the red component encodes the distance to the closest black/white edge. - * - * The value of the green component is negative when on the black background - * and positive when inside white shapes. The sign is used in the [shadeStyle] to choose - * between two colors. - * - * The inverse of the distance is used to obtain a non-linear brightness. - * - * Hold down a mouse button to see the raw animation. - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - - program { - val rt = renderTarget(width, height) { colorBuffer() } - val distanceField = DistanceField() - - // Needs to be FLOAT32 so we can have negative values - val result = colorBuffer(width, height, type = ColorType.FLOAT32) - val shader = shadeStyle { - fragmentTransform = """ - float distance = abs(x_fill.r); - float bri = 1.0 / (1.0 + 0.03 * distance); - - // wavy effect - // bri *= (1.0 + 0.2 * sin(distance * 0.2)); - - x_fill.rgb = bri * (x_fill.g > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 1.0)); - """ - } - val mouseTracker = MouseTracker(mouse) - - extend { - // Draw moving white shapes on a black background - drawer.isolatedWithTarget(rt) { - clear(ColorRGBa.BLACK) - stroke = null - fill = ColorRGBa.WHITE - repeat(10) { - val pos = Vector2.simplex(it, seconds * 0.2) * - bounds.center + bounds.center - val size = (it * it + 5.0) * 2.0 - - isolated { - translate(pos) - if (it % 2 == 0) { - circle(Vector2.ZERO, size) - } else { - rotate(Vector3.UNIT_Z, pos.x) - rectangle( - Rectangle.fromCenter( - Vector2.ZERO, size, size * 2 - ) - ) - } - } - } - } - - distanceField.apply(rt.colorBuffer(0), result) - - drawer.isolated { - if (mouseTracker.pressedButtons.isEmpty()) { - shadeStyle = shader - image(result) - } else { - image(rt.colorBuffer(0)) - } - } - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow01.kt deleted file mode 100644 index 5dac1966..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow01.kt +++ /dev/null @@ -1,39 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.compositor.compose -//import org.openrndr.extra.compositor.draw -//import org.openrndr.extra.compositor.layer -//import org.openrndr.extra.compositor.post -//import org.openrndr.extra.fx.patterns.Checkers -//import org.openrndr.extra.jumpfill.fx.InnerGlow - -// Temporarily commented out until JumpFlood.kt is compatible with -// https://github.com/openrndr/openrndr/commit/9871b80161b155bf61371301ce1b7b9cf9a10adf - -//fun main() = application { -// configure { -// width = 720 -// height = 720 -// } -// program { -// val c = compose { -// layer { -// post(Checkers()) -// } -// layer { -// draw { -// drawer.fill = ColorRGBa.PINK.shade(0.5) -// drawer.stroke = null -// drawer.circle(width / 2.0, height / 2.0, width * 0.35) -// } -// post(InnerGlow()) { -// color = ColorRGBa(-1.0, -1.0, -1.0, 0.25); -// width = 30.0 -// } -// } -// } -// extend { -// c.draw(drawer) -// } -// } -//} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow02.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow02.kt deleted file mode 100644 index f1429256..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoInnerGlow02.kt +++ /dev/null @@ -1,39 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.compositor.compose -//import org.openrndr.extra.compositor.draw -//import org.openrndr.extra.compositor.layer -//import org.openrndr.extra.compositor.post -//import org.openrndr.extra.fx.patterns.Checkers -//import org.openrndr.extra.jumpfill.fx.InnerGlow - -// Temporarily commented out until JumpFlood.kt is compatible with -// https://github.com/openrndr/openrndr/commit/9871b80161b155bf61371301ce1b7b9cf9a10adf - -//fun main() = application { -// configure { -// width = 720 -// height = 720 -// } -// program { -// val c = compose { -// layer { -// post(Checkers()) -// } -// layer { -// draw { -// drawer.fill = ColorRGBa.PINK.shade(0.5) -// drawer.stroke = null -// drawer.circle(width / 2.0, height / 2.0, width * 0.35) -// } -// post(InnerGlow()) { -// color = ColorRGBa(1.0, 1.0, 1.0, 0.25); -// width = 30.0 -// } -// } -// } -// extend { -// c.draw(drawer) -// } -// } -//} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF01.kt deleted file mode 100644 index 0aa182c3..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF01.kt +++ /dev/null @@ -1,31 +0,0 @@ -import org.openrndr.MouseTracker -import org.openrndr.application -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.jumpfill.ShapeSDF -import org.openrndr.extra.svg.loadSVG - -fun main() = application { - configure { - width = 720 - height = 405 - } - program { - val sdf = ShapeSDF() - val df = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val shapes = loadSVG("orx-jumpflood/src/jvmDemo/resources/name.svg").findShapes().map { it.shape } - sdf.setShapes(shapes) - sdf.apply(emptyArray(), df) - - val mouseTracker = MouseTracker(mouse) - - extend { - if(mouseTracker.pressedButtons.isEmpty()) - drawer.image(df) - else - drawer.shapes(shapes) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF02.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF02.kt deleted file mode 100644 index 1a6cf928..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF02.kt +++ /dev/null @@ -1,60 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.jumpfill.ShapeSDF -import org.openrndr.extra.jumpfill.draw.SDFStrokeFill -import org.openrndr.extra.jumpfill.ops.SDFOnion -import org.openrndr.extra.jumpfill.ops.SDFSmoothIntersection -import org.openrndr.extra.svg.loadSVG -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform - -import kotlin.math.min - -fun main() = application { - configure { - width = 720 - height = 405 - } - program { - val sdf0 = ShapeSDF() - val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val sdf1 = ShapeSDF() - val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val shapes = loadSVG("orx-jumpflood/src/jvmDemo/resources/name.svg").findShapes().map { it.shape } - - val union = SDFSmoothIntersection() - val onion = SDFOnion() - - - val strokeFill = SDFStrokeFill() - - extend { - drawer.clear(ColorRGBa.PINK) - - sdf0.setShapes(shapes) - - sdf1.setShapes(shapes.map { - it.transform(transform { - translate(drawer.bounds.center) - rotate(Vector3.Companion.UNIT_Z, seconds * 45.0 - 30.0) - translate(-drawer.bounds.center) - }) - }) - - sdf0.apply(emptyArray(), df0) - sdf1.apply(emptyArray(), df1) - union.radius = 10.0 + min(mouse.position.y, 100.0) - union.apply(arrayOf(df0, df1), df0) - onion.radius = 20.0 - onion.apply(df0, df0) - strokeFill.strokeWeight = 2.0 - strokeFill.apply(df0, df0) - drawer.image(df0) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF03.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF03.kt deleted file mode 100644 index e1b52ad0..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF03.kt +++ /dev/null @@ -1,52 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.fx.distort.FluidDistort -import org.openrndr.extra.jumpfill.ShapeSDF -import org.openrndr.extra.jumpfill.draw.SDFStrokeFill -import org.openrndr.extra.jumpfill.ops.SDFSmoothDifference -import org.openrndr.extra.svg.loadSVG - -fun main() = application { - configure { - width = 720 - height = 405 - } - program { - val sdf0 = ShapeSDF() - val sdf1 = ShapeSDF() - val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val fd = FluidDistort() - fd.outputUV = true - - val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16) - - val shapes = loadSVG("orx-jumpflood/src/jvmDemo/resources/name.svg").findShapes().map { it.shape } - val union = SDFSmoothDifference() - - sdf0.setShapes(shapes) - sdf1.setShapes(shapes) - - val strokeFill = SDFStrokeFill() - - extend { - drawer.clear(ColorRGBa.PINK) - - fd.apply(emptyArray(), uvmap) - - sdf0.useUV = true - sdf0.apply(uvmap, df0) - sdf1.apply(uvmap, df1) - union.radius = 10.0 - union.apply(arrayOf(df0, df1), df0) - - strokeFill.strokeWeight = 10.0 - strokeFill.apply(df0, df0) - drawer.image(df0) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF04.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF04.kt deleted file mode 100644 index c354d45f..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF04.kt +++ /dev/null @@ -1,59 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.fx.distort.Perturb -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.jumpfill.ShapeSDF -import org.openrndr.extra.jumpfill.draw.SDFStrokeFill -import org.openrndr.extra.jumpfill.ops.SDFSmoothDifference -import org.openrndr.extra.svg.loadSVG -import org.openrndr.shape.Circle - -fun main() = application { - configure { - width = 720 - height = 405 - } - program { - val gui = GUI() - val sdf0 = ShapeSDF() - val sdf1 = ShapeSDF() - val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val perturb = Perturb() - perturb.outputUV = true - - val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16) - - val circleShapes = List(1) { Circle(drawer.bounds.center, 200.0).shape } - val shapes = loadSVG("orx-jumpflood/src/jvmDemo/resources/name.svg").findShapes().map { it.shape } - - sdf0.setShapes(circleShapes) - sdf1.setShapes(shapes) - - val difference = SDFSmoothDifference() - val strokeFill = SDFStrokeFill() - - gui.add(perturb) - extend(gui) - extend { - drawer.clear(ColorRGBa.PINK) - - perturb.phase = seconds * 0.1 - perturb.apply(uvmap, uvmap) - - sdf0.useUV = true - sdf0.apply(uvmap, df0) - sdf1.apply(uvmap, df1) - difference.radius = 10.0 - difference.apply(arrayOf(df0, df1), df0) - - strokeFill.strokeWeight = 10.0 - strokeFill.apply(df0, df0) - drawer.image(df0) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF05.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF05.kt deleted file mode 100644 index a54dd184..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoShapeSDF05.kt +++ /dev/null @@ -1,73 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.fx.distort.Perturb -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.jumpfill.ShapeSDF -import org.openrndr.extra.jumpfill.draw.SDFStrokeFill -import org.openrndr.extra.jumpfill.ops.SDFSmoothDifference -import org.openrndr.extra.svg.loadSVG -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle -import kotlin.math.cos -import kotlin.math.sin - -fun main() = application { - configure { - width = 720 - height = 405 - } - program { - val gui = GUI() - val sdf0 = ShapeSDF() - val sdf1 = ShapeSDF() - val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - - val perturb = Perturb() - - perturb.outputUV = true - - val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16) - val uvmap2 = colorBuffer(width, height, type = ColorType.FLOAT16) - - val circleShapes = List(1) { Circle(drawer.bounds.center, 200.0).shape } - val shapes = loadSVG("orx-jumpflood/src/jvmDemo/resources/name.svg").findShapes().map { it.shape } - - sdf0.setShapes(circleShapes) - sdf1.setShapes(shapes) - - val difference = SDFSmoothDifference() - val strokeFill = SDFStrokeFill() - sdf0.useUV = true - gui.add(sdf0) - gui.add(perturb) - gui.add(strokeFill) - gui.add(difference) - - extend(gui) - extend { - drawer.clear(ColorRGBa.PINK) - - perturb.offset = Vector2(cos(seconds * 0.2), sin(seconds * 0.2)) - perturb.outputUV = true - perturb.phase = seconds * 0.1 - perturb.apply(uvmap, uvmap) - - perturb.offset = Vector2.ZERO - perturb.outputUV = false - perturb.phase = seconds * 0.05 - perturb.apply(uvmap, uvmap2) - - sdf0.apply(uvmap2, df0) - sdf1.apply(uvmap2, df1) - - difference.apply(arrayOf(df0, df1), df0) - - strokeFill.apply(df0, df0) - drawer.image(df0) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoSkeleton01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoSkeleton01.kt deleted file mode 100644 index fb2e0b40..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoSkeleton01.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.renderTarget -import org.openrndr.extra.jumpfill.fx.Skeleton -import org.openrndr.extra.noise.simplex - -fun main() = application { - configure { - width = 720 - height = 540 - } - program { - val skeleton = Skeleton() - - val input = renderTarget(width, height) { - colorBuffer() - } - val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32) - extend { - drawer.isolatedWithTarget(input) { - // -- draw something interesting - drawer.stroke = null - drawer.clear(ColorRGBa.BLACK) - drawer.fill = ColorRGBa.WHITE - drawer.circle(mouse.position, 300.0) - drawer.fill = ColorRGBa.BLACK - drawer.circle(mouse.position, 150.0) - drawer.fill = ColorRGBa.WHITE - for (i in 0 until 30) { - val time = seconds * 0.25 - val x = simplex(i * 20, time) * width / 2 + width / 2 - val y = simplex(i * 20 + 5, time) * height / 2 + height / 2 - val r = simplex(i * 30, time) * 50.0 + 50.0 - drawer.circle(x, y, r) - } - } - skeleton.apply(input.colorBuffer(0), field) - drawer.image(field) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoStraightSkeleton01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoStraightSkeleton01.kt deleted file mode 100644 index f8e4c83a..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoStraightSkeleton01.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorType -import org.openrndr.draw.createEquivalent -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.renderTarget -import org.openrndr.extra.jumpfill.fx.StraightSkeleton -import org.openrndr.extra.noise.simplex - -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - val straightSkeleton = StraightSkeleton() - val input = renderTarget(width, height) { - colorBuffer() - } - val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32) - - extend { - drawer.isolatedWithTarget(input) { - // -- draw something interesting - drawer.stroke = null - drawer.clear(ColorRGBa.BLACK) - drawer.fill = ColorRGBa.WHITE - drawer.circle(mouse.position, 300.0) - drawer.fill = ColorRGBa.BLACK - drawer.circle(mouse.position, 150.0) - drawer.fill = ColorRGBa.WHITE - for (i in 0 until 30) { - val time = seconds * 0.25 - val x = simplex(i * 20, time) * width / 2 + width / 2 - val y = simplex(i * 20 + 5, time) * height / 2 + height / 2 - val r = simplex(i * 30, time) * 50.0 + 50.0 - drawer.circle(x, y, r) - } - } - straightSkeleton.apply(input.colorBuffer(0), field) - drawer.image(field) - } - } -} diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi01.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi01.kt deleted file mode 100644 index d57a3307..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi01.kt +++ /dev/null @@ -1,68 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.extra.jumpfill.EncodePoints -import org.openrndr.extra.jumpfill.IdContourPoints -import org.openrndr.extra.jumpfill.JumpFlooder -import kotlin.math.cos - -fun main() = application { - configure { - width = 512 - height = 512 - } - program { - val rt = renderTarget(width, height, 1.0) { - colorBuffer(type = ColorType.FLOAT32) - } - val encoder = EncodePoints() - val jf = JumpFlooder(width, height, encodePoints = Passthrough()) - val jf2 = JumpFlooder(width, height, encodePoints = Passthrough()) - val idcontours = IdContourPoints() - val contoured = colorBuffer(width, height, type = ColorType.FLOAT32) - extend { - fun plot(x: Double, y: Double, id: Double) { - drawer.fill = ColorRGBa(id, 0.0, 0.0, 1.0) - drawer.point(x, y) - } - - drawer.isolatedWithTarget(rt) { - drawer.clear(ColorRGBa(-1.0, -1.0, -1.0, 0.0)) - val o = cos(seconds) * 200.0 + 200.0 - - for (i in 0 until 20) { - plot(o + 100.0 + i * 4, 100.0, 0.25) - } - - for (i in 0 until 20) { - plot(200.0 + i * 4, 150.0 + i, 0.5) - } - for (i in 0 until 20) { - plot(300.0 + i * 4, 250.0 + i, 0.7) - } - - for (i in 0 until 20) { - plot(400.0 + i * 4, 250.0 + i, 0.75) - } - } - encoder.apply(rt.colorBuffer(0), rt.colorBuffer(0)) - val flooded = jf.jumpFlood(rt.colorBuffer(0)) - drawer.image(flooded) - idcontours.apply(flooded, contoured) - drawer.image(contoured) - val flooded2 = jf2.jumpFlood(contoured) - - drawer.image(flooded2, width * 1.0, 0.0) - - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - float d = length(va_texCoord0.xy - x_fill.xy); - x_fill = vec4(d,d,x_fill.z, 1.0); - """.trimIndent() - } - drawer.image(flooded2, 0.0, 0.0) - - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi02.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi02.kt deleted file mode 100644 index f3efaead..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi02.kt +++ /dev/null @@ -1,56 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.color.colormatrix.tint -import org.openrndr.extra.jumpfill.* -import kotlin.math.cos - -fun main() = application { - configure { - width = 512 - height = 512 - } - program { - val rt = renderTarget(width, height, 1.0) { - colorBuffer(type = ColorType.FLOAT32) - } - - val flowfield = colorBuffer(width, height, type = ColorType.FLOAT32) - val cluster = ClusteredField(decodeMode = DecodeMode.DISTANCE, outputDistanceToContours = true) - - - cluster.normalizedDistance = true - - extend { - fun plot(x: Double, y: Double, id: Double) { - drawer.fill = ColorRGBa(id, 0.0, 0.0, 1.0) - drawer.point(x, y) - } - - drawer.isolatedWithTarget(rt) { - drawer.clear(ColorRGBa(-1.0, -1.0, -1.0, 0.0)) - val o = cos(seconds) * 200.0 + 200.0 - - for (i in 0 until 20) { - plot(o + 100.0 + i * 4, 100.0, 0.25) - } - - for (i in 0 until 20) { - plot(200.0 + i * 4, 150.0 + i, 0.5) - } - for (i in 0 until 20) { - plot(300.0 + i * 4, 250.0 + i, 0.7) - } - - for (i in 0 until 20) { - plot(400.0 + i * 4, 250.0 + i, 0.75) - } - } - cluster.apply(rt.colorBuffer(0), flowfield) - drawer.drawStyle.colorMatrix = tint(ColorRGBa(10.0, 10.0, 1.0)) - drawer.image(flowfield) - - - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi03.kt b/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi03.kt deleted file mode 100644 index c694ee83..00000000 --- a/orx-jumpflood/src/jvmDemo/kotlin/DemoVoronoi03.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.color.colormatrix.tint -import org.openrndr.extra.jumpfill.ClusteredField -import org.openrndr.extra.jumpfill.DecodeMode -import org.openrndr.extra.noise.scatter -import org.openrndr.extra.noise.uniformRing -import org.openrndr.math.Vector2 - -fun main() = application { - configure { - width = 512 - height = 512 - } - program { - val rt = renderTarget(width, height, 1.0) { - colorBuffer(type = ColorType.FLOAT32) - } - val flowfield = colorBuffer(width, height, type = ColorType.FLOAT32) - val cluster = ClusteredField(decodeMode = DecodeMode.DISTANCE, outputDistanceToContours = true) - - cluster.normalizedDistance = true - - extend { - drawer.isolatedWithTarget(rt) { - drawer.ortho(rt) - drawer.clear(ColorRGBa(-1.0, -1.0, -1.0, 0.0)) - val points = drawer.bounds.scatter(20.0) - drawer.points { - for ((index, point) in points.withIndex()) { - fill = ColorRGBa((index + 1.0) / points.size, 0.0, 0.0, 1.0) - for (i in 0 until 30) { - point(point + Vector2.uniformRing(15.0, 25.0) * Vector2(1.0, 1.0)) - } - } - } - } - cluster.apply(rt.colorBuffer(0), flowfield) - drawer.drawStyle.colorMatrix = tint(ColorRGBa(100.0, 100.0, 0.0)) - drawer.image(flowfield) - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/jvmDemo/resources/name.svg b/orx-jumpflood/src/jvmDemo/resources/name.svg deleted file mode 100644 index 58076b04..00000000 --- a/orx-jumpflood/src/jvmDemo/resources/name.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/orx-jumpflood/src/jvmMain/kotlin/ShapeSDF.kt b/orx-jumpflood/src/jvmMain/kotlin/ShapeSDF.kt deleted file mode 100644 index b949b584..00000000 --- a/orx-jumpflood/src/jvmMain/kotlin/ShapeSDF.kt +++ /dev/null @@ -1,90 +0,0 @@ -package org.openrndr.extra.jumpfill - -import org.openrndr.draw.* -import org.openrndr.extra.jumpflood.jf_shape_sdf -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector4 -import org.openrndr.shape.Rectangle -import org.openrndr.shape.Shape -import org.openrndr.shape.ShapeContour - - -class ShapeSDF : Filter(filterShaderFromCode(jf_shape_sdf, "shape-sdf")) { - private val fromBuffer = bufferTexture(1024, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - private val toBuffer = bufferTexture(1024, format = ColorFormat.RGBa, type = ColorType.FLOAT32) - private var segmentCount = 0 - - @BooleanParameter("use UV map") - var useUV: Boolean by parameters - - @BooleanParameter("rectify distance") - var rectify: Boolean by parameters - - private var modelViewMatrixInverse by parameters - - var modelViewMatrix = Matrix44.IDENTITY - set(value) { - modelViewMatrixInverse = modelViewMatrix.inversed - field = value - } - - init { - useUV = false - rectify = false - modelViewMatrix = Matrix44.IDENTITY - } - - fun setShapes(shapes: List) { - setContours(shapes.flatMap { it.contours }) - } - - fun setContours(contours: List) { - val from = mutableListOf() - val to = mutableListOf() - - for (contour in contours) { - val lin = contour.sampleLinear() - var contourLength = 0.0 - for (segment in lin.segments) { - contourLength += segment.length - } - var offset = 0.0 - for (segment in lin.segments) { - from.add(Vector4(segment.start.x, segment.start.y, offset, contourLength)) - offset += segment.length - to.add(Vector4(segment.end.x, segment.end.y, offset, contourLength)) - } - } - - val fromShadow = fromBuffer.shadow - val fromWriter = fromShadow.writer() - fromWriter.rewind() - for (v in from) { - fromWriter.write(v) - } - fromShadow.upload(0, from.size * 4 * 4) - - val toShadow = toBuffer.shadow - val toWriter = toShadow.writer() - toWriter.rewind() - for (v in to) { - toWriter.write(v) - } - toShadow.upload(0, to.size * 4 * 4) - - segmentCount = from.size - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) { - "needs a floating point target" - } - parameters["fromBuffer"] = fromBuffer - parameters["toBuffer"] = toBuffer - parameters["segmentCount"] = segmentCount - // -- bit of an hack - val effectiveSource = if (source.isNotEmpty()) source else target - super.apply(effectiveSource, target, clip) - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/alpha-threshold.frag b/orx-jumpflood/src/shaders/glsl/alpha-threshold.frag deleted file mode 100644 index ad4ce7d0..00000000 --- a/orx-jumpflood/src/shaders/glsl/alpha-threshold.frag +++ /dev/null @@ -1,9 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float threshold; -out vec4 o_color; - -void main() { - float ref = step(threshold , texture(tex0, v_texCoord0).a); - o_color = vec4(ref, ref, ref, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/contour-points.frag b/orx-jumpflood/src/shaders/glsl/contour-points.frag deleted file mode 100644 index 21868278..00000000 --- a/orx-jumpflood/src/shaders/glsl/contour-points.frag +++ /dev/null @@ -1,20 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec2 stepSize = 1.0 / vec2(textureSize(tex0, 0)); - float ref = step(0.5 , texture(tex0, v_texCoord0).r); - - float laplacian = -4.0 * ref; - - laplacian += step(0.5, texture(tex0, v_texCoord0 + vec2(stepSize.x, 0.0)).r); - laplacian += step(0.5, texture(tex0, v_texCoord0 - vec2(stepSize.x, 0.0)).r); - laplacian += step(0.5, texture(tex0, v_texCoord0 + vec2(0.0, stepSize.y)).r); - laplacian += step(0.5, texture(tex0, v_texCoord0 - vec2(0.0, stepSize.y)).r); - - float contour = 1.0 - step(0.0, laplacian); - - o_color = vec4(contour, contour, contour, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/encode-points.frag b/orx-jumpflood/src/shaders/glsl/encode-points.frag deleted file mode 100644 index ad4a1f68..00000000 --- a/orx-jumpflood/src/shaders/glsl/encode-points.frag +++ /dev/null @@ -1,14 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec4 t = texture(tex0, v_texCoord0); - vec4 outc = vec4(-1.0, -1.0, t.r, 1.0); - - if (t.r > 0.0) { - outc.xy = v_texCoord0.xy; - } - o_color = outc; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag b/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag deleted file mode 100644 index 299c9ffb..00000000 --- a/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag +++ /dev/null @@ -1,122 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float threshold; - -out vec4 o_color; - -float zd(float d) { - if (d < 0.0001) { - return 1.0; - } else { - return d; - } -} - -void main() { - vec2 stepSize = 1.0 / vec2(textureSize(tex0, 0)); - float ref = step(threshold, texture(tex0, v_texCoord0).a); - - - vec2 o = vec2(0.0); //stepSize/2.0; - float t00 = texture(tex0, v_texCoord0 + o + vec2(0.0, 0.0)).a; - float t10 = texture(tex0, v_texCoord0 + o + vec2(stepSize.x, 0.0)).a; - float t01 = texture(tex0, v_texCoord0 + o + vec2(0.0, stepSize.y)).a; - float t11 = texture(tex0, v_texCoord0 + o + vec2(stepSize.x, stepSize.y)).a; - - int mask = 0; - - if (t00 >= threshold) { - mask += 1; - } - if (t10 >= threshold) { - mask += 2; - } - if (t01 >= threshold) { - mask += 4; - } - if (t11 >= threshold) { - mask += 8; - } - - vec2 offset = vec2(0.0); - if (mask == 1) { - offset.x = 1.0 - (threshold-t10) / zd(t00-t10); - offset.y = 1.0 - ((threshold-t01) / zd(t00-t01)); - offset /= 2.0; - } - if (mask == 2) { - offset.x = ((threshold-t00) / zd(t10-t00)); - offset.y = 1.0-(threshold-t11) / zd(t10-t11); - offset /= 2.0; - } - if (mask == 3) { // OK - float dy0 = 1.0 - (threshold - t01) / zd(t00 - t01); - float dy1 = 1.0 - (threshold - t11) / zd(t10 - t11); - offset.y = dy0 + dy1; - offset.x = 1.0; - offset /= 2.0; - } - if (mask == 4) { // OK - offset.x = 1.0 - (threshold-t11) / zd(t01-t11); - offset.y = (threshold-t00) / zd(t01-t00); - offset /= 2.0; - } - if (mask == 5) { // OK - float dx0 = 1.0- (threshold - t10) / zd(t00 - t10); - float dx1 = 1.0-(threshold - t11) / zd(t01 - t11); - offset.x = dx0 + dx1; - offset.y = 1.0; - offset /= 2.0; - } - if (mask == 6 || mask == 9) { - offset = vec2(0.5); - } - if (mask == 7) { // OK - offset.x = 1.0 - (threshold-t11) / zd(t01-t11); - offset.y = 1.0 - (threshold-t11) / zd(t10-t11); - offset /= 2.0; - } - if (mask == 8) { // OK - offset.x = (threshold-t01) / zd(t11-t01); - offset.y = (threshold-t10) / zd(t11-t10); - offset /= 2.0; - } - if (mask == 10) { // OK - float dx0 = (threshold - t00) / zd(t10 - t00); - float dx1 = (threshold - t01) / zd(t11 - t01); - offset.x = (dx0 + dx1); - offset.y = 1.0; - offset /= 2.0; - } - if (mask == 11) { // OK - offset.x = (threshold-t01) / zd(t11-t01); - offset.y = (threshold-t01) / zd(t00-t01); - offset /= 2.0; - } - if (mask == 12) { // OK - float dy0 = (threshold - t00) / zd(t01 - t00); - float dy1 = (threshold - t10) / zd(t11 - t10); - offset.y = dy0 + dy1; - offset.x = 1.0; - offset /= 2.0; - } - if (mask == 13) { // OK - offset.x = 1.0 - (threshold-t10) / zd(t00-t10); - offset.y = (threshold-t10) / zd(t11-t10); - offset /= 2.0; - } - if (mask == 14) { // OK - offset.x = (threshold-t00) / zd(t10-t00); - offset.y = (threshold-t00) / zd(t01-t00); - offset /= 2.0; - } - - float contour = (mask != 0 && mask != 15)?1.0:0.0; - - //float contour = (mask == 14 || mask == 11 || mask == 7 || mask == 13) ? 1.0 : 0.0; - if (contour > 0.0) { - o_color = vec4(v_texCoord0 /*+ offset*stepSize*/ , ref, 1.0); - } else { - o_color = vec4(-1.0, -1.0, 0.0, 1.0); - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/id-contours.frag b/orx-jumpflood/src/shaders/glsl/id-contours.frag deleted file mode 100644 index 8a636944..00000000 --- a/orx-jumpflood/src/shaders/glsl/id-contours.frag +++ /dev/null @@ -1,25 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { -vec4 colorMask = vec4(0.0, 0.0, 1.0, 0.0); - vec2 stepSize = 1.0 / vec2(textureSize(tex0, 0)); - vec4 ref = texture(tex0, v_texCoord0); - - float laplacian = 0.0; - - laplacian += abs(texture(tex0, v_texCoord0 + vec2(stepSize.x, 0.0)).b-ref.b); - laplacian += abs(texture(tex0, v_texCoord0 - vec2(stepSize.x, 0.0)).b-ref.b); - laplacian += abs(texture(tex0, v_texCoord0 + vec2(0.0, stepSize.y)).b-ref.b); - laplacian += abs(texture(tex0, v_texCoord0 - vec2(0.0, stepSize.y)).b-ref.b); - - float contour = step(0.0, laplacian); - - if (laplacian > 0.001) { - o_color = vec4(v_texCoord0.x, v_texCoord0.y, ref.b, 1.0); - } else { - o_color = vec4(-1.0, -1.0, -1.0, 1.0); - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/inner-bevel.frag b/orx-jumpflood/src/shaders/glsl/inner-bevel.frag deleted file mode 100644 index 1da77eb0..00000000 --- a/orx-jumpflood/src/shaders/glsl/inner-bevel.frag +++ /dev/null @@ -1,55 +0,0 @@ -uniform sampler2D tex0; // image -uniform sampler2D tex1; // distance - -uniform float angle; -uniform float width; -uniform float noise; - -in vec2 v_texCoord0; - -out vec4 o_color; -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - - -void main() { - float r = radians(angle); - - vec4 color = texture(tex0, v_texCoord0); - - - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - - vec2 distance = vec2(0.0); - float totalWeight = 0.0; - for (int j = 0; j < 1; ++j) { - for (int i =0; i < 1; ++i) { - vec2 hn = (hash22(v_texCoord0)-0.5) * noise; - vec2 s = texture(tex1, v_texCoord0 + step * vec2(i,j)).xy + hn*0.0; - distance += s; - totalWeight += 1.0; - } - } - distance /= totalWeight; - - //vec2 distance = texture(tex1, v_texCoord0).xy + hn; - - float d = length(distance); - vec2 n = normalize(distance); - vec2 l = vec2(cos(r), sin(r)); - - float e = smoothstep(0.0, width, d) * smoothstep(width*2.0, width, d); - float o = max(0.0,dot(n, l))*e ; - float o2 = max(0.0,-dot(n, l))*e ; - //o_color = vec4(vec3(o),1.0) * color.a; - - vec3 nc = color.a > 0.0? - color.rgb/color.a : vec3(0.0); - - - o_color = vec4(nc+vec3(o)-vec3(o2),1.0) * color.a; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/inner-glow.frag b/orx-jumpflood/src/shaders/glsl/inner-glow.frag deleted file mode 100644 index 4dca66f0..00000000 --- a/orx-jumpflood/src/shaders/glsl/inner-glow.frag +++ /dev/null @@ -1,37 +0,0 @@ -uniform sampler2D tex0; // image -uniform sampler2D tex1; // distance - -uniform float width; -uniform float noise; -uniform vec4 color; -uniform float shape; -uniform float imageOpacity; -in vec2 v_texCoord0; - -out vec4 o_color; -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -void main() { - vec4 original = texture(tex0, v_texCoord0); - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - vec2 distance = texture(tex1, v_texCoord0).rg; - float d = length(distance); - vec2 n = normalize(distance); - - vec2 h = hash22(v_texCoord0)*10.0; - float e = exp(-( pow((d+h.x*noise)*1.0/width, shape)) ); - - vec3 norginal = original.a > 0.0 ? original.rgb / original.a : vec3(0.0); - - vec3 add = norginal + color.rgb * e * color.a; - o_color = vec4(add, 1.0) * original.a; - -// //o_color = original * imageOpacity + original.a* vec4(color.rgb, 1.0) * e * color.a; -// o_color.rgb = max(vec3(0.0), o_color.rgb); -// o_color.a = min(o_color.a, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/inpaint.frag b/orx-jumpflood/src/shaders/glsl/inpaint.frag deleted file mode 100644 index aa347583..00000000 --- a/orx-jumpflood/src/shaders/glsl/inpaint.frag +++ /dev/null @@ -1,47 +0,0 @@ -uniform sampler2D tex0;// image -uniform sampler2D tex1;// distance - -uniform float width; -uniform float noise; -uniform float shape; -uniform float imageOpacity; -uniform float opacity; -in vec2 v_texCoord0; - -out vec4 o_color; -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -void main() { - vec4 original = texture(tex0, v_texCoord0); - vec2 ts = vec2(textureSize(tex0, 0)); - vec2 step = 1.0 / ts; - vec2 distance = texture(tex1, v_texCoord0).rg; - - vec2 n = normalize(distance); - - vec2 uvOff = distance * step * vec2(1.0, -1.0); - - vec4 border = vec4(0.0); - - float w = 0.0; - for (int j = -1; j <= 1; ++j) { - for (int i = -1; i <= 1; ++i) { - vec4 smp = texture(tex0, v_texCoord0 + uvOff + step * vec2(i, j)); - border += smp; - } - } - - vec4 nborder = border.a>0.0?vec4(border.rgb/border.a, 1.0):vec4(0.0); - float d = length(distance); - - vec2 h = hash22(v_texCoord0)*10.0; - float rwidth = max(ts.x, ts.y) * width; - float e = shape > 0.0 ? exp(-( pow((d+h.x*noise)*1.0/rwidth, shape))) : 1.0; - o_color = original * imageOpacity + (1.0-original.a)* nborder * e * opacity; - -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/jumpflood.frag b/orx-jumpflood/src/shaders/glsl/jumpflood.frag deleted file mode 100644 index 5c6e3c96..00000000 --- a/orx-jumpflood/src/shaders/glsl/jumpflood.frag +++ /dev/null @@ -1,38 +0,0 @@ -in vec2 v_texCoord0; - -uniform sampler2D tex0; -uniform int maxSteps; -uniform int step; - -out vec4 o_color; -void main() { - - float stepwidth = 1.0 / pow(2.0, min(float(maxSteps), float(step+1))); - - float bestDistance = 1E10; - vec2 bestCoord = vec2(-100.0); - vec2 bestColor = vec2(-1.0); - - vec2 is = vec2(1.0) / vec2(textureSize(tex0, 0)); - - float found = 0.0; - for (int y = -1; y <= 1; ++y) { - for (int x = -1; x <= 1; ++x) { - vec2 sampleCoord = v_texCoord0 + vec2(stepwidth) * vec2(x,y); - vec4 data = texture( tex0, sampleCoord); - vec2 seedCoord = data.xy; - vec2 seedColor = data.zw; - float dist = length(seedCoord - v_texCoord0); - if ((seedCoord.x >= 0.0 && seedCoord.y >= 0.0) && dist <= bestDistance) - { - found = 1.0; - bestDistance = dist; - bestCoord = seedCoord; - bestColor = seedColor; - } - } - } - - o_color = vec4(bestCoord, bestColor.r, 1.0); - -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/outer-glow.frag b/orx-jumpflood/src/shaders/glsl/outer-glow.frag deleted file mode 100644 index 674232b1..00000000 --- a/orx-jumpflood/src/shaders/glsl/outer-glow.frag +++ /dev/null @@ -1,29 +0,0 @@ -uniform sampler2D tex0; // image -uniform sampler2D tex1; // distance - -uniform float width; -uniform float noise; -uniform vec4 color; -uniform float shape; -uniform float imageOpacity; -in vec2 v_texCoord0; - -out vec4 o_color; -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -void main() { - vec4 original = texture(tex0, v_texCoord0); - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - vec2 distance = texture(tex1, v_texCoord0).rg; - float d = length(distance); - vec2 n = normalize(distance); - - vec2 h = hash22(v_texCoord0)*10.0; - float e = exp(-( pow((d+h.x*noise)*1.0/width, shape)) ); - o_color = original * imageOpacity + (1.0-original.a)* vec4(color.rgb, 1.0) * e * color.a; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/pixel-direction.frag b/orx-jumpflood/src/shaders/glsl/pixel-direction.frag deleted file mode 100644 index ed723805..00000000 --- a/orx-jumpflood/src/shaders/glsl/pixel-direction.frag +++ /dev/null @@ -1,67 +0,0 @@ -/* -use #define OUTPUT_DISTANCE to output distance -use #define OUTPUT_DIRECTION to output direction -*/ - -uniform sampler2D tex0; -uniform sampler2D tex1; -uniform vec2 originalSize; -uniform vec2 directionalField; -uniform float distanceScale; -uniform bool normalizedDistance; -uniform bool unitDirection; -uniform bool flipV; -uniform bool outputIds; -uniform bool signedMagnitude; -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec2 sizeDF = vec2(textureSize(tex0, 0)); // this is always square - vec2 sizeTF = vec2(textureSize(tex1, 0)); // this can be non-square - - vec2 pixelPosition = v_texCoord0; - vec4 textureData = texture(tex0, v_texCoord0); - vec2 centroidPixelPosition = textureData.xy; - - - vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * sizeDF; - - if (flipV) { - pixelDistance *= vec2(1.0, -1.0); - } - - float length_ = length(pixelDistance); - if (unitDirection) { - if (length_ >= 1E-6) { - pixelDistance /= length_; - } - } - - vec2 dfTf = sizeDF / sizeTF; // texture adjusment factor - - float outputData = (!outputIds) ? texture(tex1, v_texCoord0 * dfTf).r : textureData.b; - - #ifdef OUTPUT_DIRECTION - if (!normalizedDistance) { - o_color = vec4(pixelDistance * distanceScale, outputData, 1.0); - } else if (!unitDirection) { - o_color = vec4(pixelDistance / originalSize, outputData, 1.0); - } - #else - if (!normalizedDistance) { - o_color = vec4(vec2(length(pixelDistance * distanceScale)), outputData, 1.0); - } else if (!unitDirection) { - o_color = vec4(vec2(length(pixelDistance / originalSize)), outputData, 1.0); - } - #endif - - if (!outputIds) { - if (signedMagnitude) { - float s = -sign(o_color.b - 0.5); - o_color.rg *= s; - o_color.b = s * length_; - } - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/pixel-distance.frag b/orx-jumpflood/src/shaders/glsl/pixel-distance.frag deleted file mode 100644 index d7a444aa..00000000 --- a/orx-jumpflood/src/shaders/glsl/pixel-distance.frag +++ /dev/null @@ -1,37 +0,0 @@ -uniform sampler2D tex0; -uniform sampler2D tex1; - -uniform vec2 originalSize; -uniform float distanceScale; -uniform bool signedBit; -uniform bool signedDistance; - -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec2 sizeDF = vec2(textureSize(tex0, 0)); // this is always square - vec2 sizeTF = vec2(textureSize(tex1, 0)); // this can be non-square - - vec2 pixelPosition = v_texCoord0; - vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; - vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * sizeDF * vec2(1.0, -1.0); - - vec2 dfTf = sizeDF / sizeTF; // texture adjusment factor - - float threshold = texture(tex1, v_texCoord0 * dfTf).r; - float distance = length(pixelDistance) * distanceScale; - - if (signedDistance) { - if (threshold > 0.5) { - distance *= -1.0; - } - } - - if (signedBit) { - o_color = vec4(distance, threshold, 0.0, 1.0); - } else { - o_color = vec4(vec3(distance), 1.0); - } -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-blend.frag b/orx-jumpflood/src/shaders/glsl/sdf-blend.frag deleted file mode 100644 index a9626e11..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-blend.frag +++ /dev/null @@ -1,13 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform sampler2D tex1;// signed distance -uniform float factor; - -in vec2 v_texCoord0; -out vec4 o_color; - -void main() { - float d0 = texture(tex0, v_texCoord0).r; - float d1 = texture(tex1, v_texCoord0).r; - float d = mix(d0, d1, factor); - o_color = vec4(d, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-onion.frag b/orx-jumpflood/src/shaders/glsl/sdf-onion.frag deleted file mode 100644 index 9ff36444..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-onion.frag +++ /dev/null @@ -1,10 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform float radius; - -in vec2 v_texCoord0; -out vec4 o_color; - -void main() { - float d0 = texture(tex0, v_texCoord0).r; - o_color = vec4(abs(d0)- radius, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-round.frag b/orx-jumpflood/src/shaders/glsl/sdf-round.frag deleted file mode 100644 index 8c644084..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-round.frag +++ /dev/null @@ -1,10 +0,0 @@ -uniform sampler2D tex0; // signed distance -uniform float radius; - -in vec2 v_texCoord0; -out vec4 o_color; - -void main() { - float d0 = texture(tex0, v_texCoord0).r - radius; - o_color = vec4(d0, 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-smooth-difference.frag b/orx-jumpflood/src/shaders/glsl/sdf-smooth-difference.frag deleted file mode 100644 index 2111e989..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-smooth-difference.frag +++ /dev/null @@ -1,17 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform sampler2D tex1;// signed distance -uniform float radius; - -in vec2 v_texCoord0; -out vec4 o_color; - -float opSmoothDifference( float d1, float d2, float k ) { - float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 ); - return mix( d2, -d1, h ) + k*h*(1.0-h); } - - -void main() { - float d0 = texture(tex0, v_texCoord0).r; - float d1 = texture(tex1, v_texCoord0).r; - o_color = vec4(opSmoothDifference(d0, d1, radius), 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-smooth-intersection.frag b/orx-jumpflood/src/shaders/glsl/sdf-smooth-intersection.frag deleted file mode 100644 index 414de506..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-smooth-intersection.frag +++ /dev/null @@ -1,17 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform sampler2D tex1;// signed distance -uniform float radius; - -in vec2 v_texCoord0; -out vec4 o_color; - -float opSmoothIntersection(float d1, float d2, float k) { - float h = clamp(0.5 - 0.5*(d2-d1)/k, 0.0, 1.0); - return mix(d2, d1, h) + k*h*(1.0-h); } - - -void main() { - float d0 = texture(tex0, v_texCoord0).r; - float d1 = texture(tex1, v_texCoord0).r; - o_color = vec4(opSmoothIntersection(d0, d1, radius), 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-smooth-union.frag b/orx-jumpflood/src/shaders/glsl/sdf-smooth-union.frag deleted file mode 100644 index 58ff9450..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-smooth-union.frag +++ /dev/null @@ -1,17 +0,0 @@ -uniform sampler2D tex0; // signed distance -uniform sampler2D tex1; // signed distance -uniform float radius; - -in vec2 v_texCoord0; -out vec4 o_color; - -float opSmoothUnion(float d1, float d2, float k) { - float h = clamp(0.5 + 0.5*(d2-d1)/k, 0.0, 1.0); - return mix(d2, d1, h) - k*h*(1.0-h); -} - -void main() { - float d0 = texture(tex0, v_texCoord0).r; - float d1 = texture(tex1, v_texCoord0).r; - o_color = vec4(opSmoothUnion(d0, d1, radius), 0.0, 0.0, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/sdf-stroke-fill.frag b/orx-jumpflood/src/shaders/glsl/sdf-stroke-fill.frag deleted file mode 100644 index ad47087f..00000000 --- a/orx-jumpflood/src/shaders/glsl/sdf-stroke-fill.frag +++ /dev/null @@ -1,22 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform float radius; - -uniform vec4 strokeColor; -uniform float strokeWeight; -uniform float strokeFeather; - -uniform float fillFeather; -uniform vec4 fillColor; - -in vec2 v_texCoord0; -out vec4 o_color; - -void main() { - float d = texture(tex0, v_texCoord0).r; - float strokeFactor = smoothstep(strokeWeight + strokeFeather, strokeWeight, abs(d)); - float fillFactor = smoothstep(0.0, fillFeather, -d); - - vec4 fc = (fillColor * fillColor.a) * fillFactor; - fc = fc * (1.0 - strokeFactor) + strokeFactor * (strokeColor * strokeColor.a); - o_color = fc; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/shape-sdf.frag b/orx-jumpflood/src/shaders/glsl/shape-sdf.frag deleted file mode 100644 index 77c5f54d..00000000 --- a/orx-jumpflood/src/shaders/glsl/shape-sdf.frag +++ /dev/null @@ -1,109 +0,0 @@ -in vec2 v_texCoord0; -uniform float iTime; -out vec4 o_color; - -uniform bool useUV; -uniform bool rectify; - -uniform mat4 modelViewMatrixInverse; - -uniform samplerBuffer toBuffer; -uniform samplerBuffer fromBuffer; -uniform int segmentCount; -uniform vec2 targetSize; - -uniform sampler2D tex0; // uv-map - -float isLeft( vec2 P0, vec2 P1, vec2 P2 ) { - return ( (P1.x - P0.x) * (P2.y - P0.y) - - (P2.x - P0.x) * (P1.y - P0.y) ); -} - -float length_squared( vec2 v, vec2 w ) { - return dot(w-v, w-v); -} - -int winding_number( vec2 v, vec2 w, vec2 p ) { - if (v.y <= p.y) { // start y <= P.y - if (w.y > p.y) // an upward crossing - if (isLeft( v, w, p) > 0.0) // P left of edge - return 1; // ++wn; // have a valid up intersect - } - else { // start y > P.y (no test needed) - if (w.y <= p.y) // a downward crossing - if (isLeft( v,w,p) < 0.0) // P right of edge - return -1; //--wn; // have a valid down intersect - } - return 0; -} - -float minimum_distance(vec2 v, vec2 w, vec2 p) { - // Return minimum distance between line segment vw and point p - float l2 = length_squared(v, w); // i.e. |w-v|^2 - avoid a sqrt - if (l2 == 0.0) return distance(p, v); // v == w case - // Consider the line extending the segment, parameterized as v + t (w - v). - // We find projection of point p onto the line. - // It falls where t = [(p-v) . (w-v)] / |w-v|^2 - // We clamp t from [0,1] to handle points outside the segment vw. - float t = max(0.0, min(1.0, dot(p - v, w - v) / l2)); - vec2 projection = v + t * (w - v); // Projection falls on the segment - return distance(p, projection); -} - -vec3 minimum_distance_and_perpendicular(vec4 v, vec4 w, vec2 p) { - // Return minimum distance between line segment vw and point p - float l2 = length_squared(v.xy, w.xy); // i.e. |w-v|^2 - avoid a sqrt - if (l2 == 0.0) return vec3(distance(p, v.xy), v.z, v.w); // v == w case - // Consider the line extending the segment, parameterized as v + t (w - v). - // We find projection of point p onto the line. - // It falls where t = [(p-v) . (w-v)] / |w-v|^2 - // We clamp t from [0,1] to handle points outside the segment vw. - float t = max(0.0, min(1.0, dot(p - v.xy, w.xy - v.xy) / l2)); - vec3 projection = v.xyz + t * (w.xyz - v.xyz); // Projection falls on the segment - return vec3(distance(p.xy, projection.xy), projection.z, v.w); -} - -float shapeDistance(vec2 uv, out float perpDistOut, out float contourLengthOut ) { - float mindist = 10E10; - float perpdist = 0.0; - float contourLength = 0.0; - int windingNr = 0; - for (int i = 0; i < segmentCount; i++) { - vec4 from = texelFetch(fromBuffer, i); - vec4 to = texelFetch(toBuffer, i); - vec3 distline_and_perp = minimum_distance_and_perpendicular(from, to, uv.xy); - windingNr += winding_number( from.xy, to.xy, uv.xy ); - float distline = distline_and_perp.x; - if (abs(distline) <= mindist) { - mindist = distline; - perpdist = distline_and_perp.y; - contourLength = distline_and_perp.z; - } - } - float signedDistance = mindist * (windingNr==0 ? 1.0 : -1.0); - contourLengthOut = contourLength; - perpDistOut = perpdist; - return signedDistance; -} - -void main() { - vec2 uv = v_texCoord0; - - vec2 fixDistance = vec2(1.0); - - if (useUV) { - vec2 o = 0.5 / vec2(textureSize(tex0, 0)); - uv = texture(tex0, v_texCoord0 + o).xy; - if (rectify) { - fixDistance = (fwidth(uv))*vec2(1280.0, 720.0); - } - } - uv.y = 1.0 - uv.y; - uv *= targetSize; - uv = (modelViewMatrixInverse * vec4(uv, 0.0, 1.0)).xy; - - float perpdist; - float contourLength; - float signedDistance = shapeDistance(uv, perpdist, contourLength); - o_color = vec4(signedDistance / length(fixDistance), perpdist/contourLength, contourLength, 1.0); -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/skeleton.frag b/orx-jumpflood/src/shaders/glsl/skeleton.frag deleted file mode 100644 index 0f1edc9f..00000000 --- a/orx-jumpflood/src/shaders/glsl/skeleton.frag +++ /dev/null @@ -1,42 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform vec4 skeletonColor; -uniform vec4 backgroundColor; -uniform vec4 foregroundColor; -uniform float angleTreshold; - -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - float centerDistance = texture(tex0, v_texCoord0).r; - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - - float minDistance = 1000.0; - - float nd = texture(tex0, v_texCoord0 + step * vec2(0.0, -1.0)).r; - float ed = texture(tex0, v_texCoord0 + step * vec2(1.0, 0.0)).r; - float wd = texture(tex0, v_texCoord0 + step * vec2(-1.0, 0.0)).r; - float sd = texture(tex0, v_texCoord0 + step * vec2(0.0, 1.0)).r; - - float nd2 = texture(tex0, v_texCoord0 + step * vec2(-1.0, -1.0)).r; - float ed2 = texture(tex0, v_texCoord0 + step * vec2(-1.0, 1.0)).r; - float wd2 = texture(tex0, v_texCoord0 + step * vec2(1.0, -1.0)).r; - float sd2 = texture(tex0, v_texCoord0 + step * vec2(1.0, 1.0)).r; - - float r = -centerDistance * 8.0 + nd + ed + wd + sd + nd2 + ed2 + wd2 + sd2; - - vec4 fc = vec4(0.0); - - if (centerDistance < 0.0) { - fc += foregroundColor * foregroundColor.a; - } else { - fc += backgroundColor * backgroundColor.a; - } - - if (r > 0.0 && centerDistance < 0.0) { - fc = fc * (1.0 - skeletonColor.a) + (skeletonColor * skeletonColor.a); - } - - o_color = fc; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag b/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag deleted file mode 100644 index 3dc16bc2..00000000 --- a/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag +++ /dev/null @@ -1,46 +0,0 @@ -uniform sampler2D tex0;// signed distance -uniform vec4 skeletonColor; -uniform vec4 backgroundColor; -uniform vec4 foregroundColor; -uniform float angleTreshold; - -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec4 ct = texture(tex0, v_texCoord0); - vec2 cd = normalize(ct.xy); - vec2 step = 1.0 / vec2(textureSize(tex0, 0)); - - float minDistance = 1000.0; - - vec4 nt = texture(tex0, v_texCoord0 + step * vec2(0.0, -1.0)); - vec2 nd = normalize(nt.xy); - vec4 et = texture(tex0, v_texCoord0 + step * vec2(1.0, 0.0)); - vec2 ed = normalize(et.xy); - vec4 wt = texture(tex0, v_texCoord0 + step * vec2(-1.0, 0.0)); - vec2 wd = normalize(wt.xy); - vec4 st = texture(tex0, v_texCoord0 + step * vec2(0.0, 1.0)); - vec2 sd = normalize(st.xy); - - float d0 = dot(cd, nd); - float d1 = dot(cd, ed); - float d2 = dot(cd, wd); - float d3 = dot(cd, sd); - - float r = (d0+d1+d2+d3); - - vec4 fc = vec4(0.0); - - if (ct.z > 0.0) { - fc += foregroundColor * foregroundColor.a; - } else { - fc += backgroundColor * backgroundColor.a; - } - - if ((d0 < angleTreshold || d1 < angleTreshold || d2 < angleTreshold || d3 < angleTreshold) && ct.z > 0.0 && length(ct.xy) > 4.0) { - fc = fc * (1.0 - skeletonColor.a) + (skeletonColor * skeletonColor.a); - } - o_color = fc; -} \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/threshold.frag b/orx-jumpflood/src/shaders/glsl/threshold.frag deleted file mode 100644 index fb545a43..00000000 --- a/orx-jumpflood/src/shaders/glsl/threshold.frag +++ /dev/null @@ -1,9 +0,0 @@ -uniform sampler2D tex0; -in vec2 v_texCoord0; -uniform float threshold; -out vec4 o_color; - -void main() { - float ref = step(threshold , dot( vec3(1.0/3.0), texture(tex0, v_texCoord0).rgb )); - o_color = vec4(ref, ref, ref, 1.0); -} \ No newline at end of file diff --git a/orx-jvm/build.gradle.kts b/orx-jvm/build.gradle.kts deleted file mode 100644 index ed1cf45a..00000000 --- a/orx-jvm/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.dokka") -} \ No newline at end of file diff --git a/orx-jvm/orx-axidraw/README.md b/orx-jvm/orx-axidraw/README.md deleted file mode 100644 index 18247210..00000000 --- a/orx-jvm/orx-axidraw/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# orx-axidraw - -GUI for configuring and plotting with an Axidraw pen-plotter. - -Uses the [AxiCLI](https://axidraw.com/doc/cli_api/#introduction) command line tool -to communicate with the pen plotter. - -Requires: Python 3.8 or higher. - -This orx create a Python virtual environment and downloads AxiCLI automatically. - -## Usage - -```kotlin -fun main() = application { - program { - val axi = Axidraw(this, PaperSize.A5) - axi.resizeWindow() - - val gui = WindowedGUI() - gui.add(axi) - - axi.draw { - fill = null - axi.bounds.grid(4, 6).flatten().forEach { - circle(it.center, Double.uniform(20.0, 50.0)) - } - } - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} -``` - -Study the inputs available in the GUI. Most are explained in the [AxiCLI](https://axidraw.com/doc/cli_api/#introduction) documentation page. - -### Important - -* Choose the correct pen-plotter model and servo type in the GUI before plotting. -* Always make sure the pen is at the home position before starting to plot. If it's not, unpower the steppers, -drag the carriage home (near the Axidraw's CPU), then power the steppers back on. - -### Tips - -* One can repeatedly click on `toggle up/down` and adjust `pen pos down` and `pen pos up` -to find the ideal heights for the pen. -* Enable `fills occlude strokes` and increase margin value to hide elements near -the borders of the paper. -* Click `save` to save your SVG file. -* Click `plot` to plot the visible design using the current settings. -* A [2D camera](https://guide.openrndr.org/extensions/camera2D.html) is enabled by default to place your design on the paper. -* Click `resume plotting` after pressing the hardware pause button (or including a pause -command on a layer) to continue. -* To get a plotting time estimate, enable `preview` and click `plot`. Nothing will be plotted, but the estimate will be shown in the IDE console. - -The `Load` and `Save` buttons *at the top of the GUI* can be used to load and save the plotting settings. In a future version we may embed the plotting settings into the SVG file. - -### Multi color plots - -orx-axidraw makes it easy to create multi-pen plots. To do that, use two or more stroke colors in your design. The order of the lines does not matter. Then, before plotting, call `axi.groupStrokeColors()`. This will group curves into layers based on their stroke colors and insert a pause between layers, allowing you to change the pen. - -When the plotter pauses during plotting, change the pen and click `resume plotting` to continue. diff --git a/orx-jvm/orx-axidraw/build.gradle.kts b/orx-jvm/orx-axidraw/build.gradle.kts deleted file mode 100644 index 1392407a..00000000 --- a/orx-jvm/orx-axidraw/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.dialogs) - implementation(project(":orx-jvm:orx-gui")) - api(project(":orx-composition")) - implementation(project(":orx-svg")) - implementation(project(":orx-image-fit")) - implementation(project(":orx-shapes")) - implementation(project(":orx-camera")) - demoImplementation(project(":orx-camera")) - demoImplementation(project(":orx-noise")) - demoImplementation(project(":orx-parameters")) - demoImplementation(project(":orx-jvm:orx-axidraw")) -} diff --git a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw01.kt b/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw01.kt deleted file mode 100644 index 3e869020..00000000 --- a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw01.kt +++ /dev/null @@ -1,59 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.axidraw.Axidraw -import org.openrndr.extra.axidraw.PaperSize -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.noise.uniform -import org.openrndr.extra.parameters.ActionParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.IntParameter -import kotlin.math.min - -/** - * Demonstrates: - * - how to create an AxiDraw GUI - * - how to add a slider and a button to that GUI - * - how to include code to generate new random designs that match - * the paper size via `axi.bounds`. - * - how to display the generated design using `axi.display`. - * - * Toggle the GUI by pressing F11. - */ -fun main() = application { - configure { - width = PaperSize.A5.size.x * 5 - height = PaperSize.A5.size.y * 5 - } - program { - val axi = Axidraw(this, PaperSize.A5) - axi.resizeWindow() - - val gui = GUI() - gui.add(axi) - - val settings = @Description("Main") object { - @IntParameter("count", 1, 50) - var count = 20 - - @ActionParameter("generate") - fun generate() { - axi.clear() - axi.draw { - val l = min(axi.bounds.width, axi.bounds.height) / 2.0 - repeat(count) { - circle(axi.bounds.center, Double.uniform(l / 4.0, l)) - } - } - } - } - gui.add(settings) - - settings.generate() - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw02.kt b/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw02.kt deleted file mode 100644 index 60bc2b4b..00000000 --- a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw02.kt +++ /dev/null @@ -1,45 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.axidraw.Axidraw -import org.openrndr.extra.axidraw.PaperOrientation -import org.openrndr.extra.axidraw.PaperSize -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.noise.uniform -import org.openrndr.extra.parameters.ActionParameter -import org.openrndr.extra.parameters.Description - -/** - * Demonstrates: - * - How to set the window size based on the chosen paper size. - * - How to use a windowed GUI. - * - */ -fun main() = application { - program { - val axi = Axidraw(this, PaperSize.A5, PaperOrientation.LANDSCAPE) - axi.resizeWindow() - - val gui = WindowedGUI() - gui.add(axi) - - val settings = @Description("Main") object { - - @ActionParameter("generate") - fun generate() { - axi.clear() - axi.draw { - repeat(20) { - circle(axi.bounds.center, Double.uniform(50.0, 200.0)) - } - } - } - } - gui.add(settings) - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw03.kt b/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw03.kt deleted file mode 100644 index 9ee7ca5c..00000000 --- a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw03.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.axidraw.Axidraw -import org.openrndr.extra.axidraw.PaperOrientation -import org.openrndr.extra.axidraw.PaperSize -import org.openrndr.extra.axidraw.configure -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.noise.uniform -import org.openrndr.extra.shapes.primitives.grid - -/** - * Demonstrates: - * - How to create layers via `group` and give each layer - * a unique pen height and pen speed. - * - */ -fun main() = application { - program { - val axi = Axidraw(this, PaperSize.A5, PaperOrientation.PORTRAIT) - axi.resizeWindow(100.0) - - val gui = WindowedGUI() - gui.add(axi) - - axi.clear() - axi.draw { - fill = null - axi.bounds.grid(4, 6).flatten().forEach { - group { - circle(it.center, 50.0) - }.configure( - penHeight = Int.uniform(30, 60), - penSpeed = Int.uniform(20, 50) - ) - } - } - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw04.kt b/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw04.kt deleted file mode 100644 index 59f643b8..00000000 --- a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw04.kt +++ /dev/null @@ -1,48 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.axidraw.* -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.shapes.primitives.grid - -/** - * Demonstrates: - * - How to create a flattened grid of with 24 items - * - How to randomize the order of those items - * - How to take chunks of 10 items, then make - * a pause to change the pen after plotting each chunk - * - * Operation: After plotting ten circles, plotting will stop to let you change the pen. - * With the second pen installed, click `resume`. It will plot ten circles more. - * Change the pen again and click `resume` to plot the remaining 4 circles. - * Once done, click `resume` one more time to bring the pen home. - */ -fun main() = application { - program { - val axi = Axidraw(this, PaperSize.A5, PaperOrientation.PORTRAIT) - axi.resizeWindow(100.0) - - val gui = WindowedGUI() - gui.add(axi) - - axi.clear() - axi.draw { - fill = null - axi.bounds.grid(4, 6).flatten() - .shuffled().chunked(10).forEach { chunk -> - group { - chunk.forEach { - circle(it.center, 50.0) - } - } - group { - }.configure(layerMode = AxiLayerMode.PAUSE) - } - } - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw05.kt b/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw05.kt deleted file mode 100644 index a6506043..00000000 --- a/orx-jvm/orx-axidraw/src/demo/kotlin/DemoAxidraw05.kt +++ /dev/null @@ -1,46 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.axidraw.Axidraw -import org.openrndr.extra.axidraw.PaperOrientation -import org.openrndr.extra.axidraw.PaperSize -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.shapes.primitives.grid - -/** - * Demonstrates: - * - How to create a flattened grid of with 24 items - * - How to apply random colors from a palette to each item. - * - How to use `groupStrokeColors()` to plot a multi-pen design. - * - */ -fun main() = application { - program { - val axi = Axidraw(this, PaperSize.A5, PaperOrientation.PORTRAIT) - axi.resizeWindow(100.0) - - val gui = WindowedGUI() - gui.add(axi) - - val palette = listOf( - ColorRGBa.RED, - ColorRGBa.GREEN, - ColorRGBa.BLUE - ) - - axi.clear() - axi.draw { - fill = null - axi.bounds.grid(4, 6).flatten().forEach { - stroke = palette.random() - circle(it.center, 50.0) - } - } - axi.groupStrokeColors() - - extend(gui) - extend { - drawer.clear(ColorRGBa.WHITE) - axi.display(drawer) - } - } -} diff --git a/orx-jvm/orx-axidraw/src/main/kotlin/Axidraw.kt b/orx-jvm/orx-axidraw/src/main/kotlin/Axidraw.kt deleted file mode 100644 index 39c51c8e..00000000 --- a/orx-jvm/orx-axidraw/src/main/kotlin/Axidraw.kt +++ /dev/null @@ -1,506 +0,0 @@ -package org.openrndr.extra.axidraw - -import io.github.oshai.kotlinlogging.KotlinLogging -import offset.offset -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.dialogs.openFileDialog -import org.openrndr.dialogs.saveFileDialog -import org.openrndr.draw.Drawer -import org.openrndr.draw.isolated -import org.openrndr.extra.camera.Camera2D -import org.openrndr.extra.composition.* -import org.openrndr.extra.imageFit.fit -import org.openrndr.extra.parameters.* -import org.openrndr.extra.svg.loadSVG -import org.openrndr.extra.svg.toSVG -import org.openrndr.math.IntVector2 -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.shape.IntRectangle -import org.openrndr.shape.SegmentJoin -import org.openrndr.shape.Shape -import java.io.File -import java.util.* -import kotlin.io.path.createTempFile - -private val logger = KotlinLogging.logger {} - -/** - * Axidraw reordering optimization types. - * See: https://axidraw.com/doc/cli_api/#reordering - */ -@Suppress("unused") -enum class AxidrawOptimizationTypes(val id: Int) { - /** - * No optimization. Strictly preserve file order. - */ - None(4), - - /** - * Least; Only connect adjoining paths. - */ - ConnectPaths(0), - - /** - * Basic; Also reorder paths for speed - */ - ReorderPaths(1), - - /** - * Full; Also allow path reversal - */ - ReversePaths(2) -} - -@Suppress("unused") -enum class AxidrawModel(val id: Int) { - AxiDrawV2(1), - AxidrawV3(1), - AxidrawSE_A4(1), - AxiDrawV3_A3(2), - AxidrawSE_A3(2), - AxiDrawV3_XLX(3), - AxiDrawMiniKit(4), - AxiDrawSE_A1(5), - AxiDrawSE_A2(6), - AxiDrawV3_B6(7), -} - -@Suppress("unused") -enum class AxidrawServo(val id: Int) { - Standard(2), - Brushless(3), -} - -@Suppress("unused") -enum class PaperSize(val size: IntVector2) { - `A-1`(IntVector2(1682, 2378)), - `A-2`(IntVector2(1189, 1682)), - A0(IntVector2(841, 1189)), - A1(IntVector2(594, 841)), - A2(IntVector2(420, 594)), - A3(IntVector2(297, 420)), - A4(IntVector2(210, 297)), - A5(IntVector2(148, 210)), - A6(IntVector2(105, 148)), - A7(IntVector2(74, 105)), - A8(IntVector2(52, 74)), - A9(IntVector2(37, 52)), - A10(IntVector2(26, 37)) -} - -enum class PaperOrientation { - LANDSCAPE, - PORTRAIT -} - -/** - * Class to talk to the axicli command line program - * - */ -@Description("Axidraw") -class Axidraw(val program: Program, paperSize: PaperSize, orientation: PaperOrientation = PaperOrientation.PORTRAIT) { - - fun setupAxidrawCli() { - - if (!File("axidraw-venv").exists()) { - logger.info { "installing axidraw-cli virtual environment" } - invokePython(listOf("-m", "venv", "axidraw-venv")) - } - val python = venvPython(File("axidraw-venv")) - logger.info { "installing axidraw-cli in virtual environment $python" } - invokePython( - listOf("-m", "pip", "install", "https://cdn.evilmadscientist.com/dl/ad/public/AxiDraw_API.zip"), - python - ) - } - - init { - setupAxidrawCli() - } - - val actualPaperSize = when (orientation) { - PaperOrientation.LANDSCAPE -> paperSize.size.yx.vector2 - PaperOrientation.PORTRAIT -> paperSize.size.vector2 - } - - /** - * API URL to call once plotting is complete. If the string contains - * `[filename]` it will be replaced by the name of the file being plotted. - * This URL should be URL encoded (for instance use %20 instead of a space). - */ - var apiURL = "" - - @OptionParameter("model", 50) - var model = AxidrawModel.AxiDrawV3_A3 - - @OptionParameter("servo", 60) - var servo = AxidrawServo.Standard - - @IntParameter("speed pen down", 1, 110, 100) - var speedPenDown = 25 - - @IntParameter("speed pen up", 1, 110, 110) - var speedPenUp = 70 - - @IntParameter("acceleration", 1, 100, 120) - var acceleration = 75 - - /** - * Toggle the pen up/down state by powering the pen plotter servo. - * Useful for calibrating the pen height. Cover the paper with a - * plastic sheet before running this command to avoid accidentally - * leaving ink on the paper. - */ - @ActionParameter("toggle up/down", 125) - fun toggleUpDown() { - runCMD( - listOf( - "--mode", "toggle", - "--penlift", servo.id.toString(), - "--model", model.id.toString(), - "--pen_pos_down", "$penPosDown", - "--pen_pos_up", "$penPosUp", - ), false - ) - } - - @IntParameter("pen pos down", 1, 100, 130) - var penPosDown = 40 - - @IntParameter("pen pos up", 1, 100, 140) - var penPosUp = 60 - - @IntParameter("pen rate lower", 1, 100, 150) - var penRateLower = 50 - - @IntParameter("pen rate raise", 1, 100, 160) - var penRateRaise = 75 - - @IntParameter("pen delay down", -500, 500, 170) - var penDelayDown = 0 - - @IntParameter("pen delay up", -500, 500, 180) - var penDelayUp = 0 - - @OptionParameter("optimization", 185) - var optimization = AxidrawOptimizationTypes.ConnectPaths - - @BooleanParameter("random start", 190) - var randomStart = false - - @BooleanParameter("fills occlude strokes", 200) - var occlusion = false - - @IntParameter("margin", 0, 100, 205) - var margin = 0 - - @BooleanParameter("preview", 210) - var preview = false - - @BooleanParameter("const speed", 220) - var constSpeed = false - - @BooleanParameter("webhook", 230) - var webhook = false - - /** - * Creates a temporary SVG file. Used by the AxiCLI "resume" methods. When plotting, - * the temporary SVG file is updated to keep track of progress and allow resuming. - */ - private fun makeTempSVGFile(): File { - val tmpFile = createTempFile("axi_${UUID.randomUUID()}", ".svg").toFile() - tmpFile.deleteOnExit() - return tmpFile - } - - /** - * Keeps track of the most recent output file. Used to resume plotting after a pause. - */ - private var lastOutputFile = makeTempSVGFile() - - private fun plotArgs(plotFile: File, outputFile: File): List { - lastOutputFile = outputFile - return listOf( - plotFile.absolutePath, - "--progress", - "--report_time", - "--reordering", optimization.id.toString(), - if (randomStart) "--random_start" else "", - if (occlusion) "--hiding" else "", - if (preview) "--preview" else "", - if (webhook && apiURL.isNotEmpty()) - "--webhook" else "", - if (webhook && apiURL.isNotEmpty()) - "--webhook_url ${apiURL.replace("[filename]", plotFile.name)}" else "", - "--speed_pendown", "$speedPenDown", - "--speed_penup", "$speedPenUp", - "--accel", "$acceleration", - if (constSpeed) "--const_speed" else "", - "--pen_pos_down", "$penPosDown", - "--pen_pos_up", "$penPosUp", - "--pen_rate_lower", "$penRateLower", - "--pen_rate_raise", "$penRateRaise", - "--pen_delay_down", "$penDelayDown", - "--pen_delay_up", "$penDelayUp", - "--penlift", servo.id.toString(), - "--model", model.id.toString(), - "--output_file", outputFile.absolutePath, - ).filter { it.isNotEmpty() } - } - - private fun compositionDimensions(): CompositionDimensions { - return CompositionDimensions( - 0.0.pixels, - 0.0.pixels, - Length.Pixels.fromMillimeters(actualPaperSize.x), - Length.Pixels.fromMillimeters(actualPaperSize.y) - ) - } - - /** - * Main variable holding the design to save or plot. - */ - private val design = drawComposition(compositionDimensions()) { } - - /** - * Returns the bounds of the drawable area so user code can draw things - * whithout leaving the paper. - */ - val bounds = IntRectangle( - 0, 0, - (96.0 * actualPaperSize.x / 25.4).toInt(), - (96.0 * actualPaperSize.y / 25.4).toInt() - ).rectangle - - /** - * Clears the current design wiping any shapes the user might have - * added. - * - */ - fun clear() = design.clear() - - /** - * The core method that allows the user to append content to the design. - * Use any methods and properties like contour(), segment(), fill, stroke, etc. - */ - fun draw(f: CompositionDrawer.() -> Unit) { - design.draw(drawFunction = f) - } - - private fun runCMD(args: List, hold: Boolean = true) { - val python = venvPython(File("axidraw-venv")) - invokePython(listOf("-m", "axicli") + args, python) - } - - /** - * Display Axidraw software version - */ - @ActionParameter("info: version", 300) - fun version() = runCMD(listOf("--mode", "version")) - - /** - * Display Axidraw system info - */ - @ActionParameter("info: system", 310) - fun sysInfo() = runCMD(listOf("--mode", "sysinfo")) - - @ActionParameter("load", 330) - fun onLoad() = openFileDialog(supportedExtensions = listOf("SVG" to listOf("svg"))) { - clear() - camera.view = Matrix44.IDENTITY - val loaded = loadSVG(it) - draw { - loaded.findGroups().forEach { gn -> - if (gn.findGroups().size == 1) { - val g = group { - gn.findShapes().forEach { shp -> - if (shp.attributes["type"] != "margin") { - stroke = shp.stroke - fill = shp.fill - shape(shp.shape) - } - } - } - g.attributes.putAll(gn.attributes) - } - } - } - } - - /** - * Save current design as SVG - */ - @ActionParameter("save", 340) - fun onSave() = saveFileDialog(supportedExtensions = listOf("SVG" to listOf("svg"))) { save(it) } - - private fun save(svgFile: File) { - // Create a new SVG with the frame and camera applied - val designRendered = drawComposition(compositionDimensions()) { - val m = camera.view - - design.findGroups().forEach { gn -> - if (gn.findGroups().size == 1) { - val g = group { - gn.findShapes().forEach { shp -> - stroke = shp.stroke - fill = shp.fill - shape(shp.shape.transform(m)) - } - } - g.attributes.putAll(gn.attributes) - } - } - - // If the user wants a frame covering the design... - if (occlusion) { - fill = ColorRGBa.WHITE - stroke = null - shape(makeFrame(margin.toDouble()))?.attributes?.put("type", "margin") - } - } - designRendered.saveToInkscapeFile(svgFile) - } - - /** - * Plot design using the current settings - */ - @ActionParameter("plot", 350) - fun onPlot() { - val svgFile = makeTempSVGFile() - save(svgFile) - runCMD(plotArgs(svgFile, makeTempSVGFile())) - } - - /** - * After hitting pause, use this to move the pen home - */ - @ActionParameter("resume to home", 360) - fun goHome() { - runCMD(plotArgs(lastOutputFile, makeTempSVGFile()) + listOf("--mode", "res_home")) - } - - /** - * After hitting pause, use this to continue plotting - * - */ - @ActionParameter("resume plotting", 370) - fun resume() { - runCMD(plotArgs(lastOutputFile, makeTempSVGFile()) + listOf("--mode", "res_plot")) - } - - /** - * Optimization. This can be applied to a lambda function that takes one argument - * so it caches the calculation while the argument does not change. - */ - private fun ((A) -> B).lastArgMemo(): (A) -> B { - var lastArg: A? = null - var lastResult: B? = null - - return { arg -> - if (arg == lastArg) { - @Suppress("UNCHECKED_CAST") - lastResult as B - } else { - val result = this(arg) - lastArg = arg - lastResult = result - result - } - } - } - - /** - * Makes a white frame to cover the borders of the page, to avoid plotting - * on the edge of papers, which may damage the pen or make a mess. - */ - private val makeFrame = { width: Double -> - Shape( - listOf( - bounds.contour.offset(1000.0, SegmentJoin.MITER), - bounds.contour.offset(-width).reversed - ) - ) - }.lastArgMemo() - - /** - * Display the composition using [drawer]. - */ - fun display(drawer: Drawer) { - drawer.isolated { - view *= bounds.fit(drawer.bounds) - - isolated { - view *= camera.view - composition(design) - } - - // Draw frame - if (occlusion) { - fill = ColorRGBa.WHITE - stroke = null - shape(makeFrame(margin.toDouble())) - } - } - } - - /** - * Resizes the program window to match - * the paper size according to the - * [ppi] (Pixels Per Inch) value. - */ - fun resizeWindow(ppi: Double = 96.0) { - val app = program.application - val resizable = app.windowResizable - app.windowResizable = true - app.windowSize = Vector2( - ppi * actualPaperSize.x / 25.4, - ppi * actualPaperSize.y / 25.4 - ) - app.windowResizable = resizable - } - - val camera by lazy { - Camera2D().also { - it.setup(program) - } - } - - /** - * Rebuilds the design putting shapes under groups based on stroke colors and inserts a pause - * after each group. - * - * Call this method after creating a draw composition that uses several stroke colors. - * When plotting, change pens after each pause, then click "resume plotting". - * - * NOTE: this method changes line order. Therefore, avoid it if order is important, - * for instance with designs using fill colors to occlude. - * - */ - fun groupStrokeColors() { - val colorGroups = design.findShapes().filter { it.stroke != null }.groupBy { it.stroke!! } - design.clear() - design.draw { - var i = 0 - colorGroups.forEach { (color, nodes) -> - val hexColor = "%06x".format( - ((color.r * 255).toInt() shl 16) + ((color.g * 255).toInt() shl 8) + ((color.b * 255).toInt()) - ) - group { cursor.children.addAll(nodes) }.configure(hexColor) - - // Add a pause if it's not the last layer - if(++i < colorGroups.size) { - group { }.configure(layerMode = AxiLayerMode.PAUSE) - } - } - } - } - - /** - * Read-only String variable to inspect the current design in SVG format for debugging purposes. - */ - var svg: String = "" - get() = design.toSVG() - private set -} diff --git a/orx-jvm/orx-axidraw/src/main/kotlin/SVG.kt b/orx-jvm/orx-axidraw/src/main/kotlin/SVG.kt deleted file mode 100644 index ec5bf438..00000000 --- a/orx-jvm/orx-axidraw/src/main/kotlin/SVG.kt +++ /dev/null @@ -1,122 +0,0 @@ -package org.openrndr.extra.axidraw -import org.openrndr.extra.composition.Composition -import org.openrndr.extra.composition.GroupNode -import org.openrndr.extra.composition.findGroups -import org.openrndr.extra.svg.toSVG -import java.io.File - -/** - * Axidraw layer mode. The [command] argument will be prepended to the layer name. - */ -@Suppress("unused") -enum class AxiLayerMode(val command: String) { - /** - * The default mode prepends nothing. - */ - DEFAULT(""), - - /** - * Layer names starting with `%` are not plotted. - */ - IGNORE("%"), - - /** - * Layer names starting with `!` trigger a pause. - */ - PAUSE("!") -} - -/** - * Configure an SVG layer name. Certain character sequences are used - * by the Axidraw software to control layer speed, height and delay. - * Other characters make the layer be ignored, or trigger a pause. - * The arguments in this function provide a typed approach to construct - * the layer name. - * See https://wiki.evilmadscientist.com/AxiDraw_Layer_Control - * - * @param layerName Human-readable layer name. Multiple layer can use the same name. - * @param penSpeed Pen down speed (1..100) - * @param penHeight Pen down height (0..100) - * @param plotDelay Delay before plotting this layer, in milliseconds - * @param layerMode The plotting mode for this layer. See [AxiLayerMode]. - */ -fun GroupNode.configure( - layerName: String = "layer", - penSpeed: Int? = null, - penHeight: Int? = null, - plotDelay: Int? = null, - layerMode: AxiLayerMode = AxiLayerMode.DEFAULT -) { - val layerNumber = (parent?.findGroups()?.size ?: 2) - 1 - - require(penSpeed == null || penSpeed in 1..100) { "Speed out of 1 .. 100 range" } - val actualSpeed = penSpeed?.let { "+S$it" } ?: "" - - require(penHeight == null || penHeight in 0..100) { "Height out of 0 .. 100 range" } - val actualHeight = penHeight?.let { "+H$it" } ?: "" - - require(plotDelay == null || plotDelay > 0) { "Delay value should null or above 0" } - val actualDelay = plotDelay?.let { "+D$it" } ?: "" - - attributes["inkscape:groupmode"] = "layer" - - attributes["inkscape:label"] = layerMode.command + layerNumber + - actualSpeed + actualHeight + actualDelay + " " + layerName -} - -/** - * Save a [Composition] to an Inkscape file. Includes expected XML namespaces - * and sets an XML header with the view window size. Strips an extra wrapping `` tag to - * make special layer names work with the Axidraw pen plotter. - * - * @param file Should point to the desired file name and path. - * @param postProcess Optional function to do post-processing on the SVG XML before saving it. - */ -fun Composition.saveToInkscapeFile( - file: File, - postProcess: (String) -> String = { xml -> xml } -) { - namespaces["xmlns:inkscape"] = "http://www.inkscape.org/namespaces/inkscape" - namespaces["xmlns:sodipodi"] = "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - namespaces["xmlns:svg"] = "http://www.w3.org/2000/svg" - - val svg = StringBuilder(toSVG()) - - val header = """ - - """.trimIndent() - - // Remove the wrapping , otherwise layers don't work. - // Also remove duplicated and which show up when - // drawing a composition into another composition. - val updated = svg.replace( - Regex("""((.*))""", RegexOption.DOT_MATCHES_ALL), "$2" - ).replace( - "(\\W?)+)+".toRegex(setOf(RegexOption.MULTILINE, RegexOption.DOT_MATCHES_ALL)), - "\n" - ).replace( - Regex("""()""", RegexOption.DOT_MATCHES_ALL), "$1$header" - ) - file.writeText(postProcess(updated)) -} diff --git a/orx-jvm/orx-axidraw/src/main/kotlin/python.kt b/orx-jvm/orx-axidraw/src/main/kotlin/python.kt deleted file mode 100644 index 727136be..00000000 --- a/orx-jvm/orx-axidraw/src/main/kotlin/python.kt +++ /dev/null @@ -1,71 +0,0 @@ -package org.openrndr.extra.axidraw - -import java.io.BufferedInputStream -import java.io.File -import java.io.IOException - -/** - * Determines the appropriate Python executable name based on the operating system. - * - * On Windows systems, it returns "python.exe", while on other operating systems, it returns "python3". - * - * @return The name of the Python executable appropriate for the current operating system. - */ -fun systemPython(): String { - val executable = if (System.getProperty("os.name").lowercase().contains("windows")) { - "python.exe" - } else { - "python3" - } - return executable -} - -/** - * Returns the path to the Python executable in a given virtual environment. - * The path varies depending on the operating system. - * - * @param venv the directory of the virtual environment - * @return the absolute path to the Python executable within the virtual environment - */ -fun venvPython(venv: File): String { - val executable = if (System.getProperty("os.name").lowercase().contains("windows")) { - "${venv.absolutePath}/Scripts/python.exe" - } else { - "${venv.absolutePath}/bin/python" - } - return executable -} - - -fun invokePython(arguments: List, executable: String = systemPython()): String { - val result: String - try { - - val pb = ProcessBuilder() - .let { - it.command(listOf(executable) + arguments) - //it.redirectError(File("python.error.txt")) - it.inheritIO() - } - .start() - .let { - val `is` = it.inputStream - val bis = BufferedInputStream(`is`) - val br = bis.bufferedReader() - result = br.readText().trim() - val error = it.waitFor() - println("Python returned: $error") - - // Error detection disabled because pressing the pause button on the Axidraw - // returns "1", and we don't want the program to close when that happens. - // There's no obvious way to distinguish between actual errors and pressing the pause button. - // if (error != 0) { - // error("Python invoke failed with error $error") - // } - } - } catch (e: IOException) { - error("\n\nPython 3.8 or higher is required but failed to run. Is it installed?\n\n") - } - - return result -} diff --git a/orx-jvm/orx-boofcv/README.md b/orx-jvm/orx-boofcv/README.md deleted file mode 100644 index be621267..00000000 --- a/orx-jvm/orx-boofcv/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# orx-boofcv - -Helper functions to ease working with the BoofCV computer vision library -and its data types. - -BoofCV is an open source library written from scratch for real-time -computer vision. Its functionality covers a range of subjects, -low-level image processing, camera calibration, feature detection/tracking, -structure-from-motion, fiducial detection, and recognition. -BoofCV has been released under an Apache 2.0 license for both -academic and commercial use. - -Examples of what BoofCV offers can be found at -[http://boofcv.org/](http://boofcv.org/) - -As BoofCV implements it's own data types for images, lines, points, etc. -this addon provides some helper functions to convert them to OPENRNDR types: - -- Bindings: converts to and from `ColorBuffer`. -- Drawing: allows directly drawing BoofCV line segments and other shapes. -- Point conversion to and from `Vector2`. -- Contour conversion from `BoofCV.Contour` to `Shape` and `ShapeContour`. -- `ImageFlow` to `ColorBuffer` conversion. - - -## Demos -### DemoContours01 - -Demonstrates how to convert a PNG image into `ShapeContour`s using BoofCV. - -Two helper methods help convert data types between BoofCV and OPENRNDR. - -The `ColorBuffer.toGrayF32()` method converts an OPENRNDR `ColorBuffer` to `GrayF32` format, -required by BoofCV. - -The `.toShapeContours()` converts BoofCV contours to OPENRNDR `ShapeContour` instances. - -The resulting contours are animated zooming in and out while their colors change slowly. - -![DemoContours01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-boofcv/images/DemoContours01Kt.png) - -[source code](src/demo/kotlin/DemoContours01.kt) - -### DemoResize01 - -Demonstrates how to scale down images using the `resizeBy` BoofCV-based -method. - -![DemoResize01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-boofcv/images/DemoResize01Kt.png) - -[source code](src/demo/kotlin/DemoResize01.kt) - -### DemoResize02 - -Demonstrates how to scale down images using the `resizeTo` BoofCV-based -method. - -If only the `newWidth` or the `newHeight` arguments are specified, -the resizing happens maintaining the original aspect ratio. - -![DemoResize02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-boofcv/images/DemoResize02Kt.png) - -[source code](src/demo/kotlin/DemoResize02.kt) - -### DemoSimplified01 - -When converting a `ColorBuffer` to `ShapeContour` instances using -`BoofCV`, simple shapes can have hundreds of segments and vertices. - -This demo shows how to use the `simplify()` method to greatly -reduce the number of vertices. - -Then it uses the simplified vertex lists to create smooth curves -(using `CatmullRomChain2`) and polygonal curves (using `ShapeContour.fromPoints`). - -Study the console to learn about the number of segments before and after simplification. - -![DemoSimplified01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-boofcv/images/DemoSimplified01Kt.png) - -[source code](src/demo/kotlin/DemoSimplified01.kt) diff --git a/orx-jvm/orx-boofcv/build.gradle.kts b/orx-jvm/orx-boofcv/build.gradle.kts deleted file mode 100644 index 9b0fa324..00000000 --- a/orx-jvm/orx-boofcv/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - demoImplementation(project(":orx-shapes")) - api(libs.boofcv) -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoContours01.kt b/orx-jvm/orx-boofcv/src/demo/kotlin/DemoContours01.kt deleted file mode 100644 index 8219c07b..00000000 --- a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoContours01.kt +++ /dev/null @@ -1,79 +0,0 @@ -import boofcv.alg.filter.binary.BinaryImageOps -import boofcv.alg.filter.binary.GThresholdImageOps -import boofcv.alg.filter.binary.ThresholdImageOps -import boofcv.struct.ConnectRule -import boofcv.struct.image.GrayU8 -import org.openrndr.application -import org.openrndr.boofcv.binding.toGrayF32 -import org.openrndr.boofcv.binding.toShapeContours -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.loadImage -import kotlin.math.cos -import kotlin.math.sin - -/** - * Demonstrates how to convert a PNG image into `ShapeContour`s using BoofCV. - * - * Two helper methods help convert data types between BoofCV and OPENRNDR. - * - * The `ColorBuffer.toGrayF32()` method converts an OPENRNDR `ColorBuffer` to `GrayF32` format, - * required by BoofCV. - * - * The `.toShapeContours()` converts BoofCV contours to OPENRNDR `ShapeContour` instances. - * - * The resulting contours are animated zooming in and out while their colors change slowly. - */ -fun main() = application { - program { - // Load an image, convert to BoofCV format using orx-boofcv - val input = loadImage("demo-data/images/image-001.png").toGrayF32() - - // BoofCV: calculate a good threshold for the loaded image - val threshold = GThresholdImageOps.computeOtsu(input, 0.0, 255.0) - - // BoofCV: use the threshold to convert the image to black and white - val binary = GrayU8(input.width, input.height) - ThresholdImageOps.threshold(input, binary, threshold.toFloat(), false) - - // BoofCV: Contract and expand the white areas to remove noise - var filtered = BinaryImageOps.erode8(binary, 1, null) - filtered = BinaryImageOps.dilate8(filtered, 1, null) - - // BoofCV: Calculate contours as vector data - val contours = BinaryImageOps.contour(filtered, ConnectRule.EIGHT, null) - - // orx-boofcv: convert vector data to OPENRNDR ShapeContours - val externalShapes = contours.toShapeContours( - true, - internal = false, external = true - ) - val internalShapes = contours.toShapeContours( - true, - internal = true, external = false - ) - - extend { - drawer.run { - // Zoom in and out over time - translate(bounds.center) - scale(1.5 + 0.5 * cos(seconds * 0.2)) - translate(-bounds.center) - - stroke = null - - // Draw all external shapes - fill = rgb(0.2) - contours(externalShapes) - - // Draw internal shapes one by one to set unique colors - internalShapes.forEachIndexed { i, shp -> - val shade = 0.2 + (i % 7) * 0.1 + - 0.1 * sin(i + seconds) - fill = ColorRGBa.PINK.shade(shade) - contour(shp) - } - } - } - } -} diff --git a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize01.kt b/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize01.kt deleted file mode 100644 index ca1e6f69..00000000 --- a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize01.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.openrndr.application -import org.openrndr.boofcv.binding.resizeBy -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadImage -import org.openrndr.math.Vector2 - -/** - * Demonstrates how to scale down images using the `resizeBy` BoofCV-based - * method. - */ -fun main() = application { - program { - val input = loadImage("demo-data/images/image-001.png") - - val scaled = input.resizeBy(0.5) - val scaled2 = input.resizeBy(0.25, convertToGray = true) - val scaled3 = input.resizeBy(0.1) - - println("${input.width} x ${input.height}") - println("${scaled.width} x ${scaled.height}") - - extend { - drawer.clear(ColorRGBa.BLACK) - drawer.translate(0.0, (height - scaled.bounds.height) / 2.0) - - // Display the loaded image to the right of `scaled` matching its size - drawer.image(input, scaled.bounds.movedBy(Vector2.UNIT_X * scaled.bounds.width)) - - // Display actually scaled down versions of the loaded image - drawer.image(scaled) - drawer.image(scaled2, scaled.bounds.width, scaled.bounds.height - scaled2.height) - drawer.image(scaled3, scaled.bounds.width + scaled2.bounds.width, scaled.bounds.height - scaled3.height) - } - } -} diff --git a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize02.kt b/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize02.kt deleted file mode 100644 index 283daa3d..00000000 --- a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoResize02.kt +++ /dev/null @@ -1,34 +0,0 @@ -import org.openrndr.application -import org.openrndr.boofcv.binding.resizeTo -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadImage - -/** - * Demonstrates how to scale down images using the `resizeTo` BoofCV-based - * method. - * - * If only the `newWidth` or the `newHeight` arguments are specified, - * the resizing happens maintaining the original aspect ratio. - */ -fun main() = application { - program { - val input = loadImage("demo-data/images/image-001.png") - - val scaled = input.resizeTo(input.width / 3) - val scaled2 = input.resizeTo(newHeight = input.height / 4, convertToGray = true) - val scaled3 = input.resizeTo(input.width / 5, input.height / 5) - - println("${input.width} x ${input.height}") - println("${scaled.width} x ${scaled.height}") - - extend { - drawer.clear(ColorRGBa.BLACK) - drawer.translate(0.0, (height - scaled.bounds.height) / 2.0) - - // Display actually scaled down versions of the loaded image - drawer.image(scaled) - drawer.image(scaled2, scaled.bounds.width, scaled.bounds.height - scaled2.height) - drawer.image(scaled3, scaled.bounds.width + scaled2.bounds.width, scaled.bounds.height - scaled3.height) - } - } -} diff --git a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoSimplified01.kt b/orx-jvm/orx-boofcv/src/demo/kotlin/DemoSimplified01.kt deleted file mode 100644 index 67879418..00000000 --- a/orx-jvm/orx-boofcv/src/demo/kotlin/DemoSimplified01.kt +++ /dev/null @@ -1,118 +0,0 @@ -import boofcv.alg.filter.binary.BinaryImageOps -import boofcv.alg.filter.binary.GThresholdImageOps -import boofcv.alg.filter.binary.ThresholdImageOps -import boofcv.struct.ConnectRule -import boofcv.struct.image.GrayU8 -import org.openrndr.application -import org.openrndr.boofcv.binding.toGrayF32 -import org.openrndr.boofcv.binding.toShapeContours -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.renderTarget -import org.openrndr.extra.shapes.simplify.simplify -import org.openrndr.extra.shapes.splines.CatmullRomChain2 -import org.openrndr.extra.shapes.splines.toContour -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle -import org.openrndr.shape.ShapeContour - -/** - * When converting a `ColorBuffer` to `ShapeContour` instances using - * `BoofCV`, simple shapes can have hundreds of segments and vertices. - * - * This demo shows how to use the `simplify()` method to greatly - * reduce the number of vertices. - * - * Then it uses the simplified vertex lists to create smooth curves - * (using `CatmullRomChain2`) and polygonal curves (using `ShapeContour.fromPoints`). - * - * Study the console to learn about the number of segments before and after simplification. - */ -fun main() = application { - program { - // Create a buffer where to draw something for boofcv - val rt = renderTarget(width, height) { - colorBuffer() - depthBuffer() - } - // Draw some shapes on that buffer - drawer.isolatedWithTarget(rt) { - clear(ColorRGBa.BLACK) - fill = ColorRGBa.WHITE - stroke = null - rectangle( - Rectangle.fromCenter( - bounds.position(0.33, 0.5), - 150.0, 150.0 - ) - ) - translate(bounds.position(0.62, 0.5)) - rotate(30.0) - rectangle(Rectangle.fromCenter(Vector2.ZERO, 200.0, 200.0)) - rectangle(0.0, -200.0, 60.0, 60.0) - circle(0.0, 190.0, 60.0) - } - - // Convert the bitmap buffer into ShapeContours - val vectorized = imageToContours(rt.colorBuffer(0)) - - // Print the number of segments in each shape (high number) - vectorized.forEachIndexed { i, it -> - println("boofcv shape $i: ${it.segments.size} segments") - } - - // Make a simplified list of points - val simplePoints = vectorized.map { - simplify(it.adaptivePositions(), 4.0) - }.filter { it.size >= 3 } - - // Use the simplified list to make a smooth contour - val smooth = simplePoints.map { - CatmullRomChain2(it, 0.0, true).toContour() - } - - // Use the simplified list to make a polygonal contour - val polygonal = simplePoints.map { - ShapeContour.fromPoints(it, true) - } - - // Print the number of segments in simplified shapes (low number). - // Note: `smooth` and `polygonal` have the same number of segments - smooth.forEachIndexed { i, it -> - println("simplified shape $i: ${it.segments.size} segments") - } - - extend { - drawer.run { - fill = null // ColorRGBa.PINK.opacify(0.15) - - stroke = ColorRGBa.PINK.opacify(0.7) - contours(polygonal) - - stroke = ColorRGBa.GREEN.opacify(0.7) - contours(smooth) - } - } - } -} - -fun imageToContours(input: ColorBuffer): List { - val bitmap = input.toGrayF32() - // BoofCV: calculate a good threshold for the loaded image - val threshold = GThresholdImageOps.computeOtsu(bitmap, 0.0, 255.0) - - // BoofCV: use the threshold to convert the image to black and white - val binary = GrayU8(bitmap.width, bitmap.height) - ThresholdImageOps.threshold(bitmap, binary, threshold.toFloat(), false) - - // BoofCV: Contract and expand the white areas to remove noise - var filtered = BinaryImageOps.erode8(binary, 1, null) - filtered = BinaryImageOps.dilate8(filtered, 1, null) - - // BoofCV: Calculate contours as vector data - val contours = BinaryImageOps.contour(filtered, ConnectRule.EIGHT, null) - - // orx-boofcv: convert vector data to OPENRNDR ShapeContours - return contours.toShapeContours(true, internal = true, external = true) -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/Binding.kt b/orx-jvm/orx-boofcv/src/main/kotlin/Binding.kt deleted file mode 100644 index e593ce46..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/Binding.kt +++ /dev/null @@ -1,186 +0,0 @@ -package org.openrndr.boofcv.binding - -import boofcv.struct.image.GrayF32 -import boofcv.struct.image.GrayF64 -import boofcv.struct.image.GrayU8 -import boofcv.struct.image.Planar -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer - -fun ColorBuffer.toGrayF32() : GrayF32 { - val p = GrayF32(width, height) - shadow.download() - - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val c = shadow.read(x, y) - p.data[offset] = (c.r * 255).toFloat() - offset++ - } - } - return p -} - -fun ColorBuffer.toGrayF64() : GrayF64 { - val p = GrayF64(width, height) - shadow.download() - - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val c = shadow.read(x, y) - p.data[offset] = (c.r * 255) - offset++ - } - } - return p -} - -fun ColorBuffer.toPlanarF32() : Planar { - val p = Planar(GrayF32::class.java, width, height, format.componentCount) - shadow.download() - - val bands = p.bands - - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val c = shadow.read(x, y) - bands[0].data[offset] = (c.r * 255).toFloat() - bands[1].data[offset] = (c.g * 255).toFloat() - bands[2].data[offset] = (c.b * 255).toFloat() - offset++ - } - } - return p -} - -fun ColorBuffer.toPlanarU8() : Planar { - val p = Planar(GrayU8::class.java, width, height, format.componentCount) - shadow.download() - - val bands = p.bands - - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val c = shadow.read(x, y) - bands[0].data[offset] = (c.r * 255).toInt().toByte() - bands[1].data[offset] = (c.g * 255).toInt().toByte() - bands[2].data[offset] = (c.b * 255).toInt().toByte() - offset++ - } - } - return p -} - -fun ColorBuffer.toGrayU8() : GrayU8 { - val p = GrayU8(width, height) - shadow.download() - - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val c = shadow.read(x, y) - p.data[offset] = (c.r * 255).toInt().coerceIn(0, 255).toByte() - offset++ - } - } - return p -} - - -fun GrayU8.toColorBuffer() : ColorBuffer { - val cb = colorBuffer(width, height, 1.0, ColorFormat.RGB, ColorType.UINT8) - val shadow = cb.shadow - shadow.buffer.rewind() - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val r = (data[offset].toInt() and 0xff).toDouble() / 255.0 - offset++ - shadow.write(x, y, ColorRGBa(r, r, r, 1.0)) - } - } - shadow.upload() - return cb -} - -fun GrayF32.toColorBuffer() : ColorBuffer { - val cb = colorBuffer(width, height, 1.0, ColorFormat.RGB, ColorType.FLOAT32) - val shadow = cb.shadow - shadow.buffer.rewind() - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val r = data[offset].toDouble() / 255.0 - offset++ - shadow.write(x, y, ColorRGBa(r, r, r)) - } - } - shadow.upload() - return cb -} - -fun Planar.toColorBuffer() : ColorBuffer { - val bandCount = bands.size - val format = when (bandCount) { - 1 -> ColorFormat.R - 2 -> ColorFormat.RG - 3 -> ColorFormat.RGB - 4 -> ColorFormat.RGBa - else -> throw IllegalArgumentException("only 1 to 4 bands supported") - } - - val bands = bands - val cb = colorBuffer(width, height, 1.0, format, ColorType.UINT8) - val shadow = cb.shadow - shadow.buffer.rewind() - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val r = (bands[0].data[offset].toInt() and 0xff).toDouble() / 255.0 - val g = if (bandCount >= 2) (bands[1].data[offset].toInt() and 0xff).toDouble() / 255.0 else 0.0 - val b = if (bandCount >= 3) (bands[2].data[offset].toInt() and 0xff).toDouble() / 255.0 else 0.0 - val a = if (bandCount >= 4) (bands[2].data[offset].toInt() and 0xff).toDouble() / 255.0 else 1.0 - offset++ - shadow.write(x, y, ColorRGBa(r, g, b, a)) - } - } - shadow.upload() - return cb -} - -@JvmName("grayF32ToColorBuffer") -fun Planar.toColorBuffer() : ColorBuffer { - val bandCount = bands.size - val format = when (bandCount) { - 1 -> ColorFormat.R - 2 -> ColorFormat.RG - 3 -> ColorFormat.RGB - 4 -> ColorFormat.RGBa - else -> throw IllegalArgumentException("only 1 to 4 bands supported") - } - - val bands = bands - val cb = colorBuffer(width, height, 1.0, format, ColorType.UINT8) - val shadow = cb.shadow - shadow.buffer.rewind() - var offset = 0 - for (y in 0 until height) { - for (x in 0 until width) { - val r = bands[0].data[offset] / 255.0 - val g = if (bandCount >= 2) bands[1].data[offset] / 255.0 else 0.0 - val b = if (bandCount >= 3) bands[2].data[offset] / 255.0 else 0.0 - val a = if (bandCount >= 4) bands[3].data[offset] / 255.0 else 1.0 - offset++ - shadow.write(x, y, ColorRGBa(r, g, b, a)) - } - } - shadow.upload() - return cb -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/ContourConversion.kt b/orx-jvm/orx-boofcv/src/main/kotlin/ContourConversion.kt deleted file mode 100644 index 89d3d185..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/ContourConversion.kt +++ /dev/null @@ -1,51 +0,0 @@ -package org.openrndr.boofcv.binding - -import boofcv.alg.filter.binary.Contour -import org.openrndr.shape.Shape -import org.openrndr.shape.ShapeContour - -fun Contour.toShape(closed: Boolean = false, getInternal: Boolean, getExternal: Boolean): Shape { - val contours = mutableListOf() - - if (getExternal) { - val externalPoints = external.toVector2s() - contours.addAll(listOf(ShapeContour.fromPoints(externalPoints, closed))) - } - if (getInternal) { - val internalCurves = internal.filter { it.size >= 3 }.map { it.toVector2s() } - contours.addAll(internalCurves.map { internalCurve -> - ShapeContour.fromPoints(internalCurve, closed) - }) - } - return Shape(contours) -} - -fun List.toShapes(closed: Boolean = false, - internal: Boolean = true, - external: Boolean = true): List { - return this.filter { it.external.size >= 3 }.map { - it.toShape(closed, internal, external) - } -} - -fun List.toShapeContours(closed: Boolean = false, - internal: Boolean = true, - external: Boolean = true): List { - val contours = mutableListOf() - this.forEach { contour -> - if(contour.external.size >= 3) { - if (external) { - val externalPoints = contour.external.toVector2s() - contours.add(ShapeContour.fromPoints(externalPoints, closed)) - } - if (internal) { - val internalCurves = contour.internal.filter { it.size >= 3 } - .map { it.toVector2s() } - internalCurves.forEach { internalContour -> - contours.add(ShapeContour.fromPoints(internalContour, closed)) - } - } - } - } - return contours -} diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/Distortion.kt b/orx-jvm/orx-boofcv/src/main/kotlin/Distortion.kt deleted file mode 100644 index 3b79b948..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/Distortion.kt +++ /dev/null @@ -1,70 +0,0 @@ -package org.openrndr.boofcv.binding - -import boofcv.abst.distort.FDistort -import boofcv.struct.image.ImageBase -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.ColorType -import kotlin.math.roundToInt - -fun >?> ImageBase.resizeBy(scaleX: Double, scaleY: Double = scaleX): T { - val scaled = this.createNew((this.width * scaleX).toInt(), (this.height * scaleY).toInt()) - - FDistort(this, scaled).scaleExt().apply() - - return scaled -} - -fun >?> ImageBase.resizeTo(newWidth: Int? = null, newHeight: Int? = null): T { - val ar = this.width / this.height.toDouble() - - val scaled = (if (newWidth != null && newHeight != null) { - val w = newWidth - val h = newHeight - - this.createNew(w, h) - } else if (newWidth != null && newHeight == null) { - val w = newWidth - val h = newWidth / ar - - this.createNew(w, h.roundToInt()) - } else if (newWidth == null && newHeight != null) { - val w = newHeight * ar - val h = newHeight - - this.createNew(w.roundToInt(), h) - } else { - this.createNew(this.width, this.height) - }) - - FDistort(this, scaled).scaleExt().apply() - - return scaled -} - -fun ColorBuffer.resizeBy(scaleX: Double, scaleY: Double = scaleX, convertToGray: Boolean = false): ColorBuffer { - return if (convertToGray) { - when (this.type) { - ColorType.FLOAT32, ColorType.FLOAT16 -> this.toGrayF32().resizeBy(scaleX, scaleY).toColorBuffer() - else -> this.toGrayU8().resizeBy(scaleX, scaleY).toColorBuffer() - } - } else { - when (this.type) { - ColorType.FLOAT32, ColorType.FLOAT16 -> this.toPlanarF32().resizeBy(scaleX, scaleY).toColorBuffer() - else -> this.toPlanarU8().resizeBy(scaleX, scaleY).toColorBuffer() - } - } -} - -fun ColorBuffer.resizeTo(newWidth: Int? = null, newHeight: Int? = null, convertToGray: Boolean = false): ColorBuffer { - return if (convertToGray) { - when (this.type) { - ColorType.FLOAT32, ColorType.FLOAT16 -> this.toGrayF32().resizeTo(newWidth, newHeight).toColorBuffer() - else -> this.toGrayU8().resizeTo(newWidth, newHeight).toColorBuffer() - } - } else { - when (this.type) { - ColorType.FLOAT32, ColorType.FLOAT16 -> this.toPlanarF32().resizeTo(newWidth, newHeight).toColorBuffer() - else -> this.toPlanarU8().resizeTo(newWidth, newHeight).toColorBuffer() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/Drawing.kt b/orx-jvm/orx-boofcv/src/main/kotlin/Drawing.kt deleted file mode 100644 index 06df7654..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/Drawing.kt +++ /dev/null @@ -1,83 +0,0 @@ -package org.openrndr.boofcv.binding - -import georegression.struct.line.LineSegment2D_F32 -import georegression.struct.line.LineSegment2D_F64 -import georegression.struct.trig.Circle2D_F32 -import georegression.struct.trig.Circle2D_F64 -import org.openrndr.draw.Drawer -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle - -fun Drawer.lineSegment(segment: LineSegment2D_F32) { - lineSegment( - segment.a.x.toDouble(), - segment.a.y.toDouble(), - segment.b.x.toDouble(), - segment.b.y.toDouble() - ) -} - -@JvmName("lineSegments2D_F32") -fun Drawer.lineSegments(segments: List) { - lineSegments( - segments.flatMap { segment -> - listOf( - Vector2(segment.a.x.toDouble(), segment.a.y.toDouble()), - Vector2(segment.b.x.toDouble(), segment.b.y.toDouble()) - ) - } - ) -} - -fun Drawer.lineSegment(segment: LineSegment2D_F64) { - lineSegment( - segment.a.x, - segment.a.y, - segment.b.x, - segment.b.y - ) -} - -@JvmName("lineSegments2D_F64") -fun Drawer.lineSegments(segments: List) { - lineSegments( - segments.flatMap { segment -> - listOf( - Vector2(segment.a.x, segment.a.y), - Vector2(segment.b.x, segment.b.y) - ) - } - ) -} - -fun Drawer.circle(circle: Circle2D_F32) { - circle( - circle.center.x.toDouble(), circle.center.y.toDouble(), - circle.radius.toDouble() - ) -} - -fun Drawer.circle(circle: Circle2D_F64) { - circle( - circle.center.x, circle.center.y, - circle.radius - ) -} - -@JvmName("circles2D_F32") -fun Drawer.circles(circles: List) { - circles( - circles.map { - Circle(it.center.x.toDouble(), it.center.y.toDouble(), it.radius.toDouble()) - } - ) -} - -@JvmName("circles2D_F64") -fun Drawer.circles(circles: List) { - circles( - circles.map { - Circle(it.center.x.toDouble(), it.center.y.toDouble(), it.radius.toDouble()) - } - ) -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/ImageFlowConversion.kt b/orx-jvm/orx-boofcv/src/main/kotlin/ImageFlowConversion.kt deleted file mode 100644 index 2e6f63d6..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/ImageFlowConversion.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.openrndr.boofcv.binding - -import boofcv.struct.flow.ImageFlow -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import java.nio.Buffer -import java.nio.ByteBuffer -import java.nio.ByteOrder - -fun ImageFlow.toColorBuffer(): ColorBuffer { - - val cb = colorBuffer( - width, height, format = ColorFormat.RG, - type = ColorType.FLOAT32 - ) - - val bb = ByteBuffer.allocateDirect(width * height * 8) - bb.order(ByteOrder.nativeOrder()) - for (y in 0 until height) { - for (x in 0 until width) { - val f = get(x, y) - bb.putFloat(f.x) - bb.putFloat(f.y) - } - } - - (bb as Buffer).rewind() - cb.write(bb) - cb.flipV = true - return cb -} \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/MatrixConversion.kt b/orx-jvm/orx-boofcv/src/main/kotlin/MatrixConversion.kt deleted file mode 100644 index dc569b79..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/MatrixConversion.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.openrndr.boofcv.binding - -import georegression.struct.affine.Affine2D_F32 -import georegression.struct.affine.Affine2D_F64 -import org.openrndr.math.Matrix44 - -fun Affine2D_F32.toMatrix44() = Matrix44( - c0r0 = a11.toDouble(), c1r0 = a12.toDouble(), c3r0 = tx.toDouble(), - c0r1 = a21.toDouble(), c1r1 = a22.toDouble(), c3r1 = ty.toDouble(), - c2r2 = 1.0, - c3r3 = 1.0 -) - -fun Affine2D_F64.toMatrix44() = Matrix44( - c0r0 = a11, c1r0 = a12, c3r0 = tx, - c0r1 = a21, c1r1 = a22, c3r1 = ty, - c2r2 = 1.0, - c3r3 = 1.0 -) \ No newline at end of file diff --git a/orx-jvm/orx-boofcv/src/main/kotlin/PointConversion.kt b/orx-jvm/orx-boofcv/src/main/kotlin/PointConversion.kt deleted file mode 100644 index 7a8d06b9..00000000 --- a/orx-jvm/orx-boofcv/src/main/kotlin/PointConversion.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.openrndr.boofcv.binding - -import georegression.struct.point.Point2D_F32 -import georegression.struct.point.Point2D_F64 -import georegression.struct.point.Point2D_I32 -import org.openrndr.math.Vector2 - -fun Point2D_I32.toVector2() = Vector2(x.toDouble(), y.toDouble()) -fun Point2D_F32.toVector2() = Vector2(x.toDouble(), y.toDouble()) -fun Point2D_F64.toVector2() = Vector2(x.toDouble(), y.toDouble()) -fun List.toVector2s() = this.map { it.toVector2() } diff --git a/orx-jvm/orx-chataigne/README.md b/orx-jvm/orx-chataigne/README.md deleted file mode 100644 index a3fd4834..00000000 --- a/orx-jvm/orx-chataigne/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# orx-chataigne - -Expose variables to [Chataigne](http://benjamin.kuperberg.fr/chataigne/en) and any other applications that can interface with it. -The current implementation makes use of the OSC protocol and supports `Double` and `ColorRGBa`. - -## Usage - -Defining the variables -```kotlin -class SceneVariables : ChataigneOSC(OSC(portIn = 9005, portOut = 12001)) { - val myRadius: Double by DoubleChannel("/myRadius") - val myOpacity: Double by DoubleChannel("/myOpacity") - val myColor: ColorRGBa by ColorChannel("/myColor") -} -``` - -Initiate - -```kotlin - val animation = SceneVariables() -``` - -Update time - -```kotlin -animation.update(seconds) -``` - -Use the variables - -```kotlin -animation.myRadius -animation.myOpacity -animation.myColor -``` - -## Example project - -Find the Chataigne example project in `/resources/timeline_example_chataigne.noisette` which works together with demo project `/src/demo/kotlin/ChataigneOSCDemo.kt` - - -## Demos -### ChataigneOSCDemo - - - -![ChataigneOSCDemoKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-chataigne/images/ChataigneOSCDemoKt.png) - -[source code](src/demo/kotlin/ChataigneOSCDemo.kt) diff --git a/orx-jvm/orx-chataigne/build.gradle.kts b/orx-jvm/orx-chataigne/build.gradle.kts deleted file mode 100644 index 3a9e7eba..00000000 --- a/orx-jvm/orx-chataigne/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - api(project(":orx-jvm:orx-osc")) - implementation(libs.gson) - demoImplementation(openrndr.ffmpeg) - demoImplementation(project(":orx-fx")) -} \ No newline at end of file diff --git a/orx-jvm/orx-chataigne/resources/timeline_example_chataigne.noisette b/orx-jvm/orx-chataigne/resources/timeline_example_chataigne.noisette deleted file mode 100644 index ae8a7381..00000000 --- a/orx-jvm/orx-chataigne/resources/timeline_example_chataigne.noisette +++ /dev/null @@ -1 +0,0 @@ -{"metaData": {"version": "1.7.2", "versionNumber": 67330}, "projectSettings": {"containers": {"dashboardSettings": {"parameters": [{"value": false, "controlAddress": "/enableDashboardServer"}, {"value": 9999, "hexMode": false, "controlAddress": "/serverPort"}]}}}, "layout": {"mainLayout": {"type": 1, "width": 1496, "height": 1371, "direction": 2, "shifters": [{"type": 1, "width": 1496, "height": 1371, "direction": 2, "shifters": [{"type": 1, "width": 1496, "height": 761, "direction": 1, "shifters": [{"type": 1, "width": 307, "height": 761, "direction": 2, "shifters": [{"type": 0, "width": 307, "height": 387, "currentContent": "Modules", "tabs": [{"name": "Modules"}]}, {"type": 0, "width": 307, "height": 367, "currentContent": "Custom Variables", "tabs": [{"name": "Custom Variables"}]}]}, {"type": 0, "width": 749, "height": 761, "currentContent": "State Machine", "tabs": [{"name": "State Machine"}, {"name": "Dashboard"}, {"name": "Module Router"}, {"name": "Morpher"}]}, {"type": 0, "width": 428, "height": 761, "currentContent": "Inspector", "tabs": [{"name": "Inspector"}]}]}, {"type": 1, "width": 1496, "height": 603, "direction": 1, "shifters": [{"type": 0, "width": 178, "height": 603, "currentContent": "Sequences", "tabs": [{"name": "Sequences"}]}, {"type": 0, "width": 867, "height": 603, "currentContent": "Sequence Editor", "tabs": [{"name": "Sequence Editor"}]}, {"type": 0, "width": 439, "height": 603, "currentContent": "Logger", "tabs": [{"name": "Help"}, {"name": "Logger"}, {"name": "Warnings"}]}]}]}]}, "windows": null}, "modules": {"items": [{"parameters": [{"value": true, "controlAddress": "/enabled"}, {"value": true, "controlAddress": "/logIncoming"}, {"value": true, "controlAddress": "/logOutgoing"}], "niceName": "OSC", "type": "OSC", "scripts": {}, "params": {"parameters": [{"value": false, "controlAddress": "/splitArguments"}, {"value": true, "controlAddress": "/autoFeedback"}], "containers": {"oscInput": {"parameters": [{"value": 12001, "hexMode": false, "controlAddress": "/localPort"}]}, "oscOutputs": {"editorIsCollapsed": true, "items": [{"parameters": [{"value": "127.0.0.1", "controlAddress": "/remoteHost"}, {"value": 9005, "hexMode": false, "controlAddress": "/remotePort"}], "niceName": "OSC Output", "type": "BaseItem"}]}, "pass_through": {}}}, "values": {"parameters": [{"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/color/colors/color", "controlAddress": "/reference"}, "controlAddress": "/_myColor", "type": "Color", "niceName": "/myColor", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 0.8833333253860474, "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/opacity/automation/value", "controlAddress": "/reference"}, "controlAddress": "/_myOpacity", "type": "Float", "niceName": "/myOpacity", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 0.8666667342185974, "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/radius/automation/value", "controlAddress": "/reference"}, "controlAddress": "/_myRadius", "type": "Float", "niceName": "/myRadius", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 11.77089214324951, "controlAddress": "/_setTime", "type": "Float", "niceName": "/setTime", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false, "shortName": "_setTime"}]}}]}, "states": {"items": [{"parameters": [{"value": [-80.0, -142.0], "controlAddress": "/viewUIPosition"}, {"value": [287.0, 243.0], "controlAddress": "/viewUISize"}, {"value": true, "controlAddress": "/active"}], "niceName": "State", "type": "State", "processors": {"items": [{"niceName": "OSC Trigger", "editorIsCollapsed": true, "type": "Mapping", "im": {"items": [{"parameters": [{"value": "/modules/osc/values/_setTime", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {"items": [{"niceName": "Math", "type": "Math", "filterParams": {"parameters": [{"value": "Modulo", "controlAddress": "/operation"}, {"value": "Adjust", "controlAddress": "/rangeRemapMode"}]}, "operationValue": {"value": 10.0, "controlMode": 2, "reference": {"value": "/sequences/sequence/totalTime", "controlAddress": "/reference"}, "controlAddress": "/states/state/processors/oscTrigger/filters/math/filterParams/value"}}]}, "outputs": {"items": [{"niceName": "MappingOutput 1", "type": "BaseItem", "commandModule": "sequences", "commandPath": "Time", "commandType": "Set Current Time", "command": {"parameters": [{"value": "/sequences/sequence", "controlAddress": "/target"}, {"value": 1.770892143249512, "controlAddress": "/time"}, {"value": false, "controlAddress": "/play"}]}}]}}]}}]}, "sequences": {"items": [{"parameters": [{"value": 5.0, "controlAddress": "/listSize"}, {"value": 10.0, "controlAddress": "/totalTime"}, {"value": false, "controlAddress": "/loop"}, {"value": 10.0, "controlAddress": "/viewEndTime"}, {"value": ["", ""], "controlAddress": "/syncDevices"}], "niceName": "Sequence", "type": "Sequence", "layers": {"items": [{"parameters": [{"value": 87.0, "controlAddress": "/listSize"}, {"value": 120, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": 0.8666667342185974, "controlAddress": "/value"}], "niceName": "Radius", "containers": {"automation": {"parameters": [{"value": 10.0, "controlAddress": "/length"}, {"value": 0.0, "controlAddress": "/position"}, {"value": 0.8666667342185974, "controlAddress": "/value"}, {"value": [0.0, 1.0], "controlAddress": "/viewValueRange"}, {"value": [0.0, 1.0], "controlAddress": "/range", "enabled": true}], "items": [{"parameters": [{"value": 0.0, "controlAddress": "/position"}, {"value": 0.8666667342185974, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 18", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 1.089901447296143, "controlAddress": "/position"}, {"value": 0.3083333373069763, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key", "containers": {"easing": {"parameters": [{"value": [0.5597290992736816, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.1908860206604004, -0.0166667103767395], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 1.896896004676819, "controlAddress": "/position"}, {"value": 0.4416666030883789, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 1", "containers": {"easing": {"parameters": [{"value": [0.1908860206604004, 0.0166667103767395], "controlAddress": "/anchor1"}, {"value": [-0.1785714626312256, 0.008333325386047363], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 2.278325080871582, "controlAddress": "/position"}, {"value": 0.8500000238418579, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 2", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 3.004926204681396, "controlAddress": "/position"}, {"value": 0.8583332896232605, "controlAddress": "/value"}, {"value": "Sine", "controlAddress": "/easingType"}], "niceName": "Key 3", "containers": {"easing": {"parameters": [{"value": [1.0, 0.25], "controlAddress": "/frequencyAmplitude"}]}}, "type": "Key"}, {"parameters": [{"value": 4.051724433898926, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 4", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 4.753694534301758, "controlAddress": "/position"}, {"value": 0.4583333134651184, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 5", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.01231575012207, "controlAddress": "/position"}, {"value": 0.7083333134651184, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 6", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.123153209686279, "controlAddress": "/position"}, {"value": 0.8000000715255737, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 7", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.264778137207031, "controlAddress": "/position"}, {"value": 0.5916666388511658, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 8", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.671182155609131, "controlAddress": "/position"}, {"value": 0.2083332538604736, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 9", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.133005142211914, "controlAddress": "/position"}, {"value": 0.5083333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 10", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.280788421630859, "controlAddress": "/position"}, {"value": 0.6916666626930237, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 11", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.508620738983154, "controlAddress": "/position"}, {"value": 0.4166666269302368, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 12", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 7.068964958190918, "controlAddress": "/position"}, {"value": 0.4166666269302368, "controlAddress": "/value"}, {"value": "Hold", "controlAddress": "/easingType"}], "niceName": "Key 13", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 8.084975242614746, "controlAddress": "/position"}, {"value": 0.9166666865348816, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 14", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 8.392856597900391, "controlAddress": "/position"}, {"value": 0.4333332777023315, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 15", "containers": {"easing": {"parameters": [{"value": [0.2050492316484451, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.2050492316484451, 0.0], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 9.076354026794434, "controlAddress": "/position"}, {"value": 0.8750000596046448, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 16", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 9.636699676513672, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 17", "containers": {"easing": {}}, "type": "Key"}]}, "recorder": {"parameters": [{"value": false, "controlAddress": "/arm"}, {"value": false, "controlAddress": "/isRecording"}], "editorIsCollapsed": true}, "mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}}, "type": "Mapping"}, {"parameters": [{"value": 87.0, "controlAddress": "/listSize"}, {"value": 120, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": 0.8833333253860474, "controlAddress": "/value"}], "niceName": "Opacity", "containers": {"automation": {"parameters": [{"value": 10.0, "controlAddress": "/length"}, {"value": 0.0, "controlAddress": "/position"}, {"value": 0.8833333253860474, "controlAddress": "/value"}, {"value": [0.0, 1.0], "controlAddress": "/viewValueRange"}, {"value": [0.0, 1.0], "controlAddress": "/range", "enabled": true}], "items": [{"parameters": [{"value": 0.0, "controlAddress": "/position"}, {"value": 0.8833333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 1.68719220161438, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 1", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 3.152709245681763, "controlAddress": "/position"}, {"value": 0.2749999761581421, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 2", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 4.193350315093994, "controlAddress": "/position"}, {"value": 0.9583333730697632, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 3", "containers": {"easing": {"parameters": [{"value": [0.5110831260681152, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.5110831260681152, 0.0], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 4.913793087005615, "controlAddress": "/position"}, {"value": 0.3833333849906921, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 4", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.293103694915771, "controlAddress": "/position"}, {"value": 0.3583333492279053, "controlAddress": "/value"}, {"value": "Sine", "controlAddress": "/easingType"}], "niceName": "Key 5", "containers": {"easing": {"parameters": [{"value": [0.04926061630249023, 0.6416666507720947], "controlAddress": "/frequencyAmplitude"}]}}, "type": "Key"}, {"parameters": [{"value": 7.173645496368408, "controlAddress": "/position"}, {"value": 0.3833333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 6", "containers": {"easing": {}}, "type": "Key"}]}, "recorder": {"parameters": [{"value": false, "controlAddress": "/isRecording"}], "editorIsCollapsed": true}, "mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}}, "type": "Mapping"}, {"parameters": [{"value": 27.0, "controlAddress": "/listSize"}, {"value": 60, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color", "containers": {"mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}, "colors": {"editorIsCollapsed": true, "items": [{"parameters": [{"value": 2.0, "controlAddress": "/time"}, {"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 1", "type": "BaseItem"}, {"parameters": [{"value": 4.0, "controlAddress": "/time"}, {"value": [1.0, 1.0, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 2", "type": "BaseItem"}, {"parameters": [{"value": 6.0, "controlAddress": "/time"}, {"value": "None", "controlAddress": "/interpolation"}, {"value": [1.0, 0.0, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 3", "type": "BaseItem"}, {"parameters": [{"value": 8.0, "controlAddress": "/time"}, {"value": [0.0, 0.0, 1.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 4", "type": "BaseItem"}]}}, "type": "Color"}]}, "cues": {}, "editing": true}]}} \ No newline at end of file diff --git a/orx-jvm/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt b/orx-jvm/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt deleted file mode 100644 index 82c36c08..00000000 --- a/orx-jvm/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.osc.OSC - -fun main() = application { - - configure { - width = 500 - height = 500 - } - - /* Find the Chataigne example project in /resources */ - class SceneVariables : ChataigneOSC(OSC(portIn = 9005, portOut = 12001)) { - val myRadius: Double by DoubleChannel("/myRadius") - val myOpacity: Double by DoubleChannel("/myOpacity") - val myColor: ColorRGBa by ColorChannel("/myColor") - } - - program { - val animation = SceneVariables() - - extend { - animation.update(seconds) - - drawer.fill = animation.myColor.opacify(animation.myOpacity) - drawer.circle(width/2.0, height/2.0, animation.myRadius * 250) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-chataigne/src/main/kotlin/ChataigneOSC.kt b/orx-jvm/orx-chataigne/src/main/kotlin/ChataigneOSC.kt deleted file mode 100644 index 189417f4..00000000 --- a/orx-jvm/orx-chataigne/src/main/kotlin/ChataigneOSC.kt +++ /dev/null @@ -1,55 +0,0 @@ -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.osc.OSC -import kotlin.reflect.KProperty - -private val logger = KotlinLogging.logger {} - -open class ChataigneOSC( - val osc: OSC -) { - inner class DoubleChannel(key: String) { - private var currentDouble = 0.0 - - init { - osc.listen(key) { _, message -> - currentDouble = (message[0] as Float).toDouble() - } - } - - operator fun getValue(thisRef: Any?, property: KProperty<*>): Double { - return currentDouble - } - - } - - inner class ColorChannel(key: String) { - private var currentColor = ColorRGBa.BLACK - - init { - osc.listen(key) { _, message -> - val red = message[0] as Float - val green = message[1] as Float - val blue = message[2] as Float - val alpha = message[3] as Float - - currentColor = ColorRGBa(red.toDouble(), green.toDouble(), blue.toDouble(), alpha.toDouble()) - } - } - - operator fun getValue(thisRef: Any?, property: KProperty<*>): ColorRGBa { - return currentColor - } - - } - - fun update(seconds: Double) { - osc.send("/setTime", seconds.toFloat()) - } - - init { - logger.info { - "setup Chataigne with OSC ${osc.address} in:${osc.portIn} out:${osc.portOut}" - } - } -} diff --git a/orx-jvm/orx-crash-handler/README.md b/orx-jvm/orx-crash-handler/README.md deleted file mode 100644 index 6a356e3f..00000000 --- a/orx-jvm/orx-crash-handler/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# orx-crash-handler - -Extension for reporting unhandled exceptions \ No newline at end of file diff --git a/orx-jvm/orx-crash-handler/build.gradle.kts b/orx-jvm/orx-crash-handler/build.gradle.kts deleted file mode 100644 index cd9c26d3..00000000 --- a/orx-jvm/orx-crash-handler/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") - alias(libs.plugins.kotlin.serialization) -} - -dependencies { - implementation(sharedLibs.kotlin.serialization.json) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(libs.okhttp) -} \ No newline at end of file diff --git a/orx-jvm/orx-crash-handler/src/demo/kotlin/DemoCrashHandler01.kt b/orx-jvm/orx-crash-handler/src/demo/kotlin/DemoCrashHandler01.kt deleted file mode 100644 index a3cd08d5..00000000 --- a/orx-jvm/orx-crash-handler/src/demo/kotlin/DemoCrashHandler01.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.crashhandler.CrashHandler -import org.openrndr.extra.crashhandler.slack - -fun main() { - application { - configure { - width = 1280 - height = 720 - } - program { - extend(CrashHandler()) { - name = "jump-scare" - vncHost = "localhost" - slack { - authToken = System.getenv("SLACK_AUTH_TOKEN") - channelId = System.getenv("SLACK_CHANNEL_ID") - } - } - - extend { - error("something bad happened") - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-crash-handler/src/main/kotlin/CrashHandler.kt b/orx-jvm/orx-crash-handler/src/main/kotlin/CrashHandler.kt deleted file mode 100644 index 7551f0b9..00000000 --- a/orx-jvm/orx-crash-handler/src/main/kotlin/CrashHandler.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.openrndr.extra.crashhandler - -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.Extension -import org.openrndr.Program -import java.io.File - -private val logger = KotlinLogging.logger { } - -class CrashHandler : Extension { - override var enabled: Boolean = true - - var name: String? = null - var vncHost: String? = null - - - val reporters = mutableListOf() - - - override fun setup(program: Program) { - if (name == null) - name = program.name - - Thread.setDefaultUncaughtExceptionHandler { t, e: Throwable -> - logger.error(e) { "Uncaught exception in thread $t" } - - for (reporter in reporters) { - try { - reporter.reportCrash(e) - } catch (e: Exception) { - println("error while reporting") - logger.error(e) { "reporter threw an exception" } - } - } - - val crashFile = File("${program.name}.crash") - val lastCrash = if (crashFile.exists()) crashFile.readText().toLongOrNull() ?: 0L else 0L - - crashFile.writeText("${System.currentTimeMillis()}") - if (System.currentTimeMillis() - lastCrash < 60 * 1000) { - logger.info { "crashed less than 60 seconds ago, sleeping for 60 seconds" } - Thread.sleep(60 * 1000L) - } - - System.exit(1) - } - } - -} \ No newline at end of file diff --git a/orx-jvm/orx-crash-handler/src/main/kotlin/Reporter.kt b/orx-jvm/orx-crash-handler/src/main/kotlin/Reporter.kt deleted file mode 100644 index 79e14d2f..00000000 --- a/orx-jvm/orx-crash-handler/src/main/kotlin/Reporter.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.openrndr.extra.crashhandler - -abstract class Reporter(val handler: CrashHandler) { - abstract fun reportCrash(throwable: Throwable) -} \ No newline at end of file diff --git a/orx-jvm/orx-crash-handler/src/main/kotlin/SlackReporter.kt b/orx-jvm/orx-crash-handler/src/main/kotlin/SlackReporter.kt deleted file mode 100644 index 85b15ac3..00000000 --- a/orx-jvm/orx-crash-handler/src/main/kotlin/SlackReporter.kt +++ /dev/null @@ -1,141 +0,0 @@ -package org.openrndr.extra.crashhandler - -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody.Companion.toRequestBody -import okhttp3.Response - - -@Serializable -private data class BlockResponse( - val type: String, - val text: TextElementResponse? = null, - val elements: List = listOf() -) - -@Serializable -private data class TextElementResponse( - val text: String, - val type: String, - val emoji: Boolean = false -) - -@Serializable -private data class BlockElementResponse( - val type: String, - val text: TextElementResponse, - val url: String? = null, - val style: String = "primary", -) - -@Serializable -private data class ChatPostMessageRequest( - val channel: String, - val blocks: List? = null, - val text: String? = null, - val thread_ts: String? = null -) - -@Serializable -private data class ChatPostMessageResponse( - val ok: Boolean, - val ts: String? = null, - val channel: String? = null -) - - -private val logger = KotlinLogging.logger { } - -class SlackReporter(handler: CrashHandler) : Reporter(handler) { - - var channelId: String = "" - var authToken: String = "" - - private val monitorJson = Json { - ignoreUnknownKeys = true - } - - private fun makeRequest(client: OkHttpClient, messageRequest: ChatPostMessageRequest): Response { - val body = monitorJson.encodeToString(messageRequest) - val requestBody = body.toRequestBody("application/json".toMediaType()) - - val replySlackRequest: Request = Request.Builder() - .url("https://slack.com/api/chat.postMessage") - .method("POST", requestBody) - .addHeader("Content-Type", "application/json") - .addHeader("Authorization", "Bearer $authToken") - .build() - - val response = client.newCall(replySlackRequest).execute() - require(response.isSuccessful) { - "request failed: ${response.code} ${response.message}" - } - - return response - } - - private fun plainText(text: String): TextElementResponse { - return TextElementResponse(text, "plain_text", false) - } - - private fun slackMessage(client: OkHttpClient, endpoint: String, error: Boolean = false, errorLog: String? = null) { - - val messageRequest = if (error) { - ChatPostMessageRequest(channel = channelId!!, thread_ts = null, - blocks = listOf( - BlockResponse("section", plainText("There is a problem with $endpoint. Please check.")), - BlockResponse("actions", elements = listOfNotNull( - - if (handler.vncHost != null) { - BlockElementResponse( - type = "button", - text = plainText("VNC into $endpoint"), - url = "vnc://${handler.vncHost}" - ) - } else { null } - ) - ) - ) - ) - } else { - ChatPostMessageRequest(channel = channelId!!, thread_ts = null, - blocks = listOf(BlockResponse("section", plainText("$endpoint is back online!"))) - ) - } - - val response = makeRequest(client, messageRequest) - - - if (error && response.isSuccessful) { - val cmr = monitorJson.decodeFromString(response.body?.string() ?: "") - - val logMessage = errorLog ?: "No log could be retrieved. Machine is likely unreachable" - - val replyRequest = ChatPostMessageRequest(channel = channelId, thread_ts = cmr.ts, - blocks = listOf( - BlockResponse( - type = "section", - text = TextElementResponse("```${logMessage}```", "mrkdwn", false) - ) - ), - ) - - makeRequest(client, replyRequest) - } - } - - - override fun reportCrash(throwable: Throwable) { - logger.info { "reporting " } - val client = OkHttpClient().newBuilder().build() - slackMessage(client, handler.name ?: "no name", true, throwable.stackTraceToString()) - } -} - -fun CrashHandler.slack(config: SlackReporter.() -> Unit) { - reporters.add(SlackReporter(this).apply(config)) -} \ No newline at end of file diff --git a/orx-jvm/orx-depth-camera-calibrator/README.md b/orx-jvm/orx-depth-camera-calibrator/README.md deleted file mode 100644 index c7c3f6cc..00000000 --- a/orx-jvm/orx-depth-camera-calibrator/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# orx-depth-camera-calibrator - -Class to help callibrate depth and transformation matrices when using one or more depth cameras. - -See [Kinect1Demo10DepthCameraCalibration.kt](https://github.com/openrndr/orx/blob/master/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo10DepthCameraCalibration.kt) for an example. diff --git a/orx-jvm/orx-depth-camera-calibrator/build.gradle.kts b/orx-jvm/orx-depth-camera-calibrator/build.gradle.kts deleted file mode 100644 index 94435b2c..00000000 --- a/orx-jvm/orx-depth-camera-calibrator/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(project(":orx-fx")) - api(project(":orx-depth-camera")) - api(project(":orx-jvm:orx-gui")) -} \ No newline at end of file diff --git a/orx-jvm/orx-depth-camera-calibrator/src/main/kotlin/DepthCameraCalibrator.kt b/orx-jvm/orx-depth-camera-calibrator/src/main/kotlin/DepthCameraCalibrator.kt deleted file mode 100644 index d29487e5..00000000 --- a/orx-jvm/orx-depth-camera-calibrator/src/main/kotlin/DepthCameraCalibrator.kt +++ /dev/null @@ -1,267 +0,0 @@ -package org.openrndr.extra.depth.camera.calibrator - -import org.openrndr.* -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Drawer -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.isolated -import org.openrndr.extra.depth.camera.DepthCamera -import org.openrndr.extra.depth.camera.DepthMeasurement -import org.openrndr.extra.fx.colormap.TurboColormap -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.* -import org.openrndr.math.IntVector2 -import org.openrndr.math.Vector2 - -/** - * Depth camera calibrator extension. - * - * @param program the program using this extension, Note: normally - * we would pass program in [setup], however there is a - * cyclic dependency between GUI and calibrator, so some - * dimensions have to be established before setup. - * See Kinect1Demo10DepthCameraCalibration.kt. - * @param depthCameras depth cameras to calibrate. - */ -class DepthCameraCalibrator( - private val program: Program, - vararg depthCameras: DepthCamera -) : Extension { - - init { - check(depthCameras.isNotEmpty()) { - "depthCameras cannot be empty" - } - depthCameras.forEach { - check(it.depthMeasurement == DepthMeasurement.METERS) { - "depthCameras: calibration requires depthMeasurement of each camera to be set to METERS" - } - } - } - - override var enabled: Boolean - get() = commonParameters.calibratorView - set(value) { commonParameters.calibratorView = value } - - private val resolution = IntVector2(program.width, program.height).vector2 - - private val calibrations = depthCameras.map { Calibration(it) }.toList() - - private val colormap = TurboColormap() - - private var onCalibrationChange: (calibration: Calibration) -> Unit = - { _ -> } // empty on startup - - override fun setup(program: Program) { - program.keyboard.keyDown.listen { - if (enabled) { - handleKeyDown(it) - } - } - } - - override fun afterDraw(drawer: Drawer, program: Program) { - calibrations.forEach { - colormap.minValue = it.minDepth - colormap.maxValue = it.maxDepth - colormap.apply(it.camera.currentFrame, it.colorBuffer) - drawer.isolatedWithCalibration(it) { - image( - colorBuffer = it.colorBuffer, - position = it.position, - width = it.width, - height = it.height - ) - } - } - } - - fun handleKeyDown(event: KeyEvent) { - when(event.name) { - "1" -> commonParameters.allMinDepth -= CENTIMETER - "2" -> commonParameters.allMinDepth += CENTIMETER - "3" -> commonParameters.allMaxDepth -= CENTIMETER - "4" -> commonParameters.allMaxDepth += CENTIMETER - } - calibrations - .filter { it.tuneWithKeyboard } - .forEach { - when(event.key) { - KEY_ARROW_LEFT -> it.offset += Direction.LEFT * OFFSET_CHANGE_SCALE - KEY_ARROW_RIGHT -> it.offset += Direction.RIGHT * OFFSET_CHANGE_SCALE - KEY_ARROW_UP -> it.offset += Direction.UP * OFFSET_CHANGE_SCALE - KEY_ARROW_DOWN -> it.offset += Direction.DOWN * OFFSET_CHANGE_SCALE - } - when(event.name) { - "-" -> it.scale -= SCALE_CHANGE - "=" -> it.scale += SCALE_CHANGE - "l" -> it.rotation -= ROTATION_CHANGE - "r" -> it.rotation += ROTATION_CHANGE - "a" -> it.minDepth -= CENTIMETER - "s" -> it.minDepth += CENTIMETER - "d" -> it.maxDepth -= CENTIMETER - "f" -> it.maxDepth += CENTIMETER - } - } - } - - fun addControlsTo(gui: GUI) { - gui.add(commonParameters) - calibrations.forEachIndexed { index, calibration -> - gui.add(calibration, label = "depth camera $index") - } - } - - fun getCalibration(camera: DepthCamera): Calibration = calibrations - .find { it.camera === camera } - ?: throw IllegalArgumentException("No calibration for provided depth camera") - - fun onCalibrationChange(block: (calibration: Calibration) -> Unit) { - onCalibrationChange = block - calibrations.forEach { // run on first install - block(it) - } - } - - private val commonParameters = @Description("calibration: all depth cameras") object { - - @BooleanParameter(label = "calibrator view [k]", order = 0) - var calibratorView: Boolean = false - - @DoubleParameter(label = "min depth [1/2]", low = 0.2, high = 10.0, order = 1) - var allMinDepth: Double = 0.1 - set(value) { - field = value - calibrations.forEach { - it.minDepth = value - } - } - - @DoubleParameter(label = "max depth [3/4]", low = 0.2, high = 10.0, order = 2) - var allMaxDepth: Double = 10.0 - set(value) { - field = value - calibrations.forEach { - it.maxDepth = value - } - } - - } - - @Suppress("unused") // used by reflection - inner class Calibration( - val camera: DepthCamera, - val colorBuffer: ColorBuffer = colorBuffer( - camera.resolution.x, - camera.resolution.y - ) - ) { - - @BooleanParameter(label = "tune with keyboard", order = 0) - var tuneWithKeyboard: Boolean = true - - @BooleanParameter(label = "flipH", order = 1) - var flipH - get() = camera.flipH - set(value) { camera.flipH = value } - - @BooleanParameter(label = "flipV", order = 2) - var flipV - get() = camera.flipV - set(value) { camera.flipV = value } - - @XYParameter( - label = "offset [arrows]", - minX = -1.0, - minY = -1.0, - maxX = 1.0, - maxY = 1.0, - order = 3, - invertY = true - ) - var offset: Vector2 = Vector2.ZERO - set(value) { - field = value - onCalibrationChange(this) - } - - @DoubleParameter(label = "rotation [l/r]", low = -360.0, high = 360.0, order = 4) - var rotation: Double = 0.0 - set(value) { - field = value - onCalibrationChange(this) - } - - @DoubleParameter(label = "scale [+/-]", low = 0.0, high = 10.0, order = 5) - var scale: Double = 1.0 - set(value) { - field = value - onCalibrationChange(this) - } - - @DoubleParameter(label = "min depth [a/s]", low = 0.0, high = 10.0, order = 6) - var minDepth: Double = 0.2 - set(value) { - field = value - onCalibrationChange(this) - } - - @DoubleParameter(label = "max depth [d/f]", low = 0.0, high = 10.0, order = 7) - var maxDepth: Double = 10.0 - set(value) { - field = value - onCalibrationChange(this) - } - - @ActionParameter(label = "reset", order = 8) - fun reset() { - offset = Vector2.ZERO - rotation = 0.0 - scale = 1.0 - minDepth = 0.2 - maxDepth = 10.0 - } - - val width: Double = - camera.resolution.x * resolution.y / - camera.resolution.y - - val height: Double = resolution.y - - val position: Vector2 = - -(resolution - Vector2(resolution.x - width, 0.0)) / 2.0 - - } - -} - -fun Drawer.isolatedWithCalibration( - calibration: DepthCameraCalibrator.Calibration, - block: Drawer.() -> Unit -) { - this.isolated { - translate( - IntVector2(width, height).vector2 / 2.0 - + calibration.offset * Vector2(1.0, -1.0) * height.toDouble() - ) - rotate(calibration.rotation) - scale(calibration.scale) - block() - } -} - -enum class Direction(val vector: Vector2) { - LEFT(Vector2(-1.0, 0.0)), - RIGHT(Vector2(1.0, 0.0)), - UP(Vector2(0.0, 1.0)), - DOWN(Vector2(0.0, -1.0)); - - operator fun times(scale: Double): Vector2 = this.vector * scale - -} - -private const val CENTIMETER = .01 -private const val OFFSET_CHANGE_SCALE = .001 -private const val ROTATION_CHANGE = .1 -private const val SCALE_CHANGE = .001 - diff --git a/orx-jvm/orx-dnk3/README.md b/orx-jvm/orx-dnk3/README.md deleted file mode 100644 index 57296671..00000000 --- a/orx-jvm/orx-dnk3/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# orx-dnk3 - -A scene graph based 3d renderer with support for Gltf based assets - -Status: in development - -Supported Gltf features -- [x] Scene hierarchy -- [x] Loading mesh data -- [x] Glb -- [ ] Materials - - [x] Basic materials - - [x] Normal maps - - [x] Metallic/roughness maps - - [x] Skinning - - [x] Double-sided materials - - [ ] Transparency -- [x] Animations -- [ ] Cameras -- [ ] Lights - -## Demos -### DemoAnimations01 - - - -![DemoAnimations01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoAnimations01Kt.png) - -[source code](src/demo/kotlin/DemoAnimations01.kt) - -### DemoCamera01 - - - -![DemoCamera01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoCamera01Kt.png) - -[source code](src/demo/kotlin/DemoCamera01.kt) - -### DemoIrrProbe01 - - - -![DemoIrrProbe01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoIrrProbe01Kt.png) - -[source code](src/demo/kotlin/DemoIrrProbe01.kt) - -### DemoLights01 - - - -![DemoLights01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoLights01Kt.png) - -[source code](src/demo/kotlin/DemoLights01.kt) - -### DemoLights02 - - - -![DemoLights02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoLights02Kt.png) - -[source code](src/demo/kotlin/DemoLights02.kt) - -### DemoLights03 - - - -![DemoLights03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoLights03Kt.png) - -[source code](src/demo/kotlin/DemoLights03.kt) - -### DemoObject01 - - - -![DemoObject01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoObject01Kt.png) - -[source code](src/demo/kotlin/DemoObject01.kt) - -### DemoScene01 - - - -![DemoScene01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoScene01Kt.png) - -[source code](src/demo/kotlin/DemoScene01.kt) - -### DemoScene02 - - - -![DemoScene02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoScene02Kt.png) - -[source code](src/demo/kotlin/DemoScene02.kt) - -### DemoScene03 - - - -![DemoScene03Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoScene03Kt.png) - -[source code](src/demo/kotlin/DemoScene03.kt) - -### DemoSegmentContours01 - - - -![DemoSegmentContours01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoSegmentContours01Kt.png) - -[source code](src/demo/kotlin/DemoSegmentContours01.kt) - -### DemoSkinning01 - - - -![DemoSkinning01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-dnk3/images/DemoSkinning01Kt.png) - -[source code](src/demo/kotlin/DemoSkinning01.kt) diff --git a/orx-jvm/orx-dnk3/build.gradle.kts b/orx-jvm/orx-dnk3/build.gradle.kts deleted file mode 100644 index ce1d6e49..00000000 --- a/orx-jvm/orx-dnk3/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") - alias(libs.plugins.kotlin.serialization) - -} - -dependencies { - implementation(sharedLibs.kotlin.serialization.core) - implementation(sharedLibs.kotlin.serialization.json) - implementation(project(":orx-fx")) - implementation(project(":orx-jvm:orx-keyframer")) - implementation(project(":orx-easing")) - implementation(project(":orx-shader-phrases")) - implementation(project(":orx-mesh-generators")) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) - demoImplementation(project(":orx-mesh-generators")) - demoImplementation(project(":orx-camera")) - demoImplementation(project(":orx-noise")) - demoImplementation(project(":orx-shader-phrases")) - demoImplementation(openrndr.ffmpeg) - demoImplementation(openrndr.filter) -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt deleted file mode 100644 index f46a833c..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt +++ /dev/null @@ -1,54 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.DirectionalLight -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/box-animated/BoxAnimated.glb")) - val scene = Scene(SceneNode()) - - // -- add some lights - val lightNode = SceneNode() - lightNode.transform = transform { - translate(0.0, 10.0, 0.0) - rotate(Vector3.UNIT_X, -65.0) - } - lightNode.entities.add(DirectionalLight()) - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa.BLUE.shade(0.4) - downColor = ColorRGBa.GRAY.shade(0.1) - }) - scene.root.children.add(lightNode) - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - extend(Orbital()) { - far = 50.0 - eye = Vector3(1.5, 0.0, 3.0) - fov = 40.0 - } - extend { - sceneData.animations[0].applyToTargets(seconds.mod(sceneData.animations[0].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoCamera01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoCamera01.kt deleted file mode 100644 index 9fec6c2d..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoCamera01.kt +++ /dev/null @@ -1,40 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/camera/Scene.glb")) - val scene = Scene(SceneNode()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa(0.1, 0.1, 0.4) - downColor = ColorRGBa(0.1, 0.0, 0.0) - }) - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - - val cameras = scene.root.findContent { this as? PerspectiveCamera } - - extend { - sceneData.animations[0].applyToTargets(seconds.mod(sceneData.animations[0].duration)) - drawer.view = cameras[0].content.viewMatrix - drawer.projection = cameras[0].content.projectionMatrix - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL01.kt deleted file mode 100644 index b399cefe..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL01.kt +++ /dev/null @@ -1,80 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.dnk3.dsl.* -//import org.openrndr.extra.dnk3.renderers.dryRenderer -//import org.openrndr.extra.dnk3.tools.addSkybox -//import org.openrndr.extra.camera.Orbital -//import org.openrndr.extra.meshgenerators.boxMesh -//import org.openrndr.extra.meshgenerators.groundPlaneMesh -//import org.openrndr.math.Vector3 -//import org.openrndr.math.transforms.transform -// -//fun main() = application { -// configure { -// width = 1280 -// height = 720 -// } -// -// program { -// extend(Orbital()) { -// eye = Vector3(4.0, 4.0, 4.0) -// } -// -// val renderer = dryRenderer() -// val scene = scene { -// -// addSkybox("file:demo-data/cubemaps/garage_iem.dds") -// -// root.hemisphereLight { -// upColor = ColorRGBa.WHITE.shade(0.1) -// downColor = ColorRGBa.BLACK -// } -// -// root.node { -// transform = transform { -// translate(0.0, 2.0, 0.0) -// } -// -// pointLight { -// constantAttenuation = 0.0 -// quadraticAttenuation = 1.0 -// } -// } -// -// root.node { -// simpleMesh { -// vertexBuffer = groundPlaneMesh(100.0, 100.0) -// material = pbrMaterial { -// color = ColorRGBa.GREEN -// } -// } -// } -// -// for (j in -3..3) { -// for (i in -3..3) { -// root.node { -// transform = transform { -// translate(i * 2.0, 1.0, j * 2.0) -// } -// update { -// transform = transform { -// translate(i * 2.0, 1.0, j * 2.0) -// rotate(Vector3.UNIT_Z, seconds* 45.0 + i * 20.0 + j * 50.0) -// } -// } -// simpleMesh { -// vertexBuffer = boxMesh() -// material = pbrMaterial { -// color = ColorRGBa.WHITE -// } -// } -// } -// } -// } -// } -// extend { -// drawer.clear(ColorRGBa.BLACK) -// renderer.draw(drawer, scene) -// } -// } -//} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL02.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL02.kt deleted file mode 100644 index 25a006d7..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoDSL02.kt +++ /dev/null @@ -1,81 +0,0 @@ -//import org.openrndr.application -//import org.openrndr.color.ColorRGBa -//import org.openrndr.extra.dnk3.dsl.* -//import org.openrndr.extra.dnk3.renderers.dryRenderer -//import org.openrndr.extra.dnk3.tools.addSkybox -//import org.openrndr.extra.noise.simplex -//import org.openrndr.extra.camera.Orbital -//import org.openrndr.extra.meshgenerators.groundPlaneMesh -//import org.openrndr.math.Vector3 -//import org.openrndr.math.transforms.transform -//import org.openrndr.shape.path3D -// -//fun main() = application { -// configure { -// width = 1280 -// height = 720 -// } -// -// program { -// extend(Orbital()) { -// eye = Vector3(4.0, 4.0, 4.0) -// } -// -// val renderer = dryRenderer() -// val scene = scene { -// -// addSkybox("file:demo-data/cubemaps/garage_iem.dds") -// -// root.hemisphereLight { -// upColor = ColorRGBa.WHITE.shade(0.1) -// downColor = ColorRGBa.BLACK -// } -// -// root.node { -// transform = transform { -// translate(0.0, 2.0, 0.0) -// } -// -// pointLight { -// constantAttenuation = 0.0 -// quadraticAttenuation = 1.0 -// } -// } -// -// root.node { -// simpleMesh { -// vertexBuffer = groundPlaneMesh(100.0, 100.0) -// material = pbrMaterial { -// color = ColorRGBa.GREEN -// } -// } -// } -// -// root.node { -// pathMesh { -// weight = 10.0 -// material = pbrMaterial { -// color = ColorRGBa.PINK -// } -// update { -// paths = mutableListOf( -// path3D { -// val t = seconds * 0.1 -// moveTo(Vector3.ZERO) -// val control = Vector3.simplex(3032, t).let { it.copy(y = it.y * 0.5 + 0.5) } * 4.0 -// val target = Vector3.simplex(5077, t).let { it.copy(y = it.y * 0.5 + 0.5) } * 4.0 -// val end = Vector3.simplex(9041, t).let { it.copy(y = it.y * 0.5 + 0.5) } * 4.0 -// curveTo(control, target) -// continueTo(end) -// } -// ) -// } -// } -// } -// } -// extend { -// drawer.clear(ColorRGBa.BLACK) -// renderer.draw(drawer, scene) -// } -// } -//} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoIrrProbe01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoIrrProbe01.kt deleted file mode 100644 index 05156987..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoIrrProbe01.kt +++ /dev/null @@ -1,100 +0,0 @@ -import kotlinx.coroutines.yield -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.dnk3.features.addIrradianceSH -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.postRenderer -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.filter.color.Delinearize -import org.openrndr.launch -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import java.io.File -import kotlin.math.cos -import kotlin.math.sin - -fun main() = application { - configure { - width = 1280 - height = 720 - multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/irradiance-probes/model.glb")) - val scene = Scene(SceneNode()) - - val probeBox = sphereMesh(16, 16, 0.1) - val probeGeometry = Geometry(listOf(probeBox), null, DrawPrimitive.TRIANGLES, 0, probeBox.vertexCount) - - val c = 5 - scene.addIrradianceSH(c, c, c, 3.0 / c, cubemapSize = 32, offset = Vector3(0.0, 0.0, 0.0)) - - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = postRenderer() - - -// renderer.postSteps.add( -// FilterPostStep(1.0, ScreenspaceReflections(), listOf("color", "clipDepth", "viewNormal"), "reflections", ColorFormat.RGB, ColorType.FLOAT16) { -// val p = Matrix44.scale(drawer.width / 2.0, drawer.height / 2.0, 1.0) * Matrix44.translate(Vector3(1.0, 1.0, 0.0)) * drawer.projection -// this.projection = p -// this.projectionMatrixInverse = drawer.projection.inversed -// } -// ) - -// renderer.postSteps.add( -// FilterPostStep(1.0, VolumetricIrradiance(), listOf("color", "clipDepth"), "volumetric-irradiance", ColorFormat.RGB, ColorType.FLOAT16) { -// this.irradianceSH = scene.features[0] as IrradianceSH -// this.projectionMatrixInverse = drawer.projection.inversed -// this.viewMatrixInverse = drawer.view.inversed -// } -// ) - - renderer.postSteps.add( - FilterPostStep(1.0, Delinearize(), listOf("color"), "ldr", ColorFormat.RGB, ColorType.FLOAT16) - ) - - val orb = extend(Orbital()) { - this.fov = 20.0 - camera.setView(Vector3(-0.49, -0.24, 0.20), Spherical(26.56, 90.0, 6.533), 40.0) - } - - renderer.draw(drawer, scene) - - val dynNode = SceneNode() - val dynMaterial = PBRMaterial() - val dynPrimitive = MeshPrimitive(probeGeometry, dynMaterial) - val dynMesh = Mesh(listOf(dynPrimitive)) - dynNode.entities.add(dynMesh) - scene.root.children.add(dynNode) - - scene.dispatcher.launch { - while (true) { - dynNode.transform = transform { - translate(cos(seconds) * 0.5, 0.5, sin(seconds) * 0.5) - scale(2.0) - } - yield() - } - } - - extend { - drawer.clear(ColorRGBa.BLACK) - renderer.draw(drawer, scene) - drawer.defaults() - - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights01.kt deleted file mode 100644 index 431c18b1..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights01.kt +++ /dev/null @@ -1,45 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/point-light/Scene.glb")) - val scene = Scene(SceneNode()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa(0.1, 0.1, 0.4) - downColor = ColorRGBa(0.1, 0.0, 0.0) - }) - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - val orb = extend(Orbital()) { - far = 50.0 - camera.setView(Vector3.ZERO, Spherical(30.50, 26.0, 5.6), 40.0) - } - extend { - sceneData.animations[0].applyToTargets(seconds.mod(sceneData.animations[0].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights02.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights02.kt deleted file mode 100644 index d1a57447..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights02.kt +++ /dev/null @@ -1,46 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/spot-light/Scene.glb")) - val scene = Scene(SceneNode()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa(0.1, 0.1, 0.4) - downColor = ColorRGBa(0.1, 0.0, 0.0) - }) - - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - val orb = extend(Orbital()) { - far = 50.0 - camera.setView(Vector3(-0.514, -0.936, -1.122), Spherical(454.346, 25.0, 8.444), 40.0) - } - extend { - sceneData.animations[0].applyToTargets(seconds.mod(sceneData.animations[0].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights03.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights03.kt deleted file mode 100644 index 11d65de5..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoLights03.kt +++ /dev/null @@ -1,45 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/directional-light/Scene.glb")) - val scene = Scene(SceneNode()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa(0.1, 0.1, 0.4) - downColor = ColorRGBa(0.1, 0.0, 0.0) - }) - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - val orb = extend(Orbital()) { - camera.setView(Vector3(-0.49, -0.24, 0.20), Spherical(26.56, 90.0, 6.533), 40.0) - } - - extend { - sceneData.animations[0].applyToTargets(seconds.mod(sceneData.animations[0].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoObject01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoObject01.kt deleted file mode 100644 index 39bce5d0..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoObject01.kt +++ /dev/null @@ -1,40 +0,0 @@ -import org.openrndr.application -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/duck/Duck.gltf")) - val meshes = gltf.meshes.map { - it.createDrawCommands(gltf) - } - - extend(Orbital()) { - far = 400.0 - lookAt = Vector3(0.0, 50.0, 0.0) - eye = Vector3(100.0, 200.0, 150.0) - fov = 45.0 - } - - extend { - drawer.shadeStyle = shadeStyle { - fragmentTransform = """ - x_fill.rgb = vec3(v_viewNormal.z); - """.trimIndent() - } - for (mesh in meshes) { - for (primitive in mesh) { - if (primitive.indexBuffer == null) { - drawer.vertexBuffer(primitive.vertexBuffer, DrawPrimitive.TRIANGLES) - } else { - drawer.vertexBuffer(primitive.indexBuffer!!, listOf(primitive.vertexBuffer), DrawPrimitive.TRIANGLES) - } - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene01.kt deleted file mode 100644 index 3fec9087..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene01.kt +++ /dev/null @@ -1,52 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.DirectionalLight -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/suzanne/Suzanne.gltf")) - val scene = Scene(SceneNode()) - - // -- add some lights - val lightNode = SceneNode() - lightNode.transform = transform { - translate(0.0, 10.0, 0.0) - rotate(Vector3.UNIT_X, -65.0) - } - lightNode.entities.add(DirectionalLight()) - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa.BLUE.shade(0.4) - downColor = ColorRGBa.GRAY.shade(0.1) - }) - scene.root.children.add(lightNode) - scene.root.children.addAll(gltf.buildSceneNodes().scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - extend(Orbital()) { - far = 50.0 - eye = Vector3(1.5, 0.0, 3.0) - fov = 40.0 - } - extend { - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene02.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene02.kt deleted file mode 100644 index d5c81207..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene02.kt +++ /dev/null @@ -1,51 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.dnk3.* - -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.extra.camera.Orbital -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/duck/Duck.gltf")) - val scene = Scene(SceneNode()) - - // -- add some lights - val lightNode = SceneNode() - lightNode.transform = transform { - translate(0.0, 10.0, 0.0) - rotate(Vector3.UNIT_X, -90.0) - } - lightNode.entities.add(DirectionalLight()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa.WHITE.shade(1.0) - downColor = ColorRGBa.WHITE.shade(0.1) - }) - scene.root.children.add(lightNode) - scene.root.children.addAll(gltf.buildSceneNodes().scenes.first()) - - // -- create a renderer - val renderer = dryRenderer() - extend(Orbital()) { - far = 500.0 - lookAt = Vector3(0.0, 0.8, 0.0) - eye = Vector3(3.0, 0.8, -2.0) - fov = 30.0 - } - extend { - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene03.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene03.kt deleted file mode 100644 index f0d6b97d..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoScene03.kt +++ /dev/null @@ -1,53 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.extra.meshgenerators.sphereMesh -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - - val root = SceneNode() - val scene = Scene(root) - - val lightNode = SceneNode() - lightNode.transform = transform { - translate(0.0, 10.0, 0.0) - } - lightNode.entities.add(PointLight()) - lightNode.entities.add(HemisphereLight(upColor = ColorRGBa.PINK, downColor = ColorRGBa(0.1,0.1,0.1))) - scene.root.children.add(lightNode) - - val meshNode = SceneNode() - val box = sphereMesh(32, 32) - val geometry = Geometry(listOf(box), null, DrawPrimitive.TRIANGLES, 0, box.vertexCount) - val material = PBRMaterial() - val primitive = MeshPrimitive(geometry, material) - val mesh = Mesh(listOf(primitive)) - meshNode.entities.add(mesh) - root.children.add(meshNode) - - // -- create a renderer - val renderer = dryRenderer() - extend(Orbital()) { - far = 500.0 - lookAt = Vector3(0.0, 0.0, 0.0) - eye = Vector3(3.0, 2.0, -3.0) - fov = 30.0 - } - extend { - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSegmentContours01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSegmentContours01.kt deleted file mode 100644 index f1af38f8..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSegmentContours01.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.WindowMultisample -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.BufferMultisample -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.segmentContourRenderer -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - multisample = WindowMultisample.SampleCount(8) - } - - program { - - val gltf = loadGltfFromFile(File("demo-data/gltf-models/fox/Fox.glb")) - val scene = Scene(SceneNode()) - - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - // -- create a renderer, try it with BufferMultisample.SampleCount(8) for better results - val renderer = segmentContourRenderer(BufferMultisample.Disabled) - extend(Orbital()) { - far = 500.0 - lookAt = Vector3(0.0, 40.0, 0.0) - eye = Vector3(150.0, 40.0, 200.0) - fov = 40.0 - } - - extend { - sceneData.animations[2].applyToTargets(seconds.mod(sceneData.animations[2].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSkinning01.kt b/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSkinning01.kt deleted file mode 100644 index 9c5df1e9..00000000 --- a/orx-jvm/orx-dnk3/src/demo/kotlin/DemoSkinning01.kt +++ /dev/null @@ -1,47 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.camera.Orbital -import org.openrndr.extra.dnk3.HemisphereLight -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode -import org.openrndr.extra.dnk3.gltf.buildSceneNodes -import org.openrndr.extra.dnk3.gltf.loadGltfFromFile -import org.openrndr.extra.dnk3.renderers.dryRenderer -import org.openrndr.math.Vector3 -import java.io.File - -fun main() = application { - configure { - width = 1280 - height = 720 - //multisample = WindowMultisample.SampleCount(8) - } - - program { - val gltf = loadGltfFromFile(File("demo-data/gltf-models/fox/Fox.glb")) - val scene = Scene(SceneNode()) - - scene.root.entities.add(HemisphereLight().apply { - upColor = ColorRGBa.WHITE.shade(0.4) - downColor = ColorRGBa.GRAY.shade(0.1) - }) - val sceneData = gltf.buildSceneNodes() - scene.root.children.addAll(sceneData.scenes.first()) - - - // -- create a renderer - val renderer = dryRenderer() - extend(Orbital()) { - far = 500.0 - lookAt = Vector3(0.0, 40.0, 0.0) - eye = Vector3(150.0, 40.0, 200.0) - fov = 40.0 - } - - extend { - sceneData.animations[2].applyToTargets(seconds.mod(sceneData.animations[2].duration)) - drawer.clear(ColorRGBa.PINK) - renderer.draw(drawer, scene) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Camera.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Camera.kt deleted file mode 100644 index 4b014da9..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Camera.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.math.Matrix44 -import org.openrndr.math.transforms.ortho -import org.openrndr.math.transforms.perspective - -class PerspectiveCamera(var node: SceneNode) : Camera() { - override val projectionMatrix: Matrix44 - get() = perspective(fov, aspectRatio, near, far) - - override val viewMatrix: Matrix44 - get() = node.worldTransform.inversed - - var aspectRatio: Double = 16.0 / 9.0 - var fov = 45.0 - var far = 100.0 - var near = 0.1 - - override fun hashCode(): Int { - var result = aspectRatio.hashCode() - result = 31 * result + fov.hashCode() - result = 31 * result + far.hashCode() - result = 31 * result + near.hashCode() - return result - } -} - -class OrthographicCamera(var node: SceneNode) : Camera() { - override val projectionMatrix: Matrix44 - get() = ortho(xMag, yMag, near, far) - - override val viewMatrix: Matrix44 - get() = node.worldTransform.inversed - - var xMag = 1.0 - var yMag = 1.0 - var near = 0.1 - var far = 100.0 - - override fun hashCode(): Int { - var result = xMag.hashCode() - result = 31 * result + yMag.hashCode() - result = 31 * result + near.hashCode() - result = 31 * result + far.hashCode() - return result - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Entity.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Entity.kt deleted file mode 100644 index e9ff407d..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Entity.kt +++ /dev/null @@ -1,103 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.IndexBuffer -import org.openrndr.draw.VertexBuffer -import org.openrndr.math.Matrix44 -import org.openrndr.math.transforms.perspective -import org.openrndr.shape.Path3D - - -class Geometry(val vertexBuffers: List, - val indexBuffer: IndexBuffer?, - val primitive: DrawPrimitive, - val offset: Int, - val vertexCount: Int) { - - override fun toString(): String { - return "Geometry(vertexBuffers: $vertexBuffers, indexBuffers: $indexBuffer, primitive: $primitive, offset: $offset, vertexCount: $vertexCount)" - } - - override fun hashCode(): Int { - var result = 0 - result = 31 * result + primitive.ordinal.hashCode() - result = 31 * result + offset.hashCode() - result = 31 * result + vertexCount.hashCode() - return result - } -} - -val DummyGeometry = Geometry(emptyList(), null, DrawPrimitive.TRIANGLES, 0, 0) - -sealed class Entity -class MeshPrimitive(var geometry: Geometry, var material: Material) { - override fun toString(): String { - return "MeshPrimitive(geometry: $geometry, material: $material)" - } - - override fun hashCode(): Int { - var result = geometry.hashCode() - result = 31 * result + material.hashCode() - return result - } -} - -class MeshPrimitiveInstance(val primitive: MeshPrimitive, val instances: Int, val attributes: List) - -class PathMesh(var paths: MutableList, var material: Material, var weight: Double) : Entity() { - override fun toString(): String { - return "PathMesh(paths=$paths)" - } - - override fun hashCode(): Int { - return paths.hashCode() - } -} - -abstract class MeshBase(var primitives: List) : Entity() -class Mesh(primitives: List) : MeshBase(primitives) { - override fun toString(): String { - return "Mesh(primitives: $primitives)" - } - - override fun hashCode(): Int { - return primitives.hashCode() - } -} - -class SkinnedMesh(primitives: List, - val joints: List, - val skeleton: SceneNode, - val inverseBindMatrices: List -) : MeshBase(primitives) - -class InstancedMesh(primitives: List, - var instances: Int, - var attributes: List) : MeshBase(primitives) - - -data class Fog(var color: ColorRGBa = ColorRGBa.WHITE, var end: Double = 100.0) : Entity() - -abstract class Light : Entity() { - var color: ColorRGBa = ColorRGBa.WHITE -} - -abstract class Camera : Entity() { - abstract val projectionMatrix: Matrix44 - abstract val viewMatrix: Matrix44 -} - -abstract class CubemapProbe : Entity() { - open val projectionMatrix: Matrix44 - get() { - return perspective(90.0, 1.0, 0.1, 150.0) - } - var dirty = true -} - -class IrradianceProbe : CubemapProbe() { - override fun hashCode(): Int { - return true.hashCode() - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Facet.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Facet.kt deleted file mode 100644 index 0cc99a62..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Facet.kt +++ /dev/null @@ -1,158 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.BlendMode -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType - -enum class FacetType(val shaderFacet: String) { - WORLD_POSITION("f_worldPosition"), - VIEW_POSITION("f_viewPosition"), - CLIP_POSITION("f_clipPosition"), - WORLD_NORMAL("f_worldNormal"), - VIEW_NORMAL("f_viewNormal"), - SPECULAR("f_specular"), - DIFFUSE("f_diffuse"), - EMISSIVE("f_emission"), - AMBIENT("f_ambient"), - OCCLUSION("f_occlusion"), - FRAGMENT_ID("f_fragmentID"), - COLOR("m_color"), -} - -abstract class FacetCombiner(val facets: Set, val targetOutput: String) { - abstract fun generateShader(): String - override fun toString(): String { - return "FacetCombiner(facets=$facets, targetOutput='$targetOutput')" - } -} - -abstract class ColorBufferFacetCombiner(facets: Set, - targetOutput: String, - val format: ColorFormat, - val type: ColorType, - val blendMode: BlendMode = BlendMode.BLEND) : FacetCombiner(facets, targetOutput) { - -} - -class MomentsFacet : ColorBufferFacetCombiner(setOf(FacetType.WORLD_POSITION), "moments", ColorFormat.RG, ColorType.FLOAT16) { - override fun generateShader(): String { - return """ - float depth = length(v_viewPosition); - float dx = dFdx(depth); - float dy = dFdy(depth); - o_$targetOutput = vec4(depth, depth*depth + 0.25 * dx*dx+dy*dy, 0.0, 1.0); - """ - } -} - -class DiffuseSpecularFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR), - "diffuseSpecular", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4( max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0), f_specular.rgb), 1.0);" -} -class DiffuseSpecularAlphaFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR), - "diffuseSpecular", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4( (max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0), f_specular.rgb)) * f_alpha, f_alpha);" -} - -class AmbientOcclusionFacet : ColorBufferFacetCombiner(setOf(FacetType.AMBIENT, FacetType.OCCLUSION), - "ambientOcclusion", ColorFormat.RGBa, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4(f_ambient, f_occlusion);" -} - -class MaterialFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE), - "material", ColorFormat.RGBa, ColorType.UINT8) { - override fun generateShader(): String = - "o_$targetOutput = vec4(m_metalness, m_roughness, 0.0, 1.0);" -} - -class BaseColorFacet : ColorBufferFacetCombiner(setOf(FacetType.COLOR), - "baseColor", ColorFormat.RGB, ColorType.UINT8) { - override fun generateShader(): String = "o_$targetOutput = vec4(m_color.rgb, 1.0);" -} - -class DiffuseFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE), - "diffuse", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4( max(vec3(0.0), f_diffuse.rgb), 1.0 );" -} - -class SpecularFacet : ColorBufferFacetCombiner(setOf(FacetType.SPECULAR), - "diffuseSpecular", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4( max(vec3(0.0), f_specular.rgb), 1.0);" -} - -class EmissiveFacet: ColorBufferFacetCombiner(setOf(FacetType.EMISSIVE), - "emissive", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = - "o_$targetOutput = vec4(f_emission, 1.0);" -} - -class EmissiveAlphaFacet: ColorBufferFacetCombiner(setOf(FacetType.EMISSIVE), - "emissive", ColorFormat.RGB, ColorType.FLOAT16, BlendMode.OVER) { - override fun generateShader(): String = - "o_$targetOutput = vec4(f_emission, f_alpha);" -} - -class PositionFacet : ColorBufferFacetCombiner(setOf(FacetType.WORLD_POSITION), "position", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = "o_$targetOutput = vec4(v_worldPosition.rgb, 1.0);" -} - -class NormalFacet : ColorBufferFacetCombiner(setOf(FacetType.WORLD_NORMAL), "normal", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = "o_$targetOutput = vec4(v_worldNormal.rgb, 1.0);" -} - -class ViewDepthFacet : ColorBufferFacetCombiner(setOf(FacetType.VIEW_POSITION), "viewDepth", ColorFormat.R, ColorType.FLOAT16) { - override fun generateShader(): String = "o_$targetOutput.r = v_viewPosition.z;" -} -class ClipDepthFacet : ColorBufferFacetCombiner(setOf(FacetType.CLIP_POSITION), "clipDepth", ColorFormat.R, ColorType.FLOAT32) { - override fun generateShader(): String = "o_$targetOutput = gl_FragCoord.z;" -} - - -class ViewPositionFacet : ColorBufferFacetCombiner(setOf(FacetType.VIEW_POSITION), "viewPosition", ColorFormat.RGB, ColorType.FLOAT32) { - override fun generateShader(): String = "o_$targetOutput.rgb = v_viewPosition.rgb;" -} - -class ViewNormalFacet : ColorBufferFacetCombiner(setOf(FacetType.VIEW_NORMAL), "viewNormal", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader(): String = "o_$targetOutput.rgb = normalize( (u_viewNormalMatrix * vec4(f_worldNormal,0.0)).xyz );" -} - -class ClipPositionFacet : ColorBufferFacetCombiner(setOf(FacetType.CLIP_POSITION), "position", ColorFormat.RGB, ColorType.FLOAT16) { - override fun generateShader() = "o_$targetOutput.rgb = gl_FragCoord.xyz;" -} - -class FragmentIDFacet: ColorBufferFacetCombiner(setOf(FacetType.FRAGMENT_ID), "fragmentID", ColorFormat.R, ColorType.UINT16_INT) { - override fun generateShader(): String { - return "o_$targetOutput = f_fragmentID;" - } -} - -class LDRColorFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR, FacetType.EMISSIVE), "color", ColorFormat.RGBa, ColorType.UINT8) { - override fun generateShader() = """ - vec3 finalColor = (max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0),f_specular.rgb) + max(vec3(0.0), f_emission.rgb) + max(vec3(0.0), f_ambient.rgb)) * (1.0 - f_fog.a) + f_fog.rgb * f_fog.a; - o_$targetOutput = pow(vec4(finalColor.rgb, 1.0), vec4(1.0/2.2)); - o_$targetOutput *= m_color.a; - - """ -} - -class HDRColorFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR, FacetType.EMISSIVE), "color", ColorFormat.RGBa, ColorType.FLOAT16) { - override fun generateShader() = """ - vec3 finalColor = (max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0),f_specular.rgb) + max(vec3(0.0), f_emission.rgb) + max(vec3(0.0), f_ambient.rgb)) * (1.0 - f_fog.a) + f_fog.rgb * f_fog.a; - o_$targetOutput = vec4(finalColor.rgb, 1.0); - o_$targetOutput *= m_color.a; - """ -} - -class DiffuseIrradianceFacet : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR), "color", ColorFormat.RGBa, ColorType.UINT8) { - override fun generateShader() = """ - vec3 finalColor = (max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0), f_emission.rgb)); - o_$targetOutput = vec4(finalColor.rgb, 1.0); - - - """ -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Feature.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Feature.kt deleted file mode 100644 index 27ecd22e..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Feature.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.Drawer - -interface Feature { - fun update( - drawer: Drawer, - sceneRenderer: SceneRenderer, - scene: Scene, - feature: T, - context: RenderContext - ) -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Light.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Light.kt deleted file mode 100644 index f57f57b7..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Light.kt +++ /dev/null @@ -1,83 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Cubemap -import org.openrndr.draw.RenderTarget -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.ortho -import org.openrndr.math.transforms.perspective - -@JvmRecord -data class LightContext(val lights: List>, - val shadowMaps: Map) - -interface AttenuatedLight { - var constantAttenuation: Double - var linearAttenuation: Double - var quadraticAttenuation: Double -} - -class DirectionalLight(var direction: Vector3 = -Vector3.UNIT_Z, override var shadows: Shadows = Shadows.None) : Light(), ShadowLight { - var projectionSize = 50.0 - - override fun projection(renderTarget: RenderTarget): Matrix44 { - return ortho(-projectionSize / 2.0, projectionSize / 2.0, -projectionSize / 2.0, projectionSize / 2.0, 1.0, 150.0) - } - - override fun hashCode(): Int { - return color.hashCode() - } -} - -class SpotLight(var direction: Vector3 = -Vector3.UNIT_Z, var innerAngle: Double = 45.0, var outerAngle: Double = 90.0) : Light(), ShadowLight, AttenuatedLight { - override var constantAttenuation = 1.0 - override var linearAttenuation = 0.0 - override var quadraticAttenuation = 0.0 - override var shadows: Shadows = Shadows.None - override fun projection(renderTarget: RenderTarget): Matrix44 { - return perspective(outerAngle * 2.0, renderTarget.width * 1.0 / renderTarget.height, 1.0, 150.0) - } - - override fun hashCode(): Int { - var result = direction.hashCode() - result = 31 * result + innerAngle.hashCode() - result = 31 * result + outerAngle.hashCode() - result = 31 * result + constantAttenuation.hashCode() - result = 31 * result + linearAttenuation.hashCode() - result = 31 * result + quadraticAttenuation.hashCode() - return result - } -} - -class HemisphereLight(var direction: Vector3 = Vector3.UNIT_Y, - var upColor: ColorRGBa = ColorRGBa.WHITE, - var downColor: ColorRGBa = ColorRGBa.BLACK) : Light() { - var irradianceMap: Cubemap? = null - override fun hashCode(): Int { - var result = direction.hashCode() - result = 31 * result + upColor.hashCode() - result = 31 * result + downColor.hashCode() - return result - } - -} - -class PointLight(var constantAttenuation: Double = 1.0, - var linearAttenuation: Double = 0.0, - var quadraticAttenuation: Double = 1.0) : Light() { - override fun hashCode(): Int { - var result = constantAttenuation.hashCode() - result = 31 * result + linearAttenuation.hashCode() - result = 31 * result + quadraticAttenuation.hashCode() - result = 31 * result + color.hashCode() - return result - } -} - -class AmbientLight : Light() { - - override fun hashCode(): Int { - return color.hashCode() - } -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Material.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Material.kt deleted file mode 100644 index fa9e85ff..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Material.kt +++ /dev/null @@ -1,61 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.Cubemap -import org.openrndr.draw.RenderTarget -import org.openrndr.draw.ShadeStyle -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.dnk3.features.IrradianceSH - -interface Material { - val name: String? - var doubleSided: Boolean - var transparent: Boolean - val fragmentID: Int - fun generateShadeStyle(context: MaterialContext, primitiveContext: PrimitiveContext): ShadeStyle - fun applyToShadeStyle(context: MaterialContext, shadeStyle: ShadeStyle) -} - -class DummyMaterial : Material { - override var name: String? = null - override var doubleSided: Boolean = true - override var transparent: Boolean = false - override var fragmentID = 0 - - override fun generateShadeStyle(context: MaterialContext, primitiveContext: PrimitiveContext): ShadeStyle { - return shadeStyle { - fragmentPreamble = """ - int f_fragmentID = p_fragmentID; - """.trimIndent() - - fragmentTransform = """ - x_fill.rgb = vec3(normalize(v_viewNormal).z); - """.trimIndent() - - parameter("fragmentID", fragmentID) - } - } - - override fun applyToShadeStyle(context: MaterialContext, shadeStyle: ShadeStyle) { - - } - -} - -data class MaterialContext(val pass: RenderPass, - val lights: List>, - val fogs: List>, - val shadowMaps: Map, - val meshCubemaps: Map, - val irradianceProbeCount: Int - ) { - - var irradianceSH: IrradianceSH? = null -} - - - -@JvmRecord -data class PrimitiveContext(val hasNormalAttribute: Boolean, val hasSkinning: Boolean) - -@JvmRecord -data class ContextKey(val materialContext: MaterialContext, val primitiveContext: PrimitiveContext) diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt b/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt deleted file mode 100644 index 6e8a7e50..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt +++ /dev/null @@ -1,731 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.cubemap.glslEvaluateSH -import org.openrndr.extra.dnk3.cubemap.glslFetchSH -import org.openrndr.extra.dnk3.cubemap.genGlslGatherSH -import org.openrndr.extra.shaderphrases.phrases.phraseTbnMatrix -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.transforms.normalMatrix -import java.nio.ByteBuffer -import kotlin.math.cos - -private val noise128 by lazy { - val cb = colorBuffer(128, 128) - val items = cb.width * cb.height * cb.format.componentCount - val buffer = ByteBuffer.allocateDirect(items) - for (y in 0 until cb.height) { - for (x in 0 until cb.width) { - for (i in 0 until 4) - buffer.put((Math.random() * 255).toInt().toByte()) - } - } - buffer.rewind() - cb.write(buffer) - cb.generateMipmaps() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - cb -} - -private fun PointLight.fs(index: Int, hasNormalAttribute: Boolean): String = """ -|{ -| vec3 Lr = p_lightPosition$index - v_worldPosition; -| float distance = length(Lr); -| float attenuation = 1.0 / (p_lightConstantAttenuation$index + -| p_lightLinearAttenuation$index * distance + p_lightQuadraticAttenuation$index * distance * distance); -| vec3 L = normalize(Lr); -| -| float side = ${if (hasNormalAttribute) "dot(L, N)" else "3.1415"}; -| f_diffuse += attenuation * max(0.0, side / 3.1415) * p_lightColor$index.rgb * m_color.rgb; -| f_specular += attenuation * ggx(N, V, L, m_roughness, m_f0) * p_lightColor$index.rgb * m_color.rgb; -} -""".trimMargin() - -private fun AmbientLight.fs(index: Int): String = "f_ambient += p_lightColor$index.rgb * ((1.0 - m_metalness) * m_color.rgb);" - -private fun DirectionalLight.fs(index: Int, hasNormalAttribute: Boolean) = """ -|{ -| vec3 L = normalize(-p_lightDirection$index); -| float attenuation = 1.0; -| vec3 H = normalize(V + L); -| float NoL = ${if (hasNormalAttribute) "clamp(dot(N, L), 0.0, 1.0)" else "1"}; -| float LoH = clamp(dot(L, H), 0.0, 1.0); -| float NoH = ${if (hasNormalAttribute) "clamp(dot(N, H), 0.0, 1.0)" else "1"}; -| vec3 Lr = (p_lightPosition$index - v_worldPosition); -//| vec3 L = normalize(Lr); -| ${shadows.fs(index)} -| -| f_diffuse += NoL * attenuation * Fd_Burley(m_roughness * m_roughness, NoV, NoL, LoH) * p_lightColor$index.rgb * m_color.rgb * m_ambientOcclusion;; -| float Dg = D_GGX(m_roughness * m_roughness, NoH, H); -| float Vs = V_SmithGGXCorrelated(m_roughness * m_roughness, NoV, NoL); -| vec3 F = F_Schlick(m_color.rgb * (m_metalness) + 0.04 * (1.0-m_metalness), LoH); -| vec3 Fr = (Dg * Vs) * F; -| f_specular += NoL * attenuation * Fr * p_lightColor$index.rgb * m_ambientOcclusion;; -|} -""".trimMargin() - -private fun HemisphereLight.fs(index: Int, hasNormalAttribute: Boolean): String = """ -|{ -| float f = ${if (hasNormalAttribute) "dot(N, p_lightDirection$index) * 0.5 + 0.5" else "1.0"}; -| vec3 irr = ${irradianceMap?.let { "texture(p_lightIrradianceMap$index, N).rgb" } ?: "vec3(1.0)"}; -| f_diffuse += mix(p_lightDownColor$index.rgb, p_lightUpColor$index.rgb, f) * irr * ((1.0 - m_metalness) * m_color.rgb) * m_ambientOcclusion; -|} -""".trimMargin() - -private fun SpotLight.fs(index: Int, hasNormalAttribute: Boolean): String { - val shadows = shadows - return """ -|{ -| vec3 Lr = p_lightPosition$index - v_worldPosition; -| float distance = length(Lr); -| float attenuation = 1.0 / (p_lightConstantAttenuation$index + -| p_lightLinearAttenuation$index * distance + p_lightQuadraticAttenuation$index * distance * distance); -| attenuation = 1.0; -| vec3 L = normalize(Lr); - -| float NoL = ${if (hasNormalAttribute) "clamp(dot(N, L), 0.0, 1.0)" else "1"}; -| float side = dot(L, N); -| float hit = max(dot(-L, p_lightDirection$index), 0.0); -| float falloff = clamp((hit - p_lightOuterCos$index) / (p_lightInnerCos$index - p_lightOuterCos$index), 0.0, 1.0); -| attenuation *= falloff; -| ${shadows.fs(index)} -| { -| vec3 H = normalize(V + L); -| float LoH = clamp(dot(L, H), 0.0, 1.0); -| float NoH = ${if (hasNormalAttribute) "clamp(dot(N, H), 0.0, 1.0)" else 1.0}; -| f_diffuse += NoL * (0.1+0.9*attenuation) * Fd_Burley(m_roughness * m_roughness, NoV, NoL, LoH) * p_lightColor$index.rgb * m_color.rgb ; -| float Dg = D_GGX(m_roughness * m_roughness, NoH, H); -| float Vs = V_SmithGGXCorrelated(m_roughness * m_roughness, NoV, NoL); -| vec3 F = F_Schlick(m_color.rgb * (m_metalness) + 0.04 * (1.0-m_metalness), LoH); -| vec3 Fr = (Dg * Vs) * F; -| f_specular += NoL * attenuation * Fr * p_lightColor$index.rgb; -| } -} -""".trimMargin() -} - -private fun Fog.fs(index: Int): String = """ -|{ -| float dz = min(1.0, -v_viewPosition.z/p_fogEnd$index); -| f_fog = vec4(p_fogColor$index.rgb, dz); -|} -""".trimMargin() - -sealed class TextureSource -object DummySource : TextureSource() { - override fun toString(): String { - return "DummySource()" - } -} - -abstract class TextureFromColorBuffer(var texture: ColorBuffer, var textureFunction: TextureFunction) : TextureSource() - -class TextureFromCode(val code: String) : TextureSource() { - override fun hashCode(): Int { - return code.hashCode() - } -} - -private fun TextureFromCode.fs(index: Int, target: TextureTarget) = """ -|vec4 tex$index = vec4(0.0, 0.0, 0.0, 1.0); -|{ -|vec4 texOut; -|$code; -|tex$index = texOut; -|} -""" - -enum class TextureFunction(val function: (String, String) -> String) { - TILING({ texture, uv -> "texture($texture, $uv)" }), - NOT_TILING({ texture, uv -> "textureNoTile(p_textureNoise, $texture, x_noTileOffset, $uv)" }) - ; -} - -/** - * @param texture the texture to sample from - * @param input input coordinates, default is "va_texCoord0.xy" - * @param textureFunction the texture function to use, default is TextureFunction.TILING - * @param pre the pre-fetch shader code to inject, can only adjust "x_texCoord" - * @param post the post-fetch shader code to inject, can only adjust "x_texture" - */ -class ModelCoordinates(texture: ColorBuffer, - var input: String = "va_texCoord0.xy", - var tangentInput: String? = null, - textureFunction: TextureFunction = TextureFunction.TILING, - var pre: String? = null, - var post: String? = null) : TextureFromColorBuffer(texture, textureFunction) { - override fun toString(): String { - return "ModelCoordinates(texture: $texture, input: $input, $tangentInput: $tangentInput, textureFunction: $textureFunction, pre: $pre, post: $post)" - } - - override fun hashCode(): Int { - var result = input.hashCode() - result = 31 * result + (tangentInput?.hashCode() ?: 0) - result = 31 * result + (pre?.hashCode() ?: 0) - result = 31 * result + (post?.hashCode() ?: 0) - return result - } -} - - -class Triplanar(texture: ColorBuffer, - var scale: Double = 1.0, - var offset: Vector3 = Vector3.ZERO, - var sharpness: Double = 2.0, - textureFunction: TextureFunction = TextureFunction.TILING, - var pre: String? = null, - var post: String? = null) : TextureFromColorBuffer(texture, textureFunction) { - - init { - texture.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - texture.wrapU = WrapMode.REPEAT - texture.wrapV = WrapMode.REPEAT - } - - override fun hashCode(): Int { - var result = scale.hashCode() - result = 31 * result + offset.hashCode() - result = 31 * result + sharpness.hashCode() - result = 31 * result + (pre?.hashCode() ?: 0) - result = 31 * result + (post?.hashCode() ?: 0) - return result - } - - -} - -private fun ModelCoordinates.fs(index: Int) = """ -|vec4 tex$index = vec4(0.0, 0.0, 0.0, 1.0); -|{ -| vec2 x_texCoord = $input; -| vec2 x_noTileOffset = vec2(0.0); -| vec4 x_texture; -| ${if (pre != null) "{ $pre } " else ""} -| x_texture = ${textureFunction.function("p_texture$index", "x_texCoord")}; -| ${if (post != null) "{ $post } " else ""} -| ${if (tangentInput != null) { - """ -| vec3 normal = normalize(va_normal.xyz); -| vec3 tangent = normalize(${tangentInput}.xyz); -| vec3 bitangent = cross(normal, tangent) * ${tangentInput}.w; -| mat3 tbn = mat3(tangent, bitangent, normal); -| x_texture.rgb = tbn * normalize( (x_texture.rgb - vec3(0.5, 0.5, 0.0))*vec3(2.0, 2.0, 1.0)) ; -""".trimMargin() - -} else ""} -| tex$index = x_texture; -|} -""".trimMargin() - -private fun Triplanar.fs(index: Int, target: TextureTarget) = """ -|vec4 tex$index = vec4(0.0, 0.0, 0.0, 1.0); -|{ -| vec3 x_normal = va_normal; -| vec3 x_position = va_position; -| float x_scale = p_textureTriplanarScale$index; -| vec3 x_offset = p_textureTriplanarOffset$index; -| vec2 x_noTileOffset = vec2(0.0); -| ${if (pre != null) "{ $pre } " else ""} -| vec3 n = normalize(x_normal); -| vec3 an = abs(n); -| vec2 uvY = x_position.xz * x_scale + x_offset.x; -| vec2 uvX = x_position.zy * x_scale + x_offset.y; -| vec2 uvZ = x_position.xy * x_scale + x_offset.z; -| vec4 tY = ${textureFunction.function("p_texture$index", "uvY")}; -| vec4 tX = ${textureFunction.function("p_texture$index", "uvX")}; -| vec4 tZ = ${textureFunction.function("p_texture$index", "uvZ")}; -| vec3 weights = pow(an, vec3(p_textureTriplanarSharpness$index)); -| weights = weights / (weights.x + weights.y + weights.z); -| tex$index = tX * weights.x + tY * weights.y + weights.z * tZ; -| ${if (target == TextureTarget.NORMAL) """ - | vec3 tnX = normalize( tX.xyz - vec3(0.5, 0.5, 0.0)); - | vec3 tnY = normalize( tY.xyz - vec3(0.5, 0.5, 0.0)) * vec3(1.0, -1.0, 1.0); - | vec3 tnZ = normalize( tZ.xyz - vec3(0.5, 0.5, 0.0)); - | vec3 nX = vec3(0.0, tnX.yx); - | vec3 nY = vec3(tnY.x, 0.0, tnY.y); - | vec3 nZ = vec3(tnZ.xy, 0.0); - | vec3 normal = normalize(nX * weights.x + nY * weights.y + nZ * weights.z + n); - | tex$index = vec4(normal, 0.0); -""".trimMargin() else ""} -|} - ${if (post != null) """ - vec4 x_texture = tex$index; - { - $post - } - tex$index = x_texture; - """.trimIndent() else ""} -""".trimMargin() - -sealed class TextureTarget(val name: String) { - object NONE : TextureTarget("NONE") - object COLOR : TextureTarget("COLOR") - object ROUGHNESS : TextureTarget("ROUGHNESS") - object METALNESS : TextureTarget("METALNESS") - object METALNESS_ROUGHNESS : TextureTarget("METALNESS_ROUGHNESS") - object EMISSION : TextureTarget("EMISSION") - object NORMAL : TextureTarget("NORMAL") - object AMBIENT_OCCLUSION : TextureTarget("AMBIENT_OCCLUSION") - class Height(var scale: Double = 1.0) : TextureTarget("Height") - - override fun toString(): String { - return "TextureTarget(name: $name)" - } - - override fun hashCode(): Int { - return name.hashCode() - } -} - -class Texture(var source: TextureSource, - var target: TextureTarget) { - fun copy(): Texture { - val copied = Texture(source, target) - return copied - } - - override fun toString(): String { - return "Texture(source: $source, target: $target)" - } - - override fun hashCode(): Int { - var result = source.hashCode() - result = 31 * result + target.hashCode() - return result - } -} - -private var fragmentIDCounter = 1 - -data class SubsurfaceScatter(var enabled: Boolean) { - var color: ColorRGBa = ColorRGBa.WHITE - var shape = 1.0 - - fun fs(): String { - return if (enabled) """ - f_diffuse.rgb += pow(smoothstep(1.0, 0.0, abs(dot(normalize(N),normalize(V)))), p_sssShape) * clamp(evaluateSH(-V, sh), vec3(0.0), vec3(1.0)) * p_sssColor.rgb; - """ else "" - } - - fun applyToShadeStyle(shadeStyle: ShadeStyle) { - if (enabled) { - shadeStyle.parameter("sssColor", color) - shadeStyle.parameter("sssShape", shape) - } - } -} - -data class CubemapReflection(var cubemap: Cubemap? = null) { - var color: ColorRGBa = ColorRGBa.WHITE - - fun fs(): String { - return if (cubemap != null) { - """ - vec2 dfg = PrefilteredDFG_Karis(m_roughness, NoV); - vec3 sc = m_metalness * m_color.rgb + (1.0-m_metalness) * vec3(0.04); - f_specular.rgb += sc * (texture(p_radianceMap, reflect(-V, normalize(f_worldNormal)), m_roughness*7.0 ).rgb * dfg.x + dfg.y) * p_radianceColor.rgb; - """ - } else { "" } - } - fun applyToShadeStyle(shadeStyle: ShadeStyle) { - if (cubemap != null) { - shadeStyle.parameter("radianceMap", cubemap!!) - shadeStyle.parameter("radianceColor", color) - } - } -} - - -class PBRMaterial : Material { - override var name: String? = null - override fun toString(): String { - return "PBRMaterial(name: $name, fragmentID: $fragmentID, doubleSided: $doubleSided, textures: $textures, color: $color, metalness: $metalness, roughness: $roughness, emissive: $emission))" - } - - override var fragmentID = fragmentIDCounter.apply { - fragmentIDCounter++ - } - - override var doubleSided: Boolean = false - override var transparent: Boolean = false - var environmentMap = false - var color = ColorRGBa.WHITE - var metalness = 0.5 - var roughness = 1.0 - var emission = ColorRGBa.BLACK - - var subsurfaceScatter = SubsurfaceScatter(false) - var cubemapReflection = CubemapReflection(null) - - - var fragmentPreamble: String? = null - var vertexPreamble: String? = null - var vertexTransform: String? = null - var parameters = mutableMapOf() - var textures = mutableListOf() - - val shadeStyles = mutableMapOf() - - override fun generateShadeStyle(materialContext: MaterialContext, primitiveContext: PrimitiveContext): ShadeStyle { - val cached = shadeStyles.getOrPut(ContextKey(materialContext, primitiveContext)) { - val needLight = needLight(materialContext) - val preambleFS = """ - vec4 m_color = p_color; - uint f_fragmentID = uint(p_fragmentID); - float m_f0 = 0.5; - float m_roughness = p_roughness; - float m_metalness = p_metalness; - float m_ambientOcclusion = 1.0; - vec3 m_emission = p_emission.rgb; - vec3 m_normal = vec3(0.0, 0.0, 1.0); - vec4 f_fog = vec4(0.0, 0.0, 0.0, 0.0); - vec3 f_worldNormal = v_worldNormal; - vec3 f_emission = m_emission; - """.trimIndent() - - val textureFs = if (needLight) { - (textures.mapIndexed { index, it -> - when (val source = it.source) { - DummySource -> "vec4 tex$index = vec4(1.0);" - is ModelCoordinates -> source.fs(index) - is Triplanar -> source.fs(index, it.target) - is TextureFromCode -> source.fs(index, it.target) - else -> TODO() - } - } + textures.mapIndexed { index, texture -> - when (texture.target) { - TextureTarget.NONE -> "" - TextureTarget.COLOR -> "m_color.rgb *= pow(tex$index.rgb, vec3(2.2)); m_color.a *= tex$index.a;" - TextureTarget.METALNESS -> "m_metalness = tex$index.r;" - TextureTarget.ROUGHNESS -> "m_roughness = tex$index.r;" - TextureTarget.METALNESS_ROUGHNESS -> "m_metalness = tex$index.r; m_roughness = tex$index.g;" - TextureTarget.EMISSION -> "m_emission *= tex$index.rgb;" - TextureTarget.NORMAL -> "f_worldNormal = normalize((v_modelNormalMatrix * vec4(tex$index.xyz,0.0)).xyz);" - TextureTarget.AMBIENT_OCCLUSION -> "m_ambientOcclusion *= tex$index.r;" - is TextureTarget.Height -> "" - } - }).joinToString("\n") - } else "" - val displacers = textures.filter { it.target is TextureTarget.Height } - - val skinVS = if (primitiveContext.hasSkinning) """ - uvec4 j = a_joints; - mat4 skinTransform = p_jointTransforms[j.x] * a_weights.x - + p_jointTransforms[j.y] * a_weights.y - + p_jointTransforms[j.z] * a_weights.z - + p_jointTransforms[j.w] * a_weights.w; - ${if (primitiveContext.hasNormalAttribute) """ - x_normal = normalize(mat3(skinTransform) * x_normal); - """.trimIndent() else ""} - - x_position = (skinTransform * vec4(x_position,1)).xyz; - """.trimIndent() else "" - - val textureVS = if (displacers.isNotEmpty()) textures.mapIndexed { index, it -> - if (it.target is TextureTarget.Height) { - when (val source = it.source) { - DummySource -> "vec4 tex$index = vec4(1.0);" - is ModelCoordinates -> source.fs(index) - is Triplanar -> source.fs(index, it.target) - is TextureFromCode -> source.fs(index, it.target) - else -> TODO() - } + """ - x_position += x_normal * tex$index.r * p_textureHeightScale$index; - """.trimIndent() - } else "" - }.joinToString("\n") else "" - - val lights = materialContext.lights - - val doubleSidedFS = if (doubleSided) { - """ - if (dot(V, N) <0) { - N *= -1.0; - } - """.trimIndent() - } else "" - val lightFS = if (needLight) """ - vec3 f_diffuse = vec3(0.0); - vec3 f_specular = vec3(0.0); - vec3 f_ambient = vec3(0.0); - float f_occlusion = 1.0; - vec3 N = normalize(f_worldNormal); - - vec3 ep = (p_viewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0)).xyz; - vec3 Vr = ep - v_worldPosition; - vec3 V = normalize(Vr); - - float NoV = ${if (primitiveContext.hasNormalAttribute) "abs(dot(N, V)) + 1e-5" else "1.0"}; - - ${if (environmentMap && materialContext.meshCubemaps.isNotEmpty() && primitiveContext.hasNormalAttribute) """ - { - vec2 dfg = PrefilteredDFG_Karis(m_roughness, NoV); - vec3 sc = m_metalness * m_color.rgb + (1.0-m_metalness) * vec3(0.04); - - f_specular.rgb += sc * (texture(p_environmentMap, reflect(-V, normalize(f_worldNormal))).rgb * dfg.x + dfg.y) * m_ambientOcclusion; - } - """.trimIndent() else ""} - - ${lights.mapIndexed { index, (node, light) -> - when (light) { - is AmbientLight -> light.fs(index) - is PointLight -> light.fs(index, primitiveContext.hasNormalAttribute) - is SpotLight -> light.fs(index, primitiveContext.hasNormalAttribute) - is DirectionalLight -> light.fs(index, primitiveContext.hasNormalAttribute) - is HemisphereLight -> light.fs(index, primitiveContext.hasNormalAttribute) - else -> TODO() - } - }.joinToString("\n")} - - - ${if (materialContext.irradianceSH?.shMap != null) """ - vec3[9] sh; - gatherSH(p_shMap, v_worldPosition, sh); - vec3 irradiance = clamp(evaluateSH(normalize(N), sh), vec3(0.0), vec3(1.0)) * m_color.rgb; - vec3 ks = F_SchlickRoughness(m_color.rgb * (m_metalness) + 0.04 * (1.0-m_metalness), m_roughness+0.1, min(NoV, 1.0-1.0e-6)); - f_diffuse.rgb = irradiance * ks; - f_ambient.rgb = (1.0-ks) * irradiance; - ${subsurfaceScatter.fs()} - ${cubemapReflection.fs()} - """.trimIndent() else "" - } - - ${materialContext.fogs.mapIndexed { index, (node, fog) -> - - fog.fs(index) - }.joinToString("\n")} - - """.trimIndent() else "" - val rt = RenderTarget.active - - val combinerFS = materialContext.pass.combiners.map { - it.generateShader() - }.joinToString("\n") - - val fs = preambleFS + textureFs + lightFS + combinerFS - val vs = (this@PBRMaterial.vertexTransform ?: "") + textureVS + skinVS - - shadeStyle { - fragmentPreamble = this@PBRMaterial.fragmentPreamble ?: "" - vertexPreamble = """ - $shaderNoRepetitionVert - ${(this@PBRMaterial.vertexPreamble) ?: ""} - """.trimIndent() - fragmentPreamble += """ - ${if (materialContext.irradianceSH?.shMap != null) { - """ - $glslEvaluateSH - $glslFetchSH - ${genGlslGatherSH(materialContext.irradianceSH!!.xCount, materialContext.irradianceSH!!.yCount, - materialContext.irradianceSH!!.zCount, materialContext.irradianceSH!!.spacing, materialContext.irradianceSH!!.offset)} - """ - } else { - "" - } - } - |$shaderLinePlaneIntersect - |$shaderProjectOnPlane - |$shaderSideOfPlane - |$shaderGGX - |$shaderVSM - |$shaderNoRepetition - |$phraseTbnMatrix - """.trimMargin() - this.suppressDefaultOutput = true - this.vertexTransform = vs - fragmentTransform = fs - - materialContext.pass.combiners.map { - if (rt is ProgramRenderTarget || materialContext.pass === DefaultPass || materialContext.pass === DefaultOpaquePass || materialContext.pass == DefaultTransparentPass || materialContext.pass == IrradianceProbePass || materialContext.pass.skipTarget ) { - this.output(it.targetOutput, ShadeStyleOutput(0)) - } else { - val index = rt.colorAttachmentIndexByName(it.targetOutput)?:error("attachment ${it.targetOutput} not found") - val type = rt.colorBuffer(index).type - val format = rt.colorBuffer(index).format - this.output(it.targetOutput, ShadeStyleOutput(index, format, type)) - } - } - } - } - return cached - } - - private fun needLight(context: MaterialContext): Boolean { - val needSpecular = context.pass.combiners.any { FacetType.SPECULAR in it.facets } - val needDiffuse = context.pass.combiners.any { FacetType.DIFFUSE in it.facets } - val needLight = needSpecular || needDiffuse - return needLight - } - - override fun applyToShadeStyle(context: MaterialContext, shadeStyle: ShadeStyle) { - shadeStyle.parameter("emission", emission) - shadeStyle.parameter("color", color) - shadeStyle.parameter("metalness", metalness) - shadeStyle.parameter("roughness", roughness) - shadeStyle.parameter("fragmentID", fragmentID) - - if (context.irradianceProbeCount > 0) { - shadeStyle.parameter("shMap", context.irradianceSH?.shMap!!) - } - - parameters.forEach { (k, v) -> - when (v) { - is Double -> shadeStyle.parameter(k, v) - is Int -> shadeStyle.parameter(k, v) - is Vector2 -> shadeStyle.parameter(k, v) - is Vector3 -> shadeStyle.parameter(k, v) - is Vector4 -> shadeStyle.parameter(k, v) - is BufferTexture -> shadeStyle.parameter(k, v) - is ColorBuffer -> shadeStyle.parameter(k, v) - else -> TODO("support ${v::class.java}") - } - } - if (needLight(context)) { - - subsurfaceScatter.applyToShadeStyle(shadeStyle) - cubemapReflection.applyToShadeStyle(shadeStyle) - - textures.forEachIndexed { index, texture -> - when (val source = texture.source) { - is TextureFromColorBuffer -> { - shadeStyle.parameter("texture$index", source.texture) - if (source.textureFunction == TextureFunction.NOT_TILING) { - shadeStyle.parameter("textureNoise", noise128) - } - } - else -> {} - } - when (val source = texture.source) { - is Triplanar -> { - shadeStyle.parameter("textureTriplanarSharpness$index", source.sharpness) - shadeStyle.parameter("textureTriplanarScale$index", source.scale) - shadeStyle.parameter("textureTriplanarOffset$index", source.offset) - } - else -> {} - } - if (texture.target is TextureTarget.Height) { - val target = texture.target as TextureTarget.Height - shadeStyle.parameter("textureHeightScale$index", target.scale) - } - - } - - val lights = context.lights - lights.forEachIndexed { index, (node, light) -> - shadeStyle.parameter("lightColor$index", light.color) - when (light) { - is AmbientLight -> { - } - is PointLight -> { - shadeStyle.parameter("lightPosition$index", (node.worldTransform * Vector4.UNIT_W).xyz) - shadeStyle.parameter("lightConstantAttenuation$index", light.constantAttenuation) - shadeStyle.parameter("lightLinearAttenuation$index", light.linearAttenuation) - shadeStyle.parameter("lightQuadraticAttenuation$index", light.quadraticAttenuation) - } - - is SpotLight -> { - shadeStyle.parameter("lightPosition$index", (node.worldTransform * Vector4.UNIT_W).xyz) - shadeStyle.parameter("lightDirection$index", ((normalMatrix(node.worldTransform)) * light.direction.xyz0).normalized.xyz) - shadeStyle.parameter("lightConstantAttenuation$index", light.constantAttenuation) - shadeStyle.parameter("lightLinearAttenuation$index", light.linearAttenuation) - shadeStyle.parameter("lightQuadraticAttenuation$index", light.quadraticAttenuation) - shadeStyle.parameter("lightInnerCos$index", cos(Math.toRadians(light.innerAngle))) - shadeStyle.parameter("lightOuterCos$index", cos(Math.toRadians(light.outerAngle))) - - if (light.shadows is Shadows.MappedShadows) { - context.shadowMaps[light]?.let { - val look = light.view(node) - shadeStyle.parameter("lightTransform$index", - light.projection(it) * look) - - if (light.shadows is Shadows.DepthMappedShadows) { - shadeStyle.parameter("lightShadowMap$index", it.depthBuffer?:error("no depth buffer for $it")) - } - - if (light.shadows is Shadows.ColorMappedShadows) { - shadeStyle.parameter("lightShadowMap$index", it.colorBuffer(0)) - } - } - } - } - is DirectionalLight -> { - shadeStyle.parameter("lightPosition$index", (node.worldTransform * Vector4.UNIT_W).xyz) - shadeStyle.parameter("lightDirection$index", ((normalMatrix(node.worldTransform)) * light.direction.xyz0).normalized.xyz) - if (light.shadows is Shadows.MappedShadows) { - context.shadowMaps[light]?.let { - val look = light.view(node) - shadeStyle.parameter("lightTransform$index", - light.projection(it) * look) - - if (light.shadows is Shadows.DepthMappedShadows) { - shadeStyle.parameter("lightShadowMap$index", it.depthBuffer ?: TODO()) - } - - if (light.shadows is Shadows.ColorMappedShadows) { - shadeStyle.parameter("lightShadowMap$index", it.colorBuffer(0)) - } - } - } - } - - is HemisphereLight -> { - shadeStyle.parameter("lightDirection$index", ((normalMatrix(node.worldTransform)) * light.direction.xyz0).normalized.xyz) - shadeStyle.parameter("lightUpColor$index", light.upColor) - shadeStyle.parameter("lightDownColor$index", light.downColor) - - light.irradianceMap?.let { - shadeStyle.parameter("lightIrradianceMap$index", it) - } - } - } - } - context.fogs.forEachIndexed { index, (node, fog) -> - shadeStyle.parameter("fogColor$index", fog.color) - shadeStyle.parameter("fogEnd$index", fog.end) - } - } else { - textures.forEachIndexed { index, texture -> - if (texture.target is TextureTarget.Height) { - when (val source = texture.source) { - is TextureFromColorBuffer -> shadeStyle.parameter("texture$index", source.texture) - else -> {} - } - when (val source = texture.source) { - is Triplanar -> { - shadeStyle.parameter("textureTriplanarSharpness$index", source.sharpness) - shadeStyle.parameter("textureTriplanarScale$index", source.scale) - shadeStyle.parameter("textureTriplanarOffset$index", source.offset) - } - else -> {} - } - val target = texture.target as TextureTarget.Height - shadeStyle.parameter("textureHeightScale$index", target.scale) - } - } - } - } - - override fun hashCode(): Int { - var result = fragmentID.hashCode() - result = 31 * doubleSided.hashCode() - result = 31 * result + transparent.hashCode() -// result = 31 * result + environmentMap.hashCode() - result = 31 * result + color.hashCode() - result = 31 * result + metalness.hashCode() - result = 31 * result + roughness.hashCode() - result = 31 * result + emission.hashCode() - result = 31 * result + (fragmentPreamble?.hashCode() ?: 0) - result = 31 * result + (vertexPreamble?.hashCode() ?: 0) - result = 31 * result + (vertexTransform?.hashCode() ?: 0) -// result = 31 * result + parameters.hashCode() -// result = 31 * result + textures.hashCode() -// result = 31 * result + shadeStyles.hashCode() - return result - } -} - diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Post.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Post.kt deleted file mode 100644 index 37215e11..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Post.kt +++ /dev/null @@ -1,62 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.* -import org.openrndr.math.Matrix44 - -@JvmRecord -data class PostContext(val lightContext: LightContext, val inverseViewMatrix: Matrix44) - -interface PostStep { - fun apply(buffers: MutableMap, postContext: PostContext) -} - -class FilterPostStep(val outputScale: Double, - val filter: T, - val inputs: List, - val output: String, - val outputFormat: ColorFormat, - val outputType: ColorType, - val update: (T.(PostContext) -> Unit)? = null) : PostStep { - - override fun apply(buffers: MutableMap, postContext: PostContext) { - val inputBuffers = inputs.map { buffers[it]?: error("buffer not found: $it") } - val outputBuffer = buffers.getOrPut(output) { - colorBuffer((inputBuffers[0].width * outputScale).toInt(), - (inputBuffers[0].height * outputScale).toInt(), - format = outputFormat, - type = outputType) - } - update?.invoke(filter, postContext) - filter.apply(inputBuffers.toTypedArray(), outputBuffer) - } -} - -class FunctionPostStep(val function:(MutableMap)->Unit) : PostStep { - override fun apply(buffers: MutableMap, postContext: PostContext) { - function(buffers) - } -} - -class FilterPostStepBuilder(val filter: T) { - var outputScale = 1.0 - val inputs = mutableListOf() - var output = "untitled" - var outputFormat = ColorFormat.RGBa - var outputType = ColorType.UINT8 - var update: (T.(PostContext) -> Unit)? = null - - internal fun build(): PostStep { - @Suppress("UNCHECKED_CAST", "PackageDirectoryMismatch") - return FilterPostStep(outputScale, filter, inputs, output, outputFormat, outputType, update as (Filter.(PostContext) -> Unit)?) - } -} - -fun postStep(filter: T, configure: FilterPostStepBuilder.() -> Unit) : PostStep { - val psb = FilterPostStepBuilder(filter) - psb.configure() - return psb.build() -} - -fun postStep(function: (MutableMap)->Unit) : PostStep { - return FunctionPostStep(function) -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/RenderPass.kt b/orx-jvm/orx-dnk3/src/main/kotlin/RenderPass.kt deleted file mode 100644 index 8b324c40..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/RenderPass.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.BufferMultisample -import org.openrndr.draw.DepthFormat -import org.openrndr.draw.RenderTarget -import org.openrndr.draw.renderTarget - -@JvmRecord -data class RenderPass(val combiners: List, - val renderOpaque: Boolean = true, - val renderTransparent: Boolean = false, - val depthWrite: Boolean = true, - val multisample: BufferMultisample = BufferMultisample.Disabled, - val skipTarget: Boolean = false -) - - -val DefaultPass = RenderPass(listOf(LDRColorFacet())) -val IrradianceProbePass = RenderPass(listOf(DiffuseIrradianceFacet())) - -val DefaultOpaquePass = RenderPass(listOf(LDRColorFacet()), renderOpaque = true, renderTransparent = false) -val DefaultTransparentPass = RenderPass(listOf(LDRColorFacet()), renderOpaque = false, renderTransparent = true, depthWrite = false) -val LightPass = RenderPass(listOf(ClipDepthFacet())) -val VSMLightPass = RenderPass(listOf(MomentsFacet())) - -fun RenderPass.createPassTarget(width: Int, height: Int, depthFormat: DepthFormat = DepthFormat.DEPTH24, multisample: BufferMultisample = this.multisample): RenderTarget { - return renderTarget(width, height, multisample = multisample) { - for (combiner in combiners) { - when (combiner) { - is ColorBufferFacetCombiner -> - colorBuffer(combiner.targetOutput, combiner.format, combiner.type) - } - } - // Temporary fix for GLES back-end - if (combiners.isEmpty()) { - colorBuffer() - } - depthBuffer(depthFormat) - } -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Scene.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Scene.kt deleted file mode 100644 index b516df97..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Scene.kt +++ /dev/null @@ -1,95 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.Dispatcher -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import java.util.* - -class Scene(val root: SceneNode = SceneNode(), val dispatcher: Dispatcher = Dispatcher()) { - val features = mutableListOf() - override fun hashCode(): Int { - var result = root.hashCode() - result = result * 31 + features.hashCode() - return result - } - fun hash(): String = Base64.getEncoder().encodeToString(hashCode().toString().toByteArray()) -} - -open class SceneNode { - var name: String = "" - var entities: MutableList = mutableListOf() - var parent: SceneNode? = null - open var transform = Matrix44.IDENTITY - var worldTransform = Matrix44.IDENTITY - val children = mutableListOf() - var disposed = false - - override fun hashCode(): Int { - var result = name.hashCode() - result = 31 * result + entities.hashCode() -// result = 31 * result + (parent?.hashCode() ?: 0) - result = 31 * result + transform.hashCode() - result = 31 * result + worldTransform.hashCode() - result = 31 * result + children.hashCode() - result = 31 * result + disposed.hashCode() - return result - } -} - -val SceneNode.worldPosition: Vector3 - get() { - return (worldTransform * Vector4.UNIT_W).xyz - } - -class NodeContent(val node: SceneNode, val content: T) { - operator fun component1() = node - operator fun component2() = content - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - other as NodeContent<*> - if (node != other.node) return false - if (content != other.content) return false - return true - } - - override fun hashCode(): Int { - var result = node.hashCode() - result = 31 * result + content.hashCode() - return result - } -} - -fun SceneNode.visit(visitor: SceneNode.() -> Unit) { - visitor() - children.forEach { it.visit(visitor) } -} - -fun

      SceneNode.scan(initial: P, scanner: SceneNode.(P) -> P) { - val p = scanner(initial) - children.forEach { it.scan(p, scanner) } -} - -fun SceneNode.findNodes(selector: SceneNode.() -> Boolean): List { - val result = mutableListOf() - visit { - if (selector()) result.add(this) - } - return result -} - -fun

      SceneNode.findContent(selector: Entity.() -> P?): List> { - val result = mutableListOf>() - - visit { - entities.forEach { - val s = it.selector() - if (s != null) { - result.add(NodeContent(this, s)) - } - } - } - return result -} - diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt b/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt deleted file mode 100644 index e62672c5..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt +++ /dev/null @@ -1,341 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.features.IrradianceSH -import org.openrndr.extra.fx.blur.ApproximateGaussianBlur -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 -import java.nio.ByteBuffer - -class RenderContext( - val lights: List>, - val meshes: List>, - val skinnedMeshes: List>, - val instancedMeshes: List>, - val pathMeshes: List>, - val fogs: List> -) - -class SceneRenderer { - class Configuration { - var multisampleLines = false - } - - val configuration = Configuration() - - val blur = ApproximateGaussianBlur() - - var shadowLightTargets = mutableMapOf() - var meshCubemaps = mutableMapOf() - - - var outputPasses = mutableListOf(DefaultOpaquePass, DefaultTransparentPass) - var outputPassTarget: RenderTarget? = null - var outputPassTargetMS: RenderTarget? = null - - val postSteps = mutableListOf() - val buffers = mutableMapOf() - - var drawFinalBuffer = true - - var first = true - fun draw(drawer: Drawer, scene: Scene) { - drawer.pushStyle() - drawer.depthWrite = true - drawer.depthTestPass = DepthTestPass.LESS_OR_EQUAL - - drawer.cullTestPass = CullTestPass.FRONT - - scene.dispatcher.execute() - - // update all the transforms - scene.root.scan(Matrix44.IDENTITY) { p -> - if (p !== Matrix44.IDENTITY) { - worldTransform = p * transform - } else { - worldTransform = transform - } - worldTransform - } - - val context = RenderContext( - lights = scene.root.findContent { this as? Light }, - meshes = scene.root.findContent { this as? Mesh }, - skinnedMeshes = scene.root.findContent { this as? SkinnedMesh }, - fogs = scene.root.findContent { this as? Fog }, - instancedMeshes = scene.root.findContent { this as? InstancedMesh }, - pathMeshes = scene.root.findContent { this as? PathMesh} - ) - - // shadow passes - run { - context.lights.filter { it.content is ShadowLight && (it.content as ShadowLight).shadows is Shadows.MappedShadows }.forEach { - val shadowLight = it.content as ShadowLight - val pass: RenderPass - pass = when (shadowLight.shadows) { - is Shadows.PCF, is Shadows.Simple -> { - LightPass - } - is Shadows.VSM -> { - VSMLightPass - } - else -> TODO() - } - val target = shadowLightTargets.getOrPut(shadowLight) { - val mapSize = (shadowLight.shadows as Shadows.MappedShadows).mapSize - pass.createPassTarget(mapSize, mapSize, DepthFormat.DEPTH_STENCIL) - } - val look = shadowLight.view(it.node) - val materialContext = MaterialContext(pass, context.lights, context.fogs, shadowLightTargets, emptyMap(), 0) - drawer.isolatedWithTarget(target) { - drawer.projection = shadowLight.projection(target) - drawer.view = look - drawer.model = Matrix44.IDENTITY - - drawer.clear(ColorRGBa.BLACK) - drawer.cullTestPass = CullTestPass.FRONT - drawPass(drawer, pass, materialContext, context) - } - when (shadowLight.shadows) { - is Shadows.VSM -> { - blur.gain = 1.0 - blur.sigma = 3.0 - blur.window = 9 - blur.spread = 1.0 - blur.apply(target.colorBuffer(0), target.colorBuffer(0)) - } - else -> {} - } - } - } - - // -- feature passes - for (feature in scene.features) { - feature.update(drawer, this, scene, feature, context) - } - - // -- output passes - run { - val irradianceSH = scene.features.find { it is IrradianceSH } as? IrradianceSH - for (pass in outputPasses) { - val materialContext = MaterialContext(pass, context.lights, context.fogs, shadowLightTargets, meshCubemaps, irradianceSH?.probeCount - ?: 0) - materialContext.irradianceSH = irradianceSH - - val defaultPasses = setOf(DefaultTransparentPass, DefaultOpaquePass) - - if ((pass !in defaultPasses || postSteps.isNotEmpty()) && outputPassTarget == null) { - outputPassTarget = pass.createPassTarget(RenderTarget.active.width, RenderTarget.active.height) - } - - if (pass == outputPasses[0]) { - outputPassTarget?.let { - drawer.withTarget(it) { - clear(ColorRGBa.TRANSPARENT) - } - } - } - outputPassTarget?.let { target -> - pass.combiners.forEach { - if (it is ColorBufferFacetCombiner) { - val index = target.colorAttachmentIndexByName(it.targetOutput) - ?: error("attachment not found ${it.targetOutput}") - target.blendMode(index, it.blendMode) - } - } - } - outputPassTarget?.bind() - drawPass(drawer, pass, materialContext, context) - outputPassTarget?.unbind() - - outputPassTarget?.let { output -> - for (combiner in pass.combiners) { - buffers[combiner.targetOutput] = (output.colorAttachmentByName(combiner.targetOutput) as? ColorBufferAttachment)?.colorBuffer - ?: error("attachment not found ${combiner.targetOutput}") - } - } - } - val lightContext = LightContext(context.lights, shadowLightTargets) - val postContext = PostContext(lightContext, drawer.view.inversed) - - for (postStep in postSteps) { - postStep.apply(buffers, postContext) - } - } - - drawer.popStyle() - if (drawFinalBuffer) { - outputPassTarget?.let { output -> - drawer.isolated { - drawer.defaults() - drawer.ortho() - val outputName = (postSteps.lastOrNull() as? FilterPostStep<*>)?.output ?: "color" - val outputBuffer = buffers[outputName] - ?: throw IllegalArgumentException("can't find $outputName buffer") - drawer.image(outputBuffer) - } - } - } - } - - internal fun drawPass(drawer: Drawer, pass: RenderPass, materialContext: MaterialContext, - context: RenderContext, shadeStyleTransformer: ((ShadeStyle)->Unit)? = null - ) { - - drawer.depthWrite = pass.depthWrite - val primitives = context.meshes.flatMap { mesh -> - mesh.content.primitives.map { primitive -> - NodeContent(mesh.node, primitive) - } - } - - // -- draw all meshes - primitives - .filter { (it.content.material.transparent && pass.renderTransparent) || (!it.content.material.transparent && pass.renderOpaque) } - .forEach { - val primitive = it.content - drawer.isolated { - if (primitive.material.doubleSided) { - drawer.drawStyle.cullTestPass = CullTestPass.ALWAYS - } - val hasNormalAttribute = primitive.geometry.vertexBuffers.any { it.vertexFormat.hasAttribute("normal") } - val primitiveContext = PrimitiveContext(hasNormalAttribute, false) - val shadeStyle = primitive.material.generateShadeStyle(materialContext, primitiveContext) - shadeStyle.parameter("viewMatrixInverse", drawer.view.inversed) - primitive.material.applyToShadeStyle(materialContext, shadeStyle) - shadeStyleTransformer?.invoke(shadeStyle) - - drawer.shadeStyle = shadeStyle - drawer.model = it.node.worldTransform - - if (primitive.geometry.indexBuffer == null) { - drawer.vertexBuffer(primitive.geometry.vertexBuffers, - primitive.geometry.primitive, - primitive.geometry.offset, - primitive.geometry.vertexCount) - } else { - drawer.vertexBuffer(primitive.geometry.indexBuffer!!, - primitive.geometry.vertexBuffers, - primitive.geometry.primitive, - primitive.geometry.offset, - primitive.geometry.vertexCount) - } - } - } - - - val skinnedPrimitives = context.skinnedMeshes.flatMap { mesh -> - mesh.content.primitives.map { primitive -> - NodeContent(mesh.node, Pair(primitive, mesh)) - } - } - - skinnedPrimitives - .filter { - (it.content.first.material.transparent && pass.renderTransparent) || - (!it.content.first.material.transparent && pass.renderOpaque) - } - .forEach { - val primitive = it.content.first - val skinnedMesh = it.content.second.content - drawer.isolated { - if (primitive.material.doubleSided) { - drawer.drawStyle.cullTestPass = CullTestPass.ALWAYS - } - val hasNormalAttribute = primitive.geometry.vertexBuffers.any { it.vertexFormat.hasAttribute("normal") } - val primitiveContext = PrimitiveContext(hasNormalAttribute, true) - - val nodeInverse = it.node.worldTransform.inversed - - - val jointTransforms = (skinnedMesh.joints zip skinnedMesh.inverseBindMatrices) - .map { (nodeInverse * it.first.worldTransform * it.second) } - val shadeStyle = primitive.material.generateShadeStyle(materialContext, primitiveContext) - - shadeStyle.parameter("jointTransforms", jointTransforms.toTypedArray()) - - shadeStyle.parameter("viewMatrixInverse", drawer.view.inversed) - primitive.material.applyToShadeStyle(materialContext, shadeStyle) - drawer.shadeStyle = shadeStyle - drawer.model = it.node.worldTransform - - if (primitive.geometry.indexBuffer == null) { - drawer.vertexBuffer(primitive.geometry.vertexBuffers, - primitive.geometry.primitive, - primitive.geometry.offset, - primitive.geometry.vertexCount) - } else { - drawer.vertexBuffer(primitive.geometry.indexBuffer!!, - primitive.geometry.vertexBuffers, - primitive.geometry.primitive, - primitive.geometry.offset, - primitive.geometry.vertexCount) - } - } - } - - - val instancedPrimitives = context.instancedMeshes.flatMap { mesh -> - mesh.content.primitives.map { primitive -> - NodeContent(mesh.node, MeshPrimitiveInstance(primitive, mesh.content.instances, mesh.content.attributes)) - } - } - - // -- draw all instanced meshes - instancedPrimitives - .filter { (it.content.primitive.material.transparent && pass.renderTransparent) || (!it.content.primitive.material.transparent && pass.renderOpaque) } - .forEach { - val primitive = it.content - drawer.isolated { - val primitiveContext = PrimitiveContext(true, false) - val shadeStyle = primitive.primitive.material.generateShadeStyle(materialContext, primitiveContext) - shadeStyle.parameter("viewMatrixInverse", drawer.view.inversed) - primitive.primitive.material.applyToShadeStyle(materialContext, shadeStyle) - if (primitive.primitive.material.doubleSided) { - drawer.drawStyle.cullTestPass = CullTestPass.ALWAYS - } - drawer.shadeStyle = shadeStyle - drawer.model = it.node.worldTransform - drawer.vertexBufferInstances(primitive.primitive.geometry.vertexBuffers, - primitive.attributes, - DrawPrimitive.TRIANGLES, - primitive.instances, - primitive.primitive.geometry.offset, - primitive.primitive.geometry.vertexCount) - } - } - - context.pathMeshes.filter { (it.content.material.transparent && pass.renderTransparent) || (!it.content.material.transparent && pass.renderOpaque) } - .forEach { - drawer.isolated { - val primitiveContext = PrimitiveContext(true, false) - val shadeStyle = it.content.material.generateShadeStyle(materialContext, primitiveContext) - shadeStyle.parameter("viewMatrixInverse", drawer.view.inversed) - it.content.material.applyToShadeStyle(materialContext, shadeStyle) - drawer.drawStyle.cullTestPass = CullTestPass.ALWAYS - drawer.shadeStyle = shadeStyle - drawer.model = it.node.worldTransform - drawer.strokeWeight = it.content.weight - for (path in it.content.paths) { - drawer.path(path.sampleLinear(0.0005)) - } - } - } - - - drawer.depthWrite = true - } -} - -fun sceneRenderer(builder: SceneRenderer.() -> Unit): SceneRenderer { - val sceneRenderer = SceneRenderer() - sceneRenderer.builder() - return sceneRenderer -} - -internal fun ByteBuffer.putVector3(v: Vector3) { - putFloat(v.x.toFloat()) - putFloat(v.y.toFloat()) - putFloat(v.z.toFloat()) -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt b/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt deleted file mode 100644 index 80ed275b..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt +++ /dev/null @@ -1,237 +0,0 @@ -package org.openrndr.extra.dnk3 - -val shaderNoRepetition = """ -// -- shaderNoRepetition -float sum( vec3 v ) { return v.x+v.y+v.z; } - -// based on https://www.shadertoy.com/view/Xtl3zf -vec4 textureNoTile(in sampler2D noiseTex, in sampler2D tex, in vec2 noiseOffset, in vec2 x) -{ - float v = 1.0; - float k = texture(noiseTex, noiseOffset + x*0.01 ).x; // cheap (cache friendly) lookup - - vec2 duvdx = dFdx( x ); - vec2 duvdy = dFdx( x ); - - float l = k*8.0; - float f = fract(l); - -#if 0 - float ia = floor(l); // my method - float ib = ia + 1.0; -#else - float ia = floor(l+0.5); // suslik's method (see comments) - float ib = floor(l); - f = min(f, 1.0-f)*2.0; -#endif - - vec2 offa = sin(vec2(3.0,7.0)*ia); // can replace with any other hash - vec2 offb = sin(vec2(3.0,7.0)*ib); // can replace with any other hash - - vec3 cola = textureGrad( tex, x + v*offa, duvdx, duvdy ).xyz; - vec3 colb = textureGrad( tex, x + v*offb, duvdx, duvdy ).xyz; - - return vec4(mix( cola, colb, smoothstep(0.2,0.8,f-0.1*sum(cola-colb)) ), 1.0); -} -""" - -val shaderNoRepetitionVert = """ -// -- shaderNoRepetitionVert -float sum( vec3 v ) { return v.x+v.y+v.z; } - -// based on https://www.shadertoy.com/view/Xtl3zf -vec4 textureNoTile(in sampler2D tex, in vec2 noiseOffset, in vec2 x) -{ - float v = 1.0; - float k = texture(tex, noiseOffset + 0.005*x ).x; // cheap (cache friendly) lookup - - float l = k*8.0; - float f = fract(l); - -#if 0 - float ia = floor(l); // my method - float ib = ia + 1.0; -#else - float ia = floor(l+0.5); // suslik's method (see comments) - float ib = floor(l); - f = min(f, 1.0-f)*2.0; -#endif - - vec2 offa = sin(vec2(3.0,7.0)*ia); // can replace with any other hash - vec2 offb = sin(vec2(3.0,7.0)*ib); // can replace with any other hash - - vec3 cola = texture( tex, x + v*offa).xyz; - vec3 colb = texture( tex, x + v*offb).xyz; - - return vec4(mix( cola, colb, smoothstep(0.2,0.8,f-0.1*sum(cola-colb)) ), 1.0); -} -""" - -val shaderProjectOnPlane = """ -// -- shaderProjectOnPlane -vec3 projectOnPlane(vec3 p, vec3 pc, vec3 pn) { - float distance = dot(pn, p-pc); - return p - distance * pn; -} -""".trimIndent() - -val shaderSideOfPlane = """ -// -- shaderSideOfPlane -int sideOfPlane(in vec3 p, in vec3 pc, in vec3 pn){ - if (dot(p-pc,pn) >= 0.0) return 1; else return 0; -} -""".trimIndent() - -val shaderLinePlaneIntersect = """ -// -- shaderLinePlaneIntersect -vec3 linePlaneIntersect(in vec3 lp, in vec3 lv, in vec3 pc, in vec3 pn){ - return lp+lv*(dot(pn,pc-lp)/dot(pn,lv)); -} -""".trimIndent() - -val shaderVSM = """ -|// -- shaderVSM -|float linstep(float min, float max, float v) -|{ -| return clamp((v - min) / (max - min), 0.0, 1.0); -|} -|// https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch08.html -|float chebyshevUpperBound(vec2 moments, float t, float minVariance) { -| // One-tailed inequality valid if t > Moments.x -| float p = (t <= moments.x) ? 1.0 : 0.0; -| // Compute variance. -| float variance = moments.y - (moments.x * moments.x); -| variance = max(variance, minVariance); -| // Compute probabilistic upper bound. -| float d = t - moments.x; -| float p_max = variance / (variance + d*d); -| p_max = smoothstep(0.6, 1.0, p_max); -| return max(p, p_max); -} -""".trimIndent() - -/* -N - world space normal -V - eye - world vertex position -L - world light pos - world vertex position - */ -val shaderGGX = """ -// -- shaderGGX -#define bias 0.125 -#define HASHSCALE 443.8975 -vec2 hash22(vec2 p) { - vec3 p3 = fract(vec3(p.xyx) * HASHSCALE); - p3 += dot(p3, p3.yzx+19.19); - return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); -} - -#define PI 3.1415926535 - -float pow5(float x) { - float x2 = x * x; - return x2 * x2 * x; -} - -float D_GGX(float linearRoughness, float NoH, const vec3 h) { - // Walter et al. 2007, "Microfacet Models for Refraction through Rough Surfaces" - float oneMinusNoHSquared = 1.0 - NoH * NoH; - float a = NoH * linearRoughness; - float k = linearRoughness / (oneMinusNoHSquared + a * a); - float d = k * k * (1.0 / PI); - return d; -} - -float D_GGXm(float linearRoughness, float NoH, const vec3 h, const vec3 n) { - vec3 NxH = cross(n, h); - float oneMinusNoHSquared = dot(NxH, NxH); - - - // Walter et al. 2007, "Microfacet Models for Refraction through Rough Surfaces" - //float oneMinusNoHSquared = 1.0 - NoH * NoH; - float a = NoH * linearRoughness; - float k = linearRoughness / (oneMinusNoHSquared + a * a); - float d = k * k * (1.0 / PI); - return d; -} - - -float V_SmithGGXCorrelated(float linearRoughness, float NoV, float NoL) { - // Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs" - float a2 = linearRoughness * linearRoughness; - float GGXV = NoL * sqrt((NoV - a2 * NoV) * NoV + a2); - float GGXL = NoV * sqrt((NoL - a2 * NoL) * NoL + a2); - return 0.5 / (GGXV + GGXL); -} - -vec3 F_Schlick(const vec3 f0, float VoH) { - // Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" - return f0 + (vec3(1.0) - f0) * pow5(1.0 - VoH); -} -vec3 F_SchlickRoughness(vec3 F0, float roughness, float VoH) -{ - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - VoH, 5.0); -} - -float F_Schlick(float f0, float f90, float VoH) { - return f0 + (f90 - f0) * pow5(1.0 - VoH); -} - -float Fd_Burley(float linearRoughness, float NoV, float NoL, float LoH) { - // Burley 2012, "Physically-Based Shading at Disney" - float f90 = 0.5 + 2.0 * linearRoughness * LoH * LoH; - float lightScatter = F_Schlick(1.0, f90, NoL); - float viewScatter = F_Schlick(1.0, f90, NoV); - return lightScatter * viewScatter * (1.0 / PI); -} - -vec2 PrefilteredDFG_Karis(float roughness, float NoV) { - //https://www.shadertoy.com/view/XlKSDR - // Karis 2014, "Physically Based Material on Mobile" - const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022); - const vec4 c1 = vec4( 1.0, 0.0425, 1.040, -0.040); - - vec4 r = roughness * c0 + c1; - float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y; - return vec2(-1.04, 1.04) * a004 + r.zw; -} - -float saturate(float x) { - return clamp(x, 0.0, 1.0); -} - -float G1V(float dotNV, float k) -{ - return 1.0f/(dotNV*(1.0f-k)+k); -} - -float ggx(vec3 N, vec3 V, vec3 L, float roughness, float F0) -{ - float alpha = roughness*roughness; - - vec3 H = normalize(V+L); - - float dotNL = saturate(dot(N,L)); - float dotNV = saturate(dot(N,V)); - float dotNH = saturate(dot(N,H)); - float dotLH = saturate(dot(L,H)); - - float F, D, vis; - - // D - float alphaSqr = alpha*alpha; - float pi = 3.14159f; - float denom = dotNH * dotNH *(alphaSqr-1.0) + 1.0f; - D = alphaSqr/(pi * denom * denom); - - // F - float dotLH5 = pow(1.0f-dotLH,5.0); - F = F0 + (1.0-F0)*(dotLH5); - - // V - float k = alpha/2.0f; - vis = G1V(dotNL,k)*G1V(dotNV,k); - - float specular = dotNL * D * F * vis; - return specular; -} -""".trimIndent() \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt deleted file mode 100644 index 35fedf98..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt +++ /dev/null @@ -1,99 +0,0 @@ -package org.openrndr.extra.dnk3 - -import org.openrndr.draw.RenderTarget -import org.openrndr.math.Matrix44 - -sealed class Shadows { - object None : Shadows() - abstract class MappedShadows(val mapSize: Int) : Shadows() - abstract class DepthMappedShadows(mapSize: Int) : MappedShadows(mapSize) - abstract class ColorMappedShadows(mapSize: Int) : MappedShadows(mapSize) - class Simple(mapSize: Int = 1024) : DepthMappedShadows(mapSize) - class PCF(mapSize: Int = 1024, val sampleCount: Int = 12) : DepthMappedShadows(mapSize) - class VSM(mapSize: Int = 1024) : ColorMappedShadows(mapSize) -} - -interface ShadowLight { - var shadows: Shadows - fun projection(renderTarget: RenderTarget): Matrix44 - fun view(node: SceneNode): Matrix44 { - return node.worldTransform.inversed - } -} - -// shaders - -fun Shadows.VSM.fs(index: Int) : String = """ -|{ -| vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); -| vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { -| vec2 moments = texture(p_lightShadowMap$index, lightProj.xy).xy; -| attenuation *= (chebyshevUpperBound(moments, length(Lr), 50.0)); -| } -|} -""".trimMargin() - -fun Shadows.Simple.fs(index: Int): String = """ -|{ -| vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); -| vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { -| vec3 smz = texture(p_lightShadowMap$index, lightProj.xy).rgb; -| vec2 step = 1.0 / vec2(textureSize(p_lightShadowMap$index,0)); -| float result = 0.0; -| float compToZ = (lightProj.z- 0.0020 * tan(acos(NoL))) - 0.0003; -| float currentDepth = lightProj.z; -| float closestDepth = smz.x; -| float shadow = (currentDepth - 0.0020 * tan(acos(NoL))) - 0.0003 >= closestDepth ? 0.0 : 1.0; -| attenuation *= shadow; -| } -|} -""".trimMargin() - -fun Shadows.PCF.fs(index: Int): String = """ -|{ -| float lrl = length(Lr)/100.0; -| vec2 fTaps_Poisson[12]; -| fTaps_Poisson[0] = vec2(-.326,-.406); -| fTaps_Poisson[1] = vec2(-.840,-.074); -| fTaps_Poisson[2] = vec2(-.696, .457); -| fTaps_Poisson[3] = vec2(-.203, .621); -| fTaps_Poisson[4] = vec2( .962,-.195); -| fTaps_Poisson[5] = vec2( .473,-.480); -| fTaps_Poisson[6] = vec2( .519, .767); -| fTaps_Poisson[7] = vec2( .185,-.893); -| fTaps_Poisson[8] = vec2( .507, .064); -| fTaps_Poisson[9] = vec2( .896, .412); -| fTaps_Poisson[10] = vec2(-.322,-.933); -| fTaps_Poisson[11] = vec2(-.792,-.598); -| vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); -| vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { -| vec3 smz = texture(p_lightShadowMap$index, lightProj.xy).rgb; -| vec2 stepSize = 1.0 / vec2(textureSize(p_lightShadowMap$index,0)); -| float result = 0.0; -| float compToZ = (lightProj.z- 0.0020 * tan(acos(NoL))) - 0.0003; -| float noise = hash22(lightProj.xy*10.0).x; -| float r = noise * 3.1415926535 * 2.0; -| mat2 rot = mat2( vec2(cos(r), -sin(r)), vec2(sin(r),cos(r))); -| for (int i = 0; i < 12; ++i) { -| float depth = texture(p_lightShadowMap$index, lightProj.xy + rot*fTaps_Poisson[i]*float(i)*lrl*stepSize ).r; -| result += step(compToZ, depth); -| } -| result /= 12.0; -| float currentDepth = lightProj.z; -| float closestDepth = smz.x; -| float shadow = result;// (currentDepth - 0.0020 * tan(acos(NoL))) - 0.0003 >= closestDepth ? 0.0 : 1.0; -| attenuation *= shadow; -| } -|} -""".trimMargin() - -fun Shadows.fs(index: Int): String = when (this) { - is Shadows.PCF -> this.fs(index) - is Shadows.Simple -> this.fs(index) - is Shadows.VSM -> this.fs(index) - is Shadows.None -> "" - else -> TODO() -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapFilter.kt b/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapFilter.kt deleted file mode 100644 index d08ad740..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapFilter.kt +++ /dev/null @@ -1,189 +0,0 @@ -package org.openrndr.extra.dnk3.cubemap - -import org.openrndr.draw.* - -import org.openrndr.color.ColorRGBa -import org.openrndr.internal.Driver -import org.openrndr.math.* -import org.openrndr.math.transforms.ortho - -private val filterDrawStyle = DrawStyle().apply { - blendMode = BlendMode.REPLACE - depthWrite = false - depthTestPass = DepthTestPass.ALWAYS - stencil.stencilTest = StencilTest.DISABLED -} - -private var filterQuad: VertexBuffer? = null -private var filterQuadFormat = vertexFormat { - position(2) - textureCoordinate(2) -} - - -/** - * Filter base class. Renders "full-screen" quads. - */ -open class CubemapFilter(private val shader: Shader? = null) { - - /** - * parameter map - */ - val parameters = mutableMapOf() - var padding = 0 - - var depthBufferOut: DepthBuffer? = null - - companion object { - val filterVertexCode: String get() = Driver.instance.internalShaderResource("filter.vert") - } - - - - - open fun apply(source: Array, target: Array) { - if (target.isEmpty()) { - return - } - - for (side in CubemapSide.values()) { - val renderTarget = renderTarget(target[0].width, target[0].width, 1.0) {} - - shader?.begin() - shader?.uniform("sideNormal", side.forward) - shader?.uniform("sideUp", side.up) - shader?.uniform("sideRight", (side.forward cross side.up)) - shader?.end() - - - target.forEach { - renderTarget.attach(it, side, 0) - } - - for (i in 1 until target.size) { - renderTarget.blendMode(i, BlendMode.REPLACE) - } - - apply(source, renderTarget) - depthBufferOut?.let { - renderTarget.attach(it) - } - - if (depthBufferOut != null) { - renderTarget.detachDepthBuffer() - } - - renderTarget.detachColorAttachments() - renderTarget.destroy() - } - } - - fun apply(source: Array, target: RenderTarget) { - if (shader == null) { - return - } - target.bind() - - if (filterQuad == null) { - val fq = VertexBuffer.createDynamic(filterQuadFormat, 6, Session.root) - - fq.shadow.writer().apply { - write(Vector2(0.0, 1.0)); write(Vector2(0.0, 0.0)) - write(Vector2(0.0, 0.0)); write(Vector2(0.0, 1.0)) - write(Vector2(1.0, 0.0)); write(Vector2(1.0, 1.0)) - - write(Vector2(0.0, 1.0)); write(Vector2(0.0, 0.0)) - write(Vector2(1.0, 1.0)); write(Vector2(1.0, 0.0)) - write(Vector2(1.0, 0.0)); write(Vector2(1.0, 1.0)) - } - fq.shadow.upload() - fq.shadow.destroy() - filterQuad = fq - } - - shader.begin() - - source.forEachIndexed { index, cubemap -> - cubemap.bind(index) - cubemap.filter(MinifyingFilter.LINEAR, MagnifyingFilter.LINEAR) - shader.uniform("tex$index", index) - } - - Driver.instance.setState(filterDrawStyle) - - shader.uniform("projectionMatrix", ortho(0.0, target.width.toDouble(), target.height.toDouble(), 0.0, -1.0, 1.0)) - shader.uniform("targetSize", Vector2(target.width.toDouble(), target.height.toDouble())) - shader.uniform("padding", Vector2(padding.toDouble(), padding.toDouble())) - - var textureIndex = source.size + 0 - parameters.forEach { (uniform, value) -> - @Suppress("UNCHECKED_CAST") - when (value) { - is Boolean -> shader.uniform(uniform, value) - is Float -> shader.uniform(uniform, value) - is Double -> shader.uniform(uniform, value.toFloat()) - is Matrix44 -> shader.uniform(uniform, value) - is Vector2 -> shader.uniform(uniform, value) - is Vector3 -> shader.uniform(uniform, value) - is Vector4 -> shader.uniform(uniform, value) - is ColorRGBa -> shader.uniform(uniform, value) - is Int -> shader.uniform(uniform, value) - is Matrix55 -> shader.uniform(uniform, value.floatArray) - is FloatArray -> shader.uniform(uniform, value) - - // EJ: this is not so nice but I have no other ideas for this - is Array<*> -> if (value.size > 0) when (value[0]) { - is Vector2 -> shader.uniform(uniform, value as Array) - is Vector3 -> shader.uniform(uniform, value as Array) - is Vector4 -> shader.uniform(uniform, value as Array) - else -> throw IllegalArgumentException("unsupported array value: ${value[0]!!::class.java}") - //is ColorRGBa -> shader.uniform(uniform, value as Array) - } - - is DepthBuffer -> { - shader.uniform("$uniform", textureIndex) - value.bind(textureIndex) - textureIndex++ - } - - is ColorBuffer -> { - shader.uniform("$uniform", textureIndex) - value.bind(textureIndex) - textureIndex++ - } - - is Cubemap -> { - shader.uniform("$uniform", textureIndex) - value.bind(textureIndex) - textureIndex++ - } - - is ArrayTexture -> { - shader.uniform("$uniform", textureIndex) - value.bind(textureIndex) - textureIndex++ - } - - is BufferTexture -> { - shader.uniform("$uniform", textureIndex) - value.bind(textureIndex) - textureIndex++ - } - } - } - - Driver.instance.drawVertexBuffer(shader, listOf(filterQuad!!), DrawPrimitive.TRIANGLES, 0, 6) - shader.end() - target.unbind() - } - - fun apply(source: Cubemap, target: Cubemap) = apply(arrayOf(source), arrayOf(target)) - fun apply(source: Cubemap, target: Array) = apply(arrayOf(source), target) - fun apply(source: Array, target: Cubemap) = apply(source, arrayOf(target)) - - fun untrack() { - shader?.let { Session.active.untrack(shader) } - } - - protected val format get() = filterQuadFormat -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapPassthrough.kt b/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapPassthrough.kt deleted file mode 100644 index cc9f5299..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/CubemapPassthrough.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.openrndr.extra.dnk3.cubemap - -import org.openrndr.draw.filterShaderFromUrl -import org.openrndr.resourceUrl - -class CubemapPassthrough : CubemapFilter(filterShaderFromUrl(resourceUrl("/shaders/cubemap-filters/cubemap-passthrough.frag"))) diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/IrradianceConvolution.kt b/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/IrradianceConvolution.kt deleted file mode 100644 index 325de7d2..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/IrradianceConvolution.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.openrndr.extra.dnk3.cubemap - -import org.openrndr.draw.filterShaderFromUrl -import org.openrndr.resourceUrl - -class IrradianceConvolution : CubemapFilter(filterShaderFromUrl(resourceUrl("/shaders/cubemap-filters/irradiance-convolution.frag"))) diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/SphericalHarmonics.kt b/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/SphericalHarmonics.kt deleted file mode 100644 index 788fe297..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/cubemap/SphericalHarmonics.kt +++ /dev/null @@ -1,187 +0,0 @@ -@file:ShaderPhrases([]) - -package org.openrndr.extra.dnk3.cubemap - -import org.openrndr.draw.* -import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases -import org.openrndr.extra.shaderphrases.phraseResource -import org.openrndr.math.Vector3 -import org.openrndr.math.max -import org.openrndr.resourceUrl -import java.nio.ByteBuffer -import java.nio.ByteOrder -import kotlin.math.sqrt - -class SphericalHarmonics : Filter(filterShaderFromUrl(resourceUrl("/shaders/cubemap-filters/spherical-harmonics.frag"))) { - var input: Cubemap by parameters -} - -/** based on https://andrew-pham.blog/2019/08/26/spherical-harmonics/ */ -fun Cubemap.irradianceCoefficients(): Array { - val cubemap = this - require(cubemap.format == ColorFormat.RGB) - require(cubemap.type == ColorType.FLOAT32) - - val result = Array(9) { Vector3.ZERO } - - var buffer = ByteBuffer.allocateDirect(cubemap.width * cubemap.width * cubemap.format.componentCount * cubemap.type.componentSize) - buffer.order(ByteOrder.nativeOrder()) - - var weightSum = 0.0 - - for (side in CubemapSide.values()) { - //cubemap.side(side).read(buffer) - buffer.rewind() - cubemap.read(side, buffer) - - buffer.rewind() - for (y in 0 until cubemap.width) { - for (x in 0 until cubemap.width) { - val rf = buffer.float.toDouble() - val gf = buffer.float.toDouble() - val bf = buffer.float.toDouble() - - val L = Vector3(rf, gf, bf) - - var u = (x + 0.5) / cubemap.width; - var v = (y + 0.5) / cubemap.width; - u = u * 2.0 - 1.0 - v = v * 2.0 - 1.0 - - val temp = 1.0 + u * u + v * v - val weight = 4.0 / (sqrt(temp) * temp) - - val N = cubemap.mapUVSToN(u, v, side) - val coefficients = genLightingCoefficientsForNormal(N, L) - - for (i in 0 until 9) { - result[i] += coefficients[i] * weight - } - weightSum += weight - } - } - } - - for (i in 0 until 9) { - result[i] = result[i] * (4.0 * Math.PI) / weightSum - } - - return result; -} - -fun genSHCoefficients(N: Vector3): DoubleArray { - val result = DoubleArray(9) - - // Band 0 - result[0] = 0.282095; - - // Band 1 - result[1] = 0.488603 * N.y - result[2] = 0.488603 * N.z - result[3] = 0.488603 * N.x - - // Band 2 - result[4] = 1.092548 * N.x * N.y - result[5] = 1.092548 * N.y * N.z - result[6] = 0.315392 * (3.0 * N.z * N.z - 1.0) - result[7] = 1.092548 * N.x * N.z - result[8] = 0.546274 * (N.x * N.x - N.y * N.y) - - return result; -} - - -fun genLightingCoefficientsForNormal(N: Vector3, L: Vector3): Array { - val coefficients = genSHCoefficients(N) - val result = Array(9) { Vector3.ZERO } - for (i in 0 until 9) { - result[i] = L * coefficients[i] - } - return result -} - -fun Cubemap.mapUVSToN(u: Double, v: Double, side: CubemapSide): Vector3 { - return (side.right * u + side.up * v + side.forward).normalized -} - - -// Evaluates the irradiance perceived in the provided direction -// Analytic method from http://www1.cs.columbia.edu/~ravir/papers/envmap/envmap.pdf eq. 13 -// -fun evaluateSHIrradiance(direction: Vector3, _SH: Array): Vector3 { - val c1 = 0.42904276540489171563379376569857; // 4 * Â2.Y22 = 1/4 * sqrt(15.PI) - val c2 = 0.51166335397324424423977581244463; // 0.5 * Â1.Y10 = 1/2 * sqrt(PI/3) - val c3 = 0.24770795610037568833406429782001; // Â2.Y20 = 1/16 * sqrt(5.PI) - val c4 = 0.88622692545275801364908374167057; // Â0.Y00 = 1/2 * sqrt(PI) - - val x = direction.x; - val y = direction.y; - val z = direction.z; - - return max(Vector3.ZERO, - _SH[8] * (c1 * (x * x - y * y)) // c1.L22.(x²-y²) - + _SH[6] * (c3 * (3.0 * z * z - 1)) // c3.L20.(3.z² - 1) - + _SH[0] * c4 // c4.L00 - + (_SH[4] * x * y + _SH[7] * x * z + _SH[5] * y * z) * 2.0 * c1 // 2.c1.(L2-2.xy + L21.xz + L2-1.yz) - + (_SH[3] * x + _SH[1] * y + _SH[2] * z) * c2 * 2.0); // 2.c2.(L11.x + L1-1.y + L10.z) -} - -val glslEvaluateSH: String by phraseResource("/phrases/irradiance-sh/evaluate-sh.frag") - -val glslFetchSH: String by phraseResource("/phrases/irradiance-sh/fetch-sh.frag") -val glslFetchSH0: String by phraseResource("/phrases/irradiance-sh/fetch-sh0.frag") - -fun genGlslGatherSH(xProbes: Int, yProbes: Int, zProbes: Int, spacing: Double = 1.0, offset: Vector3) = """ -ivec3 gridCoordinates(vec3 p, out vec3 f) { - float x = (p.x - ${offset.x}) / $spacing; - float y = (p.y - ${offset.y})/ $spacing; - float z = (p.z - ${offset.z}) / $spacing; - - int ix = int(floor(x)) + $xProbes / 2; - int iy = int(floor(y)) + $yProbes / 2; - int iz = int(floor(z)) + $zProbes / 2; - - f.x = fract((x)); - f.y = fract((y)); - f.z = fract((z)); - - return ivec3(ix, iy, iz); -} - -int gridIndex(ivec3 p) { - ivec3 c = clamp(p, ivec3(0), ivec3(${xProbes - 1}, ${yProbes - 1}, ${zProbes - 1})); - return c.x + c.y * $xProbes + c.z * ${xProbes * yProbes}; -} - -void gatherSH(samplerBuffer btex, vec3 p, out vec3[9] blend) { - vec3[9] c000; - vec3[9] c001; - vec3[9] c010; - vec3[9] c011; - vec3[9] c100; - vec3[9] c101; - vec3[9] c110; - vec3[9] c111; - - vec3 f; - ivec3 io = gridCoordinates(p, f); - - fetchSH(btex, gridIndex(io + ivec3(0,0,0)), c000); - fetchSH(btex, gridIndex(io + ivec3(0,0,1)), c001); - fetchSH(btex, gridIndex(io + ivec3(0,1,0)), c010); - fetchSH(btex, gridIndex(io + ivec3(0,1,1)), c011); - fetchSH(btex, gridIndex(io + ivec3(1,0,0)), c100); - fetchSH(btex, gridIndex(io + ivec3(1,0,1)), c101); - fetchSH(btex, gridIndex(io + ivec3(1,1,0)), c110); - fetchSH(btex, gridIndex(io + ivec3(1,1,1)), c111); - - for (int i = 0; i < 9; ++i) { - blend[i] = mix( mix( mix(c000[i], c001[i], f.z), mix(c010[i], c011[i], f.z), f.y), mix( mix(c100[i], c101[i], f.z), mix(c110[i], c111[i], f.z), f.y), f.x); - } -} -""".trimIndent() - -val glslGridCoordinates: String by phraseResource("/phrases/irradiance-sh/grid-coordinates.frag") -val glslGridIndex: String by phraseResource("/phrases/irradiance-sh/grid-index.frag") -val glslGatherSH: String by phraseResource("/phrases/irradiance-sh/gather-sh.frag") -val glslGatherSH0: String by phraseResource("/phrases/irradiance-sh/gather-sh0.frag") \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/dsl/PBRMaterialBuilder.kt b/orx-jvm/orx-dnk3/src/main/kotlin/dsl/PBRMaterialBuilder.kt deleted file mode 100644 index e128ae94..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/dsl/PBRMaterialBuilder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.openrndr.extra.dnk3.dsl - -import org.openrndr.extra.dnk3.PBRMaterial - -fun pbrMaterial(builder: PBRMaterial.() -> Unit): PBRMaterial { - return PBRMaterial().apply { builder() } -} - -fun test() { - pbrMaterial { - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/dsl/SceneBuilder.kt b/orx-jvm/orx-dnk3/src/main/kotlin/dsl/SceneBuilder.kt deleted file mode 100644 index 26b966c5..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/dsl/SceneBuilder.kt +++ /dev/null @@ -1,88 +0,0 @@ -package org.openrndr.extra.dnk3.dsl - -import kotlinx.coroutines.yield -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.VertexBuffer -import org.openrndr.extra.dnk3.* -import org.openrndr.launch - -fun scene(builder: Scene.() -> Unit): Scene { - val scene = Scene() - scene.builder() - return scene -} - -fun SceneNode.node(builder: SceneNode.() -> Unit): SceneNode { - val node = SceneNode() - node.builder() - children.add(node) - return node -} - -fun SceneNode.hemisphereLight(builder: HemisphereLight.() -> Unit): HemisphereLight { - val hemisphereLight = HemisphereLight() - hemisphereLight.builder() - entities.add(hemisphereLight) - return hemisphereLight -} - -fun SceneNode.directionalLight(buider: DirectionalLight.() -> Unit): DirectionalLight { - val directionalLight = DirectionalLight() - directionalLight.buider() - this.entities.add(directionalLight) - return directionalLight -} - -fun SceneNode.pointLight(builder: PointLight.() -> Unit): PointLight { - val pointLight = PointLight() - pointLight.builder() - this.entities.add(pointLight) - return pointLight -} - -fun SceneNode.spotLight(builder: SpotLight.() -> Unit): SpotLight { - val spotLight = SpotLight() - spotLight.builder() - this.entities.add(spotLight) - return spotLight -} - -class SimpleMeshBuilder { - var vertexBuffer: VertexBuffer? = null - var primitive = DrawPrimitive.TRIANGLES - var material: Material? = null - fun build(): Mesh { - val geometry = Geometry( - listOf(vertexBuffer ?: error("no vertex buffer")), - null, - primitive, - 0, - vertexBuffer?.vertexCount ?: error("no vertex buffer") - ) - val primitive = MeshPrimitive(geometry, material ?: error("no material")) - return Mesh(listOf(primitive)) - } -} - -fun SceneNode.simpleMesh(builder: SimpleMeshBuilder.() -> Unit): Mesh { - val mesh = SimpleMeshBuilder().apply { builder() }.build() - entities.add(mesh) - return mesh -} - - -fun SceneNode.pathMesh(builder: PathMesh.() -> Unit): PathMesh { - val pathMesh = PathMesh(mutableListOf(), DummyMaterial(), 1.0) - pathMesh.builder() - entities.add(pathMesh) - return pathMesh -} - -fun Scene.update(function: () -> Unit) { - dispatcher.launch { - while (true) { - function() - yield() - } - } -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/features/IrradianceSH.kt b/orx-jvm/orx-dnk3/src/main/kotlin/features/IrradianceSH.kt deleted file mode 100644 index bfc37b58..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/features/IrradianceSH.kt +++ /dev/null @@ -1,112 +0,0 @@ -package org.openrndr.extra.dnk3.features - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.dnk3.cubemap.irradianceCoefficients -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import java.io.File -import java.nio.ByteBuffer -import java.nio.ByteOrder - -data class IrradianceSH(val xCount: Int, val yCount: Int, val zCount: Int, val spacing: Double, val offset: Vector3, val cubemapSize: Int) : Feature { - override fun update(drawer: Drawer, sceneRenderer: SceneRenderer, scene: Scene, feature: T, context: RenderContext) { - sceneRenderer.processIrradiance(drawer, scene, feature as IrradianceSH, context) - } - - var shMap: BufferTexture? = null - val probeCount - get() = xCount * yCount * zCount - -} - -fun Scene.addIrradianceSH(xCount: Int, - yCount: Int, - zCount: Int, - spacing: Double, - offset: Vector3 = Vector3.ZERO, - cubemapSize: Int = 256 -) { - features.add(IrradianceSH(xCount * 2 + 1, yCount * 2 + 1, zCount * 2 + 1, spacing, offset, cubemapSize)) - var probeID = 0 - for (k in -zCount..zCount) { - for (j in -yCount..yCount) { - for (i in -xCount..xCount) { - val probeNode = SceneNode() - probeNode.transform = transform { - translate(offset) - translate(i * spacing, j * spacing, k * spacing) - } - probeNode.entities.add(IrradianceProbe()) - probeID++ - root.children.add(probeNode) - } - } - } -} - -private fun SceneRenderer.processIrradiance(drawer: Drawer, scene: Scene, feature: IrradianceSH, context: RenderContext) { - val irradianceProbes = scene.root.findContent { this as? IrradianceProbe } - val irradianceProbePositions = irradianceProbes.map { it.node.worldPosition } - - if (feature.shMap == null && irradianceProbes.isNotEmpty()) { - val hash = scene.hash() - val cached = File("data/scene-cache/sh-$hash.orb") - if (cached.exists()) { - feature.shMap = loadBufferTexture(cached) - } else { - var probeID = 0 - val tempCubemap = cubemap(feature.cubemapSize, format = ColorFormat.RGB, type = ColorType.FLOAT32) - var cubemapDepthBuffer = depthBuffer(feature.cubemapSize, feature.cubemapSize, DepthFormat.DEPTH16, BufferMultisample.Disabled) - - feature.shMap = bufferTexture(irradianceProbes.size * 9, format = ColorFormat.RGB, type = ColorType.FLOAT32) - val buffer = ByteBuffer.allocateDirect(irradianceProbePositions.size * 9 * 3 * 4) - buffer.order(ByteOrder.nativeOrder()) - - for ((node, probe) in irradianceProbes) { - if (probe.dirty) { - val pass = IrradianceProbePass - val materialContext = MaterialContext(pass, context.lights, emptyList(), shadowLightTargets, emptyMap(), 0) - val position = node.worldPosition - - for (side in CubemapSide.values()) { - val target = renderTarget(feature.cubemapSize, feature.cubemapSize) { - //this.colorBuffer(tempCubemap.side(side)) - this.cubemap(tempCubemap, side) - this.depthBuffer(cubemapDepthBuffer) - } - drawer.isolatedWithTarget(target) { - drawer.clear(ColorRGBa.BLACK) - drawer.projection = probe.projectionMatrix - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - drawer.lookAt(position, position + side.forward, side.up) - drawPass(drawer, pass, materialContext, context) - } - - target.detachDepthBuffer() - target.detachColorAttachments() - target.destroy() - } - val coefficients = tempCubemap.irradianceCoefficients() - for (coef in coefficients) { - buffer.putVector3((coef)) - } - probeID++ - //println("$probeID / ${irradianceProbePositions.size}") - probe.dirty = false - } - } - feature.shMap?.let { - buffer.rewind() - it.write(buffer) - val f = File("data/scene-cache/sh-$hash.orb") - if (f.canWrite()) { - it.saveToFile(f) - } - } - } - } -} diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/features/VoxelConeTracing.kt b/orx-jvm/orx-dnk3/src/main/kotlin/features/VoxelConeTracing.kt deleted file mode 100644 index 7c1ad8fc..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/features/VoxelConeTracing.kt +++ /dev/null @@ -1,71 +0,0 @@ -package org.openrndr.extra.dnk3.features - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.* -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector3 - -data class VoxelConeTracing(val xCount: Int, val yCount: Int, val zCount: Int, val spacing: Double, val offset: Vector3) : Feature { - var voxelMap: VolumeTexture? = null - var voxelRenderTarget = null as? RenderTarget? - override fun update(drawer: Drawer, sceneRenderer: SceneRenderer, scene: Scene, feature: T, context: RenderContext) { - sceneRenderer.processVoxelConeTracing(drawer, scene, this, context) - } - - var initialized = false - val voxelPass = RenderPass(listOf(VoxelFacet(this)), renderOpaque = true, renderTransparent = false, depthWrite = false, skipTarget = true) -} - -fun Scene.addVoxelConeTracing(xCount: Int, yCount: Int, zCount: Int, spacing: Double, offset: Vector3 = Vector3.ZERO) : VoxelConeTracing { - val feature = VoxelConeTracing(xCount, yCount, zCount, spacing, offset) - features.add(feature) - return feature -} - -class VoxelFacet(val voxelConeTracing: VoxelConeTracing) : ColorBufferFacetCombiner(setOf(FacetType.DIFFUSE, FacetType.SPECULAR, FacetType.EMISSIVE), "color", ColorFormat.RGBa, ColorType.FLOAT16) { - override fun generateShader() = """ - vec3 finalColor = (max(vec3(0.0), f_diffuse.rgb) + max(vec3(0.0), f_emission.rgb) + max(vec3(0.0), f_ambient.rgb)); - vec3 p = v_worldPosition; - { - float x = (p.x - ${voxelConeTracing.offset.x}) / ${voxelConeTracing.spacing}; - float y = (p.y - ${voxelConeTracing.offset.y}) / ${voxelConeTracing.spacing}; - float z = (p.z - ${voxelConeTracing.offset.z}) / ${voxelConeTracing.spacing}; - - int ix = int(floor(x+0.5)) + ${voxelConeTracing.xCount} / 2; - int iy = int(floor(y+0.5)) + ${voxelConeTracing.yCount} / 2; - int iz = int(floor(z+0.5)) + ${voxelConeTracing.zCount} / 2; - imageStore(p_voxelMap, ivec3(ix, iy, iz), vec4(finalColor, 1.0)); - } - """ -} - -private fun SceneRenderer.processVoxelConeTracing(drawer: Drawer, scene: Scene, feature: VoxelConeTracing, context: RenderContext) { - if (feature.voxelMap == null) { - feature.voxelMap = volumeTexture(feature.xCount * 2 + 1, feature.yCount * 2 + 1, feature.zCount * 2 + 1, format = ColorFormat.RGBa, type = ColorType.FLOAT16) - } - if (feature.voxelRenderTarget == null) { - feature.voxelRenderTarget = renderTarget(2048, 2048, 1.0, BufferMultisample.SampleCount(8)) { - colorBuffer() - } - } - if (!feature.initialized) { - println("drawing voxelmap") - for (side in CubemapSide.values()) { - drawer.isolatedWithTarget(feature.voxelRenderTarget ?: error("no render target")) { - val pass = feature.voxelPass - val materialContext = MaterialContext(pass, context.lights, emptyList(), shadowLightTargets, emptyMap(), 0) - drawer.clear(ColorRGBa.BLACK) - drawer.ortho(-10.0, 10.0, -10.0, 10.0, -40.0, 40.0) - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - val position = Vector3.ZERO - drawer.lookAt(position + side.forward*40.0, position , side.up) - drawPass(drawer, pass, materialContext, context) { - it.image("voxelMap", feature.voxelMap!!.imageBinding(0, ImageAccess.WRITE)) - } - } - } - feature.initialized = true - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Glb.kt b/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Glb.kt deleted file mode 100644 index 599ca7ef..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Glb.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.openrndr.extra.dnk3.gltf - -import kotlinx.serialization.json.Json -import java.io.File -import java.io.RandomAccessFile -import java.nio.ByteBuffer -import java.nio.ByteOrder - -fun loadGltfFromGlbFile(file: File): GltfFile { - val channel = RandomAccessFile(file, "r").channel - val headerBuffer = ByteBuffer.allocate(12).order(ByteOrder.nativeOrder()) - - headerBuffer.rewind() - channel.read(headerBuffer) - headerBuffer.rewind() - - val magic = headerBuffer.int - val version = headerBuffer.int - val length = headerBuffer.int - - fun readChunk(): ByteBuffer { - val chunkHeader = ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()) - channel.read(chunkHeader) - chunkHeader.rewind() - val chunkLength = chunkHeader.int - val chunkType = chunkHeader.int - val chunkBuffer = - if (chunkType == 0x004E4942) ByteBuffer.allocateDirect(chunkLength) else ByteBuffer.allocate(chunkLength) - (chunkBuffer as ByteBuffer) - channel.read(chunkBuffer) - chunkBuffer.order(ByteOrder.nativeOrder()) - return chunkBuffer - } - - val jsonBuffer = readChunk() - jsonBuffer.rewind() - val jsonByteArray = ByteArray(jsonBuffer.capacity()) - jsonBuffer.get(jsonByteArray) - val json = String(jsonByteArray) - val bufferBuffer = if (channel.position() < length) readChunk() else null - - val gltFile = Json { ignoreUnknownKeys = true }.decodeFromString(json) - gltFile.file = file - gltFile.bufferBuffer = bufferBuffer - - return gltFile -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Gltf.kt b/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Gltf.kt deleted file mode 100644 index bf1812ea..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/Gltf.kt +++ /dev/null @@ -1,438 +0,0 @@ -@file:Suppress("MemberVisibilityCanBePrivate", "unused") - -package org.openrndr.extra.dnk3.gltf - -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonBuilder -import kotlinx.serialization.json.JsonIgnoreUnknownKeys -import org.openrndr.draw.* -import java.io.File -import java.io.RandomAccessFile -import java.nio.Buffer -import java.nio.ByteBuffer -import java.nio.ByteOrder -import java.util.* -import kotlin.collections.LinkedHashMap -import kotlin.math.max - -const val GLTF_FLOAT = 5126 -const val GLTF_UNSIGNED_INT = 5125 -const val GLTF_INT = 5124 -const val GLTF_UNSIGNED_SHORT = 5123 -const val GLTF_SHORT = 5122 -const val GLTF_UNSIGNED_BYTE = 5121 -const val GLTF_BYTE = 5120 - -const val GLTF_ARRAY_BUFFER = 34962 -const val GLTF_ELEMENT_ARRAY_BUFFER = 34963 - -@Serializable -data class GltfAsset(val generator: String? = null, val version: String? = null) - -@JvmRecord -@Serializable -data class GltfScene(val nodes: IntArray, val name: String? = null) - -@JvmRecord -@Serializable -data class GltfNode( - val name: String? = null, - val children: IntArray? = null, - val matrix: DoubleArray? = null, - val scale: DoubleArray? = null, - val rotation: DoubleArray? = null, - val translation: DoubleArray? = null, - val mesh: Int? = null, - val skin: Int? = null, - val camera: Int? = null, - val extensions: GltfNodeExtensions? = null -) - -@JvmRecord -@Serializable -data class KHRLightsPunctualIndex(val light: Int) - -@JvmRecord -@Serializable -data class GltfNodeExtensions(val KHR_lights_punctual: KHRLightsPunctualIndex?) { - -} - -@Serializable -data class GltfPrimitive( - val attributes: LinkedHashMap, - val indices: Int? = null, - val mode: Int? = null, - val material: Int? = null -) { - fun createDrawCommand(gltfFile: GltfFile): GltfDrawCommand { - - val indexBuffer = indices?.let { indices -> - val accessor = gltfFile.accessors[indices] - val indexType = when (accessor.componentType) { - GLTF_UNSIGNED_SHORT -> IndexType.INT16 - GLTF_UNSIGNED_INT -> IndexType.INT32 - else -> error("unsupported index type: ${accessor.componentType}") - } - val bufferView = gltfFile.bufferViews[accessor.bufferView] - val buffer = gltfFile.buffers[bufferView.buffer] - val contents = buffer.contents(gltfFile) - (contents as Buffer).limit(contents.capacity()) - (contents as Buffer).position((bufferView.byteOffset ?: 0) + (accessor.byteOffset)) - (contents as Buffer).limit( - (bufferView.byteOffset ?: 0) + (accessor.byteOffset) - + accessor.count * indexType.sizeInBytes - ) - val ib = indexBuffer(accessor.count, indexType) - ib.write(contents) - ib - } - - var maxCount = 0 - - abstract class Convertor { - abstract fun convert(buffer: ByteBuffer, offset: Int, size: Int, writer: BufferWriter) - } - - class CopyConvertor : Convertor() { - override fun convert(buffer: ByteBuffer, offset: Int, size: Int, writer: BufferWriter) { - writer.copyBuffer(buffer, offset, size) - } - } - - class Uint8ToUint32Convertor : Convertor() { - override fun convert(buffer: ByteBuffer, offset: Int, size: Int, writer: BufferWriter) { - for (i in 0 until 4) { - val ui = buffer.get(offset).toInt() - writer.write(ui) - } - } - } - - class Uint16ToUint32Convertor : Convertor() { - override fun convert(buffer: ByteBuffer, offset: Int, size: Int, writer: BufferWriter) { - for (i in 0 until 4) { - val ui = buffer.getShort(offset).toInt() - writer.write(ui) - } - } - } - - class CopyPadConvertor(val padFloats: Int) : Convertor() { - override fun convert(buffer: ByteBuffer, offset: Int, size: Int, writer: BufferWriter) { - writer.copyBuffer(buffer, offset, size) - for (i in 0 until padFloats) { - writer.write(0.0f) - } - } - } - - - val accessors = mutableListOf() - val convertors = mutableListOf() - val format = vertexFormat { - for ((name, index) in attributes.toSortedMap()) { - val accessor = gltfFile.accessors[index] - maxCount = max(accessor.count, maxCount) - when (name) { - "NORMAL" -> { - normal(3) - paddingFloat(1) - accessors.add(accessor) - convertors.add(CopyPadConvertor(1)) - } - - "POSITION" -> { - position(3) - paddingFloat(1) - accessors.add(accessor) - convertors.add(CopyPadConvertor(1)) - } - - "TANGENT" -> { - attribute("tangent", VertexElementType.VECTOR4_FLOAT32) - accessors.add(accessor) - convertors.add(CopyConvertor()) - } - - "TEXCOORD_0" -> { - val dimensions = when (accessor.type) { - "SCALAR" -> 1 - "VEC2" -> 2 - "VEC3" -> 3 - else -> error("unsupported texture coordinate type ${accessor.type}") - } - textureCoordinate(4, 0) - //paddingFloat(4 - dimensions) - accessors.add(accessor) - convertors.add(CopyPadConvertor(4 - dimensions)) - } - - "JOINTS_0" -> { - attribute("joints", VertexElementType.VECTOR4_UINT32) - accessors.add(accessor) - convertors.add( - when (Pair(accessor.type, accessor.componentType)) { - Pair("VEC4", GLTF_UNSIGNED_BYTE) -> Uint8ToUint32Convertor() - Pair("VEC4", GLTF_UNSIGNED_SHORT) -> Uint16ToUint32Convertor() - else -> error("not supported ${accessor.type} / ${accessor.componentType}") - } - ) - } - - "WEIGHTS_0" -> { - val type = when (Pair(accessor.type, accessor.componentType)) { - Pair("VEC4", GLTF_FLOAT) -> VertexElementType.VECTOR4_FLOAT32 - else -> error("not supported ${accessor.type} / ${accessor.componentType}") - } - attribute("weights", type) - accessors.add(accessor) - convertors.add(CopyConvertor()) - } - } - } - } - - val buffers = - accessors.map { it.bufferView } - .distinct() - .associate { - Pair( - gltfFile.bufferViews[it].buffer, - gltfFile.buffers[gltfFile.bufferViews[it].buffer].contents(gltfFile) - ) - } - - val vb = vertexBuffer(format, maxCount) - vb.put { - for (i in 0 until maxCount) { - for ((a, conv) in accessors zip convertors) { - val bufferView = gltfFile.bufferViews[a.bufferView] - val buffer = buffers[bufferView.buffer] ?: error("no buffer ${bufferView.buffer}") - val componentSize = when (a.componentType) { - GLTF_BYTE, GLTF_UNSIGNED_BYTE -> 1 - GLTF_SHORT, GLTF_UNSIGNED_SHORT -> 2 - GLTF_FLOAT, GLTF_UNSIGNED_INT, GLTF_INT -> 4 - else -> error("unsupported type") - } - val componentCount = when (a.type) { - "SCALAR" -> 1 - "VEC2" -> 2 - "VEC3" -> 3 - "VEC4" -> 4 - "MAT2" -> 4 - "MAT3" -> 9 - "MAT4" -> 16 - else -> error("unsupported type") - } - val size = componentCount * componentSize - val offset = (bufferView.byteOffset ?: 0) + a.byteOffset + i * (bufferView.byteStride ?: size) - conv.convert(buffer, offset, size, this) - //copyBuffer(buffer, offset, size) - } - } - } - val drawPrimitive = when (mode) { - null, 4 -> DrawPrimitive.TRIANGLES - 5 -> DrawPrimitive.TRIANGLE_STRIP - else -> error("unsupported mode $mode") - } - return GltfDrawCommand(vb, indexBuffer, drawPrimitive, indexBuffer?.indexCount ?: maxCount) - } -} -@Serializable -data class GltfMesh(val primitives: List, val name: String) { - fun createDrawCommands(gltfFile: GltfFile): List { - return primitives.map { it.createDrawCommand(gltfFile) } - } -} - -@Serializable -data class GltfPbrMetallicRoughness( - val baseColorFactor: DoubleArray? = null, - val baseColorTexture: GltfMaterialTexture? = null, - var metallicRoughnessTexture: GltfMaterialTexture? = null, - val roughnessFactor: Double? = null, - val metallicFactor: Double? = null -) - -@Serializable -data class GltfMaterialTexture(val index: Int, val scale: Double? = null, val texCoord: Int? = null) - -@Serializable -data class GltfImage(val uri: String? = null, val bufferView: Int? = null) - -@Serializable -data class GltfSampler(val magFilter: Int? = null, val minFilter: Int? = null, val wrapS: Int? = null, val wrapT: Int? = null) - -@Serializable -data class GltfTexture(val sampler: Int, val source: Int) - -@Serializable -data class GltfMaterial( - val name: String, - val alphaMode: String? = null, - val doubleSided: Boolean? = null, - val normalTexture: GltfMaterialTexture? = null, - val occlusionTexture: GltfMaterialTexture? = null, - val emissiveTexture: GltfMaterialTexture? = null, - val emissiveFactor: DoubleArray? = null, - val pbrMetallicRoughness: GltfPbrMetallicRoughness? = null, - val extensions: GltfMaterialExtensions? = null -) - -@Serializable -data class GltfMaterialExtensions( - val KHR_materials_pbrSpecularGlossiness: KhrMaterialsPbrSpecularGlossiness? -) - -@Serializable -class KhrMaterialsPbrSpecularGlossiness(val diffuseFactor: DoubleArray?, val diffuseTexture: GltfMaterialTexture?) - -@Serializable -data class GltfBufferView( - val buffer: Int, - val byteOffset: Int? = null, - val byteLength: Int, - val byteStride: Int? = null, - val target: Int? = null -) - -@Serializable -data class GltfBuffer(val byteLength: Int, val uri: String? = null) { - fun contents(gltfFile: GltfFile): ByteBuffer = if (uri != null) { - if (uri.startsWith("data:")) { - val base64 = uri.substring(uri.indexOf(",") + 1) - val decoded = Base64.getDecoder().decode(base64) - val buffer = ByteBuffer.allocateDirect(decoded.size) - buffer.order(ByteOrder.nativeOrder()) - buffer.put(decoded) - buffer.rewind() - buffer - } else { - val raf = RandomAccessFile(File(gltfFile.file.parentFile, uri), "r") - val buffer = ByteBuffer.allocateDirect(byteLength) - buffer.order(ByteOrder.nativeOrder()) - buffer.rewind() - raf.channel.read(buffer) - buffer.rewind() - buffer - } - } else { - gltfFile.bufferBuffer ?: error("no embedded buffer from glb") - } -} - -data class GltfDrawCommand( - val vertexBuffer: VertexBuffer, - val indexBuffer: IndexBuffer?, - val primitive: DrawPrimitive, - var vertexCount: Int -) - -@Serializable -data class GltfAccessor( - val bufferView: Int, - val byteOffset: Int = 0, - val componentType: Int, - val count: Int, - val max: DoubleArray? = null, - val min: DoubleArray? = null, - val type: String -) - -@Serializable -data class GltfAnimation(val name: String? = null, val channels: List, val samplers: List) - -@Serializable -data class GltfAnimationSampler(val input: Int, val interpolation: String? = null, val output: Int) - -@Serializable -data class GltfChannelTarget(val node: Int?, val path: String?) - -@Serializable -data class GltfChannel(val sampler: Int, val target: GltfChannelTarget) - -@Serializable -data class GltfSkin(val inverseBindMatrices: Int, val joints: IntArray, val skeleton: Int) - -@Serializable -data class KHRLightsPunctualLight( - val color: DoubleArray?, - val type: String, - val name: String, - val intensity: Double?, - val range: Double? = null, - val spot: KHRLightsPunctualLightSpot? = null -) - -@Serializable -data class KHRLightsPunctualLightSpot(val innerConeAngle: Double?, val outerConeAngle: Double?) - -@Serializable -data class KHRLightsPunctual(val lights: List) - -@Serializable -@JsonIgnoreUnknownKeys -data class GltfExtensions(val KHR_lights_punctual: KHRLightsPunctual? = null) - -@Serializable -data class GltfCameraPerspective(val aspectRatio: Double? = null, val yfov: Double, val zfar: Double?, val znear: Double) - -@Serializable -data class GltfCameraOrthographic(val xmag: Double, val ymag: Double, val zfar: Double, val znear: Double) - -@Serializable -data class GltfCamera( - val name: String? = null, - val type: String, - val perspective: GltfCameraPerspective? = null, - val orthographic: GltfCameraOrthographic? = null -) - -@Serializable -class GltfFile( - val asset: GltfAsset?, - val scene: Int? = null, - val scenes: List, - val nodes: List, - val meshes: List, - val accessors: List, - val materials: List, - val bufferViews: List, - val buffers: List, - val images: List? = null, - val textures: List? = null, - val samplers: List? = null, - val animations: List? = null, - val skins: List? = null, - val extensions: GltfExtensions? = null, - val extensionsUsed: List? = null, - val extensionsRequired: List? = null, - val cameras: List? = null -) { - @Transient - lateinit var file: File - - @Transient - var bufferBuffer: ByteBuffer? = null -} - -fun loadGltfFromFile(file: File): GltfFile = when (file.extension) { - "gltf" -> { - val gltfFile = Json{ - ignoreUnknownKeys = true - }.decodeFromString(file.readText()) - gltfFile.file = file - gltfFile - } - - "glb" -> { - loadGltfFromGlbFile(file) - } - - else -> error("extension ${file.extension} not supported in ${file}") -} - diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt b/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt deleted file mode 100644 index f16998dd..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt +++ /dev/null @@ -1,439 +0,0 @@ -package org.openrndr.extra.dnk3.gltf - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.keyframer.KeyframerChannelQuaternion -import org.openrndr.extra.keyframer.KeyframerChannelVector3 -import org.openrndr.math.Matrix44 -import org.openrndr.math.Quaternion -import org.openrndr.math.Vector3 -import org.openrndr.math.transforms.transform -import org.openrndr.utils.buffer.MPPBuffer -import java.io.File -import java.nio.Buffer -import java.nio.ByteOrder -import kotlin.reflect.KMutableProperty0 - -class SceneAnimation(var channels: List) { - val duration: Double - get() { - return channels.maxByOrNull { it.duration }?.duration ?: 0.0 - } - - fun applyToTargets(input: Double) { - for (channel in channels) { - channel.applyToTarget(input) - } - } -} - -sealed class AnimationChannel { - abstract val duration: Double - abstract fun applyToTarget(input: Double) -} - - -class QuaternionChannel( - val target: KMutableProperty0, - val keyframer: KeyframerChannelQuaternion -) : AnimationChannel() { - override fun applyToTarget(input: Double) { - target.set(keyframer.value(input) ?: Quaternion.IDENTITY) - } - - override val duration: Double - get() = keyframer.duration() -} - -class Vector3Channel( - val target: KMutableProperty0, - val keyframer: KeyframerChannelVector3, val default: Vector3 -) : AnimationChannel() { - override fun applyToTarget(input: Double) { - target.set(keyframer.value(input) ?: default) - } - - override val duration: Double - get() = keyframer.duration() -} - -class GltfSceneNode : SceneNode() { - var translation = Vector3.ZERO - var scale = Vector3.ONE - var rotation = Quaternion.IDENTITY - - override fun toString(): String { - return "translation: $translation, scale: $scale, rotation: $rotation, children: ${children.size}, entities: ${entities} " - } - - override var transform: Matrix44 = Matrix44.IDENTITY - get() = transform { - translate(translation) - multiply(rotation.matrix.matrix44) - scale(scale) - } * field -} - -class GltfSceneData(val scenes: List>, val animations: List) - - -/** Tools to convert GltfFile into a DNK3 scene */ -fun GltfFile.buildSceneNodes(): GltfSceneData { - val sceneImages = mutableMapOf() - fun GltfImage.createSceneImage(): ColorBuffer { - return sceneImages.getOrPut(this) { - if (uri == null) { - - bufferView?.let { bv -> - val localBufferView = bufferViews[bv] - - val localBuffer = buffers[localBufferView.buffer].contents(this@buildSceneNodes) - require(localBufferView.byteOffset != null) - localBuffer.position(localBufferView.byteOffset) - localBuffer.limit(localBufferView.byteOffset + localBufferView.byteLength) - - val cb = loadImage(MPPBuffer(localBuffer)) - cb.generateMipmaps() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.anisotropy = 10.0 - localBuffer.limit(localBuffer.capacity()) - cb - } ?: error("no uri and no bufferview") - - } else { - if (uri.startsWith("data:")) { - loadImage(uri) - } else { - loadImage(File(file.parent, uri)) - } - } - } - } - - val sceneMaterials = mutableMapOf() - fun GltfMaterial.createSceneMaterial(): Material = sceneMaterials.getOrPut(this) { - val material = PBRMaterial() - material.name = this.name - - material.doubleSided = this.doubleSided ?: false - material.transparent = this.alphaMode != null - - pbrMetallicRoughness?.let { pbr -> - material.roughness = pbr.roughnessFactor ?: 1.0 - material.metalness = pbr.metallicFactor ?: 1.0 - - material.color = ColorRGBa.WHITE - pbr.baseColorFactor?.let { - material.color = ColorRGBa(it[0], it[1], it[2], it[3]) - } - - pbr.baseColorTexture?.let { texture -> - val cb = images!![textures!![texture.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.COLOR - ) - material.textures.add(sceneTexture) - } - pbr.metallicRoughnessTexture?.let { texture -> - val cb = images!![textures!![texture.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.METALNESS_ROUGHNESS - ) - material.textures.add(sceneTexture) - } - } - - occlusionTexture?.let { texture -> - val cb = images!![textures!![texture.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.AMBIENT_OCCLUSION - ) - material.textures.add(sceneTexture) - } - - normalTexture?.let { texture -> - val cb = images!![textures!![texture.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - - val sceneTexture = Texture( - ModelCoordinates( - texture = cb, - tangentInput = "va_tangent", - pre = "x_texCoord.y = 1.0-x_texCoord.y;" - ), TextureTarget.NORMAL - ) - material.textures.add(sceneTexture) - } - - emissiveFactor?.let { - material.emission = ColorRGBa(it[0], it[1], it[2]) - } - - emissiveTexture?.let { - val cb = images!![textures!![it.index].source].createSceneImage() - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.EMISSION - ) - material.textures.add(sceneTexture) - } - - extensions?.let { ext -> - ext.KHR_materials_pbrSpecularGlossiness?.let { sg -> - sg.diffuseFactor?.let { - material.color = ColorRGBa(it[0], it[1], it[2], it[3]) - } - sg.diffuseTexture?.let { - val cb = images!![textures!![it.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.COLOR - ) - material.textures.add(sceneTexture) - } - occlusionTexture?.let { texture -> - val cb = images!![textures!![texture.index].source].createSceneImage() - cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.wrapU = WrapMode.REPEAT - cb.wrapV = WrapMode.REPEAT - val sceneTexture = Texture( - ModelCoordinates(texture = cb, pre = "x_texCoord.y = 1.0-x_texCoord.y;"), - TextureTarget.AMBIENT_OCCLUSION - ) - material.textures.add(sceneTexture) - } - } - } - - emissiveFactor?.let { - material.emission = ColorRGBa(it[0], it[1], it[2], 1.0) - } - material - } - - fun GltfPrimitive.createScenePrimitive(): MeshPrimitive { - val drawCommand = createDrawCommand(this@buildSceneNodes) - val geometry = Geometry( - listOf(drawCommand.vertexBuffer), - drawCommand.indexBuffer, - drawCommand.primitive, - 0, - drawCommand.vertexCount - ) - val material = materials.getOrNull(material ?: -1 )?.createSceneMaterial() ?: PBRMaterial() - return MeshPrimitive(geometry, material) - } - - - val sceneNodes = mutableMapOf() - fun GltfNode.createSceneNode(): SceneNode = sceneNodes.getOrPut(this) { - val node = GltfSceneNode() - node.name = name ?: "no name" - node.translation = translation?.let { Vector3(it[0], it[1], it[2]) } ?: Vector3.ZERO - node.scale = scale?.let { Vector3(it[0], it[1], it[2]) } ?: Vector3.ONE - node.rotation = rotation?.let { Quaternion(it[0], it[1], it[2], it[3]) } ?: Quaternion.IDENTITY - - matrix?.let { - node.transform = Matrix44.fromDoubleArray(it).transposed - } - for (child in children.orEmpty) { - val childNode = nodes.getOrNull(child) ?: error("child node not found: $child") - node.children.add(childNode.createSceneNode()) - } - node - } - - val sceneMeshes = mutableMapOf() - fun GltfMesh.createSceneMesh(skin: GltfSkin?): MeshBase = sceneMeshes.getOrPut(this) { - if (skin == null) { - Mesh(primitives.map { - it.createScenePrimitive() - }) - } else { - val joints = skin.joints.map { nodes[it].createSceneNode() } - val skeleton = nodes[skin.skeleton].createSceneNode() - val ibmAccessor = accessors[skin.inverseBindMatrices] - val ibmBufferView = bufferViews[ibmAccessor.bufferView] - val ibmBuffer = buffers[ibmBufferView.buffer] - - val ibmData = ibmBuffer.contents(this@buildSceneNodes) - ibmData.order(ByteOrder.nativeOrder()) - (ibmData as Buffer).position(ibmAccessor.byteOffset + (ibmBufferView.byteOffset ?: 0)) - - require(ibmAccessor.type == "MAT4") - require(ibmAccessor.componentType == GLTF_FLOAT) - require(ibmAccessor.count == joints.size) - val ibms = (0 until ibmAccessor.count).map { - val array = DoubleArray(16) - for (i in 0 until 16) { - array[i] = ibmData.float.toDouble() - } - Matrix44.fromDoubleArray(array).transposed - } - - SkinnedMesh(primitives.map { - it.createScenePrimitive() - }, joints, skeleton, ibms) - } - } - - fun GltfCamera.createSceneCamera(sceneNode: SceneNode): Camera { - return when (type) { - "perspective" -> { - PerspectiveCamera(sceneNode).apply { - aspectRatio = perspective?.aspectRatio ?: aspectRatio - far = perspective?.zfar ?: far - near = perspective?.znear ?: near - fov = perspective?.yfov?.let { Math.toDegrees(it) } ?: fov - } - } - "orthographic" -> { - OrthographicCamera(sceneNode).apply { - xMag = orthographic?.xmag ?: xMag - yMag = orthographic?.ymag ?: yMag - near = orthographic?.znear ?: near - far = orthographic?.zfar ?: far - } - } - else -> error("unsupported camera type: $type") - } - } - - val scenes = scenes.map { scene -> - scene.nodes.map { node -> - val gltfNode = nodes.getOrNull(node) ?: error("node not found: $node") - val sceneNode = gltfNode.createSceneNode() - sceneNode - } - } - for ((gltfNode, sceneNode) in sceneNodes) { - gltfNode.mesh?.let { - val skin = gltfNode.skin?.let { (skins!!)[it] } - sceneNode.entities.add(meshes[it].createSceneMesh(skin)) - } - - gltfNode.camera?.let { - sceneNode.entities.add(cameras!![it].createSceneCamera(sceneNode)) - } - - gltfNode.extensions?.let { exts -> - exts.KHR_lights_punctual?.let { lightIndex -> - extensions?.KHR_lights_punctual?.lights?.get(lightIndex.light)?.let { light -> - val sceneLight = when (light.type) { - "point" -> { - PointLight() - } - "directional" -> { - DirectionalLight().apply { - shadows = Shadows.PCF() - } - } - "spot" -> { - SpotLight().apply { - innerAngle = Math.toDegrees(light.spot!!.innerConeAngle ?: 0.0) - outerAngle = Math.toDegrees(light.spot.outerConeAngle ?: Math.PI / 4.0) - shadows = Shadows.PCF() - } - - } - else -> error("unsupported light type ${light.type}") - } - sceneLight.apply { - val lightColor = (light.color ?: doubleArrayOf(1.0, 1.0, 1.0)) - color = ColorRGBa(lightColor[0], lightColor[1], lightColor[2]) - } - sceneNode.entities.add(sceneLight) - } - } - } - } - - val sceneAnimations = animations?.map { animation -> - val animationChannels = animation.channels.mapNotNull { channel -> - val candidate = channel.target.node?.let { nodes[it] }?.createSceneNode() as? GltfSceneNode - candidate?.let { sceneNode -> - val sampler = animation.samplers[channel.sampler] - - val inputAccessor = accessors[sampler.input] - val inputBufferView = bufferViews[inputAccessor.bufferView] - val inputData = buffers[inputBufferView.buffer].contents(this) - - val outputAccessor = accessors[sampler.output] - val outputBufferView = bufferViews[outputAccessor.bufferView] - val outputData = buffers[outputBufferView.buffer].contents(this) - - inputData.order(ByteOrder.nativeOrder()) - outputData.order(ByteOrder.nativeOrder()) - - require(inputAccessor.count == outputAccessor.count) - when (channel.target.path) { - "scale", "translation" -> { - require(inputAccessor.type == "SCALAR") - require(outputAccessor.type == "VEC3") - val keyframer = KeyframerChannelVector3() - val inputOffset = (inputBufferView.byteOffset ?: 0) + (inputAccessor.byteOffset ?: 0) - val outputOffset = (outputBufferView.byteOffset ?: 0) + (outputAccessor.byteOffset ?: 0) - val inputStride = (inputBufferView.byteStride ?: 4) - val outputStride = (outputBufferView.byteStride ?: 12) - - inputData.limit(inputData.capacity()) - for (i in 0 until outputAccessor.count) { - val input = inputData.getFloat(inputOffset + i * inputStride).toDouble() - val outputX = outputData.getFloat(outputOffset + i * outputStride).toDouble() - val outputY = outputData.getFloat(outputOffset + i * outputStride + 4).toDouble() - val outputZ = outputData.getFloat(outputOffset + i * outputStride + 8).toDouble() - keyframer.add(input, Vector3(outputX, outputY, outputZ)) - } - val target = - if (channel.target.path == "translation") sceneNode::translation else sceneNode::scale - val default = if (channel.target.path == "translation") Vector3.ZERO else Vector3.ONE - Vector3Channel(target, keyframer, default) - } - "rotation" -> { - require(inputAccessor.type == "SCALAR") - require(outputAccessor.type == "VEC4") { - "${outputAccessor.type}" - } - val keyframer = KeyframerChannelQuaternion() - val inputOffset = (inputBufferView.byteOffset ?: 0) + (inputAccessor.byteOffset ?: 0) - val outputOffset = (outputBufferView.byteOffset ?: 0) + (outputAccessor.byteOffset ?: 0) - val inputStride = (inputBufferView.byteStride ?: 4) - val outputStride = (outputBufferView.byteStride ?: 16) - for (i in 0 until outputAccessor.count) { - val input = inputData.getFloat(inputOffset + i * inputStride).toDouble() - val outputX = outputData.getFloat(outputOffset + i * outputStride).toDouble() - val outputY = outputData.getFloat(outputOffset + i * outputStride + 4).toDouble() - val outputZ = outputData.getFloat(outputOffset + i * outputStride + 8).toDouble() - val outputW = outputData.getFloat(outputOffset + i * outputStride + 12).toDouble() - keyframer.add(input, Quaternion(outputX, outputY, outputZ, outputW)) - } - QuaternionChannel(sceneNode::rotation, keyframer) - } - else -> error("unsupported path ${channel.target.path}") - } - } - } - SceneAnimation(animationChannels) - } - return GltfSceneData(scenes, sceneAnimations.orEmpty()) -} - -private val IntArray?.orEmpty: IntArray get() = this ?: IntArray(0) \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/materials/IrradianceDebugMaterial.kt b/orx-jvm/orx-dnk3/src/main/kotlin/materials/IrradianceDebugMaterial.kt deleted file mode 100644 index 9bac0e77..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/materials/IrradianceDebugMaterial.kt +++ /dev/null @@ -1,71 +0,0 @@ -package org.openrndr.extra.dnk3.materials - -import org.openrndr.draw.ShadeStyle -import org.openrndr.draw.shadeStyle -import org.openrndr.extra.dnk3.Material -import org.openrndr.extra.dnk3.MaterialContext -import org.openrndr.extra.dnk3.PrimitiveContext -import org.openrndr.extra.dnk3.cubemap.glslEvaluateSH -import org.openrndr.extra.dnk3.cubemap.glslFetchSH -import org.openrndr.extra.dnk3.cubemap.genGlslGatherSH - -class IrradianceDebugMaterial : Material { - override val name: String? = null - - override var doubleSided: Boolean = false - override var transparent: Boolean = false - override val fragmentID: Int = 0 - - override fun generateShadeStyle(context: MaterialContext, primitiveContext: PrimitiveContext): ShadeStyle { - return shadeStyle { - fragmentPreamble = """ - $glslEvaluateSH - $glslFetchSH - ${genGlslGatherSH(context.irradianceSH!!.xCount, context.irradianceSH!!.yCount, context.irradianceSH!!.zCount, context.irradianceSH!!.spacing, context.irradianceSH!!.offset)} - vec3 f_emission = vec3(0.0); - """ - - if (context.irradianceSH != null) { - fragmentTransform = """ - vec3[9] sh; - gatherSH(p_shMap, v_worldPosition, sh); - x_fill.rgb = evaluateSH(normalize(v_worldNormal), sh); - - """.trimIndent() - } else { - fragmentTransform = """ - discard; - """ - } - } - } - - override fun applyToShadeStyle(context: MaterialContext, shadeStyle: ShadeStyle) { - context.irradianceSH?.shMap?.let { - shadeStyle.parameter("shMap", it) - } - - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is IrradianceDebugMaterial) return false - - if (name != other.name) return false - if (doubleSided != other.doubleSided) return false - if (transparent != other.transparent) return false - if (fragmentID != other.fragmentID) return false - - return true - } - - override fun hashCode(): Int { - var result = name?.hashCode() ?: 0 - result = 31 * result + doubleSided.hashCode() - result = 31 * result + transparent.hashCode() - result = 31 * result + fragmentID - return result - } - - -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/post/ScreenspaceReflections.kt b/orx-jvm/orx-dnk3/src/main/kotlin/post/ScreenspaceReflections.kt deleted file mode 100644 index 77961c34..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/post/ScreenspaceReflections.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.openrndr.extra.dnk3.post - -import org.openrndr.draw.Filter -import org.openrndr.math.Matrix44 -import org.openrndr.resourceUrl - -class ScreenspaceReflections : Filter(preprocessedFilterShaderFromUrl(resourceUrl("/shaders/screenspace-reflections.frag"))) { - var projection: Matrix44 by parameters - var projectionMatrixInverse: Matrix44 by parameters - - var colors: Int by parameters - var projDepth: Int by parameters - var normals: Int by parameters - - var jitterOriginGain: Double by parameters - var iterationLimit: Int by parameters - var distanceLimit: Double by parameters - var gain: Double by parameters - var borderWidth: Double by parameters - - init { - colors = 0 - projDepth = 1 - normals = 2 - - projection = Matrix44.IDENTITY - projectionMatrixInverse = Matrix44.IDENTITY - - distanceLimit = 100.0 - iterationLimit = 128 - jitterOriginGain = 0.0 - - gain = 1.0 - borderWidth = 130.0 - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/post/SegmentContours.kt b/orx-jvm/orx-dnk3/src/main/kotlin/post/SegmentContours.kt deleted file mode 100644 index f9527acf..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/post/SegmentContours.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.openrndr.extra.dnk3.post - -import org.openrndr.draw.Filter -import org.openrndr.draw.filterShaderFromUrl -import org.openrndr.resourceUrl - -class SegmentContoursMSAA8 : Filter(filterShaderFromUrl(resourceUrl("/shaders/segment-contours-msaa-8.frag"))) -class SegmentContours : Filter(filterShaderFromUrl(resourceUrl("/shaders/segment-contours.frag"))) diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/post/VolumetricIrradiance.kt b/orx-jvm/orx-dnk3/src/main/kotlin/post/VolumetricIrradiance.kt deleted file mode 100644 index c6d20dbc..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/post/VolumetricIrradiance.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.openrndr.extra.dnk3.post - -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.features.IrradianceSH -import org.openrndr.extra.shaderphrases.preprocessShader -import org.openrndr.math.IntVector3 -import org.openrndr.math.Matrix44 -import org.openrndr.resourceUrl -import org.openrndr.shape.Rectangle -import java.net.URL - -fun preprocessedFilterShaderFromUrl(url: String): Shader { - return filterShaderFromCode( preprocessShader(URL(url).readText()), "filter-shader: $url") -} - -fun preprocessedFilterShaderFromCode(fragmentShaderCode: String, name: String): Shader { - return Shader.createFromCode(vsCode = Filter.filterVertexCode, fsCode = fragmentShaderCode, name = name) -} - -class VolumetricIrradiance : Filter(preprocessedFilterShaderFromUrl(resourceUrl("/shaders/volumetric-irradiance.frag"))) { - - var stepLength: Double by parameters - var irradianceSH: IrradianceSH? = null - - var viewMatrixInverse: Matrix44 by parameters - var projectionMatrixInverse: Matrix44 by parameters - - init { - stepLength = 0.1 - viewMatrixInverse = Matrix44.IDENTITY - projectionMatrixInverse = Matrix44.IDENTITY - } - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - irradianceSH?.shMap?.let { - parameters["shMap"] = it - } - irradianceSH?.let { - parameters["shMapDimensions"] = IntVector3(it.xCount, it.yCount, it.zCount) - parameters["shMapOffset"] = it.offset - parameters["shMapSpacing"] = it.spacing - } - super.apply(source, target, clip) - } -} - diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/query/Query.kt b/orx-jvm/orx-dnk3/src/main/kotlin/query/Query.kt deleted file mode 100644 index f062d7fa..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/query/Query.kt +++ /dev/null @@ -1,56 +0,0 @@ -package org.openrndr.extra.dnk3.query - -import org.openrndr.extra.dnk3.Material -import org.openrndr.extra.dnk3.Mesh -import org.openrndr.extra.dnk3.Scene -import org.openrndr.extra.dnk3.SceneNode - -fun Scene.findNodeByName(name: String): SceneNode? { - return root.findNodeByName(name) -} - -fun SceneNode.findNodeByName(name: String): SceneNode? { - - if (this.name == name) { - return this - } else { - for (child in children) { - val candidate = child.findNodeByName(name) - if (candidate != null) { - return candidate - } - } - } - return null -} - -fun SceneNode.findMaterialByName(name: String): Material? { - return allMaterials().find { it.name == name } -} - -fun Scene.allMaterials(): Set { - return root.allMaterials() -} - -fun SceneNode.allMaterials(): Set { - val materials = mutableSetOf() - fun processNode(node: SceneNode) { - for (entity in node.entities) { - when (entity) { - is Mesh -> { - materials.addAll(entity.primitives.map { it.material }) - } - else -> { - } - } - } - - for (child in node.children) { - processNode(child) - } - } - processNode(this) - return materials -} - - diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/DryRenderer.kt b/orx-jvm/orx-dnk3/src/main/kotlin/renderers/DryRenderer.kt deleted file mode 100644 index 10b73024..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/DryRenderer.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.openrndr.extra.dnk3.renderers - -import org.openrndr.extra.dnk3.SceneRenderer - -fun dryRenderer() : SceneRenderer { - val sr = SceneRenderer() - return sr -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/PostRenderer.kt b/orx-jvm/orx-dnk3/src/main/kotlin/renderers/PostRenderer.kt deleted file mode 100644 index 86d1809b..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/PostRenderer.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.openrndr.extra.dnk3.renderers - -import org.openrndr.draw.BufferMultisample -import org.openrndr.extra.dnk3.* - -fun postRenderer(multisample: BufferMultisample = BufferMultisample.Disabled): SceneRenderer { - val sr = SceneRenderer() - sr.outputPasses.clear() - sr.outputPasses.add( - RenderPass( - listOf(HDRColorFacet(),FragmentIDFacet(), ClipDepthFacet(), ViewNormalFacet()), - multisample = multisample - ) - ) - - sr.drawFinalBuffer = true - return sr -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/SegmentContourRenderer.kt b/orx-jvm/orx-dnk3/src/main/kotlin/renderers/SegmentContourRenderer.kt deleted file mode 100644 index ad555fd2..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/renderers/SegmentContourRenderer.kt +++ /dev/null @@ -1,34 +0,0 @@ -package org.openrndr.extra.dnk3.renderers - -import org.openrndr.draw.BufferMultisample -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.ColorType -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.dnk3.post.SegmentContours -import org.openrndr.extra.dnk3.post.SegmentContoursMSAA8 - -fun segmentContourRenderer(multisample: BufferMultisample = BufferMultisample.Disabled): SceneRenderer { - val sr = SceneRenderer() - sr.outputPasses.clear() - sr.outputPasses.add( - RenderPass( - listOf(LDRColorFacet(),FragmentIDFacet()), - multisample = multisample - ) - ) - sr.postSteps.add( - FilterPostStep(1.0, - when (multisample) { - BufferMultisample.Disabled -> SegmentContours() - BufferMultisample.SampleCount(8) -> SegmentContoursMSAA8() - else -> error("unsupported multisampling mode $multisample") - }, - listOf("fragmentID"), - "segments", - ColorFormat.RGB, - ColorType.UINT8 - ) - ) - sr.drawFinalBuffer = true - return sr -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/tools/MeshCollapse.kt b/orx-jvm/orx-dnk3/src/main/kotlin/tools/MeshCollapse.kt deleted file mode 100644 index 80bb4dc6..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/tools/MeshCollapse.kt +++ /dev/null @@ -1,98 +0,0 @@ -package org.openrndr.extra.dnk3.tools - -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.Geometry -import org.openrndr.extra.dnk3.Mesh -import org.openrndr.extra.dnk3.MeshPrimitive -import org.openrndr.extra.dnk3.PBRMaterial -import java.nio.ByteBuffer -import java.nio.ByteOrder - - -private data class CollapseItem(val vertexFormats: List, - val drawPrimitive: DrawPrimitive, - val hasIndexBuffer: Boolean) - -fun Mesh.collapse() { - val grouped = primitives.groupBy { - CollapseItem(it.geometry.vertexBuffers.map { it.vertexFormat }, it.geometry.primitive, it.geometry.indexBuffer != null) - } - - grouped.map { - val vertexCount = it.value.sumOf { primitive -> - primitive.geometry.vertexCount - } - - val indexCount = if (it.key.hasIndexBuffer) - it.value.sumOf { primitive -> - primitive.geometry.indexBuffer?.indexCount ?: 0 - } - else 0 - - val collapsedVertices = it.key.vertexFormats.map { - vertexBuffer(it, vertexCount) - } + vertexBuffer(vertexFormat { attribute("fragmentID", VertexElementType.INT16) }, vertexCount) - - - val fragmentBuffer = ByteBuffer.allocateDirect(vertexCount * 2) - fragmentBuffer.order(ByteOrder.nativeOrder()) - - for (i in 0 until collapsedVertices.size) { - var offset = 0 - for (fromPrimitive in it.value) { - val fromBuffer = fromPrimitive.geometry.vertexBuffers[i] - - val copy = ByteBuffer.allocateDirect(fromBuffer.vertexCount * fromBuffer.vertexFormat.size) - copy.order(ByteOrder.nativeOrder()) - fromBuffer.read(copy) - copy.rewind() - - collapsedVertices[i].write(copy, offset) - offset += copy.capacity() - - for (v in 0 until fromBuffer.vertexCount) { - fragmentBuffer.putShort(fromPrimitive.material.fragmentID.toShort()) - } - } - } - - val collapsedIndices = if (it.key.hasIndexBuffer) indexBuffer(indexCount, IndexType.INT32) else null - - if (it.key.hasIndexBuffer) { - var offset = 0 - val result = ByteBuffer.allocateDirect(4 * indexCount) - result.order(ByteOrder.nativeOrder()) - - for (fromPrimitive in it.value) { - val fromBuffer = fromPrimitive.geometry.indexBuffer!! - when (fromBuffer.type) { - IndexType.INT16 -> { - val copy = ByteBuffer.allocateDirect(fromBuffer.indexCount * 2) - fromBuffer.read(copy) - copy.rewind() - for (i in 0 until fromBuffer.indexCount) { - val index = (copy.getShort().toInt() and 0xffff) + offset - result.putInt(index) - } - } - IndexType.INT32 -> { - val copy = ByteBuffer.allocateDirect(fromBuffer.indexCount * 4) - fromBuffer.read(copy) - copy.rewind() - for (i in 0 until fromBuffer.indexCount) { - val index = copy.getInt() + offset - result.putInt(index) - } - } - } - offset += fromPrimitive.geometry.vertexCount - } - } - - val collapsedGeometry = Geometry(collapsedVertices, collapsedIndices, it.key.drawPrimitive, 0, if (collapsedIndices == null) - vertexCount else indexCount - ) - - MeshPrimitive(collapsedGeometry, PBRMaterial()) - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/tools/Skybox.kt b/orx-jvm/orx-dnk3/src/main/kotlin/tools/Skybox.kt deleted file mode 100644 index 606868a7..00000000 --- a/orx-jvm/orx-dnk3/src/main/kotlin/tools/Skybox.kt +++ /dev/null @@ -1,84 +0,0 @@ -package org.openrndr.extra.dnk3.tools - -import org.openrndr.draw.* -import org.openrndr.extra.dnk3.* -import org.openrndr.extra.meshgenerators.boxMesh - - -data class SkyboxMaterial(val cubemap: Cubemap, val intensity: Double = 0.0) : Material { - override val name: String = "skybox" - override var doubleSided: Boolean = false - override var transparent: Boolean = false - override val fragmentID: Int = 0 - - override fun generateShadeStyle(materialContext: MaterialContext, primitiveContext: PrimitiveContext): ShadeStyle { - return shadeStyle { - vertexTransform = """ - vec2 i = vec2(1.0, 0.0); - x_viewMatrix = x_viewNormalMatrix; - """.trimIndent() - - val combinerFS = materialContext.pass.combiners.map { - it.generateShader() - }.joinToString("\n") - - fragmentPreamble = """ - vec4 f_diffuse = vec4(0.0, 0.0, 0.0, 1.0); - vec3 f_specular = vec3(0.0); - vec3 f_ambient = vec3(0.0); - vec3 f_emission = vec3(0.0); - int f_fragmentID = 0; - vec4 m_color = vec4(1.0); - vec4 f_fog = vec4(0.0); - - """.trimIndent() - fragmentTransform = """ - f_diffuse = texture(p_skybox, va_position); - f_diffuse.rgb *= p_intensity; - """ + combinerFS - - suppressDefaultOutput = true - val rt = RenderTarget.active - materialContext.pass.combiners.map { - if (rt is ProgramRenderTarget || materialContext.pass === DefaultPass || materialContext.pass === DefaultOpaquePass || materialContext.pass == DefaultTransparentPass || materialContext.pass == IrradianceProbePass) { - this.output(it.targetOutput, ShadeStyleOutput(0)) - } else { - val index = rt.colorAttachmentIndexByName(it.targetOutput) - ?: error("attachment ${it.targetOutput} not found") - val type = rt.colorBuffer(index).type - val format = rt.colorBuffer(index).format - this.output(it.targetOutput, ShadeStyleOutput(index, format, type)) - } - } - } - } - - override fun applyToShadeStyle(context: MaterialContext, shadeStyle: ShadeStyle) { - shadeStyle.parameter("skybox", cubemap) - shadeStyle.parameter("intensity", intensity) - } - - - override fun hashCode(): Int { - var result = intensity.hashCode() - result = 31 * result + name.hashCode() - result = 31 * result + doubleSided.hashCode() - result = 31 * result + transparent.hashCode() - result = 31 * result + fragmentID - return result - } - - -} - -fun Scene.addSkybox(cubemapUrl: String, size: Double = 100.0, intensity: Double = 1.0) { - val cubemap = loadCubemap(cubemapUrl, null, Session.active).apply { generateMipmaps() } - val box = boxMesh(size, size, size, 1, 1, 1, true) - val node = SceneNode() - val material = SkyboxMaterial(cubemap, intensity) - val geometry = Geometry(listOf(box), null, DrawPrimitive.TRIANGLES, 0, box.vertexCount) - val primitive = MeshPrimitive(geometry, material) - val mesh = Mesh(listOf(primitive)) - node.entities.add(mesh) - root.children.add(node) -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/evaluate-sh.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/evaluate-sh.frag deleted file mode 100644 index 6dbd4aa7..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/evaluate-sh.frag +++ /dev/null @@ -1,17 +0,0 @@ -vec3 evaluateSH(vec3 direction, vec3[9] _SH) { - const float c1 = 0.42904276540489171563379376569857; // 4 * Â2.Y22 = 1/4 * sqrt(15.PI) - const float c2 = 0.51166335397324424423977581244463; // 0.5 * Â1.Y10 = 1/2 * sqrt(PI/3) - const float c3 = 0.24770795610037568833406429782001; // Â2.Y20 = 1/16 * sqrt(5.PI) - const float c4 = 0.88622692545275801364908374167057; // Â0.Y00 = 1/2 * sqrt(PI) - - float x = direction.x; - float y = direction.y; - float z = direction.z; - - return max(vec3(0.0), - _SH[8] * (c1 * (x * x - y * y)) // c1.L22.(x²-y²) - + _SH[6] * (c3 * (3.0 * z * z - 1)) // c3.L20.(3.z² - 1) - + _SH[0] * c4 // c4.L00 - + (_SH[4] * x * y + _SH[7] * x * z + _SH[5] * y * z) * 2.0 * c1 // 2.c1.(L2-2.xy + L21.xz + L2-1.yz) - + (_SH[3] * x + _SH[1] * y + _SH[2] * z) * c2 * 2.0); // 2.c2.(L11.x + L1-1.y + L10.z) -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh.frag deleted file mode 100644 index 5e4bc087..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh.frag +++ /dev/null @@ -1,12 +0,0 @@ -void fetchSH(samplerBuffer btex, int probeID, out vec3[9] _SH) { - int offset = probeID * 9; - _SH[0] = texelFetch(btex, offset).rgb; - _SH[1] = texelFetch(btex, offset+1).rgb; - _SH[2] = texelFetch(btex, offset+2).rgb; - _SH[3] = texelFetch(btex, offset+3).rgb; - _SH[4] = texelFetch(btex, offset+4).rgb; - _SH[5] = texelFetch(btex, offset+5).rgb; - _SH[6] = texelFetch(btex, offset+6).rgb; - _SH[7] = texelFetch(btex, offset+7).rgb; - _SH[8] = texelFetch(btex, offset+8).rgb; -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh0.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh0.frag deleted file mode 100644 index b07cd066..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/fetch-sh0.frag +++ /dev/null @@ -1,4 +0,0 @@ -void fetchSH0(samplerBuffer btex, int probeID, out vec3 _SH) { - int offset = probeID * 9; - _SH = texelFetch(btex, offset).rgb; -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh.frag deleted file mode 100644 index 2bce506a..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh.frag +++ /dev/null @@ -1,26 +0,0 @@ -void gatherSH(samplerBuffer btex, vec3 p, ivec3 probeCounts, vec3 offset, float spacing, out vec3[9] blend) { - vec3[9] c000; - vec3[9] c001; - vec3[9] c010; - vec3[9] c011; - vec3[9] c100; - vec3[9] c101; - vec3[9] c110; - vec3[9] c111; - - vec3 f; - ivec3 io = gridCoordinates(p, f, probeCounts, offset, spacing); - - fetchSH(btex, gridIndex(io + ivec3(0,0,0), probeCounts), c000); - fetchSH(btex, gridIndex(io + ivec3(0,0,1), probeCounts), c001); - fetchSH(btex, gridIndex(io + ivec3(0,1,0), probeCounts), c010); - fetchSH(btex, gridIndex(io + ivec3(0,1,1), probeCounts), c011); - fetchSH(btex, gridIndex(io + ivec3(1,0,0), probeCounts), c100); - fetchSH(btex, gridIndex(io + ivec3(1,0,1), probeCounts), c101); - fetchSH(btex, gridIndex(io + ivec3(1,1,0), probeCounts), c110); - fetchSH(btex, gridIndex(io + ivec3(1,1,1), probeCounts), c111); - - for (int i = 0; i < 9; ++i) { - blend[i] = mix( mix( mix(c000[i], c001[i], f.z), mix(c010[i], c011[i], f.z), f.y), mix( mix(c100[i], c101[i], f.z), mix(c110[i], c111[i], f.z), f.y), f.x); - } -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh0.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh0.frag deleted file mode 100644 index 28926e59..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/gather-sh0.frag +++ /dev/null @@ -1,25 +0,0 @@ -void gatherSH0(samplerBuffer btex, vec3 p, ivec3 probeCounts, vec3 offset, float spacing, out vec3 blend) { - vec3 c000; - vec3 c001; - vec3 c010; - vec3 c011; - vec3 c100; - vec3 c101; - vec3 c110; - vec3 c111; - - vec3 f; - ivec3 io = gridCoordinates(p, f, probeCounts, offset, spacing); - - fetchSH0(btex, gridIndex(io + ivec3(0,0,0), probeCounts), c000); - fetchSH0(btex, gridIndex(io + ivec3(0,0,1), probeCounts), c001); - fetchSH0(btex, gridIndex(io + ivec3(0,1,0), probeCounts), c010); - fetchSH0(btex, gridIndex(io + ivec3(0,1,1), probeCounts), c011); - fetchSH0(btex, gridIndex(io + ivec3(1,0,0), probeCounts), c100); - fetchSH0(btex, gridIndex(io + ivec3(1,0,1), probeCounts), c101); - fetchSH0(btex, gridIndex(io + ivec3(1,1,0), probeCounts), c110); - fetchSH0(btex, gridIndex(io + ivec3(1,1,1), probeCounts), c111); - - blend = mix( mix( mix(c000, c001, f.z), mix(c010, c011, f.z), f.y), mix( mix(c100, c101, f.z), mix(c110, c111, f.z), f.y), f.x); - -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-coordinates.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-coordinates.frag deleted file mode 100644 index 82ec0204..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-coordinates.frag +++ /dev/null @@ -1,15 +0,0 @@ -ivec3 gridCoordinates(vec3 p, out vec3 f, ivec3 probeCounts, vec3 offset, float spacing) { - float x = (p.x - offset.x) / spacing; - float y = (p.y - offset.y)/ spacing; - float z = (p.z - offset.z) / spacing; - - int ix = int(floor(x)) + probeCounts.x / 2; - int iy = int(floor(y)) + probeCounts.y / 2; - int iz = int(floor(z)) + probeCounts.z / 2; - - f.x = fract((x)); - f.y = fract((y)); - f.z = fract((z)); - - return ivec3(ix, iy, iz); -} diff --git a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-index.frag b/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-index.frag deleted file mode 100644 index 58582e60..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/phrases/irradiance-sh/grid-index.frag +++ /dev/null @@ -1,4 +0,0 @@ -int gridIndex(ivec3 p, ivec3 probeCounts) { - ivec3 c = clamp(p, ivec3(0), probeCounts - ivec3(1)); - return c.x + c.y * probeCounts.x + c.z * probeCounts.x * probeCounts.y; -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/cubemap-passthrough.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/cubemap-passthrough.frag deleted file mode 100644 index 4de2509e..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/cubemap-passthrough.frag +++ /dev/null @@ -1,22 +0,0 @@ -#version 330 - -uniform samplerCube tex0; -uniform vec3 sideUp; -uniform vec3 sideRight; -uniform vec3 sideNormal; -in vec2 v_texCoord0; - -out vec4 o_output; - -#define PI 3.1415926536 - -void main() { - vec3 irradiance = vec3(0.0); - - vec2 uv = (v_texCoord0 - vec2(0.5))*2.0; - vec3 normal = normalize(uv.x * sideRight + uv.y * sideUp + sideNormal); - - o_output.rgb = texture(tex0, normal).rgb; - o_output.a = 1.0; - -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/irradiance-convolution.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/irradiance-convolution.frag deleted file mode 100644 index 044b1ba3..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/irradiance-convolution.frag +++ /dev/null @@ -1,40 +0,0 @@ -#version 330 - -uniform samplerCube tex0; -uniform vec3 sideUp; -uniform vec3 sideRight; -uniform vec3 sideNormal; -in vec2 v_texCoord0; - -out vec4 o_output; - -#define PI 3.1415926536 - -void main() { - vec3 irradiance = vec3(0.0); - - vec2 uv = (v_texCoord0 - vec2(0.5))*2.0; - vec3 normal = normalize(uv.x * sideRight + uv.y * sideUp + sideNormal); - - vec3 up = vec3(0.0, 1.0, 0.0); - vec3 right = cross(up, normal); - up = cross(normal, right); - - float sampleDelta = 0.025; - int nrSamples = 0; - for(float phi = 0.0; phi < 2.0 * PI; phi += sampleDelta) { - for(float theta = 0.0; theta < 0.5 * PI; theta += sampleDelta) { - // spherical to cartesian (in tangent space) - vec3 tangentSample = vec3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta)); - // tangent space to world - vec3 sampleVec = tangentSample.x * right + tangentSample.y * up + tangentSample.z * normal; - - irradiance += texture(tex0, sampleVec).rgb * cos(theta) * sin(theta); - nrSamples++; - } - } - irradiance = PI * irradiance * (1.0 / float(nrSamples)); - o_output.rgb = irradiance.rgb; - o_output.a = 1.0; - -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/spherical-harmonics.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/spherical-harmonics.frag deleted file mode 100644 index 882d7ba7..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/cubemap-filters/spherical-harmonics.frag +++ /dev/null @@ -1,11 +0,0 @@ -uniform samplerCube tex0; - -in v_texCoord0; -uniform vec2 targetSize; - -out o_term0; -out o_term1; -out o_term2; -void main() { - -} \ No newline at end of file diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag deleted file mode 100644 index 98fbc423..00000000 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag +++ /dev/null @@ -1,349 +0,0 @@ -#version 330 -// --- varyings --- -in vec2 v_texCoord0; - -// --- G buffer --- -uniform sampler2D colors; -uniform sampler2D projDepth; -uniform sampler2D normals; - -// --- transforms --- -uniform mat4 projection; -uniform mat4 projectionMatrixInverse; - -// --- output --- -layout(location = 0) out vec4 o_color; - - -// --- parameters --- -uniform float jitterOriginGain; -uniform int iterationLimit; -uniform float distanceLimit; -uniform float gain; -uniform float borderWidth; - -float distanceSquared(vec2 a, vec2 b) { - vec2 d = b-a; - return dot(d,d); -} - -#pragma import org.openrndr.extra.shaderphrases.phrases.Depth.projectionToViewCoordinate; -#pragma import org.openrndr.extra.shaderphrases.phrases.Depth.projectionToViewDepth; - -#pragma import org.openrndr.extra.noise.phrases.NoisePhrasesKt.phraseHash22; - - -// this is from http://casual-effects.blogspot.nl/2014/08/screen-space-ray-tracing.html - -void swap(inout float a, inout float b) { - float temp = a; - a = b; - b = temp; -} - - -bool traceScreenSpaceRay1 - (vec3 csOrigin, - vec3 csDirection, - mat4x4 projectToPixelMatrix, - sampler2D csZBuffer, - vec2 csZBufferSize, - float csZThickness, - float nearPlaneZ, - float stride, - float jitterFraction, - float maxSteps, - in float maxRayTraceDistance, - out vec2 hitPixel, - out vec3 csHitPoint, - out vec3 csHitNormal -// ,out vec3 debugColor - ) { - vec3 debugColor = vec3(0); - // Clip ray to a near plane in 3D (doesn't have to be *the* near plane, although that would be a good idea) - float rayLength = ((csOrigin.z + csDirection.z * maxRayTraceDistance) > nearPlaneZ) ? - (nearPlaneZ - csOrigin.z) / csDirection.z : - maxRayTraceDistance; - vec3 csEndPoint = csDirection * rayLength + csOrigin; - - // Project into screen space - vec4 H0 = projectToPixelMatrix * vec4(csOrigin, 1.0); - vec4 H1 = projectToPixelMatrix * vec4(csEndPoint, 1.0); - - // There are a lot of divisions by w that can be turned into multiplications - // at some minor precision loss...and we need to interpolate these 1/w values - // anyway. - // - // Because the caller was required to clip to the near plane, - // this homogeneous division (projecting from 4D to 2D) is guaranteed - // to succeed. - float k0 = 1.0 / H0.w; - float k1 = 1.0 / H1.w; - - // Switch the original points to values that interpolate linearly in 2D - vec3 Q0 = csOrigin * k0; - vec3 Q1 = csEndPoint * k1; - - // Screen-space endpoints - vec2 P0 = H0.xy * k0; - vec2 P1 = H1.xy * k1; - - // [Optional clipping to frustum sides here] - - // Initialize to off screen - hitPixel = vec2(-1.0, -1.0); - - // If the line is degenerate, make it cover at least one pixel - // to avoid handling zero-pixel extent as a special case later - P1 += vec2((distanceSquared(P0, P1) < 0.0001) ? 0.01 : 0.0); - - vec2 delta = P1 - P0; - - // Permute so that the primary iteration is in x to reduce - // large branches later - bool permute = (abs(delta.x) < abs(delta.y)); - if (permute) { - // More-vertical line. Create a permutation that swaps x and y in the output - // by directly swizzling the inputs. - delta = delta.yx; - P1 = P1.yx; - P0 = P0.yx; - } - - // From now on, "x" is the primary iteration direction and "y" is the secondary one - float stepDirection = sign(delta.x); - float invdx = stepDirection / delta.x; - vec2 dP = vec2(stepDirection, invdx * delta.y); - - // Track the derivatives of Q and k - vec3 dQ = (Q1 - Q0) * invdx; - float dk = (k1 - k0) * invdx; - - // Because we test 1/2 a texel forward along the ray, on the very last iteration - // the interpolation can go past the end of the ray. Use these bounds to clamp it. - float zMin = min(csEndPoint.z, csOrigin.z); - float zMax = max(csEndPoint.z, csOrigin.z); - - // Scale derivatives by the desired pixel stride - dP *= stride; dQ *= stride; dk *= stride; - - // Offset the starting values by the jitter fraction - P0 += dP * jitterFraction; Q0 += dQ * jitterFraction; k0 += dk * jitterFraction; - - // Slide P from P0 to P1, (now-homogeneous) Q from Q0 to Q1, and k from k0 to k1 - vec3 Q = Q0; - float k = k0; - - // We track the ray depth at +/- 1/2 pixel to treat pixels as clip-space solid - // voxels. Because the depth at -1/2 for a given pixel will be the same as at - // +1/2 for the previous iteration, we actually only have to compute one value - // per iteration. - float prevZMaxEstimate = csOrigin.z; - float stepCount = 0.0; - float rayZMax = prevZMaxEstimate, rayZMin = prevZMaxEstimate; - float sceneZMax = rayZMax + 1e4; - - // P1.x is never modified after this point, so pre-scale it by - // the step direction for a signed comparison - float end = P1.x * stepDirection; - - // We only advance the z field of Q in the inner loop, since - // Q.xy is never used until after the loop terminates. - - vec2 P; - for (P = P0; - ((P.x * stepDirection) <= end) && - (stepCount < maxSteps) && - ((rayZMax < sceneZMax - csZThickness) || - (rayZMin > sceneZMax)) && - (sceneZMax != 0.0); - P += dP, Q.z += dQ.z, k += dk, stepCount += 1.0) { - - // The depth range that the ray covers within this loop - // iteration. Assume that the ray is moving in increasing z - // and swap if backwards. Because one end of the interval is - // shared between adjacent iterations, we track the previous - // value and then swap as needed to ensure correct ordering - rayZMin = prevZMaxEstimate; - - // Compute the value at 1/2 step into the future - rayZMax = (dQ.z * 0.5 + Q.z) / (dk * 0.5 + k); - - // -- this is not in the other implementation - rayZMax = clamp(rayZMax, zMin, zMax); - - prevZMaxEstimate = rayZMax; - - // Since we don't know if the ray is stepping forward or backward in depth, - // maybe swap. Note that we preserve our original z "max" estimate first. - if (rayZMin > rayZMax) { swap(rayZMin, rayZMax); } - - // Camera-space z of the background - hitPixel = permute ? P.yx : P; - - vec4 depthData = texelFetch(csZBuffer, ivec2(hitPixel), 0); - sceneZMax = projectionToViewCoordinate(v_texCoord0, depthData.x, projectionMatrixInverse).z; - - } // pixel on ray - - // Undo the last increment, which ran after the test variables - // were set up. - P -= dP; Q.z -= dQ.z; k -= dk; stepCount -= 1.0; - - bool hit = (rayZMax >= sceneZMax - csZThickness) && (rayZMin <= sceneZMax); - - // If using non-unit stride and we hit a depth surface... - if ((stride > 1) && hit) { - // Refine the hit point within the last large-stride step - - // Retreat one whole stride step from the previous loop so that - // we can re-run that iteration at finer scale - P -= dP; Q.z -= dQ.z; k -= dk; stepCount -= 1.0; - - // Take the derivatives back to single-pixel stride - float invStride = 1.0 / stride; - dP *= invStride; dQ.z *= invStride; dk *= invStride; - - // For this test, we don't bother checking thickness or passing the end, since we KNOW there will - // be a hit point. As soon as - // the ray passes behind an object, call it a hit. Advance (stride + 1) steps to fully check this - // interval (we could skip the very first iteration, but then we'd need identical code to prime the loop) - float refinementStepCount = 0; - - // This is the current sample point's z-value, taken back to camera space - prevZMaxEstimate = Q.z / k; - rayZMin = prevZMaxEstimate; - - // Ensure that the FOR-loop test passes on the first iteration since we - // won't have a valid value of sceneZMax to test. - sceneZMax = rayZMin - 1e7; - - for (; - (refinementStepCount <= stride*1.4) && - (rayZMin > sceneZMax) && (sceneZMax != 0.0); - P += dP, Q.z += dQ.z, k += dk, refinementStepCount += 1.0) { - - rayZMin = prevZMaxEstimate; - - // Compute the ray camera-space Z value at 1/2 fine step (pixel) into the future - rayZMax = (dQ.z * 0.5 + Q.z) / (dk * 0.5 + k); - rayZMax = clamp(rayZMax, zMin, zMax); - - prevZMaxEstimate = rayZMax; - rayZMin = min(rayZMax, rayZMin); - - hitPixel = permute ? P.yx : P; - - vec4 depthData = texelFetch(csZBuffer, ivec2(hitPixel), 0); - sceneZMax = projectionToViewCoordinate(v_texCoord0, depthData.x, projectionMatrixInverse).z; - - - csHitNormal = texelFetch(normals, ivec2(hitPixel), 0).xyz; - -// sceneZMax = texelFetch(csZBuffer, ivec2(hitPixel), 0).r; - - } - - // Undo the last increment, which happened after the test variables were set up - Q.z -= dQ.z; refinementStepCount -= 1; - - // Count the refinement steps as fractions of the original stride. Save a register - // by not retaining invStride until here - stepCount += refinementStepCount / stride; - // debugColor = vec3(refinementStepCount / stride); - } // refinement - - Q.xy += dQ.xy * stepCount; - csHitPoint = Q * (1.0 / k); - - // Support debugging. This will compile away if debugColor is unused - if ((P.x * stepDirection) > end) { - // Hit the max ray distance -> blue - debugColor = vec3(0,0,1); - } else if (stepCount >= maxSteps) { - // Ran out of steps -> red - debugColor = vec3(1,0,0); - } else if (sceneZMax == 0.0) { - // Went off screen -> yellow - debugColor = vec3(1,1,0); - } else { - // Encountered a valid hit -> green - // ((rayZMax >= sceneZMax - csZThickness) && (rayZMin <= sceneZMax)) - debugColor = vec3(0,1,0); - } - - // Does the last point discovered represent a valid hit? - return hit; -} - - -void main() { - vec2 hitPixel = vec2(0.0, 0.0); - vec3 hitPoint = vec3(0.0, 0.0, 0.0); - vec3 hitNormal = vec3(0.0, 0.0, 0.0); - - vec2 jitter = abs(hash22(v_texCoord0)); - - - vec2 ts = vec2(textureSize(projDepth, 0).xy); - vec3 viewNormal = normalize(texture(normals, v_texCoord0).xyz);// + (texture(noise, v_texCoord0*0.1).xyz - 0.5) * 0.0; - float depth = texture(projDepth, v_texCoord0).r; - vec3 viewPos = projectionToViewCoordinate(v_texCoord0, depth, projectionMatrixInverse); - - - vec3 reflected = normalize(reflect(normalize(viewPos), normalize(-viewNormal))); - - - float angle = abs(dot(reflected, viewNormal)); - float frontalFade = clamp(-reflected.z,0.0, 1.0); - if ( true ) { - bool hit = traceScreenSpaceRay1( - viewPos, - reflected, - projection, - projDepth, - ts, - 0.1, - 0.0, // near plane z - 1.0,// + projPos.z*2.0, // stride - 10.0, // jitterfraction - iterationLimit*8,// + int((1.0-projPos.z)*iterationLimit), - 100.0, // max distance - - hitPixel, - hitPoint, hitNormal); - - float distanceFade = 1.0;//max( 0.0, (distanceLimit -length(hitPoint-viewPos))/ distanceLimit); - vec4 p = projection * vec4(hitPoint, 1.0); - - float k = 1.0 / p.w; - - vec2 pos = vec2(p.xy*k); - vec2 ad = vec2(ts/2- abs(pos - ts/2)); - float borderFade = 1.0; //smoothstep(0, borderWidth, min(ad.x, ad.y)); - - float l = 0.0; - int l0 = int(l); - int l1 = l0 + 1; - - float lf = l - l0; - - vec4 reflectedColor0 = texelFetch(colors, ivec2(p.xy*k)/(1< 10.0) { - traverse = direction*10.0; - worldCoordinate = cameraPosition - traverse; - } - - int steps = min(100, int(length(traverse) / 0.1)); - vec3 step = traverse / steps; - - vec3 marchPosition = worldCoordinate; - vec3 accumulated = inputColor; - float jitter = hash22(v_texCoord0).x; - marchPosition += jitter * step*0.5; - for (int stepIndex = 0; stepIndex < steps; ++stepIndex) { - float density = pow(abs(simplex31(marchPosition*0.25)), 4.0) * 0.1; - vec3 sh0; - gatherSH0(shMap, marchPosition, shMapDimensions, shMapOffset, shMapSpacing, sh0); - accumulated = accumulated * (1.0-density) + sh0 * density; - marchPosition += step; - } - o_output = vec4(accumulated, 1.0); -} diff --git a/orx-jvm/orx-file-watcher/README.md b/orx-jvm/orx-file-watcher/README.md deleted file mode 100644 index 2f1b43de..00000000 --- a/orx-jvm/orx-file-watcher/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# orx-file-watcher - -Monitor files on disk and auto-reload them if they change. - -## Usage - -Monitoring a single file. - -```kotlin -application { - program { - val watchedText = watchFile(File("someFile.txt")) { - it.readText() - } - extend { - val theText = watchedText() - } - } -} -``` - -Making a map of monitored files. - -```kotlin -application { - program { - val watchedTexts = mutableMapString>() - watchedTexts["text"] = watchFile(File("someFile.txt")) { - it.readText() - } - - extend { - val theText = watchedTexts.getValue("text")() - } - } -} -``` diff --git a/orx-jvm/orx-file-watcher/build.gradle.kts b/orx-jvm/orx-file-watcher/build.gradle.kts deleted file mode 100644 index 059fc78c..00000000 --- a/orx-jvm/orx-file-watcher/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) -} \ No newline at end of file diff --git a/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcher.kt b/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcher.kt deleted file mode 100644 index 0351aab2..00000000 --- a/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcher.kt +++ /dev/null @@ -1,127 +0,0 @@ -package org.openrndr.extra.filewatcher - -import com.sun.nio.file.SensitivityWatchEventModifier -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlinx.coroutines.* -import org.openrndr.events.Event -import java.io.File -import java.nio.file.FileSystems -import java.nio.file.Path -import java.nio.file.StandardWatchEventKinds -import java.nio.file.WatchKey -import java.util.WeakHashMap -import kotlin.concurrent.thread - -private val logger = KotlinLogging.logger {} - -private val watching = mutableMapOf>() -private val pathKeys = mutableMapOf() -private val keyPaths = WeakHashMap() -private val waiting = mutableMapOf() - -private val watchService by lazy { - FileSystems.getDefault().newWatchService() -} - -@OptIn(DelicateCoroutinesApi::class) -private val watchThread by lazy { - thread(isDaemon = true) { - while (true) { - val key = watchService.take() - val path = keyPaths[key] - - key.pollEvents().forEach { - val contextPath = it.context() as Path - val fullPath = path?.resolve(contextPath) - - fullPath?.let { - waiting[fullPath]?.cancel() - waiting[fullPath] = GlobalScope.launch { - delay(100) - watching[fullPath]?.forEach { w -> - w.triggerChange() - } - } - } - } - key.reset() - } - } -} - -/** - * @property file - * @property fileChangedEvent - * @param requestStopEvent - */ -class FileWatcher( - private val file: File, - private val fileChangedEvent: Event, - requestStopEvent: Event? = null -) { - private val path = file.absoluteFile.toPath() - private val parent = path.parent - private val key = pathKeys.getOrPut(parent) { - parent.register( - watchService, arrayOf(StandardWatchEventKinds.ENTRY_MODIFY), - SensitivityWatchEventModifier.HIGH - ) - } - - init { - watchThread - watching.getOrPut(path) { - mutableListOf() - }.add(this) - keyPaths.getOrPut(key) { parent } - requestStopEvent?.listenOnce { - stop() - } - } - - @Suppress("MemberVisibilityCanBePrivate") - fun stop() { - synchronized(watching) { - logger.info { "stopping, watcher stop requested" } - watching[path]?.remove(this) - } - } - - internal fun triggerChange() { - fileChangedEvent.trigger(file) - } -} - -/** - * Watch a file for changes - * @param file the file to watch - * @param valueChangedEvent the event that is triggered when the value (after transforming) has changed - * @param requestStopEvent an event that can be triggered to request the watcher to stop - * @param transducer a function that transforms a [File] into a value of type [R] - */ -fun watchFile( - file: File, - valueChangedEvent: Event? = null, - requestStopEvent: Event? = null, - transducer: (File) -> R -): () -> R { - var result = transducer(file) - val fileChangedEvent = Event() - - @Suppress("UNUSED_VARIABLE") val watcher = FileWatcher(file, fileChangedEvent, requestStopEvent) - - fileChangedEvent.listen { - @Suppress("MemberVisibilityCanBePrivate") - try { - result = transducer(file) - valueChangedEvent?.trigger(result) - } catch (e: Throwable) { - logger.error(e) { - """exception while transforming file ${file.absolutePath}""" - } - } - } - return { - result - } -} \ No newline at end of file diff --git a/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcherDelegate.kt b/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcherDelegate.kt deleted file mode 100644 index 54dd9653..00000000 --- a/orx-jvm/orx-file-watcher/src/main/kotlin/FileWatcherDelegate.kt +++ /dev/null @@ -1,61 +0,0 @@ -package org.openrndr.extra.filewatcher - -import kotlinx.coroutines.yield -import org.openrndr.Program -import org.openrndr.events.Event -import org.openrndr.launch -import java.io.File -import kotlin.reflect.KProperty - -/** - * Property delegator that watches a file. Changes are propagated right before the [Program] updates its extensions - * @param program the program to synchronise updates with - * @param file the file to watch - * @param valueChangedEvent the event that is triggered when the value (after transformation) has changed - * @param requestStopEvent an event that can be triggered to request the watcher to stop - * @since 0.4.3 - * @see watchingFile - */ -class FileWatcherDelegate( - program: Program, - file: File, - valueChangedEvent: Event? = null, - requestStopEvent: Event? = null, - transducer: (File) -> T -) { - private val watchValue = watchFile(file, valueChangedEvent, requestStopEvent, transducer) - private var value = watchValue() - - init { - // make sure that `value` is updated at the beginning of a draw cycle and not mid-cycle. - program.launch { - while (true) { - value = watchValue() - yield() - } - } - } - - /** - * Return transformed value - */ - operator fun getValue(any: Any?, property: KProperty<*>): T { - return value - } -} - -/** - * Delegate value to a file watcher - * @param file the file to watch - * @param valueChangedEvent the event that is triggered when the value (after transformation) has changed - * @param requestStopEvent an event that can be triggered to request the watcher to stop - * @param transducer a function that transforms a [File] into a value of type [R] - * @since 0.4.3 - * @see FileWatcherDelegate - */ -fun Program.watchingFile( - file: File, - valueChangedEvent: Event? = null, - requestStopEvent: Event? = null, - transducer: (File) -> R -) = FileWatcherDelegate(this, file, valueChangedEvent, requestStopEvent, transducer) diff --git a/orx-jvm/orx-git-archiver-gradle/README.md b/orx-jvm/orx-git-archiver-gradle/README.md deleted file mode 100644 index 9dff40ce..00000000 --- a/orx-jvm/orx-git-archiver-gradle/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# orx-git-archive-gradle - -A Gradle plugin that turns a git history and `screenshots` directory into a markdown file. - -## Usage - -`openrndr-template` uses this plugin by default. All you need to do is use [orx-git-archiver](../orx-git-archiver) such -that screenshots will have the Git commit id in their filename. - diff --git a/orx-jvm/orx-git-archiver-gradle/build.gradle.kts b/orx-jvm/orx-git-archiver-gradle/build.gradle.kts deleted file mode 100644 index f707d567..00000000 --- a/orx-jvm/orx-git-archiver-gradle/build.gradle.kts +++ /dev/null @@ -1,60 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") - `java-gradle-plugin` -} - -apply(plugin = "maven-publish") - -dependencies { - implementation(project(":orx-jvm:orx-git-archiver")) -} - -gradlePlugin { - plugins { - create("gitArchiveToMarkdown") { - id = "org.openrndr.extra.gitarchiver.tomarkdown" - implementationClass = "org.openrndr.extra.gitarchiver.GitArchiveToMarkdown" - } - } -} - -publishing { - afterEvaluate { - publications { - withType(MavenPublication::class) { - pom { - name.set("gitarchiver tomarkdown") - description.set("gitarchiver to markdown gradle plugin") - url.set("https://openrndr.org") - developers { - developer { - id.set("edwinjakobs") - name.set("Edwin Jakobs") - email.set("edwin@openrndr.org") - } - } - - licenses { - license { - name.set("BSD-2-Clause") - url.set("https://github.com/openrndr/openrndr/blob/master/LICENSE") - distribution.set("repo") - } - } - - scm { - connection.set("scm:git:git@github.com:openrndr/orx.git") - developerConnection.set("scm:git:ssh://github.com/openrndr/orx.git") - url.set("https://github.com/openrndr/openrndr") - } - } - } - } - } - -} -val isReleaseVersion = !(version.toString()).endsWith("SNAPSHOT") -signing { - setRequired({ isReleaseVersion && gradle.taskGraph.hasTask("publish") }) - sign(publishing.publications) -} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver-gradle/src/main/kotlin/GitArchiveToMarkdown.kt b/orx-jvm/orx-git-archiver-gradle/src/main/kotlin/GitArchiveToMarkdown.kt deleted file mode 100644 index da02b1aa..00000000 --- a/orx-jvm/orx-git-archiver-gradle/src/main/kotlin/GitArchiveToMarkdown.kt +++ /dev/null @@ -1,59 +0,0 @@ -package org.openrndr.extra.gitarchiver - -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* -import org.gradle.work.InputChanges -import java.io.File -import javax.inject.Inject - -abstract class GitArchiveToMarkdown @Inject constructor() : DefaultTask() { - @get:OutputDirectory - abstract val outputDir: DirectoryProperty - - @get:InputDirectory - abstract val gitDir: DirectoryProperty - - @get:InputDirectory - abstract val screenshotsDir: DirectoryProperty - - @get:Input - abstract val historySize: Property - - @TaskAction - fun execute(inputChanges: InputChanges) { - val parent = outputDir.asFile.get() - - val git = GitProvider.create() - val references = git.logReferences(historySize.get()) - - val text = references.map { reference -> - val screenshots = screenshotsDir.asFile.get().listFiles().filter { file -> - file.extension == "png" && file.name.contains(reference) - } - println(screenshots) - screenshots.forEach { - it.copyTo(File(outputDir.asFile.get(), it.name)) - } - val screenShotsMD = screenshots.map { - "![${it.nameWithoutExtension}](${it.name})" - }.joinToString("\n") - - """# $reference - |$screenShotsMD - |``` - |${git.show(reference)}} - |``` - """.trimMargin() - }.joinToString("\n") - File(parent, "README.md").writeText(text) - } - - init { - outputDir.set(File("build/git-archive-markdown")) - gitDir.set(File(".git")) - screenshotsDir.set(File("screenshots")) - historySize.set(20) - } -} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/README.md b/orx-jvm/orx-git-archiver/README.md deleted file mode 100644 index a9b6607f..00000000 --- a/orx-jvm/orx-git-archiver/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# orx-git-archiver - -An extension that hooks into `Program.requestAssets` to commit -changed code to Git and provide filenames based on the commit hash. - -## How do I use it? - -```kotlin -application { - program { - extend(GitArchiver()) { - - - } - extend(Screenshots()) - } -} -``` -Now when a screenshot is taken, first all uncommitted code is committed to git. -The screenshot is saved with the first 7 characters of the commit hash in the filename. - -## Demos \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/build.gradle.kts b/orx-jvm/orx-git-archiver/build.gradle.kts deleted file mode 100644 index 9d9b978c..00000000 --- a/orx-jvm/orx-git-archiver/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(libs.jgit) - demoImplementation(project(":orx-mesh-generators")) - demoImplementation(project(":orx-noise")) - demoImplementation(openrndr.ffmpeg) - demoImplementation(openrndr.filter) -} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/src/demo/kotlin/GitArchiverDemo01.kt b/orx-jvm/orx-git-archiver/src/demo/kotlin/GitArchiverDemo01.kt deleted file mode 100644 index 94ed7ba2..00000000 --- a/orx-jvm/orx-git-archiver/src/demo/kotlin/GitArchiverDemo01.kt +++ /dev/null @@ -1,19 +0,0 @@ -// -//import org.openrndr.application -//import org.openrndr.extensions.Screenshots -//import org.openrndr.extra.gitarchiver.GitArchiver -// -//fun main() = application { -// program { -// val ga = extend(GitArchiver()) { -// commitOnRun = true -// commitOnRequestAssets = false -// } -// extend(Screenshots()) -// extend { -// -// -// } -// } -// -//} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/src/main/kotlin/GitArchiver.kt b/orx-jvm/orx-git-archiver/src/main/kotlin/GitArchiver.kt deleted file mode 100644 index eb719797..00000000 --- a/orx-jvm/orx-git-archiver/src/main/kotlin/GitArchiver.kt +++ /dev/null @@ -1,67 +0,0 @@ -package org.openrndr.extra.gitarchiver - -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.AssetMetadata -import org.openrndr.Extension -import org.openrndr.Program - -interface GitProvider { - fun commitChanges(commitMessage: String) - fun headReference(): String - fun logReferences(count: Int): List - fun show(reference: String) : String - - companion object { - fun create() : GitProvider { - return if (nativeGitInstalled()) NativeGit() else JavaGit() - } - } -} - -val logger = KotlinLogging.logger { } - -class GitArchiver : Extension { - override var enabled: Boolean = true - - var commitOnRun = false - var commitOnRequestAssets = true - - var autoCommitMessage = "auto commit" - - private val git: GitProvider = GitProvider.create() - - override fun setup(program: Program) { - logger.info { - "Using ${ - when (git) { - is NativeGit -> "native Git" - is JavaGit -> "Java Git" - else -> "unknown Git" - } - }" - } - - autoCommitMessage = "auto commit from ${program.name}" - - val oldMetadataFunction = program.assetMetadata - program.assetMetadata = { - val oldMetadata = oldMetadataFunction() - val commitHash = git.headReference() - program.assetProperties["git-commit-hash"] = commitHash - AssetMetadata( - oldMetadata.programName, - "${oldMetadata.assetBaseName}-$commitHash", - program.assetProperties.mapValues { it.value }) - } - - program.requestAssets.listeners.add(0, { - if (commitOnRequestAssets) { - git.commitChanges(autoCommitMessage) - } - }) - - if (commitOnRun) { - git.commitChanges(autoCommitMessage) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/src/main/kotlin/JavaGit.kt b/orx-jvm/orx-git-archiver/src/main/kotlin/JavaGit.kt deleted file mode 100644 index 7b1cca9b..00000000 --- a/orx-jvm/orx-git-archiver/src/main/kotlin/JavaGit.kt +++ /dev/null @@ -1,34 +0,0 @@ -package org.openrndr.extra.gitarchiver - -import org.eclipse.jgit.api.Git -import org.eclipse.jgit.api.errors.EmptyCommitException -import org.eclipse.jgit.lib.Constants -import org.eclipse.jgit.storage.file.FileRepositoryBuilder -import java.io.File - -class JavaGit : GitProvider { - private val repo = FileRepositoryBuilder().setGitDir(File("./.git")).build() - private val git = Git(repo) - - override fun commitChanges(commitMessage: String) { - try { - git.commit().setAll(true).setAllowEmpty(false).setMessage(commitMessage).call() - logger.info { "git repository is now at ${headReference()}" } - } catch (e: EmptyCommitException) { - logger.info { "no changes" } - } - } - - override fun headReference() : String { - val id = repo.resolve(Constants.HEAD) - return id.name.take(7) - } - - override fun logReferences(count: Int): List { - TODO("Not yet implemented") - } - - override fun show(reference: String): String { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/orx-jvm/orx-git-archiver/src/main/kotlin/NativeGit.kt b/orx-jvm/orx-git-archiver/src/main/kotlin/NativeGit.kt deleted file mode 100644 index 47ee0e58..00000000 --- a/orx-jvm/orx-git-archiver/src/main/kotlin/NativeGit.kt +++ /dev/null @@ -1,62 +0,0 @@ -package org.openrndr.extra.gitarchiver - -import java.io.File -import java.io.IOException -import java.util.concurrent.TimeUnit - -private val dir = File(".") - -class NativeGit : GitProvider { - override fun commitChanges(commitMessage: String) { - val gitStatus = listOf("git", "status", "--porcelain").runCommand(dir)!! - if (gitStatus.first.isNotBlank()){ - if (gitStatus.first.contains("Not a git repository")){ - logger.error { "Can't commit changes because the working directory is not a git repository" } - } else { - listOf("git", "add", ".").runCommand(dir) - listOf("git", "commit", "-m", commitMessage).runCommand(dir) - logger.info { "git repository is at ${headReference()} after commit" } - } - } else { - logger.info { "no changes" } - } - } - - override fun headReference(): String { - return listOf("git", "rev-parse", "--short", "HEAD").runCommand(dir)!!.first.trimEnd() - } - - override fun logReferences(count: Int): List { - val (out, err) = listOf("git", "log", "-$count", "--pretty=format:%h").runCommand(dir) ?: error("failed to get log references") - return out.split("\n").map { it.trim() } - } - - override fun show(reference: String): String { - val (out, err) = listOf("git", "show", reference, "-U0").runCommand(dir) ?: error("failed to get diff") - return out - } - - -} - -internal fun nativeGitInstalled(): Boolean { - return listOf("git", "--version").runCommand(dir) != null -} - -// Adapted from https://stackoverflow.com/questions/35421699/how-to-invoke-external-command-from-within-kotlin-code -private fun List.runCommand(workingDir: File): Pair? { - try { - val proc = ProcessBuilder(*toTypedArray()) - .directory(workingDir) - .redirectOutput(ProcessBuilder.Redirect.PIPE) - .redirectError(ProcessBuilder.Redirect.PIPE) - .start() - - proc.waitFor(60, TimeUnit.MINUTES) - return Pair(proc.inputStream.bufferedReader().readText(), proc.errorStream.bufferedReader().readText()) - } catch(e: IOException) { - logger.error { e.message } - e.printStackTrace() - return null - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/README.md b/orx-jvm/orx-gui/README.md deleted file mode 100644 index 8c21fd00..00000000 --- a/orx-jvm/orx-gui/README.md +++ /dev/null @@ -1,294 +0,0 @@ -# orx-gui - -Automatic UI (sliders, buttons, etc.) generated from annotated classes and properties. Uses `orx-panel` and `orx-parameters`. - -A quick-and-dirty user interface toolkit. - -`orx-gui` uses class and property annotations to generate simple interfaces. The annotations used -are provided by [`orx-parameters`](../orx-parameters/README.md) and most filters in [`orx-fx`](../orx-fx/README.md) have been annotated. - -`orx-gui` is made with an [`orx-olive`](../orx-olive/README.md) workflow in mind but can be used in normal OPENRNDR programs -just as well. - -## Usage - -Preparation: make sure `orx-gui` is in the `orxFeatures` of your project (if you working on a template based project) - -The essence of `orx-gui` lies in the provided a `GUI` extension, which can be used in your program using the `extend {}` function. -The `GUI` class has an `add()` function that allows any annotated object to be passed in. - -The visibility of the side bar can be toggled by pressing the F11 key on your keyboard. - -### UIs for parameter objects - -A simple UI can be created by creating an annotated `object`. - -```kotlin -import org.openrndr.application -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 - -enum class Option { - Option1, - Option2, - Option3 -} - - -fun main() = application { - program { - // -- this @Description annotation is optional - val parameters = @Description("parameters") object { - @DoubleParameter("radius", 20.0, 200.0, precision = 2, order = 0) - var radius = 50.0 - - @TextParameter("A string", order = 1) - var s = "Hello" - - @BooleanParameter("A bool", order = 2) - var b = true - - @IntParameter("An int", 0, 127, order = 3) - var i = 64 - - @ColorParameter("A fill color", order = 4) - var fill = ColorRGBa.PINK - - @XYParameter("Position", minX = 0.0, maxX = 640.0, - minY = 0.0, maxY = 480.0, order = 5) - var pos = Vector2.ZERO - - @Vector2Parameter("A Vector2", order = 6) - var v2 = Vector2(200.0, 200.0) - - @Vector3Parameter("A Vector3", order = 7) - var v3 = Vector3(200.0, 200.0, 200.0) - - @Vector4Parameter("A Vector4", order = 8) - var v4 = Vector4(200.0, 200.0, 200.0, 200.0) - - @DoubleListParameter("Mixer", order = 9) - var mixer = MutableList(5) { 0.5 } - - @ActionParameter("Action test", order = 10) - fun clicked() { - println("GUI says hi!") - } - - @OptionParameter("An option", order = 11) - var option = Option.Option1 - } - - extend(GUI()) { - add(parameters) - } - extend { - drawer.fill = parameters.fill - drawer.circle(parameters.pos, parameters.radius) - } - } -} -``` - -### UIs for filters - -In a similar fashion to the previous example we can create a simple UI for most filters in `orx-fx` - -```kotlin -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.renderTarget -import org.openrndr.extra.fx.blur.BoxBlur -import org.openrndr.extra.gui.GUI - -fun main() = application { - program { - val blur = BoxBlur() - val rt = renderTarget(width, height) { - colorBuffer() - } - extend(GUI()) { - add(blur) - } - extend { - drawer.isolatedWithTarget(rt) { - drawer.background(ColorRGBa.BLACK) - drawer.fill = ColorRGBa.PINK - drawer.circle(width / 2.0, height / 2.0, 200.0) - } - blur.apply(rt.colorBuffer(0), rt.colorBuffer(0)) - drawer.image(rt.colorBuffer(0)) - } - } -} -``` - -### UIs in Olive - -Using `orx-gui` in Olive (`orx-olive`) is very similar to how one would use it in a normal OPENRNDR program. There is -one detail that doesn't occur in normal programs: the UI state is reset when a -script is changed and re-evaluated. This is overcome by using an annotated `Reloadable` object. - -An example `live.kts` script that uses `orx-gui` and `Reloadable`: - -```kotlin -@file:Suppress("UNUSED_LAMBDA_EXPRESSION") -import org.openrndr.Program -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.olive.Reloadable -import org.openrndr.extra.parameters.DoubleParameter - -{ program: Program -> - program.apply { - val p = object : Reloadable() { - @DoubleParameter("x-position", 0.0, 640.0, order = 0) - var x = 0.5 - @DoubleParameter("y-position", 0.0, 480.0, order = 1) - var y = 0.5 - @DoubleParameter("radius", 0.0, 480.0, order = 2) - var radius = 100.0 - } - p.reload() - - extend(GUI()) { - add(p) - } - extend { - drawer.circle(p.x, p.y, p.radius) - } - } -} -``` - -## Credits - -`orx-gui` is based on a proof-of-concept by [Ricardo Matias](https://github.com/ricardomatias/) - -## Demos -### DemoAppearance01 - -Demonstrates how to customize the appearance of the GUI by using -`GUIAppearance()`. - -In this demo, we make the GUI wider (400 pixels) and translucent. - -![DemoAppearance01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoAppearance01Kt.png) - -[source code](src/demo/kotlin/DemoAppearance01.kt) - -### DemoHide01 - -Demonstrates how to hide the GUI when the mouse pointer is outside of it. - -![DemoHide01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoHide01Kt.png) - -[source code](src/demo/kotlin/DemoHide01.kt) - -### DemoOptions01 - -A simple demonstration of a GUI with a drop-down menu. - -The entries in the drop-down menu are taken from an `enum class`. - -![DemoOptions01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoOptions01Kt.png) - -[source code](src/demo/kotlin/DemoOptions01.kt) - -### DemoOptions02 - -A simple demonstration of a GUI with a drop-down menu. - -The entries in the drop-down menu are taken from an `enum class`. -The `enum class` entries contain both a name (used in the drop-down) -and a `ColorRGBa` instance (used for rendering). - -![DemoOptions02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoOptions02Kt.png) - -[source code](src/demo/kotlin/DemoOptions02.kt) - -### DemoPath01 - -Demonstrates how to include a button for loading images in a GUI, and how to display -the loaded image. - -The program applies the `@PathParameter` annotation to a `String` variable, which gets -rendered by the GUI as an image-picker button. Note the allowed file `extensions`. - -This mechanism only updates the `String` containing the path of an image file. - -The `watchingImagePath()` delegate property is used to automatically load an image -when its `String` argument changes. - -![DemoPath01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoPath01Kt.png) - -[source code](src/demo/kotlin/DemoPath01.kt) - -### DemoPresets01 - -Shows how to store and retrieve in-memory GUI presets, -each containing two integer values and two colors. - -Keyboard controls: -[Left Shift] + [0]..[9] => store current GUI values to a preset -[0]..[9] => recall a preset - -![DemoPresets01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoPresets01Kt.png) - -[source code](src/demo/kotlin/DemoPresets01.kt) - -### DemoSideCanvas01 - -Demonstrates the `GUI.enableSideCanvas` feature. - -When set to true, the `GUI` provides a `canvas` property where one can draw. -The size of this canvas is the window size minus the GUI size. - -That's why if we draw a circle at `drawer.width / 2.0` it is centered -on the `canvas`, not on the window. - -This demo sets the window to resizable, so if you resize the window -you should see tha the circle stays at the center of the canvas. - - -![DemoSideCanvas01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoSideCanvas01Kt.png) - -[source code](src/demo/kotlin/DemoSideCanvas01.kt) - -### DemoSimple01 - -Demonstrates how to create a simple GUI with 4 inputs: -- A `ColorParameter` which creates a color picker. -- A `DoubleParameter` to control the radius of a circle. -- A `Vector2Parameter` to set the position of that circle. -- A `DoubleListParameter` which sets the radii of six circles. - -The demo also shows how to use the variables controlled by the GUI -inside the program, so changes to those variables affect -the rendering in real time. - -![DemoSimple01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoSimple01Kt.png) - -[source code](src/demo/kotlin/DemoSimple01.kt) - -### DemoXYParameter - -Demonstrates the use of the `@XYParameter` annotation applied to a `Vector2` variable. - -This annotation creates an interactive XY control in a GUI that can be used to update -a `Vector2` variable. In this demo it sets the position of a circle. - - -![DemoXYParameterKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-gui/images/DemoXYParameterKt.png) - -[source code](src/demo/kotlin/DemoXYParameter.kt) diff --git a/orx-jvm/orx-gui/build.gradle.kts b/orx-jvm/orx-gui/build.gradle.kts deleted file mode 100644 index ca8d9d00..00000000 --- a/orx-jvm/orx-gui/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - api(project(":orx-parameters")) - api(project(":orx-jvm:orx-panel")) - api(project(":orx-noise")) - demoImplementation(project(":orx-property-watchers")) - implementation(sharedLibs.kotlin.coroutines) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(openrndr.filter) - implementation(openrndr.dialogs) - implementation(libs.gson) - implementation(sharedLibs.kotlin.reflect) - demoRuntimeOnly(sharedLibs.slf4j.simple) -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoAppearance01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoAppearance01.kt deleted file mode 100644 index 7df69064..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoAppearance01.kt +++ /dev/null @@ -1,52 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.GUIAppearance -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle - -/** - * Demonstrates how to customize the appearance of the GUI by using - * `GUIAppearance()`. - * - * In this demo, we make the GUI wider (400 pixels) and translucent. - */ -fun main() = application { - program { - val gui = GUI(GUIAppearance(baseColor = ColorRGBa.GRAY.opacify(0.9), barWidth = 400)) - gui.compartmentsCollapsedByDefault = false - - val settings = @Description("Settings") object { - @DoubleParameter("radius", 0.0, 100.0) - var radius = 50.0 - - @Vector2Parameter("position", 0.0, 1.0) - var position = Vector2(0.6, 0.5) - - @ColorParameter("color") - var color = ColorRGBa.PINK - - @DoubleListParameter("radii", 5.0, 30.0) - var radii = mutableListOf(5.0, 6.0, 8.0, 14.0, 20.0, 30.0) - } - gui.add(settings) - extend(gui) - - // note we can only change the visibility after the extend - gui.visible = true - - extend { - // determine visibility through mouse x-coordinate - //gui.visible = mouse.position.x < gui.appearance.barWidth - - drawer.fill = settings.color - drawer.circle(settings.position * drawer.bounds.position(1.0, 1.0), settings.radius) - drawer.circles( - settings.radii.mapIndexed { i, radius -> - Circle(width - 50.0, 60.0 + i * 70.0, radius) - } - ) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoHide01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoHide01.kt deleted file mode 100644 index 740e328e..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoHide01.kt +++ /dev/null @@ -1,48 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle - -/** - * Demonstrates how to hide the GUI when the mouse pointer is outside of it. - */ -fun main() = application { - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val settings = @Description("Settings") object { - @DoubleParameter("radius", 0.0, 100.0) - var radius = 50.0 - - @Vector2Parameter("position", 0.0, 1.0) - var position = Vector2(0.6, 0.5) - - @ColorParameter("color") - var color = ColorRGBa.PINK - - @DoubleListParameter("radii", 5.0, 30.0) - var radii = mutableListOf(5.0, 6.0, 8.0, 14.0, 20.0, 30.0) - } - gui.add(settings) - extend(gui) - - // note we can only change the visibility after the `extend` - gui.visible = false - - extend { - // determine visibility through mouse x-coordinate - gui.visible = mouse.position.x < 200.0 - - drawer.fill = settings.color - drawer.circle(settings.position * drawer.bounds.position(1.0, 1.0), settings.radius) - drawer.circles( - settings.radii.mapIndexed { i, radius -> - Circle(width - 50.0, 60.0 + i * 70.0, radius) - } - ) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow01.kt deleted file mode 100644 index a81ede39..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow01.kt +++ /dev/null @@ -1,32 +0,0 @@ -import org.openrndr.WindowConfiguration -import org.openrndr.application -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.* -import org.openrndr.window -import kotlin.system.exitProcess - -/** - * Demonstration of a multi window GUI in the manual way - */ -fun main() { - // skip this demo on CI - if (System.getProperty("takeScreenshot") == "true") { - exitProcess(0) - } - application { - program { - val settings = object { - @DoubleParameter("radius", 10.0, 100.0) - var radius = 10.0 - } - window(WindowConfiguration(width = 200, resizable = true)) { - val gui = GUI() - gui.add(settings) - extend(gui) - } - extend { - drawer.circle(drawer.bounds.center, settings.radius) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow02.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow02.kt deleted file mode 100644 index d351b2ca..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoMultiWindow02.kt +++ /dev/null @@ -1,29 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.parameters.DoubleParameter -import kotlin.system.exitProcess - -/** - * Demonstration of a multi window GUI using the `WindowedGUI` extension - */ -fun main() { - // skip this demo on CI - if (System.getProperty("takeScreenshot") == "true") { - exitProcess(0) - } - application { - program { - val settings = object { - @DoubleParameter("radius", 10.0, 100.0) - var radius = 10.0 - } - val gui = WindowedGUI() - gui.add(settings) - extend(gui) - - extend { - drawer.circle(drawer.bounds.center, settings.radius) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions01.kt deleted file mode 100644 index b9e2ee12..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions01.kt +++ /dev/null @@ -1,45 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.OptionParameter - -/** - * A simple demonstration of a GUI with a drop-down menu. - * - * The entries in the drop-down menu are taken from an `enum class`. - */ - -enum class BackgroundColors { - Pink, - Black, - Yellow -} - -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - val settings = @Description("Settings") object { - @OptionParameter("Background color") - var option = BackgroundColors.Pink - } - - gui.add(settings) - extend(gui) - gui.onChange { name, value -> - println("$name: $value") - } - extend { - when (settings.option) { - BackgroundColors.Pink -> drawer.clear(ColorRGBa.PINK) - BackgroundColors.Black -> drawer.clear(ColorRGBa.BLACK) - BackgroundColors.Yellow -> drawer.clear(ColorRGBa.YELLOW) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions02.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions02.kt deleted file mode 100644 index b31921ed..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoOptions02.kt +++ /dev/null @@ -1,43 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.OptionParameter - -/** - * A simple demonstration of a GUI with a drop-down menu. - * - * The entries in the drop-down menu are taken from an `enum class`. - * The `enum class` entries contain both a name (used in the drop-down) - * and a `ColorRGBa` instance (used for rendering). - */ - -enum class BackgroundColors2(val color: ColorRGBa) { - Pink(ColorRGBa.PINK), - Black(ColorRGBa.BLACK), - Yellow(ColorRGBa.YELLOW) -} - -fun main() = application { - configure { - width = 720 - height = 360 - } - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - val settings = @Description("Settings") object { - @OptionParameter("Background color") - var option = BackgroundColors2.Pink - } - - gui.add(settings) - extend(gui) - gui.onChange { name, value -> - println("$name: $value") - } - extend { - drawer.clear(settings.option.color) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoPath01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoPath01.kt deleted file mode 100644 index b4819353..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoPath01.kt +++ /dev/null @@ -1,38 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.PathParameter -import org.openrndr.extra.propertywatchers.watchingImagePath - -/** - * Demonstrates how to include a button for loading images in a GUI, and how to display - * the loaded image. - * - * The program applies the `@PathParameter` annotation to a `String` variable, which gets - * rendered by the GUI as an image-picker button. Note the allowed file `extensions`. - * - * This mechanism only updates the `String` containing the path of an image file. - * - * The `watchingImagePath()` delegate property is used to automatically load an image - * when its `String` argument changes. - */ -fun main() = application { - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val settings = @Description("Settings") object { - @PathParameter("image", extensions = ["jpg", "png"], order = 10) - var imagePath = "demo-data/images/image-001.png" - - val image by watchingImagePath(::imagePath) { - it - } - } - gui.add(settings) - extend(gui) - extend { - drawer.image(settings.image) - } - } -} diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoPresets01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoPresets01.kt deleted file mode 100644 index 01767da0..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoPresets01.kt +++ /dev/null @@ -1,72 +0,0 @@ -import org.openrndr.KeyModifier -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.IntParameter - -/** - * Shows how to store and retrieve in-memory GUI presets, - * each containing two integer values and two colors. - * - * Keyboard controls: - * [Left Shift] + [0]..[9] => store current GUI values to a preset - * [0]..[9] => recall a preset - */ -fun main() = application { - configure { - width = 720 - height = 480 - } - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val presets = MutableList(10) { - gui.toObject() - } - - val settings = @Description("Settings") object { - @IntParameter("a", 1, 10) - var a = 7 - - @IntParameter("b", 1, 10) - var b = 3 - - @ColorParameter("foreground") - var foreground = ColorRGBa.fromHex("654062") - - @ColorParameter("background") - var background = ColorRGBa.fromHex("ff9c71") - } - gui.add(settings) - extend(gui) - extend { - drawer.clear(settings.background) - drawer.stroke = settings.background - drawer.fill = settings.foreground - // Draw a pattern based on modulo - for (i in 0 until 100) { - if (i % settings.a == 0 || i % settings.b == 0) { - val x = (i % 10) * 72.0 - val y = (i / 10) * 48.0 - drawer.rectangle(x, y, 72.0, 48.0) - } - } - } - keyboard.keyDown.listen { - when (it.name) { - in "0".."9" -> { - if (KeyModifier.SHIFT in it.modifiers) { - // 1. Get the current gui state, store it in a list - presets[it.name.toInt()] = gui.toObject() - } else { - // 2. Set the gui state - gui.fromObject(presets[it.name.toInt()]) - } - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoSideCanvas01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoSideCanvas01.kt deleted file mode 100644 index d2b4bf8f..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoSideCanvas01.kt +++ /dev/null @@ -1,53 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.gui.GUIAppearance -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.panel.elements.draw - - -/** - * Demonstrates the `GUI.enableSideCanvas` feature. - * - * When set to true, the `GUI` provides a `canvas` property where one can draw. - * The size of this canvas is the window size minus the GUI size. - * - * That's why if we draw a circle at `drawer.width / 2.0` it is centered - * on the `canvas`, not on the window. - * - * This demo sets the window to resizable, so if you resize the window - * you should see tha the circle stays at the center of the canvas. - * - */ -fun main() = application { - configure { - width = 720 - height = 720 - windowResizable = true - } - - program { - val gui = GUI(GUIAppearance(baseColor = ColorRGBa.GRAY.shade(0.25))) - gui.compartmentsCollapsedByDefault = false - gui.enableSideCanvas = true - - val settings = @Description("Settings") object { - @DoubleParameter("radius", 0.0, 200.0) - var radius = 50.0 - - @ColorParameter("color") - var color = ColorRGBa.PINK - } - gui.add(settings) - extend(gui) - - gui.canvas?.draw { - val width = drawer.width - val height = drawer.height - drawer.fill = settings.color - drawer.circle(width / 2.0, height / 2.0, settings.radius) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoSimple01.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoSimple01.kt deleted file mode 100644 index e8c084bc..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoSimple01.kt +++ /dev/null @@ -1,53 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.shape.Circle - -/** - * Demonstrates how to create a simple GUI with 4 inputs: - * - A `ColorParameter` which creates a color picker. - * - A `DoubleParameter` to control the radius of a circle. - * - A `Vector2Parameter` to set the position of that circle. - * - A `DoubleListParameter` which sets the radii of six circles. - * - * The demo also shows how to use the variables controlled by the GUI - * inside the program, so changes to those variables affect - * the rendering in real time. - */ -fun main() = application { - configure { - width = 720 - height = 450 - } - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val settings = @Description("Settings") object { - @DoubleParameter("radius", 0.0, 100.0) - var radius = 50.0 - - @Vector2Parameter("position", 0.0, 1.0) - var position = Vector2(0.6, 0.5) - - @ColorParameter("color") - var color = ColorRGBa.PINK - - @DoubleListParameter("radii", 5.0, 30.0) - var radii = mutableListOf(5.0, 6.0, 8.0, 14.0, 20.0, 30.0) - } - gui.add(settings) - extend(gui) - extend { - drawer.fill = settings.color - drawer.circle(settings.position * drawer.bounds.position(1.0, 1.0), settings.radius) - drawer.circles( - settings.radii.mapIndexed { i, radius -> - Circle(width - 50.0, 60.0 + i * 70.0, radius) - } - ) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-gui/src/demo/kotlin/DemoXYParameter.kt b/orx-jvm/orx-gui/src/demo/kotlin/DemoXYParameter.kt deleted file mode 100644 index 9ee97791..00000000 --- a/orx-jvm/orx-gui/src/demo/kotlin/DemoXYParameter.kt +++ /dev/null @@ -1,41 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.XYParameter -import org.openrndr.math.Vector2 - -/** - * Demonstrates the use of the `@XYParameter` annotation applied to a `Vector2` variable. - * - * This annotation creates an interactive XY control in a GUI that can be used to update - * a `Vector2` variable. In this demo it sets the position of a circle. - * - */ -fun main() = application { - configure { - width = 800 - height = 800 - } - - program { - val gui = GUI() - gui.compartmentsCollapsedByDefault = false - - val settings = @Description("Settings") object { - @XYParameter( - "Position", 0.0, 800.0, 0.0, 800.0, - precision = 2, - invertY = false, - showVector = true - ) - var position: Vector2 = Vector2(0.0, 0.0) - } - - gui.add(settings) - - extend(gui) - extend { - drawer.circle(settings.position, 50.0) - } - } -} diff --git a/orx-jvm/orx-gui/src/main/kotlin/Gui.kt b/orx-jvm/orx-gui/src/main/kotlin/Gui.kt deleted file mode 100644 index c500dbf4..00000000 --- a/orx-jvm/orx-gui/src/main/kotlin/Gui.kt +++ /dev/null @@ -1,1226 +0,0 @@ -package org.openrndr.extra.gui - -import com.google.gson.Gson -import com.google.gson.JsonSyntaxException -import com.google.gson.reflect.TypeToken -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.* -import org.openrndr.color.ColorRGBa -import org.openrndr.dialogs.* -import org.openrndr.draw.Drawer -import org.openrndr.extra.noise.uniform -import org.openrndr.extra.parameters.* -import org.openrndr.internal.Driver -import org.openrndr.math.* -import org.openrndr.panel.ControlManager -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.* -import org.openrndr.panel.style.* -import org.openrndr.panel.style.Display -import java.io.File -import kotlin.math.roundToInt -import kotlin.reflect.KMutableProperty1 - -/** Dear contributor, just in case you are here looking to add a new parameter type. -There is a 6-step incantation to add a new parameter type -0) Add your parameter type to orx-parameters, follow the instructions provided there. - -1) Set up a control style, very likely analogous to the styles already in place. -2) Add control creation code. -3) Add value serialization code, may need to update ParameterValue too. -4) Add value deserialization code. -5) Add value randomization code. -6) Add control update code. - -You can use your editor's search functionality to jump to "1)", "2)". - */ -private data class LabeledObject(val label: String, val obj: Any) - -private class CompartmentState(var collapsed: Boolean, val parameterValues: MutableMap = mutableMapOf()) -private class SidebarState(var hidden: Boolean = false, var collapsed: Boolean = false, var scrollTop: Double = 0.0) -private class TrackedObjectBinding( - val parameters: List, - val parameterControls: MutableMap = mutableMapOf() -) - -private val persistentCompartmentStates = mutableMapOf>() -private val persistentSidebarStates = mutableMapOf() - -private fun compartmentState(): MutableMap = persistentCompartmentStates.getOrPut(Driver.instance.contextID) { - mutableMapOf() -} - -private fun sidebarState(): SidebarState = persistentSidebarStates.getOrPut(Driver.instance.contextID) { - SidebarState() -} - -private fun getPersistedOrDefault( - compartmentLabel: String, - property: KMutableProperty1, - obj: Any -): T { - val state = compartmentState()[compartmentLabel] - if (state == null) { - return property.get(obj) - } else { - @Suppress("UNCHECKED_CAST") - return (state.parameterValues[property.name] as? T?) ?: return property.get(obj) - } -} - -private fun setAndPersist(compartmentLabel: String, property: KMutableProperty1, obj: Any, value: T) { - property.set(obj, value) - val state = compartmentState()[compartmentLabel] ?: error("item '$compartmentLabel' not in state (${compartmentState()}. ContextID ${Driver.instance.contextID} )") - state.parameterValues[property.name] = value -} - -private val logger = KotlinLogging.logger { } - - -class GUIAppearance( - val baseColor: ColorRGBa = ColorRGBa.GRAY.opacify(0.99), - val barWidth: Int = 200) - -@Suppress("unused", "UNCHECKED_CAST") -open class GUI( - val appearance: GUIAppearance = GUIAppearance(), - val defaultStyles: List = defaultStyles(), -) : Extension { - private var onChangeListener: ((name: String, value: Any?) -> Unit)? = null - override var enabled = true - - var listenToProduceAssetsEvent = true - - var visible = true - set(value) { - if (field != value) { - field = value - if (field) { - panel?.body?.classes?.remove(collapsed) - } else { - panel?.body?.classes?.add(collapsed) - } - sidebarState().hidden = !field - } - } - - var compartmentsCollapsedByDefault = true - var doubleBind = true - var defaultSaveFolder = "gui-parameters" - var persistState = true - var enableSideCanvas = false - var showToolbar = true - - var canvas: Canvas? = null - private var panel: ControlManager? = null - - // Randomize button - private var shiftDown = false - private var randomizeButton: Button? = null - - fun onChange(listener: (name: String, value: Any?) -> Unit) { - onChangeListener = listener - } - - val collapsed = ElementClass("collapsed") - - override fun setup(program: Program) { - if (persistState) { - val guiState = File(defaultSaveFolder, "${program.name}-latest.json") - if (guiState.exists()) { - loadParameters(guiState) - } - } - - program.produceAssets.listen { - if (listenToProduceAssetsEvent) { - val folderFile = File(defaultSaveFolder) - val targetFile = File(defaultSaveFolder, "${it.assetMetadata.assetBaseName}.json") - if (folderFile.exists() && folderFile.isDirectory) { - logger.info { "Saving parameters to '${targetFile.absolutePath}" } - saveParameters(targetFile) - } else { - if (folderFile.mkdirs()) { - logger.info { "Saving parameters to '${targetFile.absolutePath}" } - saveParameters(targetFile) - } else { - logger.error { "Could not save parameters because could not create directory ${folderFile.absolutePath}" } - } - } - } - } - - program.keyboard.keyDown.listen { - if (it.key == KEY_F11) { - visible = !visible - } - - if (it.key == KEY_LEFT_SHIFT) { - shiftDown = true - randomizeButton?.classes?.add(ElementClass("randomize-strong")) - } - } - - program.keyboard.keyUp.listen { - if (it.key == KEY_LEFT_SHIFT) { - shiftDown = false - randomizeButton?.classes?.remove(ElementClass("randomize-strong")) - } - } - - panel = program.controlManager(defaultStyles = defaultStyles) { - styleSheet(has class_ "fullscreen") { - this.width = 100.percent - this.height = 100.percent - this.flexDirection = FlexDirection.Row - this.display = Display.FLEX - } - styleSheet(has class_ "full-canvas") { - this.background = Color.RGBa(ColorRGBa.RED) - - this.flexShrink = FlexGrow.Ratio(1.0) - this.flexGrow = FlexGrow.Ratio(1.0) - this.height = 100.percent - this.width = 100.px - } - - styleSheet(has class_ "container") { - this.display = Display.FLEX - this.flexDirection = FlexDirection.Column - this.width = appearance.barWidth.px - this.height = 100.percent - } - - styleSheet(has class_ "collapse-border") { - this.display = Display.FLEX - this.flexDirection = FlexDirection.Column - this.height = 5.px - this.width = 100.percent - this.background = Color.RGBa(appearance.baseColor.shade(0.9)) - - and(has state "hover") { - this.background = Color.RGBa(appearance.baseColor.shade(1.1)) - } - } - - styleSheet(has class_ "toolbar") { - this.height = 42.px - this.width = 100.percent - this.display = Display.FLEX - this.flexDirection = FlexDirection.Row - this.background = Color.RGBa(appearance.baseColor) - } - - styleSheet(has class_ "collapsed") { - this.display = Display.NONE - } - - styleSheet(has class_ "compartment") { - this.paddingBottom = 20.px - } - - styleSheet(has class_ "sidebar") { - this.width = appearance.barWidth.px - this.paddingBottom = 20.px - this.paddingTop = 10.px - this.paddingLeft = 10.px - this.paddingRight = 10.px - this.marginRight = 2.px - this.height = 100.percent - this.background = Color.RGBa(appearance.baseColor) - this.overflow = Overflow.Scroll - - // - descendant(has type "colorpicker-button") { - this.width = (appearance.barWidth - 25).px - } - - descendant(has type "slider") { - this.width = (appearance.barWidth - 25).px - } - - descendant(has type "button") { - this.width = (appearance.barWidth - 25).px - } - - descendant(has type "textfield") { - this.width = (appearance.barWidth - 25).px - } - - descendant(has type "toggle") { - this.width = (appearance.barWidth - 25).px - } - - descendant(has type "xy-pad") { - this.width = (appearance.barWidth - 25).px - this.height = (appearance.barWidth - 25).px - } - - descendant( - has type listOf( - "sequence-editor", - "sliders-vector2", - "sliders-vector3", - "sliders-vector4" - ) - ) { - this.width = (appearance.barWidth - 25).px - this.height = 100.px - } - // - } - - styleSheet(has class_ "randomize-strong") { - color = Color.RGBa(ColorRGBa.PINK) - - and(has state "hover") { - color = Color.RGBa(ColorRGBa.BLACK) - background = Color.RGBa(ColorRGBa.PINK) - } - } - - styleSheet(has type "dropdown-button") { - this.width = 175.px - } - layout { - div("fullscreen") { - div("container") { - id = "container" - if (showToolbar) { - @Suppress("UNUSED_VARIABLE") - val header = div("toolbar") { - randomizeButton = button { - label = "Randomize" - clicked { - randomize(strength = if (shiftDown) .75 else .05) - } - } - button { - label = "Load" - clicked { - openFileDialog( - supportedExtensions = listOf("GUI parameters" to listOf("json")), - contextID = "gui.parameters" - ) { - loadParameters(it) - } - } - } - button { - label = "Save" - clicked { - val defaultPath = getDefaultPathForContext(contextID = "gui.parameters") - - if (defaultPath == null) { - val local = File(".") - val parameters = File(local, defaultSaveFolder) - if (parameters.exists() && parameters.isDirectory) { - setDefaultPathForContext( - contextID = "gui.parameters", - file = parameters - ) - } else { - if (parameters.mkdirs()) { - setDefaultPathForContext( - contextID = "gui.parameters", - file = parameters - ) - } else { - logger.warn { "Could not create directory ${parameters.absolutePath}" } - } - } - } - - saveFileDialog( - suggestedFilename = "parameters.json", - contextID = "gui.parameters", - supportedExtensions = listOf("GUI parameters" to listOf("json")) - ) { - saveParameters(it) - } - } - } - } - } - val collapseBorder = div("collapse-border") { - - } - - val collapsibles = mutableSetOf

      () - val sidebar = div("sidebar") { - id = "sidebar" - scrollTop = sidebarState().scrollTop - for ((labeledObject, binding) in trackedObjects) { - val (label, _) = labeledObject - - val h3Header = h3 { label } - val collapsible = div("compartment") { - for (parameter in binding.parameters) { - val element = addControl(labeledObject, parameter) - binding.parameterControls[parameter] = element - } - } - collapsibles.add(collapsible) - val collapseClass = ElementClass("collapsed") - - /* this is guaranteed to be in the dictionary after insertion through add() */ - val collapseState = compartmentState()[label]!! - if (collapseState.collapsed) { - collapsible.classes.add(collapseClass) - } - - h3Header.mouse.pressed.listen { - it.cancelPropagation() - } - h3Header.mouse.clicked.listen { me -> - - if (KeyModifier.CTRL in me.modifiers) { - collapsible.classes.remove(collapseClass) - compartmentState().forEach { - it.value.collapsed = true - } - collapseState.collapsed = false - - (collapsibles - collapsible).forEach { - it.classes.add(collapseClass) - } - } else { - - if (collapseClass in collapsible.classes) { - collapsible.classes.remove(collapseClass) - collapseState.collapsed = false - } else { - collapsible.classes.add(collapseClass) - collapseState.collapsed = true - } - } - } - } - } - collapseBorder.mouse.pressed.listen { - it.cancelPropagation() - } - - collapseBorder.mouse.clicked.listen { - val collapsed = ElementClass("collapsed") - if (collapsed in sidebar.classes) { - sidebar.classes.remove(collapsed) - sidebarState().collapsed = false - } else { - sidebar.classes.add(collapsed) - sidebarState().collapsed = true - } - it.cancelPropagation() - } - sidebar.mouse.scrolled.listen { - sidebarState().scrollTop = sidebar.scrollTop - } - if (sidebarState().collapsed) { - sidebar.classes.add(ElementClass("collapsed")) - } - sidebar.scrollTop = sidebarState().scrollTop - } - if (enableSideCanvas) { - canvas = canvas("full-canvas") { - } - } - } - } - } - - visible = !sidebarState().hidden - - program.extend(panel ?: error("no panel")) - } - - /* 2) control creation. create control, set label, set range, setup event-handler, load values */ - // - private fun Div.addControl(compartment: LabeledObject, parameter: Parameter): Element { - val obj = compartment.obj - - return when (parameter.parameterType) { - - ParameterType.Int -> { - slider { - label = parameter.label - range = Range(parameter.intRange!!.first.toDouble(), parameter.intRange!!.last.toDouble()) - precision = 0 - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue.toInt() - ) - (parameter.property as KMutableProperty1).set(obj, value.toInt()) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it.toDouble() - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Double -> { - slider { - label = parameter.label - range = Range(parameter.doubleRange!!.start, parameter.doubleRange!!.endInclusive) - precision = parameter.precision!! - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - /* this is generally not needed, but when the persisted value is equal to the slider default - it will not emit the newly set value */ - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Action -> { - button { - label = parameter.label - events.clicked.listen { - /* the `obj` we pass in here is the receiver */ - parameter.function!!.call(obj) - onChangeListener?.invoke(parameter.function!!.name, null) - } - } - } - - ParameterType.Boolean -> { - toggle { - label = parameter.label - events.valueChanged.listen { - value = it.newValue - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Text -> { - textfield { - label = parameter.label - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - } - } - } - - ParameterType.Color -> { - colorpickerButton { - label = parameter.label - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.color - ) - onChangeListener?.invoke(parameter.property!!.name, it.color) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - color = it - } - } - } - - ParameterType.XY -> { - xyPad { - minX = parameter.vectorRange!!.first.x - minY = parameter.vectorRange!!.first.y - maxX = parameter.vectorRange!!.second.x - maxY = parameter.vectorRange!!.second.y - precision = parameter.precision!! - showVector = parameter.showVector!! - invertY = parameter.invertY!! - label = parameter.label - - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - } - } - - ParameterType.Path -> { - button { - label = "Load ${parameter.label}" - clicked { - - if (parameter.pathIsDirectory == false) { - openFileDialog( - supportedExtensions = parameter.pathExtensions?.let { listOf("supported extensions" to it.toList()) } - ?: emptyList(), - contextID = parameter.pathContext ?: "null" - ) { - val resolvedPath = if (parameter.absolutePath == true) { - it.absolutePath - } else { - it.relativeTo(File(".").absoluteFile).path - } - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - resolvedPath - ) - } - } else { - openFolderDialog(contextID = parameter.pathContext ?: "null") { - val resolvedPath = if (parameter.absolutePath == true) { - it.absolutePath - } else { - it.relativeTo(File(".").absoluteFile).path - } - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - resolvedPath - ) - } - } - } - } - } - - ParameterType.DoubleList -> { - sequenceEditor { - range = parameter.doubleRange!! - label = parameter.label - minimumSequenceLength = parameter.sizeRange!!.start - maximumSequenceLength = parameter.sizeRange!!.endInclusive - precision = parameter.precision!! - - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1>, - obj, - it.newValue.toMutableList() - ) - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1>, - obj - ).let { - value = it - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1>, - obj, - it - ) - } - } - } - - ParameterType.Vector2 -> { - slidersVector2 { - range = parameter.doubleRange!! - label = parameter.label - precision = parameter.precision!! - - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Vector3 -> { - slidersVector3 { - range = parameter.doubleRange!! - label = parameter.label - precision = parameter.precision!! - - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Vector4 -> { - slidersVector4 { - range = parameter.doubleRange!! - label = parameter.label - precision = parameter.precision!! - - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1, - obj, - it.newValue - ) - - onChangeListener?.invoke(parameter.property!!.name, it.newValue) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1, - obj - ).let { - value = it - setAndPersist(compartment.label, parameter.property as KMutableProperty1, obj, it) - } - } - } - - ParameterType.Option -> { - dropdownButton { - val enumProperty = parameter.property as KMutableProperty1> - val value = enumProperty.get(obj) - label = parameter.label - // -- this is dirty, but it is the only way to get the constants for arbitrary enums - // -- (that I know of, at least) - @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") val jEnum = value as java.lang.Enum<*> - // -- we don't use the property syntax here because that leads to compilation errors - @Suppress("UsePropertyAccessSyntax") val constants = jEnum.getDeclaringClass().getEnumConstants() - constants.forEach { - item { - label = it.name - data = it - } - } - events.valueChanged.listen { - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1>, - obj, - it.value.data as? Enum<*> ?: error("no data") - ) - - onChangeListener?.invoke( - parameter.property!!.name, - it.value.data as? Enum<*> ?: error("no data") - ) - } - getPersistedOrDefault( - compartment.label, - parameter.property as KMutableProperty1>, - obj - ).let { enum -> - (this@dropdownButton).value = items().find { item -> item.data == enum } - ?: error("no matching item found") - setAndPersist( - compartment.label, - parameter.property as KMutableProperty1>, - obj, - enum - ) - } - } - } - } - } - // - - private val trackedObjects = mutableMapOf() - - private fun updateControls() { - for ((labeledObject, binding) in trackedObjects) { - for ((parameter, control) in binding.parameterControls) { - updateControl(labeledObject, parameter, control) - } - } - } - - class ParameterValue( - var doubleValue: Double? = null, - var intValue: Int? = null, - var booleanValue: Boolean? = null, - var colorValue: ColorRGBa? = null, - var vector2Value: Vector2? = null, - var vector3Value: Vector3? = null, - var vector4Value: Vector4? = null, - var doubleListValue: MutableList? = null, - var textValue: String? = null, - var optionValue: String? = null, - var minValue: Double? = null, - var maxValue: Double? = null - ) - - - /** - * Can be called by the user to obtain an object to be serialized - * externally. This allows the user to combine custom data with gui - * state and save it all to one file. Complements `.fromObject()`. - */ - fun toObject(): Map> { - fun KMutableProperty1?.qget(obj: Any): T { - return (this as KMutableProperty1).get(obj) - } - - return trackedObjects.entries.associate { (lo, b) -> - Pair(lo.label, b.parameterControls.keys.associate { k -> - Pair( - k.property?.name ?: k.function?.name - ?: error("no name"), when (k.parameterType) { - /* 3) setup serializers */ - ParameterType.Double -> ParameterValue( - doubleValue = k.property.qget(lo.obj) as Double, - minValue = k.doubleRange?.start, - maxValue = k.doubleRange?.endInclusive - ) - - ParameterType.Int -> ParameterValue( - intValue = k.property.qget(lo.obj) as Int, - minValue = k.intRange?.start?.toDouble(), - maxValue = k.intRange?.endInclusive?.toDouble() - ) - - ParameterType.Action -> ParameterValue() - ParameterType.Color -> ParameterValue(colorValue = k.property.qget(lo.obj) as ColorRGBa) - ParameterType.Text -> ParameterValue(textValue = k.property.qget(lo.obj) as String) - ParameterType.Boolean -> ParameterValue(booleanValue = k.property.qget(lo.obj) as Boolean) - ParameterType.XY -> ParameterValue(vector2Value = k.property.qget(lo.obj) as Vector2) - ParameterType.DoubleList -> ParameterValue( - doubleListValue = k.property.qget( - lo.obj - ) as MutableList, - minValue = k.doubleRange?.start, - maxValue = k.doubleRange?.endInclusive - ) - - ParameterType.Vector2 -> ParameterValue( - vector2Value = k.property.qget(lo.obj) as Vector2, - minValue = k.doubleRange?.start, - maxValue = k.doubleRange?.endInclusive - ) - - ParameterType.Vector3 -> ParameterValue( - vector3Value = k.property.qget(lo.obj) as Vector3, - minValue = k.doubleRange?.start, - maxValue = k.doubleRange?.endInclusive - ) - - ParameterType.Vector4 -> ParameterValue( - vector4Value = k.property.qget(lo.obj) as Vector4, - minValue = k.doubleRange?.start, - maxValue = k.doubleRange?.endInclusive - ) - - ParameterType.Path -> ParameterValue(textValue = k.property.qget(lo.obj) as String) - - ParameterType.Option -> ParameterValue(optionValue = (k.property.qget(lo.obj) as Enum<*>).name) - } - ) - }) - } - } - - fun saveParameters(file: File) { - file.writeText(Gson().toJson(toObject())) - } - - /** - * Can be called by the user to update the gui using an object - * deserialized externally. Allows the user to load a larger json object, - * deserialize it, and use part of it to update the GUI. - * Complements `.toObject()`. - */ - fun fromObject(labeledValues: Map>) { - fun KMutableProperty1?.qset(obj: Any, value: T) = - (this as KMutableProperty1).set(obj, value) - - fun KMutableProperty1?.enumSet(obj: Any, value: String) { - val v = (this as KMutableProperty1>).get(obj) - - @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UsePropertyAccessSyntax") - val enumValue = (v as java.lang.Enum<*>).getDeclaringClass().getEnumConstants().find { it.name == value } - ?: error("cannot map value $value to enum") - (this as KMutableProperty1>).set(obj, enumValue) - } - - labeledValues.forEach { (label, ps) -> - trackedObjects.keys.find { it.label == label }?.let { lo -> - val binding = trackedObjects[lo]!! - ps.forEach { (parameterName, parameterValue) -> - binding.parameters.find { it.property?.name == parameterName }?.let { parameter -> - when (parameter.parameterType) { - /* 4) Set up deserializers */ - ParameterType.Double -> parameterValue.doubleValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Int -> parameterValue.intValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Text -> parameterValue.textValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Color -> parameterValue.colorValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.XY -> parameterValue.vector2Value?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.DoubleList -> parameterValue.doubleListValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Boolean -> parameterValue.booleanValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Vector2 -> parameterValue.vector2Value?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Vector3 -> parameterValue.vector3Value?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Vector4 -> parameterValue.vector4Value?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Option -> parameterValue.optionValue?.let { - parameter.property.enumSet(lo.obj, it) - } - - ParameterType.Path -> parameterValue.textValue?.let { - parameter.property.qset(lo.obj, it) - } - - ParameterType.Action -> { - // intentionally do nothing - } - } - } - } - } - } - updateControls() - } - - fun loadParameters(file: File) { - val json = file.readText() - val typeToken = object : TypeToken>>() {} - val labeledValues: Map> = try { - Gson().fromJson(json, typeToken.type) - } catch (e: JsonSyntaxException) { - println("could not parse json: $json") - throw e - } - - fromObject(labeledValues) - } - - private fun updateControl(labeledObject: LabeledObject, parameter: Parameter, control: Element) { - when (parameter.parameterType) { - /* 5) Update control from property value */ - ParameterType.Double -> { - (control as Slider).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Int -> { - (control as Slider).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj).toDouble() - } - - ParameterType.Text -> { - (control as Textfield).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Color -> { - (control as ColorpickerButton).color = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.XY -> { - (control as XYPad).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.DoubleList -> { - (control as SequenceEditor).value = - (parameter.property as KMutableProperty1>).get(labeledObject.obj) - } - - ParameterType.Boolean -> { - (control as Toggle).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Vector2 -> { - (control as SlidersVector2).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Vector3 -> { - (control as SlidersVector3).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Vector4 -> { - (control as SlidersVector4).value = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - } - - ParameterType.Option -> { - val ddb = control as DropdownButton - ddb.value = ddb.items().find { item -> - item.data == (parameter.property as KMutableProperty1>).get(labeledObject.obj) - } ?: error("could not find item") - } - - ParameterType.Path -> { - - } - - ParameterType.Action -> { - // intentionally do nothing - } - } - } - - fun randomize(strength: Double = 0.05) { - for ((labeledObject, binding) in trackedObjects) { - // -- only randomize visible parameters - for (parameter in binding.parameterControls.keys) { - when (parameter.parameterType) { - /* 6) Set up value randomizers */ - ParameterType.Double -> { - val min = parameter.doubleRange!!.start - val max = parameter.doubleRange!!.endInclusive - val currentValue = (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Double.uniform(min, max) - val newValue = mix(currentValue, randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.Int -> { - val min = parameter.intRange!!.first - val max = parameter.intRange!!.last - val currentValue = (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Double.uniform(min.toDouble(), max.toDouble()) - val newValue = mix(currentValue.toDouble(), randomValue, strength).roundToInt() - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.Boolean -> { - //I am not sure about randomizing boolean values here - //(parameter.property as KMutableProperty1).set(labeledObject.obj, (Math.random() < 0.5)) - } - - ParameterType.Color -> { - val currentValue = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = - ColorRGBa.fromVector(Vector3.uniform(0.0, 1.0), currentValue.alpha, currentValue.linearity) - val newValue = currentValue.mix(randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.Vector2 -> { - val min = parameter.doubleRange!!.start - val max = parameter.doubleRange!!.endInclusive - val currentValue = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Vector2.uniform(min, max) - val newValue = currentValue.mix(randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.XY -> { - val min = parameter.vectorRange!!.first - val max = parameter.vectorRange!!.second - val currentValue = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Vector2.uniform(min, max) - val newValue = currentValue.mix(randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.Vector3 -> { - val min = parameter.doubleRange!!.start - val max = parameter.doubleRange!!.endInclusive - val currentValue = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Vector3.uniform(min, max) - val newValue = currentValue.mix(randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - ParameterType.Vector4 -> { - val min = parameter.doubleRange!!.start - val max = parameter.doubleRange!!.endInclusive - val currentValue = - (parameter.property as KMutableProperty1).get(labeledObject.obj) - val randomValue = Vector4.uniform(min, max) - val newValue = currentValue.mix(randomValue, strength) - (parameter.property as KMutableProperty1).set(labeledObject.obj, newValue) - } - - else -> { - // intentionally do nothing - } - } - } - } - updateControls() - } - - /** - * Recursively find a unique label - * @param label to find an alternate for in case it already exist - */ - private fun resolveUniqueLabel(label: String): String { - return trackedObjects.keys.find { it.label == label }?.let { lo -> - resolveUniqueLabel(Regex("(.*) / ([0-9]+)").matchEntire(lo.label)?.let { - "${it.groupValues[1]} / ${1 + it.groupValues[2].toInt()}" - } ?: "$label / 2") - } ?: label - } - - /** - * Add an object to the GUI - * @param objectWithParameters an object of a class that annotated parameters - * @param label an optional label that overrides the label supplied in a [Description] annotation - * @return pass-through of [objectWithParameters] - */ - fun add(objectWithParameters: T, label: String? = objectWithParameters.title()): T { - val parameters = objectWithParameters.listParameters() - val uniqueLabel = resolveUniqueLabel(label ?: "No name") - - if (parameters.isNotEmpty()) { - val collapseStates = persistentCompartmentStates.getOrPut(Driver.instance.contextID) { - mutableMapOf() - } - collapseStates.getOrPut(uniqueLabel) { - CompartmentState(compartmentsCollapsedByDefault) - } - trackedObjects[LabeledObject(uniqueLabel, objectWithParameters)] = TrackedObjectBinding(parameters) - } - return objectWithParameters - } - - /** - * Add an object to the GUI using a builder. - * @param label an optional label that overrides the label supplied in a [Description] annotation - * @return the built object - */ - fun add(label: String? = null, builder: () -> T): T { - val t = builder() - return add(t, label ?: t.title()) - } - - override fun afterDraw(drawer: Drawer, program: Program) { - if (doubleBind) { - updateControls() - } - } - - override fun shutdown(program: Program) { - if (persistState) { - val folderFile = File(defaultSaveFolder) - if (folderFile.exists() && folderFile.isDirectory) { - saveParameters(File(defaultSaveFolder, "${program.name}-latest.json")) - } else { - if (folderFile.mkdirs()) { - saveParameters(File(defaultSaveFolder, "${program.name}-latest.json")) - } else { - logger.error { "Could not persist GUI state because could not create directory ${folderFile.absolutePath}" } - } - } - } - } -} - -@JvmName("addToGui") -fun T.addTo(gui: GUI, label: String? = this.title()): T { - gui.add(this, label) - return this -} diff --git a/orx-jvm/orx-gui/src/main/kotlin/WindowedGUI.kt b/orx-jvm/orx-gui/src/main/kotlin/WindowedGUI.kt deleted file mode 100644 index 55219a3a..00000000 --- a/orx-jvm/orx-gui/src/main/kotlin/WindowedGUI.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.openrndr.extra.gui - -import org.openrndr.* -import org.openrndr.extra.parameters.title -import org.openrndr.internal.Driver -import org.openrndr.math.IntVector2 -import org.openrndr.panel.style.StyleSheet -import org.openrndr.panel.style.defaultStyles - -private val childWindows = mutableMapOf() - -class WindowedGUI( - val appearance: GUIAppearance = GUIAppearance(), - val defaultStyles: List = defaultStyles(), - val windowClosable: Boolean = false, - val windowAlwaysOntop: Boolean = false, -) : Extension { - override var enabled: Boolean = true - val gui: GUI = GUI(appearance, defaultStyles) - - private val addedObjects = mutableListOf>() - - fun add(objectWithParameters: T, label: String? = objectWithParameters.title()): T { - addedObjects.add(Pair(objectWithParameters, label)) - return objectWithParameters - } - - override fun setup(program: Program) { - val window = childWindows[Driver.instance.contextID] - if (window != null) { - window.program.mouse.exited.listeners.clear() - window.program.mouse.entered.listeners.clear() - window.program.mouse.buttonUp.listeners.clear() - window.program.mouse.buttonDown.listeners.clear() - window.program.mouse.dragged.listeners.clear() - window.program.mouse.scrolled.listeners.clear() - window.program.mouse.moved.listeners.clear() - window.program.keyboard.keyUp.listeners.clear() - window.program.keyboard.keyDown.listeners.clear() - window.program.keyboard.keyRepeat.listeners.clear() - window.program.keyboard.character.listeners.clear() - window.program.extensions.clear() - window.program.produceAssets.listeners.clear() - window.program.requestAssets.listeners.clear() - } - - val cw = childWindows.getOrPut(Driver.instance.contextID) { - program.window( - WindowConfiguration( - closable = windowClosable, - alwaysOnTop = windowAlwaysOntop, - width = appearance.barWidth, - height = program.height, - position = program.window.position.toInt() - IntVector2(200, 0) - ) - ) { - // - } - } - - // launch because at this stage Driver.instance.contextID points to the context of the parent window - cw.program.launch { - for ((obj, label) in addedObjects) { - gui.add(obj, label) - } - cw.program.extend(gui) - program.produceAssets.listen { - cw.program.produceAssets.trigger(it) - } - } - } -} - -@JvmName("addToWindowedGui") -fun T.addTo(gui: WindowedGUI, label: String? = this.title()): T { - gui.add(this, label) - return this -} diff --git a/orx-jvm/orx-keyframer/README.md b/orx-jvm/orx-keyframer/README.md deleted file mode 100644 index a2ddc534..00000000 --- a/orx-jvm/orx-keyframer/README.md +++ /dev/null @@ -1,238 +0,0 @@ -# orx-keyframer - -Create animated timelines by specifying properties and times in keyframes, then play it back at any speed (even -backwards) automatically interpolating properties. Save, load, use mathematical expressions and callbacks. Powerful and -highly reusable. - -What this allows you to do: - -1. Create a keyframed animation in a json file. - -```json -[ - { - "time": 0.0, - "easing": "cubic-in-out", - "x": 3.0, - "y": 4.0, - "z": 9.0, - "r": 0.1, - "g": 0.5, - "b": 0.2, - "radius": 50 - }, - { - "time": 2.0, - "easing": "cubic-in-out", - "r": 0.6, - "g": 0.5, - "b": 0.1 - }, - { - "time": 4.0, - "easing": "cubic-in-out", - "x": 10.0, - "y": 4.0, - "radius": 400 - }, - { - "time": 5.0, - "easing": "cubic-in-out", - "x": 100.0, - "y": 320.0, - "radius": 400 - }, - { - "time": 5.3, - "easing": "cubic-in-out", - "x": 100.0, - "y": 320.0, - "radius": { - "value": 50.0, - "easing": "linear" - } - } -] -``` - -2. Map the animation data to Kotlin types: - -```kotlin -class Animation : Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - val radius by DoubleChannel("radius") - val color by RGBChannel(arrayOf("r", "g", "b")) -} - -val animation = Animation() -animation.loadFromJson(File("data/keyframes/animation.json")) -``` - -3. Animate! (from an OPENRNDR program) - -```kotlin -extend { - animation(seconds) - drawer.fill = animation.color - drawer.circle(animation.position, animation.radius) -} -``` - -## Easing - -All the easing functions of orx-easing are available - -- linear -- back-in -- back-out -- back-in-out -- bounce-in -- bounce-out -- bounce-in-out -- circ-in -- circ-out -- circ-in-out -- cubic-in -- cubic-out -- cubic-in-out -- elastic-in -- elastic-out -- elastic-in-out -- expo-in -- expo-out -- expo-in-out -- quad-in -- quad-out -- quad-in-out -- quart-in -- quart-out -- quart-in-out -- quint-in -- quint-out -- quint-in-out -- sine-in -- sine-out -- sine-in-out -- one -- zero - -## More expressive interface - -orx-keyframer has two ways of programming key frames. The first is the `"x": ` style we have seen before. The -second way uses a dictionary instead of a number value. - -For example: - -```json -[ - { - "time": 0.0, - "x": 320.0, - "y": 240.0 - }, - { - "time": 10.0, - "easing": "cubic-out", - "x": { - "easing": "cubic-in-out", - "value": 0.0 - }, - "y": { - "duration": -5.0, - "easing": "cubic-in", - "value": 0.0 - } - }, - { - "time": 20.0, - "x": 640.0, - "y": 480.0, - "easing": "cubic-in-out" - } -] -``` - -Inside the value dictionary one can set `value`, `easing`, `duration` and `envelope`. - - * `value` the target value, required value - * `easing` easing method that overrides the key's easing method, optional value - * `duration` an optional duration for the animation, set to `0` to jump from the previous -value to the new value, a negative value will start the interpolation before `time`. A positive value - wil start the interpolation at `time` and end at `time + duration` -* `envelope` optional 2-point envelope that modifies the playback of the animation. The default envelope is -`[0.0, 1.0]`. Reverse playback is achieved by supplying `[1.0, 0.0]`. To start the animation later try `[0.1, 1.0]`, - to end the animation earlier try `[0.0, 0.9]` - -## Advanced features - -orx-keyframer uses two file formats. A `SIMPLE` format and a `FULL` format. For reference check -the [example full format .json](src/demo/resources/demo-full-01.json) and -the [example program](src/demo/kotlin/DemoFull01.kt). The full format adds a `parameters` block and a `prototypes` -block. - -[Expressions](src/demo/resources/demo-simple-expressions-01.json), expression mechanism. Currently uses values `r` to -indicate repeat index and `t` the last used key time, `v` the last used value (for the animated attribute). - -Supported functions in expressions: - -- `min(x, y)`, `max(x, y)` -- `cos(x)`, `sin(x)`, `acos(x)`, `asin(x)`, `tan(x)`, `atan(x)`, `atan2(y, x)` -- `abs(x)`, `saturate(x)` -- `degrees(x)`, `radians(x)` -- `pow(x, y)`, `sqrt(x)`, `exp(x)` -- `mix(left, right, x)` -- `smoothstep(t0, t1, x)` -- `map(leftBefore, rightBefore, leftAfter, rightAfter, x)` -- `random()`, `random(min, max)` - -[Parameters and prototypes](src/demo/resources/demo-full-01.json) - - -## Demos -### DemoEvelope01 - - - -![DemoEvelope01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoEvelope01Kt.png) - -[source code](src/demo/kotlin/DemoEvelope01.kt) - -### DemoFull01 - - - -![DemoFull01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoFull01Kt.png) - -[source code](src/demo/kotlin/DemoFull01.kt) - -### DemoScrub01 - - - -![DemoScrub01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoScrub01Kt.png) - -[source code](src/demo/kotlin/DemoScrub01.kt) - -### DemoSimple01 - - - -![DemoSimple01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoSimple01Kt.png) - -[source code](src/demo/kotlin/DemoSimple01.kt) - -### DemoSimple02 - - - -![DemoSimple02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoSimple02Kt.png) - -[source code](src/demo/kotlin/DemoSimple02.kt) - -### DemoSimpleExpressions01 - - - -![DemoSimpleExpressions01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-keyframer/images/DemoSimpleExpressions01Kt.png) - -[source code](src/demo/kotlin/DemoSimpleExpressions01.kt) diff --git a/orx-jvm/orx-keyframer/build.gradle.kts b/orx-jvm/orx-keyframer/build.gradle.kts deleted file mode 100644 index 146367c5..00000000 --- a/orx-jvm/orx-keyframer/build.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(libs.gson) - implementation(sharedLibs.kotlin.reflect) - implementation(project(":orx-noise")) - implementation(project(":orx-easing")) - api(project(":orx-expression-evaluator")) - demoImplementation(project(":orx-jvm:orx-panel")) -} diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoEvelope01.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoEvelope01.kt deleted file mode 100644 index c8b78441..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoEvelope01.kt +++ /dev/null @@ -1,18 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - class Animation: Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - } - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-envelope-01.json"))) - extend { - animation(seconds) - drawer.circle(animation.position, 100.0) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoFull01.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoFull01.kt deleted file mode 100644 index 7455f1a3..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoFull01.kt +++ /dev/null @@ -1,22 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.extra.keyframer.KeyframerFormat -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - class Animation: Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - val radius by DoubleChannel("radius") - val color by RGBChannel(arrayOf("r", "g", "b")) - } - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-full-01.json")), format = KeyframerFormat.FULL) - extend { - animation(seconds) - drawer.fill = animation.color - drawer.circle(animation.position, animation.radius) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoScrub01.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoScrub01.kt deleted file mode 100644 index 3bbd424b..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoScrub01.kt +++ /dev/null @@ -1,46 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.Range -import org.openrndr.panel.elements.Slider -import org.openrndr.panel.elements.slider -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - - // -- replace the default clock with an offset clock - var clockOffset = 0.0 - val oldClock = clock - clock = { oldClock() - clockOffset } - var clockSlider: Slider? = null - - // -- setup a simple UI - val cm = controlManager { - layout { - clockSlider = slider { - range = Range(0.0, 30.0) - events.valueChanged.listen { - if (it.interactive) { - clockOffset = oldClock() - it.newValue - } - } - } - } - } - extend(cm) - class Animation: Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - } - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-simple-01.json"))) - - extend { - // -- update the slider - clockSlider?.value = seconds - animation(seconds) - drawer.circle(animation.position, 100.0) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple01.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple01.kt deleted file mode 100644 index 556b6fe5..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple01.kt +++ /dev/null @@ -1,18 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - class Animation: Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - } - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-simple-01.json"))) - extend { - animation(seconds) - drawer.circle(animation.position, 100.0) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple02.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple02.kt deleted file mode 100644 index 65048b4a..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimple02.kt +++ /dev/null @@ -1,21 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - class Animation: Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - val radius by DoubleChannel("radius") - val color by RGBChannel(arrayOf("r", "g", "b")) - } - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-simple-02.json"))) - extend { - animation(seconds) - drawer.fill = animation.color - drawer.circle(animation.position, animation.radius) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimpleExpressions01.kt b/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimpleExpressions01.kt deleted file mode 100644 index df631102..00000000 --- a/orx-jvm/orx-keyframer/src/demo/kotlin/DemoSimpleExpressions01.kt +++ /dev/null @@ -1,21 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.resourceUrl -import java.net.URL - -fun main() = application { - program { - class Animation : Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - val radius by DoubleChannel("x") - } - - val animation = Animation() - animation.loadFromJson(URL(resourceUrl("/demo-simple-expressions-01.json")), - parameters = mapOf("cycleDuration" to 2.0)) - extend { - animation(seconds) - drawer.circle(animation.position, animation.radius) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/resources/demo-envelope-01.json b/orx-jvm/orx-keyframer/src/demo/resources/demo-envelope-01.json deleted file mode 100644 index aa8b9b3a..00000000 --- a/orx-jvm/orx-keyframer/src/demo/resources/demo-envelope-01.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "time": 0.0, - "x": 320.0, - "y": 240.0 - }, - { - "time": 10.0, - "easing": "cubic-in-out", - "x": { - "envelope": [0.5, 1.0], - "value": 0.0 - }, - "y": { - "envelope": [0.4, 1.0], - "value": 0.0 - } - }, - { - "time": 20.0, - "x": 640.0, - "y": 480.0, - "easing": "cubic-in-out" - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/resources/demo-full-01.json b/orx-jvm/orx-keyframer/src/demo/resources/demo-full-01.json deleted file mode 100644 index 1f9f8bcc..00000000 --- a/orx-jvm/orx-keyframer/src/demo/resources/demo-full-01.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - // this is breaking with proper json but.. gson accepts comments and they are invaluable - // in the parameters block you can add custom values, which can be used in expressions - "parameters": { - "smallRadius": 5.0, - "repetitionCount": 10, - "width": 640.0, - "height": 480.0, - // you can have expressions inside parameters too, they are evaluated once, on load - "resolvedOnLoad" : "width * 2.0" - }, - // in the prototypes you can set up key prototypes - "prototypes": { - "red": { - "r": 1.0, - "g": 0.0, - "b": 0.0 - }, - "blue": { - "r": 0.0, - "g": 0.0, - "b": 1.0 - }, - "center": { - // prototypes can have expressions too, they are evaluated as late as possible - // thus, they are evaluated more than once - "x": "width / 2", - "y": "height / 2" - }, - "small": { - "radius": "smallRadius" - }, - "large": { - "radius": "smallRadius * 10.0" - } - }, - "keys": [ - { - "time": 0.0, - "easing": "cubic-in-out", - "x": 3.0, - "y": 4.0, - "z": 9.0, - "r": 0.0, - "g": 1.0, - "b": 0.0, - "radius": 50, - "foo" : 0.0 - }, - { - "time": 2.0, - "easing": "cubic-in-out", - // here we apply the prototypes in cascading fashion from left to right - "prototypes": "red center small" - }, - { - "time": 3.0, - "repeat": { - "count": "repetitionCount", - "keys": [ - { - "time": "(rep * 2.0) + 3.0", - "prototypes": "blue large", - "easing": "cubic-in-out" - }, - { - "time": "t + 1.0", - "prototypes": "red small" - } - ] - } - } - ] -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-01.json b/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-01.json deleted file mode 100644 index f0197538..00000000 --- a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-01.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "time": 0.0, - "x": 320.0, - "y": 240.0 - }, - { - "time": 10.0, - "x": 0.0, - "y": 0.0, - "easing": "cubic-in-out" - }, - { - "time": 20.0, - "x": 640.0, - "y": 480.0, - "easing": "cubic-in-out" - } - -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-02.json b/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-02.json deleted file mode 100644 index eed5716c..00000000 --- a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-02.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "time": 0.0, - "x": 320.0, - "y": 240.0, - "radius": 0.0, - "r": 1.0, - "g": 1.0, - "b": 1.0 - }, - { - "time": 5.0, - "radius": 200.0, - "r": 0.0 - }, - { - "time": 10.0, - "g": 0.0, - "x": 0.0, - "y": 0.0, - "easing": "cubic-in-out" - }, - { - "time": 20.0, - "x": 640.0, - "y": 480.0, - "radius": 50.0, - "easing": "cubic-in-out", - "g": 1.0, - "b": 0.0 - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-expressions-01.json b/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-expressions-01.json deleted file mode 100644 index d216cb91..00000000 --- a/orx-jvm/orx-keyframer/src/demo/resources/demo-simple-expressions-01.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "time": 0.0, - "x": 320.0, - "y": 240.0, - "radius": 0.0 - }, - { - "time": 3.0, - "repeat": { - "count": 5, - "keys": [ - { - "duration": "cycleDuration * 0.5", - "easing": "cubic-in-out", - "x": 10.0, - "y": 4.0, - "radius": 400 - }, - { - "duration": "cycleDuration * 0.5", - "easing": "cubic-in-out", - "x": 630.0, - "y": 470.0, - "radius": 40 - } - ] - } - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/main/kotlin/Key.kt b/orx-jvm/orx-keyframer/src/main/kotlin/Key.kt deleted file mode 100644 index 268b0938..00000000 --- a/orx-jvm/orx-keyframer/src/main/kotlin/Key.kt +++ /dev/null @@ -1,75 +0,0 @@ -package org.openrndr.extra.keyframer - -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.easing.EasingFunction -import org.openrndr.math.map - -internal val defaultEnvelope = doubleArrayOf(0.0, 1.0) - -class Key(val time: Double, val value: Double, val easing: EasingFunction, val envelope: DoubleArray = defaultEnvelope) - - -class KeyframerChannel { - val keys = mutableListOf() - - operator fun invoke() : Double { - return 0.0 - } - - fun add( - time: Double, - value: Double?, - easing: EasingFunction = Easing.Linear.function, - envelope: DoubleArray = defaultEnvelope - ) { - require(envelope.size >= 2) { - "envelope should contain at least 2 entries" - } - value?.let { - keys.add(Key(time, it, easing, envelope)) - } - } - - fun lastValue(): Double? { - return keys.lastOrNull()?.value - } - - fun lastTime(): Double? { - return keys.lastOrNull()?.time - } - - fun duration(): Double { - return keys.last().time - } - - fun value(time: Double): Double? { - if (keys.size == 0) { - return null - } - if (keys.size == 1) { - return if (time < keys.first().time) { - null - } else { - keys[0].value - } - } - - if (time < keys.first().time) { - return null - } - - val rightIndex = keys.indexOfFirst { it.time > time } - return if (rightIndex == -1) { - keys.last().value - } else { - val leftIndex = (rightIndex - 1).coerceAtLeast(0) - val rightKey = keys[rightIndex] - val leftKey = keys[leftIndex] - val t0 = (time - leftKey.time) / (rightKey.time - leftKey.time) - val te = t0.map(rightKey.envelope[0], rightKey.envelope[1], 0.0, 1.0, clamp = true) - val e0 = rightKey.easing(te, 0.0, 1.0, 1.0) - leftKey.value * (1.0 - e0) + rightKey.value * (e0) - } - } -} - diff --git a/orx-jvm/orx-keyframer/src/main/kotlin/KeyQuaternion.kt b/orx-jvm/orx-keyframer/src/main/kotlin/KeyQuaternion.kt deleted file mode 100644 index 532994af..00000000 --- a/orx-jvm/orx-keyframer/src/main/kotlin/KeyQuaternion.kt +++ /dev/null @@ -1,60 +0,0 @@ -package org.openrndr.extra.keyframer - -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.easing.EasingFunction -import org.openrndr.math.Quaternion -import org.openrndr.math.slerp - -class KeyQuaternion(val time: Double, val value: Quaternion, val easing: EasingFunction) - -class KeyframerChannelQuaternion { - val keys = mutableListOf() - - operator fun invoke() : Double { - return 0.0 - } - - fun add(time: Double, value: Quaternion?, easing: EasingFunction = Easing.Linear.function) { - - value?.let { - keys.add(KeyQuaternion(time, it, easing)) - } - } - - fun lastValue(): Quaternion? { - return keys.lastOrNull()?.value - } - - fun duration(): Double { - return keys.last().time - } - - fun value(time: Double): Quaternion? { - if (keys.size == 0) { - return null - } - if (keys.size == 1) { - return if (time < keys.first().time) { - keys[0].value.normalized - } else { - keys[0].value.normalized - } - } - - if (time < keys.first().time) { - return null - } - - val rightIndex = keys.indexOfFirst { it.time > time } - return if (rightIndex == -1) { - keys.last().value.normalized - } else { - val leftIndex = (rightIndex - 1).coerceAtLeast(0) - val rightKey = keys[rightIndex] - val leftKey = keys[leftIndex] - val t0 = (time - leftKey.time) / (rightKey.time - leftKey.time) - val e0 = rightKey.easing(t0, 0.0, 1.0, 1.0) - slerp(leftKey.value, rightKey.value, e0).normalized - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/main/kotlin/KeyVector3.kt b/orx-jvm/orx-keyframer/src/main/kotlin/KeyVector3.kt deleted file mode 100644 index 64d53dc3..00000000 --- a/orx-jvm/orx-keyframer/src/main/kotlin/KeyVector3.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.openrndr.extra.keyframer - -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.easing.EasingFunction -import org.openrndr.math.Vector3 - -class KeyVector3(val time: Double, val value: Vector3, val easing: EasingFunction) - -class KeyframerChannelVector3 { - val keys = mutableListOf() - - operator fun invoke() : Double { - return 0.0 - } - - fun add(time: Double, value: Vector3?, easing: EasingFunction = Easing.Linear.function) { - value?.let { - keys.add(KeyVector3(time, it, easing)) - } - } - - fun lastValue(): Vector3? { - return keys.lastOrNull()?.value - } - - fun duration(): Double { - return keys.last().time - } - - fun value(time: Double): Vector3? { - if (keys.size == 0) { - return null - } - if (keys.size == 1) { - return if (time < keys.first().time) { - null - } else { - keys[0].value - } - } - - if (time < keys.first().time) { - return null - } - - val rightIndex = keys.indexOfFirst { it.time > time } - return if (rightIndex == -1) { - keys.last().value - } else { - val leftIndex = (rightIndex - 1).coerceAtLeast(0) - val rightKey = keys[rightIndex] - val leftKey = keys[leftIndex] - val t0 = (time - leftKey.time) / (rightKey.time - leftKey.time) - val e0 = rightKey.easing(t0, 0.0, 1.0, 1.0) - leftKey.value * (1.0 - e0) + rightKey.value * (e0) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/main/kotlin/Keyframer.kt b/orx-jvm/orx-keyframer/src/main/kotlin/Keyframer.kt deleted file mode 100644 index 541e10a7..00000000 --- a/orx-jvm/orx-keyframer/src/main/kotlin/Keyframer.kt +++ /dev/null @@ -1,468 +0,0 @@ -package org.openrndr.extra.keyframer - -import com.google.gson.Gson -import com.google.gson.JsonSyntaxException -import com.google.gson.reflect.TypeToken -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.easing.EasingFunction -import org.openrndr.extra.expressions.ExpressionException -import org.openrndr.extra.expressions.FunctionExtensions -import org.openrndr.extra.expressions.evaluateExpression -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import java.io.File -import java.lang.IllegalStateException -import java.lang.NullPointerException -import java.net.URL -import kotlin.math.max -import kotlin.reflect.KProperty -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.memberProperties -import kotlin.reflect.jvm.isAccessible - -enum class KeyframerFormat { - SIMPLE, - FULL -} - -open class Keyframer { - private var currentTime = 0.0 - operator fun invoke(time: Double) { - currentTime = time - } - - open inner class CompoundChannel(val keys: Array, private val defaultValues: Array) { - private var channelTimes: Array = Array(keys.size) { Double.NEGATIVE_INFINITY } - private var compoundChannels: Array = Array(keys.size) { null } - private var cachedValues: Array = Array(keys.size) { null } - - open fun reset() { - for (i in channelTimes.indices) { - channelTimes[i] = Double.NEGATIVE_INFINITY - } - } - - fun getValue(compound: Int): Double { - if (compoundChannels[compound] == null) { - compoundChannels[compound] = channels[keys[compound]] - } - return if (compoundChannels[compound] != null) { - if (channelTimes[compound] == currentTime && cachedValues[compound] != null) { - cachedValues[compound] ?: defaultValues[compound] - } else { - val value = compoundChannels[compound]?.value(currentTime) ?: defaultValues[compound] - cachedValues[compound] = value - value - } - } else { - defaultValues[compound] - } - } - } - - val duration: Double - get() = channels.values.maxByOrNull { it.duration() }?.duration() ?: 0.0 - - - inner class DoubleChannel(key: String, defaultValue: Double = 0.0) : - CompoundChannel(arrayOf(key), arrayOf(defaultValue)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): Double = getValue(0) - } - - inner class Vector2Channel(keys: Array, defaultValue: Vector2 = Vector2.ZERO) : - CompoundChannel(keys, arrayOf(defaultValue.x, defaultValue.y)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): Vector2 = Vector2(getValue(0), getValue(1)) - } - - inner class Vector3Channel(keys: Array, defaultValue: Vector3 = Vector3.ZERO) : - CompoundChannel(keys, arrayOf(defaultValue.x, defaultValue.y, defaultValue.z)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): Vector3 = - Vector3(getValue(0), getValue(1), getValue(2)) - } - - inner class Vector4Channel(keys: Array, defaultValue: Vector4 = Vector4.ZERO) : - CompoundChannel(keys, arrayOf(defaultValue.x, defaultValue.y, defaultValue.z, defaultValue.w)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): Vector4 = - Vector4(getValue(0), getValue(1), getValue(2), getValue(3)) - } - - inner class RGBaChannel(keys: Array, defaultValue: ColorRGBa = ColorRGBa.WHITE) : - CompoundChannel(keys, arrayOf(defaultValue.r, defaultValue.g, defaultValue.b, defaultValue.alpha)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): ColorRGBa = - ColorRGBa(getValue(0), getValue(1), getValue(2), getValue(3)) - } - - inner class RGBChannel(keys: Array, defaultValue: ColorRGBa = ColorRGBa.WHITE) : - CompoundChannel(keys, arrayOf(defaultValue.r, defaultValue.g, defaultValue.b)) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): ColorRGBa = - ColorRGBa(getValue(0), getValue(1), getValue(2)) - } - - inner class DoubleArrayChannel(keys: Array, defaultValue: DoubleArray = DoubleArray(keys.size)) : - CompoundChannel(keys, defaultValue.toTypedArray()) { - operator fun getValue(keyframer: Keyframer, property: KProperty<*>): DoubleArray { - val result = DoubleArray(keys.size) - for (i in keys.indices) { - result[i] = getValue(i) - } - return result - } - } - - val channels = mutableMapOf() - - fun loadFromJson( - file: File, - format: KeyframerFormat = KeyframerFormat.SIMPLE, - parameters: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY - ) { - require(file.exists()) { - "failed to load keyframer from json: '${file.absolutePath}' does not exist." - } - try { - loadFromJsonString(file.readText(), format, parameters, functions) - } catch (e: ExpressionException) { - throw ExpressionException("Error loading from '${file.path}': ${e.message ?: ""}") - } - } - - fun loadFromJson( - url: URL, - format: KeyframerFormat = KeyframerFormat.SIMPLE, - parameters: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY - ) { - try { - loadFromJsonString(url.readText(), format, parameters, functions) - } catch (e: ExpressionException) { - throw ExpressionException("Error loading $format from '${url}': ${e.message ?: ""}") - } catch (e: IllegalStateException) { - throw ExpressionException("Error loading $format from '${url}': ${e.message ?: ""}") - } - } - - fun loadFromJsonString( - json: String, - format: KeyframerFormat = KeyframerFormat.SIMPLE, - parameters: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY - ) { - when (format) { - KeyframerFormat.SIMPLE -> { - try { - val type = object : TypeToken>>() {}.type - val keys: List> = Gson().fromJson(json, type) - loadFromKeyObjects(keys, parameters, functions) - } catch (e: JsonSyntaxException) { - error("Error parsing simple Keyframer data: ${e.cause?.message}") - } catch (e: NullPointerException) { - error("Error parsing simple Keyframer data: ${e.cause?.message}") - } - } - - KeyframerFormat.FULL -> { - try { - val type = object : TypeToken>() {}.type - val keys: Map = Gson().fromJson(json, type) - loadFromObjects(keys, parameters, functions) - } catch (e: JsonSyntaxException) { - error("Error parsing full Keyframer data: ${e.cause?.message}") - } - } - } - } - - private val parameters = mutableMapOf() - private val prototypes = mutableMapOf>() - - fun loadFromObjects( - dict: Map, - externalParameters: Map = emptyMap(), - functions: FunctionExtensions = FunctionExtensions.EMPTY - ) { - this.parameters.clear() - this.parameters.putAll(externalParameters) - - prototypes.clear() - @Suppress("UNCHECKED_CAST") - (dict["parameters"] as? Map)?.let { lp -> - for (entry in lp) { - this.parameters[entry.key] = try { - when (val candidate = entry.value) { - is Double -> candidate - is String -> evaluateExpression(candidate, parameters, functions) - ?: error("could not evaluate expression: '$candidate'") - - is Int -> candidate.toDouble() - is Float -> candidate.toDouble() - else -> error("unknown type for parameter '${entry.key}'") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in 'parameters': ${e.message ?: ""} ") - } - } - } - this.parameters.putAll(externalParameters) - - @Suppress("UNCHECKED_CAST") - (dict["prototypes"] as? Map>)?.let { - prototypes.putAll(it) - } - - @Suppress("UNCHECKED_CAST") - (dict["keys"] as? List>)?.let { keys -> - loadFromKeyObjects(keys, parameters, functions) - } - } - - private fun resolvePrototype(prototypeNames: String): Map { - val prototypeTokens = prototypeNames.split(" ").map { it.trim() }.filter { it.isNotBlank() } - val prototypeRefs = prototypeTokens.mapNotNull { prototypes[it] } - - val computed = mutableMapOf() - for (ref in prototypeRefs) { - computed.putAll(ref) - } - return computed - } - - fun loadFromKeyObjects( - keys: List>, - externalParameters: Map, - functions: FunctionExtensions - ) { - if (externalParameters !== parameters) { - parameters.clear() - parameters.putAll(externalParameters) - } - - var lastTime = 0.0 - - val channelDelegates = this::class.memberProperties - .mapNotNull { - @Suppress("UNCHECKED_CAST") - it as? KProperty1 - } - .filter { it.isAccessible = true; it.getDelegate(this) is CompoundChannel } - .associate { Pair(it.name, it.getDelegate(this) as CompoundChannel) } - - val channelKeys = channelDelegates.values.flatMap { channel -> - channel.keys.map { it } - }.toSet() - - for (delegate in channelDelegates.values) { - delegate.reset() - } - - val expressionContext = mutableMapOf() - expressionContext.putAll(parameters) - expressionContext["t"] = 0.0 - - fun easingFunctionFromName(easingCandidate: String): EasingFunction { - return when (easingCandidate) { - "linear" -> Easing.Linear.function - "back-in" -> Easing.BackIn.function - "back-out" -> Easing.BackOut.function - "back-in-out" -> Easing.BackInOut.function - "bounce-in" -> Easing.BounceIn.function - "bounce-out" -> Easing.BounceOut.function - "bounce-in-out" -> Easing.BounceInOut.function - "circ-in" -> Easing.CircIn.function - "circ-out" -> Easing.CircOut.function - "circ-in-out" -> Easing.CircInOut.function - "cubic-in" -> Easing.CubicIn.function - "cubic-out" -> Easing.CubicOut.function - "cubic-in-out" -> Easing.CubicInOut.function - "elastic-in" -> Easing.ElasticIn.function - "elastic-out" -> Easing.ElasticInOut.function - "elastic-in-out" -> Easing.ElasticOut.function - "expo-in" -> Easing.ExpoIn.function - "expo-out" -> Easing.ExpoOut.function - "expo-in-out" -> Easing.ExpoInOut.function - "quad-in" -> Easing.QuadIn.function - "quad-out" -> Easing.QuadOut.function - "quad-in-out" -> Easing.QuadInOut.function - "quart-in" -> Easing.QuartIn.function - "quart-out" -> Easing.QuartOut.function - "quart-in-out" -> Easing.QuartInOut.function - "quint-in" -> Easing.QuintIn.function - "quint-out" -> Easing.QuintOut.function - "quint-in-out" -> Easing.QuintInOut.function - "sine-in" -> Easing.SineIn.function - "sine-out" -> Easing.SineOut.function - "sine-in-out" -> Easing.SineInOut.function - "one" -> Easing.One.function - "zero" -> Easing.Zero.function - else -> error("unknown easing name '$easingCandidate'") - } - } - - fun handleKey(key: Map, path: String) { - - val prototype = (key["prototypes"] as? String)?.let { - resolvePrototype(it) - } ?: emptyMap() - - val computed = mutableMapOf() - computed.putAll(prototype) - computed.putAll(key) - - val time = try { - when (val candidate = computed["time"]) { - null -> lastTime - is String -> evaluateExpression(candidate, expressionContext, functions) - ?: error { "unknown value format for time : $candidate" } - - is Double -> candidate - is Int -> candidate.toDouble() - is Float -> candidate.toDouble() - else -> error("unknown time format for '$candidate'") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in $path.'time': ${e.message ?: ""}") - } - - val duration = try { - when (val candidate = computed["duration"]) { - null -> 0.0 - is String -> evaluateExpression(candidate, expressionContext, functions) - ?: error { "unknown value format for time : $candidate" } - - is Int -> candidate.toDouble() - is Float -> candidate.toDouble() - is Double -> candidate - else -> error("unknown duration type for '$candidate") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in $path.'duration': ${e.message ?: ""}") - } - - val easing = try { - when (val easingCandidate = computed["easing"]) { - null -> Easing.Linear.function - is String -> easingFunctionFromName(easingCandidate) - else -> error("unknown easing for '$easingCandidate'") - } - } catch (e: IllegalStateException) { - throw ExpressionException("error in $path.'easing': ${e.message ?: ""}") - } - - val envelope = try { - when (val candidate = computed["envelope"]) { - null -> defaultEnvelope - is DoubleArray -> candidate - is List<*> -> candidate.map { it.toString().toDouble() }.toDoubleArray() - is Array<*> -> candidate.map { it.toString().toDouble() }.toDoubleArray() - else -> error("unknown envelope for '$candidate") - } - } catch (e: IllegalStateException) { - throw ExpressionException("error in $path.'envelope': ${e.message ?: ""}") - } - - - val reservedKeys = setOf("time", "easing", "envelope") - - for (channelCandidate in computed.filter { it.key !in reservedKeys }) { - if (channelCandidate.key in channelKeys) { - val channel = channels.getOrPut(channelCandidate.key) { - KeyframerChannel() - } - - val lastValue = channel.lastValue() ?: 0.0 - expressionContext["v"] = lastValue - - val lastTime = (channel.lastTime()) ?: 0.0 - expressionContext["d"] = time - lastTime - - if (channelCandidate.value is Map<*, *>) { - @Suppress("UNCHECKED_CAST") - val valueMap = channelCandidate.value as Map - - val value = try { - when (val candidate = valueMap["value"]) { - null -> error("no value for '${channelCandidate.key}'") - is Double -> candidate - is String -> evaluateExpression(candidate, expressionContext, functions) - ?: error("unknown value format for key '${channelCandidate.key}' : $candidate") - - is Int -> candidate.toDouble() - else -> error("unknown value type for key '${channelCandidate.key}' : $candidate") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in $path.'${channelCandidate.key}': ${e.message ?: ""}") - } - - val dictEasing = when (val candidate = valueMap["easing"]) { - null -> easing - is String -> easingFunctionFromName(candidate) - else -> error("unknown easing for '$candidate'") - } - - val dictEnvelope = when (val candidate = valueMap["envelope"]) { - null -> envelope - is DoubleArray -> candidate - is List<*> -> candidate.map { it.toString().toDouble() }.toDoubleArray() - is Array<*> -> candidate.map { it.toString().toDouble() }.toDoubleArray() - else -> error("unknown envelope for '$candidate") - - } - val dictDuration = try { - when (val candidate = valueMap["duration"]) { - null -> null - is Double -> candidate - is String -> evaluateExpression(candidate, expressionContext, functions) - ?: error("unknown value format for key '${channelCandidate.key}' : $candidate") - - is Int -> candidate.toDouble() - else -> error("unknown value type for key '${channelCandidate.key}' : $candidate") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in $path.'${channelCandidate.key}': ${e.message ?: ""}") - } - - if (dictDuration != null) { - if (dictDuration <= 0.0) { - channel.add( - max(lastTime, time + dictDuration), - lastValue, - Easing.Linear.function, - defaultEnvelope - ) - channel.add(time, value, dictEasing, dictEnvelope) - } else { - channel.add(time, lastValue, Easing.Linear.function, defaultEnvelope) - channel.add(time + dictDuration, value, dictEasing, dictEnvelope) - } - } else { - channel.add(time, value, dictEasing, dictEnvelope) - } - - } else { - val value = try { - when (val candidate = channelCandidate.value) { - is Double -> candidate - is String -> evaluateExpression(candidate, expressionContext, functions) - ?: error("unknown value format for key '${channelCandidate.key}' : $candidate") - - is Int -> candidate.toDouble() - else -> error("unknown value type for key '${channelCandidate.key}' : $candidate") - } - } catch (e: ExpressionException) { - throw ExpressionException("error in $path.'${channelCandidate.key}': ${e.message ?: ""}") - } - channel.add(time, value, easing, envelope) - } - } - } - lastTime = time + duration - expressionContext["t"] = lastTime - } - - for ((index, key) in keys.withIndex()) { - handleKey(key, "keys[$index]") - } - } -} diff --git a/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerChannel.kt b/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerChannel.kt deleted file mode 100644 index fca59311..00000000 --- a/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerChannel.kt +++ /dev/null @@ -1,37 +0,0 @@ -import org.openrndr.extra.easing.Easing -import org.openrndr.extra.keyframer.KeyframerChannel -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNull - -class TestKeyframerChannel { - @Test - fun `a keyframer channel without keys`() { - val kfc = KeyframerChannel() - assertNull(kfc.value(0.0)) - } - - @Test - fun `a keyframer channel with a single key`() { - val kfc = KeyframerChannel() - - kfc.add(0.0, 1.0, Easing.Linear.function) - val value = kfc.value(0.0) - if (value != null) { - assertEquals(1.0, value, 10E-6) - } - assertNull(kfc.value(-1.0)) - } - - @Test - fun `a keyframer channel with two keys`() { - val kfc = KeyframerChannel() - kfc.add(0.0, 1.0, Easing.Linear.function) - kfc.add(1.0, 2.0, Easing.Linear.function) - val value = kfc.value(0.0) - if (value != null) { - assertEquals(1.0, value, 10E-6) - } - assertNull(kfc.value(-1.0)) - } -} \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerErrors.kt b/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerErrors.kt deleted file mode 100644 index 634ec926..00000000 --- a/orx-jvm/orx-keyframer/src/test/kotlin/TestKeyframerErrors.kt +++ /dev/null @@ -1,100 +0,0 @@ -import org.junit.jupiter.api.assertThrows -import org.openrndr.extra.expressions.ExpressionException -import kotlin.test.Test - -import org.openrndr.extra.keyframer.Keyframer -import org.openrndr.extra.keyframer.KeyframerFormat -import java.io.File -import kotlin.IllegalStateException - -private fun testFile(path: String): File { - val test = File(".") - return if (test.absolutePath.replace("\\","/").endsWith("orx-keyframer/.")) { - File(path) - } else { - File("orx-keyframer/$path") - } -} - -class TestKeyframerErrors { - class Animation : Keyframer() { - val position by Vector2Channel(arrayOf("x", "y")) - } - - @Test - fun `loading a faulty json`() { - val animation = Animation() - val json = """ - """ - assertThrows { - animation.loadFromJsonString(json) - } - } - - @Test - fun `loading a non existing json`() { - val animation = Animation() - - assertThrows { - animation.loadFromJson(testFile("this-does-not-exist")) - } - - } - @Test - fun `loading a json with a faulty time expression (1)`() { - - File(".").apply { - println(this.absolutePath) - } - - - val animation = Animation() - - assertThrows { - animation.loadFromJson( - testFile("src/test/resources/error-reporting/time-01.json"), - format = KeyframerFormat.SIMPLE - ) - } //`with message` "Error loading from '${testName("src/test/resources/error-reporting/time-01.json")}': error in keys[0].'time': parser error in expression: ')('; [line: 1, character: 0 , near: [@0,0:0=')',<21>,1:0] ]" - - } - - // Paths.sep - // - //Expected ,1:0] ]>, - // actual ,1:0] ]>. - - @Test - fun `loading a json with a faulty time expression (2) `() { - val animation = Animation() - assertThrows { - animation.loadFromJson( - testFile("src/test/resources/error-reporting/time-02.json"), - format = KeyframerFormat.SIMPLE - ) - } //`with message` "Error loading from '${testName("src/test/resources/error-reporting/time-02.json")}': error in keys[0].'time': error in evaluation of 'doesNotExist': unresolved variable: 'doesNotExist'" - - } - @Test - fun `loading a json with a non-existing easing`() { - val animation = Animation() - assertThrows { - animation.loadFromJson( - testFile("src/test/resources/error-reporting/easing.json"), - format = KeyframerFormat.SIMPLE - ) - } //`with message` "Error loading from '${testName("src/test/resources/error-reporting/easing.json")}': error in keys[0].'easing': unknown easing name 'garble'" - } - - @Test - fun `loading a json with a faulty value (1)`() { - val animation = Animation() - - assertThrows { - animation.loadFromJson( - testFile("src/test/resources/error-reporting/value-01.json"), - format = KeyframerFormat.SIMPLE - ) - } //`with message` "Error loading from '${testName("src/test/resources/error-reporting/value-01.json")}': error in keys[0].'x': error in evaluation of 'garble': unresolved variable: 'garble'" - } -} diff --git a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/easing.json b/orx-jvm/orx-keyframer/src/test/resources/error-reporting/easing.json deleted file mode 100644 index 4a8f64ca..00000000 --- a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/easing.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "easing": "garble" - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-01.json b/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-01.json deleted file mode 100644 index 15abf1f2..00000000 --- a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-01.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "time": ")(" - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-02.json b/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-02.json deleted file mode 100644 index 5c5c4cdb..00000000 --- a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/time-02.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { - "time": "doesNotExist" - } -] \ No newline at end of file diff --git a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/value-01.json b/orx-jvm/orx-keyframer/src/test/resources/error-reporting/value-01.json deleted file mode 100644 index aae93639..00000000 --- a/orx-jvm/orx-keyframer/src/test/resources/error-reporting/value-01.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "time": "0.0", - "x": "garble", - "y": "garble" - } -] \ No newline at end of file diff --git a/orx-jvm/orx-kinect-common/build.gradle.kts b/orx-jvm/orx-kinect-common/build.gradle.kts deleted file mode 100644 index 84da91a0..00000000 --- a/orx-jvm/orx-kinect-common/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} -dependencies { - api(project(":orx-depth-camera")) - implementation(openrndr.application.core) - implementation(openrndr.math) -} \ No newline at end of file diff --git a/orx-jvm/orx-kinect-common/src/main/kotlin/Kinect.kt b/orx-jvm/orx-kinect-common/src/main/kotlin/Kinect.kt deleted file mode 100644 index 53ddea81..00000000 --- a/orx-jvm/orx-kinect-common/src/main/kotlin/Kinect.kt +++ /dev/null @@ -1,140 +0,0 @@ -package org.openrndr.extra.kinect - -import org.openrndr.draw.* -import org.openrndr.extra.depth.camera.DepthCamera -import org.openrndr.math.IntVector2 -import org.openrndr.resourceUrl -import java.lang.RuntimeException -import java.net.URL -import java.nio.ByteBuffer -import java.nio.ByteOrder -import kotlin.reflect.KClass - -/** - * Represents all the accessible kinects handled by a specific driver (V1, V2, etc.). - */ -interface Kinect { - - /** - * Lists available kinect devices. - */ - fun listDevices(): List - - /** - * Opens kinect device of a given index. - * - * @param index the kinect device index (starts with 0). If no value specified, - * it will default to 0. - * @throws KinectException if device of such an index does not exist, - * or it was already started. - * @see listDevices - */ - fun openDevice(index: Int = 0): Device - - /** - * Opens kinect device of a given serial number. - * - * @param serialNumber the kinect device serialNumber. - * @throws KinectException if device of such a serial number does not exist - * , or it was already started. - * @see listDevices - */ - fun openDevice(serialNumber: String): Device - - /** - * The list of kinect devices which are already opened and haven't been closed. - */ - val activeDevices: List - - /** - * Represents physical kinect device. - */ - interface Device { - - /** - * Provides information about kinect device. - * - * Note: in implementation it can be extended with any - * additional information next to the serial number. - */ - interface Info { - val serialNumber: String - } - - val info: Info - - val depthCamera: KinectDepthCamera - - fun close() - - } - -} - -/** - * Generic interface for all the kinect cameras. - */ -interface KinectCamera { - - var enabled: Boolean - -} - -interface KinectDepthCamera : KinectCamera, DepthCamera { - /* no special attributes at the moment */ -} - -open class KinectException(msg: String) : RuntimeException(msg) - -fun kinectRawDepthByteBuffer(resolution: IntVector2): ByteBuffer = - ByteBuffer.allocateDirect( - resolution.x * resolution.y * 2 - ).also { - it.order(ByteOrder.nativeOrder()) - } - -fun KClass.filterFrom(resource: String, flipH: Boolean, flipV: Boolean): Filter { - val url = resourceUrl(resource, this) - val preamble = - (if (flipH) "#define KINECT_FLIPH\n" else "") + - (if (flipV) "#define KINECT_FLIPV\n" else "") - return Filter( - filterShaderFromCode( - "$preamble\n${URL(url).readText()}", - "kinect-shader: $url + flipH: $flipH, flipV: $flipV" - ) - ) -} - -class KinectDepthMappers(resource: String, `class`: KClass) { - - private val flipHFalseVFalse = `class`.filterFrom(resource, flipH = false, flipV = false) - private val flipHFalseVTrue = `class`.filterFrom(resource, flipH = false, flipV = true) - private val flipHTrueVFalse = `class`.filterFrom(resource, flipH = true, flipV = false) - private val flipHTrueVTrue = `class`.filterFrom(resource, flipH = true, flipV = true) - - fun select(flipH: Boolean, flipV: Boolean): Filter = - if (flipH) { - if (flipV) flipHTrueVTrue - else flipHTrueVFalse - } else { - if (flipV) flipHFalseVTrue - else flipHFalseVFalse - } - - fun update(resolution: IntVector2) { - val resolutionXMinus1 = resolution.x - 1 - flipHTrueVFalse.parameters["resolutionXMinus1"] = resolutionXMinus1 - flipHTrueVTrue.parameters["resolutionXMinus1"] = resolutionXMinus1 - } - - fun forEach(block: (filter: Filter) -> Unit) { - block(flipHFalseVFalse) - block(flipHFalseVTrue) - block(flipHTrueVFalse) - block(flipHTrueVTrue) - } - -} - -fun depthToRawNormalizedMappers() = KinectDepthMappers("depth-to-raw-normalized.frag", Kinect::class) diff --git a/orx-jvm/orx-kinect-common/src/main/resources/org/openrndr/extra/kinect/depth-to-raw-normalized.frag b/orx-jvm/orx-kinect-common/src/main/resources/org/openrndr/extra/kinect/depth-to-raw-normalized.frag deleted file mode 100644 index 025ae902..00000000 --- a/orx-jvm/orx-kinect-common/src/main/resources/org/openrndr/extra/kinect/depth-to-raw-normalized.frag +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef KINECT_FLIPV -layout(origin_upper_left) in vec4 gl_FragCoord; -#endif - -uniform usampler2D tex0; // kinect raw -uniform float maxDepthValue; -#ifdef KINECT_FLIPH -uniform int resolutionXMinus1; -#endif -out float outDepth; // measured in meters - -void main() { - ivec2 uv = ivec2(gl_FragCoord); - #ifdef KINECT_FLIPH - uv = ivec2(resolutionXMinus1 - uv.x, uv.y); - #endif - uint uintDepth = texelFetch(tex0, uv, 0).r; - outDepth = float(uintDepth) / maxDepthValue; -} diff --git a/orx-jvm/orx-kinect-v1-demo/build.gradle.kts b/orx-jvm/orx-kinect-v1-demo/build.gradle.kts deleted file mode 100644 index d566af50..00000000 --- a/orx-jvm/orx-kinect-v1-demo/build.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(project(":orx-jvm:orx-kinect-v1")) - implementation(project(":orx-jvm:orx-depth-camera-calibrator")) - implementation(project(":orx-fx")) - implementation(project(":orx-jvm:orx-gui")) - runtimeOnly(project(":orx-jvm:orx-kinect-v1")) - runtimeOnly(openrndr.application.glfw) -} \ No newline at end of file diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo01BasicUseCase.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo01BasicUseCase.kt deleted file mode 100644 index a90dd0b9..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo01BasicUseCase.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * Basic kinect1 use case showing continuous stream from the depth camera. - * - * Note: kinect depth map is stored only on the RED color channel to save - * space. Therefore depth map is displayed only in the red tones. - */ -fun main() = application { - configure { // default resolution of the Kinect v1 depth camera - width = 640 - height = 480 - } - program { - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - device.depthCamera.flipH = true // to make a mirror - device.depthCamera.enabled = true - extend { - drawer.image(device.depthCamera.currentFrame) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo02MotionCaptureUseCase.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo02MotionCaptureUseCase.kt deleted file mode 100644 index 95308cdc..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo02MotionCaptureUseCase.kt +++ /dev/null @@ -1,111 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.depth.camera.DepthMeasurement -import org.openrndr.extra.fx.colormap.TurboColormap -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.kinect.v1.Kinect1 -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.extra.parameters.DoubleParameter - -/** - * A use case where "virtual walls" can be established within certain - * depth ranges. Useful for actual installations, like interactive - * projections in the form of a "mirror" for the human silhouette. - * The measurement in meters helps in calibration. - */ -fun main() = application { - configure { // default resolution of the Kinect v1 depth camera - width = 640 - height = 480 - } - program { - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - val camera = device.depthCamera - camera.flipH = true // to make a mirror - camera.depthMeasurement = DepthMeasurement.METERS - val turboColormap = TurboColormap().apply { - minValue = .5 - maxValue = 5.0 - curve = 1.0 - } - val outputBuffer = colorBuffer( - camera.resolution.x, - camera.resolution.y - ) - - /* - * Note: the code specified in onFrameReceived will be executed as soon as - * possible, also when GPU is idle. - * - * Also TurboColormap filter will be applied only after actual new frame - * from kinect is received instead of being applied for each - * program frame. Kinect has different refresh rate (30 fps) than usual - * display. - */ - camera.onFrameReceived { frame -> - turboColormap.apply(frame, outputBuffer) - } - camera.enabled = true - - @Suppress("unused") - val settings = object { - - @BooleanParameter(label = "enabled", order = 0) - var enabled: Boolean - get() = camera.enabled - set(value) { - camera.enabled = value - } - - @BooleanParameter(label = "flipH", order = 1) - var flipH: Boolean - get() = camera.flipH - set(value) { - camera.flipH = value - } - - @BooleanParameter(label = "flipV", order = 2) - var flipV: Boolean - get() = camera.flipV - set(value) { - camera.flipV = value - } - - /* - Note: we could use turboColormap parameters directly in the GUI, however the - high range is cap to 1.0 there, and we want to use calibration in meters. - Increase 5.0 to something higher if you are calibrating for a bigger space. - */ - @DoubleParameter(label = "min distance", order = 3, low = 0.2, high = 5.0) - var minDistance: Double - get() = turboColormap.minValue - set(value) { - turboColormap.minValue = value - } - - @DoubleParameter(label = "max distance", order = 4, low = 0.2, high = 5.0) - var maxDistance: Double - get() = turboColormap.maxValue - set(value) { turboColormap.maxValue = value } - - @DoubleParameter(label = "distance curve", order = 5, low = 0.01, high = 10.0) - var curve: Double - get() = turboColormap.curve - set(value) { - turboColormap.curve = value - } - - } - extend(GUI()) { - persistState = false - compartmentsCollapsedByDefault = false - add(settings, label = "depth camera") - } - extend { - drawer.image(outputBuffer) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo03DepthToColorMaps.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo03DepthToColorMaps.kt deleted file mode 100644 index 888fe6a6..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo03DepthToColorMaps.kt +++ /dev/null @@ -1,93 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.draw.ColorFormat -import org.openrndr.draw.colorBuffer -import org.openrndr.extra.fx.colormap.GrayscaleColormap -import org.openrndr.extra.fx.colormap.SpectralZucconiColormap -import org.openrndr.extra.fx.colormap.TurboColormap -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.kinect.v1.Kinect1 -import org.openrndr.extra.parameters.BooleanParameter -import org.openrndr.math.Vector2 - -/** - * Shows 4 different color representations of the depth map: - * - * * the original depth map stored as RED channel values - * * the same values expressed as gray tones - * * zucconi6 color map according to natural light dispersion as described - * by Alan Zucconi in - * [Improving the Rainbow](https://www.alanzucconi.com/2017/07/15/improving-the-rainbow/) - * article - * * turbo color map according to - * [Turbo, An Improved Rainbow Colormap for Visualization](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html) - * by Google. - * - * Note: the values are normalized in range 0-1, not in meters. - * @see GrayscaleColormap - * @see SpectralZucconiColormap - * @see TurboColormap - */ -fun main() = application { - val guiOffset = 200 - configure { - width = 2 * 640 + guiOffset - height = 2 * 480 - } - program { - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - val camera = device.depthCamera - fun outputBuffer() = colorBuffer( - camera.resolution.x, - camera.resolution.y, - format = ColorFormat.RGB - ) - val grayscaleColormap = GrayscaleColormap() - val spectralZucconiColormap = SpectralZucconiColormap() - val turboColormap = TurboColormap() - val grayscaleBuffer = outputBuffer() - val zucconiBuffer = outputBuffer() - val turboBuffer = outputBuffer() - @Suppress("unused") - val settings = object { - - @BooleanParameter(label = "enabled", order = 0) - var enabled: Boolean - get() = camera.enabled - set(value) { camera.enabled = value } - - @BooleanParameter(label = "flipH", order = 1) - var flipH: Boolean - get() = camera.flipH - set(value) { camera.flipH = value } - - @BooleanParameter(label = "flipV", order = 2) - var flipV: Boolean - get() = camera.flipV - set(value) { camera.flipV = value } - - } - camera.onFrameReceived { frame -> - grayscaleColormap.apply(frame, grayscaleBuffer) - spectralZucconiColormap.apply(frame, zucconiBuffer) - turboColormap.apply(frame, turboBuffer) - } - camera.enabled = true - extend(GUI()) { - persistState = false - compartmentsCollapsedByDefault = false - add(settings, label = "depth camera") - add(grayscaleColormap) - add(spectralZucconiColormap) - add(turboColormap) - } - extend { - drawer.image(camera.currentFrame, guiOffset.toDouble(), 0.0) - drawer.image(grayscaleBuffer, guiOffset + camera.resolution.x.toDouble(), 0.0) - drawer.image(turboBuffer, guiOffset.toDouble(), camera.resolution.y.toDouble()) - drawer.image(zucconiBuffer, Vector2(guiOffset.toDouble(), 0.0) + camera.resolution.vector2) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo04SwitchOffLed.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo04SwitchOffLed.kt deleted file mode 100644 index 9eff2b41..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo04SwitchOffLed.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.bytedeco.libfreenect.global.freenect -import org.openrndr.application -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * This demo shows how to execute freenect commands directly, either globally - * or on the device. In this case demo is switching off LED light completely, - * which might be desirable for the aesthetics of an installation, - * however LED turned on might be still a useful indicator during development. - */ -fun main() = application { - configure { // default resolution of the Kinect v1 depth camera - width = 640 - height = 480 - } - program { - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - device.executeInFreenectDeviceContext( - "turn off led" - ) { _, _, dev -> - freenect.freenect_set_led(dev, freenect.LED_OFF) - } - device.depthCamera.enabled = true - extend { - drawer.image(device.depthCamera.currentFrame) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo05MultipleDevices.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo05MultipleDevices.kt deleted file mode 100644 index 0efea25f..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo05MultipleDevices.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * Render depth data from 2 kinect1 devices side-by-side. - */ -fun main() = application { - configure { - width = 640 * 2 - height = 480 - } - program { - val kinect = extend(Kinect1()) - /* - on production system you might consider using stable kinect serial numbers, - instead of index numbers, to avoid reordering of devices already installed - in physical space. - */ - val depthCamera1 = kinect.openDevice(0).depthCamera - val depthCamera2 = kinect.openDevice(1).depthCamera - depthCamera1.enabled = true - depthCamera1.flipH = true - depthCamera2.enabled = true - depthCamera2.flipH = true - extend { - drawer.image(depthCamera1.currentFrame) - drawer.image(depthCamera2.currentFrame, depthCamera1.resolution.x.toDouble(), 0.0) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo07NativeFreenectCommands.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo07NativeFreenectCommands.kt deleted file mode 100644 index 432281b0..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo07NativeFreenectCommands.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.bytedeco.libfreenect.global.freenect -import org.bytedeco.libfreenect.global.freenect.* -import org.openrndr.application -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * Even though this library is abstracting freenect access, it is still - * possible to call any low level kinect API through execute methods. - * The calls are executed in separate kinect runner thread but they will - * block the calling thread until the result is returned. - */ -fun main() = application { - program { - val kinect = extend(Kinect1()) - /* - Blocking version will wait for the result, specifying the name - makes it easier to identify this call in logs when it is finally - executed on kinect. Note: enabling TRACE log level is required. - */ - val numberOfKinectDevices = kinect.executeInFreenectContextBlocking( - name = "numberOfKinectDevices" - ) { ctx, _ -> - freenect.freenect_num_devices(ctx) - } - println("numberOfKinectDevices: $numberOfKinectDevices") - val device = kinect.openDevice() - val maxTilt = 90.0 - var tilt = 0.0 - extend { - device.executeInFreenectDeviceContext("disco LED") { _, _, dev -> - freenect_set_led(dev, (seconds * 10).toInt() % 7) // disco - } - val newTilt = if ((seconds % 10) < 5) -maxTilt else maxTilt - if (tilt != newTilt) { - device.executeInFreenectDeviceContext("tilt change") { _, _, dev -> - freenect_set_tilt_degs(dev, tilt) - } - tilt = newTilt - } - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo08LogLevelFlood.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo08LogLevelFlood.kt deleted file mode 100644 index 48940cbe..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo08LogLevelFlood.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * Here you can see freenect FLOOD log level in action. - * - * Note: technically it would be possible to redirect kinect log to - * slf4j logger in the implementation of [Kinect1], however I removed - * this callback and left logs on the standard out, because it might get so noisy, - * that native-to-JVM round trip with conversion into [String] for JVM - * logging might completely kill the performance and result in - * stack overflow exception. - */ -fun main() = application { - configure { // default resolution of the Kinect v1 depth camera - width = 640 - height = 480 - } - program { - val kinect = extend(Kinect1()) - kinect.logLevel = Kinect1.LogLevel.FLOOD - val device = kinect.openDevice() - device.depthCamera.enabled = true - extend { - drawer.image(device.depthCamera.currentFrame) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo09RawDepthProcessing.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo09RawDepthProcessing.kt deleted file mode 100644 index a214e172..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo09RawDepthProcessing.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.application -import org.openrndr.draw.Filter -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.depth.camera.DepthMeasurement -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * It is possible to rewrite raw kinect value interpretation completely - * while keeping all the performance characteristics. - * - * Note: when depth measurement is set to RAW, the flip options does not apply. - */ -fun main() = application { - configure { // default resolution of the Kinect v1 depth camera - width = 640 - height = 480 - } - program { - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - val camera = device.depthCamera - camera.depthMeasurement = DepthMeasurement.RAW - val outputBuffer = colorBuffer(camera.resolution.x, camera.resolution.y) - val filter = Filter(filterShaderFromCode(""" - layout(origin_upper_left) in vec4 gl_FragCoord; - uniform usampler2D tex0; // kinect raw - out vec4 o_color; - - void main() { - ivec2 uv = ivec2(gl_FragCoord); - uint uintDepth = texelFetch(tex0, uv, 0).r; - float depth = float(uintDepth) / 2047.; - o_color = vec4(vec3(depth), 1.); - } - """.trimIndent(), - "raw filter") - ) - camera.onFrameReceived { frame -> - filter.apply(frame, outputBuffer) - } - device.depthCamera.enabled = true - extend { - drawer.image(outputBuffer) - } - } -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo10DepthCameraCalibration.kt b/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo10DepthCameraCalibration.kt deleted file mode 100644 index 25fa68e8..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/kotlin/Kinect1Demo10DepthCameraCalibration.kt +++ /dev/null @@ -1,117 +0,0 @@ -package org.openrndr.extra.kinect.v1.demo - -import org.openrndr.Fullscreen -import org.openrndr.application -import org.openrndr.draw.Filter -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.filterShaderFromCode -import org.openrndr.extra.depth.camera.DepthMeasurement -import org.openrndr.extra.depth.camera.calibrator.DepthCameraCalibrator -import org.openrndr.extra.depth.camera.calibrator.isolatedWithCalibration -import org.openrndr.extra.gui.GUI -import org.openrndr.extra.kinect.v1.Kinect1 - -/** - * How to use [DepthCameraCalibrator] with [Kinect1]? - */ -fun main() = application { - configure { - fullscreen = Fullscreen.CURRENT_DISPLAY_MODE - } - program { - - val kinect = extend(Kinect1()) - val device = kinect.openDevice() - val camera = device.depthCamera - // depth measurement in meters is required by the calibrator - camera.depthMeasurement = DepthMeasurement.METERS - val kinectResolution = camera.resolution - - val outputBuffer = colorBuffer( - kinectResolution.x, - kinectResolution.y - ) - - // simple visual effect applied to kinect data - val spaceRangeExtractor = SpaceRangeExtractor() - camera.onFrameReceived { frame -> - spaceRangeExtractor.apply(frame, outputBuffer) - } - val calibrator = DepthCameraCalibrator(this, camera) - - val gui = GUI() - calibrator.addControlsTo(gui) - - /* - Note: remember that extend(gui) has to be called after all the parameter - controls are added. - - Also extensions are rendered in reverse order, if we start with gui, - it will not be covered by calibrator view when calibrator is enabled - */ - extend(gui) - - /* - if it's an interactive installation, probably we don't want to - show GUI on startup. It can be shown by pressing F11. - */ - gui.visible = false - - /* - Registering this callback here after gui will prevent it from - being triggered multiple times when GUI parameters are restored - on startup. - */ - calibrator.onCalibrationChange { calibration -> - spaceRangeExtractor.minDepth = calibration.minDepth - spaceRangeExtractor.maxDepth = calibration.maxDepth - } - extend(calibrator) - camera.enabled = true - - extend { - val calibration = calibrator.getCalibration(camera) - drawer.isolatedWithCalibration(calibration) { - image( - colorBuffer = outputBuffer, - position = calibration.position, - width = calibration.width, - height = calibration.height - ) - } - } - - // switching calibrator view on and off with keyboard - program.keyboard.keyDown.listen { - if (it.name == "k") { - calibrator.enabled = !calibrator.enabled - } - } - - } - -} - -/** - * A visual effect applied to kinect data in this demonstration. - * Everything is black, except for the white pixels within the range - * of 2 virtual walls positioned at [minDepth] at front of the - * viewer and [maxDepth] behind the viewer. - */ -class SpaceRangeExtractor : Filter(filterShaderFromCode(""" - uniform sampler2D tex0; // kinect raw - uniform float minDepth; - uniform float maxDepth; - out vec4 o_color; - void main() { - ivec2 uv = ivec2(gl_FragCoord.xy); - float depth = texelFetch(tex0, uv, 0).r; - float luma = ((depth >= minDepth) && (depth <= maxDepth)) ? 1.0 : 0.0; - o_color = vec4(vec3(luma), 1.0); - } - """.trimIndent(), - "space range extractor" -)) { - var minDepth: Double by parameters - var maxDepth: Double by parameters -} diff --git a/orx-jvm/orx-kinect-v1-demo/src/main/resources/logback.xml b/orx-jvm/orx-kinect-v1-demo/src/main/resources/logback.xml deleted file mode 100644 index 3d7044e6..00000000 --- a/orx-jvm/orx-kinect-v1-demo/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - true - - - - %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - diff --git a/orx-jvm/orx-kinect-v1/README.md b/orx-jvm/orx-kinect-v1/README.md deleted file mode 100644 index ab692097..00000000 --- a/orx-jvm/orx-kinect-v1/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# orx-kinect-v1 - -Support for the Kinect V1 RGB and depth cameras. - -If using Linux, add the [udev rules](https://github.com/OpenKinect/libfreenect/tree/master/platform/linux/udev) to be able to access the camera without being a root user. - -## Example usage - -```kotlin -fun main() = application { - configure { - fullscreen = Fullscreen.CURRENT_DISPLAY_MODE - } - program { - val kinects = getKinectsV1() - val kinect = kinects.startDevice() - kinect.depthCamera.enabled = true - kinect.depthCamera.mirror = true - extend(kinect) - extend { - drawer.image(kinect.depthCamera.currentFrame) - } - } -} -``` diff --git a/orx-jvm/orx-kinect-v1/build.gradle.kts b/orx-jvm/orx-kinect-v1/build.gradle.kts deleted file mode 100644 index 4f80a155..00000000 --- a/orx-jvm/orx-kinect-v1/build.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ - -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") - id("org.openrndr.extra.convention.variant") -} -variants { - val nativeLibs = listOf(libs.libfreenect, sharedLibs.javacpp) - - val platforms = listOf( - Triple(OperatingSystemFamily.WINDOWS, MachineArchitecture.X86_64, "windows-x86_64"), - Triple(OperatingSystemFamily.MACOS, MachineArchitecture.X86_64, "macosx-x86_64"), - Triple(OperatingSystemFamily.LINUX, MachineArchitecture.X86_64, "linux-x86_64"), - Triple(OperatingSystemFamily.LINUX, MachineArchitecture.ARM64, "linux-arm64"), - ) - - for ((os, arch, classifier) in platforms) { - platform(os, arch) { - dependencies { - nativeLibs.forEach { - runtimeOnly(it.get().withClassifier(classifier)) - } - } - } - } -} -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) - api(project(":orx-jvm:orx-kinect-common")) - api(libs.libfreenect) -} \ No newline at end of file diff --git a/orx-jvm/orx-kinect-v1/src/main/kotlin/Kinect1.kt b/orx-jvm/orx-kinect-v1/src/main/kotlin/Kinect1.kt deleted file mode 100644 index 482a456c..00000000 --- a/orx-jvm/orx-kinect-v1/src/main/kotlin/Kinect1.kt +++ /dev/null @@ -1,571 +0,0 @@ -package org.openrndr.extra.kinect.v1 - -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.* -import org.bytedeco.javacpp.Pointer -import org.bytedeco.libfreenect.* -import org.bytedeco.libfreenect.global.freenect.* -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.draw.* -import org.openrndr.extra.depth.camera.DepthMeasurement -import org.openrndr.extra.kinect.* -import org.openrndr.launch -import org.openrndr.math.IntVector2 -import java.util.* -import java.util.concurrent.* -import kotlin.concurrent.thread - -class Kinect1Exception(msg: String) : KinectException(msg) - -class Kinect1 : Kinect, Extension { - - override var enabled: Boolean = true - - /** - * Without the delay between starting depth camera and - * registering depth callback, no frames are transferred - * at all. However this problem happens only on the first - * try with freshly connected kinect. - * Subsequent runs of the same program don't require - * this delay at all. - */ - private var cameraInitializationDelay: Long = 100 - - class DeviceInfo( - override val serialNumber: String, - ) : Kinect.Device.Info { - override fun toString(): String { - return "Kinect1[$serialNumber]" - } - } - - /** - * Log level for native freenect logging. - * - * Note: logs will appear on standard out for performance reasons. - * - * @param code the code of corresponding freenect log level. - * @see Kinect1.logLevel - */ - @Suppress("unused") - enum class LogLevel(val code: Int) { - - /** Crashing/non-recoverable errors. */ - FATAL(FREENECT_LOG_FATAL), - - /** Major errors. */ - ERROR(FREENECT_LOG_ERROR), - - /** Warning messages. */ - WARNING(FREENECT_LOG_WARNING), - - /** Important messages. */ - NOTICE(FREENECT_LOG_NOTICE), - - /** Log for normal messages. */ - INFO(FREENECT_LOG_INFO), - - /** Log for useful development messages. */ - DEBUG(FREENECT_LOG_DEBUG), - - /** Log for slightly less useful messages. */ - SPEW(FREENECT_LOG_SPEW), - - /** Log EVERYTHING. May slow performance. */ - FLOOD(FREENECT_LOG_FLOOD); - - } - - /** - * Kinect native log level, defaults to `INFO`. - */ - var logLevel: LogLevel - get() = freenect.logLevel - set(value) { - freenect.logLevel = value - } - - private val logger = KotlinLogging.logger {} - - private lateinit var program: Program - - private lateinit var freenect: Freenect - - override fun setup(program: Program) { - if (!enabled) { - return - } - logger.info { "Starting Kinect1 support" } - this.program = program - freenect = Freenect(initialLogLevel = LogLevel.INFO) - } - - override fun listDevices(): List = freenect.callBlocking( - "listDevices" - ) { _, _ -> - freenect.listDevices() - } - - override fun openDevice(index: Int): V1Device { - val result = freenect.callBlocking("openDeviceByIndex") { ctx, _ -> - val devices = freenect.listDevices() - if (devices.isEmpty()) { - throw KinectException("No kinect devices detected, cannot open any") - } else if (index >= devices.size) { - throw KinectException("Invalid device index, number of kinect1 devices: ${devices.size}") - } - Pair( - openFreenectDevice( - ctx, - devices[index].serialNumber - ), - devices[index] - ) - } - val device = V1Device(result.first, result.second) - mutableActiveDevices.add(device) - return device - } - - override fun openDevice(serialNumber: String): V1Device { - val dev = freenect.callBlocking("openDeviceBySerial") { ctx, _ -> - openFreenectDevice(ctx, serialNumber) - } - val device = V1Device(dev, DeviceInfo(serialNumber)) - mutableActiveDevices.add(device) - return device - } - - private val mutableActiveDevices = LinkedList() - - override val activeDevices: List - get() = mutableActiveDevices - - private fun openFreenectDevice( - ctx: freenect_context, - serialNumber: String, - ): freenect_device { - val dev = freenect_device() - freenect.checkReturn( - freenect_open_device_by_camera_serial(ctx, dev, serialNumber) - ) - return dev - } - - override fun shutdown(program: Program) { - if (!enabled) { - return - } - logger.info { "Shutting down Kinect1 support" } - logger.debug { "Closing active devices, count: ${mutableActiveDevices.size}" } - mutableActiveDevices.forEach { - it.close() - } - mutableActiveDevices.clear() - freenect.close() - } - - @Suppress("unused") - fun executeInFreenectContext( - name: String, - block: (ctx: freenect_context, usbCtx: freenect_usb_context) -> Unit - ) { - freenect.call(name) { ctx, usbCtx -> - block(ctx, usbCtx) - } - } - - fun executeInFreenectContextBlocking( - name: String, - block: (ctx: freenect_context, usbCtx: freenect_usb_context) -> T - ): T = freenect.callBlocking(name) { ctx, usbCtx -> - block(ctx, usbCtx) - } - - inner class V1Device( - private val dev: freenect_device, - override val info: DeviceInfo - ) : Kinect.Device { - - inner class V1DepthCamera( - override val resolution: IntVector2, - ) : KinectDepthCamera { - - private var firstStart = true - private var started = false - - private var bytesFront = kinectRawDepthByteBuffer(resolution) - private var bytesBack = kinectRawDepthByteBuffer(resolution) - private val bytesFlow = MutableStateFlow(bytesBack) // the first frame will come from bytesFront - - private val rawBuffer = colorBuffer( - resolution.x, - resolution.y, - format = ColorFormat.R, - type = ColorType.UINT16_INT - ).also { - it.filter(MinifyingFilter.NEAREST, MagnifyingFilter.NEAREST) - } - - private val processedFrameBuffer = colorBuffer( - resolution.x, - resolution.y, - format = ColorFormat.R, - type = ColorType.FLOAT16 // in the future we might want to choose the precision here - ).also { - it.filter(MinifyingFilter.LINEAR, MagnifyingFilter.LINEAR) - } - - private var mutableCurrentFrame = processedFrameBuffer - - private val depthMappers = Kinect1DepthMappers().apply { - update(resolution) - } - - override val currentFrame get() = mutableCurrentFrame - - private var onFrameReceived: (frame: ColorBuffer) -> Unit = {} - - // working on rendering thread - private val frameReceiverJob: Job = program.launch { - bytesFlow.collect { bytes -> - rawBuffer.write(bytes) - depthMappers.mapper?.apply(rawBuffer, processedFrameBuffer) - onFrameReceived(mutableCurrentFrame) - } - } - - private val freenectDepthCallback = object : freenect_depth_cb() { - override fun call( - dev: freenect_device, - depth: Pointer, - timestamp: Int - ) { - bytesFlow.tryEmit(bytesFront) - val bytesTmp = bytesBack - bytesBack = bytesFront - bytesFront = bytesTmp - freenect.checkReturn( - freenect_set_depth_buffer(dev, Pointer(bytesFront)) - ) - } - } - - override var enabled: Boolean = false - set(value) { - logger.debug { "$info.enabled = $value" } - if (value == field) { - logger.debug { "$info.enabled: doing nothing, already in state: $value" } - return - } - field = value - freenect.call("$info.enabled = $value") { _, _ -> - if (value) start() else stop() - } - } - - override var depthMeasurement: DepthMeasurement - get() = depthMappers.depthMeasurement - set(value) { - logger.debug { "$info.depthMeasurement = $value" } - depthMappers.depthMeasurement = value - mutableCurrentFrame = - if (value == DepthMeasurement.RAW) rawBuffer - else processedFrameBuffer - } - - override var flipH: Boolean - get() = depthMappers.flipH - set(value) { - logger.debug { "$info.flipH = $value" } - depthMappers.flipH = value - } - - override var flipV: Boolean - get() = depthMappers.flipV - set(value) { - logger.debug { "$info.flipV = $value" } - depthMappers.flipV = value - } - - private fun start() { - logger.info { "$info.start()" } - freenect.checkReturn( - freenect_set_depth_mode( - dev, freenect_find_depth_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_DEPTH_11BIT) - ) - ) - freenect.checkReturn(freenect_set_depth_buffer(dev, Pointer(bytesFront))) - freenect.checkReturn(freenect_start_depth(dev)) - if (firstStart) { // workaround, see comments above - Thread.sleep(cameraInitializationDelay) - firstStart = false - } - freenect_set_depth_callback(dev, freenectDepthCallback) - started = true - freenect.expectingEvents = true - } - - internal fun stop() { - logger.info { "$info.stop()" } - if (started) { - freenect.expectingEvents = false - freenect.checkReturn(freenect_stop_depth(dev)) - started = false - } else { - logger.warn { "$info.stop(): cannot stop already stopped depth camera" } - } - } - - internal fun close() { - frameReceiverJob.cancel() - } - - override fun onFrameReceived(block: (frame: ColorBuffer) -> Unit) { - onFrameReceived = block - } - - } - - override val depthCamera: V1DepthCamera = V1DepthCamera( - resolution = KINECT1_DEPTH_RESOLUTION - ) - - fun executeInFreenectDeviceContext( - name: String, - block: (ctx: freenect_context, usbCtx: freenect_usb_context, dev: freenect_device) -> Unit - ) { - freenect.call("$info: $name") { ctx, usbCtx -> - block(ctx, usbCtx, dev) - } - } - - @Suppress("unused") - fun executeInFreenectDeviceContextBlocking( - name: String, - block: (ctx: freenect_context, usbCtx: freenect_usb_context, dev: freenect_device) -> T - ): T = freenect.callBlocking("$info: $name") { ctx, usbCtx -> - block(ctx, usbCtx, dev) - } - - override fun close() { - logger.info { "$info.close()" } - freenect.callBlocking("$info.closeDevice") { _, _ -> - depthCamera.stop() - freenect.checkReturn(freenect_close_device(dev)) - mutableActiveDevices.remove(this) - } - depthCamera.close() - } - - } - -} - -/** - * This class provides a low level API for accessing a kinect1 device. - * All the operations are executed in a single thread responsible for calling - * freenect API. - * - * @param initialLogLevel the log level to use when freenect is initialized. - */ -class Freenect(private val initialLogLevel: Kinect1.LogLevel) { - - private val logger = KotlinLogging.logger {} - - var logLevel: Kinect1.LogLevel = initialLogLevel - set(value) { - call("logLevel[$value]") { ctx, _ -> - freenect_set_log_level(ctx, value.code) - } - field = value - } - - internal var expectingEvents: Boolean = false - - private val ctx = freenect_context() - - private val usbCtx = freenect_usb_context() - - private var running: Boolean = true - - private val runner = thread(name = "kinect1", start = true) { - logger.info { "Starting Kinect1 thread" } - checkReturn(freenect_init(ctx, usbCtx)) - freenect_set_log_level(ctx, logLevel.code) - val num = checkReturn(freenect_num_devices(ctx)) - if (num == 0) { - logger.warn { "Could not find any Kinect1 devices, calling openDevice() will throw exception" } - } else { - val devices = listDevices() - logger.info { "Kinect1 detected, device count: ${devices.size}" } - devices.forEachIndexed { index, info -> - logger.info { " |-[$index]: ${info.serialNumber}" } - } - } - - while (running) { - if (expectingEvents) { - val ret = freenect_process_events(ctx) - if (ret != 0) { - logger.error { "freenect_process_events returned non-zero value: $ret" } - } - val tasks = freenectCallQueue.iterator() - for (task in tasks) { - tasks.remove() - task.run() - } - } else { - freenectCallQueue.pollFirst()?.run() - } - } - - checkReturn(freenect_shutdown(ctx)) - } - - private val freenectCallQueue = LinkedBlockingDeque>() - - fun call( - name: String, - block: ( - ctx: freenect_context, - usbCtx: freenect_usb_context - ) -> Unit - ) { - logger.debug { "'$name' requested (non-blocking)" } - val task = FutureTask { - logger.trace { "'$name': started" } - try { - block(ctx, usbCtx) - logger.trace { "'$name': ended" } - } catch (e: Exception) { - logger.error(e) { "'$name': failed" } - } - } - freenectCallQueue.add(task) - } - - fun callBlocking( - name: String, - block: ( - ctx: freenect_context, - usbCtx: freenect_usb_context - ) -> T - ): T { - logger.debug { "'$name' requested (blocking)" } - val task = FutureTask { - logger.trace { "'$name': started" } - try { - val result = block(ctx, usbCtx) - logger.trace { "'$name': ended" } - Result.success(result) - } catch (e: Exception) { - logger.error(e) { "'$name': failed" } - Result.failure(e) - } - } - freenectCallQueue.add(task) - val result = task.get() - logger.trace { "'$name': returned result" } - return result.getOrThrow() - } - - fun listDevices(): List { - val attributes = freenect_device_attributes() - freenect_list_device_attributes(ctx, attributes) - try { - val devices = buildList { - var item: freenect_device_attributes? = - if (attributes.isNull) null - else attributes - while (item != null) { - val serialNumber = item.camera_serial().string - add(Kinect1.DeviceInfo(serialNumber)) - item = item.next() - } - } - return devices - } finally { - if (!attributes.isNull) { - freenect_free_device_attributes(attributes) - } - } - } - - fun close() { - logger.debug { "Closing Kinect1 runner" } - running = false - logger.debug { "Waiting for runner thread to finish" } - runner.join() - } - - fun checkReturn(ret: Int): Int = - if (ret >= 0) ret - else { - throw Kinect1Exception("Freenect error: ret=$ret") - } - -} - -internal const val KINECT1_MAX_DEPTH_VALUE: Double = 2047.0 - -internal val KINECT1_DEPTH_RESOLUTION: IntVector2 = IntVector2(640, 480) - -internal class Kinect1DepthMappers { - - private val depthToRawNormalized = depthToRawNormalizedMappers().apply { - forEach { - it.parameters["maxDepthValue"] = KINECT1_MAX_DEPTH_VALUE - } - } - - private val depthToMeters = KinectDepthMappers( - "kinect1-depth-to-meters.frag", - Kinect1::class - ) - - var depthMeasurement: DepthMeasurement = DepthMeasurement.RAW_NORMALIZED - set(value) { - field = value - selectMapper() - } - - var flipH: Boolean = false - set(value) { - field = value - selectMapper() - } - - var flipV: Boolean = false - set(value) { - field = value - selectMapper() - } - - var mapperState: Filter? = depthToRawNormalized.select( - flipH = false, - flipV = false - ) - val mapper: Filter? get() = mapperState - - fun update(resolution: IntVector2) { - depthToRawNormalized.update(resolution) - depthToMeters.update(resolution) - } - - private fun selectMapper() { - mapperState = when (depthMeasurement) { - DepthMeasurement.RAW -> null - DepthMeasurement.RAW_NORMALIZED -> { - depthToRawNormalized.select(flipH, flipV) - } - - DepthMeasurement.METERS -> { - depthToMeters.select(flipH, flipV) - } - } - } - -} diff --git a/orx-jvm/orx-kinect-v1/src/main/resources/org/openrndr/extra/kinect/v1/kinect1-depth-to-meters.frag b/orx-jvm/orx-kinect-v1/src/main/resources/org/openrndr/extra/kinect/v1/kinect1-depth-to-meters.frag deleted file mode 100644 index 69e27b58..00000000 --- a/orx-jvm/orx-kinect-v1/src/main/resources/org/openrndr/extra/kinect/v1/kinect1-depth-to-meters.frag +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef KINECT_FLIPV -layout(origin_upper_left) in vec4 gl_FragCoord; -#endif - -uniform usampler2D tex0; // kinect raw -#ifdef KINECT_FLIPH -uniform int resolutionXMinus1; -#endif -out float outDepth; // measured in meters - -const uint UINT_MAX_KINECT_DEPTH = 2047u; - -void main() { - ivec2 uv = ivec2(gl_FragCoord); - #ifdef KINECT_FLIPH - uv = ivec2(resolutionXMinus1 - uv.x, uv.y); - #endif - uint uintDepth = texelFetch(tex0, uv, 0).r; - float depth = float(uintDepth); - outDepth = (uintDepth < UINT_MAX_KINECT_DEPTH) - ? 1.0 / (depth * -0.0030711016 + 3.3309495161) - : 0.0; -} diff --git a/orx-jvm/orx-kotlin-parser/build.gradle.kts b/orx-jvm/orx-kotlin-parser/build.gradle.kts deleted file mode 100644 index 3238ea9f..00000000 --- a/orx-jvm/orx-kotlin-parser/build.gradle.kts +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") - antlr -} - -tasks.generateGrammarSource { - maxHeapSize = "64m" - arguments.addAll(listOf("-visitor", "-long-messages")) -} - -dependencies { - antlr(libs.antlr.core) - implementation(libs.antlr.runtime) -} - -tasks.getByName("compileDemoKotlin").dependsOn("generateDemoGrammarSource") -tasks.getByName("compileTestKotlin").dependsOn("generateTestGrammarSource") -tasks.getByName("compileKotlin").dependsOn("generateGrammarSource") -tasks.getByName("sourcesJar").dependsOn("generateGrammarSource") -tasks.named("dokkaGeneratePublicationHtml") { dependsOn("generateGrammarSource") } -tasks.named("dokkaGenerateModuleHtml") { dependsOn("generateGrammarSource") } diff --git a/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinLexer.g4 b/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinLexer.g4 deleted file mode 100755 index d36cdbba..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinLexer.g4 +++ /dev/null @@ -1,527 +0,0 @@ -/** - * Kotlin lexical grammar in ANTLR4 notation - */ - -lexer grammar KotlinLexer; - -import UnicodeClasses; - -// SECTION: lexicalGeneral - -ShebangLine - : '#!' ~[\r\n]* - ; - -DelimitedComment - : '/*' ( DelimitedComment | . )*? '*/' - -> channel(HIDDEN) - ; - -LineComment - : '//' ~[\r\n]* - -> channel(HIDDEN) - ; - -WS - : [\u0020\u0009\u000C] - -> channel(HIDDEN) - ; - -NL: '\n' | '\r' '\n'?; - -fragment Hidden: DelimitedComment | LineComment | WS; - -// SECTION: separatorsAndOperations - -RESERVED: '...'; -DOT: '.'; -COMMA: ','; -LPAREN: '(' -> pushMode(Inside); -RPAREN: ')'; -LSQUARE: '[' -> pushMode(Inside); -RSQUARE: ']'; -LCURL: '{' -> pushMode(DEFAULT_MODE); -/* - * When using another programming language (not Java) to generate a parser, - * please replace this code with the corresponding code of a programming language you are using. - */ -RCURL: '}' { if (!_modeStack.isEmpty()) { popMode(); } }; -MULT: '*'; -MOD: '%'; -DIV: '/'; -ADD: '+'; -SUB: '-'; -INCR: '++'; -DECR: '--'; -CONJ: '&&'; -DISJ: '||'; -EXCL_WS: '!' Hidden; -EXCL_NO_WS: '!'; -COLON: ':'; -SEMICOLON: ';'; -ASSIGNMENT: '='; -ADD_ASSIGNMENT: '+='; -SUB_ASSIGNMENT: '-='; -MULT_ASSIGNMENT: '*='; -DIV_ASSIGNMENT: '/='; -MOD_ASSIGNMENT: '%='; -ARROW: '->'; -DOUBLE_ARROW: '=>'; -RANGE: '..'; -COLONCOLON: '::'; -DOUBLE_SEMICOLON: ';;'; -HASH: '#'; -AT_NO_WS: '@'; -AT_POST_WS: '@' (Hidden | NL); -AT_PRE_WS: (Hidden | NL) '@' ; -AT_BOTH_WS: (Hidden | NL) '@' (Hidden | NL); -QUEST_WS: '?' Hidden; -QUEST_NO_WS: '?'; -LANGLE: '<'; -RANGLE: '>'; -LE: '<='; -GE: '>='; -EXCL_EQ: '!='; -EXCL_EQEQ: '!=='; -AS_SAFE: 'as?'; -EQEQ: '=='; -EQEQEQ: '==='; -SINGLE_QUOTE: '\''; -AMP: '&'; - -// SECTION: keywords - -RETURN_AT: 'return@' Identifier; -CONTINUE_AT: 'continue@' Identifier; -BREAK_AT: 'break@' Identifier; - -THIS_AT: 'this@' Identifier; -SUPER_AT: 'super@' Identifier; - -FILE: 'file'; -FIELD: 'field'; -PROPERTY: 'property'; -GET: 'get'; -SET: 'set'; -RECEIVER: 'receiver'; -PARAM: 'param'; -SETPARAM: 'setparam'; -DELEGATE: 'delegate'; - -PACKAGE: 'package'; -IMPORT: 'import'; -CLASS: 'class'; -INTERFACE: 'interface'; -FUN: 'fun'; -OBJECT: 'object'; -VAL: 'val'; -VAR: 'var'; -TYPE_ALIAS: 'typealias'; -CONSTRUCTOR: 'constructor'; -BY: 'by'; -COMPANION: 'companion'; -INIT: 'init'; -THIS: 'this'; -SUPER: 'super'; -TYPEOF: 'typeof'; -WHERE: 'where'; -IF: 'if'; -ELSE: 'else'; -WHEN: 'when'; -TRY: 'try'; -CATCH: 'catch'; -FINALLY: 'finally'; -FOR: 'for'; -DO: 'do'; -WHILE: 'while'; -THROW: 'throw'; -RETURN: 'return'; -CONTINUE: 'continue'; -BREAK: 'break'; -AS: 'as'; -IS: 'is'; -IN: 'in'; -NOT_IS: '!is' (Hidden | NL); -NOT_IN: '!in' (Hidden | NL); -OUT: 'out'; -DYNAMIC: 'dynamic'; - -// SECTION: lexicalModifiers - -PUBLIC: 'public'; -PRIVATE: 'private'; -PROTECTED: 'protected'; -INTERNAL: 'internal'; -ENUM: 'enum'; -SEALED: 'sealed'; -ANNOTATION: 'annotation'; -DATA: 'data'; -INNER: 'inner'; -VALUE: 'value'; -TAILREC: 'tailrec'; -OPERATOR: 'operator'; -INLINE: 'inline'; -INFIX: 'infix'; -EXTERNAL: 'external'; -SUSPEND: 'suspend'; -OVERRIDE: 'override'; -ABSTRACT: 'abstract'; -FINAL: 'final'; -OPEN: 'open'; -CONST: 'const'; -LATEINIT: 'lateinit'; -VARARG: 'vararg'; -NOINLINE: 'noinline'; -CROSSINLINE: 'crossinline'; -REIFIED: 'reified'; -EXPECT: 'expect'; -ACTUAL: 'actual'; - -// SECTION: literals - -fragment DecDigit: '0'..'9'; -fragment DecDigitNoZero: '1'..'9'; -fragment DecDigitOrSeparator: DecDigit | '_'; - -fragment DecDigits - : DecDigit DecDigitOrSeparator* DecDigit - | DecDigit - ; - -fragment DoubleExponent: [eE] [+-]? DecDigits; - -RealLiteral - : FloatLiteral - | DoubleLiteral - ; - -FloatLiteral - : DoubleLiteral [fF] - | DecDigits [fF] - ; - -DoubleLiteral - : DecDigits? '.' DecDigits DoubleExponent? - | DecDigits DoubleExponent - ; - -IntegerLiteral - : DecDigitNoZero DecDigitOrSeparator* DecDigit - | DecDigit - ; - -fragment HexDigit: [0-9a-fA-F]; -fragment HexDigitOrSeparator: HexDigit | '_'; - -HexLiteral - : '0' [xX] HexDigit HexDigitOrSeparator* HexDigit - | '0' [xX] HexDigit - ; - -fragment BinDigit: [01]; -fragment BinDigitOrSeparator: BinDigit | '_'; - -BinLiteral - : '0' [bB] BinDigit BinDigitOrSeparator* BinDigit - | '0' [bB] BinDigit - ; - -UnsignedLiteral - : (IntegerLiteral | HexLiteral | BinLiteral) [uU] [lL]? - ; - -LongLiteral - : (IntegerLiteral | HexLiteral | BinLiteral) [lL] - ; - -BooleanLiteral: 'true'| 'false'; - -NullLiteral: 'null'; - -CharacterLiteral - : '\'' (EscapeSeq | ~[\n\r'\\]) '\'' - ; - -// SECTION: lexicalIdentifiers - -fragment UnicodeDigit: UNICODE_CLASS_ND; - -Identifier - : (Letter | '_') (Letter | '_' | UnicodeDigit)* - | '`' ~([\r\n] | '`')+ '`' - ; - -IdentifierOrSoftKey - : Identifier - /* Soft keywords */ - | ABSTRACT - | ANNOTATION - | BY - | CATCH - | COMPANION - | CONSTRUCTOR - | CROSSINLINE - | DATA - | DYNAMIC - | ENUM - | EXTERNAL - | FINAL - | FINALLY - | IMPORT - | INFIX - | INIT - | INLINE - | INNER - | INTERNAL - | LATEINIT - | NOINLINE - | OPEN - | OPERATOR - | OUT - | OVERRIDE - | PRIVATE - | PROTECTED - | PUBLIC - | REIFIED - | SEALED - | TAILREC - | VARARG - | WHERE - | GET - | SET - | FIELD - | PROPERTY - | RECEIVER - | PARAM - | SETPARAM - | DELEGATE - | FILE - | EXPECT - | ACTUAL - | VALUE - /* Strong keywords */ - | CONST - | SUSPEND - ; - -FieldIdentifier - : '$' IdentifierOrSoftKey - ; - -fragment UniCharacterLiteral - : '\\' 'u' HexDigit HexDigit HexDigit HexDigit - ; - -fragment EscapedIdentifier - : '\\' ('t' | 'b' | 'r' | 'n' | '\'' | '"' | '\\' | '$') - ; - -fragment EscapeSeq - : UniCharacterLiteral - | EscapedIdentifier - ; - -// SECTION: characters - -fragment Letter - : UNICODE_CLASS_LU - | UNICODE_CLASS_LL - | UNICODE_CLASS_LT - | UNICODE_CLASS_LM - | UNICODE_CLASS_LO - ; - -// SECTION: strings - -QUOTE_OPEN: '"' -> pushMode(LineString); - -TRIPLE_QUOTE_OPEN: '"""' -> pushMode(MultiLineString); - -mode LineString; - -QUOTE_CLOSE - : '"' -> popMode - ; - -LineStrRef - : FieldIdentifier - ; - -LineStrText - : ~('\\' | '"' | '$')+ | '$' - ; - -LineStrEscapedChar - : EscapedIdentifier - | UniCharacterLiteral - ; - -LineStrExprStart - : '${' -> pushMode(DEFAULT_MODE) - ; - -mode MultiLineString; - -TRIPLE_QUOTE_CLOSE - : MultiLineStringQuote? '"""' -> popMode - ; - -MultiLineStringQuote - : '"'+ - ; - -MultiLineStrRef - : FieldIdentifier - ; - -MultiLineStrText - : ~('"' | '$')+ | '$' - ; - -MultiLineStrExprStart - : '${' -> pushMode(DEFAULT_MODE) - ; - -// SECTION: inside - -mode Inside; - -Inside_RPAREN: RPAREN -> popMode, type(RPAREN); -Inside_RSQUARE: RSQUARE -> popMode, type(RSQUARE); -Inside_LPAREN: LPAREN -> pushMode(Inside), type(LPAREN); -Inside_LSQUARE: LSQUARE -> pushMode(Inside), type(LSQUARE); -Inside_LCURL: LCURL -> pushMode(DEFAULT_MODE), type(LCURL); -Inside_RCURL: RCURL -> popMode, type(RCURL); - -Inside_DOT: DOT -> type(DOT); -Inside_COMMA: COMMA -> type(COMMA); -Inside_MULT: MULT -> type(MULT); -Inside_MOD: MOD -> type(MOD); -Inside_DIV: DIV -> type(DIV); -Inside_ADD: ADD -> type(ADD); -Inside_SUB: SUB -> type(SUB); -Inside_INCR: INCR -> type(INCR); -Inside_DECR: DECR -> type(DECR); -Inside_CONJ: CONJ -> type(CONJ); -Inside_DISJ: DISJ -> type(DISJ); -Inside_EXCL_WS: '!' (Hidden|NL) -> type(EXCL_WS); -Inside_EXCL_NO_WS: EXCL_NO_WS -> type(EXCL_NO_WS); -Inside_COLON: COLON -> type(COLON); -Inside_SEMICOLON: SEMICOLON -> type(SEMICOLON); -Inside_ASSIGNMENT: ASSIGNMENT -> type(ASSIGNMENT); -Inside_ADD_ASSIGNMENT: ADD_ASSIGNMENT -> type(ADD_ASSIGNMENT); -Inside_SUB_ASSIGNMENT: SUB_ASSIGNMENT -> type(SUB_ASSIGNMENT); -Inside_MULT_ASSIGNMENT: MULT_ASSIGNMENT -> type(MULT_ASSIGNMENT); -Inside_DIV_ASSIGNMENT: DIV_ASSIGNMENT -> type(DIV_ASSIGNMENT); -Inside_MOD_ASSIGNMENT: MOD_ASSIGNMENT -> type(MOD_ASSIGNMENT); -Inside_ARROW: ARROW -> type(ARROW); -Inside_DOUBLE_ARROW: DOUBLE_ARROW -> type(DOUBLE_ARROW); -Inside_RANGE: RANGE -> type(RANGE); -Inside_RESERVED: RESERVED -> type(RESERVED); -Inside_COLONCOLON: COLONCOLON -> type(COLONCOLON); -Inside_DOUBLE_SEMICOLON: DOUBLE_SEMICOLON -> type(DOUBLE_SEMICOLON); -Inside_HASH: HASH -> type(HASH); -Inside_AT_NO_WS: AT_NO_WS -> type(AT_NO_WS); -Inside_AT_POST_WS: AT_POST_WS -> type(AT_POST_WS); -Inside_AT_PRE_WS: AT_PRE_WS -> type(AT_PRE_WS); -Inside_AT_BOTH_WS: AT_BOTH_WS -> type(AT_BOTH_WS); -Inside_QUEST_WS: '?' (Hidden | NL) -> type(QUEST_WS); -Inside_QUEST_NO_WS: QUEST_NO_WS -> type(QUEST_NO_WS); -Inside_LANGLE: LANGLE -> type(LANGLE); -Inside_RANGLE: RANGLE -> type(RANGLE); -Inside_LE: LE -> type(LE); -Inside_GE: GE -> type(GE); -Inside_EXCL_EQ: EXCL_EQ -> type(EXCL_EQ); -Inside_EXCL_EQEQ: EXCL_EQEQ -> type(EXCL_EQEQ); -Inside_IS: IS -> type(IS); -Inside_NOT_IS: NOT_IS -> type(NOT_IS); -Inside_NOT_IN: NOT_IN -> type(NOT_IN); -Inside_AS: AS -> type(AS); -Inside_AS_SAFE: AS_SAFE -> type(AS_SAFE); -Inside_EQEQ: EQEQ -> type(EQEQ); -Inside_EQEQEQ: EQEQEQ -> type(EQEQEQ); -Inside_SINGLE_QUOTE: SINGLE_QUOTE -> type(SINGLE_QUOTE); -Inside_AMP: AMP -> type(AMP); -Inside_QUOTE_OPEN: QUOTE_OPEN -> pushMode(LineString), type(QUOTE_OPEN); -Inside_TRIPLE_QUOTE_OPEN: TRIPLE_QUOTE_OPEN -> pushMode(MultiLineString), type(TRIPLE_QUOTE_OPEN); - -Inside_VAL: VAL -> type(VAL); -Inside_VAR: VAR -> type(VAR); -Inside_FUN: FUN -> type(FUN); -Inside_OBJECT: OBJECT -> type(OBJECT); -Inside_SUPER: SUPER -> type(SUPER); -Inside_IN: IN -> type(IN); -Inside_OUT: OUT -> type(OUT); -Inside_FIELD: FIELD -> type(FIELD); -Inside_FILE: FILE -> type(FILE); -Inside_PROPERTY: PROPERTY -> type(PROPERTY); -Inside_GET: GET -> type(GET); -Inside_SET: SET -> type(SET); -Inside_RECEIVER: RECEIVER -> type(RECEIVER); -Inside_PARAM: PARAM -> type(PARAM); -Inside_SETPARAM: SETPARAM -> type(SETPARAM); -Inside_DELEGATE: DELEGATE -> type(DELEGATE); -Inside_THROW: THROW -> type(THROW); -Inside_RETURN: RETURN -> type(RETURN); -Inside_CONTINUE: CONTINUE -> type(CONTINUE); -Inside_BREAK: BREAK -> type(BREAK); -Inside_RETURN_AT: RETURN_AT -> type(RETURN_AT); -Inside_CONTINUE_AT: CONTINUE_AT -> type(CONTINUE_AT); -Inside_BREAK_AT: BREAK_AT -> type(BREAK_AT); -Inside_IF: IF -> type(IF); -Inside_ELSE: ELSE -> type(ELSE); -Inside_WHEN: WHEN -> type(WHEN); -Inside_TRY: TRY -> type(TRY); -Inside_CATCH: CATCH -> type(CATCH); -Inside_FINALLY: FINALLY -> type(FINALLY); -Inside_FOR: FOR -> type(FOR); -Inside_DO: DO -> type(DO); -Inside_WHILE: WHILE -> type(WHILE); - -Inside_PUBLIC: PUBLIC -> type(PUBLIC); -Inside_PRIVATE: PRIVATE -> type(PRIVATE); -Inside_PROTECTED: PROTECTED -> type(PROTECTED); -Inside_INTERNAL: INTERNAL -> type(INTERNAL); -Inside_ENUM: ENUM -> type(ENUM); -Inside_SEALED: SEALED -> type(SEALED); -Inside_ANNOTATION: ANNOTATION -> type(ANNOTATION); -Inside_DATA: DATA -> type(DATA); -Inside_INNER: INNER -> type(INNER); -Inside_VALUE: VALUE -> type(VALUE); -Inside_TAILREC: TAILREC -> type(TAILREC); -Inside_OPERATOR: OPERATOR -> type(OPERATOR); -Inside_INLINE: INLINE -> type(INLINE); -Inside_INFIX: INFIX -> type(INFIX); -Inside_EXTERNAL: EXTERNAL -> type(EXTERNAL); -Inside_SUSPEND: SUSPEND -> type(SUSPEND); -Inside_OVERRIDE: OVERRIDE -> type(OVERRIDE); -Inside_ABSTRACT: ABSTRACT -> type(ABSTRACT); -Inside_FINAL: FINAL -> type(FINAL); -Inside_OPEN: OPEN -> type(OPEN); -Inside_CONST: CONST -> type(CONST); -Inside_LATEINIT: LATEINIT -> type(LATEINIT); -Inside_VARARG: VARARG -> type(VARARG); -Inside_NOINLINE: NOINLINE -> type(NOINLINE); -Inside_CROSSINLINE: CROSSINLINE -> type(CROSSINLINE); -Inside_REIFIED: REIFIED -> type(REIFIED); -Inside_EXPECT: EXPECT -> type(EXPECT); -Inside_ACTUAL: ACTUAL -> type(ACTUAL); - -Inside_BooleanLiteral: BooleanLiteral -> type(BooleanLiteral); -Inside_IntegerLiteral: IntegerLiteral -> type(IntegerLiteral); -Inside_HexLiteral: HexLiteral -> type(HexLiteral); -Inside_BinLiteral: BinLiteral -> type(BinLiteral); -Inside_CharacterLiteral: CharacterLiteral -> type(CharacterLiteral); -Inside_RealLiteral: RealLiteral -> type(RealLiteral); -Inside_NullLiteral: NullLiteral -> type(NullLiteral); -Inside_LongLiteral: LongLiteral -> type(LongLiteral); -Inside_UnsignedLiteral: UnsignedLiteral -> type(UnsignedLiteral); - -Inside_Identifier: Identifier -> type(Identifier); -Inside_Comment: (LineComment | DelimitedComment) -> channel(HIDDEN); -Inside_WS: WS -> channel(HIDDEN); -Inside_NL: NL -> channel(HIDDEN); - -mode DEFAULT_MODE; - -ErrorCharacter: .; diff --git a/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinParser.g4 b/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinParser.g4 deleted file mode 100644 index 53356a1f..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/antlr/KotlinParser.g4 +++ /dev/null @@ -1,926 +0,0 @@ -/** - * Kotlin syntax grammar in ANTLR4 notation - */ - -parser grammar KotlinParser; - -options { tokenVocab = KotlinLexer; } - -// SECTION: general - -kotlinFile - : shebangLine? NL* fileAnnotation* packageHeader importList topLevelObject* EOF - ; - -script - : shebangLine? NL* fileAnnotation* packageHeader importList (statement semi)* EOF - ; - -shebangLine - : ShebangLine NL+ - ; - -fileAnnotation - : (AT_NO_WS | AT_PRE_WS) FILE NL* COLON NL* (LSQUARE unescapedAnnotation+ RSQUARE | unescapedAnnotation) NL* - ; - -packageHeader - : (PACKAGE identifier semi?)? - ; - -importList - : importHeader* - ; - -importHeader - : IMPORT identifier (DOT MULT | importAlias)? semi? - ; - -importAlias - : AS simpleIdentifier - ; - -topLevelObject - : declaration semis? - ; - -typeAlias - : modifiers? TYPE_ALIAS NL* simpleIdentifier (NL* typeParameters)? NL* ASSIGNMENT NL* type - ; - -declaration - : classDeclaration - | objectDeclaration - | functionDeclaration - | propertyDeclaration - | typeAlias - ; - -// SECTION: classes - -classDeclaration - : modifiers? (CLASS | (FUN NL*)? INTERFACE) NL* simpleIdentifier - (NL* typeParameters)? (NL* primaryConstructor)? - (NL* COLON NL* delegationSpecifiers)? - (NL* typeConstraints)? - (NL* classBody | NL* enumClassBody)? - ; - -primaryConstructor - : (modifiers? CONSTRUCTOR NL*)? classParameters - ; - -classBody - : LCURL NL* classMemberDeclarations NL* RCURL - ; - -classParameters - : LPAREN NL* (classParameter (NL* COMMA NL* classParameter)* (NL* COMMA)?)? NL* RPAREN - ; - -classParameter - : modifiers? (VAL | VAR)? NL* simpleIdentifier COLON NL* type (NL* ASSIGNMENT NL* expression)? - ; - -delegationSpecifiers - : annotatedDelegationSpecifier (NL* COMMA NL* annotatedDelegationSpecifier)* - ; - -delegationSpecifier - : constructorInvocation - | explicitDelegation - | userType - | functionType - | SUSPEND NL* functionType - ; - -constructorInvocation - : userType valueArguments - ; - -annotatedDelegationSpecifier - : annotation* NL* delegationSpecifier - ; - -explicitDelegation - : (userType | functionType) NL* BY NL* expression - ; - -typeParameters - : LANGLE NL* typeParameter (NL* COMMA NL* typeParameter)* (NL* COMMA)? NL* RANGLE - ; - -typeParameter - : typeParameterModifiers? NL* simpleIdentifier (NL* COLON NL* type)? - ; - -typeConstraints - : WHERE NL* typeConstraint (NL* COMMA NL* typeConstraint)* - ; - -typeConstraint - : annotation* simpleIdentifier NL* COLON NL* type - ; - -// SECTION: classMembers - -classMemberDeclarations - : (classMemberDeclaration semis?)* - ; - -classMemberDeclaration - : declaration - | companionObject - | anonymousInitializer - | secondaryConstructor - ; - -anonymousInitializer - : INIT NL* block - ; - -companionObject - : modifiers? COMPANION NL* OBJECT - (NL* simpleIdentifier)? - (NL* COLON NL* delegationSpecifiers)? - (NL* classBody)? - ; - -functionValueParameters - : LPAREN NL* (functionValueParameter (NL* COMMA NL* functionValueParameter)* (NL* COMMA)?)? NL* RPAREN - ; - -functionValueParameter - : parameterModifiers? parameter (NL* ASSIGNMENT NL* expression)? - ; - -functionDeclaration - : modifiers? - FUN (NL* typeParameters)? (NL* receiverType NL* DOT)? NL* simpleIdentifier - NL* functionValueParameters - (NL* COLON NL* type)? - (NL* typeConstraints)? - (NL* functionBody)? - ; - -functionBody - : block - | ASSIGNMENT NL* expression - ; - -variableDeclaration - : annotation* NL* simpleIdentifier (NL* COLON NL* type)? - ; - -multiVariableDeclaration - : LPAREN NL* variableDeclaration (NL* COMMA NL* variableDeclaration)* (NL* COMMA)? NL* RPAREN - ; - -propertyDeclaration - : modifiers? (VAL | VAR) - (NL* typeParameters)? - (NL* receiverType NL* DOT)? - (NL* (multiVariableDeclaration | variableDeclaration)) - (NL* typeConstraints)? - (NL* (ASSIGNMENT NL* expression | propertyDelegate))? - (NL+ SEMICOLON)? NL* (getter? (NL* semi? setter)? | setter? (NL* semi? getter)?) - ; - -propertyDelegate - : BY NL* expression - ; - -getter - : modifiers? GET - (NL* LPAREN NL* RPAREN (NL* COLON NL* type)? NL* functionBody)? - ; - -setter - : modifiers? SET - (NL* LPAREN NL* functionValueParameterWithOptionalType (NL* COMMA)? NL* RPAREN (NL* COLON NL* type)? NL* functionBody)? - ; - -parametersWithOptionalType - : LPAREN NL* (functionValueParameterWithOptionalType (NL* COMMA NL* functionValueParameterWithOptionalType)* (NL* COMMA)?)? NL* RPAREN - ; - -functionValueParameterWithOptionalType - : parameterModifiers? parameterWithOptionalType (NL* ASSIGNMENT NL* expression)? - ; - -parameterWithOptionalType - : simpleIdentifier NL* (COLON NL* type)? - ; - -parameter - : simpleIdentifier NL* COLON NL* type - ; - -objectDeclaration - : modifiers? OBJECT - NL* simpleIdentifier - (NL* COLON NL* delegationSpecifiers)? - (NL* classBody)? - ; - -secondaryConstructor - : modifiers? CONSTRUCTOR NL* functionValueParameters (NL* COLON NL* constructorDelegationCall)? NL* block? - ; - -constructorDelegationCall - : (THIS | SUPER) NL* valueArguments - ; - -// SECTION: enumClasses - -enumClassBody - : LCURL NL* enumEntries? (NL* SEMICOLON NL* classMemberDeclarations)? NL* RCURL - ; - -enumEntries - : enumEntry (NL* COMMA NL* enumEntry)* NL* COMMA? - ; - -enumEntry - : (modifiers NL*)? simpleIdentifier (NL* valueArguments)? (NL* classBody)? - ; - -// SECTION: types - -type - : typeModifiers? (functionType | parenthesizedType | nullableType | typeReference | definitelyNonNullableType) - ; - -typeReference - : userType - | DYNAMIC - ; - -nullableType - : (typeReference | parenthesizedType) NL* quest+ - ; - -quest - : QUEST_NO_WS - | QUEST_WS - ; - -userType - : simpleUserType (NL* DOT NL* simpleUserType)* - ; - -simpleUserType - : simpleIdentifier (NL* typeArguments)? - ; - -typeProjection - : typeProjectionModifiers? type - | MULT - ; - -typeProjectionModifiers - : typeProjectionModifier+ - ; - -typeProjectionModifier - : varianceModifier NL* - | annotation - ; - -functionType - : (receiverType NL* DOT NL*)? functionTypeParameters NL* ARROW NL* type - ; - -functionTypeParameters - : LPAREN NL* (parameter | type)? (NL* COMMA NL* (parameter | type))* (NL* COMMA)? NL* RPAREN - ; - -parenthesizedType - : LPAREN NL* type NL* RPAREN - ; - -receiverType - : typeModifiers? (parenthesizedType | nullableType | typeReference) - ; - -parenthesizedUserType - : LPAREN NL* (userType | parenthesizedUserType) NL* RPAREN - ; - -definitelyNonNullableType - : typeModifiers? (userType | parenthesizedUserType) NL* AMP NL* typeModifiers? (userType | parenthesizedUserType) - ; - -// SECTION: statements - -statements - : (statement (semis statement)*)? semis? - ; - -statement - : (label | annotation)* ( declaration | assignment | loopStatement | expression) - ; - -label - : simpleIdentifier (AT_NO_WS | AT_POST_WS) NL* - ; - -controlStructureBody - : block - | statement - ; - -block - : LCURL NL* statements NL* RCURL - ; - -loopStatement - : forStatement - | whileStatement - | doWhileStatement - ; - -forStatement - : FOR NL* LPAREN annotation* (variableDeclaration | multiVariableDeclaration) - IN expression RPAREN NL* controlStructureBody? - ; - -whileStatement - : WHILE NL* LPAREN expression RPAREN NL* (controlStructureBody | SEMICOLON) - ; - -doWhileStatement - : DO NL* controlStructureBody? NL* WHILE NL* LPAREN expression RPAREN - ; - -assignment - : (directlyAssignableExpression ASSIGNMENT | assignableExpression assignmentAndOperator) NL* expression - ; - -semi - : (SEMICOLON | NL) NL* - ; - -semis - : (SEMICOLON | NL)+ - ; - -// SECTION: expressions - -expression - : disjunction - ; - -disjunction - : conjunction (NL* DISJ NL* conjunction)* - ; - -conjunction - : equality (NL* CONJ NL* equality)* - ; - -equality - : comparison (equalityOperator NL* comparison)* - ; - -comparison - : genericCallLikeComparison (comparisonOperator NL* genericCallLikeComparison)* - ; - -genericCallLikeComparison - : infixOperation callSuffix* - ; - -infixOperation - : elvisExpression (inOperator NL* elvisExpression | isOperator NL* type)* - ; - -elvisExpression - : infixFunctionCall (NL* elvis NL* infixFunctionCall)* - ; - -elvis - : QUEST_NO_WS COLON - ; - -infixFunctionCall - : rangeExpression (simpleIdentifier NL* rangeExpression)* - ; - -rangeExpression - : additiveExpression (RANGE NL* additiveExpression)* - ; - -additiveExpression - : multiplicativeExpression (additiveOperator NL* multiplicativeExpression)* - ; - -multiplicativeExpression - : asExpression (multiplicativeOperator NL* asExpression)* - ; - -asExpression - : prefixUnaryExpression (NL* asOperator NL* type)* - ; - -prefixUnaryExpression - : unaryPrefix* postfixUnaryExpression - ; - -unaryPrefix - : annotation - | label - | prefixUnaryOperator NL* - ; - -postfixUnaryExpression - : primaryExpression postfixUnarySuffix* - ; - -postfixUnarySuffix - : postfixUnaryOperator - | typeArguments - | callSuffix - | indexingSuffix - | navigationSuffix - ; - -directlyAssignableExpression - : postfixUnaryExpression assignableSuffix - | simpleIdentifier - | parenthesizedDirectlyAssignableExpression - ; - -parenthesizedDirectlyAssignableExpression - : LPAREN NL* directlyAssignableExpression NL* RPAREN - ; - -assignableExpression - : prefixUnaryExpression - | parenthesizedAssignableExpression - ; - -parenthesizedAssignableExpression - : LPAREN NL* assignableExpression NL* RPAREN - ; - -assignableSuffix - : typeArguments - | indexingSuffix - | navigationSuffix - ; - -indexingSuffix - : LSQUARE NL* expression (NL* COMMA NL* expression)* (NL* COMMA)? NL* RSQUARE - ; - -navigationSuffix - : memberAccessOperator NL* (simpleIdentifier | parenthesizedExpression | CLASS) - ; - -callSuffix - : typeArguments? (valueArguments? annotatedLambda | valueArguments) - ; - -annotatedLambda - : annotation* label? NL* lambdaLiteral - ; - -typeArguments - : LANGLE NL* typeProjection (NL* COMMA NL* typeProjection)* (NL* COMMA)? NL* RANGLE - ; - -valueArguments - : LPAREN NL* (valueArgument (NL* COMMA NL* valueArgument)* (NL* COMMA)? NL*)? RPAREN - ; - -valueArgument - : annotation? NL* (simpleIdentifier NL* ASSIGNMENT NL*)? MULT? NL* expression - ; - -primaryExpression - : parenthesizedExpression - | simpleIdentifier - | literalConstant - | stringLiteral - | callableReference - | functionLiteral - | objectLiteral - | collectionLiteral - | thisExpression - | superExpression - | ifExpression - | whenExpression - | tryExpression - | jumpExpression - ; - -parenthesizedExpression - : LPAREN NL* expression NL* RPAREN - ; - -collectionLiteral - : LSQUARE NL* (expression (NL* COMMA NL* expression)* (NL* COMMA)? NL*)? RSQUARE - ; - -literalConstant - : BooleanLiteral - | IntegerLiteral - | HexLiteral - | BinLiteral - | CharacterLiteral - | RealLiteral - | NullLiteral - | LongLiteral - | UnsignedLiteral - ; - -stringLiteral - : lineStringLiteral - | multiLineStringLiteral - ; - -lineStringLiteral - : QUOTE_OPEN (lineStringContent | lineStringExpression)* QUOTE_CLOSE - ; - -multiLineStringLiteral - : TRIPLE_QUOTE_OPEN (multiLineStringContent | multiLineStringExpression | MultiLineStringQuote)* TRIPLE_QUOTE_CLOSE - ; - -lineStringContent - : LineStrText - | LineStrEscapedChar - | LineStrRef - ; - -lineStringExpression - : LineStrExprStart NL* expression NL* RCURL - ; - -multiLineStringContent - : MultiLineStrText - | MultiLineStringQuote - | MultiLineStrRef - ; - -multiLineStringExpression - : MultiLineStrExprStart NL* expression NL* RCURL - ; - -lambdaLiteral - : LCURL NL* (lambdaParameters? NL* ARROW NL*)? statements NL* RCURL - ; - -lambdaParameters - : lambdaParameter (NL* COMMA NL* lambdaParameter)* (NL* COMMA)? - ; - -lambdaParameter - : variableDeclaration - | multiVariableDeclaration (NL* COLON NL* type)? - ; - -anonymousFunction - : FUN - (NL* type NL* DOT)? - NL* parametersWithOptionalType - (NL* COLON NL* type)? - (NL* typeConstraints)? - (NL* functionBody)? - ; - -functionLiteral - : lambdaLiteral - | anonymousFunction - ; - -objectLiteral - : OBJECT (NL* COLON NL* delegationSpecifiers NL*)? (NL* classBody)? - ; - -thisExpression - : THIS - | THIS_AT - ; - -superExpression - : SUPER (LANGLE NL* type NL* RANGLE)? (AT_NO_WS simpleIdentifier)? - | SUPER_AT - ; - -ifExpression - : IF NL* LPAREN NL* expression NL* RPAREN NL* - ( controlStructureBody - | controlStructureBody? NL* SEMICOLON? NL* ELSE NL* (controlStructureBody | SEMICOLON) - | SEMICOLON) - ; - -whenSubject - : LPAREN (annotation* NL* VAL NL* variableDeclaration NL* ASSIGNMENT NL*)? expression RPAREN - ; - -whenExpression - : WHEN NL* whenSubject? NL* LCURL NL* (whenEntry NL*)* NL* RCURL - ; - -whenEntry - : whenCondition (NL* COMMA NL* whenCondition)* (NL* COMMA)? NL* ARROW NL* controlStructureBody semi? - | ELSE NL* ARROW NL* controlStructureBody semi? - ; - -whenCondition - : expression - | rangeTest - | typeTest - ; - -rangeTest - : inOperator NL* expression - ; - -typeTest - : isOperator NL* type - ; - -tryExpression - : TRY NL* block ((NL* catchBlock)+ (NL* finallyBlock)? | NL* finallyBlock) - ; - -catchBlock - : CATCH NL* LPAREN annotation* simpleIdentifier COLON type (NL* COMMA)? RPAREN NL* block - ; - -finallyBlock - : FINALLY NL* block - ; - -jumpExpression - : THROW NL* expression - | (RETURN | RETURN_AT) expression? - | CONTINUE - | CONTINUE_AT - | BREAK - | BREAK_AT - ; - -callableReference - : receiverType? COLONCOLON NL* (simpleIdentifier | CLASS) - ; - -assignmentAndOperator - : ADD_ASSIGNMENT - | SUB_ASSIGNMENT - | MULT_ASSIGNMENT - | DIV_ASSIGNMENT - | MOD_ASSIGNMENT - ; - -equalityOperator - : EXCL_EQ - | EXCL_EQEQ - | EQEQ - | EQEQEQ - ; - -comparisonOperator - : LANGLE - | RANGLE - | LE - | GE - ; - -inOperator - : IN - | NOT_IN - ; - -isOperator - : IS - | NOT_IS - ; - -additiveOperator - : ADD - | SUB - ; - -multiplicativeOperator - : MULT - | DIV - | MOD - ; - -asOperator - : AS - | AS_SAFE - ; - -prefixUnaryOperator - : INCR - | DECR - | SUB - | ADD - | excl - ; - -postfixUnaryOperator - : INCR - | DECR - | EXCL_NO_WS excl - ; - -excl - : EXCL_NO_WS - | EXCL_WS - ; - -memberAccessOperator - : NL* DOT - | NL* safeNav - | COLONCOLON - ; - -safeNav - : QUEST_NO_WS DOT - ; - -// SECTION: modifiers - -modifiers - : (annotation | modifier)+ - ; - -parameterModifiers - : (annotation | parameterModifier)+ - ; - -modifier - : (classModifier - | memberModifier - | visibilityModifier - | functionModifier - | propertyModifier - | inheritanceModifier - | parameterModifier - | platformModifier) NL* - ; - -typeModifiers - : typeModifier+ - ; - -typeModifier - : annotation - | SUSPEND NL* - ; - -classModifier - : ENUM - | SEALED - | ANNOTATION - | DATA - | INNER - | VALUE - ; - -memberModifier - : OVERRIDE - | LATEINIT - ; - -visibilityModifier - : PUBLIC - | PRIVATE - | INTERNAL - | PROTECTED - ; - -varianceModifier - : IN - | OUT - ; - -typeParameterModifiers - : typeParameterModifier+ - ; - -typeParameterModifier - : reificationModifier NL* - | varianceModifier NL* - | annotation - ; - -functionModifier - : TAILREC - | OPERATOR - | INFIX - | INLINE - | EXTERNAL - | SUSPEND - ; - -propertyModifier - : CONST - ; - -inheritanceModifier - : ABSTRACT - | FINAL - | OPEN - ; - -parameterModifier - : VARARG - | NOINLINE - | CROSSINLINE - ; - -reificationModifier - : REIFIED - ; - -platformModifier - : EXPECT - | ACTUAL - ; - -// SECTION: annotations - -annotation - : (singleAnnotation | multiAnnotation) NL* - ; - -singleAnnotation - : (annotationUseSiteTarget NL* | AT_NO_WS | AT_PRE_WS) unescapedAnnotation - ; - -multiAnnotation - : (annotationUseSiteTarget NL* | AT_NO_WS | AT_PRE_WS) LSQUARE unescapedAnnotation+ RSQUARE - ; - -annotationUseSiteTarget - : (AT_NO_WS | AT_PRE_WS) (FIELD | PROPERTY | GET | SET | RECEIVER | PARAM | SETPARAM | DELEGATE) NL* COLON - ; - -unescapedAnnotation - : constructorInvocation - | userType - ; - -// SECTION: identifiers - -simpleIdentifier - : Identifier - | ABSTRACT - | ANNOTATION - | BY - | CATCH - | COMPANION - | CONSTRUCTOR - | CROSSINLINE - | DATA - | DYNAMIC - | ENUM - | EXTERNAL - | FINAL - | FINALLY - | GET - | IMPORT - | INFIX - | INIT - | INLINE - | INNER - | INTERNAL - | LATEINIT - | NOINLINE - | OPEN - | OPERATOR - | OUT - | OVERRIDE - | PRIVATE - | PROTECTED - | PUBLIC - | REIFIED - | SEALED - | TAILREC - | SET - | VARARG - | WHERE - | FIELD - | PROPERTY - | RECEIVER - | PARAM - | SETPARAM - | DELEGATE - | FILE - | EXPECT - | ACTUAL - | CONST - | SUSPEND - | VALUE - ; - -identifier - : simpleIdentifier (NL* DOT simpleIdentifier)* - ; diff --git a/orx-jvm/orx-kotlin-parser/src/main/antlr/README.md b/orx-jvm/orx-kotlin-parser/src/main/antlr/README.md deleted file mode 100644 index 94c736a4..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/antlr/README.md +++ /dev/null @@ -1 +0,0 @@ -Synced from https://github.com/Kotlin/kotlin-spec/ @ 8e3f52e5ee01c03c1884cfd34d5ed7e3e2f016c1 diff --git a/orx-jvm/orx-kotlin-parser/src/main/antlr/UnicodeClasses.g4 b/orx-jvm/orx-kotlin-parser/src/main/antlr/UnicodeClasses.g4 deleted file mode 100644 index 53728480..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/antlr/UnicodeClasses.g4 +++ /dev/null @@ -1,1649 +0,0 @@ -/** - * Kotlin lexical grammar in ANTLR4 notation (Unicode classes) - * - * Taken from http://www.antlr3.org/grammar/1345144569663/AntlrUnicode.txt - */ - -lexer grammar UnicodeClasses; - -UNICODE_CLASS_LL: - '\u0061'..'\u007A' | - '\u00B5' | - '\u00DF'..'\u00F6' | - '\u00F8'..'\u00FF' | - '\u0101' | - '\u0103' | - '\u0105' | - '\u0107' | - '\u0109' | - '\u010B' | - '\u010D' | - '\u010F' | - '\u0111' | - '\u0113' | - '\u0115' | - '\u0117' | - '\u0119' | - '\u011B' | - '\u011D' | - '\u011F' | - '\u0121' | - '\u0123' | - '\u0125' | - '\u0127' | - '\u0129' | - '\u012B' | - '\u012D' | - '\u012F' | - '\u0131' | - '\u0133' | - '\u0135' | - '\u0137' | - '\u0138' | - '\u013A' | - '\u013C' | - '\u013E' | - '\u0140' | - '\u0142' | - '\u0144' | - '\u0146' | - '\u0148' | - '\u0149' | - '\u014B' | - '\u014D' | - '\u014F' | - '\u0151' | - '\u0153' | - '\u0155' | - '\u0157' | - '\u0159' | - '\u015B' | - '\u015D' | - '\u015F' | - '\u0161' | - '\u0163' | - '\u0165' | - '\u0167' | - '\u0169' | - '\u016B' | - '\u016D' | - '\u016F' | - '\u0171' | - '\u0173' | - '\u0175' | - '\u0177' | - '\u017A' | - '\u017C' | - '\u017E'..'\u0180' | - '\u0183' | - '\u0185' | - '\u0188' | - '\u018C' | - '\u018D' | - '\u0192' | - '\u0195' | - '\u0199'..'\u019B' | - '\u019E' | - '\u01A1' | - '\u01A3' | - '\u01A5' | - '\u01A8' | - '\u01AA' | - '\u01AB' | - '\u01AD' | - '\u01B0' | - '\u01B4' | - '\u01B6' | - '\u01B9' | - '\u01BA' | - '\u01BD'..'\u01BF' | - '\u01C6' | - '\u01C9' | - '\u01CC' | - '\u01CE' | - '\u01D0' | - '\u01D2' | - '\u01D4' | - '\u01D6' | - '\u01D8' | - '\u01DA' | - '\u01DC' | - '\u01DD' | - '\u01DF' | - '\u01E1' | - '\u01E3' | - '\u01E5' | - '\u01E7' | - '\u01E9' | - '\u01EB' | - '\u01ED' | - '\u01EF' | - '\u01F0' | - '\u01F3' | - '\u01F5' | - '\u01F9' | - '\u01FB' | - '\u01FD' | - '\u01FF' | - '\u0201' | - '\u0203' | - '\u0205' | - '\u0207' | - '\u0209' | - '\u020B' | - '\u020D' | - '\u020F' | - '\u0211' | - '\u0213' | - '\u0215' | - '\u0217' | - '\u0219' | - '\u021B' | - '\u021D' | - '\u021F' | - '\u0221' | - '\u0223' | - '\u0225' | - '\u0227' | - '\u0229' | - '\u022B' | - '\u022D' | - '\u022F' | - '\u0231' | - '\u0233'..'\u0239' | - '\u023C' | - '\u023F' | - '\u0240' | - '\u0242' | - '\u0247' | - '\u0249' | - '\u024B' | - '\u024D' | - '\u024F'..'\u0293' | - '\u0295'..'\u02AF' | - '\u0371' | - '\u0373' | - '\u0377' | - '\u037B'..'\u037D' | - '\u0390' | - '\u03AC'..'\u03CE' | - '\u03D0' | - '\u03D1' | - '\u03D5'..'\u03D7' | - '\u03D9' | - '\u03DB' | - '\u03DD' | - '\u03DF' | - '\u03E1' | - '\u03E3' | - '\u03E5' | - '\u03E7' | - '\u03E9' | - '\u03EB' | - '\u03ED' | - '\u03EF'..'\u03F3' | - '\u03F5' | - '\u03F8' | - '\u03FB' | - '\u03FC' | - '\u0430'..'\u045F' | - '\u0461' | - '\u0463' | - '\u0465' | - '\u0467' | - '\u0469' | - '\u046B' | - '\u046D' | - '\u046F' | - '\u0471' | - '\u0473' | - '\u0475' | - '\u0477' | - '\u0479' | - '\u047B' | - '\u047D' | - '\u047F' | - '\u0481' | - '\u048B' | - '\u048D' | - '\u048F' | - '\u0491' | - '\u0493' | - '\u0495' | - '\u0497' | - '\u0499' | - '\u049B' | - '\u049D' | - '\u049F' | - '\u04A1' | - '\u04A3' | - '\u04A5' | - '\u04A7' | - '\u04A9' | - '\u04AB' | - '\u04AD' | - '\u04AF' | - '\u04B1' | - '\u04B3' | - '\u04B5' | - '\u04B7' | - '\u04B9' | - '\u04BB' | - '\u04BD' | - '\u04BF' | - '\u04C2' | - '\u04C4' | - '\u04C6' | - '\u04C8' | - '\u04CA' | - '\u04CC' | - '\u04CE' | - '\u04CF' | - '\u04D1' | - '\u04D3' | - '\u04D5' | - '\u04D7' | - '\u04D9' | - '\u04DB' | - '\u04DD' | - '\u04DF' | - '\u04E1' | - '\u04E3' | - '\u04E5' | - '\u04E7' | - '\u04E9' | - '\u04EB' | - '\u04ED' | - '\u04EF' | - '\u04F1' | - '\u04F3' | - '\u04F5' | - '\u04F7' | - '\u04F9' | - '\u04FB' | - '\u04FD' | - '\u04FF' | - '\u0501' | - '\u0503' | - '\u0505' | - '\u0507' | - '\u0509' | - '\u050B' | - '\u050D' | - '\u050F' | - '\u0511' | - '\u0513' | - '\u0515' | - '\u0517' | - '\u0519' | - '\u051B' | - '\u051D' | - '\u051F' | - '\u0521' | - '\u0523' | - '\u0525' | - '\u0527' | - '\u0561'..'\u0587' | - '\u1D00'..'\u1D2B' | - '\u1D6B'..'\u1D77' | - '\u1D79'..'\u1D9A' | - '\u1E01' | - '\u1E03' | - '\u1E05' | - '\u1E07' | - '\u1E09' | - '\u1E0B' | - '\u1E0D' | - '\u1E0F' | - '\u1E11' | - '\u1E13' | - '\u1E15' | - '\u1E17' | - '\u1E19' | - '\u1E1B' | - '\u1E1D' | - '\u1E1F' | - '\u1E21' | - '\u1E23' | - '\u1E25' | - '\u1E27' | - '\u1E29' | - '\u1E2B' | - '\u1E2D' | - '\u1E2F' | - '\u1E31' | - '\u1E33' | - '\u1E35' | - '\u1E37' | - '\u1E39' | - '\u1E3B' | - '\u1E3D' | - '\u1E3F' | - '\u1E41' | - '\u1E43' | - '\u1E45' | - '\u1E47' | - '\u1E49' | - '\u1E4B' | - '\u1E4D' | - '\u1E4F' | - '\u1E51' | - '\u1E53' | - '\u1E55' | - '\u1E57' | - '\u1E59' | - '\u1E5B' | - '\u1E5D' | - '\u1E5F' | - '\u1E61' | - '\u1E63' | - '\u1E65' | - '\u1E67' | - '\u1E69' | - '\u1E6B' | - '\u1E6D' | - '\u1E6F' | - '\u1E71' | - '\u1E73' | - '\u1E75' | - '\u1E77' | - '\u1E79' | - '\u1E7B' | - '\u1E7D' | - '\u1E7F' | - '\u1E81' | - '\u1E83' | - '\u1E85' | - '\u1E87' | - '\u1E89' | - '\u1E8B' | - '\u1E8D' | - '\u1E8F' | - '\u1E91' | - '\u1E93' | - '\u1E95'..'\u1E9D' | - '\u1E9F' | - '\u1EA1' | - '\u1EA3' | - '\u1EA5' | - '\u1EA7' | - '\u1EA9' | - '\u1EAB' | - '\u1EAD' | - '\u1EAF' | - '\u1EB1' | - '\u1EB3' | - '\u1EB5' | - '\u1EB7' | - '\u1EB9' | - '\u1EBB' | - '\u1EBD' | - '\u1EBF' | - '\u1EC1' | - '\u1EC3' | - '\u1EC5' | - '\u1EC7' | - '\u1EC9' | - '\u1ECB' | - '\u1ECD' | - '\u1ECF' | - '\u1ED1' | - '\u1ED3' | - '\u1ED5' | - '\u1ED7' | - '\u1ED9' | - '\u1EDB' | - '\u1EDD' | - '\u1EDF' | - '\u1EE1' | - '\u1EE3' | - '\u1EE5' | - '\u1EE7' | - '\u1EE9' | - '\u1EEB' | - '\u1EED' | - '\u1EEF' | - '\u1EF1' | - '\u1EF3' | - '\u1EF5' | - '\u1EF7' | - '\u1EF9' | - '\u1EFB' | - '\u1EFD' | - '\u1EFF'..'\u1F07' | - '\u1F10'..'\u1F15' | - '\u1F20'..'\u1F27' | - '\u1F30'..'\u1F37' | - '\u1F40'..'\u1F45' | - '\u1F50'..'\u1F57' | - '\u1F60'..'\u1F67' | - '\u1F70'..'\u1F7D' | - '\u1F80'..'\u1F87' | - '\u1F90'..'\u1F97' | - '\u1FA0'..'\u1FA7' | - '\u1FB0'..'\u1FB4' | - '\u1FB6' | - '\u1FB7' | - '\u1FBE' | - '\u1FC2'..'\u1FC4' | - '\u1FC6' | - '\u1FC7' | - '\u1FD0'..'\u1FD3' | - '\u1FD6' | - '\u1FD7' | - '\u1FE0'..'\u1FE7' | - '\u1FF2'..'\u1FF4' | - '\u1FF6' | - '\u1FF7' | - '\u210A' | - '\u210E' | - '\u210F' | - '\u2113' | - '\u212F' | - '\u2134' | - '\u2139' | - '\u213C' | - '\u213D' | - '\u2146'..'\u2149' | - '\u214E' | - '\u2184' | - '\u2C30'..'\u2C5E' | - '\u2C61' | - '\u2C65' | - '\u2C66' | - '\u2C68' | - '\u2C6A' | - '\u2C6C' | - '\u2C71' | - '\u2C73' | - '\u2C74' | - '\u2C76'..'\u2C7B' | - '\u2C81' | - '\u2C83' | - '\u2C85' | - '\u2C87' | - '\u2C89' | - '\u2C8B' | - '\u2C8D' | - '\u2C8F' | - '\u2C91' | - '\u2C93' | - '\u2C95' | - '\u2C97' | - '\u2C99' | - '\u2C9B' | - '\u2C9D' | - '\u2C9F' | - '\u2CA1' | - '\u2CA3' | - '\u2CA5' | - '\u2CA7' | - '\u2CA9' | - '\u2CAB' | - '\u2CAD' | - '\u2CAF' | - '\u2CB1' | - '\u2CB3' | - '\u2CB5' | - '\u2CB7' | - '\u2CB9' | - '\u2CBB' | - '\u2CBD' | - '\u2CBF' | - '\u2CC1' | - '\u2CC3' | - '\u2CC5' | - '\u2CC7' | - '\u2CC9' | - '\u2CCB' | - '\u2CCD' | - '\u2CCF' | - '\u2CD1' | - '\u2CD3' | - '\u2CD5' | - '\u2CD7' | - '\u2CD9' | - '\u2CDB' | - '\u2CDD' | - '\u2CDF' | - '\u2CE1' | - '\u2CE3' | - '\u2CE4' | - '\u2CEC' | - '\u2CEE' | - '\u2CF3' | - '\u2D00'..'\u2D25' | - '\u2D27' | - '\u2D2D' | - '\uA641' | - '\uA643' | - '\uA645' | - '\uA647' | - '\uA649' | - '\uA64B' | - '\uA64D' | - '\uA64F' | - '\uA651' | - '\uA653' | - '\uA655' | - '\uA657' | - '\uA659' | - '\uA65B' | - '\uA65D' | - '\uA65F' | - '\uA661' | - '\uA663' | - '\uA665' | - '\uA667' | - '\uA669' | - '\uA66B' | - '\uA66D' | - '\uA681' | - '\uA683' | - '\uA685' | - '\uA687' | - '\uA689' | - '\uA68B' | - '\uA68D' | - '\uA68F' | - '\uA691' | - '\uA693' | - '\uA695' | - '\uA697' | - '\uA723' | - '\uA725' | - '\uA727' | - '\uA729' | - '\uA72B' | - '\uA72D' | - '\uA72F'..'\uA731' | - '\uA733' | - '\uA735' | - '\uA737' | - '\uA739' | - '\uA73B' | - '\uA73D' | - '\uA73F' | - '\uA741' | - '\uA743' | - '\uA745' | - '\uA747' | - '\uA749' | - '\uA74B' | - '\uA74D' | - '\uA74F' | - '\uA751' | - '\uA753' | - '\uA755' | - '\uA757' | - '\uA759' | - '\uA75B' | - '\uA75D' | - '\uA75F' | - '\uA761' | - '\uA763' | - '\uA765' | - '\uA767' | - '\uA769' | - '\uA76B' | - '\uA76D' | - '\uA76F' | - '\uA771'..'\uA778' | - '\uA77A' | - '\uA77C' | - '\uA77F' | - '\uA781' | - '\uA783' | - '\uA785' | - '\uA787' | - '\uA78C' | - '\uA78E' | - '\uA791' | - '\uA793' | - '\uA7A1' | - '\uA7A3' | - '\uA7A5' | - '\uA7A7' | - '\uA7A9' | - '\uA7FA' | - '\uFB00'..'\uFB06' | - '\uFB13'..'\uFB17' | - '\uFF41'..'\uFF5A'; - -UNICODE_CLASS_LM: - '\u02B0'..'\u02C1' | - '\u02C6'..'\u02D1' | - '\u02E0'..'\u02E4' | - '\u02EC' | - '\u02EE' | - '\u0374' | - '\u037A' | - '\u0559' | - '\u0640' | - '\u06E5' | - '\u06E6' | - '\u07F4' | - '\u07F5' | - '\u07FA' | - '\u081A' | - '\u0824' | - '\u0828' | - '\u0971' | - '\u0E46' | - '\u0EC6' | - '\u10FC' | - '\u17D7' | - '\u1843' | - '\u1AA7' | - '\u1C78'..'\u1C7D' | - '\u1D2C'..'\u1D6A' | - '\u1D78' | - '\u1D9B'..'\u1DBF' | - '\u2071' | - '\u207F' | - '\u2090'..'\u209C' | - '\u2C7C' | - '\u2C7D' | - '\u2D6F' | - '\u2E2F' | - '\u3005' | - '\u3031'..'\u3035' | - '\u303B' | - '\u309D' | - '\u309E' | - '\u30FC'..'\u30FE' | - '\uA015' | - '\uA4F8'..'\uA4FD' | - '\uA60C' | - '\uA67F' | - '\uA717'..'\uA71F' | - '\uA770' | - '\uA788' | - '\uA7F8' | - '\uA7F9' | - '\uA9CF' | - '\uAA70' | - '\uAADD' | - '\uAAF3' | - '\uAAF4' | - '\uFF70' | - '\uFF9E' | - '\uFF9F'; - -UNICODE_CLASS_LO: - '\u00AA' | - '\u00BA' | - '\u01BB' | - '\u01C0'..'\u01C3' | - '\u0294' | - '\u05D0'..'\u05EA' | - '\u05F0'..'\u05F2' | - '\u0620'..'\u063F' | - '\u0641'..'\u064A' | - '\u066E' | - '\u066F' | - '\u0671'..'\u06D3' | - '\u06D5' | - '\u06EE' | - '\u06EF' | - '\u06FA'..'\u06FC' | - '\u06FF' | - '\u0710' | - '\u0712'..'\u072F' | - '\u074D'..'\u07A5' | - '\u07B1' | - '\u07CA'..'\u07EA' | - '\u0800'..'\u0815' | - '\u0840'..'\u0858' | - '\u08A0' | - '\u08A2'..'\u08AC' | - '\u0904'..'\u0939' | - '\u093D' | - '\u0950' | - '\u0958'..'\u0961' | - '\u0972'..'\u0977' | - '\u0979'..'\u097F' | - '\u0985'..'\u098C' | - '\u098F' | - '\u0990' | - '\u0993'..'\u09A8' | - '\u09AA'..'\u09B0' | - '\u09B2' | - '\u09B6'..'\u09B9' | - '\u09BD' | - '\u09CE' | - '\u09DC' | - '\u09DD' | - '\u09DF'..'\u09E1' | - '\u09F0' | - '\u09F1' | - '\u0A05'..'\u0A0A' | - '\u0A0F' | - '\u0A10' | - '\u0A13'..'\u0A28' | - '\u0A2A'..'\u0A30' | - '\u0A32' | - '\u0A33' | - '\u0A35' | - '\u0A36' | - '\u0A38' | - '\u0A39' | - '\u0A59'..'\u0A5C' | - '\u0A5E' | - '\u0A72'..'\u0A74' | - '\u0A85'..'\u0A8D' | - '\u0A8F'..'\u0A91' | - '\u0A93'..'\u0AA8' | - '\u0AAA'..'\u0AB0' | - '\u0AB2' | - '\u0AB3' | - '\u0AB5'..'\u0AB9' | - '\u0ABD' | - '\u0AD0' | - '\u0AE0' | - '\u0AE1' | - '\u0B05'..'\u0B0C' | - '\u0B0F' | - '\u0B10' | - '\u0B13'..'\u0B28' | - '\u0B2A'..'\u0B30' | - '\u0B32' | - '\u0B33' | - '\u0B35'..'\u0B39' | - '\u0B3D' | - '\u0B5C' | - '\u0B5D' | - '\u0B5F'..'\u0B61' | - '\u0B71' | - '\u0B83' | - '\u0B85'..'\u0B8A' | - '\u0B8E'..'\u0B90' | - '\u0B92'..'\u0B95' | - '\u0B99' | - '\u0B9A' | - '\u0B9C' | - '\u0B9E' | - '\u0B9F' | - '\u0BA3' | - '\u0BA4' | - '\u0BA8'..'\u0BAA' | - '\u0BAE'..'\u0BB9' | - '\u0BD0' | - '\u0C05'..'\u0C0C' | - '\u0C0E'..'\u0C10' | - '\u0C12'..'\u0C28' | - '\u0C2A'..'\u0C33' | - '\u0C35'..'\u0C39' | - '\u0C3D' | - '\u0C58' | - '\u0C59' | - '\u0C60' | - '\u0C61' | - '\u0C85'..'\u0C8C' | - '\u0C8E'..'\u0C90' | - '\u0C92'..'\u0CA8' | - '\u0CAA'..'\u0CB3' | - '\u0CB5'..'\u0CB9' | - '\u0CBD' | - '\u0CDE' | - '\u0CE0' | - '\u0CE1' | - '\u0CF1' | - '\u0CF2' | - '\u0D05'..'\u0D0C' | - '\u0D0E'..'\u0D10' | - '\u0D12'..'\u0D3A' | - '\u0D3D' | - '\u0D4E' | - '\u0D60' | - '\u0D61' | - '\u0D7A'..'\u0D7F' | - '\u0D85'..'\u0D96' | - '\u0D9A'..'\u0DB1' | - '\u0DB3'..'\u0DBB' | - '\u0DBD' | - '\u0DC0'..'\u0DC6' | - '\u0E01'..'\u0E30' | - '\u0E32' | - '\u0E33' | - '\u0E40'..'\u0E45' | - '\u0E81' | - '\u0E82' | - '\u0E84' | - '\u0E87' | - '\u0E88' | - '\u0E8A' | - '\u0E8D' | - '\u0E94'..'\u0E97' | - '\u0E99'..'\u0E9F' | - '\u0EA1'..'\u0EA3' | - '\u0EA5' | - '\u0EA7' | - '\u0EAA' | - '\u0EAB' | - '\u0EAD'..'\u0EB0' | - '\u0EB2' | - '\u0EB3' | - '\u0EBD' | - '\u0EC0'..'\u0EC4' | - '\u0EDC'..'\u0EDF' | - '\u0F00' | - '\u0F40'..'\u0F47' | - '\u0F49'..'\u0F6C' | - '\u0F88'..'\u0F8C' | - '\u1000'..'\u102A' | - '\u103F' | - '\u1050'..'\u1055' | - '\u105A'..'\u105D' | - '\u1061' | - '\u1065' | - '\u1066' | - '\u106E'..'\u1070' | - '\u1075'..'\u1081' | - '\u108E' | - '\u10D0'..'\u10FA' | - '\u10FD'..'\u1248' | - '\u124A'..'\u124D' | - '\u1250'..'\u1256' | - '\u1258' | - '\u125A'..'\u125D' | - '\u1260'..'\u1288' | - '\u128A'..'\u128D' | - '\u1290'..'\u12B0' | - '\u12B2'..'\u12B5' | - '\u12B8'..'\u12BE' | - '\u12C0' | - '\u12C2'..'\u12C5' | - '\u12C8'..'\u12D6' | - '\u12D8'..'\u1310' | - '\u1312'..'\u1315' | - '\u1318'..'\u135A' | - '\u1380'..'\u138F' | - '\u13A0'..'\u13F4' | - '\u1401'..'\u166C' | - '\u166F'..'\u167F' | - '\u1681'..'\u169A' | - '\u16A0'..'\u16EA' | - '\u1700'..'\u170C' | - '\u170E'..'\u1711' | - '\u1720'..'\u1731' | - '\u1740'..'\u1751' | - '\u1760'..'\u176C' | - '\u176E'..'\u1770' | - '\u1780'..'\u17B3' | - '\u17DC' | - '\u1820'..'\u1842' | - '\u1844'..'\u1877' | - '\u1880'..'\u18A8' | - '\u18AA' | - '\u18B0'..'\u18F5' | - '\u1900'..'\u191C' | - '\u1950'..'\u196D' | - '\u1970'..'\u1974' | - '\u1980'..'\u19AB' | - '\u19C1'..'\u19C7' | - '\u1A00'..'\u1A16' | - '\u1A20'..'\u1A54' | - '\u1B05'..'\u1B33' | - '\u1B45'..'\u1B4B' | - '\u1B83'..'\u1BA0' | - '\u1BAE' | - '\u1BAF' | - '\u1BBA'..'\u1BE5' | - '\u1C00'..'\u1C23' | - '\u1C4D'..'\u1C4F' | - '\u1C5A'..'\u1C77' | - '\u1CE9'..'\u1CEC' | - '\u1CEE'..'\u1CF1' | - '\u1CF5' | - '\u1CF6' | - '\u2135'..'\u2138' | - '\u2D30'..'\u2D67' | - '\u2D80'..'\u2D96' | - '\u2DA0'..'\u2DA6' | - '\u2DA8'..'\u2DAE' | - '\u2DB0'..'\u2DB6' | - '\u2DB8'..'\u2DBE' | - '\u2DC0'..'\u2DC6' | - '\u2DC8'..'\u2DCE' | - '\u2DD0'..'\u2DD6' | - '\u2DD8'..'\u2DDE' | - '\u3006' | - '\u303C' | - '\u3041'..'\u3096' | - '\u309F' | - '\u30A1'..'\u30FA' | - '\u30FF' | - '\u3105'..'\u312D' | - '\u3131'..'\u318E' | - '\u31A0'..'\u31BA' | - '\u31F0'..'\u31FF' | - '\u3400' | - '\u4DB5' | - '\u4E00' | - '\u9FCC' | - '\uA000'..'\uA014' | - '\uA016'..'\uA48C' | - '\uA4D0'..'\uA4F7' | - '\uA500'..'\uA60B' | - '\uA610'..'\uA61F' | - '\uA62A' | - '\uA62B' | - '\uA66E' | - '\uA6A0'..'\uA6E5' | - '\uA7FB'..'\uA801' | - '\uA803'..'\uA805' | - '\uA807'..'\uA80A' | - '\uA80C'..'\uA822' | - '\uA840'..'\uA873' | - '\uA882'..'\uA8B3' | - '\uA8F2'..'\uA8F7' | - '\uA8FB' | - '\uA90A'..'\uA925' | - '\uA930'..'\uA946' | - '\uA960'..'\uA97C' | - '\uA984'..'\uA9B2' | - '\uAA00'..'\uAA28' | - '\uAA40'..'\uAA42' | - '\uAA44'..'\uAA4B' | - '\uAA60'..'\uAA6F' | - '\uAA71'..'\uAA76' | - '\uAA7A' | - '\uAA80'..'\uAAAF' | - '\uAAB1' | - '\uAAB5' | - '\uAAB6' | - '\uAAB9'..'\uAABD' | - '\uAAC0' | - '\uAAC2' | - '\uAADB' | - '\uAADC' | - '\uAAE0'..'\uAAEA' | - '\uAAF2' | - '\uAB01'..'\uAB06' | - '\uAB09'..'\uAB0E' | - '\uAB11'..'\uAB16' | - '\uAB20'..'\uAB26' | - '\uAB28'..'\uAB2E' | - '\uABC0'..'\uABE2' | - '\uAC00' | - '\uD7A3' | - '\uD7B0'..'\uD7C6' | - '\uD7CB'..'\uD7FB' | - '\uF900'..'\uFA6D' | - '\uFA70'..'\uFAD9' | - '\uFB1D' | - '\uFB1F'..'\uFB28' | - '\uFB2A'..'\uFB36' | - '\uFB38'..'\uFB3C' | - '\uFB3E' | - '\uFB40' | - '\uFB41' | - '\uFB43' | - '\uFB44' | - '\uFB46'..'\uFBB1' | - '\uFBD3'..'\uFD3D' | - '\uFD50'..'\uFD8F' | - '\uFD92'..'\uFDC7' | - '\uFDF0'..'\uFDFB' | - '\uFE70'..'\uFE74' | - '\uFE76'..'\uFEFC' | - '\uFF66'..'\uFF6F' | - '\uFF71'..'\uFF9D' | - '\uFFA0'..'\uFFBE' | - '\uFFC2'..'\uFFC7' | - '\uFFCA'..'\uFFCF' | - '\uFFD2'..'\uFFD7' | - '\uFFDA'..'\uFFDC'; - -UNICODE_CLASS_LT: - '\u01C5' | - '\u01C8' | - '\u01CB' | - '\u01F2' | - '\u1F88'..'\u1F8F' | - '\u1F98'..'\u1F9F' | - '\u1FA8'..'\u1FAF' | - '\u1FBC' | - '\u1FCC' | - '\u1FFC'; - -UNICODE_CLASS_LU: - '\u0041'..'\u005A' | - '\u00C0'..'\u00D6' | - '\u00D8'..'\u00DE' | - '\u0100' | - '\u0102' | - '\u0104' | - '\u0106' | - '\u0108' | - '\u010A' | - '\u010C' | - '\u010E' | - '\u0110' | - '\u0112' | - '\u0114' | - '\u0116' | - '\u0118' | - '\u011A' | - '\u011C' | - '\u011E' | - '\u0120' | - '\u0122' | - '\u0124' | - '\u0126' | - '\u0128' | - '\u012A' | - '\u012C' | - '\u012E' | - '\u0130' | - '\u0132' | - '\u0134' | - '\u0136' | - '\u0139' | - '\u013B' | - '\u013D' | - '\u013F' | - '\u0141' | - '\u0143' | - '\u0145' | - '\u0147' | - '\u014A' | - '\u014C' | - '\u014E' | - '\u0150' | - '\u0152' | - '\u0154' | - '\u0156' | - '\u0158' | - '\u015A' | - '\u015C' | - '\u015E' | - '\u0160' | - '\u0162' | - '\u0164' | - '\u0166' | - '\u0168' | - '\u016A' | - '\u016C' | - '\u016E' | - '\u0170' | - '\u0172' | - '\u0174' | - '\u0176' | - '\u0178' | - '\u0179' | - '\u017B' | - '\u017D' | - '\u0181' | - '\u0182' | - '\u0184' | - '\u0186' | - '\u0187' | - '\u0189'..'\u018B' | - '\u018E'..'\u0191' | - '\u0193' | - '\u0194' | - '\u0196'..'\u0198' | - '\u019C' | - '\u019D' | - '\u019F' | - '\u01A0' | - '\u01A2' | - '\u01A4' | - '\u01A6' | - '\u01A7' | - '\u01A9' | - '\u01AC' | - '\u01AE' | - '\u01AF' | - '\u01B1'..'\u01B3' | - '\u01B5' | - '\u01B7' | - '\u01B8' | - '\u01BC' | - '\u01C4' | - '\u01C7' | - '\u01CA' | - '\u01CD' | - '\u01CF' | - '\u01D1' | - '\u01D3' | - '\u01D5' | - '\u01D7' | - '\u01D9' | - '\u01DB' | - '\u01DE' | - '\u01E0' | - '\u01E2' | - '\u01E4' | - '\u01E6' | - '\u01E8' | - '\u01EA' | - '\u01EC' | - '\u01EE' | - '\u01F1' | - '\u01F4' | - '\u01F6'..'\u01F8' | - '\u01FA' | - '\u01FC' | - '\u01FE' | - '\u0200' | - '\u0202' | - '\u0204' | - '\u0206' | - '\u0208' | - '\u020A' | - '\u020C' | - '\u020E' | - '\u0210' | - '\u0212' | - '\u0214' | - '\u0216' | - '\u0218' | - '\u021A' | - '\u021C' | - '\u021E' | - '\u0220' | - '\u0222' | - '\u0224' | - '\u0226' | - '\u0228' | - '\u022A' | - '\u022C' | - '\u022E' | - '\u0230' | - '\u0232' | - '\u023A' | - '\u023B' | - '\u023D' | - '\u023E' | - '\u0241' | - '\u0243'..'\u0246' | - '\u0248' | - '\u024A' | - '\u024C' | - '\u024E' | - '\u0370' | - '\u0372' | - '\u0376' | - '\u0386' | - '\u0388'..'\u038A' | - '\u038C' | - '\u038E' | - '\u038F' | - '\u0391'..'\u03A1' | - '\u03A3'..'\u03AB' | - '\u03CF' | - '\u03D2'..'\u03D4' | - '\u03D8' | - '\u03DA' | - '\u03DC' | - '\u03DE' | - '\u03E0' | - '\u03E2' | - '\u03E4' | - '\u03E6' | - '\u03E8' | - '\u03EA' | - '\u03EC' | - '\u03EE' | - '\u03F4' | - '\u03F7' | - '\u03F9' | - '\u03FA' | - '\u03FD'..'\u042F' | - '\u0460' | - '\u0462' | - '\u0464' | - '\u0466' | - '\u0468' | - '\u046A' | - '\u046C' | - '\u046E' | - '\u0470' | - '\u0472' | - '\u0474' | - '\u0476' | - '\u0478' | - '\u047A' | - '\u047C' | - '\u047E' | - '\u0480' | - '\u048A' | - '\u048C' | - '\u048E' | - '\u0490' | - '\u0492' | - '\u0494' | - '\u0496' | - '\u0498' | - '\u049A' | - '\u049C' | - '\u049E' | - '\u04A0' | - '\u04A2' | - '\u04A4' | - '\u04A6' | - '\u04A8' | - '\u04AA' | - '\u04AC' | - '\u04AE' | - '\u04B0' | - '\u04B2' | - '\u04B4' | - '\u04B6' | - '\u04B8' | - '\u04BA' | - '\u04BC' | - '\u04BE' | - '\u04C0' | - '\u04C1' | - '\u04C3' | - '\u04C5' | - '\u04C7' | - '\u04C9' | - '\u04CB' | - '\u04CD' | - '\u04D0' | - '\u04D2' | - '\u04D4' | - '\u04D6' | - '\u04D8' | - '\u04DA' | - '\u04DC' | - '\u04DE' | - '\u04E0' | - '\u04E2' | - '\u04E4' | - '\u04E6' | - '\u04E8' | - '\u04EA' | - '\u04EC' | - '\u04EE' | - '\u04F0' | - '\u04F2' | - '\u04F4' | - '\u04F6' | - '\u04F8' | - '\u04FA' | - '\u04FC' | - '\u04FE' | - '\u0500' | - '\u0502' | - '\u0504' | - '\u0506' | - '\u0508' | - '\u050A' | - '\u050C' | - '\u050E' | - '\u0510' | - '\u0512' | - '\u0514' | - '\u0516' | - '\u0518' | - '\u051A' | - '\u051C' | - '\u051E' | - '\u0520' | - '\u0522' | - '\u0524' | - '\u0526' | - '\u0531'..'\u0556' | - '\u10A0'..'\u10C5' | - '\u10C7' | - '\u10CD' | - '\u1E00' | - '\u1E02' | - '\u1E04' | - '\u1E06' | - '\u1E08' | - '\u1E0A' | - '\u1E0C' | - '\u1E0E' | - '\u1E10' | - '\u1E12' | - '\u1E14' | - '\u1E16' | - '\u1E18' | - '\u1E1A' | - '\u1E1C' | - '\u1E1E' | - '\u1E20' | - '\u1E22' | - '\u1E24' | - '\u1E26' | - '\u1E28' | - '\u1E2A' | - '\u1E2C' | - '\u1E2E' | - '\u1E30' | - '\u1E32' | - '\u1E34' | - '\u1E36' | - '\u1E38' | - '\u1E3A' | - '\u1E3C' | - '\u1E3E' | - '\u1E40' | - '\u1E42' | - '\u1E44' | - '\u1E46' | - '\u1E48' | - '\u1E4A' | - '\u1E4C' | - '\u1E4E' | - '\u1E50' | - '\u1E52' | - '\u1E54' | - '\u1E56' | - '\u1E58' | - '\u1E5A' | - '\u1E5C' | - '\u1E5E' | - '\u1E60' | - '\u1E62' | - '\u1E64' | - '\u1E66' | - '\u1E68' | - '\u1E6A' | - '\u1E6C' | - '\u1E6E' | - '\u1E70' | - '\u1E72' | - '\u1E74' | - '\u1E76' | - '\u1E78' | - '\u1E7A' | - '\u1E7C' | - '\u1E7E' | - '\u1E80' | - '\u1E82' | - '\u1E84' | - '\u1E86' | - '\u1E88' | - '\u1E8A' | - '\u1E8C' | - '\u1E8E' | - '\u1E90' | - '\u1E92' | - '\u1E94' | - '\u1E9E' | - '\u1EA0' | - '\u1EA2' | - '\u1EA4' | - '\u1EA6' | - '\u1EA8' | - '\u1EAA' | - '\u1EAC' | - '\u1EAE' | - '\u1EB0' | - '\u1EB2' | - '\u1EB4' | - '\u1EB6' | - '\u1EB8' | - '\u1EBA' | - '\u1EBC' | - '\u1EBE' | - '\u1EC0' | - '\u1EC2' | - '\u1EC4' | - '\u1EC6' | - '\u1EC8' | - '\u1ECA' | - '\u1ECC' | - '\u1ECE' | - '\u1ED0' | - '\u1ED2' | - '\u1ED4' | - '\u1ED6' | - '\u1ED8' | - '\u1EDA' | - '\u1EDC' | - '\u1EDE' | - '\u1EE0' | - '\u1EE2' | - '\u1EE4' | - '\u1EE6' | - '\u1EE8' | - '\u1EEA' | - '\u1EEC' | - '\u1EEE' | - '\u1EF0' | - '\u1EF2' | - '\u1EF4' | - '\u1EF6' | - '\u1EF8' | - '\u1EFA' | - '\u1EFC' | - '\u1EFE' | - '\u1F08'..'\u1F0F' | - '\u1F18'..'\u1F1D' | - '\u1F28'..'\u1F2F' | - '\u1F38'..'\u1F3F' | - '\u1F48'..'\u1F4D' | - '\u1F59' | - '\u1F5B' | - '\u1F5D' | - '\u1F5F' | - '\u1F68'..'\u1F6F' | - '\u1FB8'..'\u1FBB' | - '\u1FC8'..'\u1FCB' | - '\u1FD8'..'\u1FDB' | - '\u1FE8'..'\u1FEC' | - '\u1FF8'..'\u1FFB' | - '\u2102' | - '\u2107' | - '\u210B'..'\u210D' | - '\u2110'..'\u2112' | - '\u2115' | - '\u2119'..'\u211D' | - '\u2124' | - '\u2126' | - '\u2128' | - '\u212A'..'\u212D' | - '\u2130'..'\u2133' | - '\u213E' | - '\u213F' | - '\u2145' | - '\u2183' | - '\u2C00'..'\u2C2E' | - '\u2C60' | - '\u2C62'..'\u2C64' | - '\u2C67' | - '\u2C69' | - '\u2C6B' | - '\u2C6D'..'\u2C70' | - '\u2C72' | - '\u2C75' | - '\u2C7E'..'\u2C80' | - '\u2C82' | - '\u2C84' | - '\u2C86' | - '\u2C88' | - '\u2C8A' | - '\u2C8C' | - '\u2C8E' | - '\u2C90' | - '\u2C92' | - '\u2C94' | - '\u2C96' | - '\u2C98' | - '\u2C9A' | - '\u2C9C' | - '\u2C9E' | - '\u2CA0' | - '\u2CA2' | - '\u2CA4' | - '\u2CA6' | - '\u2CA8' | - '\u2CAA' | - '\u2CAC' | - '\u2CAE' | - '\u2CB0' | - '\u2CB2' | - '\u2CB4' | - '\u2CB6' | - '\u2CB8' | - '\u2CBA' | - '\u2CBC' | - '\u2CBE' | - '\u2CC0' | - '\u2CC2' | - '\u2CC4' | - '\u2CC6' | - '\u2CC8' | - '\u2CCA' | - '\u2CCC' | - '\u2CCE' | - '\u2CD0' | - '\u2CD2' | - '\u2CD4' | - '\u2CD6' | - '\u2CD8' | - '\u2CDA' | - '\u2CDC' | - '\u2CDE' | - '\u2CE0' | - '\u2CE2' | - '\u2CEB' | - '\u2CED' | - '\u2CF2' | - '\uA640' | - '\uA642' | - '\uA644' | - '\uA646' | - '\uA648' | - '\uA64A' | - '\uA64C' | - '\uA64E' | - '\uA650' | - '\uA652' | - '\uA654' | - '\uA656' | - '\uA658' | - '\uA65A' | - '\uA65C' | - '\uA65E' | - '\uA660' | - '\uA662' | - '\uA664' | - '\uA666' | - '\uA668' | - '\uA66A' | - '\uA66C' | - '\uA680' | - '\uA682' | - '\uA684' | - '\uA686' | - '\uA688' | - '\uA68A' | - '\uA68C' | - '\uA68E' | - '\uA690' | - '\uA692' | - '\uA694' | - '\uA696' | - '\uA722' | - '\uA724' | - '\uA726' | - '\uA728' | - '\uA72A' | - '\uA72C' | - '\uA72E' | - '\uA732' | - '\uA734' | - '\uA736' | - '\uA738' | - '\uA73A' | - '\uA73C' | - '\uA73E' | - '\uA740' | - '\uA742' | - '\uA744' | - '\uA746' | - '\uA748' | - '\uA74A' | - '\uA74C' | - '\uA74E' | - '\uA750' | - '\uA752' | - '\uA754' | - '\uA756' | - '\uA758' | - '\uA75A' | - '\uA75C' | - '\uA75E' | - '\uA760' | - '\uA762' | - '\uA764' | - '\uA766' | - '\uA768' | - '\uA76A' | - '\uA76C' | - '\uA76E' | - '\uA779' | - '\uA77B' | - '\uA77D' | - '\uA77E' | - '\uA780' | - '\uA782' | - '\uA784' | - '\uA786' | - '\uA78B' | - '\uA78D' | - '\uA790' | - '\uA792' | - '\uA7A0' | - '\uA7A2' | - '\uA7A4' | - '\uA7A6' | - '\uA7A8' | - '\uA7AA' | - '\uFF21'..'\uFF3A'; - -UNICODE_CLASS_ND: - '\u0030'..'\u0039' | - '\u0660'..'\u0669' | - '\u06F0'..'\u06F9' | - '\u07C0'..'\u07C9' | - '\u0966'..'\u096F' | - '\u09E6'..'\u09EF' | - '\u0A66'..'\u0A6F' | - '\u0AE6'..'\u0AEF' | - '\u0B66'..'\u0B6F' | - '\u0BE6'..'\u0BEF' | - '\u0C66'..'\u0C6F' | - '\u0CE6'..'\u0CEF' | - '\u0D66'..'\u0D6F' | - '\u0E50'..'\u0E59' | - '\u0ED0'..'\u0ED9' | - '\u0F20'..'\u0F29' | - '\u1040'..'\u1049' | - '\u1090'..'\u1099' | - '\u17E0'..'\u17E9' | - '\u1810'..'\u1819' | - '\u1946'..'\u194F' | - '\u19D0'..'\u19D9' | - '\u1A80'..'\u1A89' | - '\u1A90'..'\u1A99' | - '\u1B50'..'\u1B59' | - '\u1BB0'..'\u1BB9' | - '\u1C40'..'\u1C49' | - '\u1C50'..'\u1C59' | - '\uA620'..'\uA629' | - '\uA8D0'..'\uA8D9' | - '\uA900'..'\uA909' | - '\uA9D0'..'\uA9D9' | - '\uAA50'..'\uAA59' | - '\uABF0'..'\uABF9' | - '\uFF10'..'\uFF19'; - -UNICODE_CLASS_NL: - '\u16EE'..'\u16F0' | - '\u2160'..'\u2182' | - '\u2185'..'\u2188' | - '\u3007' | - '\u3021'..'\u3029' | - '\u3038'..'\u303A' | - '\uA6E6'..'\uA6EF'; \ No newline at end of file diff --git a/orx-jvm/orx-kotlin-parser/src/main/kotlin/ExtractProgram.kt b/orx-jvm/orx-kotlin-parser/src/main/kotlin/ExtractProgram.kt deleted file mode 100644 index e0d172f7..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/kotlin/ExtractProgram.kt +++ /dev/null @@ -1,77 +0,0 @@ -package org.openrndr.extra.kotlinparser - -import KotlinLexer -import KotlinParser -import KotlinParserBaseListener -import org.antlr.v4.runtime.CharStreams -import org.antlr.v4.runtime.CommonTokenStream -import org.antlr.v4.runtime.ParserRuleContext -import org.antlr.v4.runtime.RuleContext -import org.antlr.v4.runtime.misc.Interval -import org.antlr.v4.runtime.tree.ParseTreeWalker - - -fun ParserRuleContext.verbatimText(marginLeft: Int = 0, marginRight: Int = 0): String { - if (start == null || stop == null) { - return "" - } - - val startIndex = start.startIndex + marginLeft - val stopIndex = stop.stopIndex - marginRight - val interval = Interval(startIndex, stopIndex) - return start.inputStream.getText(interval) -} - -class PackageExtractor() : KotlinParserBaseListener() { - var result: String? = null - override fun enterPackageHeader(ctx: KotlinParser.PackageHeaderContext) { - result = ctx.verbatimText() - } -} - -class ImportsExtractor(val ruleNames: List) : KotlinParserBaseListener() { - var result: String? = null - - override fun enterImportList(ctx: KotlinParser.ImportListContext) { - result = ctx.verbatimText() - } -} - -class LambdaExtractor(val ruleNames: List, val lambdaName: String) : KotlinParserBaseListener() { - fun RuleContext.named(): String { - return ruleNames[this.ruleIndex] - } - - var result: String? = null - override fun enterAnnotatedLambda(ctx: KotlinParser.AnnotatedLambdaContext?) { - val puec = ctx?.parent?.parent?.parent as? KotlinParser.PostfixUnaryExpressionContext - if (puec != null) { - val identifier = puec.primaryExpression()?.simpleIdentifier()?.Identifier()?.text - if (identifier == lambdaName) { - if (result == null) { - result = ctx.verbatimText(1, 1) - } - } - } - } -} - -class ProgramSource(val packageName: String?, val imports: String, val programLambda: String) - -fun extractProgram(source: String, programIdentifier: String = "program"): ProgramSource { - val parser = KotlinParser(CommonTokenStream(KotlinLexer(CharStreams.fromString(source)))) - val root = parser.kotlinFile() -// val rules = parser.ruleNames.toList() -// val pt = TreeUtils.toPrettyTree(root, rules) - val ruleNames = parser.ruleNames.toList() - - val packageExtractor = PackageExtractor() - ParseTreeWalker.DEFAULT.walk(packageExtractor, root) - - val importsExtractor = ImportsExtractor(ruleNames) - ParseTreeWalker.DEFAULT.walk(importsExtractor, root) - - val lambdaExtractor = LambdaExtractor(ruleNames, programIdentifier) - ParseTreeWalker.DEFAULT.walk(lambdaExtractor, root) - return ProgramSource(packageExtractor.result, importsExtractor.result ?: "", lambdaExtractor.result ?: "") -} diff --git a/orx-jvm/orx-kotlin-parser/src/main/kotlin/TreeUtils.kt b/orx-jvm/orx-kotlin-parser/src/main/kotlin/TreeUtils.kt deleted file mode 100644 index 095bef48..00000000 --- a/orx-jvm/orx-kotlin-parser/src/main/kotlin/TreeUtils.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.openrndr.extra.kotlinparser - -import org.antlr.v4.runtime.misc.Utils -import org.antlr.v4.runtime.tree.Tree -import org.antlr.v4.runtime.tree.Trees - -object TreeUtils { - /** Platform dependent end-of-line marker */ - val Eol = System.lineSeparator() - - /** The literal indent char(s) used for pretty-printing */ - const val Indents = " " - private var level = 0 - - /** - * Pretty print out a whole tree. [.getNodeText] is used on the node payloads to get the text - * for the nodes. (Derived from Trees.toStringTree(....)) - */ - fun toPrettyTree(t: Tree, ruleNames: List): String { - level = 0 - return process(t, ruleNames).replace("(?m)^\\s+$".toRegex(), "").replace("\\r?\\n\\r?\\n".toRegex(), Eol) - } - - private fun process(t: Tree, ruleNames: List): String { - if (t.getChildCount() == 0) return Utils.escapeWhitespace(Trees.getNodeText(t, ruleNames), false) - val sb = StringBuilder() - sb.append(lead(level)) - level++ - val s: String = Utils.escapeWhitespace(Trees.getNodeText(t, ruleNames), false) - sb.append("$s ") - for (i in 0 until t.getChildCount()) { - sb.append(process(t.getChild(i), ruleNames)) - } - level-- - sb.append(lead(level)) - return sb.toString() - } - - private fun lead(level: Int): String { - val sb = StringBuilder() - if (level > 0) { - sb.append(Eol) - for (cnt in 0 until level) { - sb.append(Indents) - } - } - return sb.toString() - } -} diff --git a/orx-jvm/orx-midi/README.md b/orx-jvm/orx-midi/README.md deleted file mode 100644 index def1a44b..00000000 --- a/orx-jvm/orx-midi/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# orx-midi - -MIDI support for keyboards and controllers. Send and receive note and control change events. -Bind inputs to variables. - -Orx-midi is a wrapper around `javax.midi`. - -## Usage - -```kotlin - -// -- list all midi devices -listMidiDevices().forEach { - println("${it.name}, ${it.vendor} r:${it.receive} t:${it.transmit}") -} - -// -- open a midi controller and listen for control changes -val dev = openMidiDevice("BCR2000 [hw:2,0,0]") -dev.controlChanged.listen { - println("${it.channel} ${it.control} ${it.value}") -} - -// or program changes -dev.programChange.listen { - println("${it.channel} ${it.program}") -} -``` - -## Further reading - -The OPENRNDR guide has a [section on orx-midi](https://guide.openrndr.org/#/10_OPENRNDR_Extras/C04_Midi_controllers) that provides step-by-step documentation for using orx-midi in combination with OPENRNDR. diff --git a/orx-jvm/orx-midi/build.gradle.kts b/orx-jvm/orx-midi/build.gradle.kts deleted file mode 100644 index 5f2f811f..00000000 --- a/orx-jvm/orx-midi/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.reflect) - implementation(sharedLibs.kotlin.coroutines) - implementation(project(":orx-property-watchers")) - implementation(project(":orx-parameters")) - - testImplementation(libs.mockk) - testImplementation(sharedLibs.kotest.assertions) -} diff --git a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiBinding01.kt b/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiBinding01.kt deleted file mode 100644 index deae31c1..00000000 --- a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiBinding01.kt +++ /dev/null @@ -1,39 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.midi.bindMidiControl -import org.openrndr.extra.midi.openMidiDevice -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.math.Vector2 - -/** - * Demonstration of two-way binding using [bindMidiControl] - */ -fun main() = application { - program { - val midi = openMidiDevice("MIDI2x2 [hw:3,0,0]") - val settings = object { - @DoubleParameter("radius", 0.0, 100.0) - var radius = 0.0 - - @DoubleParameter("x", -100.0, 100.0) - var x = 0.0 - - @DoubleParameter("y", -100.0, 100.0) - var y = 0.0 - - @ColorParameter("fill") - var color = ColorRGBa.WHITE - } - - bindMidiControl(settings::radius, midi, 0, 1) - bindMidiControl(settings::x, midi, 0, 2) - bindMidiControl(settings::y, midi, 0, 3) - bindMidiControl(settings::color, midi, 0, 4) - - extend { - drawer.fill = settings.color - drawer.circle(drawer.bounds.center + Vector2(settings.x, settings.y), settings.radius) - } - } -} diff --git a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiConsole01.kt b/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiConsole01.kt deleted file mode 100644 index d80db6db..00000000 --- a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiConsole01.kt +++ /dev/null @@ -1,17 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.midi.MidiConsole -import org.openrndr.extra.midi.listMidiDevices -import org.openrndr.extra.midi.openMidiDevice - -/** - * Demonstration of [MidiConsole] - */ -fun main() = application { - program { - listMidiDevices().forEach { println(it.toString()) } - val midi = openMidiDevice("Launchpad [hw:4,0,0]") - extend(MidiConsole()) { - register(midi) - } - } -} diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiBindings.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiBindings.kt deleted file mode 100644 index 1e7660dc..00000000 --- a/orx-jvm/orx-midi/src/main/kotlin/MidiBindings.kt +++ /dev/null @@ -1,381 +0,0 @@ -package org.openrndr.extra.midi - -import kotlinx.coroutines.yield -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.Vector2Parameter -import org.openrndr.extra.parameters.Vector3Parameter -import org.openrndr.launch -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.map - -import kotlin.reflect.KMutableProperty0 -import kotlin.reflect.full.findAnnotations - -fun bindMidiNote(on: () -> Unit, off: () -> Unit, transceiver: MidiTransceiver, channel: Int, note: Int) { - transceiver.noteOn.listen { - if ((channel == -1 || it.channel == channel) && it.note == note) { - on() - } - } - transceiver.noteOff.listen { - if ((channel == -1 || it.channel == channel) && it.note == note) { - off() - } - } -} - -/** - * Bind MIDI control change to [Double] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channel the midi channel to use - * @param control the midi control to use - * @since 0.4.3 - */ -@JvmName("bindMidiControlDouble") -fun Program.bindMidiControl( - property: KMutableProperty0, - transceiver: MidiTransceiver, - channel: Int, - control: Int -) { - val anno = property.findAnnotations(DoubleParameter::class).firstOrNull() - - val low = anno?.low ?: 0.0 - val high = anno?.high ?: 1.0 - transceiver.controlChanged.listen { - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channel && it.control == control) { - val value = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - property.set(value) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - val value = propertyValue.map(low, high, 0.0, 127.0, clamp = true).toInt() - transceiver.controlChange(channel, control, value) - } - yield() - } - } -} - -/** - * Bind MIDI control change to [Boolean] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channel the midi channel to use - * @param control the midi control to use - * @since 0.4.3 - */ -@JvmName("bindMidiControlBoolean") -fun Program.bindMidiControl( - property: KMutableProperty0, - transceiver: MidiTransceiver, - channel: Int, - control: Int -) { - transceiver.controlChanged.listen { - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channel && it.control == control) { - property.set(it.value >= 64) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - transceiver.controlChange(channel, control, if (propertyValue) 127 else 0) - } - yield() - } - } -} - -/** - * Bind MIDI control change to [Vector2] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channelX the midi channel to use for the [Vector2.x] component - * @param controlX the midi control to use for the [Vector2.x] component - * @param channelY the midi channel to use for the [Vector2.y] component - * @param controlY the midi control to use for the [Vector2.y] component - * @since 0.4.3 - */ -@JvmName("bindMidiControlVector2") -fun Program.bindMidiControl( - property: KMutableProperty0, transceiver: MidiTransceiver, - channelX: Int, controlX: Int, - channelY: Int = channelX, controlY: Int = controlX + 1 -) { - val anno = property.findAnnotations(Vector2Parameter::class).firstOrNull() - - val low = anno?.min ?: 0.0 - val high = anno?.max ?: 1.0 - transceiver.controlChanged.listen { - val v = property.get() - var x = v.x - var y = v.y - var changed = false - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelX && it.control == controlX) { - changed = true - x = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelY && it.control == controlY) { - changed = true - y = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (changed) { - val nv = Vector2(x, y) - property.set(nv) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - val valueX = propertyValue.x.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueY = propertyValue.y.map(low, high, 0.0, 127.0, clamp = true).toInt() - transceiver.controlChange(channelX, controlX, valueX) - transceiver.controlChange(channelY, controlY, valueY) - } - yield() - } - } -} - -/** - * Bind MIDI control change to [Vector3] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channelX the midi channel to use for the [Vector3.x] component - * @param controlX the midi control to use for the [Vector3.x] component - * @param channelY the midi channel to use for the [Vector3.y] component - * @param controlY the midi control to use for the [Vector3.y] component - * @param channelZ the midi channel to use for the [Vector3.z] component - * @param controlZ the midi control to use for the [Vector3.z] component - * @since 0.4.3 - */ -@JvmName("bindMidiControlVector3") -fun Program.bindMidiControl( - property: KMutableProperty0, transceiver: MidiTransceiver, - channelX: Int, controlX: Int, - channelY: Int = channelX, controlY: Int = controlX + 1, - channelZ: Int = channelY, controlZ: Int = controlY + 1 -) { - val anno = property.findAnnotations(Vector3Parameter::class).firstOrNull() - - val low = anno?.min ?: 0.0 - val high = anno?.max ?: 1.0 - transceiver.controlChanged.listen { - val v = property.get() - var x = v.x - var y = v.y - var z = v.z - var changed = false - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelX && it.control == controlX) { - changed = true - x = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelY && it.control == controlY) { - changed = true - y = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelZ && it.control == controlZ) { - changed = true - z = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (changed) { - val nv = Vector3(x, y, z) - property.set(nv) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - val valueX = propertyValue.x.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueY = propertyValue.y.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueZ = propertyValue.z.map(low, high, 0.0, 127.0, clamp = true).toInt() - transceiver.controlChange(channelX, controlX, valueX) - transceiver.controlChange(channelY, controlY, valueY) - transceiver.controlChange(channelZ, controlZ, valueZ) - } - yield() - } - } -} - -/** - * Bind MIDI control change to [ColorRGBa] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channelR the midi channel to use for the [ColorRGBa.r] component - * @param controlR the midi control to use for the [ColorRGBa.r] component - * @param channelG the midi channel to use for the [ColorRGBa.g] component - * @param controlG the midi control to use for the [ColorRGBa.g] component - * @param channelB the midi channel to use for the [ColorRGBa.b] component - * @param controlB the midi control to use for the [ColorRGBa.b] component - * @param channelA the midi channel to use for the [ColorRGBa.alpha] component - * @param controlA the midi control to use for the [ColorRGBa.alpha] component - * @since 0.4.3 - */ -@JvmName("bindMidiControlColorRGBa") -fun Program.bindMidiControl( - property: KMutableProperty0, transceiver: MidiTransceiver, - channelR: Int, controlR: Int, - channelG: Int = channelR, controlG: Int = controlR + 1, - channelB: Int = channelG, controlB: Int = controlG + 1, - channelA: Int = channelB, controlA: Int = controlB + 1, -) { - val low = 0.0 - val high = 1.0 - transceiver.controlChanged.listen { - val v = property.get() - var r = v.r - var g = v.g - var b = v.b - var a = v.alpha - var changed = false - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelR && it.control == controlR) { - changed = true - r = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelG && it.control == controlG) { - changed = true - g = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelB && it.control == controlB) { - changed = true - b = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelA && it.control == controlA) { - changed = true - a = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (changed) { - val nv = ColorRGBa(r, g, b, a) - property.set(nv) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - val valueR = propertyValue.r.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueG = propertyValue.g.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueB = propertyValue.b.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueA = propertyValue.alpha.map(low, high, 0.0, 127.0, clamp = true).toInt() - transceiver.controlChange(channelR, controlR, valueR) - transceiver.controlChange(channelG, controlG, valueG) - transceiver.controlChange(channelB, controlB, valueB) - transceiver.controlChange(channelA, controlA, valueA) - } - yield() - } - } -} - - -/** - * Bind MIDI control change to [Vector4] property - * @param property the [KMutableProperty0] to bind to - * @param transceiver the midi device to bind to - * @param channelX the midi channel to use for the [Vector4.x] component - * @param controlX the midi control to use for the [Vector4.x] component - * @param channelY the midi channel to use for the [Vector4.y] component - * @param controlY the midi control to use for the [Vector4.y] component - * @param channelZ the midi channel to use for the [Vector4.z] component - * @param controlZ the midi control to use for the [Vector4.z] component - * @param channelW the midi channel to use for the [Vector4.w] component - * @param controlW the midi control to use for the [Vector4.w] component - * @since 0.4.3 - */ -@JvmName("bindMidiControlVector4") -fun Program.bindMidiControl( - property: KMutableProperty0, transceiver: MidiTransceiver, - channelX: Int, controlX: Int, - channelY: Int = channelX, controlY: Int = controlX + 1, - channelZ: Int = channelY, controlZ: Int = controlY + 1, - channelW: Int = channelZ, controlW: Int = controlZ + 1, -) { - val low = 0.0 - val high = 1.0 - transceiver.controlChanged.listen { - val v = property.get() - var x = v.x - var y = v.y - var z = v.z - var w = v.w - var changed = false - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelX && it.control == controlX) { - changed = true - x = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelY && it.control == controlY) { - changed = true - y = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelZ && it.control == controlZ) { - changed = true - z = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (it.eventType == MidiEventType.CONTROL_CHANGE && it.channel == channelW && it.control == controlW) { - changed = true - w = it.value.toDouble().map(0.0, 127.0, low, high, clamp = true) - } - - if (changed) { - val nv = Vector4(x, y, z, w) - property.set(nv) - } - } - launch { - var propertyValue = property.get() - while (true) { - val candidateValue = property.get() - if (candidateValue != propertyValue) { - propertyValue = candidateValue - val valueR = propertyValue.x.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueG = propertyValue.y.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueB = propertyValue.z.map(low, high, 0.0, 127.0, clamp = true).toInt() - val valueA = propertyValue.w.map(low, high, 0.0, 127.0, clamp = true).toInt() - transceiver.controlChange(channelX, controlX, valueR) - transceiver.controlChange(channelY, controlY, valueG) - transceiver.controlChange(channelZ, controlZ, valueB) - transceiver.controlChange(channelW, controlW, valueA) - } - yield() - } - } -} diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt deleted file mode 100644 index 6e3a535b..00000000 --- a/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt +++ /dev/null @@ -1,77 +0,0 @@ -package org.openrndr.extra.midi - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.draw.loadFontImageMap -import org.openrndr.math.Vector2 -import org.openrndr.shape.Rectangle -import java.io.File - -/** - * A console for monitoring MIDI events - */ -class MidiConsole : Extension { - override var enabled = true - - /** - * placement of the console text - */ - var box = Rectangle(0.0, 0.0, 130.0, 200.0) - - private val messages = mutableListOf() - - /** - * number of entries in the visible history - */ - var historySize = 2 - - private val demoFont = File("demo-data/fonts/IBMPlexMono-Regular.ttf").exists() - - /** - * register a Midi device for monitoring - */ - fun register(transceiver: MidiTransceiver) { - transceiver.controlChanged.listen { - synchronized(messages) { - messages.add("Ch=${it.channel} CC=${it.control}: ${it.value}") - if (messages.size > historySize) { - messages.removeAt(0) - } - } - } - transceiver.noteOn.listen { - synchronized(messages) { - messages.add("NOTE ON ${it.note}: ${it.velocity}") - if (messages.size > historySize) { - messages.removeAt(0) - } - } - } - - transceiver.noteOff.listen { - synchronized(messages) { - messages.add("NOTE OFF ${it.note}") - if (messages.size > historySize) { - messages.removeAt(0) - } - } - } - } - - override fun afterDraw(drawer: Drawer, program: Program) { - drawer.defaults() - synchronized(messages) { - box = Rectangle(drawer.width - box.width, 0.0, box.width, drawer.height * 1.0) - val positions = List(messages.size) { index -> - Vector2(box.x, box.y + index * 16.0 + 16.0) - } - if (demoFont) { - drawer.fontMap = loadFontImageMap("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) - } - drawer.fill = ColorRGBa.WHITE - drawer.texts(messages, positions) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiEvent.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiEvent.kt deleted file mode 100644 index 4f16a73f..00000000 --- a/orx-jvm/orx-midi/src/main/kotlin/MidiEvent.kt +++ /dev/null @@ -1,120 +0,0 @@ -package org.openrndr.extra.midi - -import javax.sound.midi.MidiMessage -import javax.sound.midi.ShortMessage - -enum class MidiEventType(val status: Int) { - - MIDI_TIME_CODE(ShortMessage.MIDI_TIME_CODE), - SONG_POSITION_POINTER(ShortMessage.SONG_POSITION_POINTER), - SONG_SELECT(ShortMessage.SONG_SELECT), - TUNE_REQUEST(ShortMessage.TUNE_REQUEST), - END_OF_EXCLUSIVE(ShortMessage.END_OF_EXCLUSIVE), - TIMING_CLOCK(ShortMessage.TIMING_CLOCK), - START(ShortMessage.START), - CONTINUE(ShortMessage.CONTINUE), - STOP(ShortMessage.STOP), - ACTIVE_SENSING(ShortMessage.ACTIVE_SENSING), - SYSTEM_RESET(ShortMessage.SYSTEM_RESET), - NOTE_ON(ShortMessage.NOTE_ON), - NOTE_OFF(ShortMessage.NOTE_OFF), - CONTROL_CHANGE(ShortMessage.CONTROL_CHANGE), - PROGRAM_CHANGE(ShortMessage.PROGRAM_CHANGE), - CHANNEL_PRESSURE(ShortMessage.CHANNEL_PRESSURE), - PITCH_BEND(ShortMessage.PITCH_BEND); - - companion object { - - private val statusMap: Map = - entries.associateBy { it.status } - - fun fromStatus( - status: Int - ): MidiEventType = requireNotNull( - statusMap[if (status >= 0xf0) status else status and 0xf0] - ) { - "Invalid MIDI status: $status" - } - - } - -} - -val MidiMessage.eventType: MidiEventType get() = MidiEventType.fromStatus(status) - -class MidiEvent(val eventType: MidiEventType) { - var origin = Origin.DEVICE - var control: Int = 0 - var program: Int = 0 - var note: Int = 0 - var channel: Int = 0 - var pitchBend: Int = 0 - var pressure: Int = 0 - var value: Int = 0 - var velocity: Int = 0 - - enum class Origin { - DEVICE, - USER - } - - companion object { - fun noteOn(channel: Int, note: Int, velocity: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.NOTE_ON) - midiEvent.velocity = velocity - midiEvent.note = note - midiEvent.channel = channel - return midiEvent - } - - fun noteOff(channel: Int, note: Int, velocity: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.NOTE_OFF) - midiEvent.note = note - midiEvent.channel = channel - midiEvent.velocity = velocity - return midiEvent - } - - fun controlChange(channel: Int, control: Int, value: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.CONTROL_CHANGE) - midiEvent.channel = channel - midiEvent.control = control - midiEvent.value = value - return midiEvent - } - - fun programChange(channel: Int, program: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.PROGRAM_CHANGE) - midiEvent.channel = channel - midiEvent.program = program - return midiEvent - } - - fun channelPressure(channel: Int, pressure: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.CHANNEL_PRESSURE) - midiEvent.channel = channel - midiEvent.pressure = pressure - return midiEvent - } - - fun pitchBend(channel: Int, pitchBend: Int): MidiEvent { - val midiEvent = MidiEvent(MidiEventType.PITCH_BEND) - midiEvent.channel = channel - midiEvent.pitchBend = pitchBend - return midiEvent - } - } - - override fun toString(): String { - return "MidiEvent(eventType=$eventType, " + - "origin=$origin, " + - "program=$program, " + - "control=$control, " + - "note=$note, " + - "channel=$channel, " + - "pitchBend=$pitchBend, " + - "pressure=$pressure, " + - "value=$value, " + - "velocity=$velocity)" - } -} \ No newline at end of file diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt deleted file mode 100644 index 386daa63..00000000 --- a/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt +++ /dev/null @@ -1,305 +0,0 @@ -package org.openrndr.extra.midi - -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.Program -import org.openrndr.events.Event -import javax.sound.midi.* - -private val logger = KotlinLogging.logger { } - -@JvmRecord -data class MidiDeviceName(val name: String, val vendor: String) - -class MidiDeviceCapabilities { - var receive: Boolean = false - var transmit: Boolean = false - - override fun toString(): String { - return "MidiDeviceCapabilities(receive=$receive, transmit=$transmit)" - } -} - -@JvmRecord -data class MidiDeviceDescription( - val name: String, - val vendor: String, - val receive: Boolean, - val transmit: Boolean -) { - companion object { - fun list(): List { - val caps = mutableMapOf() - - val infos = MidiSystem.getMidiDeviceInfo() - for (info in infos) { - val device = MidiSystem.getMidiDevice(info) - val name = MidiDeviceName(info.name, info.vendor) - val deviceCaps = - caps.getOrPut(name) { MidiDeviceCapabilities() } - - if (device !is Sequencer && device !is Synthesizer) { - if (device.maxReceivers != 0 && device.maxTransmitters == 0) { - deviceCaps.receive = true - } - if (device.maxTransmitters != 0 && device.maxReceivers == 0) { - deviceCaps.transmit = true - } - } - } - return caps.map { - MidiDeviceDescription( - it.key.name, - it.key.vendor, - it.value.receive, - it.value.transmit - ) - } - } - } - - fun open(program: Program): MidiTransceiver { - require(receive && transmit) { - "MIDI device should be a receiver and transmitter" - } - - return MidiTransceiver.fromDeviceVendor(program, name, vendor) - } -} - -class MidiTransceiver(program: Program, val receiverDevice: MidiDevice?, val transmitterDevicer: MidiDevice?) { - companion object { - fun fromDeviceVendor(program: Program, name: String, vendor: String? = null): MidiTransceiver { - val infos = MidiSystem.getMidiDeviceInfo() - - var receiverDevice: MidiDevice? = null - var transmitterDevice: MidiDevice? = null - - for (info in infos) { - try { - val device = MidiSystem.getMidiDevice(info) - if (device !is Sequencer && device !is Synthesizer) { - if ((vendor == null || info.vendor == vendor) && info.name == name) { - logger.info { "found matching MIDI device $name / $vendor" } - if (device.maxTransmitters != 0 && device.maxReceivers == 0) { - transmitterDevice = device - logger.debug { - "found MIDI transmitter" - } - } - if (device.maxReceivers != 0 && device.maxTransmitters == 0) { - receiverDevice = device - logger.debug { - "found MIDI receiver" - } - } - } - } - } catch (e: MidiUnavailableException) { - error("no MIDI available") - } - } - - if (receiverDevice != null && transmitterDevice != null) { - receiverDevice.open() - transmitterDevice.open() - return MidiTransceiver(program, receiverDevice, transmitterDevice) - } else { - error("MIDI device not found ${name}:${vendor} $receiverDevice $transmitterDevice") - } - } - } - - private val receiver = receiverDevice?.receiver - private val transmitter = transmitterDevicer?.transmitter - - private inner class Destroyer : Thread() { - override fun run() { - destroy() - } - } - - private fun trigger(message: MidiMessage) { - val cmd = message.message - val channel = (cmd[0].toInt() and 0xff) and 0x0f - when (val eventType = message.eventType) { - - MidiEventType.NOTE_ON -> { - val key = cmd[1].toInt() and 0xff - val velocity = cmd[2].toInt() and 0xff - if (velocity > 0) { - noteOn.trigger(MidiEvent.noteOn(channel, key, velocity)) - } else { - noteOff.trigger(MidiEvent.noteOff(channel, key, velocity)) - } - } - - MidiEventType.NOTE_OFF -> noteOff.trigger( - MidiEvent.noteOff( - channel, - cmd[1].toInt() and 0xff, - cmd[2].toInt() and 0xff - ) - ) - - MidiEventType.CONTROL_CHANGE -> controlChanged.trigger( - MidiEvent.controlChange( - channel, - cmd[1].toInt() and 0xff, - cmd[2].toInt() and 0xff - ) - ) - - MidiEventType.PROGRAM_CHANGE -> programChanged.trigger( - MidiEvent.programChange( - channel, - cmd[1].toInt() and 0xff - ) - ) - - MidiEventType.CHANNEL_PRESSURE -> channelPressure.trigger( - MidiEvent.channelPressure( - channel, - cmd[1].toInt() and 0xff - ) - ) - - // https://sites.uci.edu/camp2014/2014/04/30/managing-midi-pitchbend-messages/ - // The next operation to combine two 7bit values - // was verified to give the same results as the Linux - // `midisnoop` program while using an `Alesis Vortex - // Wireless 2` device. This MIDI device does not provide a - // full range 14 bit pitch-bend resolution though, so - // a different device is needed to confirm the pitch bend - // values slide as expected from -8192 to +8191. - MidiEventType.PITCH_BEND -> pitchBend.trigger( - MidiEvent.pitchBend( - channel, - (cmd[2].toInt() shl 25 shr 18) + cmd[1].toInt() - ) - ) - - else -> { - logger.trace { "Unsupported MIDI event type: $eventType" } - } - - } - } - - init { - transmitter?.receiver = object : MidiDeviceReceiver { - override fun getMidiDevice(): MidiDevice? { - return null - } - override fun send(message: MidiMessage, timeStamp: Long) { - trigger(message) - } - override fun close() { - } - } - - val destroyer = Destroyer() - program.ended.listen { - destroyer.start() - } - - } - - val controlChanged = Event("midi-transceiver::controller-changed") - val programChanged = Event("midi-transceiver::program-changed") - val noteOn = Event("midi-transceiver::note-on") - val noteOff = Event("midi-transceiver::note-off") - val channelPressure = Event("midi-transceiver::channel-pressure") - val pitchBend = Event("midi-transceiver::pitch-bend") - - fun controlChange(channel: Int, control: Int, value: Int) { - send { ShortMessage(ShortMessage.CONTROL_CHANGE, channel, control, value) } - } - - fun programChange(channel: Int, program: Int) { - send { ShortMessage(ShortMessage.PROGRAM_CHANGE, channel, program) } - } - - fun noteOn(channel: Int, key: Int, velocity: Int) { - send { ShortMessage(ShortMessage.NOTE_ON, channel, key, velocity) } - } - - fun noteOff(channel: Int, key: Int, velocity: Int) { - send { ShortMessage(ShortMessage.NOTE_OFF, channel, key, velocity) } - } - - fun channelPressure(channel: Int, value: Int) { - send { ShortMessage(ShortMessage.CHANNEL_PRESSURE, channel, value) } - } - - fun pitchBend(channel: Int, value: Int) { - send { ShortMessage(ShortMessage.PITCH_BEND, channel, value) } - } - - fun destroy() { - receiverDevice?.close() - transmitterDevicer?.close() - } - - private fun send(block: () -> MidiMessage) { - if (receiver != null && receiverDevice != null) { - try { - val msg = block() - receiver.send(msg, receiverDevice.microsecondPosition) - } catch (e: InvalidMidiDataException) { - logger.warn { e.message } - } - } - } - -} - -/** - * List all available MIDI devices - * @since 0.4.3 - */ -fun listMidiDevices() = MidiDeviceDescription.list() - -/** - * Open a MIDI device by name - * @param name the name of the MIDI device to open. Either the - * exact name or the first characters of the name. - * Throws an exception if the device name is not found. - * @since 0.4.3 - */ -fun Program.openMidiDevice(name: String) = - openMidiDeviceOrNull(name) ?: error("MIDI device not found for query '$name'") - -/** - * Open a MIDI device by name - * - * @param name the name of the MIDI device to open. Either the - * exact name or the first characters of the name. - * Returns null if the device name is not found. - * @since 0.4.3 - */ -fun Program.openMidiDeviceOrNull(name: String): MidiTransceiver? { - val devices = listMidiDevices() - - val matchingDevice = devices.firstOrNull { - // Existing device name matches `name` - it.name == name - } ?: devices.firstOrNull { - // Existing device name starts with `name` - it.name.startsWith(name) - } - - return if(matchingDevice != null) - MidiTransceiver.fromDeviceVendor(this, matchingDevice.name) - else - null -} - -/** - * Open a dummy MIDI device - * - * Enables running programs that depend on a specific MIDI device - * when that device is not available. - * Usage: `val dev = openMidiDeviceOrNull("Twister") ?: dummyMidiDevice()` - * @since 0.4.3 - */ -fun Program.dummyMidiDevice() = MidiTransceiver(this, null, null) diff --git a/orx-jvm/orx-midi/src/test/kotlin/MidiTests.kt b/orx-jvm/orx-midi/src/test/kotlin/MidiTests.kt deleted file mode 100644 index 2ba0ea6c..00000000 --- a/orx-jvm/orx-midi/src/test/kotlin/MidiTests.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.openrndr.extra.midi - -import javax.sound.midi.Receiver -import javax.sound.midi.Transmitter - -class TestTransmitter : Transmitter { - - private var receiver: Receiver? = null - - override fun setReceiver(receiver: Receiver?) { - this.receiver = receiver - } - - override fun getReceiver(): Receiver? = receiver - - override fun close() { - receiver?.close() - } - -} \ No newline at end of file diff --git a/orx-jvm/orx-midi/src/test/kotlin/MidiTransceiverTest.kt b/orx-jvm/orx-midi/src/test/kotlin/MidiTransceiverTest.kt deleted file mode 100644 index 92473d4e..00000000 --- a/orx-jvm/orx-midi/src/test/kotlin/MidiTransceiverTest.kt +++ /dev/null @@ -1,118 +0,0 @@ -package org.openrndr.extra.midi - -import io.kotest.matchers.should -import io.kotest.matchers.shouldBe -import io.kotest.matchers.types.beInstanceOf -import io.mockk.* -import org.openrndr.Program -import java.util.concurrent.atomic.AtomicReference -import javax.sound.midi.MidiDevice -import javax.sound.midi.MidiMessage -import javax.sound.midi.Receiver -import javax.sound.midi.ShortMessage -import kotlin.test.Test - -@Suppress("MemberVisibilityCanBePrivate") -class MidiTransceiverTest { - - // given - val program = mockk(relaxed = true) - val receiver = mockk() - val receiverDevice = mockk(relaxed = true) - val messageSlot = slot() - - val transmitter = TestTransmitter() - val transmitterDevice = mockk() - - init { - every { receiverDevice.receiver } returns receiver - every { receiver.send(capture(messageSlot), any()) } just runs - every { transmitterDevice.transmitter } returns transmitter - } - - val transceiver = MidiTransceiver( - program, - receiverDevice, - transmitterDevice - ) - - @Test - fun `should send out NOTE_ON message`() { - // when - transceiver.noteOn(5, 10, 100) - - // then - messageSlot.captured should beInstanceOf() - (messageSlot.captured as ShortMessage).apply { - command shouldBe ShortMessage.NOTE_ON - channel shouldBe 5 - data1 shouldBe 10 - data2 shouldBe 100 - } - - } - - @Test - fun `should send out NOTE_OFF message`() { - // when - transceiver.noteOff(1, 10, 62) - - // then - messageSlot.captured should beInstanceOf() - (messageSlot.captured as ShortMessage).apply { - command shouldBe ShortMessage.NOTE_OFF - channel shouldBe 1 - data1 shouldBe 10 - data2 shouldBe 62 - } - } - - @Test - fun `should receive NOTE_ON event on receiving NOTE_ON message`() { - // given - val eventSlot = AtomicReference() - transceiver.noteOn.listen { - eventSlot.set(it) - } - - // when - transmitter.receiver!!.send( - ShortMessage(ShortMessage.NOTE_ON, 1, 2, 3), 1042 - ) - val noteOnEvent = eventSlot.get() - - // then - noteOnEvent.apply { - eventType shouldBe MidiEventType.NOTE_ON - origin shouldBe MidiEvent.Origin.DEVICE - channel shouldBe 1 - note shouldBe 2 - velocity shouldBe 3 - } - } - - @Test - fun `should receive NOTE_OFF event on receiving NOTE_ON message with velocity 0`() { - // given - val eventSlot = AtomicReference() - transceiver.noteOff.listen { - eventSlot.set(it) - } - - // when - transmitter.receiver!!.send( - ShortMessage(ShortMessage.NOTE_ON, 2, 3, 0), 1042 - ) - val noteOnEvent = eventSlot.get() - - // then - noteOnEvent.apply { - eventType shouldBe MidiEventType.NOTE_OFF - origin shouldBe MidiEvent.Origin.DEVICE - channel shouldBe 2 - note shouldBe 3 - velocity shouldBe 0 - } - } - -} diff --git a/orx-jvm/orx-minim/README.md b/orx-jvm/orx-minim/README.md deleted file mode 100644 index f020a11a..00000000 --- a/orx-jvm/orx-minim/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# orx-minim - -Simplifies working with the Minim sound library. -Provides sound synthesis and analysis. - -## Usage - -Add `orx-minim` to `orxFeatures` - -Check the examples: - -* [FFT visualization of live audio input](src/demo/kotlin/DemoFFT01.kt) -* [Additive synthesizer](src/demo/kotlin/DemoAdditive01.kt) - -## Further reading - - * [Minim website](https://code.compartmental.net/tools/minim/) - * [Minim's UGens](https://code.compartmental.net/minim/index_ugens.html) - * [Minim Github](https://github.com/ddf/Minim) - * [Minim Processing examples](https://github.com/ddf/Minim/tree/master/examples) \ No newline at end of file diff --git a/orx-jvm/orx-minim/build.gradle.kts b/orx-jvm/orx-minim/build.gradle.kts deleted file mode 100644 index 9950a88c..00000000 --- a/orx-jvm/orx-minim/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - api(project(":orx-parameters")) - api(project(":orx-jvm:orx-panel")) - api(libs.minim) { - exclude(group = "org.apache.maven.plugins", module = "maven-javadoc-plugin") - } - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.reflect) - demoRuntimeOnly(sharedLibs.slf4j.simple) -} \ No newline at end of file diff --git a/orx-jvm/orx-minim/src/demo/kotlin/DemoAdditive01.kt b/orx-jvm/orx-minim/src/demo/kotlin/DemoAdditive01.kt deleted file mode 100644 index c98bdee8..00000000 --- a/orx-jvm/orx-minim/src/demo/kotlin/DemoAdditive01.kt +++ /dev/null @@ -1,108 +0,0 @@ -import ddf.minim.ugens.Oscil -import ddf.minim.ugens.Pan -import org.openrndr.MouseTracker -import org.openrndr.application -import org.openrndr.color.rgb -import org.openrndr.extra.minim.minim -import org.openrndr.math.Polar -import kotlin.math.pow -import kotlin.random.Random - -/** - * Random drone generator and visualizer with 20 stereo voices. - * Hold the mouse button to randomize the frequencies. - * Press keys 'a' or 'b' for less random frequencies. - */ -fun main() = application { - program { - val minim = minim() - val out = minim.lineOut - - if (out == null) { - application.exit() - } - - // generates a random frequency value biased down - fun randomFreq() = 20f + Random.nextFloat().pow(3) * 1000 - - // If one didn't want to visualize or control the synths we - // wouldn't need a data structure to store them. Here we store - // Pairs, so we have access both to the frequency of the wave - // and the current amplitude defined by the lfo (low frequency - // oscillator). - val synths = List(20) { - // By default, Oscil creates sine waves, but it can be changed. - val lfo = Oscil( - Random.nextFloat() * 0.1f + 0.005f, - 0.05f - ).apply { - // Here we set the center of the lfo to 0.05f. - // Since the amplitude is also 0.05f, it moves between - // 0.00f and 0.10f. - offset.lastValue = 0.05f - - // Have the sine waves to not start in sync. - //phase.lastValue = Random.nextFloat() * 6.28f - } - val wave = Oscil(randomFreq(), 0f) - // The `lfo` Oscil controls the `wave` Oscil's amplitude. - lfo.patch(wave.amplitude) - // Random pan to avoid a mono sound. - val pan = Pan(Random.nextFloat() * 2 - 1) - wave.patch(pan) - pan.patch(out) - // Store a [Pair] in `synths`. - Pair(wave, lfo) - } - val bgColor = rgb(0.094, 0.188, 0.349) - val lineColor = rgb(0.992, 0.918, 0.671) - val mouseTracker = MouseTracker(mouse) - - extend { - drawer.clear(bgColor) - drawer.translate(drawer.bounds.center) - drawer.rotate(seconds) - // A CircleBatchBuilder for faster drawing of circles. - drawer.circles { - // For each synth draw a circle. - synths.forEachIndexed { i, (wave, lfo) -> - stroke = lineColor.opacify(Random.nextDouble(0.4) + 0.6) - fill = lineColor.opacify(Random.nextDouble() * 0.04) - // A Polar arrangement centered on the screen. - // Higher pitch circles are farther away from the center. - val pos = Polar( - 360.0 * i / synths.size, - 50.0 + wave.frequency.lastValue * 0.2 - ).cartesian - // The size of the circle depends on the current volume - // set by the lfo. - circle(pos, 500 * lfo.lastValues.last().toDouble()) - } - } - if (mouseTracker.pressedButtons.isNotEmpty()) { - synths.random().first.setFrequency(randomFreq()) - } - } - keyboard.keyDown.listen { key -> - when (key.name) { - "a" -> { - // make all frequencies close to a base frequency - // (circular arrangement) - val baseFreq = 20 + Random.nextFloat() * 200 - synths.forEach { - it.first.setFrequency(baseFreq + Random.nextFloat() * 20) - } - } - - "b" -> { - // make all frequencies follow an exponential series - // (spiral arrangement) - val inc = Random.nextFloat() * 0.1f - synths.forEachIndexed { i, (wave, _) -> - wave.setFrequency(25f.pow(1f + i * inc)) - } - } - } - } - } -} diff --git a/orx-jvm/orx-minim/src/demo/kotlin/DemoFFT01.kt b/orx-jvm/orx-minim/src/demo/kotlin/DemoFFT01.kt deleted file mode 100644 index 9927728a..00000000 --- a/orx-jvm/orx-minim/src/demo/kotlin/DemoFFT01.kt +++ /dev/null @@ -1,35 +0,0 @@ -import ddf.minim.Minim -import ddf.minim.analysis.FFT -import ddf.minim.analysis.LanczosWindow -import org.openrndr.application -import org.openrndr.extra.minim.minim -import org.openrndr.math.map -import kotlin.math.ln - -fun main() = application { - configure { - width = 1280 - height = 720 - } - - program { - val minim = minim() - if (minim.lineOut == null) { - application.exit() - } - - val lineIn = minim.getLineIn(Minim.MONO, 2048, 48000f) - if (lineIn == null) { - application.exit() - } - val fft = FFT(lineIn.bufferSize(), lineIn.sampleRate()) - fft.window(LanczosWindow()) - extend { - fft.forward(lineIn.mix) - for (i in 0 until 200) { - val bandDB = 20.0 * ln(2.0 * fft.getBand(i) / fft.timeSize()) - drawer.rectangle(i * 5.0, height / 2.0, 5.0, bandDB.map(0.0, -150.0, 0.0, -height / 8.0)) - } - } - } -} diff --git a/orx-jvm/orx-minim/src/demo/kotlin/DemoPlaySound01.kt b/orx-jvm/orx-minim/src/demo/kotlin/DemoPlaySound01.kt deleted file mode 100644 index 696c36de..00000000 --- a/orx-jvm/orx-minim/src/demo/kotlin/DemoPlaySound01.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.minim.minim - -fun main() = application { - program { - val minim = minim() - if (minim.lineOut == null) { - application.exit() - } - - val player = minim.loadFile( - "demo-data/sounds/26777__junggle__btn402.mp3" - ) - - // fade gain to -40dB in 15 seconds - player.shiftGain(player.gain, -40f, 15000) - - extend { - if (frameCount % 30 == 0) { - player.rewind() - //player.gain = Random.nextDouble(-20.0, 0.0).toFloat() - player.play() - } - } - } -} diff --git a/orx-jvm/orx-minim/src/main/kotlin/Minim.kt b/orx-jvm/orx-minim/src/main/kotlin/Minim.kt deleted file mode 100644 index 876e9abc..00000000 --- a/orx-jvm/orx-minim/src/main/kotlin/Minim.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.openrndr.extra.minim - -import ddf.minim.Minim -import org.openrndr.Program -import java.io.File -import java.io.InputStream - -class MinimObject { - @Suppress("UNUSED_PARAMETER") - fun sketchPath(fileName: String) = fileName - fun createInput(fileName: String) = File(fileName).inputStream() as InputStream -} - -fun Program.minim(): Minim { - val minim = Minim(MinimObject()) - ended.listen { - minim.stop() - - } - return minim -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/README.md b/orx-jvm/orx-olive/README.md deleted file mode 100644 index 9148b890..00000000 --- a/orx-jvm/orx-olive/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# orx-olive - -Provides live coding functionality: updates a running OPENRNDR program when you save your changes. - -## usage - -make sure that you add the following to your list of dependencies (next to orx-olive) -```gradle -implementation "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.3.31" -``` - -Then a simple live setup can created as follows: - -```kotlin -import org.openrndr.Program -import org.openrndr.application -import org.openrndr.extra.olive.Olive - -fun main() = application { - configure { - width = 768 - height = 576 - } - program { - extend(Olive()) - } -} -``` - -The extension will create a template script for you in `src/main/kotlin/live.kts`. You can -edit this to see how the program updates automatically. - -## Shade style errors - -Recent versions of `orx-olive` automatically set the `org.openrndr.ignoreShadeStyleErrors` property which -makes OPENRNDR ignore errors in the shade style and return the default shader. To get this behaviour in -older versions add `-Dorg.openrndr.ignoreShadeStyleErrors=true` to the JVM arguments. - -## Reloadable State - -Along with the extension comes a mechanism that allows state to be reloaded from a store on script reload. -This functionality is offered by the `Reloadable` class. - -An example `live.kts` in which the reloadable state is used: - -```kotlin -@file:Suppress("UNUSED_LAMBDA_EXPRESSION") -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -{ program: PersistentProgram -> - program.apply { - val a = object : Reloadable() { - var x : Double = 0.0 - } - a.reload() - - extend { - // do something with a.x here - } - } -} -``` - -The Reloadable store can be cleared using the `clearReloadables` function. - -### Reloadable GPU resources - -To store GPU resources or objects that use GPU resources (a.o. `ColorBuffer`, `VertexBuffer`, `Shader`, `BufferTexture`) in a `Reloadable` object one uses OPENRNDR's -`persistent {}` builder function. - -```kotlin -@file:Suppress("UNUSED_LAMBDA_EXPRESSION") -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -{ program: PersistentProgram -> - program.apply { - val a = object : Reloadable() { - var image = persistent { loadImage("data/images/pm5544.png" ) } - } - a.reload() - - extend { - drawer.image(a.image) - } - } -} -``` - - - - -Keep in mind that `Reloadable` should only be used for singleton classes. - -## Persistent Data -Sometimes you want to keep parts of your application persistent. In the following example -we show how you can prepare the host program to contain a persistent camera device. - -```kotlin -import org.openrndr.Program -import org.openrndr.application - -class PersistentProgram: Program() { - lateinit var camera: FFMPEGVideoPlayer -} - -fun main() = application{ - program(PersistentProgram()) { - camera = FFMPEGVideoPlayer.fromDevice() - camera.start() - - extend(Olive()) { - script = "src/main/PersistentCamera.Kt" - } - } -} -``` - -The live script `src/main/PersistentCamera.kts` then looks like this: - -```kotlin -@file:Suppress("UNUSED_LAMBDA_EXPRESSION") -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -{ program: PersistentProgram -> - program.apply { - extend { - camera.next() - drawer.drawStyle.colorMatrix = tint(ColorRGBa.GREEN) * grayscale(0.0, 0.0, 1.0) - camera.draw(drawer) - } - } -} -``` - - -## Demos -### DemoOlive01 - -Live-coding with [oliveProgram] - -![DemoOlive01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-olive/images/DemoOlive01Kt.png) - -[source code](src/demo/kotlin/DemoOlive01.kt) - -### DemoOliveFromScript01 - -Live-coding with [Olive], an older, not recommended, way to do things - -![DemoOliveFromScript01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-olive/images/DemoOliveFromScript01Kt.png) - -[source code](src/demo/kotlin/DemoOliveFromScript01.kt) diff --git a/orx-jvm/orx-olive/build.gradle.kts b/orx-jvm/orx-olive/build.gradle.kts deleted file mode 100644 index d6de6176..00000000 --- a/orx-jvm/orx-olive/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -tasks.test { - useJUnitPlatform { - } -} - -dependencies { - implementation(project(":orx-jvm:orx-file-watcher")) - implementation(project(":orx-jvm:orx-kotlin-parser")) - demoImplementation(project(":orx-jvm:orx-gui")) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(libs.kotlin.scriptingJvm) - implementation(libs.kotlin.scriptingJvmHost) - implementation(sharedLibs.kotlin.reflect) - implementation(libs.kotlin.scriptingJSR223) - implementation(sharedLibs.kotlin.coroutines) - demoImplementation(sharedLibs.kotlin.coroutines) - testImplementation(sharedLibs.kotest.runner) - testImplementation(sharedLibs.kotest.assertions) - testRuntimeOnly(sharedLibs.kotlin.reflect) -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/demo/kotlin/DemoOlive01.kt b/orx-jvm/orx-olive/src/demo/kotlin/DemoOlive01.kt deleted file mode 100644 index ef57f5a6..00000000 --- a/orx-jvm/orx-olive/src/demo/kotlin/DemoOlive01.kt +++ /dev/null @@ -1,44 +0,0 @@ -import org.openrndr.Extension -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extensions.SingleScreenshot -import org.openrndr.extra.olive.oliveProgram -import kotlin.math.cos - -/** - * Live-coding with [oliveProgram] - */ -fun main() = application { - configure { - width = 1280 - height = 720 - } - oliveProgram { - extend { - drawer.clear(ColorRGBa.PINK) - drawer.fill = ColorRGBa.WHITE - for (i in 0 until 100) { - drawer.circle( - width / 2.0 + cos(seconds + i) * 320.0, - i * 7.2, - cos(i + seconds * 0.5) * 20.0 + 20.0 - ) - } - } - } - // -- this is only needed for the automated screenshots - .olive.scriptLoaded.listen { - if (System.getProperty("takeScreenshot") == "true") { - // -- this is a bit of hack, we need to push the screenshot extension in front of the olive one - fun extendHead(extension: T, configure: T.() -> Unit): T { - program.extensions.add(0, extension) - extension.configure() - extension.setup(program) - return extension - } - extendHead(SingleScreenshot()) { - this.outputFile = System.getProperty("screenshotPath") - } - } - } -} diff --git a/orx-jvm/orx-olive/src/demo/kotlin/DemoOliveFromScript01.kt b/orx-jvm/orx-olive/src/demo/kotlin/DemoOliveFromScript01.kt deleted file mode 100644 index 9753e314..00000000 --- a/orx-jvm/orx-olive/src/demo/kotlin/DemoOliveFromScript01.kt +++ /dev/null @@ -1,37 +0,0 @@ -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.application - -import org.openrndr.extensions.SingleScreenshot -import org.openrndr.extra.olive.Olive - -/** - * Live-coding with [Olive], an older, not recommended, way to do things - */ -fun main() = application { - configure { - width = 768 - height = 576 - } - program { - - extend(Olive()) { - script = "orx-jvm/orx-olive/src/demo/kotlin/demo-olive-01.kts" - // -- this block is for automation purposes only - if (System.getProperty("takeScreenshot") == "true") { - scriptLoaded.listen { - // -- this is a bit of hack, we need to push the screenshot extension in front of the olive one - fun Program.extendHead(extension: T, configure: T.() -> Unit): T { - extensions.add(0, extension) - extension.configure() - extension.setup(this) - return extension - } - extendHead(SingleScreenshot()) { - this.outputFile = System.getProperty("screenshotPath") - } - } - } - } - } -} diff --git a/orx-jvm/orx-olive/src/demo/kotlin/DemoWindowedGUI01.kt b/orx-jvm/orx-olive/src/demo/kotlin/DemoWindowedGUI01.kt deleted file mode 100644 index a2344817..00000000 --- a/orx-jvm/orx-olive/src/demo/kotlin/DemoWindowedGUI01.kt +++ /dev/null @@ -1,60 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.gui.WindowedGUI -import org.openrndr.extra.olive.oliveProgram -import org.openrndr.extra.parameters.ColorParameter -import org.openrndr.extra.parameters.Description -import org.openrndr.extra.parameters.DoubleParameter -import org.openrndr.extra.parameters.IntParameter -import kotlin.math.cos -import kotlin.system.exitProcess - -/** - * Live-coding with [oliveProgram] and [WindowedGUI] - */ -fun main() { - // skip this demo on CI - if (System.getProperty("takeScreenshot") == "true") { - exitProcess(0) - } - application { - configure { - width = 720 - height = 720 - } - oliveProgram() { - val gui = WindowedGUI() - - val settings = @Description("Settings") object { - @DoubleParameter("radius", 0.0, 80.0) - var radius = 30.0 - - @ColorParameter("color") - var fill = ColorRGBa.RED - - @ColorParameter("background") - var background = ColorRGBa.BLACK - - @DoubleParameter("speed", 0.1, 10.0) - var speed = 1.0 - - @IntParameter("count", 1, 400) - var count = 100 - } - gui.add(settings) - - extend(gui) - extend { - drawer.clear(settings.background) - drawer.fill = settings.fill - for (i in 0 until settings.count) { - drawer.circle( - width / 2.0 + cos(settings. speed * seconds + i) * 320.0, - i * 7.2, - (cos(i + seconds * 0.5) * 1.0 + 1.0) * settings.radius - ) - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/demo/kotlin/demo-olive-01.kts b/orx-jvm/orx-olive/src/demo/kotlin/demo-olive-01.kts deleted file mode 100644 index d7350400..00000000 --- a/orx-jvm/orx-olive/src/demo/kotlin/demo-olive-01.kts +++ /dev/null @@ -1,14 +0,0 @@ -@file:Suppress("UNUSED_LAMBDA_EXPRESSION") -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* - -{ program: Program -> - program.apply { - extend { - drawer.clear(ColorRGBa.GRAY) - drawer.fill = ColorRGBa.PINK - drawer.circle(width/2.0, height/2.0 ,200.0) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/main/kotlin/Olive.kt b/orx-jvm/orx-olive/src/main/kotlin/Olive.kt deleted file mode 100644 index 07cc2cd9..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/Olive.kt +++ /dev/null @@ -1,213 +0,0 @@ -package org.openrndr.extra.olive - -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.async - -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.draw.Session -import org.openrndr.events.Event -import org.openrndr.exceptions.stackRootClassName -import org.openrndr.extra.kotlinparser.extractProgram -import org.openrndr.launch -import org.openrndr.extra.filewatcher.watchFile -import java.io.File - -private val logger = KotlinLogging.logger {} - - -private fun Event.saveListeners(store: MutableMap, List<(Any) -> Unit>>) { - @Suppress("UNCHECKED_CAST") - store[this] = listeners.map { it } as List<(Any) -> Unit> -} - -private fun Event.restoreListeners(store: Map, List<(Any) -> Unit>>) { - listeners.retainAll(store[this] ?: emptyList()) -} - -enum class OliveScriptHost { - JSR223, - JSR223_REUSE, - KOTLIN_SCRIPT -} - -@JvmRecord -data class ScriptLoadedEvent(val scriptFile: String) - -enum class ScriptMode { - KOTLIN_SCRIPT, - OLIVE_PROGRAM -} - -class Olive

      (val resources: Resources? = null, private var scriptMode: ScriptMode = ScriptMode.KOTLIN_SCRIPT) : Extension { - override var enabled: Boolean = true - var session: Session? = null - var scriptHost = OliveScriptHost.JSR223_REUSE - - val scriptLoaded = Event() - - internal var scriptChange: (String) -> Unit = {} - - var script = when (scriptMode) { - ScriptMode.KOTLIN_SCRIPT -> "src/main/kotlin/${stackRootClassName().split(".").last()}.kts" - else -> "src/main/kotlin/${stackRootClassName().split(".").last()}.kt" - } - set(value) { - field = value - scriptChange(value) - } - - /** - * reloads the active script - */ - fun reload() { - // watcher?.triggerChange() - } - - class ScriptWatcher - - - - private var watcherRequestStopEvent = Event() - private var watcher: (() -> Unit)? = null - - @OptIn(DelicateCoroutinesApi::class) - override fun setup(program: Program) { - System.setProperty("idea.io.use.fallback", "true") - System.setProperty("org.openrndr.ignoreShadeStyleErrors", "true") - - val store = mutableMapOf, List<(Any) -> Unit>>() - val originalExtensions = program.extensions.map { it } - val trackedListeners = listOf>(program.mouse.buttonDown, - program.mouse.buttonUp, - program.mouse.dragged, - program.mouse.moved, - program.mouse.scrolled, - program.keyboard.keyUp, - program.keyboard.keyDown, - program.keyboard.keyRepeat, - program.keyboard.character, - program.window.drop, - program.window.focused, - program.window.minimized, - program.window.moved, - program.window.sized, - program.window.unfocused, - program.requestAssets, - program.produceAssets - ) - - trackedListeners.forEach { it.saveListeners(store) } - - val originalAssetMetadata = program.assetMetadata - val originalAssetProperties = program.assetProperties.toMutableMap() - - fun setupScript(scriptFile: String) { - if (watcher != null) { - logger.info { "requesting watcher stop" } - watcherRequestStopEvent.trigger(Unit) - } else { - logger.info { "no existing watcher" } - } - val f = File(scriptFile) - if (!f.exists()) { - f.parentFile.mkdirs() - var className = program.javaClass.name - if (className.contains("$")) - className = "Program" - - f.writeText(""" - @file:Suppress("UNUSED_LAMBDA_EXPRESSION") - import org.openrndr.Program - import org.openrndr.draw.* - - { program: $className -> - program.apply { - extend { - - } - } - } - """.trimIndent()) - } - - val jsr233ObjectLoader = if (scriptHost == OliveScriptHost.JSR223_REUSE) ScriptObjectLoader() else null - - watcher = watchFile(File(script), requestStopEvent = watcherRequestStopEvent) { - try { - logger.info { "change detected, reloading script" } - - val scriptContents = when (scriptMode) { - ScriptMode.KOTLIN_SCRIPT -> it.readText() - ScriptMode.OLIVE_PROGRAM -> { - val source = it.readText() - val programSource = extractProgram(source, programIdentifier = "oliveProgram") - generateScript(programSource) - } - } - - val futureFunc = GlobalScope.async { - val start = System.currentTimeMillis() - val loadedFunction = when (scriptHost) { - OliveScriptHost.JSR223_REUSE -> loadFromScriptContents(scriptContents, jsr233ObjectLoader!!) - OliveScriptHost.JSR223 -> loadFromScriptContents(scriptContents) - OliveScriptHost.KOTLIN_SCRIPT -> loadFromScriptContentsKSH Unit>(scriptContents) - } - - val end = System.currentTimeMillis() - logger.info { "loading script took ${end - start}ms" } - loadedFunction - } - - program.launch { - val func = futureFunc.await() - program.extensions.forEach {extension -> - extension.shutdown(program) - } - program.extensions.clear() - program.extensions.addAll(originalExtensions) - program.assetMetadata = originalAssetMetadata - program.assetProperties = originalAssetProperties - - trackedListeners.forEach { l -> l.restoreListeners(store) } - session?.end() - session = Session.root.fork() - - @Suppress("UNCHECKED_CAST") - func(program as P) - scriptLoaded.trigger(ScriptLoadedEvent(scriptFile)) - Unit - } - Unit - } catch (e: Throwable) { - e.printStackTrace() - } - } - } - setupScript(script) - scriptChange = ::setupScript - - if (resources != null) { - val srcPath = "src/main/resources" - var src = File(srcPath) - - resources.watch(src) { file -> - val dest = "build/resources/main" - val filePath = file.path.split(Regex(srcPath), 2).getOrNull(1) - - val destFile = File("$dest/${filePath}").absoluteFile - - watchFile(file) { - if (resources[file]!! && filePath != null) { - file.copyTo(destFile, overwrite = true) - reload() - } else { - resources[file] = true - } - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/main/kotlin/OliveProgram.kt b/orx-jvm/orx-olive/src/main/kotlin/OliveProgram.kt deleted file mode 100644 index 64507807..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/OliveProgram.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.openrndr.extra.olive - -import org.openrndr.ApplicationBuilder -import org.openrndr.ProgramImplementation -import java.io.File -import java.nio.file.Files -import java.nio.file.Paths -import kotlin.reflect.KProperty - -open class OliveProgram(private val sourceLocation: String, private val scriptHost: OliveScriptHost, resources: Resources?) : ProgramImplementation() { - val olive = extend(Olive(scriptMode = ScriptMode.OLIVE_PROGRAM, resources = resources)) { - script = sourceLocation - scriptHost = this@OliveProgram.scriptHost - } -} - -/** - * Delegate used to create instances exactly once. Instances survive a script reload. - */ -class Once(val build:() -> T) { - companion object { - private val values = mutableMapOf() - } - @Suppress("UNCHECKED_CAST") - operator fun getValue(thisRef:Any?, property:KProperty<*>) : T = values.getOrPut(property.name) { build() } as T -} - -fun stackRootClassName(thread: Thread = Thread.currentThread(), sanitize: Boolean = true): String { - val root = Thread.currentThread().stackTrace.last() - val rootClass = root.className - return if (sanitize) rootClass.replace(Regex("Kt$"), "") else rootClass -} - -fun ApplicationBuilder.oliveProgram(scriptHost: OliveScriptHost = OliveScriptHost.JSR223, resources: Resources? = null, init: OliveProgram.() -> Unit): OliveProgram { - val rootClassName = stackRootClassName(sanitize = true).split(".").last() - - var sourceLocation = "src/main/kotlin/$rootClassName.kt" - val candidateFile = File(sourceLocation) - val rootClassNameCleaned = if (rootClassName.startsWith("_")) rootClassName.drop(1) else rootClassName - - if (!candidateFile.exists()) { - val otherCandidates = Files.walk(Paths.get(".")) - .filter { Files.isRegularFile(it) && it.toString().endsWith("$rootClassNameCleaned.kt") }.toList() - if (otherCandidates.size == 1) { - sourceLocation = otherCandidates.first().toString() - } else { - error("multiple source candidates found for $rootClassName: $otherCandidates") - } - } - program = object : OliveProgram(sourceLocation, scriptHost, resources) { - override suspend fun setup() { - super.setup() - init() - } - } - return program as OliveProgram -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/main/kotlin/Reloadable.kt b/orx-jvm/orx-olive/src/main/kotlin/Reloadable.kt deleted file mode 100644 index 09e7e4a8..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/Reloadable.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.openrndr.extra.olive - -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlin.reflect.KMutableProperty1 -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.declaredMemberProperties -import kotlin.reflect.jvm.jvmName - -private val logger = KotlinLogging.logger {} - -private val store = mutableMapOf() - -/** - * Clear reloadable values - */ -fun clearReloadables() { - store.clear() -} - -/** - * A class with which persistent state can be reloaded from inside Olive scripts. - */ -open class Reloadable { - private fun normalizeClassName(name: String): String { - return name.replace( - Regex("ScriptingHost[0-9a-f]+_"), // -- since kotlin 1.3.61 the scripting host prepends class names with the host id - "" - ).replace(Regex("Line_[0-9]+"), "") // -- when reusing the script engine the line number increments. - } - - /** - * reload property values from store - */ - @Suppress("UNCHECKED_CAST") - fun reload() { - val className = normalizeClassName(this::class.jvmName) - val existing = store[className] - if (existing != null) { - for (p in this::class.declaredMemberProperties) { - val e = existing::class.declaredMemberProperties.find { it.name == p.name } - if (e != null) { - try { - val value = (e as KProperty1).get(existing) - val mp = (p as KMutableProperty1) - mp.set(this, value as Any) - logger.info { "reloaded property ${p.name} <- ${value}" } - } catch (e: Throwable) { - logger.warn { "error while reloading property ${p.name}: ${e.message}" } - } - } - } - } else { - logger.info { "no existing store found for $className" } - } - store[normalizeClassName(this::class.jvmName)] = this - } -} diff --git a/orx-jvm/orx-olive/src/main/kotlin/Resources.kt b/orx-jvm/orx-olive/src/main/kotlin/Resources.kt deleted file mode 100644 index c64bc3fd..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/Resources.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.openrndr.extra.olive - -import java.io.File - -class Resources(val filterOutExtensions: List = listOf()) { - private val watchedResources = mutableMapOf() - - fun watch(src: File, watchFn: (file: File) -> Unit) { - src.listFiles()!!.forEach {file -> - if (file.isFile && !filterOutExtensions.contains(file.extension)) { - watchedResources[file] = false - - watchFn(file) - } else if (file.isDirectory) { - watch(file, watchFn) - } - } - } - - operator fun get(file: File): Boolean? { - return watchedResources[file] - } - - operator fun set(file: File, value: Boolean) { - if (watchedResources.containsKey(file)) { - watchedResources[file] = value - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/main/kotlin/ScriptGenerator.kt b/orx-jvm/orx-olive/src/main/kotlin/ScriptGenerator.kt deleted file mode 100644 index 36d655aa..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/ScriptGenerator.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.openrndr.extra.olive - -import org.openrndr.extra.kotlinparser.ProgramSource - -inline fun generateScript(programSource: ProgramSource): String { - val script = """ - -//${programSource.packageName?:""} - -import org.openrndr.extra.olive.OliveProgram -${programSource.imports} - -{ program: ${T::class.qualifiedName} -> - program.apply { - ${programSource.programLambda} - } -} -""" - return script -} \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt b/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt deleted file mode 100644 index f061bf9a..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderJSR233.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.openrndr.extra.olive - -import io.github.oshai.kotlinlogging.KotlinLogging -import java.io.File -import java.io.InputStream -import java.io.Reader -import java.net.MalformedURLException -import java.net.URI -import java.net.URL -import javax.script.ScriptEngineManager - -private val logger = KotlinLogging.logger {} - -class LoadException(message: String? = null, cause: Throwable? = null) : RuntimeException(message, cause) - -class ScriptObjectLoader(classLoader: ClassLoader? = Thread.currentThread().contextClassLoader) { - val engine = run { - val start = System.currentTimeMillis() - val engine = ScriptEngineManager(classLoader).getEngineByExtension("kts") - val end = System.currentTimeMillis() - logger.info { "creating scripting engine took ${end-start}ms" } - engine - } - - init { - require(engine != null) { "could not create scripting engine" } - } - - fun safeEval(evaluation: () -> R?) = try { - evaluation() - } catch (e: Exception) { - e.printStackTrace() - throw LoadException("Cannot load script", e) - } - - inline fun Any?.castOrError() = takeIf { it is T }?.let { it as T } - ?: throw IllegalArgumentException("Cannot cast $this to expected type ${T::class}") - - inline fun load(script: String): T = safeEval { engine.eval(script) }.castOrError() - - inline fun load(reader: Reader): T = safeEval { engine.eval(reader) }.castOrError() - - inline fun load(inputStream: InputStream): T = load(inputStream.reader()) - - inline fun loadAll(vararg inputStream: InputStream): List = inputStream.map(::load) -} - - -/** - * Load an object from script. - */ -inline fun loadFromScript(fileOrUrl: String, loader: ScriptObjectLoader = ScriptObjectLoader()): T { - val isUrl = try { - URL(fileOrUrl); true - } catch (e: MalformedURLException) { - false - } - - val script = if (isUrl) { - URL(fileOrUrl).readText() - } else { - File(fileOrUrl).readText() - } - return loader.load(script) -} - -/** - * Load an object from script file - */ -inline fun loadFromScript(file: File, loader: ScriptObjectLoader = ScriptObjectLoader()): T = - loader.load(file.readText()) - - -/** - * Load an object from script file - */ -inline fun loadFromScriptContents(contents:String, loader: ScriptObjectLoader = ScriptObjectLoader()): T = - loader.load(contents) diff --git a/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderKSH.kt b/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderKSH.kt deleted file mode 100644 index cb89f4f0..00000000 --- a/orx-jvm/orx-olive/src/main/kotlin/ScriptObjectLoaderKSH.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.openrndr.extra.olive - -import java.io.File -import kotlin.script.experimental.api.* -import kotlin.script.experimental.host.BasicScriptingHost -import kotlin.script.experimental.host.toScriptSource -import kotlin.script.experimental.jvm.dependenciesFromCurrentContext -import kotlin.script.experimental.jvm.jvm -import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost -import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate -import kotlin.script.templates.standard.SimpleScriptTemplate - -internal fun evalScriptWithConfiguration( - script: String, - host: BasicScriptingHost = BasicJvmScriptingHost(), - body: ScriptCompilationConfiguration.Builder.() -> Unit = {} -): ResultWithDiagnostics { - val compilationConfiguration = createJvmCompilationConfigurationFromTemplate(body = body) - return host.eval(script.toScriptSource(), compilationConfiguration, null) -} - -@Suppress("UNCHECKED_CAST") -fun loadFromScriptKSH( - script: File, - host: BasicScriptingHost = BasicJvmScriptingHost(), - body: ScriptCompilationConfiguration.Builder.() -> Unit = { - - jvm { - dependenciesFromCurrentContext(wholeClasspath = true) - } - - } -): T = loadFromScriptContentsKSH(script.readText(), host, body) - -@Suppress("UNCHECKED_CAST") -fun loadFromScriptContentsKSH( - script: String, - host: BasicScriptingHost = BasicJvmScriptingHost(), - body: ScriptCompilationConfiguration.Builder.() -> Unit = { - - jvm { - dependenciesFromCurrentContext(wholeClasspath = true) - } - - } -): T = (evalScriptWithConfiguration(script, host, body).valueOrThrow().returnValue as ResultValue.Value).value as T - - - diff --git a/orx-jvm/orx-olive/src/test/kotlin/TestLoadScript.kt b/orx-jvm/orx-olive/src/test/kotlin/TestLoadScript.kt deleted file mode 100644 index abff20c6..00000000 --- a/orx-jvm/orx-olive/src/test/kotlin/TestLoadScript.kt +++ /dev/null @@ -1,16 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import io.kotest.matchers.equals.shouldBeEqual -import org.openrndr.extra.olive.ScriptObjectLoader - -class TestLoadScript : DescribeSpec({ - - describe("some script") { - val loader = ScriptObjectLoader() - - val number = loader.load("5") - - it("should evaluate properly") { - number shouldBeEqual 5 - } - } -}) \ No newline at end of file diff --git a/orx-jvm/orx-olive/src/test/kotlin/TestLoadScriptKSH.kt b/orx-jvm/orx-olive/src/test/kotlin/TestLoadScriptKSH.kt deleted file mode 100644 index e539f925..00000000 --- a/orx-jvm/orx-olive/src/test/kotlin/TestLoadScriptKSH.kt +++ /dev/null @@ -1,14 +0,0 @@ -import io.kotest.core.spec.style.DescribeSpec -import io.kotest.matchers.equals.shouldBeEqual -import org.openrndr.extra.olive.loadFromScriptContentsKSH - -class TestLoadScriptKSH : DescribeSpec({ - - describe("some script") { - val number = loadFromScriptContentsKSH("5") - - it("should evaluate properly") { - number shouldBeEqual 5 - } - } -}) \ No newline at end of file diff --git a/orx-jvm/orx-osc/README.md b/orx-jvm/orx-osc/README.md deleted file mode 100644 index c066866d..00000000 --- a/orx-jvm/orx-osc/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# orx-osc - -Open Sound Control makes it possible to send and receive messages -from other OSC enabled programs in the same or a different computer. -Used to create multi-application or multi-device software. - -Can be used to remote control your program from a mobile device, -to produce sound in a audio programming environment, make games -and networked experiments. - -Orx-osc is a wrapper around javaOSC - -## Usage - -```kotlin -// PORT IN and OUT: 57110 -val osc = OSC() - -osc.listen("/live/track2") { addr, msg -> - // do something -} - -osc.send("/maxmsp/filter", 500, "hz") -``` - -For more examples please visit the [guide](https://guide.openrndr.org/OPENRNDRExtras/osc.html). diff --git a/orx-jvm/orx-osc/build.gradle.kts b/orx-jvm/orx-osc/build.gradle.kts deleted file mode 100644 index 821ffe02..00000000 --- a/orx-jvm/orx-osc/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(libs.javaosc.core) { - exclude(group = "org.slf4j") - exclude(group = "log4j") - } -} \ No newline at end of file diff --git a/orx-jvm/orx-osc/src/main/kotlin/OSC.kt b/orx-jvm/orx-osc/src/main/kotlin/OSC.kt deleted file mode 100644 index 805917c7..00000000 --- a/orx-jvm/orx-osc/src/main/kotlin/OSC.kt +++ /dev/null @@ -1,83 +0,0 @@ -package org.openrndr.extra.osc - -import com.illposed.osc.OSCMessage -import com.illposed.osc.OSCMessageListener -import com.illposed.osc.messageselector.OSCPatternAddressMessageSelector -import com.illposed.osc.transport.OSCPort -import com.illposed.osc.transport.OSCPortIn -import com.illposed.osc.transport.OSCPortOut -import io.github.oshai.kotlinlogging.KotlinLogging -import java.net.InetAddress -import java.net.PortUnreachableException -import kotlin.reflect.KMutableProperty0 - -private typealias OSCListener = Pair - -private val logger = KotlinLogging.logger {} - -@Suppress("unused") -class OSC ( - val address: InetAddress = InetAddress.getLocalHost(), - val portIn: Int = OSCPort.DEFAULT_SC_OSC_PORT, - val portOut: Int = portIn -) { - private val receiver: OSCPortIn = OSCPortIn(portIn) - private val sender: OSCPortOut = OSCPortOut(address, portOut) - private val listeners: MutableMap = mutableMapOf() - - fun send(channel: String, vararg message: T) { - if (!sender.isConnected) sender.connect() - - val msg = OSCMessage(channel, message.toList()) - - try { - sender.send(msg) - } catch (ex: PortUnreachableException) { - logger.error(ex) { "Error: Could not connect to OUT port" } - } catch (ex: IllegalStateException) { - logger.error(ex) { "Error: Couldn't send message to channel: $channel" } - } - } - - fun listen(channel: String, callback: (String, List) -> Unit) { - val selector = OSCPatternAddressMessageSelector(channel); - - val cb = OSCMessageListener { - callback(it.message.address, it.message.arguments) - } - - receiver.dispatcher.addListener(selector, cb) - - listeners[channel] = Pair(selector, cb) - - if (!receiver.isListening) this.startListening() - } - - infix fun String.bind(prop: KMutableProperty0) { - val channel = this - - listen(channel) { _, it -> - when (val message = it.first()) { - is Double -> prop.set(message) - is Float -> prop.set(message.toDouble()) - } - } - } - - // Cannot be called inside a listener's callback - fun removeListener(channel: String?) { - val listener = listeners[channel] - - if (listener != null) { - receiver.dispatcher.removeListener(listener.first, listener.second) - } - } - - private fun startListening() { - receiver.dispatcher.isAlwaysDispatchingImmediately = true; - - receiver.startListening() - - if (receiver.isListening) logger.info { "OSC is listening on port: $portIn" } - } -} diff --git a/orx-jvm/orx-panel/README.md b/orx-jvm/orx-panel/README.md deleted file mode 100644 index a3264d54..00000000 --- a/orx-jvm/orx-panel/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# orx-panel - -The OPENRNDR UI toolkit. Provides buttons, sliders, text, a color picker and much more. HTML/CSS-like. - - -## Demos -### DemoColorPickerButton01 - -A simple demonstration of a ColorPickerButton - -![DemoColorPickerButton01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-panel/images/DemoColorPickerButton01Kt.png) - -[source code](src/demo/kotlin/DemoColorPickerButton01.kt) - -### DemoHorizontalLayout01 - - - -![DemoHorizontalLayout01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-panel/images/DemoHorizontalLayout01Kt.png) - -[source code](src/demo/kotlin/DemoHorizontalLayout01.kt) - -### DemoVerticalLayout01 - - - -![DemoVerticalLayout01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-panel/images/DemoVerticalLayout01Kt.png) - -[source code](src/demo/kotlin/DemoVerticalLayout01.kt) - -### DemoWatchDiv01 - - - -![DemoWatchDiv01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-panel/images/DemoWatchDiv01Kt.png) - -[source code](src/demo/kotlin/DemoWatchDiv01.kt) - -### DemoWatchObjectDiv01 - - - -![DemoWatchObjectDiv01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-panel/images/DemoWatchObjectDiv01Kt.png) - -[source code](src/demo/kotlin/DemoWatchObjectDiv01.kt) diff --git a/orx-jvm/orx-panel/build.gradle.kts b/orx-jvm/orx-panel/build.gradle.kts deleted file mode 100644 index a3050edc..00000000 --- a/orx-jvm/orx-panel/build.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -tasks.test { - useJUnitPlatform { - } -} - -dependencies { - implementation(project(":orx-expression-evaluator")) - implementation(project(":orx-color")) - implementation(project(":orx-text-writer")) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.coroutines) - implementation(sharedLibs.kotlin.reflect) - testRuntimeOnly(sharedLibs.kotlin.reflect) - demoImplementation(openrndr.dialogs) - demoImplementation(libs.gson) - demoImplementation(project(":orx-jvm:orx-panel")) -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/demo/kotlin/DemoColorPickerButton01.kt b/orx-jvm/orx-panel/src/demo/kotlin/DemoColorPickerButton01.kt deleted file mode 100644 index 4a021324..00000000 --- a/orx-jvm/orx-panel/src/demo/kotlin/DemoColorPickerButton01.kt +++ /dev/null @@ -1,33 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.colorpickerButton - -/** - * A simple demonstration of a ColorPickerButton - */ -fun main() = application { - configure { - width = 720 - height = 720 - } - program { - var bgColor = ColorRGBa.PINK - - val cm = controlManager { - layout { - colorpickerButton { - label = "Pick color" - color = bgColor - events.valueChanged.listen { - bgColor = it.color - } - } - } - } - extend(cm) - extend { - drawer.clear(bgColor) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/demo/kotlin/DemoHorizontalLayout01.kt b/orx-jvm/orx-panel/src/demo/kotlin/DemoHorizontalLayout01.kt deleted file mode 100644 index 3dfab7d7..00000000 --- a/orx-jvm/orx-panel/src/demo/kotlin/DemoHorizontalLayout01.kt +++ /dev/null @@ -1,77 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.math.Spherical -import org.openrndr.math.Vector3 -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.button -import org.openrndr.panel.elements.div -import org.openrndr.panel.elements.h1 -import org.openrndr.panel.style.* - -fun main() = application { - program { - val cm = controlManager { - styleSheet(has class_ "horizontal") { - paddingLeft = 10.px - paddingTop = 10.px - - // ---------------------------------------------- - // The next two lines produce a horizontal layout - // ---------------------------------------------- - display = Display.FLEX - flexDirection = FlexDirection.Row - width = 100.percent - } - - styleSheet(has type "h1") { - marginTop = 10.px - marginLeft = 7.px - marginBottom = 10.px - } - - layout { - val header = h1 { "click a button..." } - - div("horizontal") { - // A bunch of names for generating buttons - listOf( - "load", "save", "redo", "stretch", "bounce", - "twist", "swim", "roll", "fly", "dance" - ) - .forEachIndexed { i, word -> - - // A fun way of generating a set of colors - // of similar brightness: - // Grab a point on the surface of a sphere - // and treat its coordinates as an rgb color. - val pos = Vector3.fromSpherical( - Spherical(i * 19.0, i * 17.0, 0.4) - ) - val rgb = ColorRGBa.fromVector(pos + 0.4) - - button { - label = word - style = styleSheet { - // Use Color.RGBa() to convert a ColorRGBa - // color (the standard color datatype) - // into "CSS" format: - background = Color.RGBa(rgb) - } - - // When the button is clicked replace - // the header text with the button's label - events.clicked.listen { - header.replaceText(it.source.label) - } - } - } - } - } - } - extend(cm) - extend { - drawer.clear(ColorRGBa(0.2, 0.18, 0.16, 1.0, Linearity.SRGB)) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/demo/kotlin/DemoVerticalLayout01.kt b/orx-jvm/orx-panel/src/demo/kotlin/DemoVerticalLayout01.kt deleted file mode 100644 index e83a37a1..00000000 --- a/orx-jvm/orx-panel/src/demo/kotlin/DemoVerticalLayout01.kt +++ /dev/null @@ -1,40 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.div -import org.openrndr.panel.elements.slider -import org.openrndr.panel.style.* - -fun main() = application { - program { - val cm = controlManager { - styleSheet(has class_ "side-bar") { - this.height = 100.percent - this.width = 200.px - this.display = Display.FLEX - this.flexDirection = FlexDirection.Column - this.paddingLeft = 10.px - this.paddingRight = 10.px - this.background = Color.RGBa(ColorRGBa.GRAY) - } - styleSheet(has type "slider") { - this.marginTop = 25.px - this.marginBottom = 25.px - } - layout { - div("side-bar") { - slider { - label = "Slider 1" - } - slider { - label = "Slider 2" - } - } - } - } - extend(cm) - extend { - - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt b/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt deleted file mode 100644 index ada29fac..00000000 --- a/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt +++ /dev/null @@ -1,123 +0,0 @@ -import com.google.gson.Gson -import org.openrndr.application -import org.openrndr.dialogs.openFileDialog -import org.openrndr.dialogs.saveFileDialog -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.* -import org.openrndr.panel.style.* -import java.io.File - -// -- these have to be top-level classes or Gson will silently fail. -private class ConfigItem { - var value: Double = 0.0 -} - -private class ProgramState { - var rows = 1 - var columns = 1 - val matrix = mutableListOf(mutableListOf(ConfigItem())) - - fun copyTo(programState: ProgramState) { - programState.rows = rows - programState.columns = columns - programState.matrix.clear() - programState.matrix.addAll(matrix) - } - - fun save(file: File) { - file.writeText(Gson().toJson(this)) - } - - fun load(file: File) { - Gson().fromJson(file.readText(), ProgramState::class.java).copyTo(this) - } -} - -fun main() = application { - configure { - width = 900 - height = 720 - } - - program { - val programState = ProgramState() - val cm = controlManager { - layout { - styleSheet(has class_ "matrix") { - this.width = 100.percent - } - - styleSheet(has class_ "row") { - this.display = Display.FLEX - this.flexDirection = FlexDirection.Row - this.width = 100.percent - - child(has type "slider") { - this.width = 80.px - } - } - - button { - label = "save" - clicked { - saveFileDialog(supportedExtensions = listOf("JSON" to listOf("json"))) { - programState.save(it) - } - } - } - - button { - label = "load" - clicked { - openFileDialog(supportedExtensions = listOf("JSON" to listOf("json"))) { - programState.load(it) - } - } - } - - slider { - label = "rows" - precision = 0 - bind(programState::rows) - - events.valueChanged.listen { - while (programState.matrix.size > programState.rows) { - programState.matrix.removeAt(programState.matrix.size - 1) - } - while (programState.matrix.size < programState.rows) { - programState.matrix.add(MutableList(programState.columns) { ConfigItem() }) - } - } - } - - slider { - label = "columns" - precision = 0 - bind(programState::columns) - events.valueChanged.listen { - for (row in programState.matrix) { - while (row.size > programState.columns) { - row.removeAt(row.size - 1) - } - while (row.size < programState.columns) { - row.add(ConfigItem()) - } - } - } - } - - watchListDiv("matrix", watchList = programState.matrix) { row -> - watchListDiv("row", watchList = row) { item -> - this.id = "some-row" - slider { - label = "value" - bind(item::value) - } - } - } - } - } - extend(cm) - } -} - diff --git a/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchObjectDiv01.kt b/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchObjectDiv01.kt deleted file mode 100644 index 6c078dc1..00000000 --- a/orx-jvm/orx-panel/src/demo/kotlin/DemoWatchObjectDiv01.kt +++ /dev/null @@ -1,68 +0,0 @@ -import org.openrndr.application -import org.openrndr.panel.controlManager -import org.openrndr.panel.elements.* -import org.openrndr.panel.style.* - - -fun main() = application { - configure { - width = 900 - height = 720 - } - // A very simple state - class State { - var x = 0 - var y = 0 - var z = 0 - } - program { - val programState = State() - val cm = controlManager { - layout { - styleSheet(has class_ "matrix") { - this.width = 100.percent - } - - styleSheet(has class_ "row") { - this.display = Display.FLEX - this.flexDirection = FlexDirection.Row - this.width = 100.percent - - child(has type "slider") { - this.width = 80.px - } - } - - slider { - label = "x" - precision = 0 - bind(programState::x) - } - - slider { - label = "y" - precision = 0 - bind(programState::y) - } - - watchObjectDiv("matrix", watchObject = object { - // for primitive types we have to use property references - val x = programState::x - val y = programState::y - }) { - for (y in 0 until watchObject.y.get()) { - div("row") { - for (x in 0 until watchObject.x.get()) { - button() { - label = "$x, $y" - } - } - } - } - } - } - } - extend(cm) - } -} - diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/ControlManager.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/ControlManager.kt deleted file mode 100644 index 9a3ba3c7..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/ControlManager.kt +++ /dev/null @@ -1,603 +0,0 @@ -package org.openrndr.panel - -import io.github.oshai.kotlinlogging.KotlinLogging -import org.openrndr.* -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.panel.elements.* -import org.openrndr.panel.layout.Layouter -import org.openrndr.panel.style.* -import org.openrndr.panel.style.Display -import org.openrndr.shape.Rectangle -import org.w3c.dom.Node -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -private val logger = KotlinLogging.logger {} - -class ControlManager : Extension { - var body: Element? = null - val layouter = Layouter() - val fontManager = FontManager() - lateinit var window: Window - private val renderTargetCache = HashMap() - - lateinit var program: Program - override var enabled: Boolean = true - - var contentScale = 1.0 - var renderTarget: RenderTarget? = null - - init { - fontManager.register("default", resourceUrl("/fonts/Roboto-Regular.ttf")) - layouter.styleSheets.addAll(defaultStyles().flatMap { it.flatten() }) - } - - inner class DropInput { - var target: Element? = null - fun drop(event: DropEvent) { - target?.drop?.dropped?.trigger(event) - } - } - - val dropInput = DropInput() - - - inner class KeyboardInput { - private var lastTarget: Element? = null - var target: Element? = null - set(value) { - if (value != field) { - field?.pseudoClasses?.remove(ElementPseudoClass("active")) - field?.keyboard?.focusLost?.trigger(FocusEvent()) - value?.keyboard?.focusGained?.trigger(FocusEvent()) - field = value - field?.pseudoClasses?.add(ElementPseudoClass("active")) - value?.let { - lastTarget = it - } - } - } - - fun press(event: KeyEvent) { - target?.let { - if (it.isHidden()) { - return - } - var current: Element? = it - while (current != null) { - if (!event.propagationCancelled) { - current.keyboard.pressed.trigger(event) - } - current = current.parent - } - checkForManualRedraw() - } - - if (!event.propagationCancelled) { - if (event.key == KEY_TAB) { - val focusableControls = body?.findAllVisible { it.handlesKeyboardFocus } ?: emptyList() - - val index = target?.let { focusableControls.indexOf(it) } - ?: lastTarget?.let { focusableControls.indexOf(it) } ?: -1 - if (focusableControls.isNotEmpty()) { - - target = if (target != null) { - if (KeyModifier.SHIFT in event.modifiers) { - focusableControls[(index - 1).mod(focusableControls.size)] - } else { - focusableControls[(index + 1).mod(focusableControls.size)] - } - } else { - lastTarget ?: focusableControls[0] - } - } - } - } - } - - fun release(event: KeyEvent) { - if (target?.isHidden() == true) { - return - } - - target?.keyboard?.released?.trigger(event) - if (target != null) { - checkForManualRedraw() - } - } - - fun repeat(event: KeyEvent) { - if (target?.isHidden() == true) { - return - } - - target?.keyboard?.repeated?.trigger(event) - if (target != null) { - checkForManualRedraw() - } - } - - fun character(event: CharacterEvent) { - if (target?.isHidden() == true) { - return - } - - target?.keyboard?.character?.trigger(event) - if (target != null) { - checkForManualRedraw() - } - } - - fun requestFocus(element: Element) { - target = element - } - } - - val keyboardInput = KeyboardInput() - - inner class MouseInput { - var dragTarget: Element? = null - var clickTarget: Element? = null - var lastClick = System.currentTimeMillis() - - fun scroll(event: MouseEvent) { - fun traverse(element: Element) { - if (element.computedStyle.display == Display.NONE) { - return - } - for (child in element.children) { - traverse(child) - } - if (!event.propagationCancelled) { - if (event.position in element.screenArea && element.computedStyle.display != Display.NONE) { - element.mouse.scrolled.trigger(event) - if (event.propagationCancelled) { - keyboardInput.target = element - } - } - } - } - body?.let(::traverse) - checkForManualRedraw() - } - - fun click(event: MouseEvent) { - logger.debug { "click event: $event" } - dragTarget = null - val ct = System.currentTimeMillis() - logger.debug { "click target: $clickTarget" } - - clickTarget?.let { - if (it.isHidden()) { - return - } - if (it.handlesDoubleClick) { - if (ct - lastClick > 500) { - logger.debug { "normal click on $clickTarget" } - it.mouse.clicked.trigger(event) - } else { - if (clickTarget != null) { - logger.debug { "double-click on $clickTarget" } - it.mouse.doubleClicked.trigger(event) - } - } - lastClick = ct - } else { - logger.debug { "normal click on $clickTarget" } - it.mouse.clicked.trigger(event) - } - } - checkForManualRedraw() - } - - fun press(event: MouseEvent) { - logger.debug { "press event: $event" } - val candidates = mutableListOf>() - fun traverse(element: Element, depth: Int = 0) { - if (element.computedStyle.display == Display.NONE) { - return - } - if (element.computedStyle.overflow == Overflow.Scroll) { - if (event.position !in element.screenArea) { - return - } - } - - if (element.computedStyle.display != Display.NONE) { - element.children.forEach { traverse(it, depth + 1) } - } - - if (!event.propagationCancelled && event.position in element.screenArea && element.computedStyle.display != Display.NONE) { - candidates.add(Pair(element, depth)) - } - } - - body?.let { traverse(it) } - //candidates.sortByDescending { it.second } - clickTarget = null - candidates.sortWith(compareBy({ -it.first.layout.zIndex }, { -it.second })) - for (c in candidates) { - if (!event.propagationCancelled) { - c.first.mouse.pressed.trigger(event) - if (event.propagationCancelled) { - logger.debug { "propagation cancelled by ${c.first}" } - dragTarget = c.first - clickTarget = c.first - keyboardInput.target = c.first - } - } - } - - if (clickTarget == null) { - dragTarget = null - keyboardInput.target = null - } - - checkForManualRedraw() - } - - fun drag(event: MouseEvent) { - logger.debug { "drag event $event" } - dragTarget?.let { - if (it.isHidden()) { - dragTarget = null - return - } - it.mouse.dragged.trigger(event) - } - - if (event.propagationCancelled) { - logger.debug { "propagation cancelled by $dragTarget setting clickTarget to null" } - clickTarget = null - } - checkForManualRedraw() - } - - val insideElements = mutableSetOf() - fun move(event: MouseEvent) { - val hover = ElementPseudoClass("hover") - val toRemove = insideElements.filter { (event.position !in it.screenArea) } - - toRemove.forEach { - it.mouse.exited.trigger( - MouseEvent( - event.position, - Vector2.ZERO, - Vector2.ZERO, - MouseEventType.MOVED, - MouseButton.NONE, - event.modifiers - ) - ) - } - - insideElements.removeAll(toRemove) - - fun traverse(element: Element) { - if (event.position in element.screenArea) { - if (element !in insideElements) { - element.mouse.entered.trigger(event) - } - insideElements.add(element) - if (hover !in element.pseudoClasses) { - element.pseudoClasses.add(hover) - } - element.mouse.moved.trigger(event) - } else { - if (hover in element.pseudoClasses) { - element.pseudoClasses.remove(hover) - } - } - element.children.forEach(::traverse) - } - body?.let(::traverse) - checkForManualRedraw() - } - } - - fun checkForManualRedraw() { - if (window.presentationMode == PresentationMode.MANUAL) { - val redraw = body?.any { - it.draw.dirty - } ?: false - if (redraw) { - window.requestDraw() - } - } - } - - val mouseInput = MouseInput() - override fun setup(program: Program) { - - fontManager.program = program - this.program = program - - contentScale = program.window.contentScale - window = program.window - - fontManager.contentScale = contentScale - program.mouse.buttonUp.listen { mouseInput.click(it) } - program.mouse.moved.listen { mouseInput.move(it) } - program.mouse.scrolled.listen { mouseInput.scroll(it) } - program.mouse.dragged.listen { mouseInput.drag(it) } - program.mouse.buttonDown.listen { mouseInput.press(it) } - - program.keyboard.keyDown.listen { keyboardInput.press(it) } - program.keyboard.keyUp.listen { keyboardInput.release(it) } - program.keyboard.keyRepeat.listen { keyboardInput.repeat(it) } - program.keyboard.character.listen { keyboardInput.character(it) } - - program.window.drop.listen { dropInput.drop(it) } - program.window.sized.listen { resize(program, it.size.x.toInt(), it.size.y.toInt()) } - - width = program.width - height = program.height - - body?.draw?.dirty = true - } - - var width: Int = 0 - var height: Int = 0 - - private fun resize(program: Program, width: Int, height: Int) { - this.width = width - this.height = height - - // check if user did not minimize window - if (width > 0 && height > 0) { - body?.draw?.dirty = true - val lrc = renderTarget - if (lrc != null) { - if (lrc.colorAttachments.isNotEmpty()) { - lrc.colorBuffer(0).destroy() - lrc.depthBuffer?.destroy() - lrc.detachColorAttachments() - lrc.detachDepthBuffer() - lrc.destroy() - } else { - logger.error { "that is strange. no color buffers" } - } - } - - renderTarget = renderTarget(program.width, program.height, contentScale) { - colorBuffer() - depthBuffer() - } - - renderTarget?.bind() - program.drawer.clear(ColorRGBa.BLACK.opacify(0.0)) - renderTarget?.unbind() - - renderTargetCache.forEach { (_, u) -> u.destroy() } - renderTargetCache.clear() - } - } - - private fun drawElement(element: Element, drawer: Drawer, zIndex: Int, zComp: Int) { - val newZComp = - element.computedStyle.zIndex.let { - when (it) { - is ZIndex.Value -> it.value - else -> zComp - } - } - - if (element.computedStyle.display != Display.NONE) { - if (element.computedStyle.overflow == Overflow.Visible) { - drawer.isolated { - drawer.drawStyle.textSetting = TextSettingMode.PIXEL - drawer.translate(element.screenPosition) - if (newZComp == zIndex) { - element.draw(drawer) - } - } - element.children.forEach { - drawElement(it, drawer, zIndex, newZComp) - } - } else { - val area = element.screenArea - val rt = renderTargetCache.computeIfAbsent(element) { - renderTarget(width, height, contentScale) { - colorBuffer() - depthBuffer() - } - } - - rt.bind() - drawer.clear(ColorRGBa.BLACK.opacify(0.0)) - - drawer.pushProjection() - drawer.ortho(rt) - element.children.forEach { - drawElement(it, drawer, zIndex, newZComp) - } - rt.unbind() - drawer.popProjection() - - drawer.pushTransforms() - drawer.pushStyle() - drawer.translate(element.screenPosition) - - if (newZComp == zIndex) { - element.draw(drawer) - } - drawer.popStyle() - drawer.popTransforms() - - drawer.drawStyle.blendMode = BlendMode.OVER - //drawer.image(rt.colorMap(0)) - drawer.image( - rt.colorBuffer(0), Rectangle(Vector2(area.x, area.y), area.width, area.height), - Rectangle(Vector2(area.x, area.y), area.width, area.height) - ) - } - } - element.draw.dirty = false - - } - - class ProfileData(var hits: Int = 0, var time: Long = 0) - - private val profiles = mutableMapOf() - private fun profile(name: String, f: () -> Unit) { - val start = System.currentTimeMillis() - f() - val end = System.currentTimeMillis() - val pd = profiles.getOrPut(name) { ProfileData(0, 0L) } - pd.hits++ - pd.time += (end - start) - - if (pd.hits == 100) { - //println("name: $name, avg: ${pd.time / pd.hits}ms, ${pd.hits}") - pd.hits = 0 - pd.time = 0 - } - } - - var drawCount = 0 - override fun afterDraw(drawer: Drawer, program: Program) { - if (program.width > 0 && program.height > 0) { - if (program.width != renderTarget?.width || program.height != renderTarget?.height) { - body?.draw?.dirty = true - - renderTarget?.colorBuffer(0)?.destroy() - renderTarget?.destroy() - renderTarget = null - - } - - if (renderTarget == null) { - renderTarget = renderTarget(program.width, program.height, contentScale) { - colorBuffer() - } - renderTarget!!.bind() - program.drawer.clear(ColorRGBa.BLACK.opacify(0.0)) - renderTarget!!.unbind() - } - - val redraw = body?.any { - it.draw.dirty - } ?: false - - if (redraw) { - drawer.ortho() - drawer.view = Matrix44.IDENTITY - drawer.defaults() - - renderTarget!!.bind() - body?.style = StyleSheet(CompoundSelector()) - body?.style?.width = program.width.px - body?.style?.height = program.height.px - - body?.let { - program.drawer.clear(ColorRGBa.BLACK.opacify(0.0)) - layouter.computeStyles(it) - layouter.layout(it) - drawElement(it, program.drawer, 0, 0) - drawElement(it, program.drawer, 1, 0) - drawElement(it, program.drawer, 1000, 0) - } - renderTarget!!.unbind() - } - - body?.visit { - draw.dirty = false - } - - drawer.ortho(RenderTarget.active) - drawer.view = Matrix44.IDENTITY - drawer.defaults() - program.drawer.image(renderTarget!!.colorBuffer(0), 0.0, 0.0) - - drawCount++ - } - } -} - -class ControlManagerBuilder(val controlManager: ControlManager) { - fun styleSheet(selector: CompoundSelector, init: StyleSheet.() -> Unit): StyleSheet { - val styleSheet = StyleSheet(selector).apply { init() } - controlManager.layouter.styleSheets.addAll(styleSheet.flatten()) - return styleSheet - } - - fun styleSheets(styleSheets: List) { - controlManager.layouter.styleSheets.addAll(styleSheets.flatMap { it.flatten() }) - } - - @OptIn(ExperimentalContracts::class) - fun layout(init: Body.() -> Unit) { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val body = Body(controlManager) - body.init() - controlManager.body = body - } -} - - -fun ControlManager.styleSheet(selector: CompoundSelector, init: StyleSheet.() -> Unit): StyleSheet { - val styleSheet = StyleSheet(selector).apply { init() } - layouter.styleSheets.addAll(styleSheet.flatten()) - return styleSheet -} - -fun ControlManager.styleSheets(styleSheets: List) { - layouter.styleSheets.addAll(styleSheets.flatMap { it.flatten() }) -} - -fun ControlManager.layout(init: Body.() -> Unit) { - val body = Body(this) - body.init() - this.body = body -} - -@OptIn(ExperimentalContracts::class) -fun Program.controlManager( - defaultStyles: List = defaultStyles(), - builder: ControlManagerBuilder.() -> Unit -): ControlManager { - contract { - callsInPlace(builder, InvocationKind.EXACTLY_ONCE) - } - val cm = ControlManager() - cm.program = this - cm.fontManager.register("default", resourceUrl("/fonts/Roboto-Regular.ttf")) - cm.layouter.styleSheets.addAll(defaultStyles.flatMap { it.flatten() }) - val cmb = ControlManagerBuilder(cm) - cmb.builder() - return cm -} - -private fun Element.any(function: (Element) -> Boolean): Boolean { - if (function(this)) { - return true - } else { - children.forEach { - if (it.any(function)) { - return true - } - } - return false - } -} - -private fun Element.anyVisible(function: (Element) -> Boolean): Boolean { - if (computedStyle.display != Display.NONE && function(this)) { - return true - } - - if (computedStyle.display != Display.NONE) { - children.forEach { - if (it.anyVisible(function)) { - return true - } - } - } - return false -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/FontManager.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/FontManager.kt deleted file mode 100644 index 43020928..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/FontManager.kt +++ /dev/null @@ -1,27 +0,0 @@ -package org.openrndr.panel - -import org.openrndr.Program -import org.openrndr.draw.FontImageMap -import org.openrndr.draw.loadFont -import org.openrndr.panel.style.LinearDimension -import org.openrndr.panel.style.StyleSheet -import org.openrndr.panel.style.fontFamily -import org.openrndr.panel.style.fontSize - -class FontManager() { - var program: Program? = null - val registry: MutableMap = mutableMapOf() - var contentScale: Double = 1.0 - - fun resolve(name: String): String? = registry[name] - - fun font(cs: StyleSheet): FontImageMap { - val fontUrl = resolve(cs.fontFamily) ?: "cp:fonts/Roboto-Medium.ttf" - val fontSize = (cs.fontSize as? LinearDimension.PX)?.value ?: 16.0 - return program?.loadFont(fontUrl, fontSize) ?: error("no program") - } - - fun register(name: String, url: String) { - registry[name] = url - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableCopyOnWriteArrayList.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableCopyOnWriteArrayList.kt deleted file mode 100644 index 017d2ac0..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableCopyOnWriteArrayList.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.openrndr.panel.collections - -import org.openrndr.events.Event -import java.util.concurrent.CopyOnWriteArrayList - -class ObservableCopyOnWriteArrayList : CopyOnWriteArrayList() { - - val changed = Event>() - override fun add(element: E): Boolean { - return if (super.add(element)) { - changed.trigger(this) - true - } else { - false - } - } - - override fun remove(element: E): Boolean { - return if (super.remove(element)) { - changed.trigger(this) - true - } else { - false - } - } - - override fun clear() { - super.clear() - changed.trigger(this) - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableHashSet.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableHashSet.kt deleted file mode 100644 index bcb093c1..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/collections/ObservableHashSet.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.openrndr.panel.collections - -import org.openrndr.events.Event -import java.util.* - -class ObservableHashSet : HashSet() { - - class ChangeEvent(val source: ObservableHashSet, val added: Set, val removed: Set) - - val changed = Event>() - - override fun add(element: E): Boolean { - return if (super.add(element)) { - changed.trigger(ChangeEvent(this, setOf(element), emptySet())) - true - } else { - false - } - } - - override fun remove(element: E): Boolean { - return if (super.remove(element)) { - changed.trigger(ChangeEvent(this, emptySet(), setOf(element))) - true - } else { - false - } - } - - override fun clear() { - val old = this.toSet() - super.clear() - changed.trigger(ChangeEvent(this, emptySet(), old)) - } - -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Body.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Body.kt deleted file mode 100644 index 6f53b6be..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Body.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.panel.ControlManager - -class Body(val controlManager: ControlManager) : Element(ElementType("Body")) \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Button.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Button.kt deleted file mode 100644 index c0e3a5ff..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Button.kt +++ /dev/null @@ -1,108 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer - -import org.openrndr.draw.isolated -import org.openrndr.draw.loadFont -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.panel.style.* -import org.openrndr.shape.Rectangle - -import kotlin.math.round - - -class Button : Element(ElementType("button")) { - - override val handlesKeyboardFocus = true - var label: String = "OK" - - class ButtonEvent(val source: Button) - class Events(val clicked: Event = Event()) - - var data: Any? = null - - val events = Events() - - init { - mouse.pressed.listen { - it.cancelPropagation() - } - - mouse.clicked.listen { - if (disabled !in pseudoClasses) { - events.clicked.trigger(ButtonEvent(this)) - } - it.cancelPropagation() - } - - keyboard.pressed.listen { - if (it.key == 32) { - it.cancelPropagation() - if (disabled !in pseudoClasses) { - events.clicked.trigger(ButtonEvent(this)) - } - } - } - } - - override val widthHint: Double - get() { - computedStyle.let { style -> - val fontUrl = (root() as? Body)?.controlManager?.fontManager?.resolve(style.fontFamily) ?: "broken" - val fontSize = (style.fontSize as? LinearDimension.PX)?.value ?: 14.0 - - val program = (root() as? Body)?.controlManager?.program ?: error("no program") - val fontMap = program.loadFont(fontUrl, fontSize) - - val writer = TextWriter(null) - - writer.box = Rectangle(0.0, - 0.0, - Double.POSITIVE_INFINITY, - Double.POSITIVE_INFINITY) - - writer.drawStyle.fontMap = fontMap - writer.newLine() - writer.text(label, visible = false) - - return writer.cursor.x - } - } - - override fun draw(drawer: Drawer) { - - computedStyle.let { - - drawer.pushTransforms() - drawer.pushStyle() - drawer.fill = ((it.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - - drawer.isolated { - drawer.stroke = computedStyle.effectiveBorderColor - drawer.strokeWeight = computedStyle.effectiveBorderWidth - drawer.rectangle(0.0, 0.0, layout.screenWidth, layout.screenHeight) - } - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - val writer = TextWriter(drawer) - drawer.fontMap = (font) - val textWidth = writer.textWidth(label) - val textHeight = font.ascenderLength - - val offset = round((layout.screenWidth - textWidth) / 2.0) - val yOffset = round((layout.screenHeight / 2) + textHeight / 2.0 - 2.0) * 1.0 - - drawer.fill = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE).opacify( - if (disabled in pseudoClasses) 0.25 else 1.0 - ) - drawer.text(label, 0.0 + offset, 0.0 + yOffset) - } - - drawer.popStyle() - drawer.popTransforms() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Canvas.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Canvas.kt deleted file mode 100644 index 0ae9526a..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Canvas.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.math.Matrix44 - -class Canvas : Element(ElementType("canvas")) { - var userDraw: ((Drawer) -> Unit)? = null - private var renderTarget: RenderTarget? = null - - override fun draw(drawer: Drawer) { - val width = screenArea.width.toInt() - val height = screenArea.height.toInt() - - if (renderTarget != null) { - if (renderTarget?.width != width || renderTarget?.height != height) { - renderTarget?.colorBuffer(0)?.destroy() - renderTarget?.destroy() - renderTarget = null - } - } - - if (screenArea.width >= 1 && screenArea.height >= 1) { - if (renderTarget == null) { - renderTarget = renderTarget(screenArea.width.toInt(), screenArea.height.toInt(), drawer.context.contentScale) { - colorBuffer() - depthBuffer() - } - } - - renderTarget?.let { rt -> - drawer.isolatedWithTarget(rt) { - model = Matrix44.IDENTITY - view = Matrix44.IDENTITY - clear(ColorRGBa.TRANSPARENT) - ortho(rt) - userDraw?.invoke(this) - } - drawer.image(rt.colorBuffer(0), 0.0, 0.0) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Colorpicker.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Colorpicker.kt deleted file mode 100644 index 5537c016..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Colorpicker.kt +++ /dev/null @@ -1,172 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.* -import org.openrndr.color.ColorHSVa -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.draw.ColorBuffer -import org.openrndr.draw.Drawer -import org.openrndr.draw.colorBuffer -import org.openrndr.events.Event -import org.openrndr.panel.style.Color -import org.openrndr.panel.style.color - -class Colorpicker : Element { - - internal var colorMap: ColorBuffer? = null - - var label: String = "Color" - - var saturation = 0.5 - var color: ColorRGBa - set(value) { - realColor = value - saturation = color.toHSVa().s - generateColorMap() - draw.dirty = true - } - get() { - return realColor - } - - private var realColor = ColorRGBa.WHITE - private var focussed = false - - class ColorChangedEvent(val source: Colorpicker, - val oldColor: ColorRGBa, - val newColor: ColorRGBa) - - class Events { - val colorChanged = Event() - } - - val events = Events() - - private var keyboardInput = "" - private fun pick(e: MouseEvent) { - val dx = e.position.x - layout.screenX - var dy = e.position.y - layout.screenY - - dy = 50.0 - dy - val oldColor = color - val hsv = ColorHSVa(360.0 / layout.screenWidth * dx, saturation, dy / 50.0) - realColor = hsv.toRGBa() - draw.dirty = true - events.colorChanged.trigger(ColorChangedEvent(this, oldColor, realColor)) - e.cancelPropagation() - } - constructor() : super(ElementType("colorpicker")) { - generateColorMap() - - mouse.exited.listen { - focussed = false - } - - mouse.scrolled.listen { - if (colorMap != null) { - //if (focussed) { - saturation = (saturation - it.rotation.y * 0.01).coerceIn(0.0, 1.0) - generateColorMap() - colorMap?.shadow?.upload() - it.cancelPropagation() - pick(it) - requestRedraw() - //} - } - } - - keyboard.focusLost.listen { - keyboardInput = "" - draw.dirty = true - } - - keyboard.character.listen { - keyboardInput += it.character - draw.dirty = true - it.cancelPropagation() - } - - keyboard.pressed.listen { - - if (KeyModifier.CTRL in it.modifiers || KeyModifier.SUPER in it.modifiers) { - if (it.name == "v") { - (root() as Body).controlManager.program.clipboard.contents?.let { - keyboardInput += it - draw.dirty = true - } - it.cancelPropagation() - } - } - if (it.key == KEY_BACKSPACE) { - if (!keyboardInput.isEmpty()) { - keyboardInput = keyboardInput.substring(0, keyboardInput.length - 1) - draw.dirty = true - - } - it.cancelPropagation() - } - - if (it.key == KEY_ESCAPE) { - keyboardInput = "" - draw.dirty = true - it.cancelPropagation() - } - - - if (it.key == KEY_ENTER) { - val cleanKeyboardInput = keyboardInput.replace(Regex("^#"), "") - val number = if (cleanKeyboardInput.length == 6) cleanKeyboardInput.toIntOrNull(16) else null - - number?.let { - val r = (number shr 16) and 0xff - val g = (number shr 8) and 0xff - val b = number and 0xff - val oldColor = color - color = ColorRGBa(r / 255.0, g / 255.0, b / 255.0, 1.0, Linearity.SRGB) - events.colorChanged.trigger(ColorChangedEvent(this, oldColor, realColor)) - keyboardInput = "" - draw.dirty = true - } - it.cancelPropagation() - } - } - - - mouse.pressed.listen { it.cancelPropagation(); focussed = true } - mouse.clicked.listen { it.cancelPropagation(); pick(it); focussed = true; } - mouse.dragged.listen { it.cancelPropagation(); pick(it); focussed = true; } - } - - private fun generateColorMap() { - colorMap?.shadow?.let { - for (y in 0..49) { - for (x in 0 until it.colorBuffer.width) { - val hsv = ColorHSVa(360.0 / it.colorBuffer.width * x, saturation, (49 - y) / 49.0) - it.write(x, y, hsv.toRGBa().toLinear()) - } - } - it.upload() - } - } - - override fun draw(drawer: Drawer) { - if (colorMap == null) { - colorMap = colorBuffer(layout.screenWidth.toInt(), 50, 1.0) - generateColorMap() - } - - drawer.image(colorMap!!, 0.0, 0.0) - drawer.fill = color - drawer.stroke = null - drawer.shadeStyle = null - drawer.rectangle(0.0, 50.0, layout.screenWidth, 20.0) - - val f = (root() as? Body)?.controlManager?.fontManager?.font(computedStyle)!! - drawer.fontMap = f - drawer.fill = ((computedStyle.color as Color.RGBa).color) - - if (keyboardInput.isNotBlank()) { - drawer.text("input: $keyboardInput", 0.0, layout.screenHeight) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/ColorpickerButton.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/ColorpickerButton.kt deleted file mode 100644 index 21381057..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/ColorpickerButton.kt +++ /dev/null @@ -1,156 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.yield -import org.openrndr.color.ColorRGBa -import org.openrndr.color.Linearity -import org.openrndr.draw.Drawer -import org.openrndr.draw.LineCap - -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.launch -import org.openrndr.panel.style.* - -import kotlin.reflect.KMutableProperty0 - -class ColorpickerButton : Element(ElementType("colorpicker-button")), DisposableElement { - override var disposed: Boolean = false - - var label: String = "OK" - var color: ColorRGBa = ColorRGBa(0.5, 0.5, 0.5, linearity = Linearity.SRGB) - set(value) { - if (value != field) { - field = value - requestRedraw() - events.valueChanged.trigger(ColorChangedEvent(this, value)) - } - } - - class ColorChangedEvent(val source: ColorpickerButton, val color: ColorRGBa) - - class Events { - val valueChanged = Event() - } - - val events = Events() - - init { - mouse.pressed.listen { - it.cancelPropagation() - } - mouse.clicked.listen { - append(SlideOut(0.0, screenArea.height, screenArea.width, 200.0, color, this)) - it.cancelPropagation() - } - } - - override fun append(element: Element) { - when (element) { - is Item, is SlideOut -> super.append(element) - else -> throw RuntimeException("only item and slideout") - } - super.append(element) - } - - fun items(): List = children.filter { it is Item }.map { it as Item } - - override fun draw(drawer: Drawer) { - - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.stroke = null - drawer.strokeWeight = 0.0 - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - - val writer = TextWriter(drawer) - drawer.fontMap = (font) - - val text = "$label" - - val textWidth = writer.textWidth(text) - val textHeight = font.ascenderLength - - val offset = Math.round((layout.screenWidth - textWidth) / 2.0) - val yOffset = Math.round((layout.screenHeight / 2) + textHeight / 2.0) - 2.0 - - drawer.fill = (computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE - drawer.fontMap = font - drawer.text(text, 0.0 + offset, 0.0 + yOffset) - drawer.stroke = color - drawer.pushStyle() - drawer.strokeWeight = 4.0 - drawer.lineCap = LineCap.ROUND - drawer.lineSegment(2.0, layout.screenHeight - 2.0, layout.screenWidth - 2.0, layout.screenHeight - 2.0) - drawer.popStyle() - } - } - - class SlideOut(val x: Double, val y: Double, val width: Double, val height: Double, color: ColorRGBa, parent: Element) : Element(ElementType("slide-out")) { - - init { - style = StyleSheet(CompoundSelector.DUMMY).apply { - position = Position.ABSOLUTE - left = LinearDimension.PX(x) - top = LinearDimension.PX(y) - width = LinearDimension.PX(this@SlideOut.width) - height = LinearDimension.Auto//LinearDimension.PX(this@SlideOut.height) - overflow = Overflow.Scroll - zIndex = ZIndex.Value(1000) - background = Color.RGBa(ColorRGBa(0.3, 0.3, 0.3)) - } - - val colorPicker = Colorpicker().apply { - this.color = color - label = (parent as ColorpickerButton).label - events.colorChanged.listen { - parent.color = it.newColor - parent.events.valueChanged.trigger(ColorChangedEvent(parent, parent.color)) - } - } - append(colorPicker) - - mouse.exited.listen { - dispose() - } - } - - override fun draw(drawer: Drawer) { - (root() as Body).controlManager.keyboardInput.requestFocus(children[0]) - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - } - - fun dispose() { - parent?.remove(this) - } - } -} - -fun ColorpickerButton.bind(property: KMutableProperty0) { - var currentValue: ColorRGBa? = null - - events.valueChanged.listen { - currentValue = color - property.set(it.color) - } - if (root() as? Body == null) { - throw RuntimeException("no body") - } - - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - color = lcur - } - } - update() - (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - update() - yield() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Div.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Div.kt deleted file mode 100644 index 4e523608..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Div.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.panel.style.* -import kotlin.math.max - -open class Div : TextElement(ElementType("div")) { - init { - mouse.pressed.listen { - if (computedStyle.effectiveBackground?.alpha?:0.0 > 0.0) { - it.cancelPropagation() - } - } - mouse.scrolled.listen { - computedStyle.let { cs -> - if (cs.overflow != Overflow.Visible) { - scrollTop -= it.rotation.y * 10 - scrollTop = max(0.0, scrollTop) - draw.dirty = true - it.cancelPropagation() - } - } - } - } - - override fun draw(drawer: Drawer) { - computedStyle.let { style -> - style.background.let { - drawer.fill = ((it as? Color.RGBa)?.color ?: ColorRGBa.BLACK) - drawer.stroke = null - drawer.strokeWeight = 0.0 - //drawer.smooth(false) - drawer.rectangle(0.0, 0.0, layout.screenWidth, layout.screenHeight) - //drawer.smooth(true) - } - } - } - - override fun toString(): String { - return "Div(id=${id})" - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/DropdownButton.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/DropdownButton.kt deleted file mode 100644 index 0fc920ba..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/DropdownButton.kt +++ /dev/null @@ -1,287 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.yield -import org.openrndr.KEY_ARROW_DOWN -import org.openrndr.KEY_ARROW_UP -import org.openrndr.KEY_ENTER -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.draw.loadFont -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.launch -import org.openrndr.panel.style.* -import org.openrndr.shape.Rectangle -import kotlin.math.max -import kotlin.math.min -import kotlin.math.roundToInt -import kotlin.reflect.KMutableProperty0 - -class Item : Element(ElementType("item")) { - var label: String = "" - var data: Any? = null - - class PickedEvent(val source: Item) - - class Events { - val picked = Event() - } - - val events = Events() - - fun picked() { - events.picked.trigger(PickedEvent(this)) - } -} - -class DropdownButton : Element(ElementType("dropdown-button")), DisposableElement { - override var disposed = false - - var label: String = "OK" - var value: Item? = null - - class ValueChangedEvent(val source: DropdownButton, val value: Item) - - class Events { - val valueChanged = Event() - } - - val events = Events() - - init { - mouse.pressed.listen { - it.cancelPropagation() - } - - mouse.clicked.listen { - val itemCount = items().size - - if (children.none { it is SlideOut }) { - val height = min(240.0, itemCount * 24.0) - if (screenPosition.y < root().layout.screenHeight - height) { - val so = SlideOut(0.0, screenArea.height, screenArea.width, height, this, value) - append(so) - (root() as Body).controlManager.keyboardInput.requestFocus(so) - } else { - val so = SlideOut(0.0, screenArea.height - height, screenArea.width, height, this, value) - append(so) - (root() as Body).controlManager.keyboardInput.requestFocus(so) - } - } else { - (children.first { it is SlideOut } as SlideOut?)?.dispose() - } - } - } - - override val widthHint: Double? - get() { - computedStyle.let { style -> - val fontUrl = (root() as? Body)?.controlManager?.fontManager?.resolve(style.fontFamily) ?: "broken" - val fontSize = (style.fontSize as? LinearDimension.PX)?.value ?: 16.0 - - val program = (root() as? Body)?.controlManager?.program ?: error("no program") - val fontMap = program.loadFont(fontUrl, fontSize) - - val writer = TextWriter(null) - - writer.box = Rectangle(0.0, - 0.0, - Double.POSITIVE_INFINITY, - Double.POSITIVE_INFINITY) - - val text = "$label ${(value?.label) ?: ""}" - writer.drawStyle.fontMap = fontMap - writer.newLine() - writer.text(text, visible = false) - - return writer.cursor.x + 10.0 - } - } - - - override fun append(element: Element) { - when (element) { - is Item, is SlideOut -> super.append(element) - else -> throw RuntimeException("only item and slideout") - } - super.append(element) - } - - fun items(): List = children.filterIsInstance().map { it } - - override fun draw(drawer: Drawer) { - - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.stroke = null - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - - val writer = TextWriter(drawer) - drawer.fontMap = (font) - - val text = (value?.label) ?: "" - - val textWidth = writer.textWidth(text) - val textHeight = font.ascenderLength - - val offset = Math.round((layout.screenWidth - textWidth)) - val yOffset = ((layout.screenHeight / 2) + textHeight / 2.0).roundToInt() - 2.0 - - drawer.fill = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE) - - drawer.text(label, 5.0, 0.0 + yOffset) - drawer.text(text, -5.0 + offset, 0.0 + yOffset) - } - } - - class SlideOut(val x: Double, val y: Double, val width: Double, val height: Double, parent: Element, active: Item?) : Element(ElementType("slide-out")) { - init { - - val itemButtons = mutableMapOf() - - var activeIndex = - if (active != null) { - (parent as DropdownButton).items().indexOf(active) - } else { - -1 - } - - keyboard.pressed.listen { - - if (it.key == KEY_ENTER) { - it.cancelPropagation() - dispose() - } - - if (it.key == KEY_ARROW_DOWN) { - activeIndex = (activeIndex + 1).coerceAtMost((parent as DropdownButton).items().size - 1) - it.cancelPropagation() - val newValue = parent.items()[activeIndex] - - parent.value?.let { item -> - itemButtons[item]?.pseudoClasses?.remove(ElementPseudoClass("selected")) - } - parent.value?.let { - itemButtons[newValue]?.pseudoClasses?.add(ElementPseudoClass("selected")) - } - - parent.value = newValue - parent.events.valueChanged.trigger(ValueChangedEvent(parent, newValue)) - newValue.picked() - draw.dirty = true - - val ypos = 24.0 * activeIndex - if (ypos >= scrollTop + 10 * 24.0) { - scrollTop += 24.0 - } - - } - - if (it.key == KEY_ARROW_UP) { - activeIndex = (activeIndex - 1).coerceAtLeast(0) - - - val newValue = (parent as DropdownButton).items()[activeIndex] - - val ypos = 24.0 * activeIndex - if (ypos < scrollTop) { - scrollTop -= 24.0 - } - - parent.value?.let { item -> - itemButtons[item]?.pseudoClasses?.remove(ElementPseudoClass("selected")) - } - parent.value?.let { - itemButtons[newValue]?.pseudoClasses?.add(ElementPseudoClass("selected")) - } - - parent.value = newValue - parent.events.valueChanged.trigger(ValueChangedEvent(parent, newValue)) - newValue.picked() - draw.dirty = true - } - } - - mouse.scrolled.listen { - scrollTop -= it.rotation.y - scrollTop = max(0.0, scrollTop) - draw.dirty = true - it.cancelPropagation() - } - - mouse.exited.listen { - it.cancelPropagation() - dispose() - } - - style = StyleSheet(CompoundSelector.DUMMY).apply { - position = Position.ABSOLUTE - left = LinearDimension.PX(x) - top = LinearDimension.PX(y) - width = LinearDimension.PX(this@SlideOut.width) - height = LinearDimension.PX(this@SlideOut.height) - overflow = Overflow.Scroll - zIndex = ZIndex.Value(1000) - background = Color.Inherit - } - - (parent as DropdownButton).items().forEach { - append(Button().apply { - data = it - label = it.label - itemButtons[it] = this - events.clicked.listen { - parent.value = it.source.data as Item - parent.events.valueChanged.trigger(ValueChangedEvent(parent, it.source.data as Item)) - (data as Item).picked() - dispose() - } - }) - } - active?.let { - itemButtons[active]?.pseudoClasses?.add(ElementPseudoClass("selected")) - } - } - - override fun draw(drawer: Drawer) { - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.stroke = null - drawer.strokeWeight = 0.0 - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - drawer.strokeWeight = 1.0 - } - - fun dispose() { - parent?.remove(this) - } - } -} - -fun > DropdownButton.bind(property: KMutableProperty0, map: Map) { - val options = mutableMapOf() - map.forEach { (k, v) -> - options[k] = item { - label = v - events.picked.listen { - property.set(k) - } - } - } - var currentValue = property.get() - value = options[currentValue] - draw.dirty = true - - (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - val cval = property.get() - if (cval != currentValue) { - currentValue = cval - value = options[cval] - draw.dirty = true - } - yield() - } - } -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Element.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Element.kt deleted file mode 100644 index 5500cff4..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Element.kt +++ /dev/null @@ -1,376 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.* -import org.openrndr.draw.Drawer -import org.openrndr.events.Event -import org.openrndr.math.Vector2 -import org.openrndr.panel.collections.ObservableCopyOnWriteArrayList -import org.openrndr.panel.collections.ObservableHashSet -import org.openrndr.panel.style.CompoundSelector -import org.openrndr.panel.style.Display -import org.openrndr.panel.style.StyleSheet -import org.openrndr.panel.style.display -import org.openrndr.shape.Rectangle - -import java.util.* - -@JvmRecord -data class ElementClass(val name: String) -@JvmRecord -data class ElementPseudoClass(val name: String) -@JvmRecord -data class ElementType(val name: String) - -val disabled = ElementPseudoClass("disabled") - -class FocusEvent - -interface DisposableElement { - var disposed: Boolean - - fun dispose() { - disposed = true - } -} - -open class Element(val type: ElementType) { - - var scrollTop = 0.0 - open val handlesDoubleClick = false - open val handlesKeyboardFocus = false - - open val widthHint: Double? - get() { - return null - } - - - open val heightHint: Double? - get() { - return null - } - - class MouseObservables { - val clicked = Event("element-mouse-clicked") - val doubleClicked = Event("element-mouse-double-clicked") - val entered = Event("element-mouse-entered") - val exited = Event("element-mouse-exited") - val dragged = Event("element-mouse-dragged") - val moved = Event("element-mouse-moved") - val scrolled = Event("element-mouse-scrolled") - val pressed = Event("element-mouse-pressed") - } - - class DropObserverables { - val dropped = Event("element-dropped") - } - - val drop = DropObserverables() - val mouse = MouseObservables() - - class KeyboardObservables { - val pressed = Event("element-keyboard-pressed") - val released = Event("element-keyboard-released") - val repeated = Event("element-keyboard-repeated") - val character = Event("element-keyboard-character") - val focusGained = Event("element-keyboard-focus-gained") - val focusLost = Event("element-keyboard-focus-lost") - } - - val keyboard = KeyboardObservables() - - class Layout { - var zIndex = 0 - var screenX = 0.0 - var screenY = 0.0 - var screenWidth = 0.0 - var screenHeight = 0.0 - var growWidth = 0.0 - var growHeight = 0.0 - override fun toString(): String { - return "Layout(screenX=$screenX, screenY=$screenY, screenWidth=$screenWidth, screenHeight=$screenHeight, growWidth=$growWidth, growHeight=$growHeight)" - } - } - - class Draw { - var dirty = true - } - - val draw = Draw() - val layout = Layout() - - class ClassEvent(val source: Element, val `class`: ElementClass) - class ClassObserverables { - val classAdded = Event("element-class-added") - val classRemoved = Event("element-class-removed") - } - - val classEvents = ClassObserverables() - - - var id: String? = null - val classes: ObservableHashSet = ObservableHashSet() - val pseudoClasses: ObservableHashSet = ObservableHashSet() - - var parent: Element? = null - val children: ObservableCopyOnWriteArrayList = ObservableCopyOnWriteArrayList() - get() = field - - var computedStyle: StyleSheet = StyleSheet(CompoundSelector.DUMMY) - var style: StyleSheet? = null - - init { - pseudoClasses.changed.listen { - draw.dirty = true - } - classes.changed.listen { - draw.dirty = true - it.added.forEach { - classEvents.classAdded.trigger(ClassEvent(this, it)) - } - it.removed.forEach { - classEvents.classRemoved.trigger(ClassEvent(this, it)) - } - - } - - children.changed.listen { - draw.dirty = true - } - } - - - /** - * Determines whether the current element, or any of its ancestors, has a display style of `Display.NONE`. - * - * @return `true` if the element or any of its ancestors is hidden (has `Display.NONE` style), `false` otherwise. - */ - fun isHidden() : Boolean { - var current: Element? = this - - while (current != null) { - if (current.computedStyle.display == Display.NONE) { - return true - } - current = current.parent - } - - return false - } - - fun root(): Element { - return parent?.root() ?: this - } - - open fun append(element: Element) { - if (element !in children) { - element.parent = this - children.add(element) - } - } - - fun remove(element: Element) { - if (element in children) { - element.parent = null - children.remove(element) - } - } - - open fun draw(drawer: Drawer) { - - } - - fun filter(f: (Element) -> Boolean): List { - val result = ArrayList() - val stack = Stack() - - stack.add(this) - while (!stack.isEmpty()) { - val node = stack.pop() - if (f(node)) { - result.add(node) - stack.addAll(node.children) - } - } - return result - } - - fun flatten(): List { - val result = ArrayList() - val stack = Stack() - - stack.add(this) - while (!stack.isEmpty()) { - val node = stack.pop() - - result.add(node) - stack.addAll(node.children) - } - return result - } - - fun previousSibling(): Element? { - parent?.let { p -> - p.childIndex(this)?.let { - if (it > 0) { - return p.children[it - 1] - } - } - } - return null - } - - fun childIndex(element: Element): Int? { - if (element in children) { - return children.indexOf(element) - } else { - return null - } - } - - fun ancestors(): List { - var c = this - val result = ArrayList() - - while (c.parent != null) { - c.parent?.let { - result.add(it) - c = it - } - } - return result - } - - fun previous(): Element? { - return parent?.let { p -> - val index = p.children.indexOf(this) - when (index) { - -1, 0 -> null - else -> p.children[index - 1] - } - } - } - - fun next(): Element? { - return parent?.let { p -> - when (val index = p.children.indexOf(this)) { - -1, p.children.size - 1 -> null - else -> p.children[index + 1] - } - } - } - - fun findNext(premise: (Element) -> Boolean): Element? { - return parent?.let { p -> - val index = p.children.indexOf(this) - val siblingCount = p.children.size - for (i in index + 1 until siblingCount) { - if (premise(p.children[i])) { - return p.children[i] - } - } - return null - } - } - - fun findPrevious(premise: (Element) -> Boolean): Element? { - return parent?.let { p -> - val index = p.children.indexOf(this) - for (i in index - 1 downTo 0) { - if (premise(p.children[i])) { - return p.children[i] - } - } - return null - } - } - - - fun move(steps: Int) { - parent?.let { p -> - if (steps != 0) { - val index = p.children.indexOf(this) - p.children.add(index + steps, this) - if (steps > 0) { - p.children.removeAt(index) - } else { - p.children.removeAt(index + 1) - } - } - } - } - - fun findFirst(element: Element, matches: (Element) -> Boolean): Element? { - if (matches.invoke(element)) { - return element - } else { - element.children.forEach { c -> - findFirst(c, matches)?.let { return it } - } - return null - } - } - - inline fun elementWithId(id: String): T? { - return findFirst(this) { e -> e.id == id && e is T } as T - } - - val screenPosition: Vector2 - get() = Vector2(layout.screenX, layout.screenY) - - val screenArea: Rectangle - get() = Rectangle(Vector2(layout.screenX, - layout.screenY), - layout.screenWidth, - layout.screenHeight) - - -} - -fun Element.requestRedraw() { - draw.dirty = true -} - -fun Element.disable() { - pseudoClasses.add(disabled) - requestRedraw() -} - -fun Element.enable() { - pseudoClasses.remove(disabled) - requestRedraw() -} - -fun Element.isDisabled(): Boolean = disabled in pseudoClasses - -fun Element.findAll(predicate: (Element) -> Boolean): List { - val results = mutableListOf() - visit { - if (predicate(this)) { - results.add(this) - } - } - return results -} - -fun Element.findAllVisible(predicate: (Element) -> Boolean): List { - val results = mutableListOf() - visitVisible { - if (predicate(this)) { - results.add(this) - } - } - return results -} - -fun Element.visit(function: Element.() -> Unit) { - this.function() - children.forEach { it.visit(function) } -} - -fun Element.visitVisible(function: Element.() -> Unit) { - if (this.computedStyle.display != Display.NONE) { - this.function() - children.forEach { it.visitVisible(function) } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeButton.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeButton.kt deleted file mode 100644 index 52a80578..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeButton.kt +++ /dev/null @@ -1,141 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.color.ColorRGBa - -import org.openrndr.draw.Drawer -import org.openrndr.extra.textwriter.Cursor -import org.openrndr.extra.textwriter.TextWriter - -import org.openrndr.math.Vector2 -import org.openrndr.panel.style.* - -class EnvelopeButton : Element(ElementType("envelope-button")) { - - var label = "OK" - var envelope = Envelope() - set(value) { - field = value - envelopeSubscription?.let { - value.events.envelopeChanged.cancel(it) - } - envelopeSubscription = value.events.envelopeChanged.listen { - draw.dirty = true - } - } - - - var envelopeSubscription: ((Envelope.EnvelopeChangedEvent)->Unit)? = null - - init { - mouse.clicked.listen { - append(SlideOut(0.0, screenArea.height, screenArea.width, 200.0, this)) - } - envelopeSubscription = envelope.events.envelopeChanged.listen { - draw.dirty = true - } - } - - override fun append(element: Element) { - when (element) { - is Item, is SlideOut -> super.append(element) - else -> throw RuntimeException("only item and slideout") - } - super.append(element) - } - - fun items(): List = children.filter { it is Item }.map { it as Item } - - override fun draw(drawer: Drawer) { - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - - (root() as? Body)?.controlManager?.fontManager?.let { - var chartHeight = 0.0 - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - - val writer = TextWriter(drawer) - drawer.fontMap = (font) - drawer.fill = (ColorRGBa.BLACK) - writer.cursor = Cursor(0.0,layout.screenHeight - 4.0) - chartHeight = writer.cursor.y - font.height-4 - writer.text("$label") - } - - - val w = layout.screenWidth - val h = chartHeight - val m = envelope.points.map { - val v = (Vector2(w, h) * it) - Vector2(v.x, h - v.y) - } - - if (m.size > 1) { - drawer.stroke = (ColorRGBa.WHITE) - drawer.strokeWeight = (2.0) - drawer.lineStrip(m) - } - if (m.size == 1) { - drawer.stroke = (ColorRGBa.WHITE) - drawer.strokeWeight = (2.0) - drawer.lineSegment(0.0, m[0].y, layout.screenWidth, m[0].y) - } - - drawer.stroke = (ColorRGBa.BLACK.opacify(0.25)) - drawer.strokeWeight = (1.0) - drawer.lineSegment(envelope.offset * w, 0.0, envelope.offset * w, chartHeight) - - drawer.lineSegment(0.0, 0.0, 3.0, 0.0) - drawer.lineSegment(0.0, 0.0, 0.0, chartHeight) - drawer.lineSegment(0.0, chartHeight, 3.0, chartHeight) - - drawer.lineSegment(w, 0.0, w-3.0, 0.0) - drawer.lineSegment(w, 0.0, w, chartHeight) - drawer.lineSegment(w, chartHeight, w-3.0, chartHeight) - } - } - - - class SlideOut(val x: Double, val y: Double, val width: Double, val height: Double, parent: EnvelopeButton) : Element(ElementType("envelope-slide-out")) { - - init { - - mouse.clicked.listen { - it.cancelPropagation() - } - style = StyleSheet(CompoundSelector.DUMMY).apply { - position = Position.ABSOLUTE - left = LinearDimension.PX(x) - top = LinearDimension.PX(y) - width = LinearDimension.PX(this@SlideOut.width) - height = LinearDimension.Auto//LinearDimension.PX(this@SlideOut.height) - overflow = Overflow.Scroll - zIndex = ZIndex.Value(1) - background = Color.RGBa(ColorRGBa(0.3, 0.3, 0.3)) - } - - append(EnvelopeEditor().apply { - envelope = parent.envelope - }) - - append(Button().apply { - label = "done" - events.clicked.listen { - //parent.value = it.source.data as Item - //parent.events.valueChanged.onNext(ValueChangedEvent(parent, it.source.data as Item)) - dispose() - } - }) - } - - override fun draw(drawer: Drawer) { - drawer.fill = ((computedStyle.background as? Color.RGBa)?.color ?: ColorRGBa.PINK) - drawer.rectangle(0.0, 0.0, screenArea.width, screenArea.height) - } - - fun dispose() { - parent?.remove(this) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeEditor.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeEditor.kt deleted file mode 100644 index 54e3d9ce..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/EnvelopeEditor.kt +++ /dev/null @@ -1,229 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.MouseButton -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.math.Vector2 -import org.openrndr.KeyModifier -import org.openrndr.events.Event - -class Envelope(constant:Double = 0.5) { - - val points = mutableListOf(Vector2(0.5, constant)) - var activePoint: Vector2? = null - - var offset:Double = 0.0 - set(value) { field = value; events.envelopeChanged.trigger(EnvelopeChangedEvent(this))} - - class EnvelopeChangedEvent(val envelope: Envelope) - - class Events { - val envelopeChanged = Event("envelope-changed") - } - val events = Events() - - fun insertPoint(v: Vector2) { - for (i in 0 until points.size) { - if (points[i].x > v.x) { - points.add(i, v) - activePoint = v - events.envelopeChanged.trigger(EnvelopeChangedEvent(this)) - return - } - } - points.add(v) - activePoint = v - fixBounds() - events.envelopeChanged.trigger(EnvelopeChangedEvent(this)) - } - - fun findNearestPoint(v: Vector2) = points.minByOrNull { (it - v).length } - - fun removePoint(v: Vector2) { - points.remove(v) - if (v === activePoint) { - activePoint = null - } - fixBounds() - events.envelopeChanged.trigger(EnvelopeChangedEvent(this)) - } - - private fun fixBounds() { - if (points.size >= 2) { - if (points[0].x != 0.0) { - points[0].copy(x=0.0).let { - if (activePoint === points[0]) { - activePoint = it - } - points[0] = it - } - } - if (points[points.size-1].x != 1.0) { - points[points.size-1].copy(x=1.0).let { - if (activePoint === points[points.size-1]) { - activePoint = it - } - points[points.size-1] = it - } - } - } - } - - fun updatePoint(old: Vector2, new: Vector2) { - val index = points.indexOf(old) - if (index != -1) { - points[index] = new - } - if (old === activePoint) { - activePoint = new - } - points.sortBy { it.x } - - fixBounds() - events.envelopeChanged.trigger(EnvelopeChangedEvent(this)) - } - - fun value(t: Double): Double { - - val st = t.coerceIn(0.0, 1.0) - - if (points.size == 1) { - return points[0].y - } - else if (points.size == 2) { - return points[0].y * (1.0-st) + points[1].y * st - } else { - if (st == 0.0) { - return points[0].y - } - if (st == 1.0) { - return points[points.size-1].y - } - - for (i in 0 until points.size-1) { - if (points[i].x <= st && points[i+1].x > st) { - val left = points[i] - var right = points[i+1] - - val dt = right.x - left.x - if (dt > 0.0) { - val f = (t - left.x) / dt - return left.y * (1.0-f) + right.y * f - } else { - return left.y - } - - } - } - return points[0].y - - } - - } - -} - -// -- - -class EnvelopeEditor : Element(ElementType("envelope-editor")) { - - var envelope = Envelope() - - init { - - fun query(position: Vector2): Vector2 { - val x = (position.x - layout.screenX) / layout.screenWidth - val y = 1.0 - ((position.y - layout.screenY) / layout.screenHeight) - - return Vector2(x, y) - } - - mouse.clicked.listen { - val query = query(it.position) - val nearest = envelope.findNearestPoint(query) - val distance = nearest?.let { (it - query).length } - - if (it.button == MouseButton.LEFT && !it.modifiers.contains(KeyModifier.CTRL)) { - when { - distance == null -> { - envelope.insertPoint(query) - draw.dirty = true - } - distance < 0.05 -> { - envelope.activePoint = nearest - } - else -> { - envelope.insertPoint(query) - draw.dirty = true - } - } - } else if (it.button == MouseButton.LEFT) { - if (distance != null && distance < 0.1) { - envelope.removePoint(nearest) - draw.dirty = true - } - } - it.cancelPropagation() - } - - mouse.pressed.listen { - val query = query(it.position) - val nearest = envelope.findNearestPoint(query) - val distance = nearest?.let { it - query }?.length - - if (distance == null) { - envelope.activePoint = null - draw.dirty = true - } else if (distance < 0.1) { - envelope.activePoint = nearest - } else { - envelope.activePoint = null - } - it.cancelPropagation() - } - - mouse.dragged.listen { - envelope.activePoint?.let { activePoint -> - val query = query(it.position) - if (!it.modifiers.contains(KeyModifier.SHIFT)) { - envelope.updatePoint(activePoint, query) - } else { - envelope.updatePoint(activePoint, Vector2(activePoint.x, query.y)) - } - draw.dirty = true - } - it.cancelPropagation() - } - } - - override fun draw(drawer: Drawer) { - val w = layout.screenWidth - val h = layout.screenHeight - - val m = envelope.points.map { - val v = (it * Vector2(w, h)) - Vector2(v.x, h - v.y) - } - - drawer.stroke = (ColorRGBa.BLACK.opacify(0.25)) - drawer.strokeWeight = (1.0) - drawer.lineSegment(layout.screenWidth/2.0, 0.0, layout.screenWidth/2.0,layout.screenHeight) - drawer.lineSegment(0.0,layout.screenHeight/2.0,layout.screenWidth, layout.screenHeight/2.0) - - if (m.size > 1) { - drawer.stroke = (ColorRGBa.WHITE) - drawer.strokeWeight = (2.0) - drawer.lineStrip(m) - drawer.fill = (ColorRGBa.WHITE) - drawer.stroke = null - drawer.circles(m, 4.0) - } else if (m.size == 1) { - drawer.stroke = (ColorRGBa.WHITE) - drawer.strokeWeight = (2.0) - drawer.lineSegment(0.0, m[0].y, layout.screenWidth, m[0].y) - drawer.fill = (ColorRGBa.WHITE) - drawer.stroke = null - drawer.circle(m[0], 4.0) - } - } -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/LayoutBuilder.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/LayoutBuilder.kt deleted file mode 100644 index 28d89bc0..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/LayoutBuilder.kt +++ /dev/null @@ -1,248 +0,0 @@ -package org.openrndr.panel.elements - -import org.openrndr.draw.Drawer -import org.openrndr.panel.ControlManager -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract - -@OptIn(ExperimentalContracts::class) -fun Element.layout(init: Element.() -> Unit) { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - init() -} - -@OptIn(ExperimentalContracts::class) -fun layout(controlManager: ControlManager, init: Body.() -> Unit): Body { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val body = Body(controlManager) - body.init() - return body -} - -@OptIn(ExperimentalContracts::class) -fun Element.initElement(classes: Array, element: T, init: T.() -> Unit): T { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - - append(element) - element.classes.addAll(classes.map { ElementClass(it) }) - element.init() - return element -} - -@OptIn(ExperimentalContracts::class) -fun Element.button(vararg classes: String, label: String = "button", init: Button.() -> Unit): Button { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val button = Button().apply { - this.classes.addAll(classes.map { ElementClass(it) }) - this.id = id - this.label = label - } - initElement(classes, button, init) - return button -} - -fun Button.clicked(listener: (Button.ButtonEvent) -> Unit) { - events.clicked.listen(listener) -} - -@OptIn(ExperimentalContracts::class) -fun Element.slider(vararg classes: String, init: Slider.() -> Unit) : Slider { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, Slider(), init) as Slider -} - -@OptIn(ExperimentalContracts::class) -fun Element.toggle(vararg classes: String, init: Toggle.() -> Unit): Toggle { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, Toggle(), init) as Toggle -} - -@OptIn(ExperimentalContracts::class) -fun Element.colorpicker(vararg classes: String, init: Colorpicker.() -> Unit): Colorpicker { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, Colorpicker(), init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.colorpickerButton(vararg classes: String, init: ColorpickerButton.() -> Unit): ColorpickerButton { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, ColorpickerButton(), init) -} - - -@OptIn(ExperimentalContracts::class) -fun Element.xyPad(vararg classes: String, init: XYPad.() -> Unit): XYPad { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, XYPad(), init) as XYPad -} - -fun Canvas.draw(f: (Drawer) -> Unit) { - this.userDraw = f -} - -@OptIn(ExperimentalContracts::class) -fun Element.canvas(vararg classes: String, init: Canvas.() -> Unit): Canvas { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val canvas = Canvas() - classes.forEach { canvas.classes.add(ElementClass(it)) } - canvas.init() - append(canvas) - return canvas -} - -@OptIn(ExperimentalContracts::class) -fun Element.dropdownButton( - vararg classes: String, - id: String? = null, - label: String = "button", - init: DropdownButton.() -> Unit -): DropdownButton { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, DropdownButton().apply { - this.id = id - this.label = label - }, init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.envelopeButton(vararg classes: String, init: EnvelopeButton.() -> Unit): EnvelopeButton { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, EnvelopeButton().apply {}, init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.envelopeEditor(vararg classes: String, init: EnvelopeEditor.() -> Unit): EnvelopeEditor { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, EnvelopeEditor().apply {}, init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.sequenceEditor(vararg classes: String, init: SequenceEditor.() -> Unit): SequenceEditor { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, SequenceEditor().apply {}, init) -} -@OptIn(ExperimentalContracts::class) -fun Element.slidersVector2(vararg classes: String, init: SlidersVector2.() -> Unit): SlidersVector2 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, SlidersVector2().apply {}, init) -} - - -@OptIn(ExperimentalContracts::class) -fun Element.slidersVector3(vararg classes: String, init: SlidersVector3.() -> Unit): SlidersVector3 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, SlidersVector3().apply {}, init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.slidersVector4(vararg classes: String, init: SlidersVector4.() -> Unit): SlidersVector4 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, SlidersVector4().apply {}, init) -} - - -@OptIn(ExperimentalContracts::class) -fun Element.textfield(vararg classes: String, init: Textfield.() -> Unit): Textfield { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return initElement(classes, Textfield(), init) -} - -@OptIn(ExperimentalContracts::class) -fun DropdownButton.item(init: Item.() -> Unit): Item { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val item = Item().apply(init) - append(item) - return item -} - -@OptIn(ExperimentalContracts::class) -fun Element.div(vararg classes: String, init: Div.() -> Unit): Div { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - val div = Div() - initElement(classes, div, init) - return div -} - -@OptIn(ExperimentalContracts::class) -inline fun Element.textElement(classes: Array, init: T.() -> String): T { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - @Suppress("DEPRECATION") val te = T::class.java.newInstance() - te.classes.addAll(classes.map { ElementClass(it) }) - te.text(te.init()) - append(te) - return te -} - -@OptIn(ExperimentalContracts::class) -fun Element.p(vararg classes: String, init: P.() -> String): P { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return textElement(classes, init) -} -@OptIn(ExperimentalContracts::class) -fun Element.h1(vararg classes: String, init: H1.() -> String): H1 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return textElement(classes, init) -} -@OptIn(ExperimentalContracts::class) -fun Element.h2(vararg classes: String, init: H2.() -> String): H2 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return textElement(classes, init) -} - -@OptIn(ExperimentalContracts::class) -fun Element.h3(vararg classes: String, init: H3.() -> String): H3 { - contract { - callsInPlace(init, InvocationKind.EXACTLY_ONCE) - } - return textElement(classes, init) -} - diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SequenceEditor.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SequenceEditor.kt deleted file mode 100644 index 46e70213..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SequenceEditor.kt +++ /dev/null @@ -1,213 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.* -import org.openrndr.KeyModifier -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.Cursor -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.math.Vector2 -import org.openrndr.math.map -import org.openrndr.panel.style.effectiveColor -import org.openrndr.panel.tools.Tooltip -import org.openrndr.shape.Rectangle -import kotlin.math.abs -import kotlin.math.round -import kotlin.math.roundToInt - -class SequenceEditor : SequenceEditorBase("sequence-editor") { - var value - get() = baseValue - set(value) { - baseValue = value - } - - public override var maximumSequenceLength = 16 - public override var minimumSequenceLength = 1 - - class ValueChangedEvent(val source: SequenceEditorBase, - val oldValue: List, - val newValue: List) - - class Events { - val valueChanged = Event("sequence-editor-value-changed") - } - - val events = Events() - - init { - baseEvents.valueChanged.listen { - events.valueChanged.trigger(ValueChangedEvent(this, it.oldValue, it.newValue)) - } - } -} - -@OptIn(DelicateCoroutinesApi::class) -open class SequenceEditorBase(type: String = "sequence-editor-base") : Element(ElementType(type)), DisposableElement { - override var disposed = false - - internal var baseValue = mutableListOf(0.0) - var label = "sequence" - var precision = 2 - internal open var maximumSequenceLength = 16 - internal open var minimumSequenceLength = 1 - var range: ClosedRange = -1.0..1.0 - - private var selectedIndex: Int? = null - private var tooltip: Tooltip? = null - - private val footerHeight = 20.0 - - internal class ValueChangedEvent(val source: SequenceEditorBase, - val oldValue: List, - val newValue: List) - - internal class Events { - val valueChanged = Event("sequence-editor-base-value-changed") - } - - internal val baseEvents = Events() - - init { - fun query(position: Vector2): Vector2 { - val x = (position.x - layout.screenX) / layout.screenWidth - val y = 1.0 - ((position.y - layout.screenY) / ((layout.screenHeight - footerHeight) * 0.5)) - return Vector2(x, y) - } - - mouse.clicked.listen { - it.cancelPropagation() - requestRedraw() - } - mouse.pressed.listen { - if (baseValue.isNotEmpty()) { - val dx = (layout.screenWidth / (baseValue.size + 1)) - val index = (it.position.x - layout.screenX) / dx - - val d = index - round(index) - val dp = d * dx - val dpa = abs(dp) - - if (dpa < 10.0) { - selectedIndex = if (KeyModifier.CTRL !in it.modifiers) { - round(index).toInt() - } else { - if (baseValue.size > minimumSequenceLength) { - val oldValue = baseValue.map { it } - baseValue.removeAt(round(index).toInt() - 1) - baseEvents.valueChanged.trigger(ValueChangedEvent(this, oldValue, baseValue)) - } - null - } - } else { - if (KeyModifier.CTRL !in it.modifiers) { - if (baseValue.size < maximumSequenceLength) { - val q = query(it.position) - val oldValue = baseValue.map { it } - baseValue.add(index.toInt(), q.y.map(-1.0, 1.0, range.start, range.endInclusive)) - baseEvents.valueChanged.trigger(ValueChangedEvent(this, oldValue, baseValue)) - } - } - } - } - it.cancelPropagation() - } - - var hoverJob: Job? = null - - mouse.exited.listen { - hoverJob?.cancel() - if (tooltip != null) { - tooltip = null - requestRedraw() - } - } - - mouse.moved.listen { - hoverJob?.let { job -> - job.cancel() - } - if (tooltip != null) { - tooltip = null - requestRedraw() - } - - if (baseValue.isNotEmpty()) { - val dx = (layout.screenWidth / (baseValue.size + 1)) - val index = (it.position.x - layout.screenX) / dx - val d = index - round(index) - val dp = d * dx - val dpa = abs(dp) - - if (dpa < 10.0) { - hoverJob = GlobalScope.launch { - val readIndex = index.roundToInt() - 1 - if (readIndex >= 0 && readIndex < baseValue.size) { - val value = String.format("%.0${precision}f", baseValue[readIndex]) - tooltip = Tooltip(this@SequenceEditorBase, it.position - Vector2(layout.screenX, layout.screenY), "$value") - requestRedraw() - } - } - } - } - } - mouse.dragged.listen { - val q = query(it.position) - selectedIndex?.let { index -> - val writeIndex = index - 1 - if (writeIndex >= 0 && writeIndex < baseValue.size) { - val oldValue = baseValue.map { it } - baseValue[writeIndex] = q.y.coerceIn(-1.0, 1.0).map(-1.0, 1.0, range.start, range.endInclusive) - baseEvents.valueChanged.trigger(ValueChangedEvent(this, oldValue, baseValue)) - } - requestRedraw() - } - } - } - - override fun draw(drawer: Drawer) { - val controlArea = Rectangle(0.0, 0.0, layout.screenWidth, layout.screenHeight - footerHeight) - - drawer.stroke = computedStyle.effectiveColor?.opacify(0.25) - drawer.strokeWeight = (1.0) - - - val zeroHeight = 0.0.map(range.start, range.endInclusive, -1.0, 1.0).coerceIn(-1.0, 1.0) * controlArea.height / -2.0 - drawer.lineSegment(0.0, controlArea.height / 2.0 + zeroHeight, layout.screenWidth, controlArea.height / 2.0 + zeroHeight) - - drawer.strokeWeight = 7.0 - drawer.fill = computedStyle.effectiveColor - - for (i in baseValue.indices) { - val dx = layout.screenWidth / (baseValue.size + 1) - val height = -baseValue[i].map(range.start, range.endInclusive, -1.0, 1.0).coerceIn(-1.0, 1.0) * controlArea.height / 2.0 - - val x = dx * (i + 1) - drawer.lineCap = LineCap.ROUND - drawer.stroke = computedStyle.effectiveColor - drawer.lineSegment(x, controlArea.height / 2.0 + zeroHeight, x, controlArea.height / 2.0 + height) - - drawer.stroke = computedStyle.effectiveColor?.shade(1.1) - drawer.fill = ColorRGBa.PINK - drawer.circle(x, controlArea.height / 2.0 + height, 7.0) - } - - drawer.isolated { - drawer.translate(0.0, controlArea.height) - drawer.fill = computedStyle.effectiveColor - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - val writer = TextWriter(drawer) - drawer.fontMap = (font) - drawer.fill = computedStyle.effectiveColor - writer.cursor = Cursor(0.0, 4.0) - writer.box = Rectangle(0.0, 4.0, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY) - writer.newLine() - writer.text(label) - } - } - - tooltip?.draw(drawer) - } -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Slider.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Slider.kt deleted file mode 100644 index c8354b39..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Slider.kt +++ /dev/null @@ -1,359 +0,0 @@ -package org.openrndr.panel.elements - -import io.github.oshai.kotlinlogging.KotlinLogging -import kotlinx.coroutines.* -import org.openrndr.* - -import org.openrndr.draw.Drawer -import org.openrndr.draw.LineCap - -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.Cursor -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.math.Vector2 -import org.openrndr.panel.style.Color -import org.openrndr.panel.style.color -import org.openrndr.panel.style.effectiveColor -import org.openrndr.shape.Rectangle -import java.text.NumberFormat -import java.text.ParseException -import kotlin.reflect.KMutableProperty0 - -private val logger = KotlinLogging.logger {} - -@JvmRecord -data class Range(val min: Double, val max: Double) { - val span: Double get() = max - min -} - -enum class SliderMode { - RANGE, - POINT, - SEGMENT -} - -class Slider : Element(ElementType("slider")), DisposableElement { - override var disposed = false - override val handlesKeyboardFocus = true - - var label = "" - var precision = 3 - var mode = SliderMode.RANGE - - var value: Double - set(v) { - val oldV = realValue - realValue = clean(v) - if (realValue != oldV) { - draw.dirty = true - events.valueChanged.trigger(ValueChangedEvent(this, false, oldV, realValue)) - } - } - get() = realValue - - private var interactiveValue: Double - set(v) { - val oldV = realValue - realValue = clean(v) - if (realValue != oldV) { - draw.dirty = true - events.valueChanged.trigger(ValueChangedEvent(this, true, oldV, realValue)) - } - } - get() = realValue - - - var range = Range(0.0, 10.0) - set(value) { - field = value - this.value = this.value - } - private var realValue = 0.0 - - fun clean(value: Double): Double { - val cleanV = value.coerceIn(range.min, range.max) - val quantized = String.format("%.0${precision}f", cleanV).replace(",", ".").toDouble() - return quantized - } - - class ValueChangedEvent(val source: Slider, - val interactive: Boolean, - val oldValue: Double, - val newValue: Double) - - class Events { - val valueChanged = Event("slider-value-changed") - } - - val events = Events() - - private val margin = 7.0 - private var keyboardInput = "" - - init { - mouse.pressed.listen { - val t = (it.position.x - layout.screenX - margin) / (layout.screenWidth - 2.0 * margin) - interactiveValue = t * range.span + range.min - it.cancelPropagation() - } - mouse.clicked.listen { - val t = (it.position.x - layout.screenX - margin) / (layout.screenWidth - 2.0 * margin) - interactiveValue = t * range.span + range.min - it.cancelPropagation() - } - mouse.dragged.listen { - val t = (it.position.x - layout.screenX - margin) / (layout.screenWidth - 2.0 * margin) - interactiveValue = t * range.span + range.min - it.cancelPropagation() - } - - mouse.scrolled.listen { - if (Math.abs(it.rotation.y) < 0.001) { - interactiveValue += range.span * 0.001 * it.rotation.x - it.cancelPropagation() - } - } - - keyboard.focusLost.listen { - keyboardInput = "" - draw.dirty = true - } - - keyboard.character.listen { - if (it.character in setOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-')) { - try { - val candidate = keyboardInput + it.character.toString() - if (candidate.length > 1) { - NumberFormat.getInstance().parse(candidate).toDouble() - } - keyboardInput = candidate - requestRedraw() - } catch (e: ParseException) { - } - } - it.cancelPropagation() - } - - - keyboard.repeated.listen { - val delta = Math.pow(10.0, -(precision - 0.0)) - if (it.key == KEY_ARROW_RIGHT) { - interactiveValue += delta - it.cancelPropagation() - } - - if (it.key == KEY_ARROW_LEFT) { - interactiveValue -= delta - it.cancelPropagation() - } - - } - keyboard.pressed.listen { - val delta = Math.pow(10.0, -(precision - 0.0)) - - if (it.key == KEY_ARROW_RIGHT) { - interactiveValue += delta - it.cancelPropagation() - } - - if (it.key == KEY_ARROW_LEFT) { - interactiveValue -= delta - it.cancelPropagation() - } - - if (it.key == KEY_BACKSPACE) { - if (!keyboardInput.isEmpty()) { - keyboardInput = keyboardInput.substring(0, keyboardInput.length - 1) - draw.dirty = true - } - it.cancelPropagation() - } - - if (it.key == KEY_ESCAPE) { - keyboardInput = "" - draw.dirty = true - it.cancelPropagation() - } - - if (it.key == KEY_ENTER) { - try { - val number = NumberFormat.getInstance().parse(keyboardInput).toDouble() - interactiveValue = number.coerceIn(range.min, range.max) - } catch (e: ParseException) { - // -- silently (but safely) ignore the exception - } - keyboardInput = "" - draw.dirty = true - it.cancelPropagation() - } - - if (it.key == KEY_HOME) { - interactiveValue = range.min - keyboardInput = "" - it.cancelPropagation() - } - - if (it.key == KEY_END) { - interactiveValue = range.max - keyboardInput = "" - it.cancelPropagation() - } - } - } - - override fun draw(drawer: Drawer) { - val f = (root() as? Body)?.controlManager?.fontManager?.font(computedStyle)!! - drawer.translate(0.0, (layout.screenHeight - (10.0 + f.height)) / 2) - - drawer.fill = ((computedStyle.color as Color.RGBa).color) - drawer.stroke = ((computedStyle.color as Color.RGBa).color) - drawer.strokeWeight = (8.0) - drawer.lineCap = (LineCap.ROUND) - val x = ((value - range.min) / range.span) * (layout.screenWidth - 2 * margin) - - drawer.stroke = ((computedStyle.color as Color.RGBa).color.opacify(0.25)) - drawer.lineSegment(margin + 0.0, 2.0, margin + layout.screenWidth - 2 * margin, 2.0) - - if (mode == SliderMode.RANGE) { - drawer.stroke = ((computedStyle.color as Color.RGBa).color.opacify(1.0)) - drawer.lineSegment(margin, 2.0, margin + x, 2.0) - - drawer.fill = ((computedStyle.color as Color.RGBa).color.opacify(1.0)) - drawer.stroke = null - drawer.strokeWeight = 0.0 - drawer.circle(margin + x, 2.0, 5.0) - } - - if (mode == SliderMode.POINT && precision == 0) { - val lineSegments = mutableListOf() - for (i in range.min.toInt()..range.max.toInt()) { - val lx = ((i - range.min) / range.span) * (layout.screenWidth - 2 * margin) - drawer.strokeWeight = 1.0 - drawer.stroke = ((computedStyle.color as Color.RGBa).color.opacify(0.5)) - lineSegments.add(Vector2(margin + lx, -2.0)) - lineSegments.add(Vector2(margin + lx, 4.0)) - } - drawer.lineSegments(lineSegments) - } - - if (mode == SliderMode.SEGMENT) { - drawer.stroke = ((computedStyle.color as Color.RGBa).color.opacify(1.0)) - - val sx = ((value - range.min) / (range.span+1.0)) * (layout.screenWidth - 2 * margin) + margin - val ex = (((value+1) - range.min) / (range.span+1.0)) * (layout.screenWidth - 2 * margin) + margin - - drawer.strokeWeight = 8.0 - drawer.lineSegment(sx, 2.0, ex, 2.0) - - drawer.stroke = null - drawer.strokeWeight = 0.0 - - - val lineSegments = mutableListOf() - for (i in range.min.toInt()..(range.max.toInt()+1)) { - val lx = ((i - range.min) / (range.span+1.0)) * (layout.screenWidth - 2 * margin) - drawer.strokeWeight = 1.0 - drawer.stroke = ((computedStyle.color as Color.RGBa).color.opacify(0.5)) - lineSegments.add(Vector2(margin + lx, -2.0)) - lineSegments.add(Vector2(margin + lx, 4.0)) - } - drawer.lineSegments(lineSegments) - } - - - if (mode == SliderMode.POINT) { - drawer.fill = ((computedStyle.color as Color.RGBa).color.opacify(1.0)) - drawer.stroke = null - drawer.circle(margin + x, 2.0, 8.0) - } - - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - val writer = TextWriter(drawer) - drawer.fontMap = (font) - drawer.fill = computedStyle.effectiveColor - writer.cursor = Cursor(0.0, 8.0) - writer.box = Rectangle(0.0, 8.0, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY) - writer.newLine() - writer.text(label) - - if (keyboardInput.isEmpty()) { - val valueFormatted = String.format("%.0${precision}f", value) - val tw = writer.textWidth(valueFormatted) - writer.cursor.x = (layout.screenWidth - tw) - writer.text(valueFormatted) - } else { - val tw = writer.textWidth(keyboardInput) - writer.cursor.x = (layout.screenWidth - tw) - writer.text(keyboardInput) - } - } - } -} - -@OptIn(DelicateCoroutinesApi::class) -fun Slider.bind(property: KMutableProperty0) { - var currentValue: Double? = null - - events.valueChanged.listen { - currentValue = it.newValue - property.set(it.newValue) - } - GlobalScope.launch { - while(!disposed) { - val body = (root() as? Body) - if (body != null) { - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur.toDouble() - } - } - update() - body.controlManager.program.launch { - while (!disposed) { - update() - yield() - } - } - break - } - yield() - } - } -} - -@OptIn(DelicateCoroutinesApi::class) -@JvmName("bindInt") -fun Slider.bind(property: KMutableProperty0) { - var currentValue: Int? = null - events.valueChanged.listen { - currentValue = it.newValue.toInt() - property.set(it.newValue.toInt()) - } - GlobalScope.launch { - while(!disposed) { - val body = (root() as? Body) - if (body != null) { - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur.toDouble() - } - } - update() - body.controlManager.program.launch { - while (!disposed) { - update() - yield() - } - } - break - } - yield() - } - } -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SlidersVector.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SlidersVector.kt deleted file mode 100644 index d6ad57f7..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/SlidersVector.kt +++ /dev/null @@ -1,192 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.yield -import org.openrndr.events.Event -import org.openrndr.launch -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import kotlin.reflect.KMutableProperty0 - -class SlidersVector2 : SequenceEditorBase("sliders-vector2") { - var value : Vector2 - get() { - return Vector2(baseValue[0], baseValue[1]) - } - set(value) { - baseValue[0] = value.x - baseValue[1] = value.y - requestRedraw() - } - - class ValueChangedEvent(val source: SequenceEditorBase, - val oldValue: Vector2, - val newValue: Vector2) - - class Events { - val valueChanged = Event("sequence-editor-value-changed") - } - - val events = Events() - - init { - baseValue = mutableListOf(0.0, 0.0) - minimumSequenceLength = 2 - maximumSequenceLength = 2 - baseEvents.valueChanged.listen { - events.valueChanged.trigger(ValueChangedEvent(this, - Vector2(it.oldValue[0], it.oldValue[1]), - Vector2(it.newValue[0], it.newValue[1])) - ) - } - } -} - -fun SlidersVector2.bind(property: KMutableProperty0) { - var currentValue: Vector2? = null - - events.valueChanged.listen { - currentValue = value - property.set(it.newValue) - } - if (root() as? Body == null) { - throw RuntimeException("no body") - } - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur - } - } - update() - (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - update() - yield() - } - } -} - -class SlidersVector3 : SequenceEditorBase("sliders-vector3") { - var value : Vector3 - get() { - return Vector3(baseValue[0], baseValue[1], baseValue[2]) - } - set(value) { - baseValue[0] = value.x - baseValue[1] = value.y - baseValue[2] = value.z - requestRedraw() - } - - class ValueChangedEvent(val source: SequenceEditorBase, - val oldValue: Vector3, - val newValue: Vector3) - - class Events { - val valueChanged = Event("sliders-vector3-value-changed") - } - - val events = Events() - - init { - baseValue = mutableListOf(0.0, 0.0, 0.0) - minimumSequenceLength = 3 - maximumSequenceLength = 3 - baseEvents.valueChanged.listen { - events.valueChanged.trigger(ValueChangedEvent(this, - Vector3(it.oldValue[0], it.oldValue[1], it.oldValue[2]), - Vector3(it.newValue[0], it.newValue[1], it.newValue[2])) - ) - } - } -} - -fun SlidersVector3.bind(property: KMutableProperty0) { - var currentValue: Vector3? = null - - events.valueChanged.listen { - currentValue = value - property.set(it.newValue) - } - if (root() as? Body == null) { - throw RuntimeException("no body") - } - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur - } - } - update() - (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - update() - yield() - } - } -} - -class SlidersVector4 : SequenceEditorBase("sliders-vector4") { - var value : Vector4 - get() { - return Vector4(baseValue[0], baseValue[1], baseValue[2], baseValue[3]) - } - set(value) { - baseValue[0] = value.x - baseValue[1] = value.y - baseValue[2] = value.z - baseValue[3] = value.w - requestRedraw() - } - - class ValueChangedEvent(val source: SequenceEditorBase, - val oldValue: Vector4, - val newValue: Vector4) - - class Events { - val valueChanged = Event("sliders-vector4-value-changed") - } - - val events = Events() - - init { - baseValue = mutableListOf(0.0, 0.0, 0.0, 0.0) - minimumSequenceLength = 4 - maximumSequenceLength = 4 - baseEvents.valueChanged.listen { - events.valueChanged.trigger(ValueChangedEvent(this, - Vector4(it.oldValue[0], it.oldValue[1], it.oldValue[2], it.oldValue[3]), - Vector4(it.newValue[0], it.newValue[1], it.newValue[2], it.newValue[3])) - ) - } - } -} - -fun SlidersVector4.bind(property: KMutableProperty0) { - var currentValue: Vector4? = null - - events.valueChanged.listen { - currentValue = value - property.set(it.newValue) - } - if (root() as? Body == null) { - throw RuntimeException("no body") - } - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur - } - } - update() - (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - update() - yield() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/TextElements.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/TextElements.kt deleted file mode 100644 index 885bc70a..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/TextElements.kt +++ /dev/null @@ -1,106 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.yield -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.draw.loadFont -import org.openrndr.extra.textwriter.TextWriter - -import org.openrndr.launch -import org.openrndr.math.Vector2 -import org.openrndr.panel.style.* -import org.openrndr.shape.Rectangle -import kotlin.reflect.KMutableProperty0 - -class TextNode(var text: String) : Element(ElementType("text")) { - - override fun draw(drawer: Drawer) { - computedStyle.let { style -> - style.color.let { - val fill = (it as? Color.RGBa)?.color ?: ColorRGBa.WHITE - drawer.fill = (fill) - } - val fontMap = (root() as Body).controlManager.fontManager.font(computedStyle) - val writer = TextWriter(drawer) - drawer.fontMap = (fontMap) - - writer.box = Rectangle(Vector2(layout.screenX * 0.0, layout.screenY * 0.0), layout.screenWidth, layout.screenHeight) - writer.newLine() - writer.text(text) - } - } - - fun sizeHint(): Rectangle { - computedStyle.let { style -> - val fontUrl = (root() as? Body)?.controlManager?.fontManager?.resolve(style.fontFamily)?:"broken" - val fontSize = (style.fontSize as? LinearDimension.PX)?.value?: 14.0 - val program = (root() as? Body)?.controlManager?.program ?: error("no program") - val fontMap = program.loadFont(fontUrl, fontSize) - - val writer = TextWriter(null) - - writer.box = Rectangle(layout.screenX, - layout.screenY, - layout.screenWidth, - layout.screenHeight) - - writer.drawStyle.fontMap = fontMap - writer.newLine() - writer.text(text, visible = false) - - return Rectangle(layout.screenX, - layout.screenY, - layout.screenWidth, - (writer.cursor.y - layout.screenY) - fontMap.descenderLength*2) - } - - } - - override fun toString(): String { - return "TextNode(id='$id',text='$text')" - } -} - -class H1 : TextElement(ElementType("h1")) -class H2 : TextElement(ElementType("h2")) -class H3 : TextElement(ElementType("h3")) -class H4 : TextElement(ElementType("h4")) -class H5 : TextElement(ElementType("h5")) - -class P : TextElement(ElementType("p")) - -abstract class TextElement(et: ElementType) : Element(et) { - fun text(text: String) { - append(TextNode(text)) - requestRedraw() - } - fun replaceText(text : String) { - if (children.isEmpty()) { - text(text) - } else { - (children.first() as? TextNode)?.text = text - requestRedraw() - } - } -} - -fun TextElement.bind(property: KMutableProperty0) { - if (root() as? Body == null) { - throw RuntimeException("no body") - } - var lastText = "" - fun update() { - if (property.get() != lastText) { - replaceText(property.get()) - lastText = property.get() - } - } - - (root() as? Body)?.controlManager?.program?.launch { - update() - while (true) { - update() - yield() - } - } -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Textfield.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Textfield.kt deleted file mode 100644 index 640d25bc..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Textfield.kt +++ /dev/null @@ -1,167 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.* -import org.openrndr.KEY_BACKSPACE -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.draw.LineCap -import org.openrndr.panel.style.* -import org.openrndr.KeyModifier -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.Cursor -import org.openrndr.extra.textwriter.writer -import org.openrndr.launch -import org.openrndr.shape.Rectangle -import kotlin.reflect.KMutableProperty0 - -class Textfield : Element(ElementType("textfield")), DisposableElement { - - var value: String = "" - var label: String = "label" - - class ValueChangedEvent(val source: Textfield, val oldValue: String, val newValue: String) - class Events { - val valueChanged = Event("textfield-value-changed") - } - - val events = Events() - - init { - keyboard.repeated.listen { - if (it.key == KEY_BACKSPACE) { - if (value.isNotEmpty()) { - val oldValue = value - value = value.substring(0, value.length - 1) - events.valueChanged.trigger(ValueChangedEvent(this, oldValue, value)) - requestRedraw() - } - - } - it.cancelPropagation() - } - - keyboard.pressed.listen { - if (KeyModifier.CTRL in it.modifiers || KeyModifier.SUPER in it.modifiers) { - if (it.name == "v") { - val oldValue = value - (root() as Body).controlManager.program.clipboard.contents?.let { - value += it - - } - events.valueChanged.trigger(ValueChangedEvent(this, oldValue, value)) - it.cancelPropagation() - } - } - if (it.key == KEY_BACKSPACE) { - if (value.isNotEmpty()) { - val oldValue = value - value = value.substring(0, value.length - 1) - events.valueChanged.trigger(ValueChangedEvent(this, oldValue, value)) - } - } - requestRedraw() - it.cancelPropagation() - } - - keyboard.character.listen { - val oldValue = value - value += it.character - events.valueChanged.trigger(ValueChangedEvent(this, oldValue, value)) - requestRedraw() - it.cancelPropagation() - } - - mouse.pressed.listen { - it.cancelPropagation() - } - mouse.clicked.listen { - it.cancelPropagation() - } - } - - override fun draw(drawer: Drawer) { - drawer.fill = computedStyle.effectiveBackground - drawer.stroke = null - drawer.rectangle(0.0, 0.0, layout.screenWidth, layout.screenHeight) - - (root() as? Body)?.controlManager?.fontManager?.let { - val font = it.font(computedStyle) - - drawer.fontMap = (font) - val textHeight = font.ascenderLength - - val offset = 5.0 - val yOffset = Math.round((layout.screenHeight / 2) + textHeight / 2.0 - 2.0) * 1.0 - - drawer.fill = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE) - drawer.text(label, 0.0 + offset, 0.0 + yOffset - textHeight * 1.5) - - drawer.fill = (((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE).opacify(0.05)) - drawer.rectangle(0.0 + offset, 0.0 + yOffset - (textHeight + 2), layout.screenWidth - 10.0, textHeight + 8.0) - - drawer.drawStyle.clip = Rectangle(screenPosition.x + offset, screenPosition.y + yOffset - (textHeight + 2), layout.screenWidth - 10.0, textHeight + 8.0) - - drawer.fill = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE) - - var cursorX = 0.0 - writer(drawer) { - val emWidth = textWidth("m") * 2 - cursor = Cursor(offset, yOffset) - text(value, visible = false) - val width = cursor.x - offset - val scroll = - if (width > screenArea.width - emWidth) { - screenArea.width - emWidth - width - } else { - 0.0 - } - cursor = Cursor(offset + scroll, yOffset) - text(value) - cursorX = cursor.x - } - - if (ElementPseudoClass("active") in pseudoClasses) { - drawer.stroke = ColorRGBa.WHITE - drawer.lineSegment(cursorX + 1.0, yOffset, cursorX + 1.0, yOffset - textHeight) - } - drawer.drawStyle.clip = null - - drawer.stroke = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE) - drawer.strokeWeight = 1.0 - - drawer.stroke = computedStyle.effectiveColor?.shade(0.25) - drawer.lineCap = LineCap.ROUND - } - } - - override var disposed: Boolean = false -} - -@OptIn(DelicateCoroutinesApi::class) -fun Textfield.bind(property: KMutableProperty0) { - GlobalScope.launch { - install@ while (!disposed) { - val body = (root() as? Body) - if (body != null) { - events.valueChanged.listen { - property.set(it.newValue) - } - fun update() { - val propertyValue = property.get() - if (propertyValue != value) { - value = propertyValue - } - } - update() - (root() as Body).controlManager.program.launch { - while (!disposed) { - update() - yield() - } - } - break@install - } - yield() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Toggle.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Toggle.kt deleted file mode 100644 index 6565bbd2..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/Toggle.kt +++ /dev/null @@ -1,134 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.* -import org.openrndr.draw.Drawer -import org.openrndr.draw.LineCap -import org.openrndr.draw.loadFont -import org.openrndr.panel.style.* -import org.openrndr.shape.Rectangle - - -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.launch -import kotlin.reflect.KMutableProperty0 - -class Toggle : Element(ElementType("toggle")), DisposableElement { - override var disposed = false - - var label = "" - var value = false - - class ValueChangedEvent(val source: Toggle, - val oldValue: Boolean, - val newValue: Boolean) - - class Events { - val valueChanged = Event("toggle-value-changed") - } - - val events = Events() - - override val widthHint: Double? - get() { - computedStyle.let { style -> - val fontUrl = (root() as? Body)?.controlManager?.fontManager?.resolve(style.fontFamily) ?: "broken" - val fontSize = (style.fontSize as? LinearDimension.PX)?.value ?: 14.0 - val program = (root() as? Body)?.controlManager?.program ?: error("no program") - val fontMap = program.loadFont(fontUrl, fontSize) - - val writer = TextWriter(null) - - writer.box = Rectangle(0.0, - 0.0, - Double.POSITIVE_INFINITY, - Double.POSITIVE_INFINITY) - - writer.drawStyle.fontMap = fontMap - writer.newLine() - writer.text(label, visible = false) - - return writer.cursor.x + (computedStyle.height as LinearDimension.PX).value - 8.0 + 5.0 - } - } - - init { - mouse.pressed.listen { - it.cancelPropagation() - } - mouse.clicked.listen { - value = !value - draw.dirty = true - events.valueChanged.trigger(Toggle.ValueChangedEvent(this, !value, value)) - it.cancelPropagation() - } - } - - /** - * Emits the current value through the valueChanged event - */ - fun emit() { - events.valueChanged.trigger(Toggle.ValueChangedEvent(this, value, value)) - } - - override fun draw(drawer: Drawer) { - drawer.pushModel() - val checkBoxSize = layout.screenHeight - 8.0 - drawer.translate(0.0, (layout.screenHeight - checkBoxSize) / 2.0) - drawer.strokeWeight = 1.0 - drawer.stroke = computedStyle.effectiveColor - drawer.fill = null - drawer.rectangle(0.0, 0.0, checkBoxSize, checkBoxSize) - - if (value) { - drawer.strokeWeight = 2.0 - drawer.stroke = computedStyle.effectiveColor - drawer.fill = null - drawer.lineCap = LineCap.ROUND - drawer.lineSegment(5.0, 5.0, checkBoxSize / 2.0 - 2.0, checkBoxSize / 2.0 - 2.0) - drawer.lineSegment(checkBoxSize / 2.0 + 2.0, checkBoxSize / 2.0 + 2.0, checkBoxSize - 5.0, checkBoxSize - 5.0) - drawer.lineSegment(checkBoxSize - 5.0, 5.0, checkBoxSize / 2.0 + 2.0, checkBoxSize / 2.0 - 2.0) - drawer.lineSegment(checkBoxSize / 2.0 - 2.0, checkBoxSize / 2.0 + 2.0, 5.0, checkBoxSize - 5.0) - } - - drawer.popModel() - drawer.fontMap = (root() as? Body)?.controlManager?.fontManager?.font(computedStyle)!! - drawer.translate(5.0 + checkBoxSize, (layout.screenHeight / 2.0) + drawer.fontMap!!.height / 2.0) - drawer.stroke = null - drawer.fill = computedStyle.effectiveColor - drawer.text(label, 0.0, 0.0) - } -} - -@OptIn(DelicateCoroutinesApi::class) -fun Toggle.bind(property: KMutableProperty0) { - var currentValue = property.get() - value = currentValue - - events.valueChanged.listen { - currentValue = it.newValue - property.set(it.newValue) - } - GlobalScope.launch { - while (!disposed) { - val body = (root() as? Body) - if (body != null) { - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur - } - } - update() - (root() as Body).controlManager.program.launch { - while (!disposed) { - update() - yield() - } - } - break - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt deleted file mode 100644 index c52731ba..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt +++ /dev/null @@ -1,71 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.Job -import kotlinx.coroutines.yield -import org.openrndr.draw.Drawer -import org.openrndr.launch - -class WatchListDiv(private val watchList: List, private val builder: WatchListDiv.(T) -> Unit) : Div(), DisposableElement { - override var disposed: Boolean = false - private var listState = emptyList() - private var watchJob: Job? = null - - override fun dispose() { - super.dispose() - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - children.clear() - } - - fun regenerate() { - var regenerate = false - if (listState.size != watchList.size) { - regenerate = true - } - if (!regenerate) { - for (i in watchList.indices) { - if (watchList[i] !== listState[i]) { - regenerate = true - break - } - } - } - if (regenerate) { - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - children.clear() - listState = watchList.map { it } - for (i in watchList) { - builder(i) - } - requestRedraw() - } - } - - fun checkJob() { - if (watchJob == null) { - watchJob = (root() as Body).controlManager.program.launch { - while (!disposed) { - regenerate() - yield() - } - } - } - } - override fun draw(drawer: Drawer) { - checkJob() - super.draw(drawer) - } -} - -fun Element.watchListDiv(vararg classes: String, watchList: List, builder: WatchListDiv.(T) -> Unit) { - val wd = WatchListDiv(watchList, builder) - wd.classes.addAll(classes.map { ElementClass(it) }) - this.append(wd) - wd.regenerate() - wd.checkJob() -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchObjectDiv.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchObjectDiv.kt deleted file mode 100644 index f79f6ab7..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchObjectDiv.kt +++ /dev/null @@ -1,75 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.Job -import kotlinx.coroutines.yield -import org.openrndr.draw.Drawer -import org.openrndr.launch -import org.openrndr.panel.hash.watchHash - -class WatchObjectDiv( - val watchObject: T, - private val builder: WatchObjectDiv.(T) -> Unit -) : Div(), - DisposableElement { - override var disposed: Boolean = false - private var objectStateHash = watchHash(watchObject) - private var watchJob: Job? = null - - - override fun dispose() { - super.dispose() - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - children.clear() - } - - fun regenerate(force: Boolean = false) { - var regenerate = force - if (watchHash(watchObject) != objectStateHash) { - regenerate = true - } - - if (regenerate) { - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - objectStateHash = watchHash(watchObject) - children.clear() - builder(watchObject) - - requestRedraw() - } - } - - fun checkJob() { - if (watchJob == null) { - watchJob = (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - regenerate() - yield() - } - } - } - } - - override fun draw(drawer: Drawer) { - checkJob() - super.draw(drawer) - } -} - -fun Element.watchObjectDiv( - vararg classes: String, - watchObject: T, - builder: WatchObjectDiv.(T) -> Unit -) : WatchObjectDiv { - val wd = WatchObjectDiv(watchObject, builder) - wd.classes.addAll(classes.map { ElementClass(it) }) - this.append(wd) - wd.regenerate(true) - wd.checkJob() - return wd -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt deleted file mode 100644 index 233f98e5..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt +++ /dev/null @@ -1,74 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.Job -import kotlinx.coroutines.yield -import org.openrndr.draw.Drawer -import org.openrndr.launch -import kotlin.reflect.KMutableProperty0 - -class WatchPropertyDiv( - private val watchProperty: KMutableProperty0, - private val builder: WatchPropertyDiv.(T) -> Unit -) : Div(), - DisposableElement { - override var disposed: Boolean = false - private var propertyState = watchProperty.get() - private var watchJob: Job? = null - - - override fun dispose() { - super.dispose() - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - children.clear() - } - - fun regenerate(force: Boolean = false) { - var regenerate = force - if (watchProperty.get() != propertyState) { - regenerate = true - } - - if (regenerate) { - for (child in children) { - child.parent = null - (child as? DisposableElement)?.dispose() - } - propertyState = watchProperty.get() - children.clear() - builder(propertyState) - - requestRedraw() - } - } - - fun checkJob() { - if (watchJob == null) { - watchJob = (root() as? Body)?.controlManager?.program?.launch { - while (!disposed) { - regenerate() - yield() - } - } - } - } - - override fun draw(drawer: Drawer) { - checkJob() - super.draw(drawer) - } -} - -fun Element.watchPropertyDiv( - vararg classes: String, - watchProperty: KMutableProperty0, - builder: WatchPropertyDiv.(T) -> Unit -) { - val wd = WatchPropertyDiv(watchProperty, builder) - wd.classes.addAll(classes.map { ElementClass(it) }) - this.append(wd) - wd.regenerate(true) - wd.checkJob() -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/XYPad.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/XYPad.kt deleted file mode 100644 index 5cd146fd..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/elements/XYPad.kt +++ /dev/null @@ -1,264 +0,0 @@ -package org.openrndr.panel.elements - -import kotlinx.coroutines.yield -import org.openrndr.* -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer - -import org.openrndr.events.Event -import org.openrndr.extra.textwriter.TextWriter -import org.openrndr.math.Vector2 -import org.openrndr.math.clamp -import org.openrndr.math.map -import org.openrndr.panel.style.Color -import org.openrndr.panel.style.color -import org.openrndr.shape.LineSegment -import kotlin.math.pow -import kotlin.math.round -import kotlin.reflect.KMutableProperty0 - - -class XYPad : Element(ElementType("xy-pad")) { - var minX = -1.0 - var minY = -1.0 - var maxX = 1.0 - var maxY = 1.0 - - /** - * The label - */ - var label = "" - - /** - * The precision of the control, default is 2 - */ - var precision = 2 - - /** - * Should the control visualize the value as a vector?, default is false - */ - var showVector = false - - /** - * Should the control invert the Y-axis?, default is true - */ - var invertY = true - - // The value is derived from the normalized value... - var normalizedValue = Vector2(0.0, 0.0) - - var value: Vector2 - get() = Vector2( - map(-1.0, 1.0, minX, maxX, normalizedValue.x).round(precision), - map(-1.0, 1.0, minY, maxY, normalizedValue.y).round(precision) - ) - set(newValue) { - normalizedValue = Vector2( - clamp(map(minX, maxX, -1.0, 1.0, newValue.x), -1.0, 1.0), - clamp(map(minY, maxY, -1.0, 1.0, newValue.y), -1.0, 1.0) - ) - requestRedraw() - } - - init { - mouse.clicked.listen { - it.cancelPropagation() - pick(it) - } - - mouse.dragged.listen { - it.cancelPropagation() - pick(it) - } - - mouse.pressed.listen { - it.cancelPropagation() - } - - keyboard.pressed.listen { handleKeyEvent(it) } - keyboard.repeated.listen { handleKeyEvent(it) } - } - - class ValueChangedEvent(val source: XYPad, - val oldValue: Vector2, - val newValue: Vector2) - - - val events = Events() - - class Events { - val valueChanged = Event("xypad-value-changed") - } - - - private fun handleKeyEvent(keyEvent: KeyEvent) { - val keyboardIncrementX = if (KeyModifier.SHIFT in keyEvent.modifiers) { - (maxX - minX) / 10.0 - } else { - 10.0.pow(-(precision - 0.0)) - } - - val keyboardIncrementY = if (KeyModifier.SHIFT in keyEvent.modifiers) { - (maxY - minY) / 10.0 - } else { - 10.0.pow(-(precision - 0.0)) - } - - val old = value - - if (keyEvent.key == KEY_ARROW_RIGHT) { - value = Vector2(value.x + keyboardIncrementX, value.y) - } - - if (keyEvent.key == KEY_ARROW_LEFT) { - value = Vector2(value.x - keyboardIncrementX, value.y) - } - - if (keyEvent.key == KEY_ARROW_UP) { - value = Vector2(value.x, value.y - keyboardIncrementY * if (invertY) -1.0 else 1.0) - } - - if (keyEvent.key == KEY_ARROW_DOWN) { - value = Vector2(value.x, value.y + keyboardIncrementY * if (invertY) -1.0 else 1.0) - } - - requestRedraw() - events.valueChanged.trigger(ValueChangedEvent(this, old, value)) - keyEvent.cancelPropagation() - } - - private fun pick(e: MouseEvent) { - val old = value - - // Difference - val dx = e.position.x - layout.screenX - val dy = e.position.y - layout.screenY - - // Normalize to -1 - 1 - val nx = clamp(dx / layout.screenWidth * 2.0 - 1.0, -1.0, 1.0) - val ny = clamp(dy / layout.screenHeight * 2.0 - 1.0, -1.0, 1.0) * if (invertY) -1.0 else 1.0 - - normalizedValue = Vector2(nx, ny) - - events.valueChanged.trigger(ValueChangedEvent(this, old, value)) - requestRedraw() - } - - override val widthHint: Double? - get() = 200.0 - - - private val ballPosition: Vector2 - get() = Vector2( - map(-1.0, 1.0, 0.0, layout.screenWidth, normalizedValue.x), - if (invertY) { - map(1.0, -1.0, 0.0, layout.screenHeight, normalizedValue.y) - } else { - map(-1.0, 1.0, 0.0, layout.screenHeight, normalizedValue.y) - } - ) - - private val grid = mutableListOf() - - override fun draw(drawer: Drawer) { - if(grid.isEmpty()) { - repeat(21) { n -> - grid.add( - LineSegment( - 0.0, - layout.screenHeight / 20 * n, - layout.screenWidth - 1.0, - layout.screenHeight / 20 * n - ) - ) - grid.add( - LineSegment( - layout.screenWidth / 20 * n, - 0.0, - layout.screenWidth / 20 * n, - layout.screenHeight - 1.0 - ) - ) - } - - } - computedStyle.let { - drawer.pushTransforms() - drawer.pushStyle() - - drawer.fill = ColorRGBa.GRAY - drawer.stroke = null - drawer.strokeWeight = 0.0 - drawer.rectangle(0.0, 0.0, layout.screenWidth, layout.screenHeight) - - // lines grid - drawer.stroke = ColorRGBa.GRAY.shade(1.1) - drawer.strokeWeight = 1.0 - drawer.lineSegments(grid) - - // cross - drawer.stroke = ColorRGBa.GRAY.shade(1.6) -// drawer.lineSegment(0.0, layout.screenHeight / 2.0, layout.screenWidth, layout.screenHeight / 2.0) -// drawer.lineSegment(layout.screenWidth / 2.0, 0.0, layout.screenWidth / 2.0, layout.screenHeight) - - // angle line from center - if (showVector) { - drawer.lineSegment(Vector2(layout.screenHeight / 2.0, layout.screenWidth / 2.0), ballPosition) - } - - // ball - drawer.fill = ColorRGBa.PINK - drawer.stroke = ColorRGBa.WHITE - drawer.circle(ballPosition, 8.0) - - val valueLabel = "${String.format("%.0${precision}f", value.x)}, ${String.format("%.0${precision}f", value.y)}" - - (root() as? Body)?.controlManager?.fontManager?.let { - val writer = TextWriter(drawer) - drawer.fontMap = it.font(computedStyle) - val textWidth = writer.textWidth(valueLabel) - - drawer.fill = ((computedStyle.color as? Color.RGBa)?.color ?: ColorRGBa.WHITE).opacify( - if (disabled in pseudoClasses) 0.25 else 1.0 - ) - - drawer.text(valueLabel,layout.screenWidth - textWidth - 4.0, layout.screenHeight - 4.0) - drawer.text(label, 0.0, layout.screenHeight + 18.0) - } - - drawer.popStyle() - drawer.popTransforms() - } - } -} - -fun XYPad.bind(property: KMutableProperty0) { - var currentValue: Vector2? = null - - events.valueChanged.listen { - currentValue = it.newValue - property.set(it.newValue) - } - if (root() as? Body == null) { - throw RuntimeException("no body") - } - fun update() { - if (property.get() != currentValue) { - val lcur = property.get() - currentValue = lcur - value = lcur - } - } - update() - (root() as? Body)?.controlManager?.program?.launch { - while (true) { - update() - yield() - } - } -} - -fun Double.round(decimals: Int): Double { - val multiplier = 10.0.pow(decimals) - return round(this * multiplier) / multiplier -} diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/hash/WatchHash.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/hash/WatchHash.kt deleted file mode 100644 index bbb2ec1e..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/hash/WatchHash.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.openrndr.panel.hash - -import kotlin.reflect.KProperty0 -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.declaredMemberProperties - -fun watchHash(toHash: Any): Int { - var hash = 0 - for (property in toHash::class.declaredMemberProperties) { - @Suppress("UNCHECKED_CAST") val v = ((property as KProperty1).getter).invoke(toHash) - if (v is KProperty0<*>) { - val pv = v.get() - hash = 31 * hash + (pv?.hashCode() ?: 0) - } else { - hash = 31 * hash + (v?.hashCode() ?: 0) - } - } - return hash -} - diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/layout/Layouter.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/layout/Layouter.kt deleted file mode 100644 index 1b180deb..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/layout/Layouter.kt +++ /dev/null @@ -1,281 +0,0 @@ -package org.openrndr.panel.layout - -import org.openrndr.math.Vector2 -import org.openrndr.panel.elements.Element -import org.openrndr.panel.elements.TextNode -import org.openrndr.panel.style.* -import org.openrndr.shape.Rectangle -import java.util.* -import kotlin.comparisons.compareBy -import kotlin.math.max - -class Layouter { - val styleSheets = ArrayList() - val blockLike = setOf(Display.BLOCK, Display.FLEX) - val manualPosition = setOf(Position.FIXED, Position.ABSOLUTE) - - fun positionChildren(element: Element, knownWidth:Double? = null): Rectangle { - - return element.computedStyle.let { cs -> - var y = element.layout.screenY - element.scrollTop + element.computedStyle.effectivePaddingTop - - when (cs.display) { - Display.FLEX -> { - when (cs.flexDirection) { - FlexDirection.Row -> { - var maxHeight = 0.0 - var x = element.layout.screenX + element.computedStyle.effectivePaddingLeft - - val totalWidth = element.children.filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition }.map { width(it) }.sum() - val remainder = (knownWidth?: element.layout.screenWidth) - totalWidth - val totalGrow = element.children.filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition }.map { (it.computedStyle.flexGrow as FlexGrow.Ratio).value }.sum() - val totalShrink = element.children.filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition }.map { (it.computedStyle.flexShrink as FlexGrow.Ratio).value }.sum() - - - element.children.filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition }.forEach { child -> - val elementGrow = (child.computedStyle.flexGrow as FlexGrow.Ratio).value - val elementShrink = (child.computedStyle.flexShrink as FlexGrow.Ratio).value - val growWidth = if (totalGrow > 0) (elementGrow / totalGrow) * remainder else 0.0 - val shrinkWidth = if (totalShrink > 0) (elementShrink / totalShrink) * remainder else 0.0 - - child.layout.screenY = y + ((child.computedStyle.marginTop as? LinearDimension.PX)?.value - ?: 0.0) - child.layout.screenX = x + ((child.computedStyle.marginLeft as? LinearDimension.PX)?.value - ?: 0.0) - - child.layout.growWidth = if (remainder > 0) growWidth else shrinkWidth - - val effectiveWidth = width(child) + (if (remainder > 0) growWidth else shrinkWidth) - x += effectiveWidth - maxHeight = max(height(child, effectiveWidth), maxHeight) - } - Rectangle(Vector2(x, y), x - element.layout.screenX, maxHeight) - } - FlexDirection.Column -> { - var maxWidth = 0.0 - var ly = element.layout.screenY + element.computedStyle.effectivePaddingTop - val lx = element.layout.screenX + element.computedStyle.effectivePaddingLeft - - val verticalPadding = element.computedStyle.effectivePaddingTop + element.computedStyle.effectivePaddingBottom - val totalHeight = element.children - .filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition } - .sumOf { height(it, width(it)) } - val remainder = ((element.layout.screenHeight - verticalPadding) - totalHeight) - val totalGrow = element.children - .filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition } - .sumOf { (it.computedStyle.flexGrow as FlexGrow.Ratio).value } - - element.children.filter { it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition }.forEach { child -> - val elementGrow = (child.computedStyle.flexGrow as FlexGrow.Ratio).value - val growHeight = if (totalGrow > 0) (elementGrow / totalGrow) * remainder else 0.0 - - child.layout.screenY = ly + ((child.computedStyle.marginTop as? LinearDimension.PX)?.value - ?: 0.0) - child.layout.screenX = lx + ((child.computedStyle.marginLeft as? LinearDimension.PX)?.value - ?: 0.0) - - child.layout.growHeight = growHeight - - val effectHeight = height(child) + growHeight - ly += effectHeight - maxWidth = max(width(child), maxWidth) - } - - Rectangle(Vector2(lx, ly), maxWidth, ly - element.layout.screenY) - } - else -> Rectangle(Vector2(element.layout.screenX, element.layout.screenY), 0.0, 0.0) - } - } - else -> { - val x = element.layout.screenX + element.computedStyle.effectivePaddingLeft - var maxWidth = 0.0 - element.children.forEach { - if (it.computedStyle.display in blockLike && it.computedStyle.position !in manualPosition) { - it.layout.screenY = y + ((it.computedStyle.marginTop as? LinearDimension.PX)?.value ?: 0.0) - it.layout.screenX = x + ((it.computedStyle.marginLeft as? LinearDimension.PX)?.value ?: 0.0) - val effectiveWidth = width(it) - maxWidth = max(effectiveWidth, maxWidth) - y += height(it, effectiveWidth) - } else if (it.computedStyle.position == Position.ABSOLUTE) { - it.layout.screenX = element.layout.screenX + ((it.computedStyle.left as? LinearDimension.PX)?.value - ?: 0.0) - it.layout.screenY = element.layout.screenY + ((it.computedStyle.top as? LinearDimension.PX)?.value - ?: 0.0) - } - } - Rectangle(Vector2(element.layout.screenX, element.layout.screenY), maxWidth, y - element.layout.screenY) - } - } - } - } - - fun computeStyles(element: Element) { - val matcher = Matcher() - - if (element is TextNode) { - // TODO: figure out why this is needed - element.computedStyle = element.parent?.computedStyle?.cascadeOnto(StyleSheet(CompoundSelector.DUMMY)) - ?: StyleSheet(CompoundSelector.DUMMY) - } else { - element.computedStyle = - styleSheets - .filter { - it.selector.let { - matcher.matches(it, element) - } - } - .sortedWith(compareBy({ it.precedence.component1() }, - { it.precedence.component2() }, - { it.precedence.component3() }, - { it.precedence.component4() })) - .reversed() - .fold(StyleSheet(CompoundSelector.DUMMY), { a, b -> a.cascadeOnto(b) }) - - element.style?.let { - element.computedStyle = it.cascadeOnto(element.computedStyle) - } - } - element.computedStyle.let { cs -> - - element.parent?.let { p -> - cs.properties.forEach { (k, v) -> - if ((v.value as? PropertyValue)?.inherit == true) { - cs.properties[k] = p.computedStyle.getProperty(k) ?: v - } - } - PropertyBehaviours.behaviours.forEach { (k, v) -> - if (v.inheritance == PropertyInheritance.INHERIT && k !in cs.properties) { - if (k in p.computedStyle.properties) { - cs.properties[k] = p.computedStyle.getProperty(k)!! - } - } - } - } - } - - element.children.forEach { computeStyles(it) } - } - - fun margin(element: Element, f: (StyleSheet) -> LinearDimension): Double { - val value = f(element.computedStyle) - return when (value) { - is LinearDimension.PX -> value.value - else -> 0.0 - } - } - - fun padding(element: Element?, f: (StyleSheet) -> LinearDimension): Double { - return if (element != null) { - val value = f(element.computedStyle) - when (value) { - is LinearDimension.PX -> value.value - else -> 0.0 - } - } else 0.0 - } - - fun marginTop(element: Element) = margin(element, StyleSheet::marginTop) - fun marginBottom(element: Element) = margin(element, StyleSheet::marginBottom) - fun marginLeft(element: Element) = margin(element, StyleSheet::marginLeft) - fun marginRight(element: Element) = margin(element, StyleSheet::marginRight) - - fun paddingTop(element: Element?) = padding(element, StyleSheet::paddingTop) - fun paddingBottom(element: Element?) = padding(element, StyleSheet::paddingBottom) - fun paddingLeft(element: Element?) = padding(element, StyleSheet::paddingLeft) - fun paddingRight(element: Element?) = padding(element, StyleSheet::paddingRight) - - fun height(element: Element, width: Double? = null, includeMargins: Boolean = true): Double { - if (element.computedStyle.display == Display.NONE) { - return 0.0 - } - - if (element is TextNode) { - return element.sizeHint().height + if (includeMargins) marginBottom(element) + marginTop(element) else 0.0 - } - - return element.computedStyle.let { - it.height.let { ld -> - when (val it = ld) { - is LinearDimension.PX -> it.value - is LinearDimension.Percent -> { - val parentHeight = element.parent?.layout?.screenHeight ?: 0.0 - val parentPadding = element.parent?.computedStyle?.effectivePaddingHeight ?: 0.0 - val margins = marginTop(element) + marginBottom(element) - val effectiveHeight = (parentHeight - parentPadding) * (it.value / 100.0) - margins - effectiveHeight - } - is LinearDimension.Auto -> { - val padding = paddingTop(element) + paddingBottom(element) - (element.heightHint ?: positionChildren(element, width).height) + padding - } - is LinearDimension.Calculate -> { - val context = CalculateContext(width, null) - it.function(context) - - } - else -> throw RuntimeException("not supported") - } - } + if (includeMargins) ((it.marginTop as? LinearDimension.PX)?.value - ?: 0.0) + ((it.marginBottom as? LinearDimension.PX)?.value ?: 0.0) else 0.0 - } - } - - fun width(element: Element, height: Double? = null, includeMargins: Boolean = true): Double = element.computedStyle.let { - if (element.computedStyle.display == Display.NONE) { - return 0.0 - } - val result = - it.width.let { - when (it) { - is LinearDimension.PX -> it.value - is LinearDimension.Percent -> { - val parentWidth = element.parent?.layout?.screenWidth ?: 0.0 - val parentPadding = element.parent?.computedStyle?.effectivePaddingWidth ?: 0.0 - val margins = marginLeft(element) + marginRight(element) - val effectiveWidth = (parentWidth - parentPadding) * (it.value / 100.0) - margins - effectiveWidth - } -// is LinearDimension.Calculate -> { -// val context = CalculateContext(null, height) -// it.function(context) -// -// } - is LinearDimension.Auto -> (element.widthHint ?: positionChildren(element).width) + - paddingRight(element) + paddingLeft(element) - else -> throw RuntimeException("not supported") - } - } + if (includeMargins) marginLeft(element) + marginRight(element) else 0.0 - - // TODO: find out why this hack is needed, I added this because somewhere in the layout process - // this information is lost - element.layout.screenWidth = result - if (includeMargins) marginLeft(element) + marginRight(element) else 0.0 - result - } - - fun layout(element: Element) { - element.computedStyle.also { cs -> - cs.display.let { if (it == Display.NONE) return } - element.layout.screenWidth = width(element, includeMargins = false) - element.layout.screenWidth += element.layout.growWidth - element.layout.screenHeight = height(element, element.layout.screenWidth, includeMargins = false) - element.layout.screenHeight += element.layout.growHeight - - when (cs.position) { - Position.FIXED -> { - element.layout.screenX = (cs.left as? LinearDimension.PX)?.value ?: 0.0 - element.layout.screenY = (cs.top as? LinearDimension.PX)?.value ?: 0.0 - } - else -> { - } - } - val lzi = cs.zIndex - element.layout.zIndex = when (lzi) { - is ZIndex.Value -> lzi.value - is ZIndex.Auto -> element.parent?.layout?.zIndex ?: 0 - is ZIndex.Inherit -> element.parent?.layout?.zIndex ?: 0 - } - val result = positionChildren(element) - } - element.children.forEach { layout(it) } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/DefaultStyles.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/DefaultStyles.kt deleted file mode 100644 index be02f005..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/DefaultStyles.kt +++ /dev/null @@ -1,210 +0,0 @@ -package org.openrndr.panel.style - -import org.openrndr.color.ColorRGBa - -fun defaultStyles( - controlBackground: ColorRGBa = ColorRGBa(0.5, 0.5, 0.5), - controlHoverBackground: ColorRGBa = controlBackground.shade(1.5), - controlTextColor: Color = Color.RGBa(ColorRGBa.WHITE.shade(0.8)), - controlActiveColor : Color = Color.RGBa(ColorRGBa.fromHex(0xf88379 )), - controlFontSize: Double = 14.0 -) = listOf( - styleSheet(has type "item") { - display = Display.NONE - }, - - styleSheet(has type "textfield") { - width = 100.percent - height = 64.px - and(has state "active") { - color = controlActiveColor - } - }, - - styleSheet(has type "dropdown-button") { - width = LinearDimension.Auto - height = 32.px - background = Color.RGBa(controlBackground) - marginLeft = 5.px - marginRight = 5.px - marginTop = 5.px - marginBottom = 5.px - fontSize = controlFontSize.px - - and(has state "hover") { - background = Color.RGBa(controlHoverBackground) - } - - descendant(has type "button") { - width = 100.percent - height = 24.px - marginBottom = 0.px - marginTop = 0.px - marginLeft = 0.px - marginRight = 0.px - } - }, - - styleSheet(has type "colorpicker-button") { - width = 100.px - height = 32.px - background = Color.RGBa(controlBackground) - marginLeft = 5.px - marginRight = 5.px - marginTop = 5.px - marginBottom = 5.px - - and(has state "hover") { - background = Color.RGBa(controlHoverBackground) - } - }, - - styleSheet(has type "envelope-button") { - width = 100.px - height = 40.px - background = Color.RGBa(controlBackground) - marginLeft = 5.px - marginRight = 5.px - marginTop = 5.px - marginBottom = 5.px - }, - - styleSheet(has type "body") { - fontSize = 18.px - fontFamily = "default" - }, - - styleSheet(has type "slider") { - height = 32.px - width = 100.percent - marginTop = 5.px - marginBottom = 5.px - marginLeft = 5.px - marginRight = 5.px - fontSize = controlFontSize.px - color = controlTextColor - - and(has state "active") { - color = controlActiveColor - } - }, - - styleSheet(has type "envelope-editor") { - height = 60.px - width = 100.percent - marginTop = 5.px - marginBottom = 15.px - marginLeft = 5.px - marginRight = 5.px - }, - - styleSheet(has type listOf( - "sequence-editor", - "sliders-vector2", - "sliders-vector3", - "sliders-vector4" - )) { - height = 60.px - width = 100.percent - marginTop = 5.px - marginBottom = 15.px - marginLeft = 5.px - marginRight = 5.px - color = controlTextColor - and(has state "active") { - color = controlActiveColor - } - }, - - styleSheet(has type "colorpicker") { - height = 80.px - width = 100.percent - marginTop = 5.px - marginBottom = 15.px - marginLeft = 5.px - marginRight = 5.px - }, - - styleSheet(has type "xy-pad") { - display = Display.BLOCK - background = Color.RGBa(ColorRGBa.GRAY) - width = 175.px - height = 175.px - marginLeft = 5.px - marginRight = 5.px - marginTop = 5.px - marginBottom = 25.px - fontFamily = "default" - color = controlTextColor - - and(has state "hover") { - display = Display.BLOCK - background = Color.RGBa(ColorRGBa.GRAY.shade(1.5)) - } - }, - - styleSheet(has type "overlay") { - zIndex = ZIndex.Value(1) - }, - - styleSheet(has type "toggle") { - height = 32.px - width = LinearDimension.Auto - marginTop = 5.px - marginBottom = 5.px - marginLeft = 5.px - marginRight = 5.px - fontSize = controlFontSize.px - color = controlTextColor - }, - - styleSheet(has type "h1") { - fontSize = 24.px - width = 100.percent - height = LinearDimension.Auto - display = Display.BLOCK - }, - - styleSheet(has type "h2") { - fontSize = 20.px - width = 100.percent - height = LinearDimension.Auto - display = Display.BLOCK - }, - - styleSheet(has type "h3") { - fontSize = 16.px - width = 100.percent - height = LinearDimension.Auto - display = Display.BLOCK - }, - - styleSheet(has type "p") { - fontSize = 16.px - width = 100.percent - height = LinearDimension.Auto - display = Display.BLOCK - }, - styleSheet(has type "button") { - display = Display.BLOCK - background = Color.RGBa(controlBackground) - width = LinearDimension.Auto - height = 32.px - paddingLeft = 10.px - paddingRight = 10.px - marginLeft = 5.px - marginRight = 5.px - marginTop = 5.px - marginBottom = 5.px - fontSize = controlFontSize.px - - and(has state "active") { - display = Display.BLOCK - background = controlActiveColor - } - and(has state "hover") { - display = Display.BLOCK - background = Color.RGBa(controlHoverBackground) - } - } -) diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Matcher.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Matcher.kt deleted file mode 100644 index d44ca590..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Matcher.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.openrndr.panel.style - -import org.openrndr.panel.elements.Element - -class Matcher { - enum class MatchingResult { - MATCHED, NOT_MATCHED, RESTART_FROM_CLOSEST_DESCENDANT, RESTART_FROM_CLOSEST_LATER_SIBLING - } - - fun matches(selector: CompoundSelector, element: Element): Boolean { - return matchesCompound(selector, element) == MatchingResult.MATCHED - } - - private fun matchesCompound(selector: CompoundSelector, element: Element): MatchingResult { - if (selector.selectors.any { !it.accept(element) }) { - return MatchingResult.RESTART_FROM_CLOSEST_LATER_SIBLING - } - - if (selector.previous == null) { - return MatchingResult.MATCHED - } - - val (siblings, candidateNotFound) = - when (selector.previous?.first) { - Combinator.NEXT_SIBLING, Combinator.LATER_SIBLING -> Pair(true, MatchingResult.RESTART_FROM_CLOSEST_DESCENDANT) - else -> Pair(false, MatchingResult.NOT_MATCHED) - } - - var node = element - while (true) { - val nextNode = if (siblings) node.previousSibling() else node.parent - - if (nextNode == null) { - return candidateNotFound - } else { - node = nextNode - } - - val result = matchesCompound(selector.previous?.second!!, node) - - if (result == MatchingResult.MATCHED || result == MatchingResult.NOT_MATCHED) { - return result - } - - when (selector.previous?.first) { - Combinator.CHILD -> return MatchingResult.RESTART_FROM_CLOSEST_DESCENDANT - Combinator.NEXT_SIBLING -> return result - Combinator.LATER_SIBLING -> if (result == MatchingResult.RESTART_FROM_CLOSEST_DESCENDANT) { - return result - } - Combinator.DESCENDANT, null -> { - // intentionally do nothing - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Selector.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Selector.kt deleted file mode 100644 index a62c3a17..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/Selector.kt +++ /dev/null @@ -1,145 +0,0 @@ -package org.openrndr.panel.style - -import org.openrndr.panel.elements.Element -import org.openrndr.panel.elements.ElementClass -import org.openrndr.panel.elements.ElementPseudoClass -import org.openrndr.panel.elements.ElementType - -data class SelectorPrecedence(var inlineStyle: Int = 0, var id: Int = 0, var classOrAttribute: Int = 0, var type: Int = 0) - -abstract class Selector { - abstract fun accept(element: Element): Boolean -} - -class CompoundSelector { - companion object { - val DUMMY = CompoundSelector() - } - - var previous: Pair? - var selectors: MutableList - - constructor() { - previous = null - selectors = mutableListOf() - } - - constructor(previous: Pair?, selectors: List) { - this.previous = previous - this.selectors = ArrayList() - selectors.forEach { this.selectors.add(it) } - } - - fun precedence(p: SelectorPrecedence = SelectorPrecedence()): SelectorPrecedence { - - selectors.forEach { - when (it) { - is IdentitySelector -> p.id++ - is ClassSelector, is PseudoClassSelector -> p.classOrAttribute++ - is TypeSelector -> p.type++ - else -> { - } - } - } - var r = p - previous?.let { - r = it.second.precedence(p) - } - return r - } - - override fun toString(): String { - return "CompoundSelector(previous=$previous, selectors=$selectors)" - } - -} - -enum class Combinator { - CHILD, DESCENDANT, NEXT_SIBLING, LATER_SIBLING -} - -class IdentitySelector(val id: String) : Selector() { - override fun accept(element: Element): Boolean = if (element.id != null) { - element.id.equals(id) - } else { - false - } - - override fun toString(): String { - return "IdentitySelector(id='$id')" - } - -} - -class ClassSelector(val c: ElementClass) : Selector() { - override fun accept(element: Element): Boolean = c in element.classes - override fun toString(): String { - return "ClassSelector(c=$c)" - } -} - -class TypeSelector(val type: ElementType) : Selector() { - override fun accept(element: Element): Boolean = element.type == type - override fun toString(): String { - return "TypeSelector(type=$type)" - } -} - -class TypesSelector(vararg types: ElementType) : Selector() { - private val typeSet = types.toSet() - override fun accept(element: Element): Boolean = element.type in typeSet - override fun toString(): String { - return "TypesSelector(types=$typeSet)" - } -} - -class PseudoClassSelector(val c: ElementPseudoClass) : Selector() { - override fun accept(element: Element): Boolean = c in element.pseudoClasses - override fun toString(): String { - return "PseudoClassSelector(c=$c)" - } - -} - -object has { - operator fun invoke(vararg selectors: CompoundSelector): CompoundSelector { - val active = CompoundSelector() - selectors.forEach { - active.selectors.addAll(it.selectors) - } - return active - } - - infix fun state(q: String): CompoundSelector { - val active = CompoundSelector() - active.selectors.add(PseudoClassSelector(ElementPseudoClass((q)))) - return active - } - - infix fun class_(q: String): CompoundSelector { - val active = CompoundSelector() - active.selectors.add(ClassSelector(ElementClass(q))) - return active - } - - infix fun type(q: String): CompoundSelector { - val active = CompoundSelector() - active.selectors.add(TypeSelector(ElementType(q))) - return active - } - - infix fun type(qs: Iterable): CompoundSelector { - val active = CompoundSelector() - val aqs = qs.map { ElementType(it) }.toList().toTypedArray() - active.selectors.add(TypesSelector(*aqs)) - return active - } -} - -infix fun CompoundSelector.and(other: CompoundSelector): CompoundSelector { - val c = CompoundSelector() - c.previous = previous - c.selectors.addAll(selectors) - c.selectors.addAll(other.selectors) - return c -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/StyleSheet.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/StyleSheet.kt deleted file mode 100644 index aebd4b0b..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/style/StyleSheet.kt +++ /dev/null @@ -1,245 +0,0 @@ -package org.openrndr.panel.style - -import org.openrndr.color.ColorRGBa -import org.openrndr.panel.style.PropertyInheritance.INHERIT -import org.openrndr.panel.style.PropertyInheritance.RESET -import java.util.* -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.contract -import kotlin.reflect.KProperty - -enum class PropertyInheritance { - INHERIT, - RESET -} - -@JvmRecord -data class Property(val name: String, - val value: Any?) - -open class PropertyValue(val inherit: Boolean = false) - -sealed class Color(inherit: Boolean = false) : PropertyValue(inherit) { - class RGBa(val color: ColorRGBa) : Color() { - override fun toString(): String { - return "RGBa(color=$color)" - } - } - - object Inherit : Color(inherit = true) -} - -class CalculateContext(val elementWidth: Double?, val elementHeight: Double?) - -sealed class LinearDimension(inherit: Boolean = false) : PropertyValue(inherit) { - class PX(val value: Double) : LinearDimension() { - override fun toString(): String { - return "PX(value=$value)" - } - } - - class Percent(val value: Double) : LinearDimension() - class Calculate(val function: (CalculateContext) -> Double) : LinearDimension() - object Auto : LinearDimension() - object Inherit : LinearDimension(inherit = true) -} - -@JvmRecord -data class PropertyBehaviour(val inheritance: PropertyInheritance, val intitial: Any) - -object PropertyBehaviours { - - val behaviours = HashMap() -} - -class PropertyHandler( - val name: String, val inheritance: PropertyInheritance, val initial: T -) { - - init { - PropertyBehaviours.behaviours[name] = PropertyBehaviour(inheritance, initial as Any) - } - - @Suppress("USELESS_CAST", "UNCHECKED_CAST") - operator fun getValue(stylesheet: StyleSheet, property: KProperty<*>): T { - val value: T? = stylesheet.getProperty(name)?.value as T? - return value ?: PropertyBehaviours.behaviours[name]!!.intitial as T - - } - - operator fun setValue(stylesheet: StyleSheet, property: KProperty<*>, value: T?) { - stylesheet.setProperty(name, value) - } -} - -enum class Display { - INLINE, - BLOCK, - FLEX, - NONE -} - -enum class Position { - STATIC, - ABSOLUTE, - RELATIVE, - FIXED, - INHERIT -} - -sealed class FlexDirection(inherit: Boolean = false) : PropertyValue(inherit) { - object Row : FlexDirection() - object Column : FlexDirection() - object RowReverse : FlexDirection() - object ColumnReverse : FlexDirection() - object Inherit : FlexDirection(inherit = true) -} - -sealed class Overflow(inherit: Boolean = false) : PropertyValue(inherit) { - object Visible : Overflow() - object Hidden : Overflow() - object Scroll : Overflow() - object Inherit : Overflow(inherit = true) -} - -sealed class ZIndex(inherit: Boolean = false) : PropertyValue(inherit) { - object Auto : ZIndex() - class Value(val value: Int) : ZIndex() - object Inherit : ZIndex(inherit = true) -} - -sealed class FlexGrow(inherit: Boolean = false) : PropertyValue(inherit) { - class Ratio(val value: Double) : FlexGrow() - object Inherit : FlexGrow(inherit = true) -} - -private val dummySelector = CompoundSelector() - -class StyleSheet(val selector: CompoundSelector = CompoundSelector.DUMMY) { - val children = mutableListOf() - val properties = HashMap() - - val precedence by lazy { - selector.precedence() - } - - fun getProperty(name: String) = properties.get(name) - - fun setProperty(name: String, value: Any?) { - properties[name] = Property(name, value) - } - - fun cascadeOnto(onto: StyleSheet): StyleSheet { - val cascaded = StyleSheet(dummySelector) - - cascaded.properties.putAll(onto.properties) - cascaded.properties.putAll(properties) - return cascaded - } - - override fun toString(): String { - return "StyleSheet(properties=$properties)" - } -} - -var StyleSheet.width by PropertyHandler("width", RESET, LinearDimension.Auto) -var StyleSheet.height by PropertyHandler("height", RESET, LinearDimension.Auto) -var StyleSheet.top by PropertyHandler("top", RESET, 0.px) // css default is auto -var StyleSheet.left by PropertyHandler("left", RESET, 0.px) // css default is auto - -var StyleSheet.marginTop by PropertyHandler("margin-top", RESET, 0.px) -var StyleSheet.marginBottom by PropertyHandler("margin-bottom", RESET, 0.px) -var StyleSheet.marginLeft by PropertyHandler("margin-left", RESET, 0.px) -var StyleSheet.marginRight by PropertyHandler("margin-right", RESET, 0.px) - - -var StyleSheet.paddingTop by PropertyHandler("padding-top", RESET, 0.px) -var StyleSheet.paddingBottom by PropertyHandler("padding-bottom", RESET, 0.px) -var StyleSheet.paddingLeft by PropertyHandler("padding-left", RESET, 0.px) -var StyleSheet.paddingRight by PropertyHandler("padding-right", RESET, 0.px) - - -var StyleSheet.position by PropertyHandler("position", RESET, Position.STATIC) -var StyleSheet.display by PropertyHandler("display", RESET, Display.BLOCK) // css default is inline - -var StyleSheet.flexDirection by PropertyHandler("flex-direction", RESET, FlexDirection.Row) -var StyleSheet.flexGrow by PropertyHandler("flex-grow", RESET, FlexGrow.Ratio(0.0)) -var StyleSheet.flexShrink by PropertyHandler("flex-shrink", RESET, FlexGrow.Ratio(1.0)) - -var StyleSheet.borderWidth by PropertyHandler("border-width", RESET, 0.px) -var StyleSheet.borderColor by PropertyHandler("border-color", INHERIT, Color.RGBa(ColorRGBa.TRANSPARENT)) - -var StyleSheet.background by PropertyHandler("background-color", RESET, Color.RGBa(ColorRGBa.BLACK.opacify(0.0))) -val StyleSheet.effectiveBackground: ColorRGBa? - get() = (background as? Color.RGBa)?.color - -var StyleSheet.color by PropertyHandler("color", INHERIT, Color.RGBa(ColorRGBa.WHITE)) -val StyleSheet.effectiveColor: ColorRGBa? - get() = (color as? Color.RGBa)?.color - - -val StyleSheet.effectivePaddingLeft: Double - get() = (paddingLeft as? LinearDimension.PX)?.value ?: 0.0 - -val StyleSheet.effectivePaddingRight: Double - get() = (paddingRight as? LinearDimension.PX)?.value ?: 0.0 - -val StyleSheet.effectivePaddingTop: Double - get() = (paddingTop as? LinearDimension.PX)?.value ?: 0.0 - -val StyleSheet.effectivePaddingBottom: Double - get() = (paddingBottom as? LinearDimension.PX)?.value ?: 0.0 - - -val StyleSheet.effectivePaddingHeight: Double - get() = effectivePaddingBottom + effectivePaddingTop - -val StyleSheet.effectivePaddingWidth: Double - get() = effectivePaddingLeft + effectivePaddingRight - - -val StyleSheet.effectiveBorderWidth: Double - get() = (borderWidth as? LinearDimension.PX)?.value ?: 0.0 - -val StyleSheet.effectiveBorderColor: ColorRGBa? - get() = (borderColor as? Color.RGBa)?.color - - -var StyleSheet.fontSize by PropertyHandler("font-size", INHERIT, 14.px) -var StyleSheet.fontFamily by PropertyHandler("font-family", INHERIT, "default") -var StyleSheet.overflow by PropertyHandler("overflow", RESET, Overflow.Visible) -var StyleSheet.zIndex by PropertyHandler("z-index", RESET, ZIndex.Auto) - -val Number.px: LinearDimension.PX get() = LinearDimension.PX(this.toDouble()) -val Number.percent: LinearDimension.Percent get() = LinearDimension.Percent(this.toDouble()) - -fun StyleSheet.child(selector: CompoundSelector, init: StyleSheet.() -> Unit) { - val stylesheet = StyleSheet(selector).apply(init) - stylesheet.selector.previous = Pair(Combinator.CHILD, this.selector) - children.add(stylesheet) -} - -fun StyleSheet.descendant(selector: CompoundSelector, init: StyleSheet.() -> Unit) { - val stylesheet = StyleSheet(selector).apply(init) - stylesheet.selector.previous = Pair(Combinator.DESCENDANT, this.selector) - children.add(stylesheet) -} - -fun StyleSheet.and(selector: CompoundSelector, init: StyleSheet.() -> Unit) { - val stylesheet = StyleSheet(this.selector and selector).apply(init) - this.children.add(stylesheet) -} - -fun StyleSheet.flatten(): List { - return listOf(this) + children.flatMap { it.flatten() } -} - -@OptIn(ExperimentalContracts::class) -fun styleSheet(selector: CompoundSelector = CompoundSelector.DUMMY, init: StyleSheet.() -> Unit): StyleSheet { - contract { - callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - return StyleSheet(selector).apply { - init() - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/tools/Tooltip.kt b/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/tools/Tooltip.kt deleted file mode 100644 index d6b78daf..00000000 --- a/orx-jvm/orx-panel/src/main/kotlin/org/openrndr/panel/tools/Tooltip.kt +++ /dev/null @@ -1,56 +0,0 @@ -package org.openrndr.panel.tools - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.Drawer -import org.openrndr.draw.isolated -import org.openrndr.draw.loadFont -import org.openrndr.extra.textwriter.writer - -import org.openrndr.math.Vector2 -import org.openrndr.panel.elements.Body -import org.openrndr.panel.elements.Element -import kotlin.math.max - -class Tooltip(val parent: Element, val position: Vector2, val message: String) { - fun draw(drawer: Drawer) { - - val fontUrl = (parent.root() as Body).controlManager.fontManager.resolve("default") ?: error("no font") - val fontSize = 14.0 - val program = (parent.root() as? Body)?.controlManager?.program ?: error("no program") - val fontMap = program.loadFont(fontUrl, fontSize) - - val lines = message.split("\n") - - drawer.isolated { - drawer.fontMap = fontMap - - var maxX = 0.0 - var maxY = 0.0 - writer(drawer) { - for (line in lines) { - newLine() - text(line, false) - maxX = max(maxX, cursor.x) - maxY = cursor.y - } - gaplessNewLine() - maxY = cursor.y - } - - drawer.translate(position) - drawer.translate(10.0, 0.0) - drawer.strokeWeight = 0.5 - drawer.stroke = ColorRGBa.WHITE.opacify(0.25) - drawer.fill = ColorRGBa.GRAY - drawer.rectangle(0.0, 0.0, maxX + 20.0, maxY) - drawer.fill = ColorRGBa.BLACK - drawer.translate(10.0, 0.0) - writer(drawer) { - for (line in lines) { - newLine() - text(line) - } - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Medium.ttf b/orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Medium.ttf deleted file mode 100644 index 39c63d7461796094c0b8889ee8fe2706d344a99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162588 zcmZQzWME(rWMp7qVGwW+@DHwCRoKJ8#Ib^bA(F>EIMm5!j>ZE9ro=4_43ZiC!TLrE zxi@ZOU|^iVz`&4@oSRtSpypA;z#x^wz#w!YxvWHiWxBQ(1B3n^1_p+(w1V{9>Ys_L z85nd;7#JA$q$d^^FmNykGca+?VPIh3NzbWFTQ@K1B?E)y9R|kJXEIW9D{Sp;6c`vp z8yFZ^-ejaEru?X0&B4IHD8sM|V+aESgGxqjNrlR1m#+*Aj6WC{ zggbKblN0aWOIyppU?9T4zX}Bgqc(s`k7`hq_R9>NMPwlvmnIWa6|DP+)PpF%htZfWwtg>J_ zf#n~=6qYLtUM#m6bXmmW6`iVi2g^fX; z`6&Yr3mZca(|QIACMJe;OzRn>SpykLndBJSSZWzkShh06vCd_PWqH6L$@qt%gXIT9 z6mu&>ESn2MIP*k?Ugk#(;Viif^5`}!Wq(;pD;MFxBmae;=(F}&Hs~9G+axhF_V`ETZU&J8Ba*e^0bp^u|)|CvptXvG1 zZ1D{KtUnnhv34@_vCn3h!TytB2AdRv1lv!B*{tjg6IcTnve`oz7O;G0P++NLh-T?$ z=x2^%Xl41vpw3ptAjcxc;L9?Dp^YVvp`T?IgCZLmT*xoSIv5GUuv*k1Nvt%&zv)C{Mvb8WwWGP@!XDR%Do5hA9gzX}O9NQCy zHkQu+??C3Tdopye`7;!-r2l`wuE8*ajgg^^m4`uwC4qs9-HBlhn;FAgwzmuotj`#l zIE@$C6AhwST z8EkhM;@E;2Y*;lI^jWGIJXq`)O4#=?II+!TaA5z-FokU%Lpdu8LoAC9Ln!Mi21Qm` z1{c;)hDK%`hIAGY1_lmI1_l_-w3C5>iHm`OF@}MGrJjL-$$)`@aS;Op!$nYO%)r33 zkii{%Am+%!l1#jh(VDxj=`U`mO+E{2}1$%BL*K1J%$Oa zoD8|FA`H{mOc^5C?t;@!G}|JE2$qQqNvzWtma*JqaA0X>n8&h-!J5OBA&yD+|9X}_ zhE#A_FUVj6D(_i%7*v>|85T0lU`S^C$l%H<&7jM&fe8^iVMu4GX5eIFXV74YV-RJrVPIv^VsK>o#^4Pq zYvE<_HwIItZw&rS-xz$EzA>0V<=vQfGE89F#4wG;nt_XDH$xb!3&U(y4Tjk)1`Lg? zmJG95bQv1KcBL^`u=q0Yf!qYL5A2?522SP~3{EUJ7|K{A8C+QBG6b-OFa)qXVTfm) z$e;r9BYOyg3VS$18S8Wg6_)D^Wh{jZWvr15>TFgFQY>x^PApFt%E10P&7i{K#vsoc z%TUJB!{Er)!cfM}#Zbl?#lXd;z);4L4h}OLwn+?SEFBEaEJ_SqY?BzISmrX6u}U$N zvF0(Tuzq0hXNh89WjVqi$~Kij1!N9O4?`L2KL#$AOAP*C`#|BC#$dtxoxzR6jG>I> zHG>9A2SW{uEkgjy3!HRAtw5N7HBe+ATrU|RYA1-M-TYMWrgmJDg&b_%Gi z0>w;D|4)G0DojrQPcu3F-w$u2fZ8d@7}P#N!r=A^s11S(gW4tD48fpw2@Eqy{oewr zo0+8kZ)cMFzZ%{i0kuhxaS=l~s67J1ptcAIgZu_+_h8T$ib%p~=HK9ke`olH{ymohp1zt1EE3P%QUCT<1> zCMSluY?~Ptv+yv~g4%+hxCFNcbs1_wZ9*n)hAt=_3Z@q_^nmH-3_YND0EG`a%~Je- zDX0wzYR93|p!OuVP4|ys3eyD!e<=`gDJU+8rNM1j zP&@Jg13M_*z-i?oLjb5f$%00M+I66I9JpNvYQt6iU&aE$pz;e;9^%3c4F2Hq5mZJ( zG2@^A%NYMKG&BDBzmoCK|GDt85tOfyF{oTb#-MT$*&a~&i;Sxnve4}U@xkRXsBDH| za2fr7BIBR`(;5H#-^=)iL6q?iLk)774Jr>{80MmC zNNjL<5AqWTYcV*2%6t$8=bKmmz1W2R2Qw}EAI3WC|8iEBe-Byn|8HVi^}ih?59-r^ z^T|bq09Zc;lxETUFQD=U6tAGZ3aH!wvBB+EP@A=bp$^FCGfDkl4emGP zG4zAfz|t~04e~EY9^Bsq^+UZF`kB=JZ)DuVU<`5-sJ{hrFQ~i%g(t|ZAiF?qR&aa& zB!fSs-TD6`M=^sxC#d|t#^4ERGsDU;kR70QDJVQZ?Q>9@8pMW~3!`Cq2xJe)4shGh zh9MHvkAdj}we7)XuV9!0b_0xVV@LzV1FY=}rvn(WLG5o)xP$zOL3c9rf!pmr8D@jp z>!5T1id#@$6x4qJwfAA}!$J$Ng#4d{MO+9JUc`#S{EM6Zf0f1ie;+P+P*{TNBPWI_ zOxz3==;bLAU!A4z|6(LQB+Ou8*9GlE5~9r+YEjBjXrB|-_ryhm(g7$AFz7`L{w#|a z{6TpH)W-tlS8)I8HiIs>e+5eaYz*?C{u?N+U^Gi9!)#ERhouczAA_Zkp^}yT{{;|c zDgFO}IqLr-R-6BiSzP|F1E=2^3~ewwz-gSBp&u64Ah&_iDm)#4%7Ih{CQzS%1$~@l z0Yfay7KU1Q{ko1}3b?KdW&p)MFH0MP2a7iYBa_p=Z%k7E9znxhjO8DL5z~eLd93CP zg)Bu3{4DqXtpS%;jSMy5F_;zxe>e@Tqd{c{Xbc2KgX>prh6=FzzcJLn>sMKZDd2Gt zNZnZkDu+O0BcO5)R40PQX29bkx(q@f8de^_>ND0e|75`JcbWfMtWy8YnJoTWvYh%q znWf_23zm2Pmw@FGAZ>b3Sqy8>gWB@oc08#32esirWjmI;C{*C2V2m<dD+>o3 z8yg!dD;pa#D;q1A1LkqCv9dC;FtM;OgOxM0vNAETGI4-7%&g3;EbOc-tjtWzY)q`I zY^+RdEbJ^Stn4hztjx^JtSrn-%q%SI?CdNYtZb}oU`-%}%xtWj987G?Y^-c-Osp&{ zEG!@gu`q)=WDE=-V?j;}F+S zWn}?b#m>gb#>v6X#=*wM%Ek^>2yzPx8wbb)R!(+Kc984YSXen(IhjF0!o(pgF=^`g_Dhqor42pCMzo^DCk*PnVFf`SXntZ z*f>ada1JXAG^`;Z4hlGg99#^PjF^}~kb{*K6dp{hOsveTpi}~i7N|OAHfA4|2Bq*%G+R@a(#USwt zN=huOAP80m%QvhnoS>}8#s(7rXADqGfs-dI$mJlDSXn`d8+Cf4f%nJ4>8!I?6 znL+O70A*}eumB_%GC>Uj6%nkUNC6d7(EJVc1vnG3va*7vEI`Ev2+J@qgXcUzG#3K{ zTL%LRTMh#Q!z+dc1~!H)2GB$ZFGC%}0){mVYZ>-49Ah}o@QmR-!#_rTMnOhZMs-F5 z#$d*H#&pIy#(Ktn#z~9|88E(#?I^$JTARw=Ae*r>2eVXq>q zqOhWvqLQMTqMl-$5|a{}62Fp=l9ZC1lD3kEQi4*d>Zx~3-wyv~`S<_--~a!?MH&+W zFM|TZ0)~YQYZ=xt9AG%kaDm}D!v}`{i~@{8jB1P;jE0OMj0ubxP`@r z)UU^wPBPtK`pnD#_iGDt4|5;$Wah=p8<}@8pJKkqe2s;HMUBOP#f>F^C7GpwrHZA4 z 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 GERq0N(MvP{ diff --git a/orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Regular.ttf b/orx-jvm/orx-panel/src/main/resources/fonts/Roboto-Regular.ttf deleted file mode 100644 index 8c082c8de090865264d37594e396c4d6c0099fe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162876 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 button -// val cs = selector(class_="panel") withChild selector(type="button", class_="fancy") -// -// val root = Element(ElementType("body")) -// val panel = Element(ElementType("div")).apply { -// classes+= ElementClass("panel") -// } -// val button = Element(ElementType("button")) -// val button2 = Element(ElementType("button")).apply { -// classes+= ElementClass("fancy") -// } -// -// root.append(panel) -// panel.append(button) -// panel.append(button2) -// -// it("should work") { -// assert(cs.selectors.size == 1) -// assertTrue(cs.selectors[0] is TypeSelector) -// assertNotNull(cs.previous) -// -// assertFalse(Matcher().matches(cs, button)) -// assertFalse(Matcher().matches(cs, panel)) -// assertTrue(Matcher().matches(cs, button2)) -// } -// -// it("should have precedences") { -// println(cs.precedence()) -// -// -// } -// -// } -// -//}) -// diff --git a/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/StyleSheetTest.kt b/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/StyleSheetTest.kt deleted file mode 100644 index f01aded4..00000000 --- a/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/StyleSheetTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -//package org.openrndr.panel.test -// -//import net.lustlab.panel.style.* -//import org.jetbrains.spek.api.Spek -//import org.jetbrains.spek.api.dsl.describe -// -//class StyleSheetTest : Spek({ -// -// describe("stylesheet") { -// val styleSheet = StyleSheet() -// styleSheet.width = 5.px -// styleSheet.height = 5.px -// styleSheet.left = 10.px -// styleSheet.top = 10.percent -// styleSheet.position = Position.FIXED -// var a = styleSheet.precedence -// } -//}) diff --git a/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/TestPlaceholder.kt b/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/TestPlaceholder.kt deleted file mode 100644 index 6bfb33ca..00000000 --- a/orx-jvm/orx-panel/src/test/java/org/openrndr/panel/test/TestPlaceholder.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.openrndr.panel.test - -import kotlin.test.Test - -class TestPlaceholder { - @Test - fun testPlaceholder() { - assert(true) - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/README.md b/orx-jvm/orx-poisson-fill/README.md deleted file mode 100644 index a30a530f..00000000 --- a/orx-jvm/orx-poisson-fill/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# orx-poisson-fill - -Post processing effect that fills transparent parts of the image interpolating the edge pixel colors. GPU-based. - - -## Demos -### DemoPoissonFill01 - - - -![DemoPoissonFill01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-poisson-fill/images/DemoPoissonFill01Kt.png) - -[source code](src/demo/kotlin/DemoPoissonFill01.kt) - -### DemoPoissonFill02 - - - -![DemoPoissonFill02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-poisson-fill/images/DemoPoissonFill02Kt.png) - -[source code](src/demo/kotlin/DemoPoissonFill02.kt) diff --git a/orx-jvm/orx-poisson-fill/build.gradle.kts b/orx-jvm/orx-poisson-fill/build.gradle.kts deleted file mode 100644 index 814513ce..00000000 --- a/orx-jvm/orx-poisson-fill/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(project(":orx-fx")) - implementation(project(":orx-noise")) - implementation(openrndr.filter) - demoRuntimeOnly(sharedLibs.slf4j.simple) -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt b/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt deleted file mode 100644 index 589f9dea..00000000 --- a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt +++ /dev/null @@ -1,84 +0,0 @@ -import org.openrndr.MouseButton -import org.openrndr.MouseTracker -import org.openrndr.application -import org.openrndr.color.ColorHSVa -import org.openrndr.color.ColorRGBa -import org.openrndr.color.rgb -import org.openrndr.draw.ColorType -import org.openrndr.draw.colorBuffer -import org.openrndr.draw.isolatedWithTarget -import org.openrndr.draw.renderTarget -import org.openrndr.extra.noise.uniform -import org.openrndr.math.Polar -import org.openrndr.math.clamp -import org.openrndr.poissonfill.PoissonFill -import org.openrndr.shape.Rectangle -import kotlin.math.sin - - -fun main() { - data class Thing(val color: ColorRGBa, var pos: Polar, val speed: Polar) - application { - program { - val dry = renderTarget(width, height) { - colorBuffer(type = ColorType.FLOAT32) - } - val wet = colorBuffer(width, height, type = ColorType.FLOAT32) - - val fx = PoissonFill() - - var borderOpacity = 0.0 - - // Create a list of things with - // color, polar position and polar speed - val things = List(10) { - Thing( - ColorHSVa(it * 182.0, - Double.uniform(0.3, 0.6), - Double.uniform(0.1, 0.9)).toRGBa(), - Polar(Double.uniform(0.0, 360.0), - 100.0 + it * 10.0), - Polar(Double.uniform(-1.0, 1.0), 0.0)) - } - val mouseTracker = MouseTracker(mouse) - - extend { - drawer.isolatedWithTarget(dry) { - stroke = null - clear(ColorRGBa.TRANSPARENT) - - // draw color circles - things.forEach { thing -> - fill = thing.color.shade(0.9 + - 0.1 * sin(thing.pos.theta * 0.3)) - circle(thing.pos.cartesian + bounds.center, 5.0) - // A. Use after fix in Polar.kt - //thing.pos += thing.speed - // B. temporary solution - thing.pos = Polar(thing.pos.theta + - thing.speed.theta, thing.pos.radius) - } - - // draw dark gray window border. - // hold mouse button to fade in. - borderOpacity += if (MouseButton.LEFT in mouseTracker.pressedButtons) 0.01 else -0.01 - borderOpacity = borderOpacity.clamp(0.0, 1.0) - stroke = rgb(0.2).opacify(borderOpacity) - fill = null - strokeWeight = 3.0 - rectangle(bounds) - } - - fx.apply(dry.colorBuffer(0), wet) - drawer.image(wet) - - // draw white rectangle - drawer.stroke = ColorRGBa.WHITE.opacify(0.9) - drawer.fill = null - drawer.strokeWeight = 6.0 - drawer.rectangle(Rectangle.fromCenter(drawer.bounds.center, - 300.0, 300.0)) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill02.kt b/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill02.kt deleted file mode 100644 index 772e02e9..00000000 --- a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill02.kt +++ /dev/null @@ -1,27 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.fx.Post -import org.openrndr.math.Polar -import org.openrndr.poissonfill.PoissonFill - -fun main() = application { - program { - extend(Post()) { - val pf = PoissonFill() - post { input, output -> - pf.apply(input, output) - } - } - - extend { - drawer.stroke = null - drawer.clear(ColorRGBa.TRANSPARENT) - - drawer.fill = ColorRGBa.RED - drawer.circle(Polar(60.0 * seconds, 200.0).cartesian + drawer.bounds.center, 20.0) - - drawer.fill = ColorRGBa.BLUE - drawer.circle(Polar(-60.0 * seconds, 200.0).cartesian + drawer.bounds.center, 20.0) - } - } -} diff --git a/orx-jvm/orx-poisson-fill/src/main/kotlin/ConvolutionPyramid.kt b/orx-jvm/orx-poisson-fill/src/main/kotlin/ConvolutionPyramid.kt deleted file mode 100644 index e732ec0b..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/kotlin/ConvolutionPyramid.kt +++ /dev/null @@ -1,140 +0,0 @@ -package org.openrndr.poissonfill - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.math.IntVector2 -import org.openrndr.resourceUrl -import kotlin.math.ceil -import kotlin.math.log2 -import kotlin.math.min - -internal class Downscale(filterUrl: String = "/shaders/gl3/poisson/downscale.frag") - : Filter(filterShaderFromUrl(resourceUrl(filterUrl))) { - var h1: FloatArray by parameters - init { - h1 = floatArrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f) - } -} - -internal class Upscale(filterUrl: String = "/shaders/gl3/poisson/upscale.frag") - : Filter(filterShaderFromUrl(resourceUrl(filterUrl))) { - var h1: FloatArray by parameters - var h2: Float by parameters - var g: FloatArray by parameters - - init { - h1 = floatArrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f) - h2 = 0.0f - g = floatArrayOf(0.0f, 0.0f, 0.0f) - } -} - -internal class Convolution(filterUrl: String = "/shaders/gl3/poisson/filter.frag") - : Filter(filterShaderFromUrl(resourceUrl(filterUrl))) { - var g: FloatArray by parameters - - init { - g = floatArrayOf(0.0f, 0.0f, 0.0f) - } -} - -private val passthrough by lazy { Passthrough() } -internal class ConvolutionPyramid(width: Int, height: Int, - private val padding: Int = 0, cutOff: Int = 10000, - private val downscale: Downscale = Downscale(), - private val upscale: Upscale = Upscale(), - private val filter: Convolution = Convolution(), - val type: ColorType = ColorType.FLOAT32) { - var h1 = floatArrayOf(0.0f, 0.0f, 0.0f, 0.0f, 0.0f) - var h2 = 0.0f - var g = floatArrayOf(0.0f, 0.0f, 0.0f) - - private val size = 5 - private val resolution = IntVector2(width + 2 * padding, height + 2 * padding) - private val minResolution = min(resolution.x, resolution.y) - private val depth = min(cutOff, ceil(log2(minResolution.toDouble())).toInt()) - - private val levelsIn = mutableListOf() - private val levelsOut = mutableListOf() - - private val result = colorBuffer(width, height, type = type) - - init { - var levelWidth = resolution.x + 2 * size - var levelHeight = resolution.y + 2 * size - - for (i in 0 until depth) { - levelsIn.add(renderTarget(levelWidth, levelHeight) { - colorBuffer(type = type) - }) - - levelsOut.add(renderTarget(levelWidth, levelHeight) { - colorBuffer(type = type) - }) - - levelWidth /= 2 - levelHeight /= 2 - levelWidth += 2 * size - levelHeight += 2 * size - } - } - - fun process(input: ColorBuffer): ColorBuffer { - for (l in levelsIn) { - l.clearColor(0, ColorRGBa.TRANSPARENT) - } - - for (l in levelsOut) { - l.clearColor(0, ColorRGBa.TRANSPARENT) - } - - downscale.h1 = h1 - - upscale.g = g - upscale.h1 = h1 - upscale.h2 = h2 - - filter.g = g - - passthrough.padding = (levelsIn[0].width - input.width) / 2 - passthrough.apply(input, levelsIn[0].colorBuffer(0)) - passthrough.padding = 0 - - for (i in 1 until levelsIn.size) { - downscale.padding = 0 - downscale.apply(levelsIn[i - 1].colorBuffer(0), - levelsIn[i].colorBuffer(0) - ) - } - - filter.apply(levelsIn.last().colorBuffer(0), levelsOut.last().colorBuffer(0)) - - for (i in levelsOut.size - 2 downTo 0) { - upscale.padding = 0 - upscale.apply(arrayOf(levelsIn[i].colorBuffer(0), levelsOut[i + 1].colorBuffer(0)), arrayOf(levelsOut[i].colorBuffer(0))) - } - - passthrough.padding = -size - padding - passthrough.apply(levelsOut[0].colorBuffer(0), result) - passthrough.padding = 0 - return result - } - - fun destroy() { - result.destroy() - (levelsIn+levelsOut).forEach { - it.colorAttachments.forEach { - when(it) { - is ColorBufferAttachment -> it.colorBuffer.destroy() - is CubemapAttachment -> it.cubemap.destroy() - is ArrayTextureAttachment -> it.arrayTexture.destroy() - is ArrayCubemapAttachment -> it.arrayCubemap.destroy() - else -> {} - } - } - it.detachColorAttachments() - it.destroy() - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/kotlin/LaplacianIntegrator.kt b/orx-jvm/orx-poisson-fill/src/main/kotlin/LaplacianIntegrator.kt deleted file mode 100644 index d8a02af0..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/kotlin/LaplacianIntegrator.kt +++ /dev/null @@ -1,46 +0,0 @@ -package org.openrndr.poissonfill - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.resourceUrl - -internal class PassthroughNoAlpha : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/passthrough-noalpha.frag"))) - -/** - * Laplacian filter - */ -class Laplacian : Filter1to1(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/laplacian.frag"))) - -class LaplacianIntegrator(width: Int, height: Int, downscaling: Int = 1, type: ColorType = ColorType.FLOAT32) { - private val pyramid = ConvolutionPyramid(2 + width / downscaling, 2 + height / downscaling, type = type) - private val h1 = floatArrayOf(0.15f, 0.5f, 0.7f, 0.5f, 0.15f) - private val h2 = 1.0f - private val g = floatArrayOf(0.175f, 0.547f, 0.175f) - private val preproc = colorBuffer(width + 2, height + 2, type = type) - private val combined = colorBuffer(width, height) - private val passthrough = PassthroughNoAlpha() - - init { - pyramid.h1 = h1 - pyramid.g = g - pyramid.h2 = h2 - } - - fun process(input: ColorBuffer): ColorBuffer { - preproc.fill(ColorRGBa.TRANSPARENT) - - pyramid.h1 = h1 - pyramid.g = g - pyramid.h2 = h2 - - passthrough.padding = 1 - passthrough.apply(input, preproc) - passthrough.padding = 0 - - val result = pyramid.process(preproc) - passthrough.padding = -1 - passthrough.apply(result, combined) - passthrough.padding = 0 - return combined - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonBlender.kt b/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonBlender.kt deleted file mode 100644 index b814deb0..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonBlender.kt +++ /dev/null @@ -1,119 +0,0 @@ -package org.openrndr.poissonfill - -import org.openrndr.draw.* -import org.openrndr.extra.fx.blend.Passthrough -import org.openrndr.extra.fx.blend.Subtract -import org.openrndr.filter.color.delinearize -import org.openrndr.filter.color.linearize -import org.openrndr.resourceUrl -import org.openrndr.shape.Rectangle - -internal class BlendBoundary : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/blend-boundary.frag"))) -class AlphaToBitmap : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/alpha-to-bitmap.frag"))) - -internal class BlendCombine : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/blend-combine.frag"))) { - var softMaskGain: Double by parameters - init { - softMaskGain = 1.0 - } -} - -internal class Clamp : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/clamp.frag"))) { - var minValue: Double by parameters - var maxValue: Double by parameters -} - -private val passthrough by lazy { Passthrough() } -private val subtract by lazy { Subtract() } - -class PoissonBlender(val width: Int, val height: Int, type: ColorType = ColorType.FLOAT32) { - private val pyramid = ConvolutionPyramid(width, height, 0, type = type) - private val preprocess = colorBuffer(width, height, type = type) - private val combined = colorBuffer(width, height, type = type) - - private val fillBoundary = BlendBoundary() - private val fillCombine = BlendCombine() - - private val difference = colorBuffer(width, height, type = type) - - private val h1 = floatArrayOf(0.1507146f, 0.6835785f, 1.0334191f, 0.6836f, 0.1507f) - private val h2 = 0.0269546f - private val g = floatArrayOf(0.0311849f, 0.7752854f, 0.0311849f) - - - init { - pyramid.h1 = h1 - pyramid.g = g - pyramid.h2 = h2 - } - - fun process(target: ColorBuffer, source: ColorBuffer, mask: ColorBuffer, - softMask: ColorBuffer = mask, softMaskGain: Double = 1.0): ColorBuffer { - subtract.apply(arrayOf(target, source), difference) - fillBoundary.apply(arrayOf(difference, mask), preprocess) - val result = pyramid.process(preprocess) - fillCombine.softMaskGain = softMaskGain - fillCombine.apply(arrayOf(result, target, source, mask, softMask), arrayOf(combined)) - return combined - } - - fun destroy() { - pyramid.destroy() - preprocess.destroy() - combined.destroy() - difference.destroy() - } - -} - -class PoissonBlend: Filter2to1(null) { - private var blender: PoissonBlender? = null - - val alphaToBitmap = AlphaToBitmap() - var mask: ColorBuffer? = null - - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - if (target.isNotEmpty()) { - - mask?.let { - if (it.width != target[0].width || it.height != target[0].height) { - it.destroy() - mask = null - } - } - - if (mask == null) { - mask = colorBuffer(target[0].width, target[0].height) - } - - blender?.let { - if (it.width != target[0].width || it.height != target[0].height) { - it.destroy() - blender = null - } - } - - if (blender == null) { - blender = PoissonBlender(target[0].width, target[0].height) - } - - mask?.let { - alphaToBitmap.apply(source[1], it) - } - - - blender?.let { - - linearize.apply(source[0], source[0]) - linearize.apply(source[1], source[1]) - - val result = it.process(source[0], source[1], mask ?: error("no mask")) - result.copyTo(target[0]) - - delinearize.apply(target[0], target[0]) - } - - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonFiller.kt b/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonFiller.kt deleted file mode 100644 index 89bcf1b8..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/kotlin/PoissonFiller.kt +++ /dev/null @@ -1,65 +0,0 @@ -package org.openrndr.poissonfill - -import org.openrndr.draw.* -import org.openrndr.resourceUrl -import org.openrndr.shape.Rectangle - -internal class FillBoundary : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/fill-boundary.frag"))) -internal class FillCombine : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/poisson/fill-combine.frag"))) - -class PoissonFiller(val width: Int, val height: Int, type: ColorType = ColorType.FLOAT32) { - private val pyramid = ConvolutionPyramid(width, height, 0, type = type) - private val preproc = colorBuffer(width, height, type = type) - private val combined = colorBuffer(width, height, type = type) - private val fillBoundary = FillBoundary() - private val fillCombine = FillCombine() - - private val h1 = floatArrayOf(0.1507146f, 0.6835785f, 1.0334191f, 0.6836f, 0.1507f) - private val h2 = 0.0269546f - private val g = floatArrayOf(0.0311849f, 0.7752854f, 0.0311849f) - - init { - pyramid.h1 = h1 - pyramid.g = g - pyramid.h2 = h2 - } - - fun process(input: ColorBuffer): ColorBuffer { - fillBoundary.apply(input, preproc) - val result = pyramid.process(preproc) - fillCombine.apply(arrayOf(result, input), arrayOf(combined)) - return combined - } - - fun destroy() { - preproc.destroy() - combined.destroy() - } -} - -/** - * Poison filling as a filter - */ -class PoissonFill : Filter1to1(null) { - private var filler: PoissonFiller? = null - override fun apply(source: Array, target: Array, clip: Rectangle?) { - require(clip == null) - if (target.isNotEmpty()) { - filler?.let { - if (it.width != target[0].effectiveWidth || it.height != target[0].effectiveHeight) { - it.destroy() - filler = null - } - } - - if (filler == null) { - filler = PoissonFiller(target[0].effectiveWidth, target[0].effectiveHeight) - } - - filler?.let { - val result = it.process(source[0]) - result.copyTo(target[0]) - } - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/alpha-to-bitmap.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/alpha-to-bitmap.frag deleted file mode 100644 index 07d85216..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/alpha-to-bitmap.frag +++ /dev/null @@ -1,11 +0,0 @@ -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; -out vec4 o_output; - -void main(){ - vec4 c = texture(tex0, v_texCoord0); - o_output.rgb = vec3(step(0.01, c.a)); - o_output.a = 1.0; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-boundary.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-boundary.frag deleted file mode 100644 index d6829ee5..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-boundary.frag +++ /dev/null @@ -1,37 +0,0 @@ -// adapted from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-boundary.frag - -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; // input image -uniform sampler2D tex1; // mask - -out vec4 o_output; - -/** Output color only on the edges of the black regions in the input image, along with a 1.0 alpha. */ -void main(){ - - o_output = vec4(0.0); - - vec4 fullColor = textureLod(tex0, v_texCoord0, 0.0); - float maskColor = textureLod(tex1, v_texCoord0, 0.0).r; - - float isInMask = maskColor == 1.0 ? 1.0 : 0.0; - - float maskLaplacian = -4.0 * isInMask; - float mask110 = textureLodOffset(tex1, v_texCoord0, 0.0, ivec2( 1, 0)).r; - float mask101 = textureLodOffset(tex1, v_texCoord0, 0.0, ivec2( 0, 1)).r; - float mask010 = textureLodOffset(tex1, v_texCoord0, 0.0, ivec2(-1, 0)).r; - float mask001 = textureLodOffset(tex1, v_texCoord0, 0.0, ivec2( 0,-1)).r; - - maskLaplacian += mask110 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask101 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask010 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask001 == 1.0 ? 1.0 : 0.0; - - if(maskLaplacian > 0.0){ - o_output.rgb = fullColor.rgb; - o_output.a = 1.0; - } - -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-combine.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-combine.frag deleted file mode 100644 index a8b7d5b6..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/blend-combine.frag +++ /dev/null @@ -1,46 +0,0 @@ -#version 330 - -in vec2 v_texCoord0; - -uniform sampler2D tex0; // membrane -uniform sampler2D tex1; // target image -uniform sampler2D tex2; // source image -uniform sampler2D tex3; // mask -uniform sampler2D tex4; // soft mask - -uniform float softMaskGain; -out vec4 o_output; - -void main(){ - - vec4 targetColor = textureLod(tex1, v_texCoord0, 0.0).rgba; - float maskColor = textureLod(tex3, v_texCoord0, 0.0).r; - float mask = maskColor == 1.0 ? 1.0 : 0.0; - float softMask = textureLod(tex4, v_texCoord0, 0.0).r; - - float maskLaplacian = -4.0 * mask; - float mask110 = textureLodOffset(tex3, v_texCoord0, 0.0, ivec2( 1, 0)).r; - float mask101 = textureLodOffset(tex3, v_texCoord0, 0.0, ivec2( 0, 1)).r; - float mask010 = textureLodOffset(tex3, v_texCoord0, 0.0, ivec2(-1, 0)).r; - float mask001 = textureLodOffset(tex3, v_texCoord0, 0.0, ivec2( 0,-1)).r; - - maskLaplacian += mask110 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask101 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask010 == 1.0 ? 1.0 : 0.0; - maskLaplacian += mask001 == 1.0 ? 1.0 : 0.0; - - if (maskLaplacian > 0) { - mask = 1; - } - { - vec4 sourceColor = textureLod(tex2, v_texCoord0, 0.0); - vec4 membraneColor = textureLod(tex0, v_texCoord0, 0.0); - membraneColor.rgb /= membraneColor.a; - - vec3 blend = membraneColor.rgb + sourceColor.rgb; - - o_output.rgb = mix(targetColor.rgb, blend, mask*max(0.0,min(1.0, softMask * softMaskGain))); - o_output.a = 1.0; - - } -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/clamp.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/clamp.frag deleted file mode 100644 index f70628a3..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/clamp.frag +++ /dev/null @@ -1,25 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-boundary.frag - -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; -uniform int levels; -out vec4 o_output; -uniform float scale; -uniform float phase; - -uniform float minValue; -uniform float maxValue; - -void main(){ - - vec4 c = texture(tex0, v_texCoord0); - - c.rgb = clamp(c.rgb, vec3(minValue), vec3(maxValue)); - - o_output = c; - - - -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag deleted file mode 100644 index 90260d11..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag +++ /dev/null @@ -1,48 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/downscale.frag -in vec2 v_texCoord0; - -uniform vec2 targetSize; -uniform sampler2D tex0; -out vec4 o_output; -uniform vec2 padding; -uniform float h1[5]; ///< h1 filter parameters. - -/** Denotes if a pixel falls outside an image. - \param pos the pixel position - \param size the image size - \return true if the pixel is outside of the image - */ -bool isOutside(ivec2 pos, ivec2 size){ - - return (pos.x < 0 || pos.y < 0 || pos.x > size.x || pos.y > size.y); -} - -/** Apply the h1 filter and downscale the input data by a factor of 2. */ -void main(){ - - vec4 accum = vec4(0.0); - - ivec2 size = textureSize(tex0, 0).xy; - - ivec2 ts = size; - - //ivec2 ts = ivec2(targetSize - 2 * padding); - - // Our current size is half this one, so we have to scale by 2. - - ivec2 coords = ivec2(floor( targetSize * v_texCoord0)) * 2 - ivec2(10); - - - for(int dy = -2; dy <=2; dy++){ - for(int dx = -2; dx <=2; dx++){ - ivec2 newPix = coords+ivec2(dx,dy); - if(isOutside(newPix, size)){ - continue; - //accum = vec4(1.0, 0.0, 0.0, 1.0); - } - accum += h1[dx+2] * h1[dy+2] * texelFetch(tex0, newPix,0 - ); - } - } - o_output = accum; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag deleted file mode 100644 index 684db8b6..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag +++ /dev/null @@ -1,61 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-boundary.frag - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -//layout(binding = 0) uniform sampler2D screenTexture; ///< Image to process. - -//layout(location = 0) out vec4 fragColor; ///< Color. - -out vec4 o_output; - -/** Denotes if a pixel falls outside an image. - \param pos the pixel position - \param size the image size - \return true if the pixel is outside of the image - */ - -/** Output color only on the edges of the black regions in the input image, along with a 1.0 alpha. */ -void main(){ - - o_output = vec4(0.0); - - vec4 fullColor = textureLod(tex0, v_texCoord0, 0.0); - - float isInMask = fullColor.a == 1.0 ? 0.0 : 1.0; //float(all(equal(fullColor.rgb, vec3(0.0)))); - float maskLaplacian = -4.0*(1.0-fullColor.a); - -// float maskLaplacian = -4.0 * isInMask; - vec4 cola110 = textureLodOffset(tex0, v_texCoord0, 0.0, ivec2( 1, 0)); - vec4 cola101 = textureLodOffset(tex0, v_texCoord0, 0.0, ivec2( 0, 1)); - vec4 cola010 = textureLodOffset(tex0, v_texCoord0, 0.0, ivec2(-1, 0)); - vec4 cola001 = textureLodOffset(tex0, v_texCoord0, 0.0, ivec2( 0,-1)); - - vec3 col110 = cola110.rgb; // cola110.a; - vec3 col101 = cola101.rgb; // cola101.a; - vec3 col010 = cola010.rgb; // cola010.a; - vec3 col001 = cola001.rgb; // cola001.a; -// maskLaplacian += float(all(equal(col110, vec3(0.0)))); -// maskLaplacian += float(all(equal(col101, vec3(0.0)))); -// maskLaplacian += float(all(equal(col010, vec3(0.0)))); -// maskLaplacian += float(all(equal(col001, vec3(0.0)))); - -// maskLaplacian += cola110.a == 1.0 ? 0.0 : 1.0; -// maskLaplacian += cola101.a == 1.0 ? 0.0 : 1.0; -// maskLaplacian += cola010.a == 1.0 ? 0.0 : 1.0; -// maskLaplacian += cola001.a == 1.0 ? 0.0 : 1.0; - - maskLaplacian += (1.0-cola110.a); - maskLaplacian += (1.0-cola101.a); - maskLaplacian += (1.0-cola010.a); - maskLaplacian += (1.0-cola001.a); - - if(maskLaplacian > 0.0){ - o_output.rgb = fullColor.rgb;///fullColor.a;; - o_output.a = fullColor.a; - - } - - - -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag deleted file mode 100644 index 106b5683..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag +++ /dev/null @@ -1,21 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-combine.frag - -in vec2 v_texCoord0; - -uniform sampler2D tex0; // result of pyramid convolution -uniform sampler2D tex1; // input image - -out vec4 o_output; - -/** Composite the initial image and the filled image in the regions where the initial image is black. */ -void main(){ - - vec4 inputColor = textureLod(tex1, v_texCoord0, 0.0); - float mask = 1.0 - inputColor.a; - - vec4 fillColor = textureLod(tex0, v_texCoord0, 0.0); - fillColor.rgb /= fillColor.a; - - o_output.rgb = fillColor.rgb * (mask) + inputColor.rgb; //mix(inputColor.rgb, fillColor.rgb, mask); - o_output.a = 1.0; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag deleted file mode 100644 index b6fea945..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag +++ /dev/null @@ -1,39 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/filter.frag - -//layout(binding = 0) uniform sampler2D screenTexture; ///< Level to filter. - -uniform sampler2D tex0; -in vec2 v_texCoord0; -out vec4 o_output; - -uniform float g[3]; ///< g filter parameters. - -/** Denotes if a pixel falls outside an image. - \param pos the pixel position - \param size the image size - \return true if the pixel is outside of the image - */ -bool isOutside(ivec2 pos, ivec2 size){ - return (pos.x < 0 || pos.y < 0 || pos.x >= size.x || pos.y >= size.y); -} - -/** Apply the g filter to the input data. */ -void main(){ - vec4 accum = vec4(0.0); - ivec2 size = textureSize(tex0, 0).xy; - - ivec2 coords = ivec2(v_texCoord0 * vec2(size)); - - for(int dy = -1; dy <=1; dy++){ - for(int dx = -1; dx <=1; dx++){ - - ivec2 newPix = coords + ivec2(dx,dy); - - if(isOutside(newPix, size)){ - continue; - } - accum += g[dx+1] * g[dy+1] * texelFetch(tex0, newPix,0 ); - } - } - o_output = accum; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/laplacian.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/laplacian.frag deleted file mode 100644 index 9df11eca..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/laplacian.frag +++ /dev/null @@ -1,52 +0,0 @@ -// adapted from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/laplacian.frag -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; -out vec4 o_output; - -/** Denotes if UV coordinates falls outside an image. - \param pos the UV coordinates - \return true if the UV are outside of the image - */ -bool isOutside(vec2 pos){ - return (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0); -} - -/** Compute the Laplacian field of an input RGB image, adding a 1px black border around it before computing the gradients and divergence. */ -void main(){ - vec3 div = vec3(0.0); - ivec2 size = textureSize(tex0, 0).xy; - - vec3 pixelShift = vec3(0.0); - pixelShift.xy = 1.0/vec2(size); - - vec2 uvs = v_texCoord0; - if(!isOutside(uvs)){ - vec3 col = textureLod(tex0, uvs, 0.0).rgb; - div = 4.0 * col; - } - - vec2 uvs110 = uvs + pixelShift.xz; - if(!isOutside(uvs110)){ - vec3 col110 = textureLod(tex0, uvs110, 0.0).rgb; - div -= col110; - } - vec2 uvs101 = uvs + pixelShift.zy; - if(!isOutside(uvs101)){ - vec3 col101 = textureLod(tex0, uvs101, 0.0).rgb; - div -= col101; - } - vec2 uvs010 = uvs - pixelShift.xz; - if(!isOutside(uvs010)){ - vec3 col010 = textureLod(tex0, uvs010, 0.0).rgb; - div -= col010; - } - vec2 uvs001 = uvs - pixelShift.zy; - if(!isOutside(uvs001)){ - vec3 col001 = textureLod(tex0, uvs001, 0.0).rgb; - div -= col001; - } - o_output.rgb = div; - o_output.a = 1.0f; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/passthrough-noalpha.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/passthrough-noalpha.frag deleted file mode 100644 index 16a5cac6..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/passthrough-noalpha.frag +++ /dev/null @@ -1,20 +0,0 @@ -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_output; - -/** Denotes if a pixel falls outside an image. - \param pos the pixel position - \param size the image size - \return true if the pixel is outside of the image - */ - -/** Output an image translated by a fixed number of pixels on each axis. useful for padding when rendering in a larger framebuffer. */ -void main(){ - vec4 c = texture(tex0, v_texCoord0); - - o_output.rgb = c.rgb; - o_output.a = 1.0; -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/remove-alpha.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/remove-alpha.frag deleted file mode 100644 index 99378517..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/remove-alpha.frag +++ /dev/null @@ -1,18 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-boundary.frag - -#version 330 - -in vec2 v_texCoord0; -uniform sampler2D tex0; - -out vec4 o_output; - -void main(){ - o_output = vec4(0.0); - vec4 fullColor = textureLod(tex0, v_texCoord0, 0.0); - - if (fullColor.a == 1.0) { - o_output = fullColor; - } - -} \ No newline at end of file diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag deleted file mode 100644 index 8dfaf990..00000000 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag +++ /dev/null @@ -1,58 +0,0 @@ -// from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/upscale.frag - -in vec2 v_texCoord0; - -uniform sampler2D tex0; ///< Current h1 filtered level. -uniform sampler2D tex1; ///< Previous h1+g filtered level. - -out vec4 o_output; ///< Color. - -uniform float h1[5]; ///< h1 filter parameters. -uniform float h2; ///< h2 scaling parameter. -uniform float g[3]; ///< g filter parameters. - -/** Denotes if a pixel falls outside an image. - \param pos the pixel position - \param size the image size - \return true if the pixel is outside of the image - */ -bool isOutside(ivec2 pos, ivec2 size){ - return (pos.x < 0 || pos.y < 0 || pos.x >= size.x || pos.y >= size.y); -} - -/** Combine previous level filtered with h2 (applying a 0-filled upscaling) and the current level filtered with g. - */ -void main(){ - vec4 accum = vec4(0.0); - ivec2 size = textureSize(tex0, 0).xy; - ivec2 coords = ivec2(v_texCoord0 * vec2(size)); - - for(int dy = -1; dy <=1; dy++){ - for(int dx = -1; dx <=1; dx++){ - ivec2 newPix = coords+ivec2(dx,dy); - if(isOutside(newPix, size)){ - continue; - } - accum += g[dx+1] * g[dy+1] * texelFetch(tex0, newPix,0); - } - } - - ivec2 sizeSmall = textureSize(tex1, 0).xy; - - for(int dy = -2; dy <=2; dy++){ - for(int dx = -2; dx <=2; dx++){ - ivec2 newPix = coords+ivec2(dx,dy); - // The filter is applied to a texture upscaled by inserting zeros. - if(newPix.x%2 != 0 || newPix.y%2 != 0){ - continue; - } - newPix /= 2; - newPix += 5; - if(isOutside(newPix, sizeSmall)){ - accum = vec4(0.0, 0.0, 1.0, 1.0); - } - accum += h2 * h1[dx+2] * h1[dy+2] * texelFetch(tex1, newPix, 0); - } - } - o_output = accum; -} \ No newline at end of file diff --git a/orx-jvm/orx-processing/README.md b/orx-jvm/orx-processing/README.md deleted file mode 100644 index c9bf8ac7..00000000 --- a/orx-jvm/orx-processing/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# orx-processing - -orx-processing is a module designed to facilitate seamless type conversions -between Processing's types and OPENRNDR's types. It provides utilities and -methods that allow developers to integrate the two graphics frameworks -effectively by bridging the gap between their respective data structures. - -For example, orx-processing enables you to: - - Convert Processing's PVector to OPENRNDR's Vector2 or Vector3. - - Transform OPENRNDR Shape and ShapeContour into their Processing equivalents. - -This module is particularly useful in projects that require the features or -APIs of both Processing and OPENRNDR, simplifying interoperability and reducing boilerplate code for type translation. - -## Demos -### DemoPShape01 - - - -![DemoPShape01Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-processing/images/DemoPShape01Kt.png) - -[source code](src/demo/kotlin/DemoPShape01.kt) - -### DemoPShape02 - - - -![DemoPShape02Kt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-processing/images/DemoPShape02Kt.png) - -[source code](src/demo/kotlin/DemoPShape02.kt) diff --git a/orx-jvm/orx-processing/build.gradle.kts b/orx-jvm/orx-processing/build.gradle.kts deleted file mode 100644 index 102296ca..00000000 --- a/orx-jvm/orx-processing/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - api(libs.processing.core) { - exclude(group = "org.jogamp.gluegen") - exclude(group = "org.jogamp.jogl") - } - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(sharedLibs.kotlin.reflect) - demoRuntimeOnly(sharedLibs.slf4j.simple) - demoImplementation(project(":orx-shapes")) -} \ No newline at end of file diff --git a/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape01.kt b/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape01.kt deleted file mode 100644 index 51ba5ffa..00000000 --- a/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape01.kt +++ /dev/null @@ -1,14 +0,0 @@ -import org.openrndr.application -import org.openrndr.extra.processing.PShape -import org.openrndr.extra.processing.toShape - -fun main() = application { - program { - val c = drawer.bounds.offsetEdges(-100.0).shape - val ps = PShape(c) - val rc = ps.toShape() - extend { - drawer.shape(rc) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape02.kt b/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape02.kt deleted file mode 100644 index cc95a3dc..00000000 --- a/orx-jvm/orx-processing/src/demo/kotlin/DemoPShape02.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.processing.PShape -import org.openrndr.extra.processing.toShape -import org.openrndr.extra.shapes.primitives.regularStarRounded - -fun main() = application { - program { - val c = regularStarRounded( - points = 5, - innerRadius = 100.0, - outerRadius = 200.0, - innerFactor = 0.25, - outerFactor = 0.75, - center = drawer.bounds.center - ) - val ps = PShape(c) - val rc = ps.toShape() - extend { - drawer.fill = ColorRGBa.PINK.opacify(0.5) - drawer.shape(rc) - drawer.translate(15.0, 15.0) - drawer.contour(c) - } - } -} \ No newline at end of file diff --git a/orx-jvm/orx-processing/src/main/kotlin/PShapeExtensions.kt b/orx-jvm/orx-processing/src/main/kotlin/PShapeExtensions.kt deleted file mode 100644 index 4890c542..00000000 --- a/orx-jvm/orx-processing/src/main/kotlin/PShapeExtensions.kt +++ /dev/null @@ -1,276 +0,0 @@ -package org.openrndr.extra.processing - -import org.openrndr.color.ColorRGBa -import org.openrndr.math.Vector2 -import org.openrndr.shape.Segment2D -import org.openrndr.shape.SegmentType -import org.openrndr.shape.Shape -import org.openrndr.shape.ShapeContour -import processing.core.PShape - -/** - * Appends a vertex to the current shape using a 2D vector. - * - * @param v the [Vector2] instance containing the x and y coordinates of the vertex to be added. - * The coordinates are converted to Float for use in the shape. - */ -fun PShape.vertex(v: Vector2) { - vertex(v.x.toFloat(), v.y.toFloat()) -} - -/** - * Adds a quadratic Bezier vertex to the shape. The method specifies control and anchor points - * for the curve using [Vector2] instances. - * - * @param v2 The control point of the quadratic Bezier curve, used to define its curvature. - * @param v3 The anchor point of the quadratic Bezier curve, which is the endpoint of the curve. - */ -fun PShape.quadraticVertex(v2: Vector2, v3: Vector2) { - quadraticVertex( - v2.x.toFloat(), v2.y.toFloat(), - v3.x.toFloat(), v3.y.toFloat() - ) -} - -fun PShape.fill(c: ColorRGBa) { - fill(c.r.toFloat() * 255.0f, c.g.toFloat() * 255.0f, c.b.toFloat() * 255.0f, c.alpha.toFloat() * 255.0f) -} - -fun PShape.stroke(c: ColorRGBa) { - stroke(c.r.toFloat() * 255.0f, c.g.toFloat() * 255.0f, c.b.toFloat() * 255.0f, c.alpha.toFloat() * 255.0f) -} - -/** - * Adds a cubic Bézier curve vertex to the current shape. The curve is defined - * by two control points and an end point. - * - * @param v2 The first control point that influences the direction and shape of the curve. - * @param v3 The second control point that affects the curvature of the Bézier curve. - * @param v4 The end point where the Bézier curve terminates. - */ -fun PShape.bezierVertex(v2: Vector2, v3: Vector2, v4: Vector2) { - bezierVertex( - v2.x.toFloat(), v2.y.toFloat(), - v3.x.toFloat(), v3.y.toFloat(), - v4.x.toFloat(), v4.y.toFloat() - ) -} - -/** - * Combines a list of [Shape] objects into a single [PShape] object of type `GROUP` - * by adding each shape as a child. - * - * Each [Shape] in the input list is converted to a [PShape], and these are added as - * children to a parent [PShape] of type `GROUP`. This allows for easy grouping and management - * of multiple [Shape] objects while using the Processing library. - * - * @param shapes the list of [Shape] objects to combine. Each shape is converted and added - * as a child to the resulting [PShape] object. - * @return a [PShape] object of type `GROUP` containing the provided shapes as children. - */ -fun PShape(shapes: List): PShape { - val ps = PShape(PShape.GROUP) - for (shape in shapes) { - ps.addChild(PShape(shape)) - } - return ps -} - -/** - * Converts a given [Shape] instance into a [PShape] object. If the shape contains a single - * contour, it is directly converted. Otherwise, the method constructs a complex [PShape] - * with paths and contours, mapping each segment type appropriately. - * - * @param shape the [Shape] instance to be converted into a [PShape]. The shape may consist - * of one or more contours, each containing multiple segments. - * @return a [PShape] object representing the input shape. The resulting [PShape] - * will contain vertices, contours, and paths corresponding to the geometry of the input. - */ -fun PShape(shape: Shape): PShape { - if (shape.contours.size == 1) { - return PShape(shape.contours[0]) - } else { - val ps = PShape(PShape.PATH) - ps.beginShape() - for (contour in shape.contours) { - ps.beginContour() - ps.vertex(contour.segments[0].start) - for (segment in contour.segments) { - when (segment.type) { - SegmentType.LINEAR -> ps.vertex(segment.end) - SegmentType.QUADRATIC -> ps.quadraticVertex(segment.control[0], segment.end) - SegmentType.CUBIC -> ps.bezierVertex(segment.control[0], segment.control[1], segment.end) - } - } - ps.endContour() - } - ps.endShape(PShape.CLOSE) - return ps - } -} - -/** - * Converts a given [ShapeContour] into a [PShape] object. The method translates contour - * segments (linear, quadratic, cubic) into corresponding vertices and shapes suitable - * for use with the Processing library. - * - * @param contour the [ShapeContour] to convert into a [PShape]. It may consist of multiple - * segments of varying types and can be open or closed. - * @return a [PShape] object representing the given [ShapeContour]. - */ -fun PShape(contour: ShapeContour): PShape { - val ps = PShape(PShape.PATH) - if (!contour.empty) { - ps.beginShape() - val start = contour.segments[0].start - ps.vertex(start) - for ((index, segment) in contour.segments.withIndex()) { - when (segment.type) { - SegmentType.LINEAR -> { - if (!(contour.closed && index == contour.segments.size - 1)) { - ps.vertex(segment.end) - } - } - SegmentType.QUADRATIC -> ps.quadraticVertex(segment.control[0], segment.end) - SegmentType.CUBIC -> { - ps.bezierVertex(segment.control[0], segment.control[1], segment.end) - } - } - } - ps.endShape(if (contour.closed) PShape.CLOSE else PShape.OPEN) - } - return ps -} - - -/** - * Converts a [PShape] of type `PATH` into a [ShapeContour]. - * - * This function processes the vertices and vertex codes of the `PShape` to construct a - * corresponding [ShapeContour]. The function supports vertex types including `VERTEX`, - * `BEZIER_VERTEX`, and `QUADRATIC_VERTEX`. Other vertex codes will result in an error. - * The contour will reflect whether the `PShape` is closed or open. - * - * @return A [ShapeContour] that represents the geometry of the given `PShape.PATH`. - * @throws IllegalArgumentException if the `PShape` is not of type `PATH`. - * @throws IllegalStateException for unsupported vertex codes. - */ -fun PShape.pathToShapeContours(): List { - require(family == PShape.PATH) { - "can only convert PShape.PATH to ShapeContour" - } - if (vertexCodeCount == 0) { - val vertices = mutableListOf() - for (i in 0 until vertexCount) { - val pv = getVertex(i) - vertices.add(pv.toVector2()) - } - val contour = ShapeContour.fromPoints(vertices, isClosed) - return listOf(contour) - } else { - val result = mutableListOf() - - var segments = mutableListOf() - var vertexIndex = 0 - var vertex:Vector2? = null - - for (i in 0 until vertexCodeCount) { - val code = vertexCodes[i] - when (code) { - PShape.VERTEX -> { - val pv = getVertex(vertexIndex).toVector2() - vertexIndex++ - if (vertex != null) { - segments.add(Segment2D(vertex, pv)) - } - vertex = pv - } - PShape.BEZIER_VERTEX -> { - val c0 = getVertex(vertexIndex).toVector2(); vertexIndex++ - val c1 = getVertex(vertexIndex).toVector2(); vertexIndex++ - val pv = getVertex(vertexIndex).toVector2(); vertexIndex++ - segments.add(Segment2D(vertex ?: error("no vertex set"), c0, c1, pv)) - vertex = pv - } - PShape.QUADRATIC_VERTEX -> { - val c0 = getVertex(vertexIndex).toVector2(); vertexIndex++ - val pv = getVertex(vertexIndex).toVector2(); vertexIndex++ - segments.add(Segment2D(vertex ?: error("no vertex set"), c0, pv)) - vertex = pv - } - PShape.BREAK -> { - segments.add(Segment2D(vertex ?: error("no vertex set"), segments.first().start)) - result.add(ShapeContour(segments, closed = isClosed)) - segments = mutableListOf() - vertex = getVertex(vertexIndex).toVector2() - } - else -> error("unsupported code $code") - } - } - if (isClosed && segments.last().end.distanceTo(segments.first().start) > 1E-6) { - segments.add(Segment2D(segments.last().end, segments.first().start)) - } - - if (segments.isNotEmpty()) { - result.add(ShapeContour(segments, closed = isClosed)) - } - return result - } -} - -/** - * Converts this [PShape] instance into a list of [ShapeContour] objects. - * - * This function processes the shape based on its family type: - * - If the shape is a `GROUP`, it recursively converts its children into contours. - * - If the shape is a `PATH`, it converts it directly to a single [ShapeContour]. - * - If the shape is `GEOMETRY`, it constructs contours based on vertex information. - * - * Unsupported shape families will throw an error. - * - * @return A list of [ShapeContour] objects representing the contours of this [PShape]. - */ -fun PShape.toShapeContours(): List { - return when (this.family) { - PShape.GROUP -> { - children.flatMap { it.toShapeContours() } - } - - PShape.PATH -> { - pathToShapeContours() - } - - PShape.GEOMETRY -> { - val contourPoints = mutableListOf>() - //https://github.com/processing/processing4/blob/d35f4de58936d41946d253f37986127fd100654c/core/src/processing/core/PShape.java#L1772 - - var codeIndex = 0 - var activeContour = mutableListOf() - for (i in 0 until vertexCount) { - if (vertexCodes[codeIndex++] == PShape.BREAK) { - contourPoints.add(activeContour) - activeContour = mutableListOf() - codeIndex++ - } - } - if (activeContour.isNotEmpty()) { - contourPoints.add(activeContour) - } - contourPoints.map { ShapeContour.fromPoints(it, false) } - } - - else -> error("unsupported shape family: ${this.family}") - } -} - -/** - * Converts this [PShape] instance into a [Shape] instance. - * - * This function processes the contours of the [PShape] and transforms them into - * the corresponding contours of a [Shape] object. - * - * @return A [Shape] object representing the converted [PShape]. - */ -fun PShape.toShape(): Shape { - return Shape(toShapeContours()) -} \ No newline at end of file diff --git a/orx-jvm/orx-processing/src/main/kotlin/PVectorExtensions.kt b/orx-jvm/orx-processing/src/main/kotlin/PVectorExtensions.kt deleted file mode 100644 index 5492fa67..00000000 --- a/orx-jvm/orx-processing/src/main/kotlin/PVectorExtensions.kt +++ /dev/null @@ -1,66 +0,0 @@ -package org.openrndr.extra.processing - -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import processing.core.PVector - -/** - * Converts a given `Vector2` instance into a `PVector` instance. - * - * @param v the source Vector2 whose x and y coordinates will be used to create the PVector. - * @return a new PVector instance initialized with the x and y components of the given Vector2, - * cast to Float. - */ -fun PVector(v: Vector2): PVector = PVector(v.x.toFloat(), v.y.toFloat()) - -/** - * Converts a `Vector3` object into a `PVector` instance by converting its components to `Float`. - * - * @param v the `Vector3` instance to convert - * @return a `PVector` instance with corresponding x, y, and z components in `Float` - */ -fun PVector(v: Vector3): PVector = PVector(v.x.toFloat(), v.y.toFloat(), v.z.toFloat()) - -/** - * Converts an instance of [Vector2] to a [PVector] by transforming its x and y values - * into floating-point numbers. - * - * @receiver The [Vector2] instance to be converted. - * @return A new [PVector] containing the x and y components of the receiver as floats. - */ -fun Vector2.toPVector() = PVector(this.x.toFloat(), this.y.toFloat()) - -/** - * Converts a [Vector3] instance to a [PVector] instance. - * - * Each component of the [Vector3] (x, y, z) is cast to a float and used to - * construct a new [PVector]. - * - * @receiver The [Vector3] to be converted. - * @return A [PVector] with the corresponding float components. - */ -fun Vector3.toPVector() = PVector(this.x.toFloat(), this.y.toFloat(), this.z.toFloat()) - - -/** - * Converts this [PVector] instance into a [Vector2] instance. - * - * The `x` and `y` components of the [PVector] are converted to `Double` and used - * to create a new [Vector2]. - * - * @return A [Vector2] instance with the `x` and `y` components of this [PVector] - * converted to `Double`. - */ -fun PVector.toVector2(): Vector2 { - return Vector2(x.toDouble(), y.toDouble()) -} - -/** - * Converts a [PVector] into an [Vector3] instance. - * - * @return a [Vector3] object with the same x, y, and z values as the original [PVector], - * converted to Double. - */ -fun PVector.toVector3(): Vector3 { - return Vector3(x.toDouble(), y.toDouble(), z.toDouble()) -} diff --git a/orx-jvm/orx-rabbit-control/.gitignore b/orx-jvm/orx-rabbit-control/.gitignore deleted file mode 100644 index e43b0f98..00000000 --- a/orx-jvm/orx-rabbit-control/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/orx-jvm/orx-rabbit-control/README.md b/orx-jvm/orx-rabbit-control/README.md deleted file mode 100644 index 13ba2892..00000000 --- a/orx-jvm/orx-rabbit-control/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# orx-rabbit-control - -Creates a web-based remote UI to control your OPENRNDR program from a mobile device or a different computer. Alternative to `orx-gui`. - -`orx-rabbit-control` uses `orx-parameters` annotations to generate a control interface, just like `orx-gui`. -The main difference is that with `orx-gui` the UI is shown on a layer above your program while `orx-rabbit-control` -shows it on a web browser (potentially on another device). Ideal for tweaking parameters on interactive installations -without needing to attach a mouse or keyboard to the rendering computer. It also avoids difficulties caused by -UIs showed on rotated displays or projections. - - - - - -Find examples under the [demo](./src/demo/kotlin) folder. - -### Accessing the generated web UI - -Once you start a program that uses orx-rabbit-control, a QR code will be displayed on a layer above your visuals -until someone accesses the web UI. - -The UI can be accessed in a web browser in three different ways: - -- scan the QR code with a mobile device connected to the same wireless network, -- or click on the URL displayed in the IDE console, -- or go to [client.rabbitcontrol.cc](http://client.rabbitcontrol.cc) and enter your IP-address and port (displayed at the end of the URL shown in the IDE console) - -Once the UI is visible in a web browser one can interact with the sliders, buttons, checkboxes etc. -to control the OPENRNDR program remotely. - -More info about the web client: -[rabbitcontrol.cc/apps/webclient/](http://rabbitcontrol.cc/apps/webclient/) - -### Screenshot of a simple web UI - - - -### Frequently asked questions - -[https://rabbitcontrol.cc/faq/](https://rabbitcontrol.cc/faq/) - -## Demos -### DemoRabbitControl - -Demonstrates how to use RabbitControl to create a web-based user interface for your program. - -A `settings` object is created using the same syntax used for `orx-gui`, including -annotations for different variable types. - -The program then passes these `settings` to the `RabbitControlServer`. A QR-code is displayed -to open the web user interface. A clickable URL is also displayed in the console. - -Once the UI is visible in a web browser we can use it to control the OPENRNDR program. - -![DemoRabbitControlKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-rabbit-control/images/DemoRabbitControlKt.png) - -[source code](src/demo/kotlin/DemoRabbitControl.kt) - -### DemoRabbitControlManualOverlay - -Demonstrates how the QR-code pointing at the Rabbit Control web-based user interface -can be displayed and hidden manually. - -To display the QR-code overlay in this demo, hold down the HOME key in the keyboard. - -![DemoRabbitControlManualOverlayKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-rabbit-control/images/DemoRabbitControlManualOverlayKt.png) - -[source code](src/demo/kotlin/DemoRabbitControlManualOverlay.kt) - -### DemoRabbitHole - -Starts the RabbitControlServer with a `Rabbithole` using the key 'orxtest'. - -`Rabbithole` allows you to access your exposed parameters from Internet -connected computers that are not in the same network. - -To use it with this example use 'orxtest' as the tunnel-name in https://rabbithole.rabbitcontrol.cc - - -![DemoRabbitHoleKt](https://raw.githubusercontent.com/openrndr/orx/media/orx-jvm/orx-rabbit-control/images/DemoRabbitHoleKt.png) - -[source code](src/demo/kotlin/DemoRabbitHole.kt) diff --git a/orx-jvm/orx-rabbit-control/build.gradle.kts b/orx-jvm/orx-rabbit-control/build.gradle.kts deleted file mode 100644 index c1c1e333..00000000 --- a/orx-jvm/orx-rabbit-control/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id("org.openrndr.extra.convention.kotlin-jvm") -} - -dependencies { - implementation(project(":orx-parameters")) - implementation(project(":orx-compositor")) - implementation(project(":orx-image-fit")) - implementation(project(":orx-fx")) - implementation(openrndr.application.core) - implementation(openrndr.math) - implementation(libs.rabbitcontrol.rcp) - implementation(libs.netty.all) - implementation(libs.zxing.core) - implementation(libs.ktor.server.core) - implementation(libs.ktor.server.netty) -} \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControl.kt b/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControl.kt deleted file mode 100644 index 1dc1687e..00000000 --- a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControl.kt +++ /dev/null @@ -1,72 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 - -/** - * Demonstrates how to use RabbitControl to create a web-based user interface for your program. - * - * A `settings` object is created using the same syntax used for `orx-gui`, including - * annotations for different variable types. - * - * The program then passes these `settings` to the `RabbitControlServer`. A QR-code is displayed - * to open the web user interface. A clickable URL is also displayed in the console. - * - * Once the UI is visible in a web browser we can use it to control the OPENRNDR program. - */ -fun main() = application { - configure { - width = 800 - height = 800 - } - - program { - val rabbit = RabbitControlServer() - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0) - val settings = object { - @TextParameter("A string") - var s: String = "Hello" - - @DoubleParameter("A double", 0.0, 10.0) - var d: Double = 10.0 - - @BooleanParameter("A bool") - var b: Boolean = true - - @ColorParameter("A fill color") - var fill = ColorRGBa.PINK - - @ColorParameter("A stroke color") - var stroke = ColorRGBa.WHITE - - @Vector2Parameter("A vector2") - var v2 = Vector2(200.0,200.0) - - @Vector3Parameter("A vector3") - var v3 = Vector3(200.0, 200.0, 200.0) - - @Vector4Parameter("A vector4") - var v4 = Vector4(200.0, 200.0, 200.0, 200.0) - - @ActionParameter("Action test") - fun clicked() { - d += 10.0 - println("Clicked from RabbitControl") - } - } - - rabbit.add(settings) - extend(rabbit) - extend { - drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK) - drawer.fontMap = font - drawer.fill = settings.fill - drawer.stroke = settings.stroke - drawer.circle(settings.v2, settings.d) - drawer.text(settings.s, 10.0, 20.0) - } - } -} diff --git a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControlManualOverlay.kt b/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControlManualOverlay.kt deleted file mode 100644 index c996f3f3..00000000 --- a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitControlManualOverlay.kt +++ /dev/null @@ -1,51 +0,0 @@ -import org.openrndr.KEY_HOME -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.extra.parameters.BooleanParameter - - -/** - * Demonstrates how the QR-code pointing at the Rabbit Control web-based user interface - * can be displayed and hidden manually. - * - * To display the QR-code overlay in this demo, hold down the HOME key in the keyboard. - */ -fun main() = application { - configure { - width = 800 - height = 800 - } - - program { - val rabbit = RabbitControlServer(showQRUntilClientConnects = false) - - val settings = object { - @BooleanParameter("White on black") - var whiteOnBlack: Boolean = true - } - - rabbit.add(settings) - extend(rabbit) - - /** - * Example: only show the QR code when the [KEY_HOME] button is pressed - */ - keyboard.keyDown.listen { - when (it.key) { - KEY_HOME -> rabbit.showQRCode = true - } - } - - keyboard.keyUp.listen { - when (it.key) { - KEY_HOME -> rabbit.showQRCode = false - } - } - - extend { - drawer.clear(if (settings.whiteOnBlack) ColorRGBa.BLACK else ColorRGBa.WHITE) - drawer.fill = if (settings.whiteOnBlack) ColorRGBa.WHITE else ColorRGBa.BLACK - drawer.circle(drawer.bounds.center, 250.0) - } - } -} diff --git a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt b/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt deleted file mode 100644 index 2a8d7b29..00000000 --- a/orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt +++ /dev/null @@ -1,69 +0,0 @@ -import org.openrndr.application -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.loadFont -import org.openrndr.extra.parameters.* -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 - -/** - * Starts the RabbitControlServer with a `Rabbithole` using the key 'orxtest'. - * - * `Rabbithole` allows you to access your exposed parameters from Internet - * connected computers that are not in the same network. - * - * To use it with this example use 'orxtest' as the tunnel-name in https://rabbithole.rabbitcontrol.cc - * - */ -fun main() = application { - configure { - width = 800 - height = 800 - } - - program { - val rabbit = RabbitControlServer(false, 10000, 8080, "wss://rabbithole.rabbitcontrol.cc/public/rcpserver/connect?key=orxtest") - val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0) - val settings = object { - @TextParameter("A string") - var s: String = "Hello" - - @DoubleParameter("A double", 0.0, 10.0) - var d: Double = 10.0 - - @BooleanParameter("A bool") - var b: Boolean = true - - @ColorParameter("A fill color") - var fill = ColorRGBa.PINK - - @ColorParameter("A stroke color") - var stroke = ColorRGBa.WHITE - - @Vector2Parameter("A vector2") - var v2 = Vector2(200.0,200.0) - - @Vector3Parameter("A vector3") - var v3 = Vector3(200.0, 200.0, 200.0) - - @Vector4Parameter("A vector4") - var v4 = Vector4(200.0, 200.0, 200.0, 200.0) - - @ActionParameter("Action test") - fun clicked() { - println("Clicked from RabbitControl") - } - } - - rabbit.add(settings) - extend(rabbit) - extend { - drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK) - drawer.fontMap = font - drawer.fill = settings.fill - drawer.stroke = settings.stroke - drawer.circle(settings.v2, settings.d) - drawer.text(settings.s, 10.0, 20.0) - } - } -} diff --git a/orx-jvm/orx-rabbit-control/src/main/kotlin/RabbitControlServer.kt b/orx-jvm/orx-rabbit-control/src/main/kotlin/RabbitControlServer.kt deleted file mode 100644 index b6043ed2..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/kotlin/RabbitControlServer.kt +++ /dev/null @@ -1,288 +0,0 @@ -import com.google.zxing.BarcodeFormat -import com.google.zxing.qrcode.QRCodeWriter -import io.ktor.server.engine.* -import io.ktor.server.http.content.* -import io.ktor.server.netty.* -import io.ktor.server.routing.* -import org.openrndr.Extension -import org.openrndr.Program -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.extra.compositor.* -import org.openrndr.extra.fx.blend.Darken -import org.openrndr.extra.imageFit.FitMethod -import org.openrndr.extra.imageFit.imageFit -import org.openrndr.extra.parameters.Parameter -import org.openrndr.extra.parameters.ParameterType -import org.openrndr.extra.parameters.listParameters -import org.openrndr.math.Vector2 -import org.openrndr.math.Vector3 -import org.openrndr.math.Vector4 -import org.openrndr.math.mix -import org.rabbitcontrol.rcp.RCPServer -import org.rabbitcontrol.rcp.model.interfaces.IParameter -import org.rabbitcontrol.rcp.model.parameter.* -import org.rabbitcontrol.rcp.transport.websocket.server.RabbitHoleWsServerTransporterNetty -import org.rabbitcontrol.rcp.transport.websocket.server.WebsocketServerTransporterNetty -import java.awt.Color -import java.net.InetSocketAddress -import java.net.Socket -import java.net.URI -import java.net.URISyntaxException -import kotlin.reflect.KMutableProperty1 - - -class RabbitControlServer(private val showQRUntilClientConnects: Boolean = true, rcpPort: Int = - 10000, staticFilesPort: Int = 8080, rabbithole: String = "") : Extension { - private val rabbitServer = RCPServer() - private val transporter = WebsocketServerTransporterNetty() - private var rabbitholeTransporter: RabbitHoleWsServerTransporterNetty? = null - private var webServer: NettyApplicationEngine? = null - - private var parameterMap = mutableMapOf>() - - private var qrCodeImage: ColorBuffer? = null - private var qrOverlayComposition: Composite? = null - - - /** - * Animate the opacity to make it look smooooth - */ - private var currentOpacity = 0.0 - - private val targetOpacity: Double - get() = if (shouldShowQR) 0.8 else 0.0 - - private val shouldShowQR - get() = (rabbitServer.connectionCount == 0 && showQRUntilClientConnects) || showQRCode - - - /** - * Used to manually show and hide the QR code and override the default - * behaviour of (only) showing the code when no clients are connected - */ - var showQRCode = false - - init { - rabbitServer.addTransporter(transporter) - transporter.bind(rcpPort) - - /** - * add rabbithole transporter - */ - if (rabbithole.isNotEmpty()) { - try { - val rhlTransporter = RabbitHoleWsServerTransporterNetty(URI(rabbithole)) - rabbitServer.addTransporter(rhlTransporter) - rhlTransporter.bind(0) - rabbitholeTransporter = rhlTransporter - } catch (e: URISyntaxException) { - // - println("invalid URI for rabbithole: $rabbithole") - } - } - - /** - * Start KTOR to serve the static files of the RabbitControl client - */ - val server = embeddedServer(Netty, port = staticFilesPort) { - routing { - staticResources("/rabbit-client", "rabbit-client") - } - } - server.start() - webServer = server.engine - - /** - * Print the address - */ - val socket = Socket() - socket.connect(InetSocketAddress("google.com", 80)) - val ip = socket.localAddress.toString().replace("/", "") - val clientUrlWithHash = "http://$ip:$staticFilesPort/rabbit-client/index.html#$ip:$rcpPort" - qrCodeImage = getQRCodeImage(barcodeText = clientUrlWithHash) - println("RabbitControl Web Client: $clientUrlWithHash") - - /** - * Update the object when it has been updated in RabbitControl - */ - rabbitServer.addUpdateListener { - val (obj, orxParameter) = parameterMap[it]!! - when(it) { - is Int32Parameter -> { - val v = it.value - orxParameter.property.qset(obj, v) - } - is Float64Parameter -> { - val v = it.value - orxParameter.property.qset(obj, v) - } - is BooleanParameter -> { - val v = it.value - orxParameter.property.qset(obj, v) - } - is StringParameter -> { - val v = it.value - orxParameter.property.qset(obj, v) - } - is RGBAParameter -> { - val c = it.value - val cc = ColorRGBa(c.red.toDouble() / 255.0, c.green.toDouble() / 255.0, c.blue.toDouble() / 255.0, c.alpha.toDouble() / 255.0) - orxParameter.property.qset(obj, cc) - } - is Vector2Float32Parameter -> { - val v = it.value - orxParameter.property.qset(obj, Vector2(v.x.toDouble(), v.y.toDouble())) - } - is Vector3Float32Parameter -> { - val v = it.value - orxParameter.property.qset(obj, Vector3(v.x.toDouble(), v.y.toDouble(), v.z.toDouble())) - } - is Vector4Float32Parameter -> { - val v = it.value - orxParameter.property.qset(obj, Vector4(v.x.toDouble(), v.y.toDouble(), v.z.toDouble(), v.t.toDouble())) - } - } - } - } - - - override fun setup(program: Program) { - /** - * Creating the Composite for the overlay needs to happen in setup(), - * as we need access to [Program.drawer] - */ - qrOverlayComposition = compose { - layer { - draw { - program.drawer.isolated { - fill = ColorRGBa.WHITE.opacify(currentOpacity) - stroke = null - rectangle(0.0,0.0, width.toDouble(), height.toDouble()) - } - } - - layer { - blend(Darken()) { - clip = true - } - - draw { - qrCodeImage?.let { - program.drawer.imageFit(it, program.width / 4.0,program.height / 4.0, program.width * .5, program.height * .5, 0.0,0.0, FitMethod.Contain) - } - } - } - } - } - } - - - @Suppress("UNCHECKED_CAST") - fun add(objectWithParameters: Any) { - val parameters = objectWithParameters.listParameters() - - parameters.forEach { - val rabbitParam = when (it.parameterType) { - ParameterType.Int -> { - val param = rabbitServer.createInt32Parameter(it.label) - param.value = (it.property as KMutableProperty1).get(objectWithParameters) - param - } - ParameterType.Double -> { - val param = rabbitServer.createFloat64Parameter(it.label) - param.value = (it.property as KMutableProperty1).get(objectWithParameters) - param - } - ParameterType.Action -> { - val param = rabbitServer.createBangParameter(it.label) - param.setFunction { - it.function!!.call(objectWithParameters) - } - param - } - ParameterType.Boolean -> { - val param = rabbitServer.createBooleanParameter(it.label) - param.value = (it.property as KMutableProperty1).get(objectWithParameters) - param - } - ParameterType.Text -> { - val param =rabbitServer.createStringParameter(it.label) - param.value = (it.property as KMutableProperty1).get(objectWithParameters) - param - } - ParameterType.Color -> { - val param = rabbitServer.createRGBAParameter(it.label) - val c = (it.property as KMutableProperty1).get(objectWithParameters) - param.value = Color(c.r.toFloat(), c.g.toFloat(), c.b.toFloat(), c.alpha.toFloat()) - param - } - ParameterType.Vector2 -> { - val param = rabbitServer.createVector2Float32Parameter(it.label) - val v2 = (it.property as KMutableProperty1).get(objectWithParameters) - param.value = org.rabbitcontrol.rcp.model.types.Vector2(v2.x.toFloat(), v2.y.toFloat()) - param - } - ParameterType.Vector3 -> { - val param = rabbitServer.createVector3Float32Parameter(it.label) - val v3 = (it.property as KMutableProperty1).get(objectWithParameters) - param.value = org.rabbitcontrol.rcp.model.types.Vector3(v3.x.toFloat(), v3.y.toFloat(), v3.z.toFloat()) - param - } - ParameterType.Vector4 -> { - val param = rabbitServer.createVector4Float32Parameter(it.label) - val v4 = (it.property as KMutableProperty1).get(objectWithParameters) - param.value = org.rabbitcontrol.rcp.model.types.Vector4(v4.x.toFloat(), v4.y.toFloat(), v4.z.toFloat(), v4.w.toFloat()) - param - } - else -> rabbitServer.createBangParameter(it.label) - } - - // We need to store a mapping from Rabbit parameter to target object + orx parameter - // so we can update the object later - parameterMap[rabbitParam] = Pair(objectWithParameters, it) - } - - rabbitServer.update() - } - - override var enabled = true - - override fun shutdown(program: Program) { - transporter.dispose() - rabbitholeTransporter?.dispose() - webServer?.stop(50, 50) - } - - private fun getQRCodeImage(barcodeText: String): ColorBuffer { - val qrCodeWriter = QRCodeWriter() - val bitMatrix = qrCodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 30, 30) - val cb = colorBuffer(bitMatrix.width, bitMatrix.height) - cb.filterMag = MagnifyingFilter.NEAREST - val shad = cb.shadow - - - for (y in 0 until bitMatrix.width) { - for (x in 0 until bitMatrix.height) { - shad[x, y] = if (bitMatrix[x, y]) ColorRGBa.BLACK else ColorRGBa.WHITE - } - } - - shad.upload() - return cb - } - - override fun afterDraw(drawer: Drawer, program: Program) { - currentOpacity = mix(targetOpacity, currentOpacity, 0.8) - - // Don't draw if it isn't necessary - if (currentOpacity > 0.0) { - qrOverlayComposition?.draw(drawer) - } - } -} - -fun KMutableProperty1?.qset(obj: Any, value: T) { - @Suppress("UNCHECKED_CAST") - return (this as KMutableProperty1).set(obj, value) -} diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/asset-manifest.json b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/asset-manifest.json deleted file mode 100644 index 301da445..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/asset-manifest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "main.css": "./static/css/main.6b57d6a6.chunk.css", - "main.js": "./static/js/main.3c08e7ef.chunk.js", - "main.js.map": "./static/js/main.3c08e7ef.chunk.js.map", - "static/css/1.a970d4a6.chunk.css": "./static/css/1.a970d4a6.chunk.css", - "static/js/1.ab137fd1.chunk.js": "./static/js/1.ab137fd1.chunk.js", - "static/js/1.ab137fd1.chunk.js.map": "./static/js/1.ab137fd1.chunk.js.map", - "runtime~main.js": "./static/js/runtime~main.4a686d48.js", - "runtime~main.js.map": "./static/js/runtime~main.4a686d48.js.map", - "static/media/blueprint-icons.css": "./static/media/icons-20.cef8cdbb.woff", - "static/css/main.6b57d6a6.chunk.css.map": "./static/css/main.6b57d6a6.chunk.css.map", - "static/css/1.a970d4a6.chunk.css.map": "./static/css/1.a970d4a6.chunk.css.map", - "index.html": "./index.html", - "precache-manifest.8b50f7152eba97a8a3a748d36319a411.js": "./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js", - "service-worker.js": "./service-worker.js" -} \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/favicon.ico b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/favicon.ico deleted file mode 100644 index 9f144de9edec0cd3d669102adb2e49e33888de18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 zcmZQzU}RuqaBu+83Je-f3=Con3=A3!3=9qo3=9nn5OIc4Fd71bECjMwo=0(!Rp~5- znw|Gi#D+CT+#BpY$Jl(m$olC@AdX$p6c9D+u~!AepK3WX+WA|~{+DS#`T2jN5!sF>G6Mo2@n4BPk8WOwDaQsjg2Wh!`b_} zt1f`OXHh=CowxttfBwFEU@S24(SHzjEu9(!Qn2mnOAs||u~zZIf4sFvAby|l@IU{A zhyVHdAN)7zI?yp}Jq`6(N^P&MX!|*ExyRpq6P*7ACO-VnH{s!b<*qZUp~{9Gl|6eW z*iV*qE0^>3-3R-dzyBUI|33utW!g{g0V&E~b^=5VORUv#FVv!_w1GPsLPrISEzo`_I>X^S?m<1F+xuVQFE)!~cq1XZ}Hz4lC;L%@<(* z_)Xk3iKp}Wf4-LU|M|Obfy;bQ9)N_wga4v!XaE2I&%g*)JPZlP-aQY&^&U9QL-IT* z{e#*-pgI6l9-0?Su^xtAXZUsfkeGVsF-YDA*ZX(DWgguB{SW^0ci;H0lRY_XIQqY2 z@^Vj+&P(7lF90h4CP4E)v>X7n13~4XddZUH;pG3SZFj)l32a-@#Rn?u`tE_tK5&}v zgQNj)JFx%3f1wHY|0|TQs{(5nCPY-@EU-`X8@8N;ix3@p(v7wr|!V9qHB+;JOY}=7IXT5WhnF4q}7)KOk{X z-jJPeU+$XACt0`eKe&wxF6*KG1(o@r`X7ct{O%k7c^gmu zmuNWj-?(|pMz8@xlt}1U2zI$!&HNd>y`VlWWSkG2&SCk#?=HAJ0JZ&*%RiAx5C5w- z?K%WDU{zH@>vFLF{acq$-~sjV!08_9Z&0}p!l3p)D9yt$tW5+N3zcp?{uOM<5GK@{ z_k806`4fa;@e8Z-K=BXF``|iZ!Xs##7!(fo|BJSs9@2GSLgO?wk)9jiHXUr716PNK~UZR$#>uQA5+n(IMnmHVJ{0c!UM_TLBh|G?>G(&PVbweyW&<_$Gkq50q!(0C4{O$Uivei9{v{w=YdE6LGxl7E&IUZ0NL}0)_mZ_Q^$COGUxy2t=Rpax9-S){;uoL zdJdEZ9{dN@_aOg*$3Vd4|AYSmpn0%KkN<%FJir(fPWS)I^rmc<^6#;>|B0 z^9DQq{{1`HiStf92h$c63)A>|@BRnPW$-qh`Y%|y`@cZVf&YBqeDDA~?<+X*;eUxK zpf)e4eFO`GhyOw2pWymo!h`=(T|+1R!@>X*069Gil!aQ(z{h()XE=FNTa+ z=QU1{k*M1TUef@o??CYhqCw#S!Vo^F9DwwNKzvA<_~<`qjzn(K?JqTv?t);0hZy0} zvI^{Cm;82Bna;ESLF2ys;IST%e?j>jn*PD%0jM7U6Mq0+10yx*-oKEEJM2J)SQSnK zQ9}-!Rxbs+xgy3##JKw{r(Lyi8=aF$VfOY(o&<)Q!8*2MhR+M51f zsn!3#!n}z8^6O&$OSHNCH|+_of%z+K_HGz+NYepx3c>DonUz_pekAL^+}x1=%6n4& zD;-SxFFn=wzxE@Em=XUO{xj%-;`>SUYVYnsp+pzI4nn(UKY-hCIoPSqiW&D5n<&po@j%EEDKWTEg8k*K2&y83J-p&B_hi6C1DV0O%|J9CV|5rYo{@-R{`hV56@&9#B z=KnX}kvD8N{Uj}^1N%R8UP+MZzV!d9$Flw_A5H)7yej`-_{u8Z+O|eW8~?v7L+DiS zls8!Ya3gA38-?}v<$%*WDE>`mB_I+9)U#i|4*4lRs86s{`n$6JC?C)IuX!Nze`tT6 z4oDTO?>OB34)Uwf?wq&E$20$%9V`9>;)C$dpFcqq7!TJl$XVMC_Mg{|$}p`%S^rHB z6+#vUfkhb@ki!5fH0&t%t&r@V-c&5w*3-#5>^w-oLwW1F7`zrE%J+ap#SBGT`w8e8 zl^zWN+J?Y?JYYUljvqq*L!ccA)V=EL0ap8@86XgD^=gWd5TPTNEH47g~h`U6n; X1N9K~2O-q|hfw-48vPl{$4UVJEn8^e diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/index.html b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/index.html deleted file mode 100644 index f47bb4a2..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/index.html +++ /dev/null @@ -1 +0,0 @@ -RabbitControl Web Carrot

      \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/manifest.json b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/manifest.json deleted file mode 100644 index af8d9f0c..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "short_name": "RCP Web Client", - "name": "RabbitControl Web Client", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/precache-manifest.8b50f7152eba97a8a3a748d36319a411.js b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/precache-manifest.8b50f7152eba97a8a3a748d36319a411.js deleted file mode 100644 index a670cf10..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/precache-manifest.8b50f7152eba97a8a3a748d36319a411.js +++ /dev/null @@ -1,50 +0,0 @@ -self.__precacheManifest = [ - { - "revision": "3c08e7ef80fee0668771", - "url": "./static/css/main.6b57d6a6.chunk.css" - }, - { - "revision": "3c08e7ef80fee0668771", - "url": "./static/js/main.3c08e7ef.chunk.js" - }, - { - "revision": "ab137fd189140783fea3", - "url": "./static/css/1.a970d4a6.chunk.css" - }, - { - "revision": "ab137fd189140783fea3", - "url": "./static/js/1.ab137fd1.chunk.js" - }, - { - "revision": "4a686d48d5a089750c49", - "url": "./static/js/runtime~main.4a686d48.js" - }, - { - "revision": "3cde8748332d1de6b1ae1c2dc5850754", - "url": "./static/media/icons-16.3cde8748.ttf" - }, - { - "revision": "05f1cdadfe476395f60e233b15c22155", - "url": "./static/media/icons-16.05f1cdad.eot" - }, - { - "revision": "3c1c220e7a18286503fb431c7a7fe183", - "url": "./static/media/icons-16.3c1c220e.woff" - }, - { - "revision": "0a5c76518a68c185baa2c6744456918c", - "url": "./static/media/icons-20.0a5c7651.eot" - }, - { - "revision": "51ec31f302d0072808e1f83f85fea4cd", - "url": "./static/media/icons-20.51ec31f3.ttf" - }, - { - "revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d", - "url": "./static/media/icons-20.cef8cdbb.woff" - }, - { - "revision": "a84699318edf0b28678797d32740ca67", - "url": "./index.html" - } -]; \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/service-worker.js b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/service-worker.js deleted file mode 100644 index e1a0ad99..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/service-worker.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Welcome to your Workbox-powered service worker! - * - * You'll need to register this file in your web app and you should - * disable HTTP caching for this file too. - * See https://goo.gl/nhQhGp - * - * The rest of the code is auto-generated. Please don't update this file - * directly; instead, make changes to your Workbox build configuration - * and re-run your build process. - * See https://goo.gl/2aRDsh - */ - -importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js"); - -importScripts( - "./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js" -); - -workbox.clientsClaim(); - -/** - * The workboxSW.precacheAndRoute() method efficiently caches and responds to - * requests for URLs in the manifest. - * See https://goo.gl/S9QRab - */ -self.__precacheManifest = [].concat(self.__precacheManifest || []); -workbox.precaching.suppressWarnings(); -workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); - -workbox.routing.registerNavigationRoute("./index.html", { - - blacklist: [/^\/_/,/\/[^/]+\.[^/]+$/], -}); diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css deleted file mode 100644 index 4010a2d5..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:initial;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:initial}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:initial}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@font-face{font-family:Icons16;font-style:normal;font-weight:400;src:url(../../static/media/icons-16.05f1cdad.eot?#iefix) format("embedded-opentype"),url(../../static/media/icons-16.3c1c220e.woff) format("woff"),url(../../static/media/icons-16.3cde8748.ttf) format("truetype")}@font-face{font-family:Icons20;font-style:normal;font-weight:400;src:url(../../static/media/icons-20.0a5c7651.eot?#iefix) format("embedded-opentype"),url(../../static/media/icons-20.cef8cdbb.woff) format("woff"),url(../../static/media/icons-20.51ec31f3.ttf) format("truetype")}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body{font-size:14px;font-weight:400;letter-spacing:0;line-height:1.28581;text-transform:none;color:#182026;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,Icons16,sans-serif}p{margin-bottom:10px;margin-top:0}small{font-size:12px}strong{font-weight:600}::selection{background:rgba(125,188,255,.6)}.bp3-heading{color:#182026;font-weight:600;margin:0 0 10px;padding:0}.bp3-dark .bp3-heading{color:#f5f8fa}.bp3-running-text h1,h1.bp3-heading{font-size:36px;line-height:40px}.bp3-running-text h2,h2.bp3-heading{font-size:28px;line-height:32px}.bp3-running-text h3,h3.bp3-heading{font-size:22px;line-height:25px}.bp3-running-text h4,h4.bp3-heading{font-size:18px;line-height:21px}.bp3-running-text h5,h5.bp3-heading{font-size:16px;line-height:19px}.bp3-running-text h6,h6.bp3-heading{font-size:14px;line-height:16px}.bp3-ui-text{font-size:14px;font-weight:400;letter-spacing:0;line-height:1.28581;text-transform:none}.bp3-monospace-text{font-family:monospace;text-transform:none}.bp3-text-muted{color:#5c7080}.bp3-dark .bp3-text-muted{color:#a7b6c2}.bp3-text-disabled{color:rgba(92,112,128,.6)}.bp3-dark .bp3-text-disabled{color:rgba(167,182,194,.6)}.bp3-text-overflow-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.bp3-running-text{font-size:14px;line-height:1.5}.bp3-running-text h1{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h1{color:#f5f8fa}.bp3-running-text h2{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h2{color:#f5f8fa}.bp3-running-text h3{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h3{color:#f5f8fa}.bp3-running-text h4{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h4{color:#f5f8fa}.bp3-running-text h5{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h5{color:#f5f8fa}.bp3-running-text h6{color:#182026;font-weight:600;margin-bottom:20px;margin-top:40px}.bp3-dark .bp3-running-text h6{color:#f5f8fa}.bp3-running-text hr{border:none;border-bottom:1px solid rgba(16,22,26,.15);margin:20px 0}.bp3-dark .bp3-running-text hr{border-color:hsla(0,0%,100%,.15)}.bp3-running-text p{margin:0 0 10px;padding:0}.bp3-text-large{font-size:16px}.bp3-text-small{font-size:12px}a{text-decoration:none}a,a:hover{color:#106ba3}a:hover{cursor:pointer;text-decoration:underline}.bp3-dark a code,a .bp3-icon,a .bp3-icon-large,a .bp3-icon-standard,a code{color:inherit}.bp3-dark a,.bp3-dark a:hover{color:#48aff0}.bp3-dark a .bp3-icon,.bp3-dark a .bp3-icon-large,.bp3-dark a .bp3-icon-standard,.bp3-dark a:hover .bp3-icon,.bp3-dark a:hover .bp3-icon-large,.bp3-dark a:hover .bp3-icon-standard{color:inherit}.bp3-code,.bp3-running-text code{font-family:monospace;text-transform:none;background:hsla(0,0%,100%,.7);border-radius:3px;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2);color:#5c7080;font-size:smaller;padding:2px 5px}.bp3-dark .bp3-code,.bp3-dark .bp3-running-text code,.bp3-running-text .bp3-dark code{background:rgba(16,22,26,.3);box-shadow:inset 0 0 0 1px rgba(16,22,26,.4);color:#a7b6c2}.bp3-running-text a>code,a>.bp3-code{color:#137cbd}.bp3-dark .bp3-running-text a>code,.bp3-dark a>.bp3-code,.bp3-running-text .bp3-dark a>code{color:inherit}.bp3-code-block,.bp3-running-text pre{font-family:monospace;text-transform:none;background:hsla(0,0%,100%,.7);border-radius:3px;box-shadow:inset 0 0 0 1px rgba(16,22,26,.15);color:#182026;display:block;font-size:13px;line-height:1.4;margin:10px 0;padding:13px 15px 12px;word-break:break-all;word-wrap:break-word}.bp3-dark .bp3-code-block,.bp3-dark .bp3-running-text pre,.bp3-running-text .bp3-dark pre{background:rgba(16,22,26,.3);box-shadow:inset 0 0 0 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-code-block>code,.bp3-running-text pre>code{background:none;box-shadow:none;color:inherit;font-size:inherit;padding:0}.bp3-key,.bp3-running-text kbd{align-items:center;background:#fff;border-radius:3px;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.2);color:#5c7080;display:inline-flex;font-family:inherit;font-size:12px;height:24px;justify-content:center;line-height:24px;min-width:24px;padding:3px 6px;vertical-align:middle}.bp3-key .bp3-icon,.bp3-key .bp3-icon-large,.bp3-key .bp3-icon-standard,.bp3-running-text kbd .bp3-icon,.bp3-running-text kbd .bp3-icon-large,.bp3-running-text kbd .bp3-icon-standard{margin-right:5px}.bp3-dark .bp3-key,.bp3-dark .bp3-running-text kbd,.bp3-running-text .bp3-dark kbd{background:#394b59;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.4);color:#a7b6c2}.bp3-blockquote,.bp3-running-text blockquote{border-left:4px solid rgba(167,182,194,.5);margin:0 0 10px;padding:0 20px}.bp3-dark .bp3-blockquote,.bp3-dark .bp3-running-text blockquote,.bp3-running-text .bp3-dark blockquote{border-color:rgba(115,134,148,.5)}.bp3-list,.bp3-running-text ol,.bp3-running-text ul{margin:10px 0;padding-left:30px}.bp3-list li:not(:last-child),.bp3-running-text ol li:not(:last-child),.bp3-running-text ul li:not(:last-child){margin-bottom:5px}.bp3-list ol,.bp3-list ul,.bp3-running-text ol ol,.bp3-running-text ol ul,.bp3-running-text ul ol,.bp3-running-text ul ul{margin-top:5px}.bp3-list-unstyled{list-style:none;margin:0;padding:0}.bp3-list-unstyled li{padding:0}.bp3-rtl{text-align:right}.bp3-dark{color:#f5f8fa}:focus{outline:2px auto rgba(19,124,189,.6);outline-offset:2px;-moz-outline-radius:6px}.bp3-focus-disabled :focus,.bp3-focus-disabled :focus~.bp3-control-indicator{outline:none!important}.bp3-alert{max-width:400px;padding:20px}.bp3-alert-body{display:flex}.bp3-alert-body .bp3-icon{font-size:40px;margin-right:20px;margin-top:0}.bp3-alert-contents{word-break:break-word}.bp3-alert-footer{display:flex;flex-direction:row-reverse;margin-top:10px}.bp3-alert-footer .bp3-button{margin-left:10px}.bp3-breadcrumbs{cursor:default;flex-wrap:wrap;height:30px;list-style:none;margin:0;padding:0}.bp3-breadcrumbs,.bp3-breadcrumbs>li{align-items:center;display:flex}.bp3-breadcrumbs>li:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.71 7.29l-4-4a1.003 1.003 0 0 0-1.42 1.42L8.59 8 5.3 11.29c-.19.18-.3.43-.3.71a1.003 1.003 0 0 0 1.71.71l4-4c.18-.18.29-.43.29-.71 0-.28-.11-.53-.29-.71z' fill='%235C7080'/%3E%3C/svg%3E");content:"";display:block;height:16px;margin:0 5px;width:16px}.bp3-breadcrumbs>li:last-of-type:after{display:none}.bp3-breadcrumb,.bp3-breadcrumb-current,.bp3-breadcrumbs-collapsed{align-items:center;display:inline-flex;font-size:16px}.bp3-breadcrumb,.bp3-breadcrumbs-collapsed{color:#5c7080}.bp3-breadcrumb:hover{text-decoration:none}.bp3-breadcrumb.bp3-disabled{color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-breadcrumb .bp3-icon{margin-right:5px}.bp3-breadcrumb-current{color:inherit;font-weight:600}.bp3-breadcrumb-current .bp3-input{font-size:inherit;font-weight:inherit;vertical-align:initial}.bp3-breadcrumbs-collapsed{background:#ced9e0;border:none;border-radius:3px;cursor:pointer;margin-right:2px;padding:1px 5px;vertical-align:text-bottom}.bp3-breadcrumbs-collapsed:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cg fill='%235C7080'%3E%3Ccircle cx='2' cy='8.03' r='2'/%3E%3Ccircle cx='14' cy='8.03' r='2'/%3E%3Ccircle cx='8' cy='8.03' r='2'/%3E%3C/g%3E%3C/svg%3E") 50% no-repeat;content:"";display:block;height:16px;width:16px}.bp3-breadcrumbs-collapsed:hover{background:#bfccd6;color:#182026;text-decoration:none}.bp3-dark .bp3-breadcrumb,.bp3-dark .bp3-breadcrumbs-collapsed,.bp3-dark .bp3-breadcrumbs>li:after{color:#a7b6c2}.bp3-dark .bp3-breadcrumb.bp3-disabled{color:rgba(167,182,194,.6)}.bp3-dark .bp3-breadcrumb-current{color:#f5f8fa}.bp3-dark .bp3-breadcrumbs-collapsed{background:rgba(16,22,26,.4)}.bp3-dark .bp3-breadcrumbs-collapsed:hover{background:rgba(16,22,26,.6);color:#f5f8fa}.bp3-button{display:inline-flex;flex-direction:row;align-items:center;border:none;border-radius:3px;cursor:pointer;font-size:14px;justify-content:center;padding:5px 10px;text-align:left;vertical-align:middle;min-height:30px;min-width:30px}.bp3-button>*{flex-grow:0;flex-shrink:0}.bp3-button>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-button:before,.bp3-button>*{margin-right:7px}.bp3-button:empty:before,.bp3-button>:last-child{margin-right:0}.bp3-button:empty{padding:0!important}.bp3-button.bp3-disabled,.bp3-button:disabled{cursor:not-allowed}.bp3-button.bp3-fill{display:flex;width:100%}.bp3-align-right .bp3-button,.bp3-button.bp3-align-right{text-align:right}.bp3-align-left .bp3-button,.bp3-button.bp3-align-left{text-align:left}.bp3-button:not([class*=bp3-intent-]){background-color:#f5f8fa;background-image:linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1);color:#182026}.bp3-button:not([class*=bp3-intent-]):hover{background-clip:padding-box;background-color:#ebf1f5;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1)}.bp3-button:not([class*=bp3-intent-]).bp3-active,.bp3-button:not([class*=bp3-intent-]):active{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-button:not([class*=bp3-intent-]).bp3-disabled,.bp3-button:not([class*=bp3-intent-]):disabled{background-color:rgba(206,217,224,.5);background-image:none;box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;outline:none}.bp3-button:not([class*=bp3-intent-]).bp3-disabled.bp3-active,.bp3-button:not([class*=bp3-intent-]).bp3-disabled.bp3-active:hover,.bp3-button:not([class*=bp3-intent-]):disabled.bp3-active,.bp3-button:not([class*=bp3-intent-]):disabled.bp3-active:hover{background:rgba(206,217,224,.7)}.bp3-button.bp3-intent-primary{background-color:#137cbd;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-button.bp3-intent-primary.bp3-active,.bp3-button.bp3-intent-primary:active,.bp3-button.bp3-intent-primary:hover{color:#fff}.bp3-button.bp3-intent-primary:hover{background-color:#106ba3;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-button.bp3-intent-primary.bp3-active,.bp3-button.bp3-intent-primary:active{background-color:#0e5a8a;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-button.bp3-intent-primary.bp3-disabled,.bp3-button.bp3-intent-primary:disabled{background-color:rgba(19,124,189,.5);background-image:none;border-color:transparent;box-shadow:none;color:hsla(0,0%,100%,.6)}.bp3-button.bp3-intent-success{background-color:#0f9960;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-button.bp3-intent-success.bp3-active,.bp3-button.bp3-intent-success:active,.bp3-button.bp3-intent-success:hover{color:#fff}.bp3-button.bp3-intent-success:hover{background-color:#0d8050;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-button.bp3-intent-success.bp3-active,.bp3-button.bp3-intent-success:active{background-color:#0a6640;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-button.bp3-intent-success.bp3-disabled,.bp3-button.bp3-intent-success:disabled{background-color:rgba(15,153,96,.5);background-image:none;border-color:transparent;box-shadow:none;color:hsla(0,0%,100%,.6)}.bp3-button.bp3-intent-warning{background-color:#d9822b;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-button.bp3-intent-warning.bp3-active,.bp3-button.bp3-intent-warning:active,.bp3-button.bp3-intent-warning:hover{color:#fff}.bp3-button.bp3-intent-warning:hover{background-color:#bf7326;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-button.bp3-intent-warning.bp3-active,.bp3-button.bp3-intent-warning:active{background-color:#a66321;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-button.bp3-intent-warning.bp3-disabled,.bp3-button.bp3-intent-warning:disabled{background-color:rgba(217,130,43,.5);background-image:none;border-color:transparent;box-shadow:none;color:hsla(0,0%,100%,.6)}.bp3-button.bp3-intent-danger{background-color:#db3737;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-button.bp3-intent-danger.bp3-active,.bp3-button.bp3-intent-danger:active,.bp3-button.bp3-intent-danger:hover{color:#fff}.bp3-button.bp3-intent-danger:hover{background-color:#c23030;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-button.bp3-intent-danger.bp3-active,.bp3-button.bp3-intent-danger:active{background-color:#a82a2a;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-button.bp3-intent-danger.bp3-disabled,.bp3-button.bp3-intent-danger:disabled{background-color:rgba(219,55,55,.5);background-image:none;border-color:transparent;box-shadow:none;color:hsla(0,0%,100%,.6)}.bp3-button[class*=bp3-intent-] .bp3-button-spinner .bp3-spinner-head{stroke:#fff}.bp3-button.bp3-large,.bp3-large .bp3-button{min-height:40px;min-width:40px;font-size:16px;padding:5px 15px}.bp3-button.bp3-large:before,.bp3-button.bp3-large>*,.bp3-large .bp3-button:before,.bp3-large .bp3-button>*{margin-right:10px}.bp3-button.bp3-large:empty:before,.bp3-button.bp3-large>:last-child,.bp3-large .bp3-button:empty:before,.bp3-large .bp3-button>:last-child{margin-right:0}.bp3-button.bp3-small,.bp3-small .bp3-button{min-height:24px;min-width:24px;padding:0 7px}.bp3-button.bp3-loading{position:relative}.bp3-button.bp3-loading[class*=bp3-icon-]:before{visibility:hidden}.bp3-button.bp3-loading .bp3-button-spinner{margin:0;position:absolute}.bp3-button.bp3-loading>:not(.bp3-button-spinner){visibility:hidden}.bp3-button[class*=bp3-icon-]:before{font-family:Icons16,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#5c7080}.bp3-button .bp3-icon,.bp3-button .bp3-icon-large,.bp3-button .bp3-icon-standard{color:#5c7080}.bp3-button .bp3-icon-large.bp3-align-right,.bp3-button .bp3-icon-standard.bp3-align-right,.bp3-button .bp3-icon.bp3-align-right{margin-left:7px}.bp3-button .bp3-icon:first-child:last-child,.bp3-button .bp3-spinner+.bp3-icon:last-child{margin:0 -7px}.bp3-dark .bp3-button:not([class*=bp3-intent-]){background-color:#394b59;background-image:linear-gradient(180deg,hsla(0,0%,100%,.05),hsla(0,0%,100%,0));box-shadow:0 0 0 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark .bp3-button:not([class*=bp3-intent-]).bp3-active,.bp3-dark .bp3-button:not([class*=bp3-intent-]):active,.bp3-dark .bp3-button:not([class*=bp3-intent-]):hover{color:#f5f8fa}.bp3-dark .bp3-button:not([class*=bp3-intent-]):hover{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-button:not([class*=bp3-intent-]).bp3-active,.bp3-dark .bp3-button:not([class*=bp3-intent-]):active{background-color:#202b33;background-image:none;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-button:not([class*=bp3-intent-]).bp3-disabled,.bp3-dark .bp3-button:not([class*=bp3-intent-]):disabled{background-color:rgba(57,75,89,.5);background-image:none;box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-button:not([class*=bp3-intent-]).bp3-disabled.bp3-active,.bp3-dark .bp3-button:not([class*=bp3-intent-]):disabled.bp3-active{background:rgba(57,75,89,.7)}.bp3-dark .bp3-button:not([class*=bp3-intent-]) .bp3-button-spinner .bp3-spinner-head{background:rgba(16,22,26,.5);stroke:#8a9ba8}.bp3-dark .bp3-button:not([class*=bp3-intent-]) .bp3-icon,.bp3-dark .bp3-button:not([class*=bp3-intent-]) .bp3-icon-large,.bp3-dark .bp3-button:not([class*=bp3-intent-]) .bp3-icon-standard,.bp3-dark .bp3-button:not([class*=bp3-intent-])[class*=bp3-icon-]:before{color:#a7b6c2}.bp3-dark .bp3-button[class*=bp3-intent-],.bp3-dark .bp3-button[class*=bp3-intent-]:hover{box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-button[class*=bp3-intent-].bp3-active,.bp3-dark .bp3-button[class*=bp3-intent-]:active{box-shadow:0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-button[class*=bp3-intent-].bp3-disabled,.bp3-dark .bp3-button[class*=bp3-intent-]:disabled{background-image:none;box-shadow:none;color:hsla(0,0%,100%,.3)}.bp3-dark .bp3-button[class*=bp3-intent-] .bp3-button-spinner .bp3-spinner-head{stroke:#8a9ba8}.bp3-button.bp3-disabled .bp3-icon,.bp3-button.bp3-disabled .bp3-icon-large,.bp3-button.bp3-disabled .bp3-icon-standard,.bp3-button.bp3-disabled:before,.bp3-button:disabled .bp3-icon,.bp3-button:disabled .bp3-icon-large,.bp3-button:disabled .bp3-icon-standard,.bp3-button:disabled:before,.bp3-button[class*=bp3-intent-] .bp3-icon,.bp3-button[class*=bp3-intent-] .bp3-icon-large,.bp3-button[class*=bp3-intent-] .bp3-icon-standard,.bp3-button[class*=bp3-intent-]:before{color:inherit!important}.bp3-button.bp3-minimal{background:none;box-shadow:none}.bp3-button.bp3-minimal:hover{background:rgba(167,182,194,.3);box-shadow:none;color:#182026;text-decoration:none}.bp3-button.bp3-minimal.bp3-active,.bp3-button.bp3-minimal:active{background:rgba(115,134,148,.3);box-shadow:none;color:#182026}.bp3-button.bp3-minimal.bp3-disabled,.bp3-button.bp3-minimal.bp3-disabled:hover,.bp3-button.bp3-minimal:disabled,.bp3-button.bp3-minimal:disabled:hover{background:none;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-button.bp3-minimal.bp3-disabled.bp3-active,.bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active,.bp3-button.bp3-minimal:disabled.bp3-active,.bp3-button.bp3-minimal:disabled:hover.bp3-active{background:rgba(115,134,148,.3)}.bp3-dark .bp3-button.bp3-minimal{background:none;box-shadow:none;color:inherit}.bp3-dark .bp3-button.bp3-minimal.bp3-active,.bp3-dark .bp3-button.bp3-minimal:active,.bp3-dark .bp3-button.bp3-minimal:hover{background:none;box-shadow:none}.bp3-dark .bp3-button.bp3-minimal:hover{background:rgba(138,155,168,.15)}.bp3-dark .bp3-button.bp3-minimal.bp3-active,.bp3-dark .bp3-button.bp3-minimal:active{background:rgba(138,155,168,.3);color:#f5f8fa}.bp3-dark .bp3-button.bp3-minimal.bp3-disabled,.bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover,.bp3-dark .bp3-button.bp3-minimal:disabled,.bp3-dark .bp3-button.bp3-minimal:disabled:hover{background:none;color:rgba(167,182,194,.6);cursor:not-allowed}.bp3-dark .bp3-button.bp3-minimal.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active,.bp3-dark .bp3-button.bp3-minimal:disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal:disabled:hover.bp3-active{background:rgba(138,155,168,.3)}.bp3-button.bp3-minimal.bp3-intent-primary{color:#106ba3}.bp3-button.bp3-minimal.bp3-intent-primary.bp3-active,.bp3-button.bp3-minimal.bp3-intent-primary:active,.bp3-button.bp3-minimal.bp3-intent-primary:hover{background:none;box-shadow:none;color:#106ba3}.bp3-button.bp3-minimal.bp3-intent-primary:hover{background:rgba(19,124,189,.15);color:#106ba3}.bp3-button.bp3-minimal.bp3-intent-primary.bp3-active,.bp3-button.bp3-minimal.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#106ba3}.bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled,.bp3-button.bp3-minimal.bp3-intent-primary:disabled{background:none;color:rgba(16,107,163,.5)}.bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button.bp3-minimal.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{stroke:#106ba3}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary{color:#48aff0}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:hover{background:rgba(19,124,189,.2);color:#48aff0}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#48aff0}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled{background:none;color:rgba(72,175,240,.5)}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button.bp3-minimal.bp3-intent-success{color:#0d8050}.bp3-button.bp3-minimal.bp3-intent-success.bp3-active,.bp3-button.bp3-minimal.bp3-intent-success:active,.bp3-button.bp3-minimal.bp3-intent-success:hover{background:none;box-shadow:none;color:#0d8050}.bp3-button.bp3-minimal.bp3-intent-success:hover{background:rgba(15,153,96,.15);color:#0d8050}.bp3-button.bp3-minimal.bp3-intent-success.bp3-active,.bp3-button.bp3-minimal.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#0d8050}.bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled,.bp3-button.bp3-minimal.bp3-intent-success:disabled{background:none;color:rgba(13,128,80,.5)}.bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active,.bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button.bp3-minimal.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{stroke:#0d8050}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success{color:#3dcc91}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:hover{background:rgba(15,153,96,.2);color:#3dcc91}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#3dcc91}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled{background:none;color:rgba(61,204,145,.5)}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button.bp3-minimal.bp3-intent-warning{color:#bf7326}.bp3-button.bp3-minimal.bp3-intent-warning.bp3-active,.bp3-button.bp3-minimal.bp3-intent-warning:active,.bp3-button.bp3-minimal.bp3-intent-warning:hover{background:none;box-shadow:none;color:#bf7326}.bp3-button.bp3-minimal.bp3-intent-warning:hover{background:rgba(217,130,43,.15);color:#bf7326}.bp3-button.bp3-minimal.bp3-intent-warning.bp3-active,.bp3-button.bp3-minimal.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#bf7326}.bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled,.bp3-button.bp3-minimal.bp3-intent-warning:disabled{background:none;color:rgba(191,115,38,.5)}.bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button.bp3-minimal.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{stroke:#bf7326}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning{color:#ffb366}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:hover{background:rgba(217,130,43,.2);color:#ffb366}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#ffb366}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled{background:none;color:rgba(255,179,102,.5)}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button.bp3-minimal.bp3-intent-danger{color:#c23030}.bp3-button.bp3-minimal.bp3-intent-danger.bp3-active,.bp3-button.bp3-minimal.bp3-intent-danger:active,.bp3-button.bp3-minimal.bp3-intent-danger:hover{background:none;box-shadow:none;color:#c23030}.bp3-button.bp3-minimal.bp3-intent-danger:hover{background:rgba(219,55,55,.15);color:#c23030}.bp3-button.bp3-minimal.bp3-intent-danger.bp3-active,.bp3-button.bp3-minimal.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#c23030}.bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled,.bp3-button.bp3-minimal.bp3-intent-danger:disabled{background:none;color:rgba(194,48,48,.5)}.bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button.bp3-minimal.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{stroke:#c23030}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger{color:#ff7373}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:hover{background:rgba(219,55,55,.2);color:#ff7373}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#ff7373}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled{background:none;color:rgba(255,115,115,.5)}.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button.bp3-outlined{background:none;box-shadow:none;border:1px solid rgba(24,32,38,.2);box-sizing:border-box}.bp3-button.bp3-outlined:hover{background:rgba(167,182,194,.3);box-shadow:none;color:#182026;text-decoration:none}.bp3-button.bp3-outlined.bp3-active,.bp3-button.bp3-outlined:active{background:rgba(115,134,148,.3);box-shadow:none;color:#182026}.bp3-button.bp3-outlined.bp3-disabled,.bp3-button.bp3-outlined.bp3-disabled:hover,.bp3-button.bp3-outlined:disabled,.bp3-button.bp3-outlined:disabled:hover{background:none;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-button.bp3-outlined.bp3-disabled.bp3-active,.bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active,.bp3-button.bp3-outlined:disabled.bp3-active,.bp3-button.bp3-outlined:disabled:hover.bp3-active{background:rgba(115,134,148,.3)}.bp3-dark .bp3-button.bp3-outlined{background:none;box-shadow:none;color:inherit}.bp3-dark .bp3-button.bp3-outlined.bp3-active,.bp3-dark .bp3-button.bp3-outlined:active,.bp3-dark .bp3-button.bp3-outlined:hover{background:none;box-shadow:none}.bp3-dark .bp3-button.bp3-outlined:hover{background:rgba(138,155,168,.15)}.bp3-dark .bp3-button.bp3-outlined.bp3-active,.bp3-dark .bp3-button.bp3-outlined:active{background:rgba(138,155,168,.3);color:#f5f8fa}.bp3-dark .bp3-button.bp3-outlined.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover,.bp3-dark .bp3-button.bp3-outlined:disabled,.bp3-dark .bp3-button.bp3-outlined:disabled:hover{background:none;color:rgba(167,182,194,.6);cursor:not-allowed}.bp3-dark .bp3-button.bp3-outlined.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active,.bp3-dark .bp3-button.bp3-outlined:disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined:disabled:hover.bp3-active{background:rgba(138,155,168,.3)}.bp3-button.bp3-outlined.bp3-intent-primary{color:#106ba3}.bp3-button.bp3-outlined.bp3-intent-primary.bp3-active,.bp3-button.bp3-outlined.bp3-intent-primary:active,.bp3-button.bp3-outlined.bp3-intent-primary:hover{background:none;box-shadow:none;color:#106ba3}.bp3-button.bp3-outlined.bp3-intent-primary:hover{background:rgba(19,124,189,.15);color:#106ba3}.bp3-button.bp3-outlined.bp3-intent-primary.bp3-active,.bp3-button.bp3-outlined.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#106ba3}.bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-primary:disabled{background:none;color:rgba(16,107,163,.5)}.bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button.bp3-outlined.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{stroke:#106ba3}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{color:#48aff0}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:hover{background:rgba(19,124,189,.2);color:#48aff0}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#48aff0}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled{background:none;color:rgba(72,175,240,.5)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button.bp3-outlined.bp3-intent-success{color:#0d8050}.bp3-button.bp3-outlined.bp3-intent-success.bp3-active,.bp3-button.bp3-outlined.bp3-intent-success:active,.bp3-button.bp3-outlined.bp3-intent-success:hover{background:none;box-shadow:none;color:#0d8050}.bp3-button.bp3-outlined.bp3-intent-success:hover{background:rgba(15,153,96,.15);color:#0d8050}.bp3-button.bp3-outlined.bp3-intent-success.bp3-active,.bp3-button.bp3-outlined.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#0d8050}.bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-success:disabled{background:none;color:rgba(13,128,80,.5)}.bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active,.bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button.bp3-outlined.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{stroke:#0d8050}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{color:#3dcc91}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:hover{background:rgba(15,153,96,.2);color:#3dcc91}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#3dcc91}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled{background:none;color:rgba(61,204,145,.5)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button.bp3-outlined.bp3-intent-warning{color:#bf7326}.bp3-button.bp3-outlined.bp3-intent-warning.bp3-active,.bp3-button.bp3-outlined.bp3-intent-warning:active,.bp3-button.bp3-outlined.bp3-intent-warning:hover{background:none;box-shadow:none;color:#bf7326}.bp3-button.bp3-outlined.bp3-intent-warning:hover{background:rgba(217,130,43,.15);color:#bf7326}.bp3-button.bp3-outlined.bp3-intent-warning.bp3-active,.bp3-button.bp3-outlined.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#bf7326}.bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-warning:disabled{background:none;color:rgba(191,115,38,.5)}.bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button.bp3-outlined.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{stroke:#bf7326}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{color:#ffb366}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:hover{background:rgba(217,130,43,.2);color:#ffb366}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#ffb366}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled{background:none;color:rgba(255,179,102,.5)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button.bp3-outlined.bp3-intent-danger{color:#c23030}.bp3-button.bp3-outlined.bp3-intent-danger.bp3-active,.bp3-button.bp3-outlined.bp3-intent-danger:active,.bp3-button.bp3-outlined.bp3-intent-danger:hover{background:none;box-shadow:none;color:#c23030}.bp3-button.bp3-outlined.bp3-intent-danger:hover{background:rgba(219,55,55,.15);color:#c23030}.bp3-button.bp3-outlined.bp3-intent-danger.bp3-active,.bp3-button.bp3-outlined.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#c23030}.bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-danger:disabled{background:none;color:rgba(194,48,48,.5)}.bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button.bp3-outlined.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{stroke:#c23030}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{color:#ff7373}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:hover{background:rgba(219,55,55,.2);color:#ff7373}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#ff7373}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled{background:none;color:rgba(255,115,115,.5)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button.bp3-outlined.bp3-disabled,.bp3-button.bp3-outlined.bp3-disabled:hover,.bp3-button.bp3-outlined:disabled,.bp3-button.bp3-outlined:disabled:hover{border-color:rgba(92,112,128,.1)}.bp3-dark .bp3-button.bp3-outlined{border-color:hsla(0,0%,100%,.4)}.bp3-dark .bp3-button.bp3-outlined.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover,.bp3-dark .bp3-button.bp3-outlined:disabled,.bp3-dark .bp3-button.bp3-outlined:disabled:hover{border-color:hsla(0,0%,100%,.2)}.bp3-button.bp3-outlined.bp3-intent-primary{border-color:rgba(16,107,163,.6)}.bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-primary:disabled{border-color:rgba(16,107,163,.2)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{border-color:rgba(72,175,240,.6)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled{border-color:rgba(72,175,240,.2)}.bp3-button.bp3-outlined.bp3-intent-success{border-color:rgba(13,128,80,.6)}.bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-success:disabled{border-color:rgba(13,128,80,.2)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{border-color:rgba(61,204,145,.6)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled{border-color:rgba(61,204,145,.2)}.bp3-button.bp3-outlined.bp3-intent-warning{border-color:rgba(191,115,38,.6)}.bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-warning:disabled{border-color:rgba(191,115,38,.2)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{border-color:rgba(255,179,102,.6)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled{border-color:rgba(255,179,102,.2)}.bp3-button.bp3-outlined.bp3-intent-danger{border-color:rgba(194,48,48,.6)}.bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled,.bp3-button.bp3-outlined.bp3-intent-danger:disabled{border-color:rgba(194,48,48,.2)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{border-color:rgba(255,115,115,.6)}.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled{border-color:rgba(255,115,115,.2)}a.bp3-button{text-align:center;text-decoration:none;transition:none}a.bp3-button,a.bp3-button:active,a.bp3-button:hover{color:#182026}a.bp3-button.bp3-disabled{color:rgba(92,112,128,.6)}.bp3-button-text{flex:0 1 auto}.bp3-button-group.bp3-align-left .bp3-button-text,.bp3-button-group.bp3-align-right .bp3-button-text,.bp3-button.bp3-align-left .bp3-button-text,.bp3-button.bp3-align-right .bp3-button-text{flex:1 1 auto}.bp3-button-group{display:inline-flex}.bp3-button-group .bp3-button{flex:0 0 auto;position:relative;z-index:4}.bp3-button-group .bp3-button:focus{z-index:5}.bp3-button-group .bp3-button:hover{z-index:6}.bp3-button-group .bp3-button.bp3-active,.bp3-button-group .bp3-button:active{z-index:7}.bp3-button-group .bp3-button.bp3-disabled,.bp3-button-group .bp3-button:disabled{z-index:3}.bp3-button-group .bp3-button[class*=bp3-intent-]{z-index:9}.bp3-button-group .bp3-button[class*=bp3-intent-]:focus{z-index:10}.bp3-button-group .bp3-button[class*=bp3-intent-]:hover{z-index:11}.bp3-button-group .bp3-button[class*=bp3-intent-].bp3-active,.bp3-button-group .bp3-button[class*=bp3-intent-]:active{z-index:12}.bp3-button-group .bp3-button[class*=bp3-intent-].bp3-disabled,.bp3-button-group .bp3-button[class*=bp3-intent-]:disabled{z-index:8}.bp3-button-group:not(.bp3-minimal)>.bp3-button:not(:first-child),.bp3-button-group:not(.bp3-minimal)>.bp3-popover-wrapper:not(:first-child) .bp3-button{border-bottom-left-radius:0;border-top-left-radius:0}.bp3-button-group:not(.bp3-minimal)>.bp3-button:not(:last-child),.bp3-button-group:not(.bp3-minimal)>.bp3-popover-wrapper:not(:last-child) .bp3-button{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.bp3-button-group.bp3-minimal .bp3-button{background:none;box-shadow:none}.bp3-button-group.bp3-minimal .bp3-button:hover{background:rgba(167,182,194,.3);box-shadow:none;color:#182026;text-decoration:none}.bp3-button-group.bp3-minimal .bp3-button.bp3-active,.bp3-button-group.bp3-minimal .bp3-button:active{background:rgba(115,134,148,.3);box-shadow:none;color:#182026}.bp3-button-group.bp3-minimal .bp3-button.bp3-disabled,.bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover,.bp3-button-group.bp3-minimal .bp3-button:disabled,.bp3-button-group.bp3-minimal .bp3-button:disabled:hover{background:none;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active,.bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active{background:rgba(115,134,148,.3)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button{background:none;box-shadow:none;color:inherit}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover{background:none;box-shadow:none}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover{background:rgba(138,155,168,.15)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active{background:rgba(138,155,168,.3);color:#f5f8fa}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover{background:none;color:rgba(167,182,194,.6);cursor:not-allowed}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active{background:rgba(138,155,168,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{color:#106ba3}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{background:none;box-shadow:none;color:#106ba3}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{background:rgba(19,124,189,.15);color:#106ba3}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#106ba3}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled{background:none;color:rgba(16,107,163,.5)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{stroke:#106ba3}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{color:#48aff0}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{background:rgba(19,124,189,.2);color:#48aff0}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#48aff0}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled{background:none;color:rgba(72,175,240,.5)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{color:#0d8050}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{background:none;box-shadow:none;color:#0d8050}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{background:rgba(15,153,96,.15);color:#0d8050}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#0d8050}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled{background:none;color:rgba(13,128,80,.5)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{stroke:#0d8050}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{color:#3dcc91}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{background:rgba(15,153,96,.2);color:#3dcc91}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#3dcc91}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled{background:none;color:rgba(61,204,145,.5)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{color:#bf7326}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{background:none;box-shadow:none;color:#bf7326}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{background:rgba(217,130,43,.15);color:#bf7326}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#bf7326}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled{background:none;color:rgba(191,115,38,.5)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{stroke:#bf7326}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{color:#ffb366}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{background:rgba(217,130,43,.2);color:#ffb366}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#ffb366}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled{background:none;color:rgba(255,179,102,.5)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{color:#c23030}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{background:none;box-shadow:none;color:#c23030}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{background:rgba(219,55,55,.15);color:#c23030}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#c23030}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled{background:none;color:rgba(194,48,48,.5)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{stroke:#c23030}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{color:#ff7373}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{background:rgba(219,55,55,.2);color:#ff7373}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#ff7373}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled{background:none;color:rgba(255,115,115,.5)}.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-button-group .bp3-popover-target,.bp3-button-group .bp3-popover-wrapper{display:flex;flex:1 1 auto}.bp3-button-group.bp3-fill{display:flex;width:100%}.bp3-button-group .bp3-button.bp3-fill,.bp3-button-group.bp3-fill .bp3-button:not(.bp3-fixed){flex:1 1 auto}.bp3-button-group.bp3-vertical{align-items:stretch;flex-direction:column;vertical-align:top}.bp3-button-group.bp3-vertical.bp3-fill{height:100%;width:unset}.bp3-button-group.bp3-vertical .bp3-button{margin-right:0!important;width:100%}.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-button:first-child,.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-popover-wrapper:first-child .bp3-button{border-radius:3px 3px 0 0}.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-button:last-child,.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-popover-wrapper:last-child .bp3-button{border-radius:0 0 3px 3px}.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-button:not(:last-child),.bp3-button-group.bp3-vertical:not(.bp3-minimal)>.bp3-popover-wrapper:not(:last-child) .bp3-button{margin-bottom:-1px}.bp3-button-group.bp3-align-left .bp3-button{text-align:left}.bp3-dark .bp3-button-group:not(.bp3-minimal)>.bp3-button:not(:last-child),.bp3-dark .bp3-button-group:not(.bp3-minimal)>.bp3-popover-wrapper:not(:last-child) .bp3-button{margin-right:1px}.bp3-dark .bp3-button-group.bp3-vertical>.bp3-button:not(:last-child),.bp3-dark .bp3-button-group.bp3-vertical>.bp3-popover-wrapper:not(:last-child) .bp3-button{margin-bottom:1px}.bp3-callout{font-size:14px;line-height:1.5;background-color:rgba(138,155,168,.15);border-radius:3px;padding:10px 12px 9px;position:relative;width:100%}.bp3-callout[class*=bp3-icon-]{padding-left:40px}.bp3-callout[class*=bp3-icon-]:before{font-family:Icons20,sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#5c7080;left:10px;position:absolute;top:10px}.bp3-callout.bp3-callout-icon{padding-left:40px}.bp3-callout.bp3-callout-icon>.bp3-icon:first-child{color:#5c7080;left:10px;position:absolute;top:10px}.bp3-callout .bp3-heading{line-height:20px;margin-bottom:5px;margin-top:0}.bp3-callout .bp3-heading:last-child{margin-bottom:0}.bp3-dark .bp3-callout{background-color:rgba(138,155,168,.2)}.bp3-dark .bp3-callout[class*=bp3-icon-]:before{color:#a7b6c2}.bp3-callout.bp3-intent-primary{background-color:rgba(19,124,189,.15)}.bp3-callout.bp3-intent-primary .bp3-heading,.bp3-callout.bp3-intent-primary>.bp3-icon:first-child,.bp3-callout.bp3-intent-primary[class*=bp3-icon-]:before{color:#106ba3}.bp3-dark .bp3-callout.bp3-intent-primary{background-color:rgba(19,124,189,.25)}.bp3-dark .bp3-callout.bp3-intent-primary .bp3-heading,.bp3-dark .bp3-callout.bp3-intent-primary>.bp3-icon:first-child,.bp3-dark .bp3-callout.bp3-intent-primary[class*=bp3-icon-]:before{color:#48aff0}.bp3-callout.bp3-intent-success{background-color:rgba(15,153,96,.15)}.bp3-callout.bp3-intent-success .bp3-heading,.bp3-callout.bp3-intent-success>.bp3-icon:first-child,.bp3-callout.bp3-intent-success[class*=bp3-icon-]:before{color:#0d8050}.bp3-dark .bp3-callout.bp3-intent-success{background-color:rgba(15,153,96,.25)}.bp3-dark .bp3-callout.bp3-intent-success .bp3-heading,.bp3-dark .bp3-callout.bp3-intent-success>.bp3-icon:first-child,.bp3-dark .bp3-callout.bp3-intent-success[class*=bp3-icon-]:before{color:#3dcc91}.bp3-callout.bp3-intent-warning{background-color:rgba(217,130,43,.15)}.bp3-callout.bp3-intent-warning .bp3-heading,.bp3-callout.bp3-intent-warning>.bp3-icon:first-child,.bp3-callout.bp3-intent-warning[class*=bp3-icon-]:before{color:#bf7326}.bp3-dark .bp3-callout.bp3-intent-warning{background-color:rgba(217,130,43,.25)}.bp3-dark .bp3-callout.bp3-intent-warning .bp3-heading,.bp3-dark .bp3-callout.bp3-intent-warning>.bp3-icon:first-child,.bp3-dark .bp3-callout.bp3-intent-warning[class*=bp3-icon-]:before{color:#ffb366}.bp3-callout.bp3-intent-danger{background-color:rgba(219,55,55,.15)}.bp3-callout.bp3-intent-danger .bp3-heading,.bp3-callout.bp3-intent-danger>.bp3-icon:first-child,.bp3-callout.bp3-intent-danger[class*=bp3-icon-]:before{color:#c23030}.bp3-dark .bp3-callout.bp3-intent-danger{background-color:rgba(219,55,55,.25)}.bp3-dark .bp3-callout.bp3-intent-danger .bp3-heading,.bp3-dark .bp3-callout.bp3-intent-danger>.bp3-icon:first-child,.bp3-dark .bp3-callout.bp3-intent-danger[class*=bp3-icon-]:before{color:#ff7373}.bp3-running-text .bp3-callout{margin:20px 0}.bp3-card{background-color:#fff;border-radius:3px;box-shadow:0 0 0 1px rgba(16,22,26,.15),0 0 0 rgba(16,22,26,0),0 0 0 rgba(16,22,26,0);padding:20px;transition:transform .2s cubic-bezier(.4,1,.75,.9),box-shadow .2s cubic-bezier(.4,1,.75,.9)}.bp3-card.bp3-dark,.bp3-dark .bp3-card{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4),0 0 0 rgba(16,22,26,0),0 0 0 rgba(16,22,26,0)}.bp3-elevation-0{box-shadow:0 0 0 1px rgba(16,22,26,.15),0 0 0 rgba(16,22,26,0),0 0 0 rgba(16,22,26,0)}.bp3-dark .bp3-elevation-0,.bp3-elevation-0.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.4),0 0 0 rgba(16,22,26,0),0 0 0 rgba(16,22,26,0)}.bp3-elevation-1{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.2)}.bp3-dark .bp3-elevation-1,.bp3-elevation-1.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.4)}.bp3-elevation-2{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 1px 1px rgba(16,22,26,.2),0 2px 6px rgba(16,22,26,.2)}.bp3-dark .bp3-elevation-2,.bp3-elevation-2.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 1px 1px rgba(16,22,26,.4),0 2px 6px rgba(16,22,26,.4)}.bp3-elevation-3{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2)}.bp3-dark .bp3-elevation-3,.bp3-elevation-3.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-elevation-4{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 4px 8px rgba(16,22,26,.2),0 18px 46px 6px rgba(16,22,26,.2)}.bp3-dark .bp3-elevation-4,.bp3-elevation-4.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 4px 8px rgba(16,22,26,.4),0 18px 46px 6px rgba(16,22,26,.4)}.bp3-card.bp3-interactive:hover{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2);cursor:pointer}.bp3-card.bp3-interactive:hover.bp3-dark,.bp3-dark .bp3-card.bp3-interactive:hover{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-card.bp3-interactive:active{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.2);opacity:.9;transition-duration:0}.bp3-card.bp3-interactive:active.bp3-dark,.bp3-dark .bp3-card.bp3-interactive:active{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.4)}.bp3-collapse{height:0;overflow-y:hidden;transition:height .2s cubic-bezier(.4,1,.75,.9)}.bp3-collapse .bp3-collapse-body{transition:transform .2s cubic-bezier(.4,1,.75,.9)}.bp3-collapse .bp3-collapse-body[aria-hidden=true]{display:none}.bp3-context-menu .bp3-popover-target{display:block}.bp3-context-menu-popover-target{position:fixed}.bp3-dialog-container{opacity:1;transform:scale(1);align-items:center;display:flex;justify-content:center;min-height:100%;pointer-events:none;-webkit-user-select:none;user-select:none;width:100%}.bp3-dialog-container.bp3-overlay-appear>.bp3-dialog,.bp3-dialog-container.bp3-overlay-enter>.bp3-dialog{opacity:0;transform:scale(.5)}.bp3-dialog-container.bp3-overlay-appear-active>.bp3-dialog,.bp3-dialog-container.bp3-overlay-enter-active>.bp3-dialog{opacity:1;transform:scale(1);transition-delay:0;transition-duration:.3s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-dialog-container.bp3-overlay-exit>.bp3-dialog{opacity:1;transform:scale(1)}.bp3-dialog-container.bp3-overlay-exit-active>.bp3-dialog{opacity:0;transform:scale(.5);transition-delay:0;transition-duration:.3s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-dialog{background:#ebf1f5;border-radius:6px;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 4px 8px rgba(16,22,26,.2),0 18px 46px 6px rgba(16,22,26,.2);display:flex;flex-direction:column;margin:30px 0;padding-bottom:20px;pointer-events:all;-webkit-user-select:text;user-select:text;width:500px}.bp3-dialog:focus{outline:0}.bp3-dark .bp3-dialog,.bp3-dialog.bp3-dark{background:#293742;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 4px 8px rgba(16,22,26,.4),0 18px 46px 6px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dialog-header{align-items:center;background:#fff;border-radius:6px 6px 0 0;box-shadow:0 1px 0 rgba(16,22,26,.15);display:flex;flex:0 0 auto;min-height:40px;padding-left:20px;padding-right:5px}.bp3-dialog-header .bp3-icon,.bp3-dialog-header .bp3-icon-large{color:#5c7080;flex:0 0 auto;margin-right:10px}.bp3-dialog-header .bp3-heading{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;flex:1 1 auto;line-height:inherit;margin:0}.bp3-dialog-header .bp3-heading:last-child{margin-right:20px}.bp3-dark .bp3-dialog-header{background:#30404d;box-shadow:0 1px 0 rgba(16,22,26,.4)}.bp3-dark .bp3-dialog-header .bp3-icon,.bp3-dark .bp3-dialog-header .bp3-icon-large{color:#a7b6c2}.bp3-dialog-body{flex:1 1 auto;line-height:18px;margin:20px}.bp3-dialog-footer{flex:0 0 auto;margin:0 20px}.bp3-dialog-footer-actions{display:flex;justify-content:flex-end}.bp3-dialog-footer-actions .bp3-button{margin-left:10px}.bp3-drawer{background:#fff;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 4px 8px rgba(16,22,26,.2),0 18px 46px 6px rgba(16,22,26,.2);display:flex;flex-direction:column;margin:0;padding:0}.bp3-drawer:focus{outline:0}.bp3-drawer.bp3-position-top{height:50%;left:0;right:0;top:0}.bp3-drawer.bp3-position-top.bp3-overlay-appear,.bp3-drawer.bp3-position-top.bp3-overlay-enter{transform:translateY(-100%)}.bp3-drawer.bp3-position-top.bp3-overlay-appear-active,.bp3-drawer.bp3-position-top.bp3-overlay-enter-active{transform:translateY(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-top.bp3-overlay-exit{transform:translateY(0)}.bp3-drawer.bp3-position-top.bp3-overlay-exit-active{transform:translateY(-100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-bottom{bottom:0;height:50%;left:0;right:0}.bp3-drawer.bp3-position-bottom.bp3-overlay-appear,.bp3-drawer.bp3-position-bottom.bp3-overlay-enter{transform:translateY(100%)}.bp3-drawer.bp3-position-bottom.bp3-overlay-appear-active,.bp3-drawer.bp3-position-bottom.bp3-overlay-enter-active{transform:translateY(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-bottom.bp3-overlay-exit{transform:translateY(0)}.bp3-drawer.bp3-position-bottom.bp3-overlay-exit-active{transform:translateY(100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-left{bottom:0;left:0;top:0;width:50%}.bp3-drawer.bp3-position-left.bp3-overlay-appear,.bp3-drawer.bp3-position-left.bp3-overlay-enter{transform:translateX(-100%)}.bp3-drawer.bp3-position-left.bp3-overlay-appear-active,.bp3-drawer.bp3-position-left.bp3-overlay-enter-active{transform:translateX(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-left.bp3-overlay-exit{transform:translateX(0)}.bp3-drawer.bp3-position-left.bp3-overlay-exit-active{transform:translateX(-100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-right{bottom:0;right:0;top:0;width:50%}.bp3-drawer.bp3-position-right.bp3-overlay-appear,.bp3-drawer.bp3-position-right.bp3-overlay-enter{transform:translateX(100%)}.bp3-drawer.bp3-position-right.bp3-overlay-appear-active,.bp3-drawer.bp3-position-right.bp3-overlay-enter-active{transform:translateX(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer.bp3-position-right.bp3-overlay-exit{transform:translateX(0)}.bp3-drawer.bp3-position-right.bp3-overlay-exit-active{transform:translateX(100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical){bottom:0;right:0;top:0;width:50%}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-appear,.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-enter{transform:translateX(100%)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-appear-active,.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-enter-active{transform:translateX(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-exit{transform:translateX(0)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right):not(.bp3-vertical).bp3-overlay-exit-active{transform:translateX(100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical{bottom:0;height:50%;left:0;right:0}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-appear,.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-enter{transform:translateY(100%)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-appear-active,.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-enter-active{transform:translateY(0);transition-delay:0;transition-duration:.2s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-exit{transform:translateY(0)}.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(.bp3-position-right).bp3-vertical.bp3-overlay-exit-active{transform:translateY(100%);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-dark .bp3-drawer,.bp3-drawer.bp3-dark{background:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 4px 8px rgba(16,22,26,.4),0 18px 46px 6px rgba(16,22,26,.4);color:#f5f8fa}.bp3-drawer-header{align-items:center;border-radius:0;box-shadow:0 1px 0 rgba(16,22,26,.15);display:flex;flex:0 0 auto;min-height:40px;padding:5px 5px 5px 20px;position:relative}.bp3-drawer-header .bp3-icon,.bp3-drawer-header .bp3-icon-large{color:#5c7080;flex:0 0 auto;margin-right:10px}.bp3-drawer-header .bp3-heading{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;flex:1 1 auto;line-height:inherit;margin:0}.bp3-drawer-header .bp3-heading:last-child{margin-right:20px}.bp3-dark .bp3-drawer-header{box-shadow:0 1px 0 rgba(16,22,26,.4)}.bp3-dark .bp3-drawer-header .bp3-icon,.bp3-dark .bp3-drawer-header .bp3-icon-large{color:#a7b6c2}.bp3-drawer-body{flex:1 1 auto;line-height:18px;overflow:auto}.bp3-drawer-footer{box-shadow:inset 0 1px 0 rgba(16,22,26,.15);flex:0 0 auto;padding:10px 20px;position:relative}.bp3-dark .bp3-drawer-footer{box-shadow:inset 0 1px 0 rgba(16,22,26,.4)}.bp3-editable-text{cursor:text;display:inline-block;max-width:100%;position:relative;vertical-align:top;white-space:nowrap}.bp3-editable-text:before{bottom:-3px;left:-3px;position:absolute;right:-3px;top:-3px;border-radius:3px;content:"";transition:background-color .1s cubic-bezier(.4,1,.75,.9),box-shadow .1s cubic-bezier(.4,1,.75,.9)}.bp3-editable-text:hover:before{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.15)}.bp3-editable-text.bp3-editable-text-editing:before{background-color:#fff;box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-editable-text.bp3-disabled:before{box-shadow:none}.bp3-editable-text.bp3-intent-primary .bp3-editable-text-content,.bp3-editable-text.bp3-intent-primary .bp3-editable-text-input{color:#137cbd}.bp3-editable-text.bp3-intent-primary:hover:before{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(19,124,189,.4)}.bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-editable-text.bp3-intent-success .bp3-editable-text-content,.bp3-editable-text.bp3-intent-success .bp3-editable-text-input{color:#0f9960}.bp3-editable-text.bp3-intent-success:hover:before{box-shadow:0 0 0 0 rgba(15,153,96,0),0 0 0 0 rgba(15,153,96,0),inset 0 0 0 1px rgba(15,153,96,.4)}.bp3-editable-text.bp3-intent-success.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #0f9960,0 0 0 3px rgba(15,153,96,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-editable-text.bp3-intent-warning .bp3-editable-text-content,.bp3-editable-text.bp3-intent-warning .bp3-editable-text-input{color:#d9822b}.bp3-editable-text.bp3-intent-warning:hover:before{box-shadow:0 0 0 0 rgba(217,130,43,0),0 0 0 0 rgba(217,130,43,0),inset 0 0 0 1px rgba(217,130,43,.4)}.bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #d9822b,0 0 0 3px rgba(217,130,43,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-editable-text.bp3-intent-danger .bp3-editable-text-content,.bp3-editable-text.bp3-intent-danger .bp3-editable-text-input{color:#db3737}.bp3-editable-text.bp3-intent-danger:hover:before{box-shadow:0 0 0 0 rgba(219,55,55,0),0 0 0 0 rgba(219,55,55,0),inset 0 0 0 1px rgba(219,55,55,.4)}.bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #db3737,0 0 0 3px rgba(219,55,55,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-dark .bp3-editable-text:hover:before{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px hsla(0,0%,100%,.15)}.bp3-dark .bp3-editable-text.bp3-editable-text-editing:before{background-color:rgba(16,22,26,.3);box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-editable-text.bp3-disabled:before{box-shadow:none}.bp3-dark .bp3-editable-text.bp3-intent-primary .bp3-editable-text-content{color:#48aff0}.bp3-dark .bp3-editable-text.bp3-intent-primary:hover:before{box-shadow:0 0 0 0 rgba(72,175,240,0),0 0 0 0 rgba(72,175,240,0),inset 0 0 0 1px rgba(72,175,240,.4)}.bp3-dark .bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #48aff0,0 0 0 3px rgba(72,175,240,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-editable-text.bp3-intent-success .bp3-editable-text-content{color:#3dcc91}.bp3-dark .bp3-editable-text.bp3-intent-success:hover:before{box-shadow:0 0 0 0 rgba(61,204,145,0),0 0 0 0 rgba(61,204,145,0),inset 0 0 0 1px rgba(61,204,145,.4)}.bp3-dark .bp3-editable-text.bp3-intent-success.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #3dcc91,0 0 0 3px rgba(61,204,145,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-editable-text.bp3-intent-warning .bp3-editable-text-content{color:#ffb366}.bp3-dark .bp3-editable-text.bp3-intent-warning:hover:before{box-shadow:0 0 0 0 rgba(255,179,102,0),0 0 0 0 rgba(255,179,102,0),inset 0 0 0 1px rgba(255,179,102,.4)}.bp3-dark .bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #ffb366,0 0 0 3px rgba(255,179,102,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-editable-text.bp3-intent-danger .bp3-editable-text-content{color:#ff7373}.bp3-dark .bp3-editable-text.bp3-intent-danger:hover:before{box-shadow:0 0 0 0 rgba(255,115,115,0),0 0 0 0 rgba(255,115,115,0),inset 0 0 0 1px rgba(255,115,115,.4)}.bp3-dark .bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing:before{box-shadow:0 0 0 1px #ff7373,0 0 0 3px rgba(255,115,115,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-editable-text-content,.bp3-editable-text-input{color:inherit;display:inherit;font:inherit;letter-spacing:inherit;max-width:inherit;min-width:inherit;position:relative;resize:none;text-transform:inherit;vertical-align:top}.bp3-editable-text-input{background:none;border:none;box-shadow:none;padding:0;white-space:pre-wrap;width:100%}.bp3-editable-text-input::-webkit-input-placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-editable-text-input::placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-editable-text-input:focus{outline:none}.bp3-editable-text-input::-ms-clear{display:none}.bp3-editable-text-content{overflow:hidden;padding-right:2px;text-overflow:ellipsis;white-space:pre}.bp3-editable-text-editing>.bp3-editable-text-content{left:0;position:absolute;visibility:hidden}.bp3-editable-text-placeholder>.bp3-editable-text-content{color:rgba(92,112,128,.6)}.bp3-dark .bp3-editable-text-placeholder>.bp3-editable-text-content{color:rgba(167,182,194,.6)}.bp3-editable-text.bp3-multiline{display:block}.bp3-editable-text.bp3-multiline .bp3-editable-text-content{overflow:auto;white-space:pre-wrap;word-wrap:break-word}.bp3-divider{border-bottom:1px solid rgba(16,22,26,.15);border-right:1px solid rgba(16,22,26,.15);margin:5px}.bp3-dark .bp3-divider{border-color:rgba(16,22,26,.4)}.bp3-control-group{transform:translateZ(0);display:flex;flex-direction:row;align-items:stretch}.bp3-control-group>*{flex-grow:0;flex-shrink:0}.bp3-control-group>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-control-group .bp3-button,.bp3-control-group .bp3-html-select,.bp3-control-group .bp3-input,.bp3-control-group .bp3-select{position:relative}.bp3-control-group .bp3-input{border-radius:inherit;z-index:2}.bp3-control-group .bp3-input:focus{border-radius:3px;z-index:14}.bp3-control-group .bp3-input[class*=bp3-intent]{z-index:13}.bp3-control-group .bp3-input[class*=bp3-intent]:focus{z-index:15}.bp3-control-group .bp3-input.bp3-disabled,.bp3-control-group .bp3-input:disabled,.bp3-control-group .bp3-input[readonly]{z-index:1}.bp3-control-group .bp3-input-group[class*=bp3-intent] .bp3-input{z-index:13}.bp3-control-group .bp3-input-group[class*=bp3-intent] .bp3-input:focus{z-index:15}.bp3-control-group .bp3-button,.bp3-control-group .bp3-html-select select,.bp3-control-group .bp3-select select{transform:translateZ(0);border-radius:inherit;z-index:4}.bp3-control-group .bp3-button:focus,.bp3-control-group .bp3-html-select select:focus,.bp3-control-group .bp3-select select:focus{z-index:5}.bp3-control-group .bp3-button:hover,.bp3-control-group .bp3-html-select select:hover,.bp3-control-group .bp3-select select:hover{z-index:6}.bp3-control-group .bp3-button:active,.bp3-control-group .bp3-html-select select:active,.bp3-control-group .bp3-select select:active{z-index:7}.bp3-control-group .bp3-button.bp3-disabled,.bp3-control-group .bp3-button:disabled,.bp3-control-group .bp3-button[readonly],.bp3-control-group .bp3-html-select select.bp3-disabled,.bp3-control-group .bp3-html-select select:disabled,.bp3-control-group .bp3-html-select select[readonly],.bp3-control-group .bp3-select select.bp3-disabled,.bp3-control-group .bp3-select select:disabled,.bp3-control-group .bp3-select select[readonly]{z-index:3}.bp3-control-group .bp3-button[class*=bp3-intent],.bp3-control-group .bp3-html-select select[class*=bp3-intent],.bp3-control-group .bp3-select select[class*=bp3-intent]{z-index:9}.bp3-control-group .bp3-button[class*=bp3-intent]:focus,.bp3-control-group .bp3-html-select select[class*=bp3-intent]:focus,.bp3-control-group .bp3-select select[class*=bp3-intent]:focus{z-index:10}.bp3-control-group .bp3-button[class*=bp3-intent]:hover,.bp3-control-group .bp3-html-select select[class*=bp3-intent]:hover,.bp3-control-group .bp3-select select[class*=bp3-intent]:hover{z-index:11}.bp3-control-group .bp3-button[class*=bp3-intent]:active,.bp3-control-group .bp3-html-select select[class*=bp3-intent]:active,.bp3-control-group .bp3-select select[class*=bp3-intent]:active{z-index:12}.bp3-control-group .bp3-button[class*=bp3-intent].bp3-disabled,.bp3-control-group .bp3-button[class*=bp3-intent]:disabled,.bp3-control-group .bp3-button[class*=bp3-intent][readonly],.bp3-control-group .bp3-html-select select[class*=bp3-intent].bp3-disabled,.bp3-control-group .bp3-html-select select[class*=bp3-intent]:disabled,.bp3-control-group .bp3-html-select select[class*=bp3-intent][readonly],.bp3-control-group .bp3-select select[class*=bp3-intent].bp3-disabled,.bp3-control-group .bp3-select select[class*=bp3-intent]:disabled,.bp3-control-group .bp3-select select[class*=bp3-intent][readonly]{z-index:8}.bp3-control-group .bp3-input-group>.bp3-button,.bp3-control-group .bp3-input-group>.bp3-icon,.bp3-control-group .bp3-input-group>.bp3-input-action{z-index:16}.bp3-control-group .bp3-html-select:after,.bp3-control-group .bp3-html-select>.bp3-icon,.bp3-control-group .bp3-select:after,.bp3-control-group .bp3-select>.bp3-icon{z-index:17}.bp3-control-group .bp3-select:focus-within{z-index:5}.bp3-control-group:not(.bp3-vertical)>:not(.bp3-divider){margin-right:-1px}.bp3-control-group:not(.bp3-vertical)>.bp3-divider:not(:first-child){margin-left:6px}.bp3-dark .bp3-control-group:not(.bp3-vertical)>:not(.bp3-divider){margin-right:0}.bp3-dark .bp3-control-group:not(.bp3-vertical)>.bp3-button+.bp3-button{margin-left:1px}.bp3-control-group .bp3-popover-target,.bp3-control-group .bp3-popover-wrapper{border-radius:inherit}.bp3-control-group>:first-child{border-radius:3px 0 0 3px}.bp3-control-group>:last-child{border-radius:0 3px 3px 0;margin-right:0}.bp3-control-group>:only-child{border-radius:3px;margin-right:0}.bp3-control-group .bp3-input-group .bp3-button{border-radius:3px}.bp3-control-group .bp3-numeric-input:not(:first-child) .bp3-input-group{border-bottom-left-radius:0;border-top-left-radius:0}.bp3-control-group.bp3-fill{width:100%}.bp3-control-group.bp3-fill>:not(.bp3-fixed),.bp3-control-group>.bp3-fill{flex:1 1 auto}.bp3-control-group.bp3-vertical{flex-direction:column}.bp3-control-group.bp3-vertical>*{margin-top:-1px}.bp3-control-group.bp3-vertical>:first-child{border-radius:3px 3px 0 0;margin-top:0}.bp3-control-group.bp3-vertical>:last-child{border-radius:0 0 3px 3px}.bp3-control{cursor:pointer;display:block;margin-bottom:10px;position:relative;text-transform:none}.bp3-control input:checked~.bp3-control-indicator{background-color:#137cbd;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-control:hover input:checked~.bp3-control-indicator{background-color:#106ba3;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-control input:not(:disabled):active:checked~.bp3-control-indicator{background:#0e5a8a;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-control input:disabled:checked~.bp3-control-indicator{background:rgba(19,124,189,.5);box-shadow:none}.bp3-dark .bp3-control input:checked~.bp3-control-indicator{box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control:hover input:checked~.bp3-control-indicator{background-color:#106ba3;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control input:not(:disabled):active:checked~.bp3-control-indicator{background-color:#0e5a8a;box-shadow:0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-control input:disabled:checked~.bp3-control-indicator{background:rgba(14,90,138,.5);box-shadow:none}.bp3-control:not(.bp3-align-right){padding-left:26px}.bp3-control:not(.bp3-align-right) .bp3-control-indicator{margin-left:-26px}.bp3-control.bp3-align-right{padding-right:26px}.bp3-control.bp3-align-right .bp3-control-indicator{margin-right:-26px}.bp3-control.bp3-disabled{color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-control.bp3-inline{display:inline-block;margin-right:20px}.bp3-control input{left:0;opacity:0;position:absolute;top:0;z-index:-1}.bp3-control .bp3-control-indicator{background-clip:padding-box;background-color:#f5f8fa;background-image:linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0));border:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1);cursor:pointer;display:inline-block;font-size:16px;height:1em;margin-right:10px;margin-top:-3px;position:relative;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1em}.bp3-control .bp3-control-indicator:before{content:"";display:block;height:1em;width:1em}.bp3-control:hover .bp3-control-indicator{background-color:#ebf1f5}.bp3-control input:not(:disabled):active~.bp3-control-indicator{background:#d8e1e8;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-control input:disabled~.bp3-control-indicator{background:rgba(206,217,224,.5);box-shadow:none;cursor:not-allowed}.bp3-control input:focus~.bp3-control-indicator{outline:2px auto rgba(19,124,189,.6);outline-offset:2px;-moz-outline-radius:6px}.bp3-control.bp3-align-right .bp3-control-indicator{float:right;margin-left:10px;margin-top:1px}.bp3-control.bp3-large{font-size:16px}.bp3-control.bp3-large:not(.bp3-align-right){padding-left:30px}.bp3-control.bp3-large:not(.bp3-align-right) .bp3-control-indicator{margin-left:-30px}.bp3-control.bp3-large.bp3-align-right{padding-right:30px}.bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{margin-right:-30px}.bp3-control.bp3-large .bp3-control-indicator{font-size:20px}.bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{margin-top:0}.bp3-control.bp3-checkbox input:indeterminate~.bp3-control-indicator{background-color:#137cbd;background-image:linear-gradient(180deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2);color:#fff}.bp3-control.bp3-checkbox:hover input:indeterminate~.bp3-control-indicator{background-color:#106ba3;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 -1px 0 rgba(16,22,26,.2)}.bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate~.bp3-control-indicator{background:#0e5a8a;box-shadow:inset 0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-control.bp3-checkbox input:disabled:indeterminate~.bp3-control-indicator{background:rgba(19,124,189,.5);box-shadow:none}.bp3-dark .bp3-control.bp3-checkbox input:indeterminate~.bp3-control-indicator{box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control.bp3-checkbox:hover input:indeterminate~.bp3-control-indicator{background-color:#106ba3;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate~.bp3-control-indicator{background-color:#0e5a8a;box-shadow:0 0 0 1px rgba(16,22,26,.4),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate~.bp3-control-indicator{background:rgba(14,90,138,.5);box-shadow:none}.bp3-control.bp3-checkbox .bp3-control-indicator{border-radius:3px}.bp3-control.bp3-checkbox input:checked~.bp3-control-indicator:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 5c-.28 0-.53.11-.71.29L7 9.59l-2.29-2.3a1.003 1.003 0 0 0-1.42 1.42l3 3c.18.18.43.29.71.29s.53-.11.71-.29l5-5A1.003 1.003 0 0 0 12 5z' fill='%23fff'/%3E%3C/svg%3E")}.bp3-control.bp3-checkbox input:indeterminate~.bp3-control-indicator:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 7H5c-.55 0-1 .45-1 1s.45 1 1 1h6c.55 0 1-.45 1-1s-.45-1-1-1z' fill='%23fff'/%3E%3C/svg%3E")}.bp3-control.bp3-radio .bp3-control-indicator{border-radius:50%}.bp3-control.bp3-radio input:checked~.bp3-control-indicator:before{background-image:radial-gradient(#fff,#fff 28%,transparent 32%)}.bp3-control.bp3-radio input:checked:disabled~.bp3-control-indicator:before{opacity:.5}.bp3-control.bp3-radio input:focus~.bp3-control-indicator{-moz-outline-radius:16px}.bp3-control.bp3-switch input~.bp3-control-indicator{background:rgba(167,182,194,.5)}.bp3-control.bp3-switch:hover input~.bp3-control-indicator{background:rgba(115,134,148,.5)}.bp3-control.bp3-switch input:not(:disabled):active~.bp3-control-indicator{background:rgba(92,112,128,.5)}.bp3-control.bp3-switch input:disabled~.bp3-control-indicator{background:rgba(206,217,224,.5)}.bp3-control.bp3-switch input:disabled~.bp3-control-indicator:before{background:hsla(0,0%,100%,.8)}.bp3-control.bp3-switch input:checked~.bp3-control-indicator{background:#137cbd}.bp3-control.bp3-switch:hover input:checked~.bp3-control-indicator{background:#106ba3}.bp3-control.bp3-switch input:checked:not(:disabled):active~.bp3-control-indicator{background:#0e5a8a}.bp3-control.bp3-switch input:checked:disabled~.bp3-control-indicator{background:rgba(19,124,189,.5)}.bp3-control.bp3-switch input:checked:disabled~.bp3-control-indicator:before{background:hsla(0,0%,100%,.8)}.bp3-control.bp3-switch:not(.bp3-align-right){padding-left:38px}.bp3-control.bp3-switch:not(.bp3-align-right) .bp3-control-indicator{margin-left:-38px}.bp3-control.bp3-switch.bp3-align-right{padding-right:38px}.bp3-control.bp3-switch.bp3-align-right .bp3-control-indicator{margin-right:-38px}.bp3-control.bp3-switch .bp3-control-indicator{border:none;border-radius:1.75em;box-shadow:none!important;min-width:1.75em;transition:background-color .1s cubic-bezier(.4,1,.75,.9);width:auto}.bp3-control.bp3-switch .bp3-control-indicator:before{background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 1px 1px rgba(16,22,26,.2);height:calc(1em - 4px);left:0;margin:2px;position:absolute;transition:left .1s cubic-bezier(.4,1,.75,.9);width:calc(1em - 4px)}.bp3-control.bp3-switch input:checked~.bp3-control-indicator:before{left:calc(100% - 1em)}.bp3-control.bp3-switch.bp3-large:not(.bp3-align-right){padding-left:45px}.bp3-control.bp3-switch.bp3-large:not(.bp3-align-right) .bp3-control-indicator{margin-left:-45px}.bp3-control.bp3-switch.bp3-large.bp3-align-right{padding-right:45px}.bp3-control.bp3-switch.bp3-large.bp3-align-right .bp3-control-indicator{margin-right:-45px}.bp3-dark .bp3-control.bp3-switch input~.bp3-control-indicator{background:rgba(16,22,26,.5)}.bp3-dark .bp3-control.bp3-switch:hover input~.bp3-control-indicator{background:rgba(16,22,26,.7)}.bp3-dark .bp3-control.bp3-switch input:not(:disabled):active~.bp3-control-indicator{background:rgba(16,22,26,.9)}.bp3-dark .bp3-control.bp3-switch input:disabled~.bp3-control-indicator{background:rgba(57,75,89,.5)}.bp3-dark .bp3-control.bp3-switch input:disabled~.bp3-control-indicator:before{background:rgba(16,22,26,.4)}.bp3-dark .bp3-control.bp3-switch input:checked~.bp3-control-indicator{background:#137cbd}.bp3-dark .bp3-control.bp3-switch:hover input:checked~.bp3-control-indicator{background:#106ba3}.bp3-dark .bp3-control.bp3-switch input:checked:not(:disabled):active~.bp3-control-indicator{background:#0e5a8a}.bp3-dark .bp3-control.bp3-switch input:checked:disabled~.bp3-control-indicator{background:rgba(14,90,138,.5)}.bp3-dark .bp3-control.bp3-switch input:checked:disabled~.bp3-control-indicator:before{background:rgba(16,22,26,.4)}.bp3-dark .bp3-control.bp3-switch .bp3-control-indicator:before{background:#394b59;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control.bp3-switch input:checked~.bp3-control-indicator:before{box-shadow:inset 0 0 0 1px rgba(16,22,26,.4)}.bp3-control.bp3-switch .bp3-switch-inner-text{font-size:.7em;text-align:center}.bp3-control.bp3-switch .bp3-control-indicator-child:first-child{line-height:0;margin-left:.5em;margin-right:1.2em;visibility:hidden}.bp3-control.bp3-switch .bp3-control-indicator-child:last-child{line-height:1em;margin-left:1.2em;margin-right:.5em;visibility:visible}.bp3-control.bp3-switch input:checked~.bp3-control-indicator .bp3-control-indicator-child:first-child{line-height:1em;visibility:visible}.bp3-control.bp3-switch input:checked~.bp3-control-indicator .bp3-control-indicator-child:last-child{line-height:0;visibility:hidden}.bp3-dark .bp3-control{color:#f5f8fa}.bp3-dark .bp3-control.bp3-disabled{color:rgba(167,182,194,.6)}.bp3-dark .bp3-control .bp3-control-indicator{background-color:#394b59;background-image:linear-gradient(180deg,hsla(0,0%,100%,.05),hsla(0,0%,100%,0));box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-control:hover .bp3-control-indicator{background-color:#30404d}.bp3-dark .bp3-control input:not(:disabled):active~.bp3-control-indicator{background:#202b33;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-control input:disabled~.bp3-control-indicator{background:rgba(57,75,89,.5);box-shadow:none;cursor:not-allowed}.bp3-dark .bp3-control.bp3-checkbox input:disabled:checked~.bp3-control-indicator,.bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate~.bp3-control-indicator{color:rgba(167,182,194,.6)}.bp3-file-input{cursor:pointer;display:inline-block;height:30px;position:relative}.bp3-file-input input{margin:0;min-width:200px;opacity:0}.bp3-file-input input.bp3-disabled+.bp3-file-upload-input,.bp3-file-input input:disabled+.bp3-file-upload-input{background:rgba(206,217,224,.5);box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;resize:none}.bp3-file-input input.bp3-disabled+.bp3-file-upload-input:after,.bp3-file-input input:disabled+.bp3-file-upload-input:after{background-color:rgba(206,217,224,.5);background-image:none;box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;outline:none}.bp3-file-input input.bp3-disabled+.bp3-file-upload-input:after.bp3-active,.bp3-file-input input.bp3-disabled+.bp3-file-upload-input:after.bp3-active:hover,.bp3-file-input input:disabled+.bp3-file-upload-input:after.bp3-active,.bp3-file-input input:disabled+.bp3-file-upload-input:after.bp3-active:hover{background:rgba(206,217,224,.7)}.bp3-dark .bp3-file-input input.bp3-disabled+.bp3-file-upload-input,.bp3-dark .bp3-file-input input:disabled+.bp3-file-upload-input{background:rgba(57,75,89,.5);box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-input input.bp3-disabled+.bp3-file-upload-input:after,.bp3-dark .bp3-file-input input:disabled+.bp3-file-upload-input:after{background-color:rgba(57,75,89,.5);background-image:none;box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-input input.bp3-disabled+.bp3-file-upload-input:after.bp3-active,.bp3-dark .bp3-file-input input:disabled+.bp3-file-upload-input:after.bp3-active{background:rgba(57,75,89,.7)}.bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{color:#182026}.bp3-dark .bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{color:#f5f8fa}.bp3-file-input.bp3-fill{width:100%}.bp3-file-input.bp3-large,.bp3-large .bp3-file-input{height:40px}.bp3-file-input .bp3-file-upload-input-custom-text:after{content:attr(bp3-button-text)}.bp3-file-upload-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff;border:none;border-radius:3px;box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2);color:#182026;font-size:14px;font-weight:400;height:30px;line-height:30px;outline:none;transition:box-shadow .1s cubic-bezier(.4,1,.75,.9);vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;color:rgba(92,112,128,.6);left:0;padding:0 80px 0 10px;position:absolute;right:0;top:0;-webkit-user-select:none;user-select:none}.bp3-file-upload-input::-webkit-input-placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-file-upload-input::placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-file-upload-input.bp3-active,.bp3-file-upload-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-file-upload-input.bp3-round,.bp3-file-upload-input[type=search]{border-radius:30px;box-sizing:border-box;padding-left:10px}.bp3-file-upload-input[readonly]{box-shadow:inset 0 0 0 1px rgba(16,22,26,.15)}.bp3-file-upload-input.bp3-disabled,.bp3-file-upload-input:disabled{background:rgba(206,217,224,.5);box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;resize:none}.bp3-file-upload-input:after{background-color:#f5f8fa;background-image:linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0));color:#182026;min-height:24px;min-width:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;border-radius:3px;content:"Browse";line-height:24px;margin:3px;position:absolute;right:0;text-align:center;top:0;width:70px}.bp3-file-upload-input:after:hover{background-clip:padding-box;background-color:#ebf1f5;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1)}.bp3-file-upload-input:after.bp3-active,.bp3-file-upload-input:after:active{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-file-upload-input:after.bp3-disabled,.bp3-file-upload-input:after:disabled{background-color:rgba(206,217,224,.5);background-image:none;box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;outline:none}.bp3-file-upload-input:after.bp3-disabled.bp3-active,.bp3-file-upload-input:after.bp3-disabled.bp3-active:hover,.bp3-file-upload-input:after:disabled.bp3-active,.bp3-file-upload-input:after:disabled.bp3-active:hover{background:rgba(206,217,224,.7)}.bp3-file-upload-input:hover:after{background-clip:padding-box;background-color:#ebf1f5;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1)}.bp3-file-upload-input:active:after{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-large .bp3-file-upload-input{font-size:16px;height:40px;line-height:40px;padding-right:95px}.bp3-large .bp3-file-upload-input.bp3-round,.bp3-large .bp3-file-upload-input[type=search]{padding:0 15px}.bp3-large .bp3-file-upload-input:after{min-height:30px;min-width:30px;line-height:30px;margin:5px;width:85px}.bp3-dark .bp3-file-upload-input{background:rgba(16,22,26,.3);box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4);color:#f5f8fa;color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-upload-input::-webkit-input-placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-upload-input::placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-upload-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-file-upload-input[readonly]{box-shadow:inset 0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-file-upload-input.bp3-disabled,.bp3-dark .bp3-file-upload-input:disabled{background:rgba(57,75,89,.5);box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-upload-input:after{background-color:#394b59;background-image:linear-gradient(180deg,hsla(0,0%,100%,.05),hsla(0,0%,100%,0));box-shadow:0 0 0 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark .bp3-file-upload-input:after.bp3-active,.bp3-dark .bp3-file-upload-input:after:active,.bp3-dark .bp3-file-upload-input:after:hover{color:#f5f8fa}.bp3-dark .bp3-file-upload-input:after:hover{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-file-upload-input:after.bp3-active,.bp3-dark .bp3-file-upload-input:after:active{background-color:#202b33;background-image:none;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-file-upload-input:after.bp3-disabled,.bp3-dark .bp3-file-upload-input:after:disabled{background-color:rgba(57,75,89,.5);background-image:none;box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-file-upload-input:after.bp3-disabled.bp3-active,.bp3-dark .bp3-file-upload-input:after:disabled.bp3-active{background:rgba(57,75,89,.7)}.bp3-dark .bp3-file-upload-input:after .bp3-button-spinner .bp3-spinner-head{background:rgba(16,22,26,.5);stroke:#8a9ba8}.bp3-dark .bp3-file-upload-input:hover:after{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-file-upload-input:active:after{background-color:#202b33;background-image:none;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-file-upload-input:after{box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1)}.bp3-form-group{display:flex;flex-direction:column;margin:0 0 15px}.bp3-form-group label.bp3-label{margin-bottom:5px}.bp3-form-group .bp3-control{margin-top:7px}.bp3-form-group .bp3-form-helper-text{color:#5c7080;font-size:12px;margin-top:5px}.bp3-form-group.bp3-intent-primary .bp3-form-helper-text{color:#106ba3}.bp3-form-group.bp3-intent-success .bp3-form-helper-text{color:#0d8050}.bp3-form-group.bp3-intent-warning .bp3-form-helper-text{color:#bf7326}.bp3-form-group.bp3-intent-danger .bp3-form-helper-text{color:#c23030}.bp3-form-group.bp3-inline{align-items:flex-start;flex-direction:row}.bp3-form-group.bp3-inline.bp3-large label.bp3-label{line-height:40px;margin:0 10px 0 0}.bp3-form-group.bp3-inline label.bp3-label{line-height:30px;margin:0 10px 0 0}.bp3-form-group.bp3-disabled .bp3-form-helper-text,.bp3-form-group.bp3-disabled .bp3-label,.bp3-form-group.bp3-disabled .bp3-text-muted{color:rgba(92,112,128,.6)!important}.bp3-dark .bp3-form-group.bp3-intent-primary .bp3-form-helper-text{color:#48aff0}.bp3-dark .bp3-form-group.bp3-intent-success .bp3-form-helper-text{color:#3dcc91}.bp3-dark .bp3-form-group.bp3-intent-warning .bp3-form-helper-text{color:#ffb366}.bp3-dark .bp3-form-group.bp3-intent-danger .bp3-form-helper-text{color:#ff7373}.bp3-dark .bp3-form-group .bp3-form-helper-text{color:#a7b6c2}.bp3-dark .bp3-form-group.bp3-disabled .bp3-form-helper-text,.bp3-dark .bp3-form-group.bp3-disabled .bp3-label,.bp3-dark .bp3-form-group.bp3-disabled .bp3-text-muted{color:rgba(167,182,194,.6)!important}.bp3-input-group{display:block;position:relative}.bp3-input-group .bp3-input{position:relative;width:100%}.bp3-input-group .bp3-input:not(:first-child){padding-left:30px}.bp3-input-group .bp3-input:not(:last-child){padding-right:30px}.bp3-input-group .bp3-input-action,.bp3-input-group>.bp3-button,.bp3-input-group>.bp3-icon,.bp3-input-group>.bp3-input-left-container{position:absolute;top:0}.bp3-input-group .bp3-input-action:first-child,.bp3-input-group>.bp3-button:first-child,.bp3-input-group>.bp3-icon:first-child,.bp3-input-group>.bp3-input-left-container:first-child{left:0}.bp3-input-group .bp3-input-action:last-child,.bp3-input-group>.bp3-button:last-child,.bp3-input-group>.bp3-icon:last-child,.bp3-input-group>.bp3-input-left-container:last-child{right:0}.bp3-input-group .bp3-button{min-height:24px;min-width:24px;margin:3px;padding:0 7px}.bp3-input-group .bp3-button:empty{padding:0}.bp3-input-group>.bp3-icon,.bp3-input-group>.bp3-input-left-container{z-index:1}.bp3-input-group>.bp3-icon,.bp3-input-group>.bp3-input-left-container>.bp3-icon{color:#5c7080}.bp3-input-group>.bp3-icon:empty,.bp3-input-group>.bp3-input-left-container>.bp3-icon:empty{font-family:Icons16,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.bp3-input-group .bp3-input-action>.bp3-spinner,.bp3-input-group>.bp3-icon,.bp3-input-group>.bp3-input-left-container>.bp3-icon{margin:7px}.bp3-input-group .bp3-tag{margin:5px}.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:not(:hover):not(:focus),.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){color:#5c7080}.bp3-dark .bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:not(:hover):not(:focus),.bp3-dark .bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){color:#a7b6c2}.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon,.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large,.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard{color:#5c7080}.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:disabled,.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:disabled .bp3-icon,.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:disabled .bp3-icon-large,.bp3-input-group .bp3-input:not(:focus)+.bp3-button.bp3-minimal:disabled .bp3-icon-standard,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:disabled,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-large,.bp3-input-group .bp3-input:not(:focus)+.bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-standard{color:rgba(92,112,128,.6)!important}.bp3-input-group.bp3-disabled{cursor:not-allowed}.bp3-input-group.bp3-disabled .bp3-icon{color:rgba(92,112,128,.6)}.bp3-input-group.bp3-large .bp3-button{min-height:30px;min-width:30px;margin:5px}.bp3-input-group.bp3-large .bp3-input-action>.bp3-spinner,.bp3-input-group.bp3-large>.bp3-icon,.bp3-input-group.bp3-large>.bp3-input-left-container>.bp3-icon{margin:12px}.bp3-input-group.bp3-large .bp3-input{font-size:16px;height:40px;line-height:40px}.bp3-input-group.bp3-large .bp3-input.bp3-round,.bp3-input-group.bp3-large .bp3-input[type=search]{padding:0 15px}.bp3-input-group.bp3-large .bp3-input:not(:first-child){padding-left:40px}.bp3-input-group.bp3-large .bp3-input:not(:last-child){padding-right:40px}.bp3-input-group.bp3-small .bp3-button,.bp3-input-group.bp3-small .bp3-tag{min-height:20px;min-width:20px;margin:2px}.bp3-input-group.bp3-small .bp3-input-action>.bp3-spinner,.bp3-input-group.bp3-small>.bp3-icon,.bp3-input-group.bp3-small>.bp3-input-left-container>.bp3-icon{margin:4px}.bp3-input-group.bp3-small .bp3-input{font-size:12px;height:24px;line-height:24px;padding-left:8px;padding-right:8px}.bp3-input-group.bp3-small .bp3-input.bp3-round,.bp3-input-group.bp3-small .bp3-input[type=search]{padding:0 12px}.bp3-input-group.bp3-small .bp3-input:not(:first-child){padding-left:24px}.bp3-input-group.bp3-small .bp3-input:not(:last-child){padding-right:24px}.bp3-input-group.bp3-fill{flex:1 1 auto;width:100%}.bp3-input-group.bp3-round .bp3-button,.bp3-input-group.bp3-round .bp3-input,.bp3-input-group.bp3-round .bp3-tag{border-radius:30px}.bp3-dark .bp3-input-group .bp3-icon{color:#a7b6c2}.bp3-dark .bp3-input-group.bp3-disabled .bp3-icon{color:rgba(167,182,194,.6)}.bp3-input-group.bp3-intent-primary .bp3-input{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px #137cbd,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-primary .bp3-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-primary .bp3-input[readonly]{box-shadow:inset 0 0 0 1px #137cbd}.bp3-input-group.bp3-intent-primary .bp3-input.bp3-disabled,.bp3-input-group.bp3-intent-primary .bp3-input:disabled{box-shadow:none}.bp3-input-group.bp3-intent-primary>.bp3-icon{color:#106ba3}.bp3-dark .bp3-input-group.bp3-intent-primary>.bp3-icon{color:#48aff0}.bp3-input-group.bp3-intent-success .bp3-input{box-shadow:0 0 0 0 rgba(15,153,96,0),0 0 0 0 rgba(15,153,96,0),inset 0 0 0 1px #0f9960,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-success .bp3-input:focus{box-shadow:0 0 0 1px #0f9960,0 0 0 3px rgba(15,153,96,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-success .bp3-input[readonly]{box-shadow:inset 0 0 0 1px #0f9960}.bp3-input-group.bp3-intent-success .bp3-input.bp3-disabled,.bp3-input-group.bp3-intent-success .bp3-input:disabled{box-shadow:none}.bp3-input-group.bp3-intent-success>.bp3-icon{color:#0d8050}.bp3-dark .bp3-input-group.bp3-intent-success>.bp3-icon{color:#3dcc91}.bp3-input-group.bp3-intent-warning .bp3-input{box-shadow:0 0 0 0 rgba(217,130,43,0),0 0 0 0 rgba(217,130,43,0),inset 0 0 0 1px #d9822b,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-warning .bp3-input:focus{box-shadow:0 0 0 1px #d9822b,0 0 0 3px rgba(217,130,43,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-warning .bp3-input[readonly]{box-shadow:inset 0 0 0 1px #d9822b}.bp3-input-group.bp3-intent-warning .bp3-input.bp3-disabled,.bp3-input-group.bp3-intent-warning .bp3-input:disabled{box-shadow:none}.bp3-input-group.bp3-intent-warning>.bp3-icon{color:#bf7326}.bp3-dark .bp3-input-group.bp3-intent-warning>.bp3-icon{color:#ffb366}.bp3-input-group.bp3-intent-danger .bp3-input{box-shadow:0 0 0 0 rgba(219,55,55,0),0 0 0 0 rgba(219,55,55,0),inset 0 0 0 1px #db3737,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-danger .bp3-input:focus{box-shadow:0 0 0 1px #db3737,0 0 0 3px rgba(219,55,55,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input-group.bp3-intent-danger .bp3-input[readonly]{box-shadow:inset 0 0 0 1px #db3737}.bp3-input-group.bp3-intent-danger .bp3-input.bp3-disabled,.bp3-input-group.bp3-intent-danger .bp3-input:disabled{box-shadow:none}.bp3-input-group.bp3-intent-danger>.bp3-icon{color:#c23030}.bp3-dark .bp3-input-group.bp3-intent-danger>.bp3-icon{color:#ff7373}.bp3-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff;border:none;border-radius:3px;box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2);color:#182026;font-size:14px;font-weight:400;height:30px;line-height:30px;outline:none;padding:0 10px;transition:box-shadow .1s cubic-bezier(.4,1,.75,.9);vertical-align:middle}.bp3-input::-webkit-input-placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-input::placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-input.bp3-active,.bp3-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-round,.bp3-input[type=search]{border-radius:30px;box-sizing:border-box;padding-left:10px}.bp3-input[readonly]{box-shadow:inset 0 0 0 1px rgba(16,22,26,.15)}.bp3-input.bp3-disabled,.bp3-input:disabled{background:rgba(206,217,224,.5);box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;resize:none}.bp3-input.bp3-large{font-size:16px;height:40px;line-height:40px}.bp3-input.bp3-large.bp3-round,.bp3-input.bp3-large[type=search]{padding:0 15px}.bp3-input.bp3-small{font-size:12px;height:24px;line-height:24px;padding-left:8px;padding-right:8px}.bp3-input.bp3-small.bp3-round,.bp3-input.bp3-small[type=search]{padding:0 12px}.bp3-input.bp3-fill{flex:1 1 auto;width:100%}.bp3-dark .bp3-input{background:rgba(16,22,26,.3);box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark .bp3-input::-webkit-input-placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-input::placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input[readonly]{box-shadow:inset 0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-disabled,.bp3-dark .bp3-input:disabled{background:rgba(57,75,89,.5);box-shadow:none;color:rgba(167,182,194,.6)}.bp3-input.bp3-intent-primary{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px #137cbd,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-primary:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-primary[readonly]{box-shadow:inset 0 0 0 1px #137cbd}.bp3-input.bp3-intent-primary.bp3-disabled,.bp3-input.bp3-intent-primary:disabled{box-shadow:none}.bp3-dark .bp3-input.bp3-intent-primary{box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px #137cbd,inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-primary:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-primary[readonly]{box-shadow:inset 0 0 0 1px #137cbd}.bp3-dark .bp3-input.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-input.bp3-intent-primary:disabled{box-shadow:none}.bp3-input.bp3-intent-success{box-shadow:0 0 0 0 rgba(15,153,96,0),0 0 0 0 rgba(15,153,96,0),inset 0 0 0 1px #0f9960,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-success:focus{box-shadow:0 0 0 1px #0f9960,0 0 0 3px rgba(15,153,96,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-success[readonly]{box-shadow:inset 0 0 0 1px #0f9960}.bp3-input.bp3-intent-success.bp3-disabled,.bp3-input.bp3-intent-success:disabled{box-shadow:none}.bp3-dark .bp3-input.bp3-intent-success{box-shadow:0 0 0 0 rgba(15,153,96,0),0 0 0 0 rgba(15,153,96,0),0 0 0 0 rgba(15,153,96,0),inset 0 0 0 1px #0f9960,inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-success:focus{box-shadow:0 0 0 1px #0f9960,0 0 0 1px #0f9960,0 0 0 3px rgba(15,153,96,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-success[readonly]{box-shadow:inset 0 0 0 1px #0f9960}.bp3-dark .bp3-input.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-input.bp3-intent-success:disabled{box-shadow:none}.bp3-input.bp3-intent-warning{box-shadow:0 0 0 0 rgba(217,130,43,0),0 0 0 0 rgba(217,130,43,0),inset 0 0 0 1px #d9822b,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-warning:focus{box-shadow:0 0 0 1px #d9822b,0 0 0 3px rgba(217,130,43,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-warning[readonly]{box-shadow:inset 0 0 0 1px #d9822b}.bp3-input.bp3-intent-warning.bp3-disabled,.bp3-input.bp3-intent-warning:disabled{box-shadow:none}.bp3-dark .bp3-input.bp3-intent-warning{box-shadow:0 0 0 0 rgba(217,130,43,0),0 0 0 0 rgba(217,130,43,0),0 0 0 0 rgba(217,130,43,0),inset 0 0 0 1px #d9822b,inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-warning:focus{box-shadow:0 0 0 1px #d9822b,0 0 0 1px #d9822b,0 0 0 3px rgba(217,130,43,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-warning[readonly]{box-shadow:inset 0 0 0 1px #d9822b}.bp3-dark .bp3-input.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-input.bp3-intent-warning:disabled{box-shadow:none}.bp3-input.bp3-intent-danger{box-shadow:0 0 0 0 rgba(219,55,55,0),0 0 0 0 rgba(219,55,55,0),inset 0 0 0 1px #db3737,inset 0 0 0 1px rgba(16,22,26,.15),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-danger:focus{box-shadow:0 0 0 1px #db3737,0 0 0 3px rgba(219,55,55,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-input.bp3-intent-danger[readonly]{box-shadow:inset 0 0 0 1px #db3737}.bp3-input.bp3-intent-danger.bp3-disabled,.bp3-input.bp3-intent-danger:disabled{box-shadow:none}.bp3-dark .bp3-input.bp3-intent-danger{box-shadow:0 0 0 0 rgba(219,55,55,0),0 0 0 0 rgba(219,55,55,0),0 0 0 0 rgba(219,55,55,0),inset 0 0 0 1px #db3737,inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-danger:focus{box-shadow:0 0 0 1px #db3737,0 0 0 1px #db3737,0 0 0 3px rgba(219,55,55,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-input.bp3-intent-danger[readonly]{box-shadow:inset 0 0 0 1px #db3737}.bp3-dark .bp3-input.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-input.bp3-intent-danger:disabled{box-shadow:none}.bp3-input::-ms-clear{display:none}textarea.bp3-input{max-width:100%;padding:10px}textarea.bp3-input,textarea.bp3-input.bp3-large,textarea.bp3-input.bp3-small{height:auto;line-height:inherit}textarea.bp3-input.bp3-small{padding:8px}.bp3-dark textarea.bp3-input{background:rgba(16,22,26,.3);box-shadow:0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),0 0 0 0 rgba(19,124,189,0),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark textarea.bp3-input::-webkit-input-placeholder{color:rgba(167,182,194,.6)}.bp3-dark textarea.bp3-input::placeholder{color:rgba(167,182,194,.6)}.bp3-dark textarea.bp3-input:focus{box-shadow:0 0 0 1px #137cbd,0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark textarea.bp3-input[readonly]{box-shadow:inset 0 0 0 1px rgba(16,22,26,.4)}.bp3-dark textarea.bp3-input.bp3-disabled,.bp3-dark textarea.bp3-input:disabled{background:rgba(57,75,89,.5);box-shadow:none;color:rgba(167,182,194,.6)}label.bp3-label{display:block;margin-bottom:15px;margin-top:0}label.bp3-label .bp3-html-select,label.bp3-label .bp3-input,label.bp3-label .bp3-popover-wrapper,label.bp3-label .bp3-select,label.bp3-label .bp3-slider{display:block;margin-top:5px;text-transform:none}label.bp3-label .bp3-button-group{margin-top:5px}label.bp3-label .bp3-html-select select,label.bp3-label .bp3-select select{font-weight:400;vertical-align:top;width:100%}label.bp3-label.bp3-disabled,label.bp3-label.bp3-disabled .bp3-text-muted{color:rgba(92,112,128,.6)}label.bp3-label.bp3-inline{line-height:30px}label.bp3-label.bp3-inline .bp3-html-select,label.bp3-label.bp3-inline .bp3-input,label.bp3-label.bp3-inline .bp3-input-group,label.bp3-label.bp3-inline .bp3-popover-wrapper,label.bp3-label.bp3-inline .bp3-select{display:inline-block;margin:0 0 0 5px;vertical-align:top}label.bp3-label.bp3-inline .bp3-button-group{margin:0 0 0 5px}label.bp3-label.bp3-inline .bp3-input-group .bp3-input{margin-left:0}label.bp3-label.bp3-inline.bp3-large{line-height:40px}label.bp3-label:not(.bp3-inline) .bp3-popover-target{display:block}.bp3-dark label.bp3-label{color:#f5f8fa}.bp3-dark label.bp3-label.bp3-disabled,.bp3-dark label.bp3-label.bp3-disabled .bp3-text-muted{color:rgba(167,182,194,.6)}.bp3-numeric-input .bp3-button-group.bp3-vertical>.bp3-button{flex:1 1 14px;min-height:0;padding:0;width:30px}.bp3-numeric-input .bp3-button-group.bp3-vertical>.bp3-button:first-child{border-radius:0 3px 0 0}.bp3-numeric-input .bp3-button-group.bp3-vertical>.bp3-button:last-child{border-radius:0 0 3px 0}.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child>.bp3-button:first-child{border-radius:3px 0 0 0}.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child>.bp3-button:last-child{border-radius:0 0 0 3px}.bp3-numeric-input.bp3-large .bp3-button-group.bp3-vertical>.bp3-button{width:40px}form{display:block}.bp3-html-select select,.bp3-select select{display:inline-flex;flex-direction:row;align-items:center;border:none;cursor:pointer;font-size:14px;justify-content:center;text-align:left;vertical-align:middle;background-color:#f5f8fa;background-image:linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1);color:#182026;-moz-appearance:none;-webkit-appearance:none;border-radius:3px;height:30px;padding:0 25px 0 10px;width:100%}.bp3-html-select select>*,.bp3-select select>*{flex-grow:0;flex-shrink:0}.bp3-html-select select>.bp3-fill,.bp3-select select>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-html-select select:before,.bp3-html-select select>*,.bp3-select select:before,.bp3-select select>*{margin-right:7px}.bp3-html-select select:empty:before,.bp3-html-select select>:last-child,.bp3-select select:empty:before,.bp3-select select>:last-child{margin-right:0}.bp3-html-select select:hover,.bp3-select select:hover{background-clip:padding-box;background-color:#ebf1f5;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1)}.bp3-html-select select.bp3-active,.bp3-html-select select:active,.bp3-select select.bp3-active,.bp3-select select:active{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-html-select select.bp3-disabled,.bp3-html-select select:disabled,.bp3-select select.bp3-disabled,.bp3-select select:disabled{background-color:rgba(206,217,224,.5);background-image:none;box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;outline:none}.bp3-html-select select.bp3-disabled.bp3-active,.bp3-html-select select.bp3-disabled.bp3-active:hover,.bp3-html-select select:disabled.bp3-active,.bp3-html-select select:disabled.bp3-active:hover,.bp3-select select.bp3-disabled.bp3-active,.bp3-select select.bp3-disabled.bp3-active:hover,.bp3-select select:disabled.bp3-active,.bp3-select select:disabled.bp3-active:hover{background:rgba(206,217,224,.7)}.bp3-html-select.bp3-minimal select,.bp3-select.bp3-minimal select{background:none;box-shadow:none}.bp3-html-select.bp3-minimal select:hover,.bp3-select.bp3-minimal select:hover{background:rgba(167,182,194,.3);box-shadow:none;color:#182026;text-decoration:none}.bp3-html-select.bp3-minimal select.bp3-active,.bp3-html-select.bp3-minimal select:active,.bp3-select.bp3-minimal select.bp3-active,.bp3-select.bp3-minimal select:active{background:rgba(115,134,148,.3);box-shadow:none;color:#182026}.bp3-html-select.bp3-minimal select.bp3-disabled,.bp3-html-select.bp3-minimal select.bp3-disabled:hover,.bp3-html-select.bp3-minimal select:disabled,.bp3-html-select.bp3-minimal select:disabled:hover,.bp3-select.bp3-minimal select.bp3-disabled,.bp3-select.bp3-minimal select.bp3-disabled:hover,.bp3-select.bp3-minimal select:disabled,.bp3-select.bp3-minimal select:disabled:hover{background:none;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active,.bp3-html-select.bp3-minimal select:disabled.bp3-active,.bp3-html-select.bp3-minimal select:disabled:hover.bp3-active,.bp3-select.bp3-minimal select.bp3-disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active,.bp3-select.bp3-minimal select:disabled.bp3-active,.bp3-select.bp3-minimal select:disabled:hover.bp3-active{background:rgba(115,134,148,.3)}.bp3-dark .bp3-html-select.bp3-minimal select,.bp3-dark .bp3-select.bp3-minimal select,.bp3-html-select.bp3-minimal .bp3-dark select,.bp3-select.bp3-minimal .bp3-dark select{background:none;box-shadow:none;color:inherit}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select:active,.bp3-dark .bp3-html-select.bp3-minimal select:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-active,.bp3-dark .bp3-select.bp3-minimal select:active,.bp3-dark .bp3-select.bp3-minimal select:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select:active,.bp3-html-select.bp3-minimal .bp3-dark select:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-active,.bp3-select.bp3-minimal .bp3-dark select:active,.bp3-select.bp3-minimal .bp3-dark select:hover{background:none;box-shadow:none}.bp3-dark .bp3-html-select.bp3-minimal select:hover,.bp3-dark .bp3-select.bp3-minimal select:hover,.bp3-html-select.bp3-minimal .bp3-dark select:hover,.bp3-select.bp3-minimal .bp3-dark select:hover{background:rgba(138,155,168,.15)}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select:active,.bp3-dark .bp3-select.bp3-minimal select.bp3-active,.bp3-dark .bp3-select.bp3-minimal select:active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select:active,.bp3-select.bp3-minimal .bp3-dark select.bp3-active,.bp3-select.bp3-minimal .bp3-dark select:active{background:rgba(138,155,168,.3);color:#f5f8fa}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover,.bp3-dark .bp3-html-select.bp3-minimal select:disabled,.bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover,.bp3-dark .bp3-select.bp3-minimal select:disabled,.bp3-dark .bp3-select.bp3-minimal select:disabled:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover,.bp3-html-select.bp3-minimal .bp3-dark select:disabled,.bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover,.bp3-select.bp3-minimal .bp3-dark select:disabled,.bp3-select.bp3-minimal .bp3-dark select:disabled:hover{background:none;color:rgba(167,182,194,.6);cursor:not-allowed}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select:disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active,.bp3-dark .bp3-select.bp3-minimal select:disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select:disabled:hover.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select:disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active,.bp3-select.bp3-minimal .bp3-dark select:disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active{background:rgba(138,155,168,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-primary,.bp3-select.bp3-minimal select.bp3-intent-primary{color:#106ba3}.bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-primary:active,.bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-primary:active,.bp3-select.bp3-minimal select.bp3-intent-primary:hover{background:none;box-shadow:none;color:#106ba3}.bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,.bp3-select.bp3-minimal select.bp3-intent-primary:hover{background:rgba(19,124,189,.15);color:#106ba3}.bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-primary:active,.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#106ba3}.bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,.bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled,.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,.bp3-select.bp3-minimal select.bp3-intent-primary:disabled{background:none;color:rgba(16,107,163,.5)}.bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head,.bp3-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{stroke:#106ba3}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary{color:#48aff0}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover{background:rgba(19,124,189,.2);color:#48aff0}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active{background:rgba(19,124,189,.3);color:#48aff0}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled{background:none;color:rgba(72,175,240,.5)}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active{background:rgba(19,124,189,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-success,.bp3-select.bp3-minimal select.bp3-intent-success{color:#0d8050}.bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-success:active,.bp3-html-select.bp3-minimal select.bp3-intent-success:hover,.bp3-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-success:active,.bp3-select.bp3-minimal select.bp3-intent-success:hover{background:none;box-shadow:none;color:#0d8050}.bp3-html-select.bp3-minimal select.bp3-intent-success:hover,.bp3-select.bp3-minimal select.bp3-intent-success:hover{background:rgba(15,153,96,.15);color:#0d8050}.bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-success:active,.bp3-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#0d8050}.bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled,.bp3-html-select.bp3-minimal select.bp3-intent-success:disabled,.bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled,.bp3-select.bp3-minimal select.bp3-intent-success:disabled{background:none;color:rgba(13,128,80,.5)}.bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head,.bp3-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{stroke:#0d8050}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success{color:#3dcc91}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover{background:rgba(15,153,96,.2);color:#3dcc91}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:active{background:rgba(15,153,96,.3);color:#3dcc91}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled{background:none;color:rgba(61,204,145,.5)}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active{background:rgba(15,153,96,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-warning,.bp3-select.bp3-minimal select.bp3-intent-warning{color:#bf7326}.bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-warning:active,.bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-warning:active,.bp3-select.bp3-minimal select.bp3-intent-warning:hover{background:none;box-shadow:none;color:#bf7326}.bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,.bp3-select.bp3-minimal select.bp3-intent-warning:hover{background:rgba(217,130,43,.15);color:#bf7326}.bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-warning:active,.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#bf7326}.bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,.bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled,.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,.bp3-select.bp3-minimal select.bp3-intent-warning:disabled{background:none;color:rgba(191,115,38,.5)}.bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head,.bp3-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{stroke:#bf7326}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning{color:#ffb366}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover{background:rgba(217,130,43,.2);color:#ffb366}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active{background:rgba(217,130,43,.3);color:#ffb366}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled{background:none;color:rgba(255,179,102,.5)}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active{background:rgba(217,130,43,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-danger,.bp3-select.bp3-minimal select.bp3-intent-danger{color:#c23030}.bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-danger:active,.bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-danger:active,.bp3-select.bp3-minimal select.bp3-intent-danger:hover{background:none;box-shadow:none;color:#c23030}.bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,.bp3-select.bp3-minimal select.bp3-intent-danger:hover{background:rgba(219,55,55,.15);color:#c23030}.bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-danger:active,.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#c23030}.bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,.bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled,.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,.bp3-select.bp3-minimal select.bp3-intent-danger:disabled{background:none;color:rgba(194,48,48,.5)}.bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-html-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head,.bp3-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{stroke:#c23030}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger{color:#ff7373}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:hover,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover{background:rgba(219,55,55,.2);color:#ff7373}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active{background:rgba(219,55,55,.3);color:#ff7373}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled{background:none;color:rgba(255,115,115,.5)}.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active,.bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active{background:rgba(219,55,55,.3)}.bp3-html-select.bp3-large select,.bp3-select.bp3-large select{font-size:16px;height:40px;padding-right:35px}.bp3-dark .bp3-html-select select,.bp3-dark .bp3-select select{background-color:#394b59;background-image:linear-gradient(180deg,hsla(0,0%,100%,.05),hsla(0,0%,100%,0));box-shadow:0 0 0 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark .bp3-html-select select.bp3-active,.bp3-dark .bp3-html-select select:active,.bp3-dark .bp3-html-select select:hover,.bp3-dark .bp3-select select.bp3-active,.bp3-dark .bp3-select select:active,.bp3-dark .bp3-select select:hover{color:#f5f8fa}.bp3-dark .bp3-html-select select:hover,.bp3-dark .bp3-select select:hover{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-html-select select.bp3-active,.bp3-dark .bp3-html-select select:active,.bp3-dark .bp3-select select.bp3-active,.bp3-dark .bp3-select select:active{background-color:#202b33;background-image:none;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-html-select select.bp3-disabled,.bp3-dark .bp3-html-select select:disabled,.bp3-dark .bp3-select select.bp3-disabled,.bp3-dark .bp3-select select:disabled{background-color:rgba(57,75,89,.5);background-image:none;box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-html-select select.bp3-disabled.bp3-active,.bp3-dark .bp3-html-select select:disabled.bp3-active,.bp3-dark .bp3-select select.bp3-disabled.bp3-active,.bp3-dark .bp3-select select:disabled.bp3-active{background:rgba(57,75,89,.7)}.bp3-dark .bp3-html-select select .bp3-button-spinner .bp3-spinner-head,.bp3-dark .bp3-select select .bp3-button-spinner .bp3-spinner-head{background:rgba(16,22,26,.5);stroke:#8a9ba8}.bp3-html-select select:disabled,.bp3-select select:disabled{background-color:rgba(206,217,224,.5);box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-html-select .bp3-icon,.bp3-select .bp3-icon,.bp3-select:after{color:#5c7080;pointer-events:none;position:absolute;right:7px;top:7px}.bp3-disabled.bp3-select:after,.bp3-html-select .bp3-disabled.bp3-icon,.bp3-select .bp3-disabled.bp3-icon{color:rgba(92,112,128,.6)}.bp3-html-select,.bp3-select{display:inline-block;letter-spacing:normal;position:relative;vertical-align:middle}.bp3-html-select select::-ms-expand,.bp3-select select::-ms-expand{display:none}.bp3-html-select .bp3-icon,.bp3-select .bp3-icon{color:#5c7080}.bp3-html-select .bp3-icon:hover,.bp3-select .bp3-icon:hover{color:#182026}.bp3-dark .bp3-html-select .bp3-icon,.bp3-dark .bp3-select .bp3-icon{color:#a7b6c2}.bp3-dark .bp3-html-select .bp3-icon:hover,.bp3-dark .bp3-select .bp3-icon:hover{color:#f5f8fa}.bp3-html-select.bp3-large .bp3-icon,.bp3-html-select.bp3-large:after,.bp3-select.bp3-large .bp3-icon,.bp3-select.bp3-large:after{right:12px;top:12px}.bp3-html-select.bp3-fill,.bp3-html-select.bp3-fill select,.bp3-select.bp3-fill,.bp3-select.bp3-fill select{width:100%}.bp3-dark .bp3-html-select option,.bp3-dark .bp3-select option{background-color:#30404d;color:#f5f8fa}.bp3-dark .bp3-html-select option:disabled,.bp3-dark .bp3-select option:disabled{color:rgba(167,182,194,.6)}.bp3-dark .bp3-html-select:after,.bp3-dark .bp3-select:after{color:#a7b6c2}.bp3-select:after{font-family:Icons16,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;content:"\E6C6"}.bp3-running-text table,table.bp3-html-table{border-spacing:0;font-size:14px}.bp3-running-text table td,.bp3-running-text table th,table.bp3-html-table td,table.bp3-html-table th{padding:11px;text-align:left;vertical-align:top}.bp3-running-text table th,table.bp3-html-table th{color:#182026;font-weight:600}.bp3-running-text table td,table.bp3-html-table td{color:#182026}.bp3-running-text table tbody tr:first-child td,.bp3-running-text table tbody tr:first-child th,table.bp3-html-table tbody tr:first-child td,table.bp3-html-table tbody tr:first-child th{box-shadow:inset 0 1px 0 0 rgba(16,22,26,.15)}.bp3-dark .bp3-running-text table td,.bp3-dark .bp3-running-text table th,.bp3-dark table.bp3-html-table td,.bp3-dark table.bp3-html-table th,.bp3-running-text .bp3-dark table td,.bp3-running-text .bp3-dark table th{color:#f5f8fa}.bp3-dark .bp3-running-text table tbody tr:first-child td,.bp3-dark .bp3-running-text table tbody tr:first-child th,.bp3-dark table.bp3-html-table tbody tr:first-child td,.bp3-dark table.bp3-html-table tbody tr:first-child th,.bp3-running-text .bp3-dark table tbody tr:first-child td,.bp3-running-text .bp3-dark table tbody tr:first-child th{box-shadow:inset 0 1px 0 0 hsla(0,0%,100%,.15)}table.bp3-html-table.bp3-html-table-condensed td,table.bp3-html-table.bp3-html-table-condensed th,table.bp3-html-table.bp3-small td,table.bp3-html-table.bp3-small th{padding-bottom:6px;padding-top:6px}table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{background:rgba(191,204,214,.15)}table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){box-shadow:inset 1px 0 0 0 rgba(16,22,26,.15)}table.bp3-html-table.bp3-html-table-bordered tbody tr td{box-shadow:inset 0 1px 0 0 rgba(16,22,26,.15)}table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child){box-shadow:inset 1px 1px 0 0 rgba(16,22,26,.15)}table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{box-shadow:none}table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:not(:first-child){box-shadow:inset 1px 0 0 0 rgba(16,22,26,.15)}table.bp3-html-table.bp3-interactive tbody tr:hover td{background-color:rgba(191,204,214,.3);cursor:pointer}table.bp3-html-table.bp3-interactive tbody tr:active td{background-color:rgba(191,204,214,.4)}.bp3-dark table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{background:rgba(92,112,128,.15)}.bp3-dark table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){box-shadow:inset 1px 0 0 0 hsla(0,0%,100%,.15)}.bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td{box-shadow:inset 0 1px 0 0 hsla(0,0%,100%,.15)}.bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child){box-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.15)}.bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{box-shadow:inset 1px 0 0 0 hsla(0,0%,100%,.15)}.bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:first-child{box-shadow:none}.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:hover td{background-color:rgba(92,112,128,.3);cursor:pointer}.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:active td{background-color:rgba(92,112,128,.4)}.bp3-key-combo{display:flex;flex-direction:row;align-items:center}.bp3-key-combo>*{flex-grow:0;flex-shrink:0}.bp3-key-combo>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-key-combo:before,.bp3-key-combo>*{margin-right:5px}.bp3-key-combo:empty:before,.bp3-key-combo>:last-child{margin-right:0}.bp3-hotkey-dialog{padding-bottom:0;top:40px}.bp3-hotkey-dialog .bp3-dialog-body{margin:0;padding:0}.bp3-hotkey-dialog .bp3-hotkey-label{flex-grow:1}.bp3-hotkey-column{margin:auto;max-height:80vh;overflow-y:auto;padding:30px}.bp3-hotkey-column .bp3-heading{margin-bottom:20px}.bp3-hotkey-column .bp3-heading:not(:first-child){margin-top:40px}.bp3-hotkey{align-items:center;display:flex;justify-content:space-between;margin-left:0;margin-right:0}.bp3-hotkey:not(:last-child){margin-bottom:10px}.bp3-icon{display:inline-block;flex:0 0 auto;vertical-align:text-bottom}.bp3-icon:not(:empty):before{content:""!important;content:unset!important}.bp3-icon>svg{display:block}.bp3-icon>svg:not([fill]){fill:currentColor}.bp3-icon-large.bp3-intent-primary,.bp3-icon-standard.bp3-intent-primary,.bp3-icon.bp3-intent-primary{color:#106ba3}.bp3-dark .bp3-icon-large.bp3-intent-primary,.bp3-dark .bp3-icon-standard.bp3-intent-primary,.bp3-dark .bp3-icon.bp3-intent-primary{color:#48aff0}.bp3-icon-large.bp3-intent-success,.bp3-icon-standard.bp3-intent-success,.bp3-icon.bp3-intent-success{color:#0d8050}.bp3-dark .bp3-icon-large.bp3-intent-success,.bp3-dark .bp3-icon-standard.bp3-intent-success,.bp3-dark .bp3-icon.bp3-intent-success{color:#3dcc91}.bp3-icon-large.bp3-intent-warning,.bp3-icon-standard.bp3-intent-warning,.bp3-icon.bp3-intent-warning{color:#bf7326}.bp3-dark .bp3-icon-large.bp3-intent-warning,.bp3-dark .bp3-icon-standard.bp3-intent-warning,.bp3-dark .bp3-icon.bp3-intent-warning{color:#ffb366}.bp3-icon-large.bp3-intent-danger,.bp3-icon-standard.bp3-intent-danger,.bp3-icon.bp3-intent-danger{color:#c23030}.bp3-dark .bp3-icon-large.bp3-intent-danger,.bp3-dark .bp3-icon-standard.bp3-intent-danger,.bp3-dark .bp3-icon.bp3-intent-danger{color:#ff7373}span.bp3-icon-standard{font-family:Icons16,sans-serif;font-size:16px}span.bp3-icon-large,span.bp3-icon-standard{font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block}span.bp3-icon-large{font-family:Icons20,sans-serif;font-size:20px}span.bp3-icon:empty{font-family:Icons20;font-size:inherit;font-style:normal;font-weight:400;line-height:1}span.bp3-icon:empty:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.bp3-icon-add:before{content:"\E63E"}.bp3-icon-add-column-left:before{content:"\E6F9"}.bp3-icon-add-column-right:before{content:"\E6FA"}.bp3-icon-add-row-bottom:before{content:"\E6F8"}.bp3-icon-add-row-top:before{content:"\E6F7"}.bp3-icon-add-to-artifact:before{content:"\E67C"}.bp3-icon-add-to-folder:before{content:"\E6D2"}.bp3-icon-airplane:before{content:"\E74B"}.bp3-icon-align-center:before{content:"\E603"}.bp3-icon-align-justify:before{content:"\E605"}.bp3-icon-align-left:before{content:"\E602"}.bp3-icon-align-right:before{content:"\E604"}.bp3-icon-alignment-bottom:before{content:"\E727"}.bp3-icon-alignment-horizontal-center:before{content:"\E726"}.bp3-icon-alignment-left:before{content:"\E722"}.bp3-icon-alignment-right:before{content:"\E724"}.bp3-icon-alignment-top:before{content:"\E725"}.bp3-icon-alignment-vertical-center:before{content:"\E723"}.bp3-icon-annotation:before{content:"\E6F0"}.bp3-icon-application:before{content:"\E735"}.bp3-icon-applications:before{content:"\E621"}.bp3-icon-archive:before{content:"\E907"}.bp3-icon-arrow-bottom-left:before{content:"\2199"}.bp3-icon-arrow-bottom-right:before{content:"\2198"}.bp3-icon-arrow-down:before{content:"\2193"}.bp3-icon-arrow-left:before{content:"\2190"}.bp3-icon-arrow-right:before{content:"\2192"}.bp3-icon-arrow-top-left:before{content:"\2196"}.bp3-icon-arrow-top-right:before{content:"\2197"}.bp3-icon-arrow-up:before{content:"\2191"}.bp3-icon-arrows-horizontal:before{content:"\2194"}.bp3-icon-arrows-vertical:before{content:"\2195"}.bp3-icon-asterisk:before{content:"*"}.bp3-icon-automatic-updates:before{content:"\E65F"}.bp3-icon-badge:before{content:"\E6E3"}.bp3-icon-ban-circle:before{content:"\E69D"}.bp3-icon-bank-account:before{content:"\E76F"}.bp3-icon-barcode:before{content:"\E676"}.bp3-icon-blank:before{content:"\E900"}.bp3-icon-blocked-person:before{content:"\E768"}.bp3-icon-bold:before{content:"\E606"}.bp3-icon-book:before{content:"\E6B8"}.bp3-icon-bookmark:before{content:"\E61A"}.bp3-icon-box:before{content:"\E6BF"}.bp3-icon-briefcase:before{content:"\E674"}.bp3-icon-bring-data:before{content:"\E90A"}.bp3-icon-build:before{content:"\E72D"}.bp3-icon-calculator:before{content:"\E70B"}.bp3-icon-calendar:before{content:"\E62B"}.bp3-icon-camera:before{content:"\E69E"}.bp3-icon-caret-down:before{content:"\2304"}.bp3-icon-caret-left:before{content:"\2329"}.bp3-icon-caret-right:before{content:"\232A"}.bp3-icon-caret-up:before{content:"\2303"}.bp3-icon-cell-tower:before{content:"\E770"}.bp3-icon-changes:before{content:"\E623"}.bp3-icon-chart:before{content:"\E67E"}.bp3-icon-chat:before{content:"\E689"}.bp3-icon-chevron-backward:before{content:"\E6DF"}.bp3-icon-chevron-down:before{content:"\E697"}.bp3-icon-chevron-forward:before{content:"\E6E0"}.bp3-icon-chevron-left:before{content:"\E694"}.bp3-icon-chevron-right:before{content:"\E695"}.bp3-icon-chevron-up:before{content:"\E696"}.bp3-icon-circle:before{content:"\E66A"}.bp3-icon-circle-arrow-down:before{content:"\E68E"}.bp3-icon-circle-arrow-left:before{content:"\E68C"}.bp3-icon-circle-arrow-right:before{content:"\E68B"}.bp3-icon-circle-arrow-up:before{content:"\E68D"}.bp3-icon-citation:before{content:"\E61B"}.bp3-icon-clean:before{content:"\E7C5"}.bp3-icon-clipboard:before{content:"\E61D"}.bp3-icon-cloud:before{content:"\2601"}.bp3-icon-cloud-download:before{content:"\E690"}.bp3-icon-cloud-upload:before{content:"\E691"}.bp3-icon-code:before{content:"\E661"}.bp3-icon-code-block:before{content:"\E6C5"}.bp3-icon-cog:before{content:"\E645"}.bp3-icon-collapse-all:before{content:"\E763"}.bp3-icon-column-layout:before{content:"\E6DA"}.bp3-icon-comment:before{content:"\E68A"}.bp3-icon-comparison:before{content:"\E637"}.bp3-icon-compass:before{content:"\E79C"}.bp3-icon-compressed:before{content:"\E6C0"}.bp3-icon-confirm:before{content:"\E639"}.bp3-icon-console:before{content:"\E79B"}.bp3-icon-contrast:before{content:"\E6CB"}.bp3-icon-control:before{content:"\E67F"}.bp3-icon-credit-card:before{content:"\E649"}.bp3-icon-cross:before{content:"\2717"}.bp3-icon-crown:before{content:"\E7B4"}.bp3-icon-cube:before{content:"\E7C8"}.bp3-icon-cube-add:before{content:"\E7C9"}.bp3-icon-cube-remove:before{content:"\E7D0"}.bp3-icon-curved-range-chart:before{content:"\E71B"}.bp3-icon-cut:before{content:"\E6EF"}.bp3-icon-dashboard:before{content:"\E751"}.bp3-icon-data-lineage:before{content:"\E908"}.bp3-icon-database:before{content:"\E683"}.bp3-icon-delete:before{content:"\E644"}.bp3-icon-delta:before{content:"\394"}.bp3-icon-derive-column:before{content:"\E739"}.bp3-icon-desktop:before{content:"\E6AF"}.bp3-icon-diagnosis:before{content:"\E90D"}.bp3-icon-diagram-tree:before{content:"\E7B3"}.bp3-icon-direction-left:before{content:"\E681"}.bp3-icon-direction-right:before{content:"\E682"}.bp3-icon-disable:before{content:"\E600"}.bp3-icon-document:before{content:"\E630"}.bp3-icon-document-open:before{content:"\E71E"}.bp3-icon-document-share:before{content:"\E71F"}.bp3-icon-dollar:before{content:"$"}.bp3-icon-dot:before{content:"\2022"}.bp3-icon-double-caret-horizontal:before{content:"\E6C7"}.bp3-icon-double-caret-vertical:before{content:"\E6C6"}.bp3-icon-double-chevron-down:before{content:"\E703"}.bp3-icon-double-chevron-left:before{content:"\E6FF"}.bp3-icon-double-chevron-right:before{content:"\E701"}.bp3-icon-double-chevron-up:before{content:"\E702"}.bp3-icon-doughnut-chart:before{content:"\E6CE"}.bp3-icon-download:before{content:"\E62F"}.bp3-icon-drag-handle-horizontal:before{content:"\E716"}.bp3-icon-drag-handle-vertical:before{content:"\E715"}.bp3-icon-draw:before{content:"\E66B"}.bp3-icon-drive-time:before{content:"\E615"}.bp3-icon-duplicate:before{content:"\E69C"}.bp3-icon-edit:before{content:"\270E"}.bp3-icon-eject:before{content:"\23CF"}.bp3-icon-endorsed:before{content:"\E75F"}.bp3-icon-envelope:before{content:"\2709"}.bp3-icon-equals:before{content:"\E7D9"}.bp3-icon-eraser:before{content:"\E773"}.bp3-icon-error:before{content:"\E648"}.bp3-icon-euro:before{content:"\20AC"}.bp3-icon-exchange:before{content:"\E636"}.bp3-icon-exclude-row:before{content:"\E6EA"}.bp3-icon-expand-all:before{content:"\E764"}.bp3-icon-export:before{content:"\E633"}.bp3-icon-eye-off:before{content:"\E6CC"}.bp3-icon-eye-on:before{content:"\E75A"}.bp3-icon-eye-open:before{content:"\E66F"}.bp3-icon-fast-backward:before{content:"\E6A8"}.bp3-icon-fast-forward:before{content:"\E6AC"}.bp3-icon-feed:before{content:"\E656"}.bp3-icon-feed-subscribed:before{content:"\E78F"}.bp3-icon-film:before{content:"\E6A1"}.bp3-icon-filter:before{content:"\E638"}.bp3-icon-filter-keep:before{content:"\E78C"}.bp3-icon-filter-list:before{content:"\E6EE"}.bp3-icon-filter-open:before{content:"\E7D7"}.bp3-icon-filter-remove:before{content:"\E78D"}.bp3-icon-flag:before{content:"\2691"}.bp3-icon-flame:before{content:"\E7A9"}.bp3-icon-flash:before{content:"\E6B3"}.bp3-icon-floppy-disk:before{content:"\E6B7"}.bp3-icon-flow-branch:before{content:"\E7C1"}.bp3-icon-flow-end:before{content:"\E7C4"}.bp3-icon-flow-linear:before{content:"\E7C0"}.bp3-icon-flow-review:before{content:"\E7C2"}.bp3-icon-flow-review-branch:before{content:"\E7C3"}.bp3-icon-flows:before{content:"\E659"}.bp3-icon-folder-close:before{content:"\E652"}.bp3-icon-folder-new:before{content:"\E7B0"}.bp3-icon-folder-open:before{content:"\E651"}.bp3-icon-folder-shared:before{content:"\E653"}.bp3-icon-folder-shared-open:before{content:"\E670"}.bp3-icon-follower:before{content:"\E760"}.bp3-icon-following:before{content:"\E761"}.bp3-icon-font:before{content:"\E6B4"}.bp3-icon-fork:before{content:"\E63A"}.bp3-icon-form:before{content:"\E795"}.bp3-icon-full-circle:before{content:"\E685"}.bp3-icon-full-stacked-chart:before{content:"\E75E"}.bp3-icon-fullscreen:before{content:"\E699"}.bp3-icon-function:before{content:"\E6E5"}.bp3-icon-gantt-chart:before{content:"\E6F4"}.bp3-icon-geolocation:before{content:"\E640"}.bp3-icon-geosearch:before{content:"\E613"}.bp3-icon-git-branch:before{content:"\E72A"}.bp3-icon-git-commit:before{content:"\E72B"}.bp3-icon-git-merge:before{content:"\E729"}.bp3-icon-git-new-branch:before{content:"\E749"}.bp3-icon-git-pull:before{content:"\E728"}.bp3-icon-git-push:before{content:"\E72C"}.bp3-icon-git-repo:before{content:"\E748"}.bp3-icon-glass:before{content:"\E6B1"}.bp3-icon-globe:before{content:"\E666"}.bp3-icon-globe-network:before{content:"\E7B5"}.bp3-icon-graph:before{content:"\E673"}.bp3-icon-graph-remove:before{content:"\E609"}.bp3-icon-greater-than:before{content:"\E7E1"}.bp3-icon-greater-than-or-equal-to:before{content:"\E7E2"}.bp3-icon-grid:before{content:"\E6D0"}.bp3-icon-grid-view:before{content:"\E6E4"}.bp3-icon-group-objects:before{content:"\E60A"}.bp3-icon-grouped-bar-chart:before{content:"\E75D"}.bp3-icon-hand:before{content:"\E6DE"}.bp3-icon-hand-down:before{content:"\E6BB"}.bp3-icon-hand-left:before{content:"\E6BC"}.bp3-icon-hand-right:before{content:"\E6B9"}.bp3-icon-hand-up:before{content:"\E6BA"}.bp3-icon-header:before{content:"\E6B5"}.bp3-icon-header-one:before{content:"\E793"}.bp3-icon-header-two:before{content:"\E794"}.bp3-icon-headset:before{content:"\E6DC"}.bp3-icon-heart:before{content:"\2665"}.bp3-icon-heart-broken:before{content:"\E7A2"}.bp3-icon-heat-grid:before{content:"\E6F3"}.bp3-icon-heatmap:before{content:"\E614"}.bp3-icon-help:before{content:"?"}.bp3-icon-helper-management:before{content:"\E66D"}.bp3-icon-highlight:before{content:"\E6ED"}.bp3-icon-history:before{content:"\E64A"}.bp3-icon-home:before{content:"\2302"}.bp3-icon-horizontal-bar-chart:before{content:"\E70C"}.bp3-icon-horizontal-bar-chart-asc:before{content:"\E75C"}.bp3-icon-horizontal-bar-chart-desc:before{content:"\E71D"}.bp3-icon-horizontal-distribution:before{content:"\E720"}.bp3-icon-id-number:before{content:"\E771"}.bp3-icon-image-rotate-left:before{content:"\E73A"}.bp3-icon-image-rotate-right:before{content:"\E73B"}.bp3-icon-import:before{content:"\E632"}.bp3-icon-inbox:before{content:"\E629"}.bp3-icon-inbox-filtered:before{content:"\E7D1"}.bp3-icon-inbox-geo:before{content:"\E7D2"}.bp3-icon-inbox-search:before{content:"\E7D3"}.bp3-icon-inbox-update:before{content:"\E7D4"}.bp3-icon-info-sign:before{content:"\2139"}.bp3-icon-inheritance:before{content:"\E7D5"}.bp3-icon-inner-join:before{content:"\E7A3"}.bp3-icon-insert:before{content:"\E66C"}.bp3-icon-intersection:before{content:"\E765"}.bp3-icon-ip-address:before{content:"\E772"}.bp3-icon-issue:before{content:"\E774"}.bp3-icon-issue-closed:before{content:"\E776"}.bp3-icon-issue-new:before{content:"\E775"}.bp3-icon-italic:before{content:"\E607"}.bp3-icon-join-table:before{content:"\E738"}.bp3-icon-key:before{content:"\E78E"}.bp3-icon-key-backspace:before{content:"\E707"}.bp3-icon-key-command:before{content:"\E705"}.bp3-icon-key-control:before{content:"\E704"}.bp3-icon-key-delete:before{content:"\E708"}.bp3-icon-key-enter:before{content:"\E70A"}.bp3-icon-key-escape:before{content:"\E709"}.bp3-icon-key-option:before{content:"\E742"}.bp3-icon-key-shift:before{content:"\E706"}.bp3-icon-key-tab:before{content:"\E757"}.bp3-icon-known-vehicle:before{content:"\E73C"}.bp3-icon-lab-test:before{content:"\E90E"}.bp3-icon-label:before{content:"\E665"}.bp3-icon-layer:before{content:"\E6CF"}.bp3-icon-layers:before{content:"\E618"}.bp3-icon-layout:before{content:"\E60C"}.bp3-icon-layout-auto:before{content:"\E60D"}.bp3-icon-layout-balloon:before{content:"\E6D3"}.bp3-icon-layout-circle:before{content:"\E60E"}.bp3-icon-layout-grid:before{content:"\E610"}.bp3-icon-layout-group-by:before{content:"\E611"}.bp3-icon-layout-hierarchy:before{content:"\E60F"}.bp3-icon-layout-linear:before{content:"\E6C3"}.bp3-icon-layout-skew-grid:before{content:"\E612"}.bp3-icon-layout-sorted-clusters:before{content:"\E6D4"}.bp3-icon-learning:before{content:"\E904"}.bp3-icon-left-join:before{content:"\E7A4"}.bp3-icon-less-than:before{content:"\E7E3"}.bp3-icon-less-than-or-equal-to:before{content:"\E7E4"}.bp3-icon-lifesaver:before{content:"\E7C7"}.bp3-icon-lightbulb:before{content:"\E6B0"}.bp3-icon-link:before{content:"\E62D"}.bp3-icon-list:before{content:"\2630"}.bp3-icon-list-columns:before{content:"\E7B9"}.bp3-icon-list-detail-view:before{content:"\E743"}.bp3-icon-locate:before{content:"\E619"}.bp3-icon-lock:before{content:"\E625"}.bp3-icon-log-in:before{content:"\E69A"}.bp3-icon-log-out:before{content:"\E64C"}.bp3-icon-manual:before{content:"\E6F6"}.bp3-icon-manually-entered-data:before{content:"\E74A"}.bp3-icon-map:before{content:"\E662"}.bp3-icon-map-create:before{content:"\E741"}.bp3-icon-map-marker:before{content:"\E67D"}.bp3-icon-maximize:before{content:"\E635"}.bp3-icon-media:before{content:"\E62C"}.bp3-icon-menu:before{content:"\E762"}.bp3-icon-menu-closed:before{content:"\E655"}.bp3-icon-menu-open:before{content:"\E654"}.bp3-icon-merge-columns:before{content:"\E74F"}.bp3-icon-merge-links:before{content:"\E60B"}.bp3-icon-minimize:before{content:"\E634"}.bp3-icon-minus:before{content:"\2212"}.bp3-icon-mobile-phone:before{content:"\E717"}.bp3-icon-mobile-video:before{content:"\E69F"}.bp3-icon-moon:before{content:"\E754"}.bp3-icon-more:before{content:"\E62A"}.bp3-icon-mountain:before{content:"\E7B1"}.bp3-icon-move:before{content:"\E693"}.bp3-icon-mugshot:before{content:"\E6DB"}.bp3-icon-multi-select:before{content:"\E680"}.bp3-icon-music:before{content:"\E6A6"}.bp3-icon-new-drawing:before{content:"\E905"}.bp3-icon-new-grid-item:before{content:"\E747"}.bp3-icon-new-layer:before{content:"\E902"}.bp3-icon-new-layers:before{content:"\E903"}.bp3-icon-new-link:before{content:"\E65C"}.bp3-icon-new-object:before{content:"\E65D"}.bp3-icon-new-person:before{content:"\E6E9"}.bp3-icon-new-prescription:before{content:"\E78B"}.bp3-icon-new-text-box:before{content:"\E65B"}.bp3-icon-ninja:before{content:"\E675"}.bp3-icon-not-equal-to:before{content:"\E7E0"}.bp3-icon-notifications:before{content:"\E624"}.bp3-icon-notifications-updated:before{content:"\E7B8"}.bp3-icon-numbered-list:before{content:"\E746"}.bp3-icon-numerical:before{content:"\E756"}.bp3-icon-office:before{content:"\E69B"}.bp3-icon-offline:before{content:"\E67A"}.bp3-icon-oil-field:before{content:"\E73F"}.bp3-icon-one-column:before{content:"\E658"}.bp3-icon-outdated:before{content:"\E7A8"}.bp3-icon-page-layout:before{content:"\E660"}.bp3-icon-panel-stats:before{content:"\E777"}.bp3-icon-panel-table:before{content:"\E778"}.bp3-icon-paperclip:before{content:"\E664"}.bp3-icon-paragraph:before{content:"\E76C"}.bp3-icon-path:before{content:"\E753"}.bp3-icon-path-search:before{content:"\E65E"}.bp3-icon-pause:before{content:"\E6A9"}.bp3-icon-people:before{content:"\E63D"}.bp3-icon-percentage:before{content:"\E76A"}.bp3-icon-person:before{content:"\E63C"}.bp3-icon-phone:before{content:"\260E"}.bp3-icon-pie-chart:before{content:"\E684"}.bp3-icon-pin:before{content:"\E646"}.bp3-icon-pivot:before{content:"\E6F1"}.bp3-icon-pivot-table:before{content:"\E6EB"}.bp3-icon-play:before{content:"\E6AB"}.bp3-icon-plus:before{content:"+"}.bp3-icon-polygon-filter:before{content:"\E6D1"}.bp3-icon-power:before{content:"\E6D9"}.bp3-icon-predictive-analysis:before{content:"\E617"}.bp3-icon-prescription:before{content:"\E78A"}.bp3-icon-presentation:before{content:"\E687"}.bp3-icon-print:before{content:"\2399"}.bp3-icon-projects:before{content:"\E622"}.bp3-icon-properties:before{content:"\E631"}.bp3-icon-property:before{content:"\E65A"}.bp3-icon-publish-function:before{content:"\E752"}.bp3-icon-pulse:before{content:"\E6E8"}.bp3-icon-random:before{content:"\E698"}.bp3-icon-record:before{content:"\E6AE"}.bp3-icon-redo:before{content:"\E6C4"}.bp3-icon-refresh:before{content:"\E643"}.bp3-icon-regression-chart:before{content:"\E758"}.bp3-icon-remove:before{content:"\E63F"}.bp3-icon-remove-column:before{content:"\E755"}.bp3-icon-remove-column-left:before{content:"\E6FD"}.bp3-icon-remove-column-right:before{content:"\E6FE"}.bp3-icon-remove-row-bottom:before{content:"\E6FC"}.bp3-icon-remove-row-top:before{content:"\E6FB"}.bp3-icon-repeat:before{content:"\E692"}.bp3-icon-reset:before{content:"\E7D6"}.bp3-icon-resolve:before{content:"\E672"}.bp3-icon-rig:before{content:"\E740"}.bp3-icon-right-join:before{content:"\E7A5"}.bp3-icon-ring:before{content:"\E6F2"}.bp3-icon-rotate-document:before{content:"\E6E1"}.bp3-icon-rotate-page:before{content:"\E6E2"}.bp3-icon-satellite:before{content:"\E76B"}.bp3-icon-saved:before{content:"\E6B6"}.bp3-icon-scatter-plot:before{content:"\E73E"}.bp3-icon-search:before{content:"\E64B"}.bp3-icon-search-around:before{content:"\E608"}.bp3-icon-search-template:before{content:"\E628"}.bp3-icon-search-text:before{content:"\E663"}.bp3-icon-segmented-control:before{content:"\E6EC"}.bp3-icon-select:before{content:"\E616"}.bp3-icon-selection:before{content:"\29BF"}.bp3-icon-send-to:before{content:"\E66E"}.bp3-icon-send-to-graph:before{content:"\E736"}.bp3-icon-send-to-map:before{content:"\E737"}.bp3-icon-series-add:before{content:"\E796"}.bp3-icon-series-configuration:before{content:"\E79A"}.bp3-icon-series-derived:before{content:"\E799"}.bp3-icon-series-filtered:before{content:"\E798"}.bp3-icon-series-search:before{content:"\E797"}.bp3-icon-settings:before{content:"\E6A2"}.bp3-icon-share:before{content:"\E62E"}.bp3-icon-shield:before{content:"\E7B2"}.bp3-icon-shop:before{content:"\E6C2"}.bp3-icon-shopping-cart:before{content:"\E6C1"}.bp3-icon-signal-search:before{content:"\E909"}.bp3-icon-sim-card:before{content:"\E718"}.bp3-icon-slash:before{content:"\E769"}.bp3-icon-small-cross:before{content:"\E6D7"}.bp3-icon-small-minus:before{content:"\E70E"}.bp3-icon-small-plus:before{content:"\E70D"}.bp3-icon-small-tick:before{content:"\E6D8"}.bp3-icon-snowflake:before{content:"\E7B6"}.bp3-icon-social-media:before{content:"\E671"}.bp3-icon-sort:before{content:"\E64F"}.bp3-icon-sort-alphabetical:before{content:"\E64D"}.bp3-icon-sort-alphabetical-desc:before{content:"\E6C8"}.bp3-icon-sort-asc:before{content:"\E6D5"}.bp3-icon-sort-desc:before{content:"\E6D6"}.bp3-icon-sort-numerical:before{content:"\E64E"}.bp3-icon-sort-numerical-desc:before{content:"\E6C9"}.bp3-icon-split-columns:before{content:"\E750"}.bp3-icon-square:before{content:"\E686"}.bp3-icon-stacked-chart:before{content:"\E6E7"}.bp3-icon-star:before{content:"\2605"}.bp3-icon-star-empty:before{content:"\2606"}.bp3-icon-step-backward:before{content:"\E6A7"}.bp3-icon-step-chart:before{content:"\E70F"}.bp3-icon-step-forward:before{content:"\E6AD"}.bp3-icon-stop:before{content:"\E6AA"}.bp3-icon-stopwatch:before{content:"\E901"}.bp3-icon-strikethrough:before{content:"\E7A6"}.bp3-icon-style:before{content:"\E601"}.bp3-icon-swap-horizontal:before{content:"\E745"}.bp3-icon-swap-vertical:before{content:"\E744"}.bp3-icon-symbol-circle:before{content:"\E72E"}.bp3-icon-symbol-cross:before{content:"\E731"}.bp3-icon-symbol-diamond:before{content:"\E730"}.bp3-icon-symbol-square:before{content:"\E72F"}.bp3-icon-symbol-triangle-down:before{content:"\E733"}.bp3-icon-symbol-triangle-up:before{content:"\E732"}.bp3-icon-tag:before{content:"\E61C"}.bp3-icon-take-action:before{content:"\E6CA"}.bp3-icon-taxi:before{content:"\E79E"}.bp3-icon-text-highlight:before{content:"\E6DD"}.bp3-icon-th:before{content:"\E667"}.bp3-icon-th-derived:before{content:"\E669"}.bp3-icon-th-disconnect:before{content:"\E7D8"}.bp3-icon-th-filtered:before{content:"\E7C6"}.bp3-icon-th-list:before{content:"\E668"}.bp3-icon-thumbs-down:before{content:"\E6BE"}.bp3-icon-thumbs-up:before{content:"\E6BD"}.bp3-icon-tick:before{content:"\2713"}.bp3-icon-tick-circle:before{content:"\E779"}.bp3-icon-time:before{content:"\23F2"}.bp3-icon-timeline-area-chart:before{content:"\E6CD"}.bp3-icon-timeline-bar-chart:before{content:"\E620"}.bp3-icon-timeline-events:before{content:"\E61E"}.bp3-icon-timeline-line-chart:before{content:"\E61F"}.bp3-icon-tint:before{content:"\E6B2"}.bp3-icon-torch:before{content:"\E677"}.bp3-icon-tractor:before{content:"\E90C"}.bp3-icon-train:before{content:"\E79F"}.bp3-icon-translate:before{content:"\E759"}.bp3-icon-trash:before{content:"\E63B"}.bp3-icon-tree:before{content:"\E7B7"}.bp3-icon-trending-down:before{content:"\E71A"}.bp3-icon-trending-up:before{content:"\E719"}.bp3-icon-truck:before{content:"\E90B"}.bp3-icon-two-columns:before{content:"\E657"}.bp3-icon-unarchive:before{content:"\E906"}.bp3-icon-underline:before{content:"\2381"}.bp3-icon-undo:before{content:"\238C"}.bp3-icon-ungroup-objects:before{content:"\E688"}.bp3-icon-unknown-vehicle:before{content:"\E73D"}.bp3-icon-unlock:before{content:"\E626"}.bp3-icon-unpin:before{content:"\E650"}.bp3-icon-unresolve:before{content:"\E679"}.bp3-icon-updated:before{content:"\E7A7"}.bp3-icon-upload:before{content:"\E68F"}.bp3-icon-user:before{content:"\E627"}.bp3-icon-variable:before{content:"\E6F5"}.bp3-icon-vertical-bar-chart-asc:before{content:"\E75B"}.bp3-icon-vertical-bar-chart-desc:before{content:"\E71C"}.bp3-icon-vertical-distribution:before{content:"\E721"}.bp3-icon-video:before{content:"\E6A0"}.bp3-icon-volume-down:before{content:"\E6A4"}.bp3-icon-volume-off:before{content:"\E6A3"}.bp3-icon-volume-up:before{content:"\E6A5"}.bp3-icon-walk:before{content:"\E79D"}.bp3-icon-warning-sign:before{content:"\E647"}.bp3-icon-waterfall-chart:before{content:"\E6E6"}.bp3-icon-widget:before{content:"\E678"}.bp3-icon-widget-button:before{content:"\E790"}.bp3-icon-widget-footer:before{content:"\E792"}.bp3-icon-widget-header:before{content:"\E791"}.bp3-icon-wrench:before{content:"\E734"}.bp3-icon-zoom-in:before{content:"\E641"}.bp3-icon-zoom-out:before{content:"\E642"}.bp3-icon-zoom-to-fit:before{content:"\E67B"}.bp3-submenu .bp3-popover-target,.bp3-submenu>.bp3-popover-wrapper{display:block}.bp3-submenu.bp3-popover{box-shadow:none;padding:0 5px}.bp3-submenu.bp3-popover>.bp3-popover-content{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2)}.bp3-dark .bp3-submenu.bp3-popover,.bp3-submenu.bp3-popover.bp3-dark{box-shadow:none}.bp3-dark .bp3-submenu.bp3-popover>.bp3-popover-content,.bp3-submenu.bp3-popover.bp3-dark>.bp3-popover-content{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-menu{background:#fff;border-radius:3px;color:#182026;list-style:none;margin:0;min-width:180px;padding:5px;text-align:left}.bp3-menu-divider{border-top:1px solid rgba(16,22,26,.15);display:block;margin:5px}.bp3-dark .bp3-menu-divider{border-top-color:hsla(0,0%,100%,.15)}.bp3-menu-item{display:flex;flex-direction:row;align-items:flex-start;border-radius:2px;color:inherit;line-height:20px;padding:5px 7px;text-decoration:none;-webkit-user-select:none;user-select:none}.bp3-menu-item>*{flex-grow:0;flex-shrink:0}.bp3-menu-item>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-menu-item:before,.bp3-menu-item>*{margin-right:7px}.bp3-menu-item:empty:before,.bp3-menu-item>:last-child{margin-right:0}.bp3-menu-item>.bp3-fill{word-break:break-word}.bp3-menu-item:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-menu-item{background-color:rgba(167,182,194,.3);cursor:pointer;text-decoration:none}.bp3-menu-item.bp3-disabled{background-color:inherit;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-dark .bp3-menu-item{color:inherit}.bp3-dark .bp3-menu-item:hover,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-menu-item{background-color:rgba(138,155,168,.15);color:inherit}.bp3-dark .bp3-menu-item.bp3-disabled{background-color:inherit;color:rgba(167,182,194,.6)}.bp3-menu-item.bp3-intent-primary{color:#106ba3}.bp3-menu-item.bp3-intent-primary .bp3-icon{color:inherit}.bp3-menu-item.bp3-intent-primary .bp3-menu-item-label,.bp3-menu-item.bp3-intent-primary:after,.bp3-menu-item.bp3-intent-primary:before{color:#106ba3}.bp3-menu-item.bp3-intent-primary.bp3-active,.bp3-menu-item.bp3-intent-primary:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item{background-color:#137cbd}.bp3-menu-item.bp3-intent-primary:active{background-color:#106ba3}.bp3-menu-item.bp3-intent-primary.bp3-active,.bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-primary.bp3-active:after,.bp3-menu-item.bp3-intent-primary.bp3-active:before,.bp3-menu-item.bp3-intent-primary:active,.bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-primary:active:after,.bp3-menu-item.bp3-intent-primary:active:before,.bp3-menu-item.bp3-intent-primary:hover,.bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,.bp3-menu-item.bp3-intent-primary:hover:after,.bp3-menu-item.bp3-intent-primary:hover:before,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:after,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:before{color:#fff}.bp3-menu-item.bp3-intent-success{color:#0d8050}.bp3-menu-item.bp3-intent-success .bp3-icon{color:inherit}.bp3-menu-item.bp3-intent-success .bp3-menu-item-label,.bp3-menu-item.bp3-intent-success:after,.bp3-menu-item.bp3-intent-success:before{color:#0d8050}.bp3-menu-item.bp3-intent-success.bp3-active,.bp3-menu-item.bp3-intent-success:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item{background-color:#0f9960}.bp3-menu-item.bp3-intent-success:active{background-color:#0d8050}.bp3-menu-item.bp3-intent-success.bp3-active,.bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-success.bp3-active:after,.bp3-menu-item.bp3-intent-success.bp3-active:before,.bp3-menu-item.bp3-intent-success:active,.bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-success:active:after,.bp3-menu-item.bp3-intent-success:active:before,.bp3-menu-item.bp3-intent-success:hover,.bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,.bp3-menu-item.bp3-intent-success:hover:after,.bp3-menu-item.bp3-intent-success:hover:before,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:after,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:before{color:#fff}.bp3-menu-item.bp3-intent-warning{color:#bf7326}.bp3-menu-item.bp3-intent-warning .bp3-icon{color:inherit}.bp3-menu-item.bp3-intent-warning .bp3-menu-item-label,.bp3-menu-item.bp3-intent-warning:after,.bp3-menu-item.bp3-intent-warning:before{color:#bf7326}.bp3-menu-item.bp3-intent-warning.bp3-active,.bp3-menu-item.bp3-intent-warning:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item{background-color:#d9822b}.bp3-menu-item.bp3-intent-warning:active{background-color:#bf7326}.bp3-menu-item.bp3-intent-warning.bp3-active,.bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-warning.bp3-active:after,.bp3-menu-item.bp3-intent-warning.bp3-active:before,.bp3-menu-item.bp3-intent-warning:active,.bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-warning:active:after,.bp3-menu-item.bp3-intent-warning:active:before,.bp3-menu-item.bp3-intent-warning:hover,.bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,.bp3-menu-item.bp3-intent-warning:hover:after,.bp3-menu-item.bp3-intent-warning:hover:before,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:after,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:before{color:#fff}.bp3-menu-item.bp3-intent-danger{color:#c23030}.bp3-menu-item.bp3-intent-danger .bp3-icon{color:inherit}.bp3-menu-item.bp3-intent-danger .bp3-menu-item-label,.bp3-menu-item.bp3-intent-danger:after,.bp3-menu-item.bp3-intent-danger:before{color:#c23030}.bp3-menu-item.bp3-intent-danger.bp3-active,.bp3-menu-item.bp3-intent-danger:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item{background-color:#db3737}.bp3-menu-item.bp3-intent-danger:active{background-color:#c23030}.bp3-menu-item.bp3-intent-danger.bp3-active,.bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-danger.bp3-active:after,.bp3-menu-item.bp3-intent-danger.bp3-active:before,.bp3-menu-item.bp3-intent-danger:active,.bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label,.bp3-menu-item.bp3-intent-danger:active:after,.bp3-menu-item.bp3-intent-danger:active:before,.bp3-menu-item.bp3-intent-danger:hover,.bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,.bp3-menu-item.bp3-intent-danger:hover:after,.bp3-menu-item.bp3-intent-danger:hover:before,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:after,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:before{color:#fff}.bp3-menu-item:before{font-family:Icons16,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-right:7px}.bp3-menu-item:before,.bp3-menu-item>.bp3-icon{color:#5c7080;margin-top:2px}.bp3-menu-item .bp3-menu-item-label{color:#5c7080}.bp3-menu-item:hover,.bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-menu-item{color:inherit}.bp3-menu-item.bp3-active,.bp3-menu-item:active{background-color:rgba(115,134,148,.3)}.bp3-menu-item.bp3-disabled{background-color:inherit!important;cursor:not-allowed!important;outline:none!important}.bp3-menu-item.bp3-disabled,.bp3-menu-item.bp3-disabled .bp3-menu-item-label,.bp3-menu-item.bp3-disabled:before,.bp3-menu-item.bp3-disabled>.bp3-icon{color:rgba(92,112,128,.6)!important}.bp3-large .bp3-menu-item{font-size:16px;line-height:22px;padding:9px 7px}.bp3-large .bp3-menu-item .bp3-icon{margin-top:3px}.bp3-large .bp3-menu-item:before{font-family:Icons20,sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-right:10px;margin-top:1px}button.bp3-menu-item{background:none;border:none;text-align:left;width:100%}.bp3-menu-header{border-top:1px solid rgba(16,22,26,.15);display:block;margin:5px;cursor:default;padding-left:2px}.bp3-dark .bp3-menu-header{border-top-color:hsla(0,0%,100%,.15)}.bp3-menu-header:first-of-type{border-top:none}.bp3-menu-header>h6{color:#182026;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;line-height:17px;margin:0;padding:10px 7px 0 1px}.bp3-menu-header:first-of-type>h6{padding-top:0}.bp3-large .bp3-menu-header>h6{font-size:18px;padding-bottom:5px;padding-top:15px}.bp3-large .bp3-menu-header:first-of-type>h6{padding-top:0}.bp3-dark .bp3-menu{background:#30404d;color:#f5f8fa}.bp3-dark .bp3-menu-item.bp3-intent-primary{color:#48aff0}.bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-icon{color:inherit}.bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-primary:after,.bp3-dark .bp3-menu-item.bp3-intent-primary:before{color:#48aff0}.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-primary:hover,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item{background-color:#137cbd}.bp3-dark .bp3-menu-item.bp3-intent-primary:active{background-color:#106ba3}.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active:after,.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active:before,.bp3-dark .bp3-menu-item.bp3-intent-primary:active,.bp3-dark .bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-primary:active:after,.bp3-dark .bp3-menu-item.bp3-intent-primary:active:before,.bp3-dark .bp3-menu-item.bp3-intent-primary:hover,.bp3-dark .bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-primary:hover:after,.bp3-dark .bp3-menu-item.bp3-intent-primary:hover:before,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item .bp3-menu-item-label,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:after,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:before,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:after,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-primary.bp3-menu-item:before{color:#fff}.bp3-dark .bp3-menu-item.bp3-intent-success{color:#3dcc91}.bp3-dark .bp3-menu-item.bp3-intent-success .bp3-icon{color:inherit}.bp3-dark .bp3-menu-item.bp3-intent-success .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-success:after,.bp3-dark .bp3-menu-item.bp3-intent-success:before{color:#3dcc91}.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-success:hover,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item{background-color:#0f9960}.bp3-dark .bp3-menu-item.bp3-intent-success:active{background-color:#0d8050}.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active:after,.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active:before,.bp3-dark .bp3-menu-item.bp3-intent-success:active,.bp3-dark .bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-success:active:after,.bp3-dark .bp3-menu-item.bp3-intent-success:active:before,.bp3-dark .bp3-menu-item.bp3-intent-success:hover,.bp3-dark .bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-success:hover:after,.bp3-dark .bp3-menu-item.bp3-intent-success:hover:before,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item .bp3-menu-item-label,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:after,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:before,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:after,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-success.bp3-menu-item:before{color:#fff}.bp3-dark .bp3-menu-item.bp3-intent-warning{color:#ffb366}.bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-icon{color:inherit}.bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-warning:after,.bp3-dark .bp3-menu-item.bp3-intent-warning:before{color:#ffb366}.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-warning:hover,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item{background-color:#d9822b}.bp3-dark .bp3-menu-item.bp3-intent-warning:active{background-color:#bf7326}.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active:after,.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active:before,.bp3-dark .bp3-menu-item.bp3-intent-warning:active,.bp3-dark .bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-warning:active:after,.bp3-dark .bp3-menu-item.bp3-intent-warning:active:before,.bp3-dark .bp3-menu-item.bp3-intent-warning:hover,.bp3-dark .bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-warning:hover:after,.bp3-dark .bp3-menu-item.bp3-intent-warning:hover:before,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item .bp3-menu-item-label,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:after,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:before,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:after,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-warning.bp3-menu-item:before{color:#fff}.bp3-dark .bp3-menu-item.bp3-intent-danger{color:#ff7373}.bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-icon{color:inherit}.bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-danger:after,.bp3-dark .bp3-menu-item.bp3-intent-danger:before{color:#ff7373}.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-danger:hover,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item{background-color:#db3737}.bp3-dark .bp3-menu-item.bp3-intent-danger:active{background-color:#c23030}.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active,.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active:after,.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active:before,.bp3-dark .bp3-menu-item.bp3-intent-danger:active,.bp3-dark .bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-danger:active:after,.bp3-dark .bp3-menu-item.bp3-intent-danger:active:before,.bp3-dark .bp3-menu-item.bp3-intent-danger:hover,.bp3-dark .bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-intent-danger:hover:after,.bp3-dark .bp3-menu-item.bp3-intent-danger:hover:before,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item .bp3-menu-item-label,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:after,.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:before,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item .bp3-menu-item-label,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:after,.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open>.bp3-intent-danger.bp3-menu-item:before{color:#fff}.bp3-dark .bp3-menu-item .bp3-menu-item-label,.bp3-dark .bp3-menu-item:before,.bp3-dark .bp3-menu-item>.bp3-icon{color:#a7b6c2}.bp3-dark .bp3-menu-item.bp3-active,.bp3-dark .bp3-menu-item:active{background-color:rgba(138,155,168,.3)}.bp3-dark .bp3-menu-item.bp3-disabled,.bp3-dark .bp3-menu-item.bp3-disabled .bp3-menu-item-label,.bp3-dark .bp3-menu-item.bp3-disabled:before,.bp3-dark .bp3-menu-item.bp3-disabled>.bp3-icon{color:rgba(167,182,194,.6)!important}.bp3-dark .bp3-menu-divider,.bp3-dark .bp3-menu-header{border-color:hsla(0,0%,100%,.15)}.bp3-dark .bp3-menu-header>h6{color:#f5f8fa}.bp3-label .bp3-menu{margin-top:5px}.bp3-navbar{background-color:#fff;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.2);height:50px;padding:0 15px;position:relative;width:100%;z-index:10}.bp3-dark .bp3-navbar,.bp3-navbar.bp3-dark{background-color:#394b59}.bp3-navbar.bp3-dark{box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-navbar{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 0 0 rgba(16,22,26,0),0 1px 1px rgba(16,22,26,.4)}.bp3-navbar.bp3-fixed-top{left:0;position:fixed;right:0;top:0}.bp3-navbar-heading{font-size:16px;margin-right:15px}.bp3-navbar-group{align-items:center;display:flex;height:50px}.bp3-navbar-group.bp3-align-left{float:left}.bp3-navbar-group.bp3-align-right{float:right}.bp3-navbar-divider{border-left:1px solid rgba(16,22,26,.15);height:20px;margin:0 10px}.bp3-dark .bp3-navbar-divider{border-left-color:hsla(0,0%,100%,.15)}.bp3-non-ideal-state{display:flex;flex-direction:column;align-items:center;height:100%;justify-content:center;text-align:center;width:100%}.bp3-non-ideal-state>*{flex-grow:0;flex-shrink:0}.bp3-non-ideal-state>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-non-ideal-state:before,.bp3-non-ideal-state>*{margin-bottom:20px}.bp3-non-ideal-state:empty:before,.bp3-non-ideal-state>:last-child{margin-bottom:0}.bp3-non-ideal-state>*{max-width:400px}.bp3-non-ideal-state-visual{color:rgba(92,112,128,.6);font-size:60px}.bp3-dark .bp3-non-ideal-state-visual{color:rgba(167,182,194,.6)}.bp3-overflow-list{display:flex;flex-wrap:nowrap;min-width:0}.bp3-overflow-list-spacer{flex-shrink:1;width:1px}body.bp3-overlay-open{overflow:hidden}.bp3-overlay{bottom:0;left:0;position:static;right:0;top:0;z-index:20}.bp3-overlay:not(.bp3-overlay-open){pointer-events:none}.bp3-overlay.bp3-overlay-container{overflow:hidden;position:fixed}.bp3-overlay.bp3-overlay-container.bp3-overlay-inline{position:absolute}.bp3-overlay.bp3-overlay-scroll-container{overflow:auto;position:fixed}.bp3-overlay.bp3-overlay-scroll-container.bp3-overlay-inline{position:absolute}.bp3-overlay.bp3-overlay-inline{display:inline;overflow:visible}.bp3-overlay-content{position:fixed;z-index:20}.bp3-overlay-inline .bp3-overlay-content,.bp3-overlay-scroll-container .bp3-overlay-content{position:absolute}.bp3-overlay-backdrop{bottom:0;left:0;position:fixed;right:0;top:0;opacity:1;background-color:rgba(16,22,26,.7);overflow:auto;-webkit-user-select:none;user-select:none;z-index:20}.bp3-overlay-backdrop.bp3-overlay-appear,.bp3-overlay-backdrop.bp3-overlay-enter{opacity:0}.bp3-overlay-backdrop.bp3-overlay-appear-active,.bp3-overlay-backdrop.bp3-overlay-enter-active{opacity:1;transition-delay:0;transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-overlay-backdrop.bp3-overlay-exit{opacity:1}.bp3-overlay-backdrop.bp3-overlay-exit-active{opacity:0;transition-delay:0;transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-overlay-backdrop:focus{outline:none}.bp3-overlay-inline .bp3-overlay-backdrop{position:absolute}.bp3-panel-stack{overflow:hidden;position:relative}.bp3-panel-stack-header{align-items:center;box-shadow:0 1px rgba(16,22,26,.15);display:flex;flex-shrink:0;height:30px;z-index:1}.bp3-dark .bp3-panel-stack-header{box-shadow:0 1px hsla(0,0%,100%,.15)}.bp3-panel-stack-header>span{align-items:stretch;display:flex;flex:1 1}.bp3-panel-stack-header .bp3-heading{margin:0 5px}.bp3-button.bp3-panel-stack-header-back{margin-left:5px;padding-left:0;white-space:nowrap}.bp3-button.bp3-panel-stack-header-back .bp3-icon{margin:0 2px}.bp3-panel-stack-view{bottom:0;left:0;position:absolute;right:0;top:0;background-color:#fff;border-right:1px solid rgba(16,22,26,.15);display:flex;flex-direction:column;margin-right:-1px;overflow-y:auto;z-index:1}.bp3-dark .bp3-panel-stack-view{background-color:#30404d}.bp3-panel-stack-view:nth-last-child(n+4){display:none}.bp3-panel-stack-push .bp3-panel-stack-appear,.bp3-panel-stack-push .bp3-panel-stack-enter{transform:translateX(100%);opacity:0}.bp3-panel-stack-push .bp3-panel-stack-appear-active,.bp3-panel-stack-push .bp3-panel-stack-enter-active{transform:translate(0);opacity:1;transition-delay:0;transition-duration:.4s;transition-property:transform,opacity;transition-timing-function:ease}.bp3-panel-stack-push .bp3-panel-stack-exit{transform:translate(0);opacity:1}.bp3-panel-stack-push .bp3-panel-stack-exit-active{transform:translateX(-50%);opacity:0;transition-delay:0;transition-duration:.4s;transition-property:transform,opacity;transition-timing-function:ease}.bp3-panel-stack-pop .bp3-panel-stack-appear,.bp3-panel-stack-pop .bp3-panel-stack-enter{transform:translateX(-50%);opacity:0}.bp3-panel-stack-pop .bp3-panel-stack-appear-active,.bp3-panel-stack-pop .bp3-panel-stack-enter-active{transform:translate(0);opacity:1;transition-delay:0;transition-duration:.4s;transition-property:transform,opacity;transition-timing-function:ease}.bp3-panel-stack-pop .bp3-panel-stack-exit{transform:translate(0);opacity:1}.bp3-panel-stack-pop .bp3-panel-stack-exit-active{transform:translateX(100%);opacity:0;transition-delay:0;transition-duration:.4s;transition-property:transform,opacity;transition-timing-function:ease}.bp3-popover{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2);transform:scale(1);border-radius:3px;display:inline-block;z-index:20}.bp3-popover .bp3-popover-arrow{height:30px;position:absolute;width:30px}.bp3-popover .bp3-popover-arrow:before{height:20px;margin:5px;width:20px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-popover{margin-bottom:17px;margin-top:-17px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-popover>.bp3-popover-arrow{bottom:-11px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-popover>.bp3-popover-arrow svg{transform:rotate(-90deg)}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-popover{margin-left:17px}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-popover>.bp3-popover-arrow{left:-11px}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-popover>.bp3-popover-arrow svg{transform:rotate(0)}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-popover{margin-top:17px}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-popover>.bp3-popover-arrow{top:-11px}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-popover>.bp3-popover-arrow svg{transform:rotate(90deg)}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-popover{margin-left:-17px;margin-right:17px}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-popover>.bp3-popover-arrow{right:-11px}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-popover>.bp3-popover-arrow svg{transform:rotate(180deg)}.bp3-tether-element-attached-middle>.bp3-popover>.bp3-popover-arrow{top:50%;transform:translateY(-50%)}.bp3-tether-element-attached-center>.bp3-popover>.bp3-popover-arrow{right:50%;transform:translateX(50%)}.bp3-tether-element-attached-top.bp3-tether-target-attached-top>.bp3-popover>.bp3-popover-arrow{top:-.3934px}.bp3-tether-element-attached-right.bp3-tether-target-attached-right>.bp3-popover>.bp3-popover-arrow{right:-.3934px}.bp3-tether-element-attached-left.bp3-tether-target-attached-left>.bp3-popover>.bp3-popover-arrow{left:-.3934px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom>.bp3-popover>.bp3-popover-arrow{bottom:-.3934px}.bp3-tether-element-attached-top.bp3-tether-element-attached-left>.bp3-popover{transform-origin:top left}.bp3-tether-element-attached-top.bp3-tether-element-attached-center>.bp3-popover{transform-origin:top center}.bp3-tether-element-attached-top.bp3-tether-element-attached-right>.bp3-popover{transform-origin:top right}.bp3-tether-element-attached-middle.bp3-tether-element-attached-left>.bp3-popover{transform-origin:center left}.bp3-tether-element-attached-middle.bp3-tether-element-attached-center>.bp3-popover{transform-origin:center center}.bp3-tether-element-attached-middle.bp3-tether-element-attached-right>.bp3-popover{transform-origin:center right}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-left>.bp3-popover{transform-origin:bottom left}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-center>.bp3-popover{transform-origin:bottom center}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-right>.bp3-popover{transform-origin:bottom right}.bp3-popover .bp3-popover-content{background:#fff;color:inherit}.bp3-popover .bp3-popover-arrow:before{box-shadow:1px 1px 6px rgba(16,22,26,.2)}.bp3-popover .bp3-popover-arrow-border{fill:#10161a;fill-opacity:.1}.bp3-popover .bp3-popover-arrow-fill{fill:#fff}.bp3-popover-appear>.bp3-popover,.bp3-popover-enter>.bp3-popover{transform:scale(.3)}.bp3-popover-appear-active>.bp3-popover,.bp3-popover-enter-active>.bp3-popover{transform:scale(1);transition-delay:0;transition-duration:.3s;transition-property:transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-popover-exit>.bp3-popover{transform:scale(1)}.bp3-popover-exit-active>.bp3-popover{transform:scale(.3);transition-delay:0;transition-duration:.3s;transition-property:transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-popover .bp3-popover-content{border-radius:3px;position:relative}.bp3-popover.bp3-popover-content-sizing .bp3-popover-content{max-width:350px;padding:20px}.bp3-popover-target+.bp3-overlay .bp3-popover.bp3-popover-content-sizing{width:350px}.bp3-popover.bp3-minimal{margin:0!important}.bp3-popover.bp3-minimal .bp3-popover-arrow{display:none}.bp3-popover-appear>.bp3-popover.bp3-minimal.bp3-popover,.bp3-popover-enter>.bp3-popover.bp3-minimal.bp3-popover,.bp3-popover.bp3-minimal.bp3-popover{transform:scale(1)}.bp3-popover-appear-active>.bp3-popover.bp3-minimal.bp3-popover,.bp3-popover-enter-active>.bp3-popover.bp3-minimal.bp3-popover{transform:scale(1);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-popover-exit>.bp3-popover.bp3-minimal.bp3-popover{transform:scale(1)}.bp3-popover-exit-active>.bp3-popover.bp3-minimal.bp3-popover{transform:scale(1);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-dark .bp3-popover,.bp3-popover.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-dark .bp3-popover .bp3-popover-content,.bp3-popover.bp3-dark .bp3-popover-content{background:#30404d;color:inherit}.bp3-dark .bp3-popover .bp3-popover-arrow:before,.bp3-popover.bp3-dark .bp3-popover-arrow:before{box-shadow:1px 1px 6px rgba(16,22,26,.4)}.bp3-dark .bp3-popover .bp3-popover-arrow-border,.bp3-popover.bp3-dark .bp3-popover-arrow-border{fill:#10161a;fill-opacity:.2}.bp3-dark .bp3-popover .bp3-popover-arrow-fill,.bp3-popover.bp3-dark .bp3-popover-arrow-fill{fill:#30404d}.bp3-popover-arrow:before{border-radius:2px;content:"";display:block;position:absolute;transform:rotate(45deg)}.bp3-tether-pinned .bp3-popover-arrow{display:none}.bp3-popover-backdrop{background:hsla(0,0%,100%,0)}.bp3-transition-container{opacity:1;display:flex;z-index:20}.bp3-transition-container.bp3-popover-appear,.bp3-transition-container.bp3-popover-enter{opacity:0}.bp3-transition-container.bp3-popover-appear-active,.bp3-transition-container.bp3-popover-enter-active{opacity:1;transition-delay:0;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-transition-container.bp3-popover-exit{opacity:1}.bp3-transition-container.bp3-popover-exit-active{opacity:0;transition-delay:0;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-transition-container:focus{outline:none}.bp3-transition-container.bp3-popover-leave .bp3-popover-content{pointer-events:none}.bp3-transition-container[data-x-out-of-boundaries]{display:none}span.bp3-popover-target{display:inline-block}.bp3-popover-wrapper.bp3-fill{width:100%}.bp3-portal{left:0;position:absolute;right:0;top:0}@keyframes linear-progress-bar-stripes{0%{background-position:0 0}to{background-position:30px 0}}.bp3-progress-bar{background:rgba(92,112,128,.2);border-radius:40px;display:block;height:8px;overflow:hidden;position:relative;width:100%}.bp3-progress-bar .bp3-progress-meter{background:linear-gradient(-45deg,hsla(0,0%,100%,.2) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.2) 0,hsla(0,0%,100%,.2) 75%,transparent 0);background-color:rgba(92,112,128,.8);background-size:30px 30px;border-radius:40px;height:100%;position:absolute;transition:width .2s cubic-bezier(.4,1,.75,.9);width:100%}.bp3-progress-bar:not(.bp3-no-animation):not(.bp3-no-stripes) .bp3-progress-meter{animation:linear-progress-bar-stripes .3s linear infinite reverse}.bp3-progress-bar.bp3-no-stripes .bp3-progress-meter{background-image:none}.bp3-dark .bp3-progress-bar{background:rgba(16,22,26,.5)}.bp3-dark .bp3-progress-bar .bp3-progress-meter{background-color:#8a9ba8}.bp3-progress-bar.bp3-intent-primary .bp3-progress-meter{background-color:#137cbd}.bp3-progress-bar.bp3-intent-success .bp3-progress-meter{background-color:#0f9960}.bp3-progress-bar.bp3-intent-warning .bp3-progress-meter{background-color:#d9822b}.bp3-progress-bar.bp3-intent-danger .bp3-progress-meter{background-color:#db3737}@keyframes skeleton-glow{0%{background:rgba(206,217,224,.2);border-color:rgba(206,217,224,.2)}to{background:rgba(92,112,128,.2);border-color:rgba(92,112,128,.2)}}.bp3-skeleton{animation:skeleton-glow 1s linear infinite alternate;background:rgba(206,217,224,.2);background-clip:padding-box!important;border-color:rgba(206,217,224,.2)!important;border-radius:2px;box-shadow:none!important;color:transparent!important;cursor:default;pointer-events:none;-webkit-user-select:none;user-select:none}.bp3-skeleton *,.bp3-skeleton:after,.bp3-skeleton:before{visibility:hidden!important}.bp3-slider{height:40px;min-width:150px;width:100%;cursor:default;outline:none;position:relative;-webkit-user-select:none;user-select:none}.bp3-slider:hover{cursor:pointer}.bp3-slider:active{cursor:-webkit-grabbing;cursor:grabbing}.bp3-slider.bp3-disabled{cursor:not-allowed;opacity:.5}.bp3-slider.bp3-slider-unlabeled{height:16px}.bp3-slider-progress,.bp3-slider-track{height:6px;left:0;right:0;top:5px;position:absolute}.bp3-slider-track{border-radius:3px;overflow:hidden}.bp3-slider-progress{background:rgba(92,112,128,.2)}.bp3-dark .bp3-slider-progress{background:rgba(16,22,26,.5)}.bp3-slider-progress.bp3-intent-primary{background-color:#137cbd}.bp3-slider-progress.bp3-intent-success{background-color:#0f9960}.bp3-slider-progress.bp3-intent-warning{background-color:#d9822b}.bp3-slider-progress.bp3-intent-danger{background-color:#db3737}.bp3-slider-handle{background-color:#f5f8fa;background-image:linear-gradient(180deg,hsla(0,0%,100%,.8),hsla(0,0%,100%,0));box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1);color:#182026;border-radius:3px;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 1px 1px rgba(16,22,26,.2);cursor:pointer;height:16px;left:0;position:absolute;top:0;width:16px}.bp3-slider-handle.bp3-active,.bp3-slider-handle:active{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-slider-handle.bp3-disabled,.bp3-slider-handle:disabled{background-color:rgba(206,217,224,.5);background-image:none;box-shadow:none;color:rgba(92,112,128,.6);cursor:not-allowed;outline:none}.bp3-slider-handle.bp3-disabled.bp3-active,.bp3-slider-handle.bp3-disabled.bp3-active:hover,.bp3-slider-handle:disabled.bp3-active,.bp3-slider-handle:disabled.bp3-active:hover{background:rgba(206,217,224,.7)}.bp3-slider-handle:focus{z-index:1}.bp3-slider-handle:hover{background-clip:padding-box;background-color:#ebf1f5;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 -1px 0 rgba(16,22,26,.1);box-shadow:0 0 0 1px rgba(16,22,26,.2),0 1px 1px rgba(16,22,26,.2);cursor:-webkit-grab;cursor:grab;z-index:2}.bp3-slider-handle.bp3-active{background-color:#d8e1e8;background-image:none;box-shadow:inset 0 0 0 1px rgba(16,22,26,.2),inset 0 1px 2px rgba(16,22,26,.2);box-shadow:0 0 0 1px rgba(16,22,26,.2),inset 0 1px 1px rgba(16,22,26,.1);cursor:-webkit-grabbing;cursor:grabbing}.bp3-disabled .bp3-slider-handle{background:#bfccd6;box-shadow:none;pointer-events:none}.bp3-dark .bp3-slider-handle{background-color:#394b59;background-image:linear-gradient(180deg,hsla(0,0%,100%,.05),hsla(0,0%,100%,0));box-shadow:0 0 0 1px rgba(16,22,26,.4);color:#f5f8fa}.bp3-dark .bp3-slider-handle.bp3-active,.bp3-dark .bp3-slider-handle:active,.bp3-dark .bp3-slider-handle:hover{color:#f5f8fa}.bp3-dark .bp3-slider-handle:hover{background-color:#30404d;box-shadow:0 0 0 1px rgba(16,22,26,.4)}.bp3-dark .bp3-slider-handle.bp3-active,.bp3-dark .bp3-slider-handle:active{background-color:#202b33;background-image:none;box-shadow:0 0 0 1px rgba(16,22,26,.6),inset 0 1px 2px rgba(16,22,26,.2)}.bp3-dark .bp3-slider-handle.bp3-disabled,.bp3-dark .bp3-slider-handle:disabled{background-color:rgba(57,75,89,.5);background-image:none;box-shadow:none;color:rgba(167,182,194,.6)}.bp3-dark .bp3-slider-handle.bp3-disabled.bp3-active,.bp3-dark .bp3-slider-handle:disabled.bp3-active{background:rgba(57,75,89,.7)}.bp3-dark .bp3-slider-handle .bp3-button-spinner .bp3-spinner-head{background:rgba(16,22,26,.5);stroke:#8a9ba8}.bp3-dark .bp3-slider-handle,.bp3-dark .bp3-slider-handle:hover{background-color:#394b59}.bp3-dark .bp3-slider-handle.bp3-active{background-color:#293742}.bp3-dark .bp3-disabled .bp3-slider-handle{background:#5c7080;border-color:#5c7080;box-shadow:none}.bp3-slider-handle .bp3-slider-label{background:#394b59;border-radius:3px;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2);color:#f5f8fa;margin-left:8px}.bp3-dark .bp3-slider-handle .bp3-slider-label{background:#e1e8ed;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4);color:#394b59}.bp3-disabled .bp3-slider-handle .bp3-slider-label{box-shadow:none}.bp3-slider-handle.bp3-end,.bp3-slider-handle.bp3-start{width:8px}.bp3-slider-handle.bp3-start{border-bottom-right-radius:0;border-top-right-radius:0}.bp3-slider-handle.bp3-end{border-bottom-left-radius:0;border-top-left-radius:0;margin-left:8px}.bp3-slider-handle.bp3-end .bp3-slider-label{margin-left:0}.bp3-slider-label{transform:translate(-50%,20px);display:inline-block;font-size:12px;line-height:1;padding:2px 5px;position:absolute;vertical-align:top}.bp3-slider.bp3-vertical{height:150px;min-width:40px;width:40px}.bp3-slider.bp3-vertical .bp3-slider-progress,.bp3-slider.bp3-vertical .bp3-slider-track{bottom:0;height:auto;left:5px;top:0;width:6px}.bp3-slider.bp3-vertical .bp3-slider-progress{top:auto}.bp3-slider.bp3-vertical .bp3-slider-label{transform:translate(20px,50%)}.bp3-slider.bp3-vertical .bp3-slider-handle{top:auto}.bp3-slider.bp3-vertical .bp3-slider-handle .bp3-slider-label{margin-left:0;margin-top:-8px}.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end,.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{height:8px;margin-left:0;width:16px}.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{border-bottom-right-radius:3px;border-top-left-radius:0}.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start .bp3-slider-label{transform:translate(20px)}.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:3px;margin-bottom:8px}@keyframes pt-spinner-animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.bp3-spinner{align-items:center;display:flex;justify-content:center;overflow:visible;vertical-align:middle}.bp3-spinner svg{display:block}.bp3-spinner path{fill-opacity:0}.bp3-spinner .bp3-spinner-head{stroke:rgba(92,112,128,.8);stroke-linecap:round;transform-origin:center;transition:stroke-dashoffset .2s cubic-bezier(.4,1,.75,.9)}.bp3-spinner .bp3-spinner-track{stroke:rgba(92,112,128,.2)}.bp3-spinner-animation{animation:pt-spinner-animation .5s linear infinite}.bp3-no-spin>.bp3-spinner-animation{animation:none}.bp3-dark .bp3-spinner .bp3-spinner-head{stroke:#8a9ba8}.bp3-dark .bp3-spinner .bp3-spinner-track{stroke:rgba(16,22,26,.5)}.bp3-spinner.bp3-intent-primary .bp3-spinner-head{stroke:#137cbd}.bp3-spinner.bp3-intent-success .bp3-spinner-head{stroke:#0f9960}.bp3-spinner.bp3-intent-warning .bp3-spinner-head{stroke:#d9822b}.bp3-spinner.bp3-intent-danger .bp3-spinner-head{stroke:#db3737}.bp3-tabs.bp3-vertical{display:flex}.bp3-tabs.bp3-vertical>.bp3-tab-list{align-items:flex-start;flex-direction:column}.bp3-tabs.bp3-vertical>.bp3-tab-list .bp3-tab{border-radius:3px;padding:0 10px;width:100%}.bp3-tabs.bp3-vertical>.bp3-tab-list .bp3-tab[aria-selected=true]{background-color:rgba(19,124,189,.2);box-shadow:none}.bp3-tabs.bp3-vertical>.bp3-tab-list .bp3-tab-indicator-wrapper .bp3-tab-indicator{background-color:rgba(19,124,189,.2);border-radius:3px;bottom:0;height:auto;left:0;right:0;top:0}.bp3-tabs.bp3-vertical>.bp3-tab-panel{margin-top:0;padding-left:20px}.bp3-tab-list{align-items:flex-end;border:none;display:flex;flex:0 0 auto;list-style:none;margin:0;padding:0;position:relative}.bp3-tab-list>:not(:last-child){margin-right:20px}.bp3-tab{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;color:#182026;cursor:pointer;flex:0 0 auto;font-size:14px;line-height:30px;max-width:100%;position:relative;vertical-align:top}.bp3-tab a{color:inherit;display:block;text-decoration:none}.bp3-tab-indicator-wrapper~.bp3-tab{background-color:initial!important;box-shadow:none!important}.bp3-tab[aria-disabled=true]{color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-tab[aria-selected=true]{border-radius:0;box-shadow:inset 0 -3px 0 #106ba3}.bp3-tab:not([aria-disabled=true]):hover,.bp3-tab[aria-selected=true]{color:#106ba3}.bp3-tab:focus{-moz-outline-radius:0}.bp3-large>.bp3-tab{font-size:16px;line-height:40px}.bp3-tab-panel{margin-top:20px}.bp3-tab-panel[aria-hidden=true]{display:none}.bp3-tab-indicator-wrapper{left:0;pointer-events:none;position:absolute;top:0;transform:translateX(0),translateY(0);transition:height,transform,width;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-tab-indicator-wrapper .bp3-tab-indicator{background-color:#106ba3;bottom:0;height:3px;left:0;position:absolute;right:0}.bp3-tab-indicator-wrapper.bp3-no-animation{transition:none}.bp3-dark .bp3-tab{color:#f5f8fa}.bp3-dark .bp3-tab[aria-disabled=true]{color:rgba(167,182,194,.6)}.bp3-dark .bp3-tab[aria-selected=true]{box-shadow:inset 0 -3px 0 #48aff0}.bp3-dark .bp3-tab:not([aria-disabled=true]):hover,.bp3-dark .bp3-tab[aria-selected=true]{color:#48aff0}.bp3-dark .bp3-tab-indicator{background-color:#48aff0}.bp3-flex-expander{flex:1 1}.bp3-tag{display:inline-flex;flex-direction:row;align-items:center;background-color:#5c7080;border:none;border-radius:3px;box-shadow:none;color:#f5f8fa;font-size:12px;line-height:16px;max-width:100%;min-height:20px;min-width:20px;padding:2px 6px;position:relative}.bp3-tag.bp3-interactive{cursor:pointer}.bp3-tag.bp3-interactive:hover{background-color:rgba(92,112,128,.85)}.bp3-tag.bp3-interactive.bp3-active,.bp3-tag.bp3-interactive:active{background-color:rgba(92,112,128,.7)}.bp3-tag>*{flex-grow:0;flex-shrink:0}.bp3-tag>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-tag:before,.bp3-tag>*{margin-right:4px}.bp3-tag:empty:before,.bp3-tag>:last-child{margin-right:0}.bp3-tag:focus{outline:2px auto rgba(19,124,189,.6);outline-offset:0;-moz-outline-radius:6px}.bp3-tag.bp3-round{border-radius:30px;padding-left:8px;padding-right:8px}.bp3-dark .bp3-tag{background-color:#bfccd6;color:#182026}.bp3-dark .bp3-tag.bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-interactive:hover{background-color:rgba(191,204,214,.85)}.bp3-dark .bp3-tag.bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-interactive:active{background-color:rgba(191,204,214,.7)}.bp3-dark .bp3-tag .bp3-icon-large,.bp3-dark .bp3-tag .bp3-icon-standard,.bp3-dark .bp3-tag>.bp3-icon{fill:currentColor}.bp3-tag .bp3-icon-large,.bp3-tag .bp3-icon-standard,.bp3-tag>.bp3-icon{fill:#fff}.bp3-large .bp3-tag,.bp3-tag.bp3-large{font-size:14px;line-height:20px;min-height:30px;min-width:30px;padding:5px 10px}.bp3-large .bp3-tag:before,.bp3-large .bp3-tag>*,.bp3-tag.bp3-large:before,.bp3-tag.bp3-large>*{margin-right:7px}.bp3-large .bp3-tag:empty:before,.bp3-large .bp3-tag>:last-child,.bp3-tag.bp3-large:empty:before,.bp3-tag.bp3-large>:last-child{margin-right:0}.bp3-large .bp3-tag.bp3-round,.bp3-tag.bp3-large.bp3-round{padding-left:12px;padding-right:12px}.bp3-tag.bp3-intent-primary{background:#137cbd;color:#fff}.bp3-tag.bp3-intent-primary.bp3-interactive{cursor:pointer}.bp3-tag.bp3-intent-primary.bp3-interactive:hover{background-color:rgba(19,124,189,.85)}.bp3-tag.bp3-intent-primary.bp3-interactive.bp3-active,.bp3-tag.bp3-intent-primary.bp3-interactive:active{background-color:rgba(19,124,189,.7)}.bp3-tag.bp3-intent-success{background:#0f9960;color:#fff}.bp3-tag.bp3-intent-success.bp3-interactive{cursor:pointer}.bp3-tag.bp3-intent-success.bp3-interactive:hover{background-color:rgba(15,153,96,.85)}.bp3-tag.bp3-intent-success.bp3-interactive.bp3-active,.bp3-tag.bp3-intent-success.bp3-interactive:active{background-color:rgba(15,153,96,.7)}.bp3-tag.bp3-intent-warning{background:#d9822b;color:#fff}.bp3-tag.bp3-intent-warning.bp3-interactive{cursor:pointer}.bp3-tag.bp3-intent-warning.bp3-interactive:hover{background-color:rgba(217,130,43,.85)}.bp3-tag.bp3-intent-warning.bp3-interactive.bp3-active,.bp3-tag.bp3-intent-warning.bp3-interactive:active{background-color:rgba(217,130,43,.7)}.bp3-tag.bp3-intent-danger{background:#db3737;color:#fff}.bp3-tag.bp3-intent-danger.bp3-interactive{cursor:pointer}.bp3-tag.bp3-intent-danger.bp3-interactive:hover{background-color:rgba(219,55,55,.85)}.bp3-tag.bp3-intent-danger.bp3-interactive.bp3-active,.bp3-tag.bp3-intent-danger.bp3-interactive:active{background-color:rgba(219,55,55,.7)}.bp3-tag.bp3-fill{display:flex;width:100%}.bp3-tag.bp3-minimal .bp3-icon-large,.bp3-tag.bp3-minimal .bp3-icon-standard,.bp3-tag.bp3-minimal>.bp3-icon{fill:#5c7080}.bp3-tag.bp3-minimal:not([class*=bp3-intent-]){background-color:rgba(138,155,168,.2);color:#182026}.bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive{cursor:pointer}.bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive:hover{background-color:rgba(92,112,128,.3)}.bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive.bp3-active,.bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive:active{background-color:rgba(92,112,128,.4)}.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]){color:#f5f8fa}.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive:hover{background-color:rgba(191,204,214,.3)}.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]).bp3-interactive:active{background-color:rgba(191,204,214,.4)}.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]) .bp3-icon-large,.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-]) .bp3-icon-standard,.bp3-dark .bp3-tag.bp3-minimal:not([class*=bp3-intent-])>.bp3-icon{fill:#a7b6c2}.bp3-tag.bp3-minimal.bp3-intent-primary{background-color:rgba(19,124,189,.15);color:#106ba3}.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{cursor:pointer}.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{background-color:rgba(19,124,189,.25)}.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active,.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{background-color:rgba(19,124,189,.35)}.bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-large,.bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-standard,.bp3-tag.bp3-minimal.bp3-intent-primary>.bp3-icon{fill:#137cbd}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary{background-color:rgba(19,124,189,.25);color:#48aff0}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{background-color:rgba(19,124,189,.35)}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{background-color:rgba(19,124,189,.45)}.bp3-tag.bp3-minimal.bp3-intent-success{background-color:rgba(15,153,96,.15);color:#0d8050}.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{cursor:pointer}.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{background-color:rgba(15,153,96,.25)}.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active,.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{background-color:rgba(15,153,96,.35)}.bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-large,.bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-standard,.bp3-tag.bp3-minimal.bp3-intent-success>.bp3-icon{fill:#0f9960}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success{background-color:rgba(15,153,96,.25);color:#3dcc91}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{background-color:rgba(15,153,96,.35)}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{background-color:rgba(15,153,96,.45)}.bp3-tag.bp3-minimal.bp3-intent-warning{background-color:rgba(217,130,43,.15);color:#bf7326}.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{cursor:pointer}.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{background-color:rgba(217,130,43,.25)}.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active,.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{background-color:rgba(217,130,43,.35)}.bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-large,.bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-standard,.bp3-tag.bp3-minimal.bp3-intent-warning>.bp3-icon{fill:#d9822b}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning{background-color:rgba(217,130,43,.25);color:#ffb366}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{background-color:rgba(217,130,43,.35)}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{background-color:rgba(217,130,43,.45)}.bp3-tag.bp3-minimal.bp3-intent-danger{background-color:rgba(219,55,55,.15);color:#c23030}.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{cursor:pointer}.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{background-color:rgba(219,55,55,.25)}.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active,.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{background-color:rgba(219,55,55,.35)}.bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-large,.bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-standard,.bp3-tag.bp3-minimal.bp3-intent-danger>.bp3-icon{fill:#db3737}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger{background-color:rgba(219,55,55,.25);color:#ff7373}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{cursor:pointer}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{background-color:rgba(219,55,55,.35)}.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active,.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{background-color:rgba(219,55,55,.45)}.bp3-tag-remove{background:none;border:none;color:inherit;cursor:pointer;display:flex;margin-bottom:-2px;margin-right:-6px!important;margin-top:-2px;opacity:.5;padding:2px 2px 2px 0}.bp3-tag-remove:hover{background:none;opacity:.8;text-decoration:none}.bp3-tag-remove:active{opacity:1}.bp3-tag-remove:empty:before{font-family:Icons16,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;content:"\E6D7"}.bp3-large .bp3-tag-remove{margin-right:-10px!important;padding:5px 5px 5px 0}.bp3-large .bp3-tag-remove:empty:before{font-family:Icons20,sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1}.bp3-tag-input{display:flex;flex-direction:row;align-items:flex-start;cursor:text;height:auto;line-height:inherit;min-height:30px;padding-left:5px;padding-right:0}.bp3-tag-input>*{flex-grow:0;flex-shrink:0}.bp3-tag-input>.bp3-tag-input-values{flex-grow:1;flex-shrink:1}.bp3-tag-input .bp3-tag-input-icon{color:#5c7080;margin-left:2px;margin-right:7px;margin-top:7px}.bp3-tag-input .bp3-tag-input-values{display:flex;flex-direction:row;align-items:center;align-self:stretch;flex-wrap:wrap;margin-right:7px;margin-top:5px;min-width:0}.bp3-tag-input .bp3-tag-input-values>*{flex-grow:0;flex-shrink:0}.bp3-tag-input .bp3-tag-input-values>.bp3-fill{flex-grow:1;flex-shrink:1}.bp3-tag-input .bp3-tag-input-values:before,.bp3-tag-input .bp3-tag-input-values>*{margin-right:5px}.bp3-tag-input .bp3-tag-input-values:empty:before,.bp3-tag-input .bp3-tag-input-values>:last-child{margin-right:0}.bp3-tag-input .bp3-tag-input-values:first-child .bp3-input-ghost:first-child{padding-left:5px}.bp3-tag-input .bp3-tag-input-values>*{margin-bottom:5px}.bp3-tag-input .bp3-tag{overflow-wrap:break-word}.bp3-tag-input .bp3-tag.bp3-active{outline:2px auto rgba(19,124,189,.6);outline-offset:0;-moz-outline-radius:6px}.bp3-tag-input .bp3-input-ghost{flex:1 1 auto;line-height:20px;width:80px}.bp3-tag-input .bp3-input-ghost.bp3-disabled,.bp3-tag-input .bp3-input-ghost:disabled{cursor:not-allowed}.bp3-tag-input .bp3-button,.bp3-tag-input .bp3-spinner{margin:3px 3px 3px 0}.bp3-tag-input .bp3-button{min-height:24px;min-width:24px;padding:0 7px}.bp3-tag-input.bp3-large{height:auto;min-height:40px}.bp3-tag-input.bp3-large:before,.bp3-tag-input.bp3-large>*{margin-right:10px}.bp3-tag-input.bp3-large:empty:before,.bp3-tag-input.bp3-large>:last-child{margin-right:0}.bp3-tag-input.bp3-large .bp3-tag-input-icon{margin-left:5px;margin-top:10px}.bp3-tag-input.bp3-large .bp3-input-ghost{line-height:30px}.bp3-tag-input.bp3-large .bp3-button{min-height:30px;min-width:30px;padding:5px 10px;margin:5px 5px 5px 0}.bp3-tag-input.bp3-large .bp3-spinner{margin:8px 8px 8px 0}.bp3-tag-input.bp3-active{background-color:#fff;box-shadow:0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-tag-input.bp3-active.bp3-intent-primary{box-shadow:0 0 0 1px #106ba3,0 0 0 3px rgba(16,107,163,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-tag-input.bp3-active.bp3-intent-success{box-shadow:0 0 0 1px #0d8050,0 0 0 3px rgba(13,128,80,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-tag-input.bp3-active.bp3-intent-warning{box-shadow:0 0 0 1px #bf7326,0 0 0 3px rgba(191,115,38,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-tag-input.bp3-active.bp3-intent-danger{box-shadow:0 0 0 1px #c23030,0 0 0 3px rgba(194,48,48,.3),inset 0 1px 1px rgba(16,22,26,.2)}.bp3-dark .bp3-tag-input .bp3-tag-input-icon,.bp3-tag-input.bp3-dark .bp3-tag-input-icon{color:#a7b6c2}.bp3-dark .bp3-tag-input .bp3-input-ghost,.bp3-tag-input.bp3-dark .bp3-input-ghost{color:#f5f8fa}.bp3-dark .bp3-tag-input .bp3-input-ghost::-webkit-input-placeholder,.bp3-tag-input.bp3-dark .bp3-input-ghost::-webkit-input-placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-tag-input .bp3-input-ghost::placeholder,.bp3-tag-input.bp3-dark .bp3-input-ghost::placeholder{color:rgba(167,182,194,.6)}.bp3-dark .bp3-tag-input.bp3-active,.bp3-tag-input.bp3-dark.bp3-active{background-color:rgba(16,22,26,.3);box-shadow:0 0 0 1px #137cbd,0 0 0 1px #137cbd,0 0 0 3px rgba(19,124,189,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-primary,.bp3-tag-input.bp3-dark.bp3-active.bp3-intent-primary{box-shadow:0 0 0 1px #106ba3,0 0 0 3px rgba(16,107,163,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-success,.bp3-tag-input.bp3-dark.bp3-active.bp3-intent-success{box-shadow:0 0 0 1px #0d8050,0 0 0 3px rgba(13,128,80,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-warning,.bp3-tag-input.bp3-dark.bp3-active.bp3-intent-warning{box-shadow:0 0 0 1px #bf7326,0 0 0 3px rgba(191,115,38,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-danger,.bp3-tag-input.bp3-dark.bp3-active.bp3-intent-danger{box-shadow:0 0 0 1px #c23030,0 0 0 3px rgba(194,48,48,.3),inset 0 0 0 1px rgba(16,22,26,.3),inset 0 1px 1px rgba(16,22,26,.4)}.bp3-input-ghost{background:none;border:none;box-shadow:none;padding:0}.bp3-input-ghost::-webkit-input-placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-input-ghost::placeholder{color:rgba(92,112,128,.6);opacity:1}.bp3-input-ghost:focus{outline:none!important}.bp3-toast{align-items:flex-start;background-color:#fff;border-radius:3px;box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2);display:flex;margin:20px 0 0;max-width:500px;min-width:300px;pointer-events:all;position:relative!important}.bp3-toast.bp3-toast-appear,.bp3-toast.bp3-toast-enter{transform:translateY(-40px)}.bp3-toast.bp3-toast-appear-active,.bp3-toast.bp3-toast-enter-active{transform:translateY(0);transition-delay:0;transition-duration:.3s;transition-property:transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-toast.bp3-toast-appear~.bp3-toast,.bp3-toast.bp3-toast-enter~.bp3-toast{transform:translateY(-40px)}.bp3-toast.bp3-toast-appear-active~.bp3-toast,.bp3-toast.bp3-toast-enter-active~.bp3-toast{transform:translateY(0);transition-delay:0;transition-duration:.3s;transition-property:transform;transition-timing-function:cubic-bezier(.54,1.12,.38,1.11)}.bp3-toast.bp3-toast-exit{opacity:1;-webkit-filter:blur(0);filter:blur(0)}.bp3-toast.bp3-toast-exit-active{opacity:0;-webkit-filter:blur(10px);filter:blur(10px);transition-delay:0;transition-duration:.3s;transition-property:opacity,-webkit-filter;transition-property:opacity,filter;transition-property:opacity,filter,-webkit-filter;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-toast.bp3-toast-exit~.bp3-toast{transform:translateY(0)}.bp3-toast.bp3-toast-exit-active~.bp3-toast{transform:translateY(-40px);transition-delay:50ms;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-toast .bp3-button-group{flex:0 0 auto;padding:5px 5px 5px 0}.bp3-toast>.bp3-icon{color:#5c7080;margin:12px 0 12px 12px}.bp3-dark .bp3-toast,.bp3-toast.bp3-dark{background-color:#394b59;box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-dark .bp3-toast>.bp3-icon,.bp3-toast.bp3-dark>.bp3-icon{color:#a7b6c2}.bp3-toast[class*=bp3-intent-] a{color:hsla(0,0%,100%,.7)}.bp3-toast[class*=bp3-intent-]>.bp3-icon,.bp3-toast[class*=bp3-intent-] a:hover{color:#fff}.bp3-toast[class*=bp3-intent-] .bp3-button,.bp3-toast[class*=bp3-intent-] .bp3-button .bp3-icon,.bp3-toast[class*=bp3-intent-] .bp3-button:active,.bp3-toast[class*=bp3-intent-] .bp3-button:before{color:hsla(0,0%,100%,.7)!important}.bp3-toast[class*=bp3-intent-] .bp3-button:focus{outline-color:hsla(0,0%,100%,.5)}.bp3-toast[class*=bp3-intent-] .bp3-button:hover{background-color:hsla(0,0%,100%,.15)!important;color:#fff!important}.bp3-toast[class*=bp3-intent-] .bp3-button:active{background-color:hsla(0,0%,100%,.3)!important;color:#fff!important}.bp3-toast[class*=bp3-intent-] .bp3-button:after{background:hsla(0,0%,100%,.3)!important}.bp3-toast.bp3-intent-primary{background-color:#137cbd;color:#fff}.bp3-toast.bp3-intent-success{background-color:#0f9960;color:#fff}.bp3-toast.bp3-intent-warning{background-color:#d9822b;color:#fff}.bp3-toast.bp3-intent-danger{background-color:#db3737;color:#fff}.bp3-toast-message{flex:1 1 auto;padding:11px;word-break:break-word}.bp3-toast-container{align-items:center;display:flex!important;flex-direction:column;left:0;overflow:hidden;padding:0 20px 20px;pointer-events:none;position:fixed;right:0;z-index:40}.bp3-toast-container.bp3-toast-container-top{top:0}.bp3-toast-container.bp3-toast-container-bottom{bottom:0;flex-direction:column-reverse;top:auto}.bp3-toast-container.bp3-toast-container-left{align-items:flex-start}.bp3-toast-container.bp3-toast-container-right{align-items:flex-end}.bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active),.bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active)~.bp3-toast,.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active),.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active)~.bp3-toast,.bp3-toast-container-bottom .bp3-toast.bp3-toast-exit-active~.bp3-toast,.bp3-toast-container-bottom .bp3-toast.bp3-toast-leave-active~.bp3-toast{transform:translateY(60px)}.bp3-tooltip{box-shadow:0 0 0 1px rgba(16,22,26,.1),0 2px 4px rgba(16,22,26,.2),0 8px 24px rgba(16,22,26,.2);transform:scale(1)}.bp3-tooltip .bp3-popover-arrow{height:22px;position:absolute;width:22px}.bp3-tooltip .bp3-popover-arrow:before{height:14px;margin:4px;width:14px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-tooltip{margin-bottom:11px;margin-top:-11px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-tooltip>.bp3-popover-arrow{bottom:-8px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top>.bp3-tooltip>.bp3-popover-arrow svg{transform:rotate(-90deg)}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-tooltip{margin-left:11px}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-tooltip>.bp3-popover-arrow{left:-8px}.bp3-tether-element-attached-left.bp3-tether-target-attached-right>.bp3-tooltip>.bp3-popover-arrow svg{transform:rotate(0)}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-tooltip{margin-top:11px}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-tooltip>.bp3-popover-arrow{top:-8px}.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom>.bp3-tooltip>.bp3-popover-arrow svg{transform:rotate(90deg)}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-tooltip{margin-left:-11px;margin-right:11px}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-tooltip>.bp3-popover-arrow{right:-8px}.bp3-tether-element-attached-right.bp3-tether-target-attached-left>.bp3-tooltip>.bp3-popover-arrow svg{transform:rotate(180deg)}.bp3-tether-element-attached-middle>.bp3-tooltip>.bp3-popover-arrow{top:50%;transform:translateY(-50%)}.bp3-tether-element-attached-center>.bp3-tooltip>.bp3-popover-arrow{right:50%;transform:translateX(50%)}.bp3-tether-element-attached-top.bp3-tether-target-attached-top>.bp3-tooltip>.bp3-popover-arrow{top:-.22183px}.bp3-tether-element-attached-right.bp3-tether-target-attached-right>.bp3-tooltip>.bp3-popover-arrow{right:-.22183px}.bp3-tether-element-attached-left.bp3-tether-target-attached-left>.bp3-tooltip>.bp3-popover-arrow{left:-.22183px}.bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom>.bp3-tooltip>.bp3-popover-arrow{bottom:-.22183px}.bp3-tether-element-attached-top.bp3-tether-element-attached-left>.bp3-tooltip{transform-origin:top left}.bp3-tether-element-attached-top.bp3-tether-element-attached-center>.bp3-tooltip{transform-origin:top center}.bp3-tether-element-attached-top.bp3-tether-element-attached-right>.bp3-tooltip{transform-origin:top right}.bp3-tether-element-attached-middle.bp3-tether-element-attached-left>.bp3-tooltip{transform-origin:center left}.bp3-tether-element-attached-middle.bp3-tether-element-attached-center>.bp3-tooltip{transform-origin:center center}.bp3-tether-element-attached-middle.bp3-tether-element-attached-right>.bp3-tooltip{transform-origin:center right}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-left>.bp3-tooltip{transform-origin:bottom left}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-center>.bp3-tooltip{transform-origin:bottom center}.bp3-tether-element-attached-bottom.bp3-tether-element-attached-right>.bp3-tooltip{transform-origin:bottom right}.bp3-tooltip .bp3-popover-content{background:#394b59;color:#f5f8fa}.bp3-tooltip .bp3-popover-arrow:before{box-shadow:1px 1px 6px rgba(16,22,26,.2)}.bp3-tooltip .bp3-popover-arrow-border{fill:#10161a;fill-opacity:.1}.bp3-tooltip .bp3-popover-arrow-fill{fill:#394b59}.bp3-popover-appear>.bp3-tooltip,.bp3-popover-enter>.bp3-tooltip{transform:scale(.8)}.bp3-popover-appear-active>.bp3-tooltip,.bp3-popover-enter-active>.bp3-tooltip{transform:scale(1);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-popover-exit>.bp3-tooltip{transform:scale(1)}.bp3-popover-exit-active>.bp3-tooltip{transform:scale(.8);transition-delay:0;transition-duration:.1s;transition-property:transform;transition-timing-function:cubic-bezier(.4,1,.75,.9)}.bp3-tooltip .bp3-popover-content{padding:10px 12px}.bp3-dark .bp3-tooltip,.bp3-tooltip.bp3-dark{box-shadow:0 0 0 1px rgba(16,22,26,.2),0 2px 4px rgba(16,22,26,.4),0 8px 24px rgba(16,22,26,.4)}.bp3-dark .bp3-tooltip .bp3-popover-content,.bp3-tooltip.bp3-dark .bp3-popover-content{background:#e1e8ed;color:#394b59}.bp3-dark .bp3-tooltip .bp3-popover-arrow:before,.bp3-tooltip.bp3-dark .bp3-popover-arrow:before{box-shadow:1px 1px 6px rgba(16,22,26,.4)}.bp3-dark .bp3-tooltip .bp3-popover-arrow-border,.bp3-tooltip.bp3-dark .bp3-popover-arrow-border{fill:#10161a;fill-opacity:.2}.bp3-dark .bp3-tooltip .bp3-popover-arrow-fill,.bp3-tooltip.bp3-dark .bp3-popover-arrow-fill{fill:#e1e8ed}.bp3-tooltip.bp3-intent-primary .bp3-popover-content{background:#137cbd;color:#fff}.bp3-tooltip.bp3-intent-primary .bp3-popover-arrow-fill{fill:#137cbd}.bp3-tooltip.bp3-intent-success .bp3-popover-content{background:#0f9960;color:#fff}.bp3-tooltip.bp3-intent-success .bp3-popover-arrow-fill{fill:#0f9960}.bp3-tooltip.bp3-intent-warning .bp3-popover-content{background:#d9822b;color:#fff}.bp3-tooltip.bp3-intent-warning .bp3-popover-arrow-fill{fill:#d9822b}.bp3-tooltip.bp3-intent-danger .bp3-popover-content{background:#db3737;color:#fff}.bp3-tooltip.bp3-intent-danger .bp3-popover-arrow-fill{fill:#db3737}.bp3-tooltip-indicator{border-bottom:1px dotted;cursor:help}.bp3-tree .bp3-icon,.bp3-tree .bp3-icon-large,.bp3-tree .bp3-icon-standard{color:#5c7080}.bp3-tree .bp3-icon-large.bp3-intent-primary,.bp3-tree .bp3-icon-standard.bp3-intent-primary,.bp3-tree .bp3-icon.bp3-intent-primary{color:#137cbd}.bp3-tree .bp3-icon-large.bp3-intent-success,.bp3-tree .bp3-icon-standard.bp3-intent-success,.bp3-tree .bp3-icon.bp3-intent-success{color:#0f9960}.bp3-tree .bp3-icon-large.bp3-intent-warning,.bp3-tree .bp3-icon-standard.bp3-intent-warning,.bp3-tree .bp3-icon.bp3-intent-warning{color:#d9822b}.bp3-tree .bp3-icon-large.bp3-intent-danger,.bp3-tree .bp3-icon-standard.bp3-intent-danger,.bp3-tree .bp3-icon.bp3-intent-danger{color:#db3737}.bp3-tree-node-list{list-style:none;margin:0;padding-left:0}.bp3-tree-root{background-color:initial;cursor:default;padding-left:0;position:relative}.bp3-tree-node-content-0{padding-left:0}.bp3-tree-node-content-1{padding-left:23px}.bp3-tree-node-content-2{padding-left:46px}.bp3-tree-node-content-3{padding-left:69px}.bp3-tree-node-content-4{padding-left:92px}.bp3-tree-node-content-5{padding-left:115px}.bp3-tree-node-content-6{padding-left:138px}.bp3-tree-node-content-7{padding-left:161px}.bp3-tree-node-content-8{padding-left:184px}.bp3-tree-node-content-9{padding-left:207px}.bp3-tree-node-content-10{padding-left:230px}.bp3-tree-node-content-11{padding-left:253px}.bp3-tree-node-content-12{padding-left:276px}.bp3-tree-node-content-13{padding-left:299px}.bp3-tree-node-content-14{padding-left:322px}.bp3-tree-node-content-15{padding-left:345px}.bp3-tree-node-content-16{padding-left:368px}.bp3-tree-node-content-17{padding-left:391px}.bp3-tree-node-content-18{padding-left:414px}.bp3-tree-node-content-19{padding-left:437px}.bp3-tree-node-content-20{padding-left:460px}.bp3-tree-node-content{align-items:center;display:flex;height:30px;padding-right:5px;width:100%}.bp3-tree-node-content:hover{background-color:rgba(191,204,214,.4)}.bp3-tree-node-caret,.bp3-tree-node-caret-none{min-width:30px}.bp3-tree-node-caret{color:#5c7080;cursor:pointer;padding:7px;transform:rotate(0deg);transition:transform .2s cubic-bezier(.4,1,.75,.9)}.bp3-tree-node-caret:hover{color:#182026}.bp3-dark .bp3-tree-node-caret{color:#a7b6c2}.bp3-dark .bp3-tree-node-caret:hover{color:#f5f8fa}.bp3-tree-node-caret.bp3-tree-node-caret-open{transform:rotate(90deg)}.bp3-tree-node-caret.bp3-icon-standard:before{content:"\E695"}.bp3-tree-node-icon{margin-right:7px;position:relative}.bp3-tree-node-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;flex:1 1 auto;position:relative;-webkit-user-select:none;user-select:none}.bp3-tree-node-label span{display:inline}.bp3-tree-node-secondary-label{padding:0 5px;-webkit-user-select:none;user-select:none}.bp3-tree-node-secondary-label .bp3-popover-target,.bp3-tree-node-secondary-label .bp3-popover-wrapper{align-items:center;display:flex}.bp3-tree-node.bp3-disabled .bp3-tree-node-content{background-color:inherit;color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-tree-node.bp3-disabled .bp3-tree-node-caret,.bp3-tree-node.bp3-disabled .bp3-tree-node-icon{color:rgba(92,112,128,.6);cursor:not-allowed}.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content{background-color:#137cbd}.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content,.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content .bp3-icon,.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content .bp3-icon-large,.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content .bp3-icon-standard{color:#fff}.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content .bp3-tree-node-caret:before{color:hsla(0,0%,100%,.7)}.bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content .bp3-tree-node-caret:hover:before{color:#fff}.bp3-dark .bp3-tree-node-content:hover{background-color:rgba(92,112,128,.3)}.bp3-dark .bp3-tree .bp3-icon,.bp3-dark .bp3-tree .bp3-icon-large,.bp3-dark .bp3-tree .bp3-icon-standard{color:#a7b6c2}.bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-primary,.bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-primary,.bp3-dark .bp3-tree .bp3-icon.bp3-intent-primary{color:#137cbd}.bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-success,.bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-success,.bp3-dark .bp3-tree .bp3-icon.bp3-intent-success{color:#0f9960}.bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-warning,.bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-warning,.bp3-dark .bp3-tree .bp3-icon.bp3-intent-warning{color:#d9822b}.bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-danger,.bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-danger,.bp3-dark .bp3-tree .bp3-icon.bp3-intent-danger{color:#db3737}.bp3-dark .bp3-tree-node.bp3-tree-node-selected>.bp3-tree-node-content{background-color:#137cbd} -/*# sourceMappingURL=1.a970d4a6.chunk.css.map */ \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css.map b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css.map deleted file mode 100644 index 257fd0fa..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/1.a970d4a6.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/normalize.css/normalize.css","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/icons/src/_font-face.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/icons/src/_font-imports.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/_reset.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_mixins.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_variables.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_colors.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_color-aliases.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/_typography.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/accessibility/_focus-states.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/alert/_alert.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/breadcrumbs/_breadcrumbs.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/button/_button.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_flex.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/button/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/node_modules/@blueprintjs/icons/src/_icons.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/button/_button-group.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/callout/_callout.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/card/_card.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/collapse/_collapse.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/context-menu/_context-menu.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/dialog/_dialog.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/common/_react-transition.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/drawer/_drawer.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/editable-text/_editable-text.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/divider/_divider.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_control-group.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_controls.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_file-input.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_form-group.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_input-group.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_input.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_label.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_numeric-input.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/forms/_index.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/html-select/_html-select.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/html-select/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/node_modules/@blueprintjs/icons/src/generated/_icon-variables.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/html-table/_html-table.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/hotkeys/_hotkeys.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/icon/_icon.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/menu/_submenu.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/menu/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/menu/_menu.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/navbar/_navbar.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/non-ideal-state/_non-ideal-state.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/overflow-list/_overflow-list.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/overlay/_overlay.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/panel-stack/_panel-stack.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/node_modules/@blueprintjs/core/src/common/_react-transition.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/popover/_popover.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/popover/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/portal/_portal.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/progress-bar/_progress-bar.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/skeleton/_skeleton.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/skeleton/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/slider/_slider.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/slider/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/spinner/_spinner.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tabs/_tabs.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tag/_tag.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tag/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tag-input/_tag-input.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/toast/_toast.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tooltip/_tooltip.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tooltip/_common.scss","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/node_modules/@blueprintjs/core/src/components/tree/_tree.scss"],"names":[],"mappings":"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,AMGf,+BE2JE,yBRlJc,AQmJd,8EA3HqF,AA4HrF,8ERpLa,AQqLb,URjKa,CAAA,AMGf,qHEmKI,URtKW,CAAA,AMGf,qCEuKI,yBR/JY,AQgKZ,6ER/LW,CAAA,AMuBf,gFE6KI,yBRtKY,AQuKZ,sBAAsB,AACtB,8ERtMW,CAAA,AMuBf,oFEyLE,oCRhLc,AQiLd,sBAAsB,AACtB,yBAAyB,AACzB,gBAAgB,AAChB,wBRhMa,CAAA,AMGf,+BE2JE,yBR5Ie,AQ6If,8EA3HqF,AA4HrF,8ERpLa,AQqLb,URjKa,CAAA,AMGf,qHEmKI,URtKW,CAAA,AMGf,qCEuKI,yBRzJa,AQ0Jb,6ER/LW,CAAA,AMuBf,gFE6KI,yBRhKa,AQiKb,sBAAsB,AACtB,8ERtMW,CAAA,AMuBf,oFEyLE,qCR1Ke,AQ2Kf,sBAAsB,AACtB,yBAAyB,AACzB,gBAAgB,AAChB,wBRhMa,CAAA,AMGf,8BE2JE,yBRtIY,AQuIZ,8EA3HqF,AA4HrF,8ERpLa,AQqLb,URjKa,CAAA,AMGf,kHEmKI,URtKW,CAAA,AMGf,oCEuKI,yBRnJU,AQoJV,6ER/LW,CAAA,AMuBf,8EE6KI,yBR1JU,AQ2JV,sBAAsB,AACtB,8ERtMW,CAAA,AMuBf,kFEyLE,oCRpKY,AQqKZ,sBAAsB,AACtB,yBAAyB,AACzB,gBAAgB,AAChB,wBRhMa,CAAA,AMGf,sEA2CI,WN9CW,CAAA,AMGf,6CEsFE,gBT9DwC,AS+DxC,eT/DwC,ASqExC,eT3FsC,AS4FtC,gBAhH8D,CAAA,AD2B9D,4GAGE,iBC5B2E,CAAA,ADgC7E,4IAEE,cAAkB,CAAA,ADlBtB,6CEsFE,gBThE0C,ASiE1C,eTjE0C,ASkF1C,aA3H4C,CAAA,AFmB9C,wBA2DI,iBAAkB,CAAA,AA3DtB,iDA8DM,iBAAkB,CAAA,AA9DxB,4CAkEM,SAAS,AAET,iBAAkB,CAAA,AApExB,kDAwEM,iBAAkB,CAAA,AAxExB,qCGLE,+BAAoD,AACpD,eViB0B,AUhB1B,kBAAkB,AAClB,gBAAgB,AAChB,cAAc,AAZd,kCAAkC,AAClC,mCAAmC,AH4F/B,aN/FS,CAAA,AMef,iFAqFI,aNpGW,CAAA,AMef,iIAwFM,eEzGgE,CAAA,AFiBtE,2FAiGI,aAA6D,CAAA,AAI/D,gDE4FA,yBRlNkB,AQmNlB,+EAhKoF,AAiKpF,uCR1Na,AQ2Nb,aRzMmB,CAAA,AM0GnB,wKEoGE,aR9MiB,CAAA,AM0GnB,sDE4HA,yBRnPkB,AQoPlB,sCRzPa,CAAA,AM4Hb,kHEiIA,yBR1PkB,AQ2PlB,sBAAsB,AACtB,wER/Pa,CAAA,AM4Hb,sHEuIA,mCR7PkB,AQ8PlB,sBAAsB,AACtB,gBAAgB,AAChB,0BR3Pa,CAAA,AMiHb,4IE6IE,4BRnQgB,CAAA,AMsHlB,sFEsHE,6BRlPW,AQmPX,cRzOW,CAAA,AMkHb,sQASM,aN1HO,CAAA,AMiHb,0FEqJE,sCRjRW,CAAA,AM4Hb,sGE0JE,wERtRW,CAAA,AM4Hb,0GEoKA,sBAAsB,AACtB,gBAAgB,AAChB,wBR9Qa,CAAA,AMwGb,gFAiBM,cNnIO,CAAA,AMaf,odAkIM,uBAAyB,CAAA,AAlI/B,wBE+QE,gBA3NoC,AA4NpC,eAAgB,CAAA,AFhRlB,8BEmRI,gCR/RW,AQgSX,gBAAgB,AAChB,cR1SgB,AQ2ShB,oBAAqB,CAAA,AFtRzB,kEE2RI,gCRzSW,AQ0SX,gBAAgB,AAChB,aRlTgB,CAAA,AMqBpB,wJEoSI,gBAAgB,AAChB,0BRpTW,AQqTX,kBAAmB,CAAA,AFtSvB,oMEySM,+BRvTS,CAAA,AQ2Tb,kCAgBA,gBAtQyC,AAuQzC,gBAAgB,AAChB,aAAc,CAAA,AAlBd,8HAuBE,gBAAgB,AAChB,eAAgB,CAAA,AAxBlB,wCA4BE,gCRtVW,CAAA,AQ0Tb,sFAiCE,gCR3VW,AQ4VX,aRpViB,CAAA,AQkTnB,gMAyCE,gBAAgB,AAChB,2BRnWW,AQoWX,kBAAmB,CAAA,AA3CrB,4OA8CI,+BRxWS,CAAA,AMaf,2CEiWE,aR/Va,CAAA,AMFf,yJEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRtWW,CAAA,AMFf,iDE4WI,gCRzWW,AQ0WX,aR3WW,CAAA,AMFf,wGEkXI,+BR/WW,AQgXX,aRjXW,CAAA,AMFf,4GEwXI,gBAAgB,AAChB,yBRvXW,CAAA,AMFf,kIE4XM,8BRzXS,CAAA,AMHf,iFEiYI,cR/XW,CAAA,AQkYb,qDACE,aRhYW,CAAA,AQ+Xb,2DAII,+BRrYS,AQsYT,aRpYS,CAAA,AQ+Xb,4HAUI,+BR3YS,AQ4YT,aR1YS,CAAA,AQ+Xb,gIAgBI,gBAAgB,AAChB,yBRhZS,CAAA,AQ+Xb,sJAoBM,8BRrZO,CAAA,AMHf,2CEiWE,aRzVc,CAAA,AMRhB,yJEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRhWY,CAAA,AMRhB,iDE4WI,+BRnWY,AQoWZ,aRrWY,CAAA,AMRhB,wGEkXI,8BRzWY,AQ0WZ,aR3WY,CAAA,AMRhB,4GEwXI,gBAAgB,AAChB,wBRjXY,CAAA,AMRhB,kIE4XM,6BRnXU,CAAA,AMThB,iFEiYI,cRzXY,CAAA,AQ4Xd,qDACE,aR1XY,CAAA,AQyXd,2DAII,8BR/XU,AQgYV,aR9XU,CAAA,AQyXd,4HAUI,8BRrYU,AQsYV,aRpYU,CAAA,AQyXd,gIAgBI,gBAAgB,AAChB,yBR1YU,CAAA,AQyXd,sJAoBM,6BR/YQ,CAAA,AMThB,2CEiWE,aRnVe,CAAA,AMdjB,yJEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aR1Va,CAAA,AMdjB,iDE4WI,gCR7Va,AQ8Vb,aR/Va,CAAA,AMdjB,wGEkXI,+BRnWa,AQoWb,aRrWa,CAAA,AMdjB,4GEwXI,gBAAgB,AAChB,yBR3Wa,CAAA,AMdjB,kIE4XM,8BR7WW,CAAA,AMfjB,iFEiYI,cRnXa,CAAA,AQsXf,qDACE,aRpXa,CAAA,AQmXf,2DAII,+BRzXW,AQ0XX,aRxXW,CAAA,AQmXf,4HAUI,+BR/XW,AQgYX,aR9XW,CAAA,AQmXf,gIAgBI,gBAAgB,AAChB,0BRpYW,CAAA,AQmXf,sJAoBM,8BRzYS,CAAA,AMfjB,0CEiWE,aR7UY,CAAA,AMpBd,sJEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRpVU,CAAA,AMpBd,gDE4WI,+BRvVU,AQwVV,aRzVU,CAAA,AMpBd,sGEkXI,8BR7VU,AQ8VV,aR/VU,CAAA,AMpBd,0GEwXI,gBAAgB,AAChB,wBRrWU,CAAA,AMpBd,gIE4XM,6BRvWQ,CAAA,AMrBd,gFEiYI,cR7WU,CAAA,AQgXZ,oDACE,aR9WU,CAAA,AQ6WZ,0DAII,8BRnXQ,AQoXR,aRlXQ,CAAA,AQ6WZ,0HAUI,8BRzXQ,AQ0XR,aRxXQ,CAAA,AQ6WZ,8HAgBI,gBAAgB,AAChB,0BR9XQ,CAAA,AQ6WZ,oJAoBM,6BRnYM,CAAA,AMrBd,yBE+QE,gBA3NoC,AA4NpC,gBAAgB,AA2JhB,mCRhckB,AQiclB,qBAAsB,CAAA,AF5axB,+BEmRI,gCR/RW,AQgSX,gBAAgB,AAChB,cR1SgB,AQ2ShB,oBAAqB,CAAA,AFtRzB,oEE2RI,gCRzSW,AQ0SX,gBAAgB,AAChB,aRlTgB,CAAA,AMqBpB,4JEoSI,gBAAgB,AAChB,0BRpTW,AQqTX,kBAAmB,CAAA,AFtSvB,wMEySM,+BRvTS,CAAA,AQ2Tb,mCAgBA,gBAtQyC,AAuQzC,gBAAgB,AAChB,aAAc,CAAA,AAlBd,iIAuBE,gBAAgB,AAChB,eAAgB,CAAA,AAxBlB,yCA4BE,gCRtVW,CAAA,AQ0Tb,wFAiCE,gCR3VW,AQ4VX,aRpViB,CAAA,AQkTnB,oMAyCE,gBAAgB,AAChB,2BRnWW,AQoWX,kBAAmB,CAAA,AA3CrB,gPA8CI,+BRxWS,CAAA,AMaf,4CEiWE,aR/Va,CAAA,AMFf,4JEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRtWW,CAAA,AMFf,kDE4WI,gCRzWW,AQ0WX,aR3WW,CAAA,AMFf,0GEkXI,+BR/WW,AQgXX,aRjXW,CAAA,AMFf,8GEwXI,gBAAgB,AAChB,yBRvXW,CAAA,AMFf,oIE4XM,8BRzXS,CAAA,AMHf,kFEiYI,cR/XW,CAAA,AQkYb,sDACE,aRhYW,CAAA,AQ+Xb,4DAII,+BRrYS,AQsYT,aRpYS,CAAA,AQ+Xb,8HAUI,+BR3YS,AQ4YT,aR1YS,CAAA,AQ+Xb,kIAgBI,gBAAgB,AAChB,yBRhZS,CAAA,AQ+Xb,wJAoBM,8BRrZO,CAAA,AMHf,4CEiWE,aRzVc,CAAA,AMRhB,4JEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRhWY,CAAA,AMRhB,kDE4WI,+BRnWY,AQoWZ,aRrWY,CAAA,AMRhB,0GEkXI,8BRzWY,AQ0WZ,aR3WY,CAAA,AMRhB,8GEwXI,gBAAgB,AAChB,wBRjXY,CAAA,AMRhB,oIE4XM,6BRnXU,CAAA,AMThB,kFEiYI,cRzXY,CAAA,AQ4Xd,sDACE,aR1XY,CAAA,AQyXd,4DAII,8BR/XU,AQgYV,aR9XU,CAAA,AQyXd,8HAUI,8BRrYU,AQsYV,aRpYU,CAAA,AQyXd,kIAgBI,gBAAgB,AAChB,yBR1YU,CAAA,AQyXd,wJAoBM,6BR/YQ,CAAA,AMThB,4CEiWE,aRnVe,CAAA,AMdjB,4JEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aR1Va,CAAA,AMdjB,kDE4WI,gCR7Va,AQ8Vb,aR/Va,CAAA,AMdjB,0GEkXI,+BRnWa,AQoWb,aRrWa,CAAA,AMdjB,8GEwXI,gBAAgB,AAChB,yBR3Wa,CAAA,AMdjB,oIE4XM,8BR7WW,CAAA,AMfjB,kFEiYI,cRnXa,CAAA,AQsXf,sDACE,aRpXa,CAAA,AQmXf,4DAII,+BRzXW,AQ0XX,aRxXW,CAAA,AQmXf,8HAUI,+BR/XW,AQgYX,aR9XW,CAAA,AQmXf,kIAgBI,gBAAgB,AAChB,0BRpYW,CAAA,AQmXf,wJAoBM,8BRzYS,CAAA,AMfjB,2CEiWE,aR7UY,CAAA,AMpBd,yJEsWI,gBAAgB,AAChB,gBAAgB,AAChB,aRpVU,CAAA,AMpBd,iDE4WI,+BRvVU,AQwVV,aRzVU,CAAA,AMpBd,wGEkXI,8BR7VU,AQ8VV,aR/VU,CAAA,AMpBd,4GEwXI,gBAAgB,AAChB,wBRrWU,CAAA,AMpBd,kIE4XM,6BRvWQ,CAAA,AMrBd,iFEiYI,cR7WU,CAAA,AQgXZ,qDACE,aR9WU,CAAA,AQ6WZ,2DAII,8BRnXQ,AQoXR,aRlXQ,CAAA,AQ6WZ,4HAUI,8BRzXQ,AQ0XR,aRxXQ,CAAA,AQ6WZ,gIAgBI,gBAAgB,AAChB,0BR9XQ,CAAA,AQ6WZ,sJAoBM,6BRnYM,CAAA,AMrBd,4JEkbI,gCRjcW,CAAA,AQ4Tb,mCAuJA,+BRvca,CAAA,AQgTb,oMA6JE,+BR7cW,CAAA,AMGf,4CE+cE,gCR7ca,CAAA,AMFf,8GEmdI,gCRjdW,CAAA,AQkYb,sDAmFE,gCRldW,CAAA,AQ+Xb,kIAuFI,gCRtdS,CAAA,AMLf,4CE+cE,+BRvcc,CAAA,AMRhB,8GEmdI,+BR3cY,CAAA,AQ4Xd,sDAmFE,gCR5cY,CAAA,AQyXd,kIAuFI,gCRhdU,CAAA,AMXhB,4CE+cE,gCRjce,CAAA,AMdjB,8GEmdI,gCRrca,CAAA,AQsXf,sDAmFE,iCRtca,CAAA,AQmXf,kIAuFI,iCR1cW,CAAA,AMjBjB,2CE+cE,+BR3bY,CAAA,AMpBd,4GEmdI,+BR/bU,CAAA,AQgXZ,qDAmFE,iCRhcU,CAAA,AQ6WZ,gIAuFI,iCRpcQ,CAAA,AM2Hd,aACE,kBAAkB,AAClB,qBAAqB,AACrB,eAAgB,CAAA,AAHlB,oDASI,aNhLgB,CAAA,AMuKpB,0BAaI,yBN9KW,CAAA,AMkLf,iBAEE,aAAc,CAAA,AAIhB,8LAKM,aAAc,CAAA,AIhKpB,kBACE,mBAAoB,CAwIlB,AAzIJ,8BAKI,cAAc,AACd,kBAAkB,AAClB,SAAsD,CAAA,AAP1D,oCAeM,SAAoD,CAAA,AAf1D,oCAmBM,SAAoD,CAAA,AAnB1D,8EAwBM,SAAqD,CAAA,AAxB3D,kFA6BM,SAAuD,CAAA,AA7B7D,kDAiCM,SAA6D,CAAA,AAjCnE,wDAoCQ,UAA2D,CAAA,AApCnE,wDAwCQ,UAA2D,CAAA,AAxCnE,sHA6CQ,UAA4D,CAAA,AA7CpE,0HAkDQ,SAA8D,CAAA,AAlDtE,yJA2DM,4BAA4B,AAC5B,wBAAyB,CAAA,AA5D/B,uJAiEM,6BAA6B,AAC7B,0BAA0B,AAC1B,iBFtGmB,CAAA,AEmCzB,0CFiQE,gBA3NoC,AA4NpC,eAAgB,CAAA,AAEhB,gDACE,gCR/RW,AQgSX,gBAAgB,AAChB,cR1SgB,AQ2ShB,oBAAqB,CAAA,AAGvB,sGAEE,gCRzSW,AQ0SX,gBAAgB,AAChB,aRlTgB,CAAA,AQqTlB,gOAIE,gBAAgB,AAChB,0BRpTW,AQqTX,kBAAmB,CAAA,AAEnB,4QACE,+BRvTS,CAAA,AQ2Tb,oDAgBA,gBAtQyC,AAuQzC,gBAAgB,AAChB,aAAc,CAAA,AAlBd,oLAuBE,gBAAgB,AAChB,eAAgB,CAAA,AAxBlB,0DA4BE,gCRtVW,CAAA,AQ0Tb,0HAiCE,gCR3VW,AQ4VX,aRpViB,CAAA,AQkTnB,wQAyCE,gBAAgB,AAChB,2BRnWW,AQoWX,kBAAmB,CAAA,AA3CrB,oTA8CI,+BRxWS,CAAA,AQ+TX,6DA+CF,aR/Va,CAAA,AQiWb,+MAGE,gBAAgB,AAChB,gBAAgB,AAChB,aRtWW,CAAA,AQyWb,mEACE,gCRzWW,AQ0WX,aR3WW,CAAA,AQ8Wb,4IAEE,+BR/WW,AQgXX,aRjXW,CAAA,AQoXb,gJAEE,gBAAgB,AAChB,yBRvXW,CAAA,AQyXX,sKACE,8BRzXS,CAAA,AQ6Xb,mGACE,cR/XW,CAAA,AQkYb,uEACE,aRhYW,CAAA,AQ+Xb,6EAII,+BRrYS,AQsYT,aRpYS,CAAA,AQ+Xb,gKAUI,+BR3YS,AQ4YT,aR1YS,CAAA,AQ+Xb,oKAgBI,gBAAgB,AAChB,yBRhZS,CAAA,AQ+Xb,0LAoBM,8BRrZO,CAAA,AQ+SX,6DA+CF,aRzVc,CAAA,AQ2Vd,+MAGE,gBAAgB,AAChB,gBAAgB,AAChB,aRhWY,CAAA,AQmWd,mEACE,+BRnWY,AQoWZ,aRrWY,CAAA,AQwWd,4IAEE,8BRzWY,AQ0WZ,aR3WY,CAAA,AQ8Wd,gJAEE,gBAAgB,AAChB,wBRjXY,CAAA,AQmXZ,sKACE,6BRnXU,CAAA,AQuXd,mGACE,cRzXY,CAAA,AQ4Xd,uEACE,aR1XY,CAAA,AQyXd,6EAII,8BR/XU,AQgYV,aR9XU,CAAA,AQyXd,gKAUI,8BRrYU,AQsYV,aRpYU,CAAA,AQyXd,oKAgBI,gBAAgB,AAChB,yBR1YU,CAAA,AQyXd,0LAoBM,6BR/YQ,CAAA,AQySZ,6DA+CF,aRnVe,CAAA,AQqVf,+MAGE,gBAAgB,AAChB,gBAAgB,AAChB,aR1Va,CAAA,AQ6Vf,mEACE,gCR7Va,AQ8Vb,aR/Va,CAAA,AQkWf,4IAEE,+BRnWa,AQoWb,aRrWa,CAAA,AQwWf,gJAEE,gBAAgB,AAChB,yBR3Wa,CAAA,AQ6Wb,sKACE,8BR7WW,CAAA,AQiXf,mGACE,cRnXa,CAAA,AQsXf,uEACE,aRpXa,CAAA,AQmXf,6EAII,+BRzXW,AQ0XX,aRxXW,CAAA,AQmXf,gKAUI,+BR/XW,AQgYX,aR9XW,CAAA,AQmXf,oKAg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mB4Hb,mBAAmB,AACnB,WAAY,CAAA,AInDd,6BfiDE,yBRjHmB,AQkHnB,8EA7E8E,AA+E9E,cRpIkB,AQ2GlB,gBThE0C,ASiE1C,eTjE0C,ADiB1C,gBAAgB,AAChB,uBAAuB,AACvB,mBAAmB,AACnB,iBAAiB,AyBgCf,kBxBxDuC,AwByDvC,iBAAiB,AACjB,iBxBtDwC,AwBuDxC,WA/EwE,AAgFxE,kBAAkB,AAClB,QAAQ,AACR,kBAAkB,AAClB,MAAM,AACN,UAtFuC,CAAA,AfqHzC,mCAgBA,4BAA4B,AAC5B,yBRxImB,AQyInB,6ER1Ja,CAAA,AQ4Ib,4EAkBA,yBR/ImB,AQgJnB,sBAAsB,AACtB,8ERhKa,CAAA,AQiJb,gFAmBA,sCRtJmB,AQuJnB,sBAAsB,AACtB,gBAAgB,AAChB,0BR/Ja,AQgKb,mBAAmB,AACnB,YAAa,CAAA,AAEb,wNAEE,+BR/JiB,CAAA,AuBoErB,mCfsEE,4BAA4B,AAC5B,yBRxImB,AQyInB,6ER1Ja,CAAA,AuBkFf,oCf4EE,yBR/ImB,AQgJnB,sBAAsB,AACtB,8ERhKa,CAAA,AuBoHb,kCJqBA,epBhHsC,AoBiHtC,YpBvFuC,AoBwFvC,iBpBxFuC,AwBmErC,kBAAyE,CAAA,AJuB3E,2FAEE,cAA4C,CAAA,AI3B9C,wCfPA,gBTjEkC,ASkElC,eTlEkC,AwB8E9B,iBxB9E8B,AwB+E9B,WArG4E,AAsG5E,UAxG6C,CAAA,AA4GjD,iCJ8CA,6BnB9Ka,AmBgLb,gKnBhLa,AmBkLb,cnBhKmB,AuBgHjB,0BvBvHW,CAAA,AmB4Jb,4DACE,0BnB7JW,CAAA,AmB4Jb,8CACE,0BnB7JW,CAAA,AmByKb,uCACE,gJnBrLW,CAAA,AmByLb,2CACE,4CnB1LW,CAAA,AmB6Lb,wFA5BA,6BnB3JkB,AmB4JlB,gBAAgB,AAChB,0BnBxJa,CAAA,AuBqHb,uCfwFA,yBRlNkB,AQmNlB,+EAhKoF,AAiKpF,uCR1Na,AQ2Nb,aRzMmB,CAAA,AQ2MnB,6IAGE,aR9MiB,CAAA,AQiNnB,6CAqBA,yBRnPkB,AQoPlB,sCRzPa,CAAA,AQuOb,gGAsBA,yBR1PkB,AQ2PlB,s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A,AmBwMb,qDACE,4FnBzMW,CAAA,AmB6Mb,yDACE,kCnBxKa,CAAA,AmB2Kf,oHAEE,eAAgB,CAAA,AM/KpB,8CAqMQ,azBpMS,CAAA,AyBsMT,wDACE,azBpMO,CAAA,AyBJjB,8CNgKE,2JnBpMa,CAAA,AmBwMb,oDACE,2FnBzMW,CAAA,AmB6Mb,wDACE,kCnBlKU,CAAA,AmBqKZ,kHAEE,eAAgB,CAAA,AM/KpB,6CAqMQ,azB9LM,CAAA,AyBgMN,uDACE,azB9LI,CAAA,A0B1Bd,WP6DE,wBAAgB,AAAhB,qBAAgB,AAAhB,gBAAgB,AAChB,gBnB9Da,AmB+Db,YAAY,AACZ,kBpB3CyC,AoB4CzC,sInBrFa,AmBsFb,cnBpFkB,AmBqFlB,epB/DgC,AoBgEhC,gBApFqB,AAqFrB,YpBvCiC,AoBwCjC,iBpBxCiC,AoB0CjC,aAAa,AACb,epBtFiB,AoBuFjB,oDpBSkD,AoBRlD,qBAAsB,CAAA,AA0BtB,sCACE,0BnBlHW,AmBoHX,SAAU,CAAA,AAHZ,wBACE,0BnBlHW,AmBoHX,SAAU,CAAA,AA3BZ,uCAEE,4FnBnGW,CAAA,AmBsGb,6CAEE,mBpBtD+B,AoBwD/B,sBAAsB,AACtB,iBpBpGe,CAAA,AoBuGjB,qBACE,6CnB/GW,CAAA,AmBkHb,4CAeA,gCnBnHmB,AmBoHnB,gBAAgB,AAChB,0BnB3Ha,AmB4Hb,mBAAmB,AACnB,WAAY,CAAA,AOjHd,qBPqHE,epBhHsC,AoBiHtC,YpBvFuC,AoBwFvC,gBpBxFuC,CAAA,AoB0FvC,iEAEE,cAA4C,CAAA,AO3HhD,qBPgIE,epB1HsC,AoB2HtC,YpBjGyC,AoBkGzC,iBpBlGyC,AoBmGzC,iBApJmE,AAqJnE,iBArJmE,CAAA,AAuJnE,iEAEE,cAAuC,CAAA,AOxI3C,oBAYI,cAAc,AACd,UAAW,CAAA,AAGb,qBP0IA,6BnB9Ka,AmBgLb,gKnBhLa,AmBkLb,anBhKmB,CAAA,AmBqJnB,gDACE,0BnB7JW,CAAA,AmB4Jb,kCACE,0BnB7JW,CAAA,AmByKb,2BACE,gJnBrLW,CAAA,AmByLb,+BACE,4CnB1LW,CAAA,AmB6Lb,gEA5BA,6BnB3J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V,aRpYU,CAAA,AQyXd,4kBAgBI,gBAAgB,AAChB,yBR1YU,CAAA,AQyXd,oqBAoBM,6BR/YQ,CAAA,AQySZ,yGA+CF,aRnVe,CAAA,AQqVf,2WAGE,gBAAgB,AAChB,gBAAgB,AAChB,aR1Va,CAAA,AQ6Vf,qHACE,gCR7Va,AQ8Vb,aR/Va,CAAA,AQkWf,sPAEE,+BRnWa,AQoWb,aRrWa,CAAA,AQwWf,8PAEE,gBAAgB,AAChB,yBR3Wa,CAAA,AQ6Wb,0SACE,8BR7WW,CAAA,AQiXf,qLACE,cRnXa,CAAA,AQsXf,0PACE,aRpXa,CAAA,AQmXf,kRAII,+BRzXW,AQ0XX,aRxXW,CAAA,AQmXf,4jBAUI,+BR/XW,AQgYX,aR9XW,CAAA,AQmXf,4kBAgBI,gBAAgB,AAChB,0BRpYW,CAAA,AQmXf,oqBAoBM,8BRzYS,CAAA,AQmSb,uGA+CF,aR7UY,CAAA,AQ+UZ,qWAGE,gBAAgB,AAChB,gBAAgB,AAChB,aRpVU,CAAA,AQuVZ,mHACE,+BRvVU,AQwVV,aRzVU,CAAA,AQ4VZ,kPAEE,8BR7VU,AQ8VV,aR/VU,CAAA,AQkWZ,0PAEE,gBAAgB,AAChB,wBRrWU,CAAA,AQuWV,sSACE,6BRvWQ,CAAA,AQ2WZ,mLACE,cR7WU,CAAA,AQgXZ,sPACE,aR9WU,CAAA,AQ6WZ,8QAII,8BRnXQ,AQoXR,aRlXQ,CAAA,AQ6WZ,ojBAUI,8BRzXQ,AQ0XR,aRxXQ,CAAA,AQ6WZ,okBAgBI,gBAAgB,AAChB,0BR9XQ,CAAA,AQ6WZ,4pBAoBM,6BRnYM,CAAA,A8BpBd,+DCJE,ehCKsC,AgCJtC,YhC0BwC,AgCzBxC,kBAA8C,CAAA,ADkD9C,+DtBgJA,yBRlNkB,AQmNlB,+EAhKoF,AAiKpF,uCR1Na,AQ2Nb,aRzMmB,CAAA,AQ2MnB,6OAGE,aR9MiB,CAAA,AQiNnB,2EAqBA,yBRnPkB,AQoPlB,sCRzPa,CAAA,AQuOb,kKAsBA,yBR1PkB,AQ2PlB,sBAAsB,AACtB,wER/Pa,CAAA,AQ4Ob,0KAuBA,mCR7PkB,AQ8PlB,sBAAsB,AACtB,gBAAgB,AAChB,0BR3Pa,CAAA,AQ6Pb,sNACE,4BRnQgB,CAAA,AQ2OlB,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AG0B1B,uBACE,eH1BY,CAAO,AGyBrB,4BACE,eHzBiB,CAAO,AGwB1B,0BACE,eHxBe,CAAO,AGuBxB,wBACE,eHvBa,CAAO,AGsBtB,4BACE,eHtBiB,CAAO,AGqB1B,4BACE,eHrBiB,CAAO,AGoB1B,6BACE,eHpBkB,CAAO,AGmB3B,0BACE,eHnBe,CAAO,AGkBxB,4BACE,eHlBiB,CAAO,AGiB1B,yBACE,eHjBc,CAAO,AGgBvB,uBACE,eHhBY,CAAO,AGerB,sBACE,eHfW,CAAO,AGcpB,kCACE,eHduB,CAAO,AGahC,8BACE,eHbmB,CAAO,AGY5B,iCACE,eHZsB,CAAO,AGW/B,8BACE,eHXmB,CAAO,AGU5B,+BACE,eHVoB,CAAO,AGS7B,4BACE,eHTiB,CAAO,AGQ1B,wBACE,eHRa,CAAO,AGOtB,mCACE,eHPwB,CAAO,AGMjC,mCACE,eHNwB,CAAO,AGKjC,oCACE,eHLyB,CAAO,AGIlC,iCACE,eHJsB,CAAO,AGG/B,0BACE,eHHe,CAAO,AGExB,uBACE,eHFY,CAAO,AGCrB,2BACE,eHDgB,CAAO,AGAzB,uBACE,eHAY,CAAO,AGDrB,gCACE,eHCqB,CAAO,AGF9B,8BACE,eHEmB,CAAO,AGH5B,sBACE,eHGW,CAAO,AGJpB,4BACE,eHIiB,CAAO,AGL1B,qBACE,eHKU,CAAO,AGNnB,8BACE,eHMmB,CAAO,AGP5B,+BACE,eHOoB,CAAO,AGR7B,yBACE,eHQc,CAAO,AGTvB,4BACE,eHSiB,CAAO,AGV1B,yBACE,eHUc,CAAO,AGXvB,4BACE,eHWiB,CAAO,AGZ1B,yBACE,eHYc,CAAO,AGbvB,yBACE,eHac,CAAO,AGdvB,0BACE,eHce,CAAO,AGfxB,yBACE,eHec,CAAO,AGhBvB,6BACE,eHgBkB,CAAO,AGjB3B,uBACE,eHiBY,CAAO,AGlBrB,uBACE,eHkBY,CAAO,AGnBrB,sBACE,eHmBW,CAAO,AGpBpB,0BACE,eHoBe,CAAO,AGrBxB,6BACE,eHqBkB,CAAO,AGtB3B,oCACE,eHsByB,CAAO,AGvBlC,qBACE,eHuBU,CAAO,AGxBnB,2BACE,eHwBgB,CAAO,AGzBzB,8BACE,eHyBmB,CAAO,AG1B5B,0BACE,eH0Be,CAAO,AG3BxB,wBACE,eH2Ba,CAAO,AG5BtB,uBACE,cH4BmB,CAAA,AG7BrB,+BACE,eH6BoB,CAAO,AG9B7B,yBACE,eH8Bc,CAAO,AG/BvB,2BACE,eH+BgB,CAAO,AGhCzB,8BACE,eHgCmB,CAAO,AGjC5B,gCACE,eHiCqB,CAAO,AGlC9B,iCACE,eHkCsB,CAAO,AGnC/B,yBACE,eHmCc,CAAO,AGpCvB,0BACE,eHoCe,CAAO,AGrCxB,+BACE,eHqCoB,CAAO,AGtC7B,gCACE,eHsCqB,CAAO,AGvC9B,wBACE,WHuCoB,CAAA,AGxCtB,qBACE,eHwCU,CAAO,AGzCnB,yCACE,eHyC8B,CAAO,AG1CvC,uCACE,eH0C4B,CAAO,AG3CrC,qCACE,eH2C0B,CAAO,AG5CnC,qCACE,eH4C0B,CAAO,AG7CnC,sCACE,eH6C2B,CAAO,AG9CpC,mCACE,eH8CwB,CAAO,AG/CjC,gCACE,eH+CqB,CAAO,AGhD9B,0BACE,eHgDe,CAAO,AGjDxB,wCACE,eHiD6B,CAAO,AGlDtC,sCACE,eHkD2B,CAAO,AGnDpC,sBACE,eHmDW,CAAO,AGpDpB,4BACE,eHoDiB,CAAO,AGrD1B,2BACE,eHqDgB,CAAO,AGtDzB,sBACE,eHsDW,CAAO,AGvDpB,uBACE,eHuDY,CAAO,AGxDrB,0BACE,eHwDe,CAAO,AGzDxB,0BACE,eHyDe,CAAO,AG1DxB,wBACE,eH0Da,CAAO,AG3DtB,wBACE,eH2Da,CAAO,AG5DtB,uBACE,eH4DY,CAAO,AG7DrB,sBACE,eH6DW,CAAO,AG9DpB,0BACE,eH8De,CAAO,AG/DxB,6BACE,eH+DkB,CAAO,AGhE3B,4BACE,eHgEiB,CAAO,AGjE1B,wBACE,eHiEa,CAAO,AGlEtB,yBACE,eHkEc,CAAO,AGnEvB,wBACE,eHmEa,CAAO,AGpEtB,0BACE,eHoEe,CAAO,AGrExB,+BACE,eHqEoB,CAAO,AGtE7B,8BACE,eHsEmB,CAAO,AGvE5B,sBACE,eHuEW,CAAO,AGxEpB,iCACE,eHwEsB,CAAO,AGzE/B,sBACE,eHyEW,CAAO,AG1EpB,wBACE,eH0Ea,CAAO,AG3EtB,6BACE,eH2EkB,CAAO,AG5E3B,6BACE,eH4EkB,CAAO,AG7E3B,6BACE,eH6EkB,CAAO,AG9E3B,+BACE,eH8EoB,CAAO,AG/E7B,sBACE,eH+EW,CAAO,AGhFpB,uBACE,eHgFY,CAAO,AGjFrB,uBACE,eHiFY,CAAO,AGlFrB,6BACE,eHkFkB,CAAO,AGnF3B,6BACE,eHmFkB,CAAO,AGpF3B,0BACE,eHoFe,CAAO,AGrFxB,6BACE,eHqFkB,CAAO,AGtF3B,6BACE,eHsFkB,CAAO,AGvF3B,oCACE,eHuFyB,CAAO,AGxFlC,uBACE,eHwFY,CAAO,AGzFrB,8BACE,eHyFmB,CAAO,AG1F5B,4BACE,eH0FiB,CAAO,AG3F1B,6BACE,eH2FkB,CAAO,AG5F3B,+BACE,eH4FoB,CAAO,AG7F7B,oCACE,eH6FyB,CAAO,AG9FlC,0BACE,eH8Fe,CAAO,AG/FxB,2BACE,eH+FgB,CAAO,AGhGzB,sBACE,eHgGW,CAAO,AGjGpB,sBACE,eHiGW,CAAO,AGlGpB,sBACE,eHkGW,CAAO,AGnGpB,6BACE,eHmGkB,CAAO,AGpG3B,oCACE,eHoGyB,CAAO,AGrGlC,4BACE,eHqGiB,CAAO,AGtG1B,0BACE,eHsGe,CAAO,AGvGxB,6BACE,eHuGkB,CAAO,AGxG3B,6BACE,eHwGkB,CAAO,AGzG3B,2BACE,eHyGgB,CAAO,AG1GzB,4BACE,eH0GiB,CAAO,AG3G1B,4BACE,eH2GiB,CAAO,AG5G1B,2BACE,eH4GgB,CAAO,AG7GzB,gCACE,eH6GqB,CAAO,AG9G9B,0BACE,eH8Ge,CAAO,AG/GxB,0BACE,eH+Ge,CAAO,AGhHxB,0BACE,eHgHe,CAAO,AGjHxB,uBACE,eHiHY,CAAO,AGlHrB,uBACE,eHkHY,CAAO,AGnHrB,+BACE,eHmHoB,CAAO,AGpH7B,uBACE,eHoHY,CAAO,AGrHrB,8BACE,eHqHmB,CAAO,AGtH5B,8BACE,eHsHmB,CAAO,AGvH5B,0CACE,eHuH+B,CAAO,AGxHxC,sBACE,eHwHW,CAAO,AGzHpB,2BACE,eHyHgB,CAAO,AG1HzB,+BACE,eH0HoB,CAAO,AG3H7B,mCACE,eH2HwB,CAAO,AG5HjC,sBACE,eH4HW,CAAO,AG7HpB,2BACE,eH6HgB,CAAO,AG9HzB,2BACE,eH8HgB,CAAO,AG/HzB,4BACE,eH+HiB,CAAO,AGhI1B,yBACE,eHgIc,CAAO,AGjIvB,wBACE,eHiIa,CAAO,AGlItB,4BACE,eHkIiB,CAAO,AGnI1B,4BACE,eHmIiB,CAAO,AGpI1B,yBACE,eHoIc,CAAO,AGrIvB,uBACE,eHqIY,CAAO,AGtIrB,8BACE,eHsImB,CAAO,AGvI5B,2BACE,eHuIgB,CAAO,AGxIzB,yBACE,eHwIc,CAAO,AGzIvB,sBACE,WHyIkB,CAAA,AG1IpB,mCACE,eH0IwB,CAAO,AG3IjC,2BACE,eH2IgB,CAAO,AG5IzB,yBACE,eH4Ic,CAAO,AG7IvB,sBACE,eH6IW,CAAO,AG9IpB,sCACE,eH8I2B,CAAO,AG/IpC,0CACE,eH+I+B,CAAO,AGhJxC,2CACE,eHgJgC,CAAO,AGjJzC,yCACE,eHiJ8B,CAAO,AGlJvC,2BACE,eHkJgB,CAAO,AGnJzB,mCACE,eHmJwB,CAAO,AGpJjC,oCACE,eHoJyB,CAAO,AGrJlC,wBACE,eHqJa,CAAO,AGtJtB,uBACE,eHsJY,CAAO,AGvJrB,gCACE,eHuJqB,CAAO,AGxJ9B,2BACE,eHwJgB,CAAO,AGzJzB,8BACE,eHyJmB,CAAO,AG1J5B,8BACE,eH0JmB,CAAO,AG3J5B,2BACE,eH2JgB,CAAO,AG5JzB,6BACE,eH4JkB,CAAO,AG7J3B,4BACE,eH6JiB,CAAO,AG9J1B,wBACE,eH8Ja,CAAO,AG/JtB,8BACE,eH+JmB,CAAO,AGhK5B,4BACE,eHgKiB,CAAO,AGjK1B,uBACE,eHiKY,CAAO,AGlKrB,8BACE,eHkKmB,CAAO,AGnK5B,2BACE,eHmKgB,CAAO,AGpKzB,wBACE,eHoKa,CAAO,AGrKtB,4BACE,eHqKiB,CAAO,AGtK1B,qBACE,eHsKU,CAAO,AGvKnB,+BACE,eHuKoB,CAAO,AGxK7B,6BACE,eHwKkB,CAAO,AGzK3B,6BACE,eHyKkB,CAAO,AG1K3B,4BACE,eH0KiB,CAAO,AG3K1B,2BACE,eH2KgB,CAAO,AG5KzB,4BACE,eH4KiB,CAAO,AG7K1B,4BACE,eH6KiB,CAAO,AG9K1B,2BACE,eH8KgB,CAAO,AG/KzB,yBACE,eH+Kc,CAAO,AGhLvB,+BACE,eHgLoB,CAAO,AGjL7B,0BACE,eHiLe,CAAO,AGlLxB,uBACE,eHkLY,CAAO,AGnLrB,uBACE,eHmLY,CAAO,AGpLrB,wBACE,eHoLa,CAAO,AGrLtB,wBACE,eHqLa,CAAO,AGtLtB,6BACE,eHsLkB,CAAO,AGvL3B,gCACE,eHuLqB,CAAO,AGxL9B,+BACE,eHwLoB,CAAO,AGzL7B,6BACE,eHyLkB,CAAO,AG1L3B,iCACE,eH0LsB,CAAO,AG3L/B,kCACE,eH2LuB,CAAO,AG5LhC,+BACE,eH4LoB,CAAO,AG7L7B,kCACE,eH6LuB,CAAO,AG9LhC,wCACE,eH8L6B,CAAO,AG/LtC,0BACE,eH+Le,CAAO,AGhMxB,2BACE,eHgMgB,CAAO,AGjMzB,2BACE,eHiMgB,CAAO,AGlMzB,uCACE,eHkM4B,CAAO,AGnMrC,2BACE,eHmMgB,CAAO,AGpMzB,2BACE,eHoMgB,CAAO,AGrMzB,sBACE,eHqMW,CAAO,AGtMpB,sBACE,eHsMW,CAAO,AGvMpB,8BACE,eHuMmB,CAAO,AGxM5B,kCACE,eHwMuB,CAAO,AGzMhC,wBACE,eHyMa,CAAO,AG1MtB,sBACE,eH0MW,CAAO,AG3MpB,wBACE,eH2Ma,CAAO,AG5MtB,yBACE,eH4Mc,CAAO,AG7MvB,wBACE,eH6Ma,CAAO,AG9MtB,uCACE,eH8M4B,CAAO,AG/MrC,qBACE,eH+MU,CAAO,AGhNnB,4BACE,eHgNiB,CAAO,AGjN1B,4BACE,eHiNiB,CAAO,AGlN1B,0BACE,eHkNe,CAAO,AGnNxB,uBACE,eHmNY,CAAO,AGpNrB,sBACE,eHoNW,CAAO,AGrNpB,6BACE,eHqNkB,CAAO,AGtN3B,2BACE,eHsNgB,CAAO,AGvNzB,+BACE,eHuNoB,CAAO,AGxN7B,6BACE,eHwNkB,CAAO,AGzN3B,0BACE,eHyNe,CAAO,AG1NxB,uBACE,eH0NY,CAAO,AG3NrB,8BACE,eH2NmB,CAAO,AG5N5B,8BACE,eH4NmB,CAAO,AG7N5B,sBACE,eH6NW,CAAO,AG9NpB,sBACE,eH8NW,CAAO,AG/NpB,0BACE,eH+Ne,CAAO,AGhOxB,sBACE,eHgOW,CAAO,AGjOpB,yBACE,eHiOc,CAAO,AGlOvB,8BACE,eHkOmB,CAAO,AGnO5B,uBACE,eHmOY,CAAO,AGpOrB,6BACE,eHoOkB,CAAO,AGrO3B,+BACE,eHqOoB,CAAO,AGtO7B,2BACE,eHsOgB,CAAO,AGvOzB,4BACE,eHuOiB,CAAO,AGxO1B,0BACE,eHwOe,CAAO,AGzOxB,4BACE,eHyOiB,CAAO,AG1O1B,4BACE,eH0OiB,CAAO,AG3O1B,kCACE,eH2OuB,CAAO,AG5OhC,8BACE,eH4OmB,CAAO,AG7O5B,uBACE,eH6OY,CAAO,AG9OrB,8BACE,eH8OmB,CAAO,AG/O5B,+BACE,eH+OoB,CAAO,AGhP7B,uCACE,eHgP4B,CAAO,AGjPrC,+BACE,eHiPoB,CAAO,AGlP7B,2BACE,eHkPgB,CAAO,AGnPzB,wBACE,eHmPa,CAAO,AGpPtB,yBACE,eHoPc,CAAO,AGrPvB,2BACE,eHqPgB,CAAO,AGtPzB,4BACE,eHsPiB,CAAO,AGvP1B,0BACE,eHuPe,CAAO,AGxPxB,6BACE,eHwPkB,CAAO,AGzP3B,6BACE,eHyPkB,CAAO,AG1P3B,6BACE,eH0PkB,CAAO,AG3P3B,2BACE,eH2PgB,CAAO,AG5PzB,2BACE,eH4PgB,CAAO,AG7PzB,sBACE,eH6PW,CAAO,AG9PpB,6BACE,eH8PkB,CAAO,AG/P3B,uBACE,eH+PY,CAAO,AGhQrB,wBACE,eHgQa,CAAO,AGjQtB,4BACE,eHiQiB,CAAO,AGlQ1B,wBACE,eHkQa,CAAO,AGnQtB,uBACE,eHmQY,CAAO,AGpQrB,2BACE,eHoQgB,CAAO,AGrQzB,qBACE,eHqQU,CAAO,AGtQnB,uBACE,eHsQY,CAAO,AGvQrB,6BACE,eHuQkB,CAAO,AGxQ3B,sBACE,eHwQW,CAAO,AGzQpB,sBACE,WHyQkB,CAAA,AG1QpB,gCACE,eH0QqB,CAAO,AG3Q9B,uBACE,eH2QY,CAAO,AG5QrB,qCACE,eH4Q0B,CAAO,AG7QnC,8BACE,eH6QmB,CAAO,AG9Q5B,8BACE,eH8QmB,CAAO,AG/Q5B,uBACE,eH+QY,CAAO,AGhRrB,0BACE,eHgRe,CAAO,AGjRxB,4BACE,eHiRiB,CAAO,AGlR1B,0BACE,eHkRe,CAAO,AGnRxB,kCACE,eHmRuB,CAAO,AGpRhC,uBACE,eHoRY,CAAO,AGrRrB,wBACE,eHqRa,CAAO,AGtRtB,wBACE,eHsRa,CAAO,AGvRtB,sBACE,eHuRW,CAAO,AGxRpB,yBACE,eHwRc,CAAO,AGzRvB,kCACE,eHyRuB,CAAO,AG1RhC,wBACE,eH0Ra,CAAO,AG3RtB,+BACE,eH2RoB,CAAO,AG5R7B,oCACE,eH4RyB,CAAO,AG7RlC,qCACE,eH6R0B,CAAO,AG9RnC,mCACE,eH8RwB,CAAO,AG/RjC,gCACE,eH+RqB,CAAO,AGhS9B,wBACE,eHgSa,CAAO,AGjStB,uBACE,eHiSY,CAAO,AGlSrB,yBACE,eHkSc,CAAO,AGnSvB,qBACE,eHmSU,CAAO,AGpSnB,4BACE,eHoSiB,CAAO,AGrS1B,sBACE,eHqSW,CAAO,AGtSpB,iCACE,eHsSsB,CAAO,AGvS/B,6BACE,eHuSkB,CAAO,AGxS3B,2BACE,eHwSgB,CAAO,AGzSzB,uBACE,eHySY,CAAO,AG1SrB,8BACE,eH0SmB,CAAO,AG3S5B,wBACE,eH2Sa,CAAO,AG5StB,+BACE,eH4SoB,CAAO,AG7S7B,iCACE,eH6SsB,CAAO,AG9S/B,6BACE,eH8SkB,CAAO,AG/S3B,mCACE,eH+SwB,CAAO,AGhTjC,wBACE,eHgTa,CAAO,AGjTtB,2BACE,eHiTgB,CAAO,AGlTzB,yBACE,eHkTc,CAAO,AGnTvB,+BACE,eHmToB,CAAO,AGpT7B,6BACE,eHoTkB,CAAO,AGrT3B,4BACE,eHqTiB,CAAO,AGtT1B,sCACE,eHsT2B,CAAO,AGvTpC,gCACE,eHuTqB,CAAO,AGxT9B,iCACE,eHwTsB,CAAO,AGzT/B,+BACE,eHyToB,CAAO,AG1T7B,0BACE,eH0Te,CAAO,AG3TxB,uBACE,eH2TY,CAAO,AG5TrB,wBACE,eH4Ta,CAAO,AG7TtB,sBACE,eH6TW,CAAO,AG9TpB,+BACE,eH8ToB,CAAO,AG/T7B,+BACE,eH+ToB,CAAO,AGhU7B,0BACE,eHgUe,CAAO,AGjUxB,uBACE,eHiUY,CAAO,AGlUrB,6BACE,eHkUkB,CAAO,AGnU3B,6BACE,eHmUkB,CAAO,AGpU3B,4BACE,eHoUiB,CAAO,AGrU1B,4BACE,eHqUiB,CAAO,AGtU1B,2BACE,eHsUgB,CAAO,AGvUzB,8BACE,eHuUmB,CAAO,AGxU5B,sBACE,eHwUW,CAAO,AGzUpB,mCACE,eHyUwB,CAAO,AG1UjC,wCACE,eH0U6B,CAAO,AG3UtC,0BACE,eH2Ue,CAAO,AG5UxB,2BACE,eH4UgB,CAAO,AG7UzB,gCACE,eH6UqB,CAAO,AG9U9B,qCACE,eH8U0B,CAAO,AG/UnC,+BACE,eH+UoB,CAAO,AGhV7B,wBACE,eHgVa,CAAO,AGjVtB,+BACE,eHiVoB,CAAO,AGlV7B,sBACE,eHkVW,CAAO,AGnVpB,4BACE,eHmViB,CAAO,AGpV1B,+BACE,eHoVoB,CAAO,AGrV7B,4BACE,eHqViB,CAAO,AGtV1B,8BACE,eHsVmB,CAAO,AGvV5B,sBACE,eHuVW,CAAO,AGxVpB,2BACE,eHwVgB,CAAO,AGzVzB,+BACE,eHyVoB,CAAO,AG1V7B,uBACE,eH0VY,CAAO,AG3VrB,iCACE,eH2VsB,CAAO,AG5V/B,+BACE,eH4VoB,CAAO,AG7V7B,+BACE,eH6VoB,CAAO,AG9V7B,8BACE,eH8VmB,CAAO,AG/V5B,gCACE,eH+VqB,CAAO,AGhW9B,+BACE,eHgWoB,CAAO,AGjW7B,sCACE,eHiW2B,CAAO,AGlWpC,oCACE,eHkWyB,CAAO,AGnWlC,qBACE,eHmWU,CAAO,AGpWnB,6BACE,eHoWkB,CAAO,AGrW3B,sBACE,eHqWW,CAAO,AGtWpB,gCACE,eHsWqB,CAAO,AGvW9B,oBACE,eHuWS,CAAO,AGxWlB,4BACE,eHwWiB,CAAO,AGzW1B,+BACE,eHyWoB,CAAO,AG1W7B,6BACE,eH0WkB,CAAO,AG3W3B,yBACE,eH2Wc,CAAO,AG5WvB,6BACE,eH4WkB,CAAO,AG7W3B,2BACE,eH6WgB,CAAO,AG9WzB,sBACE,eH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CAAA,AsCiHf,sDD7DQ,aAAc,CAAA,AC6DtB,sKDvDQ,arC1DO,CAAA,AsCiHf,qSDlDQ,wBrCjEO,CAAA,AsCmHf,mDD9CQ,wBrCtEO,CAAA,AsCoHf,0gDDpCU,UrCrFK,CAAA,AsCyHf,4CDhEM,arC3CU,CAAA,AsC2GhB,sDD7DQ,aAAc,CAAA,AC6DtB,sKDvDQ,arCpDQ,CAAA,AsC2GhB,qSDlDQ,wBrC3DQ,CAAA,AsC6GhB,mDD9CQ,wBrChEQ,CAAA,AsC8GhB,0gDDpCU,UrCrFK,CAAA,AsCyHf,4CDhEM,arCrCW,CAAA,AsCqGjB,sDD7DQ,aAAc,CAAA,AC6DtB,sKDvDQ,arC9CS,CAAA,AsCqGjB,qSDlDQ,wBrCrDS,CAAA,AsCuGjB,mDD9CQ,wBrC1DS,CAAA,AsCwGjB,0gDDpCU,UrCrFK,CAAA,AsCyHf,2CDhEM,arC/BQ,CAAA,AsC+Fd,qDD7DQ,aAAc,CAAA,AC6DtB,mKDvDQ,arCxCM,CAAA,AsC+Fd,iSDlDQ,wBrC/CM,CAAA,AsCiGd,kDD9CQ,wBrCpDM,CAAA,AsCkGd,s/CDpCU,UrCrFK,CAAA,AsCyHf,iHAeM,atCjJS,CAAA,AsCkIf,oEAoBM,qCtCvJS,CAAA,AsCmIf,8LA+BQ,oCAA8C,CAAA,AA/BtD,uDAuCI,gCtChKW,CAAA,AF+Bb,8BwCqIE,atCtKiB,CAAA,AsC2KrB,qBACE,cAA6B,CAAA,ACjK/B,YACE,sBvCVa,AuCWb,0FvC/Ba,AuCgCb,YxCuBkC,AwCtBlC,eATkC,AAUlC,kBAAkB,AAClB,WAAW,AACX,UxCsBiB,CAAA,AwC7BnB,2CAWI,wBvClCgB,CAAA,AuCuBpB,qBAgBI,+FvC7CW,CAAA,AuCiDb,sBACE,yFvClDW,CAAA,AuC6Bf,0BAyBI,OAAO,AACP,eAAe,AACf,QAAQ,AACR,KAAM,CAAA,AAIV,oBACE,exCrCsC,AwCsCtC,iBAvCkC,CAAA,AA0CpC,kBACE,mBAAmB,AACnB,aAAa,AACb,WxCdkC,CAAA,AwCWpC,iCAMI,UAAW,CAAA,AANf,kCAUI,WAAY,CAAA,AAIhB,oBACE,yCvCjFa,AuCkFb,YAA6C,AAC7C,axC5EiB,CAAA,AwC8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Ae,AACf,gBA3B4B,AA4B5B,eA5B4B,AA6B5B,gBA1BgC,AA4BhC,iBAAkB,CAAA,ADCpB,yBC6FI,cAAe,CAAA,AD7FnB,+BCgGM,qCxDzHS,CAAA,AuDyBf,oECqGM,oCxD9HS,CAAA,AOEb,WACE,YAAY,AACZ,aAAc,CAAA,AAGhB,mBACE,YAAY,AACZ,aAAc,CAAA,AAehB,2BAGE,gBiDxBuC,CAAA,AjD4BzC,2CAEE,cAAkB,CAAA,AgDRtB,ezDoCE,qCAAmC,AACnC,iB0DnC0B,A1DoC1B,uBAAwB,CAAA,AyDtC1B,mBCMI,mBAhCgC,AAiChC,iBAAkD,AAElD,iBAAmD,CAAA,AAGrD,mBAGE,yBxDpCW,AwDqCX,axD/CgB,CAAA,AwD2ClB,mCAiFE,cAAe,CAAA,AAjFjB,yCAoFI,sCxDrHS,CAAA,AwDiCb,wFAyFI,qCxD1HS,CAAA,AwDiCb,sGAOI,iBAAkB,CAAA,ADnBxB,wECwBI,SxDrCW,CAAA,AuDaf,uCC8BE,ezDvCgC,AyDwChC,iBzD3BuB,AyD4BvB,gBA1DkC,AA2DlC,eA3DkC,AA4DlC,gBA1D8D,CAAA,AjDuB9D,gGAGE,gBiDvBqE,CAAA,AjD2BvE,gIAEE,cAAkB,CAAA,AgDRtB,2DCqCI,kBAAwD,AAExD,kBAAyD,CAAA,ADvC7D,4BC8CE,mBxDrDa,AwDsDb,UxD5Da,CAAA,AuDaf,4CC6FI,cAAe,CAAA,AD7FnB,kDCgGM,qCxDvGS,CAAA,AuDOf,0GCqGM,oCxD5GS,CAAA,AuDOf,4BC8CE,mBxD/Cc,AwDgDd,UxD5Da,CAAA,AuDaf,4CC6FI,cAAe,CAAA,AD7FnB,kDCgGM,oCxDjGU,CAAA,AuDChB,0GCqGM,mCxDtGU,CAAA,AuDChB,4BC8CE,mBxDzCe,AwD0Cf,UxD5Da,CAAA,AuDaf,4CC6FI,cAAe,CAAA,AD7FnB,kDCgGM,qCxD3FW,CAAA,AuDLjB,0GCqGM,oCxDhGW,CAAA,AuDLjB,2BC8CE,mBxDnCY,AwDoCZ,UxD5Da,CAAA,AuDaf,2CC6FI,cAAe,CAAA,AD7FnB,iDCgGM,oCxDrFQ,CAAA,AuDXd,wGCqGM,mCxD1FQ,CAAA,AuDXd,kBAeI,aAAa,AACb,UAAW,CAAA,AAhBf,4GCoDI,YxD7EW,CAAA,AuDyBf,+CC0DI,sCxDjFW,AwDkFX,axD1FgB,CAAA,AuD+BpB,+DC4GI,cAAe,CAAA,AD5GnB,qEC+GM,oCxDxIS,CAAA,AuDyBf,gJCoHM,oCxD7IS,CAAA,AwDsFX,yDAGE,axD/Ee,CAAA,AwD4EjB,yEA+CA,cAAe,CAAA,AA/Cf,+EAkDE,qCxDpIS,CAAA,AwDkFX,oKAuDE,qCxDzIS,CAAA,AwDkFX,wNAMI,YxDzFO,CAAA,AuDsBf,wCC4EE,sCxDnFa,AwDoFb,axDrFa,CAAA,AuDQf,wDC4GI,cAAe,CAAA,AD5GnB,8DC+GM,qCxDtHS,CAAA,AuDOf,kICoHM,qCxD3HS,CAAA,AuDOf,qKCgFI,YxDvFW,CAAA,AwD0Fb,kDAGE,sCxD7FW,AwD8FX,axD5FW,CAAA,AwDwFb,kEAyBE,cAAe,CAAA,AAzBjB,wEA4BI,qCxDtHS,CAAA,AwD0Fb,sJAiCI,qCxD3HS,CAAA,AuDOf,wCC4EE,qCxD7Ec,AwD8Ed,axD/Ec,CAAA,AuDEhB,wDC4GI,cAAe,CAAA,AD5GnB,8DC+GM,oCxDhHU,CAAA,AuDChB,kICoHM,oCxDrHU,CAAA,AuDChB,qKCgFI,YxDjFY,CAAA,AwDoFd,kDAGE,qCxDvFY,AwDwFZ,axDtFY,CAAA,AwDkFd,kEAyBE,cAAe,CAAA,AAzBjB,wEA4BI,oCxDhHU,CAAA,AwDoFd,sJAiCI,oCxDrHU,CAAA,AuDChB,wCC4EE,sCxDvEe,AwDwEf,axDzEe,CAAA,AuDJjB,wDC4GI,cAAe,CAAA,AD5GnB,8DC+GM,qCxD1GW,CAAA,AuDLjB,kICoHM,qCxD/GW,CAAA,AuDLjB,qKCgFI,YxD3Ea,CAAA,AwD8Ef,kDAGE,sCxDjFa,AwDkFb,axDhFa,CAAA,AwD4Ef,kEAyBE,cAAe,CAAA,AAzBjB,wEA4BI,qCxD1GW,CAAA,AwD8Ef,sJAiCI,qCxD/GW,CAAA,AuDLjB,uCC4EE,qCxDjEY,AwDkEZ,axDnEY,CAAA,AuDVd,uDC4GI,cAAe,CAAA,AD5GnB,6DC+GM,oCxDpGQ,CAAA,AuDXd,gICoHM,oCxDzGQ,CAAA,AuDXd,kKC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","file":"1.a970d4a6.chunk.css","sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]} \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css deleted file mode 100644 index 1411c770..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css +++ /dev/null @@ -1,2 +0,0 @@ -body{margin:0;padding:0;font-family:sans-serif;background-color:#232a2f}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}.bp3-slider-handle:focus{outline:0}.App{text-align:left;margin:4px 4px -30px;display:flex;flex-direction:column;justify-content:center}.bp3-slider-label{transform:translateY(20px)}.bp3-slider-axis :nth-child(2),.bp3-slider-axis :nth-child(3){transform:translate(-100%,20px)}.bp3-slider-axis :nth-child(3){right:0 px}.bp3-slider-handle .bp3-slider-label{transform:translate(-50%,-20px)}.bp3-tab-list{flex-flow:row wrap}.bp3-overlay{pointer-events:none}.parameter-label{white-space:nowrap;color:grey;font-size:16;margin-bottom:4px}.parameter-wrapper{padding-top:4px;padding-bottom:0}.parameter-wrapper .inner{padding:5px;border-radius:4px}.rootgroup-wrapper{padding:0 5px 4px;border-radius:4px;border:1px solid #454545}.serverid{font-size:.8em;margin-top:5px;margin-left:2px}.credits{margin-top:20;margin-bottom:5;width:100%;text-align:center;font-size:.8em} -/*# sourceMappingURL=main.6b57d6a6.chunk.css.map */ \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css.map b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css.map deleted file mode 100644 index 621e5525..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/css/main.6b57d6a6.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/index.css","main.6b57d6a6.chunk.css","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/App.css"],"names":[],"mappings":"AAAA,KACE,SAAU,AACV,UAAW,AACX,uBAAwB,AAMxB,wBAAkC,CACnC,AAED,KACE,uEACY,CACb,AAED,GACE,cAAe,AACf,WAAY,AACZ,SAAU,AACV,0BAA2B,AAC3B,aAAc,AACd,SAAW,CACZ,AAED,yBACE,SAAW,CCCZ,AC5BD,KACE,gBAAiB,AAEjB,qBAAqB,AACrB,aAAc,AACd,sBAAuB,AACvB,sBAAwB,CACzB,AAGD,kBAEU,0BAA8B,CACvC,AAOD,8DAHU,+BAAiC,CAQ1C,AALD,+BAIE,UAAY,CACb,AAED,qCAEU,+BAAiC,CAC1C,AAED,cACE,kBAAoB,CACrB,AAED,aACE,mBAAqB,CACtB,AAGD,iBACE,mBAAoB,AACpB,WAAY,AACZ,aAAc,AACd,iBAAmB,CACpB,AAED,mBACE,gBAAiB,AACjB,gBAAoB,CACrB,AAED,0BACE,YAAa,AACb,iBAAmB,CACpB,AAED,mBAGE,kBAAoB,AACpB,kBAAmB,AACnB,wBAA0B,CAC3B,AAED,UACE,eAAiB,AACjB,eAAgB,AAChB,eAAiB,CAClB,AAED,SAEE,cAAe,AACf,gBAAiB,AACjB,WAAY,AACZ,kBAAmB,AACnB,cAAiB,CD0BlB","file":"main.6b57d6a6.chunk.css","sourcesContent":["body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}","body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}\n.App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}\n",".App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n -webkit-transform:translate(0%, 20px);\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n -webkit-transform:translate(-50%, -20px);\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}"]} \ No newline at end of file diff --git a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/1.ab137fd1.chunk.js b/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/1.ab137fd1.chunk.js deleted file mode 100644 index 9c9fd4e1..00000000 --- a/orx-jvm/orx-rabbit-control/src/main/resources/rabbit-client/static/js/1.ab137fd1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(l,n,e){"use strict";l.exports=e(165)},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(4);n.RcpTypes=t.RcpTypes;var u=e(84);n.Client=u.Client;var r=e(194);n.WebSocketClientTransporter=r.WebSocketClientTransporter;var o=e(76);n.ClientTransporter=o.ClientTransporter;var i=e(24);n.Parameter=i.Parameter;var a=e(17);n.ValueParameter=a.ValueParameter;var c=e(43);n.BangParameter=c.BangParameter;var s=e(110);n.BooleanParameter=s.BooleanParameter;var p=e(60);n.RGBParameter=p.RGBParameter,n.RGBAParameter=p.RGBAParameter;var h=e(58);n.EnumParameter=h.EnumParameter;var f=e(59);n.GroupParameter=f.GroupParameter;var d=e(195);n.InvalidParameter=d.InvalidParameter;var v=e(62);n.IPv4Parameter=v.IPv4Parameter;var m=e(69);n.NumberParameter=m.NumberParameter;var y=e(65);n.RangeParameter=y.RangeParameter;var g=e(68);n.StringParameter=g.StringParameter;var z=e(61);n.UriParameter=z.UriParameter;var b=e(72);n.Vector2F32Parameter=b.Vector2F32Parameter,n.Vector2I32Parameter=b.Vector2I32Parameter;var E=e(70);n.Vector3F32Parameter=E.Vector3F32Parameter,n.Vector3I32Parameter=E.Vector3I32Parameter;var T=e(73);n.Vector4F32Parameter=T.Vector4F32Parameter,n.Vector4I32Parameter=T.Vector4I32Parameter;var M=e(71);n.ImageParameter=M.ImageParameter;var _=e(32);n.TypeDefinition=_.TypeDefinition;var O=e(44);n.BangDefinition=O.BangDefinition;var w=e(40);n.BooleanDefinition=w.BooleanDefinition;var V=e(45);n.RGBADefinition=V.RGBADefinition,n.RGBDefinition=V.RGBDefinition;var L=e(19);n.DefaultDefinition=L.DefaultDefinition;var C=e(41);n.EnumDefinition=C.EnumDefinition;var A=e(42);n.GroupDefinition=A.GroupDefinition;var S=e(50);n.Int32Definition=S.Int32Definition;var I=e(77);n.InvalidDefinition=I.InvalidDefinition;var R=e(47);n.IPv4Definition=R.IPv4Definition;var H=e(67);n.IPv6Definition=H.IPv6Definition;var P=e(28);n.NumberDefinition=P.NumberDefinition,n.Float32Definition=P.Float32Definition,n.Float64Definition=P.Float64Definition,n.Int16Definition=P.Int16Definition,n.Int64Definition=P.Int64Definition,n.Int8Definition=P.Int8Definition;var N=e(66);n.Range=N.Range,n.RangeDefinition=N.RangeDefinition;var D=e(51);n.StringDefinition=D.StringDefinition;var x=e(46);n.UriDefinition=x.UriDefinition;var k=e(25);n.Vector2=k.Vector2,n.Vector3=k.Vector3,n.Vector4=k.Vector4;var U=e(53);n.Vector2F32Definition=U.Vector2F32Definition,n.Vector2I32Definition=U.Vector2I32Definition;var B=e(52);n.Vector3F32Definition=B.Vector3F32Definition,n.Vector3I32Definition=B.Vector3I32Definition;var F=e(54);n.Vector4F32Definition=F.Vector4F32Definition,n.Vector4I32Definition=F.Vector4I32Definition;var j=e(12);n.Widget=j.Widget;var W=e(104);n.BangWidget=W.BangWidget;var G=e(97);n.CustomWidget=G.CustomWidget;var K=e(107);n.DefaultWidget=K.DefaultWidget;var Y=e(99);n.DialWidget=Y.DialWidget;var q=e(103);n.InfoWidget=q.InfoWidget;var X=e(101);n.NumberboxWidget=X.NumberboxWidget;var $=e(105);n.PressWidget=$.PressWidget;var Z=e(100);n.SliderWidget=Z.SliderWidget;var J=e(102);n.TextboxWidget=J.TextboxWidget;var Q=e(106);n.ToggleWidget=Q.ToggleWidget;var ll=e(89);n.ColorboxWidget=ll.ColorboxWidget;var nl=e(86);n.DirectorychooserWidget=nl.DirectorychooserWidget;var el=e(91);n.DropdownWidget=el.DropdownWidget;var tl=e(87);n.FilechooserWidget=tl.FilechooserWidget;var ul=e(85);n.IpWidget=ul.IpWidget;var rl=e(90);n.RadiobuttonWidget=rl.RadiobuttonWidget;var ol=e(92);n.RangeWidget=ol.RangeWidget;var il=e(93);n.Slider2dWidget=il.Slider2dWidget;var al=e(88);n.TableWidget=al.TableWidget;var cl=e(96);n.ListWidget=cl.ListWidget;var sl=e(95);n.ListPageWidget=sl.ListPageWidget;var pl=e(94);n.TabsWidget=pl.TabsWidget;var hl=e(98);n.UUID=hl.UUID},function(l,n,e){"use strict";function t(){var l=this.constructor.getDerivedStateFromProps(this.props,this.state);null!==l&&void 0!==l&&this.setState(l)}function u(l){this.setState(function(n){var e=this.constructor.getDerivedStateFromProps(l,n);return null!==e&&void 0!==e?e:null}.bind(this))}function r(l,n){try{var e=this.props,t=this.state;this.props=l,this.state=n,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(e,t)}finally{this.props=e,this.state=t}}function o(l){var n=l.prototype;if(!n||!n.isReactComponent)throw new Error("Can only polyfill class components");if("function"!==typeof l.getDerivedStateFromProps&&"function"!==typeof n.getSnapshotBeforeUpdate)return l;var e=null,o=null,i=null;if("function"===typeof n.componentWillMount?e="componentWillMount":"function"===typeof n.UNSAFE_componentWillMount&&(e="UNSAFE_componentWillMount"),"function"===typeof n.componentWillReceiveProps?o="componentWillReceiveProps":"function"===typeof n.UNSAFE_componentWillReceiveProps&&(o="UNSAFE_componentWillReceiveProps"),"function"===typeof n.componentWillUpdate?i="componentWillUpdate":"function"===typeof n.UNSAFE_componentWillUpdate&&(i="UNSAFE_componentWillUpdate"),null!==e||null!==o||null!==i){var a=l.displayName||l.name,c="function"===typeof l.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+a+" uses "+c+" but also contains the following legacy lifecycles:"+(null!==e?"\n "+e:"")+(null!==o?"\n "+o:"")+(null!==i?"\n "+i:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"===typeof l.getDerivedStateFromProps&&(n.componentWillMount=t,n.componentWillReceiveProps=u),"function"===typeof n.getSnapshotBeforeUpdate){if("function"!==typeof n.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");n.componentWillUpdate=r;var s=n.componentDidUpdate;n.componentDidUpdate=function(l,n,e){var t=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:e;s.call(this,l,n,t)}}return l}e.r(n),e.d(n,"polyfill",function(){return o}),t.__suppressDeprecationWarning=!0,u.__suppressDeprecationWarning=!0,r.__suppressDeprecationWarning=!0},function(l,n,e){var t;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var l=[],n=0;n cancelButtonText and onCancel should be set together.",o=t+" canEscapeKeyCancel enabled without onCancel or onClose handler.",i=t+" canOutsideClickCancel enbaled without onCancel or onClose handler.",a=t+" leftElement and leftIcon prop are mutually exclusive, with leftElement taking priority.",c=t+" requires min to be no greater than max if both are defined.",s=t+" requires minorStepSize to be no greater than stepSize.",p=t+" requires stepSize to be no greater than majorStepSize.",h=t+" requires minorStepSize to be strictly greater than zero.",f=t+" requires majorStepSize to be strictly greater than zero.",d=t+" requires stepSize to be strictly greater than zero.",v=t+" controlled value prop does not adhere to stepSize, min, and/or max constraints.",m=t+" requires target prop or at least one child element.",y=t+" requires interactionKind={PopoverInteractionKind.CLICK}.",g=t+" supports one or two children; additional children are ignored. First child is the target, second child is the content. You may instead supply these two as props.",z=t+" with two children ignores content prop; use either prop or children.",b=t+" with children ignores target prop; use either prop or children.",E=t+" Disabling with empty/whitespace content...",T=t+" ignores hasBackdrop",M=t+" onInteraction is ignored when uncontrolled.",_=t+" context blueprintPortalClassName must be string",O=t+" children and options prop are mutually exclusive, with options taking priority.",w=t+" stepSize must be greater than zero.",V=t+" labelStepSize must be greater than zero.",L=t+" value prop must be an array of two non-null numbers.",C=t+" children must be s or s",A=t+" labelStepSize and labelValues prop are mutually exclusive, with labelStepSize taking priority.",S=t+" Classes.SMALL/LARGE are ignored if size prop is set.",I=t+" iconName is ignored if title is omitted.",R=t+" isCloseButtonShown prop is ignored if title is omitted."},function(l,n,e){"use strict";function t(l,n){if(null==l)return{};var e,t,u=function(l,n){if(null==l)return{};var e,t,u={},r=Object.keys(l);for(t=0;t=0||(u[e]=l[e]);return u}(l,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(l);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(l,e)&&(u[e]=l[e])}return u}e.d(n,"a",function(){return t})},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(4),u=e(15),r=function(){function l(l){this._enabled=!0,this._labelVisible=!0,this._valueVisible=!0,this._needsConfirmation=!1,this.changed=new Map,this.widgetType=l}return l.prototype.parseOptions=function(l){for(;;){var n=l.readU1();if(n===t.RcpTypes.TERMINATOR)break;switch(n){case t.RcpTypes.WidgetOptions.ENABLED:this._enabled=l.readU1()>0;break;case t.RcpTypes.WidgetOptions.LABEL_VISIBLE:this._labelVisible=l.readU1()>0;break;case t.RcpTypes.WidgetOptions.VALUE_VISIBLE:this._valueVisible=l.readU1()>0;break;case t.RcpTypes.WidgetOptions.NEEDS_CONFIRMATION:this._needsConfirmation=l.readU1()>0;break;default:if(!this.handleOption(n,l))throw new Error("widget option not handled: "+n)}}},l.prototype.write=function(n,e){var r=this;u.pushIn16ToArrayBe(this.widgetType,n);var o=this.changed;e&&(o=l.allOptions),o.forEach(function(l,e){switch(e){case t.RcpTypes.WidgetOptions.ENABLED:n.push(t.RcpTypes.WidgetOptions.ENABLED),void 0!=r._enabled?n.push(r._enabled?1:0):n.push(1);break;case t.RcpTypes.WidgetOptions.LABEL_VISIBLE:n.push(t.RcpTypes.WidgetOptions.LABEL_VISIBLE),void 0!=r._labelVisible?n.push(r._labelVisible?1:0):n.push(1);break;case t.RcpTypes.WidgetOptions.VALUE_VISIBLE:n.push(t.RcpTypes.WidgetOptions.VALUE_VISIBLE),void 0!=r._valueVisible?n.push(r._valueVisible?1:0):n.push(1);break;case t.RcpTypes.WidgetOptions.NEEDS_CONFIRMATION:n.push(t.RcpTypes.WidgetOptions.NEEDS_CONFIRMATION),void 0!=r._needsConfirmation?n.push(r._needsConfirmation?1:0):n.push(0)}}),this.writeOptions(n,e),e||this.changed.clear(),n.push(t.RcpTypes.TERMINATOR)},l.prototype.setDirty=function(){this.parameter&&this.parameter.setDirty()},Object.defineProperty(l.prototype,"enabled",{get:function(){return this._enabled},set:function(l){this._enabled!==l&&(this._enabled=l,this.changed.set(t.RcpTypes.WidgetOptions.ENABLED,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"labelVisible",{get:function(){return this._labelVisible},set:function(l){this._labelVisible!==l&&(this._labelVisible=l,this.changed.set(t.RcpTypes.WidgetOptions.LABEL_VISIBLE,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"valueVisible",{get:function(){return this._valueVisible},set:function(l){this._valueVisible!==l&&(this._valueVisible=l,this.changed.set(t.RcpTypes.WidgetOptions.VALUE_VISIBLE,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"needsConfirmation",{get:function(){return this._needsConfirmation},set:function(l){this._needsConfirmation!==l&&(this._needsConfirmation=l,this.changed.set(t.RcpTypes.WidgetOptions.NEEDS_CONFIRMATION,!0),this.setDirty())},enumerable:!0,configurable:!0}),l.allOptions=(new Map).set(t.RcpTypes.WidgetOptions.ENABLED,!0).set(t.RcpTypes.WidgetOptions.LABEL_VISIBLE,!0).set(t.RcpTypes.WidgetOptions.VALUE_VISIBLE,!0).set(t.RcpTypes.WidgetOptions.NEEDS_CONFIRMATION,!0),l}();n.Widget=r},function(l,n){l.exports=function(l){if(void 0===l)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return l}},,function(l,n,e){"use strict";function t(l,n){var e=new DataView(new Uint32Array([l]).buffer);n.push(e.getUint8(1)),n.push(e.getUint8(0))}function u(l,n){var e=new DataView(new Uint32Array([l]).buffer);n.push(e.getUint8(3)),n.push(e.getUint8(2)),n.push(e.getUint8(1)),n.push(e.getUint8(0))}Object.defineProperty(n,"__esModule",{value:!0}),n.pushIn16ToArrayBe=t,n.pushIn32ToArrayBe=u,n.pushIn64ToArrayBe=function(l,n){var e=new DataView(new Uint32Array([l]).buffer);n.push(e.getUint8(7)),n.push(e.getUint8(6)),n.push(e.getUint8(5)),n.push(e.getUint8(4)),n.push(e.getUint8(3)),n.push(e.getUint8(2)),n.push(e.getUint8(1)),n.push(e.getUint8(0))},n.pushFloat64ToArrayBe=function(l,n){var e=new Float64Array([l]),t=new DataView(e.buffer);n.push(t.getUint8(7)),n.push(t.getUint8(6)),n.push(t.getUint8(5)),n.push(t.getUint8(4)),n.push(t.getUint8(3)),n.push(t.getUint8(2)),n.push(t.getUint8(1)),n.push(t.getUint8(0))},n.pushFloat32ToArrayBe=function(l,n){var e=new Float32Array([l]),t=new DataView(e.buffer);n.push(t.getUint8(3)),n.push(t.getUint8(2)),n.push(t.getUint8(1)),n.push(t.getUint8(0))},n.writeTinyString=function(l,n){var e=(new TextEncoder).encode(l);e.length>255&&(e=e.slice(1,256)),n.push(e.length),e.forEach(function(l){n.push(l)})},n.writeShortString=function(l,n){var e=(new TextEncoder).encode(l);e.length>65535&&(e=e.slice(1,65536)),t(e.length,n),e.forEach(function(l){n.push(l)})},n.writeLongString=function(l,n){var e=(new TextEncoder).encode(l);u(e.length,n),e.forEach(function(l){n.push(l)})}},function(l,n,e){"use strict";!function l(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(l)}catch(n){console.error(n)}}(),l.exports=e(166)},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(24),r=e(4),o=function(l){function n(n,e){var t=l.call(this,n,e)||this;return t.valueChangedListeners=[],t.defaultTypeDefintion=e,t}return t(n,l),n.prototype.valueConstrained=function(){return this._value},n.prototype.dispose=function(){l.prototype.dispose.call(this),this.valueChangedListeners=[]},n.prototype.addValueChangeListener=function(l){this.valueChangedListeners.indexOf(l)>=0||this.valueChangedListeners.push(l)},n.prototype.removeValueChangedListener=function(l){var n=this.valueChangedListeners.indexOf(l);n<0||this.valueChangedListeners.splice(n,1)},n.prototype.update=function(n){var e=this;if(this.id!==n.id)throw new Error("can not update with parameter with wrong id");if(this.typeDefinition.datatype!==n.typeDefinition.datatype)throw new Error("can not update with parameter of wrong type");l.prototype.update.call(this,n),void 0!=n._value&&(this._value=n._value,this.valueChangedListeners.forEach(function(l){return l(e)}))},n.prototype.writeOptions=function(n,e){(e||this.changed.has(r.RcpTypes.ParameterOptions.VALUE))&&(n.push(r.RcpTypes.ParameterOptions.VALUE),this.defaultTypeDefintion.writeValue(n,this._value)),l.prototype.writeOptions.call(this,n,e)},n.prototype.writeValueUpdate=function(n){l.prototype.writeValueUpdate.call(this,n),this.defaultTypeDefintion.writeValue(n,this._value)},n.prototype.handleOption=function(l,n){return l===r.RcpTypes.ParameterOptions.VALUE&&(this._value=this.defaultTypeDefintion.readValue(n),!0)},Object.defineProperty(n.prototype,"value",{get:function(){return this._value?this._value:this.defaultTypeDefintion.getTypeDefault()},set:function(l){var n=this;this._value!==l&&(this._value=l,this.changed.set(r.RcpTypes.ParameterOptions.VALUE,!0),this.setDirty(),this.valueChangedListeners.forEach(function(l){l(n)}))},enumerable:!0,configurable:!0}),n}(u.Parameter);n.ValueParameter=o},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.intLog2=n.cidrPrefixToMaskBinaryString=n.leftPadWithZeroBit=n.dottedDecimalNotationToBinaryString=n.parseBinaryStringToBigInteger=n.decimalNumberToOctetString=n.bigIntegerNumberToBinaryString=n.decimalNumberToBinaryString=void 0;var t=e(20),u=e(33);n.decimalNumberToBinaryString=function(l){return Number(l).toString(2)},n.bigIntegerNumberToBinaryString=function(l){return l.toString(2)},n.decimalNumberToOctetString=function(l){var e=n.decimalNumberToBinaryString(l);if(e.length>8)throw new Error("Given decimal in binary contains digits greater than an octet");return n.leftPadWithZeroBit(e,8)},n.parseBinaryStringToBigInteger=function(l){return t(l,2)},n.dottedDecimalNotationToBinaryString=function(l){return l.split(".").reduce(function(l,e){return l.concat(n.decimalNumberToOctetString(parseInt(e)))},"")},n.leftPadWithZeroBit=function(l,n){if(l.length>n)throw new Error("Given string is already longer than given final length after padding: "+n);return"0".repeat(n-l.length).concat(l)},n.cidrPrefixToMaskBinaryString=function(l,n){var e;if(l>(e=n==u.IPNumType.IPv4?32:128))throw Error("Value is greater than "+e);return""+"1".repeat(l)+"0".repeat(e-l)},n.intLog2=function(l){for(var n=0;l.isEven();){if(l.equals(t(2))){n++;break}if((l=l.shiftRight(t(1))).isOdd()){n=0;break}n++}if(0==n)throw new Error("The value of log2 for "+l.toString()+" is not an integer");return n}},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=function(l){function n(n){var e=l.call(this,n)||this;return e.changed=new Map,e}return t(n,l),n.prototype.didChange=function(){return this.changed.size>0},n.prototype.setDirty=function(){this.parameter&&this.parameter.setDirty()},Object.defineProperty(n.prototype,"defaultValue",{get:function(){return this._defaultValue?this._defaultValue:this.getTypeDefault()},set:function(l){this._defaultValue!==l&&(this._defaultValue=l,this.changed.set(this.getDefaultId(),!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(e(32).TypeDefinition);n.DefaultDefinition=u},function(l,n,e){(function(l){var t,u=function(l){"use strict";var n=1e7,e=7,t=9007199254740992,r=f(t),o="0123456789abcdefghijklmnopqrstuvwxyz",i="function"===typeof BigInt;function a(l,n,e,t){return"undefined"===typeof l?a[0]:"undefined"!==typeof n&&(10!==+n||e)?W(l,n,e,t):X(l)}function c(l,n){this.value=l,this.sign=n,this.isSmall=!1}function s(l){this.value=l,this.sign=l<0,this.isSmall=!0}function p(l){this.value=l}function h(l){return-t0?Math.floor(l):Math.ceil(l)}function g(l,e){var t,u,r=l.length,o=e.length,i=new Array(r),a=0,c=n;for(u=0;u=c?1:0,i[u]=t-a*c;for(;u0&&i.push(a),i}function z(l,n){return l.length>=n.length?g(l,n):g(n,l)}function b(l,e){var t,u,r=l.length,o=new Array(r),i=n;for(u=0;u0;)o[u++]=e%i,e=Math.floor(e/i);return o}function E(l,e){var t,u,r=l.length,o=e.length,i=new Array(r),a=0,c=n;for(t=0;t0;)o[u++]=a%i,a=Math.floor(a/i);return o}function O(l,n){for(var e=[];n-- >0;)e.push(0);return e.concat(l)}function w(l,e,t){return new c(l=0;--t)r=(o=r*c+l[t])-(u=y(o/e))*e,a[t]=0|u;return[a,0|r]}function C(l,e){var t,u=X(e);if(i)return[new p(l.value/u.value),new p(l.value%u.value)];var r,o=l.value,h=u.value;if(0===h)throw new Error("Cannot divide by zero");if(l.isSmall)return u.isSmall?[new s(y(o/h)),new s(o%h)]:[a[0],l];if(u.isSmall){if(1===h)return[l,a[0]];if(-1==h)return[l.negate(),a[0]];var g=Math.abs(h);if(g=0;u--){for(t=h-1,g[u+p]!==v&&(t=Math.floor((g[u+p]*h+g[u+p-1])/v)),r=0,o=0,a=z.length,i=0;ic&&(r=(r+1)*h),t=Math.ceil(r/o);do{if(A(i=_(e,t),p)<=0)break;t--}while(t);s.push(t),p=E(p,i)}return s.reverse(),[d(s),d(p)]}(o,h))[0];var T=l.sign!==u.sign,M=t[1],O=l.sign;return"number"===typeof r?(T&&(r=-r),r=new s(r)):r=new c(r,T),"number"===typeof M?(O&&(M=-M),M=new s(M)):M=new c(M,O),[r,M]}function A(l,n){if(l.length!==n.length)return l.length>n.length?1:-1;for(var e=l.length-1;e>=0;e--)if(l[e]!==n[e])return l[e]>n[e]?1:-1;return 0}function S(l){var n=l.abs();return!n.isUnit()&&(!!(n.equals(2)||n.equals(3)||n.equals(5))||!(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))&&(!!n.lesser(49)||void 0))}function I(l,n){for(var e,t,r,o=l.prev(),i=o,a=0;i.isEven();)i=i.divide(2),a++;l:for(t=0;t=0?t=E(l,n):(t=E(n,l),e=!e),"number"===typeof(t=d(t))?(e&&(t=-t),new s(t)):new c(t,e)}(e,t,this.sign)},c.prototype.minus=c.prototype.subtract,s.prototype.subtract=function(l){var n=X(l),e=this.value;if(e<0!==n.sign)return this.add(n.negate());var t=n.value;return n.isSmall?new s(e-t):T(t,Math.abs(e),e>=0)},s.prototype.minus=s.prototype.subtract,p.prototype.subtract=function(l){return new p(this.value-X(l).value)},p.prototype.minus=p.prototype.subtract,c.prototype.negate=function(){return new c(this.value,!this.sign)},s.prototype.negate=function(){var l=this.sign,n=new s(-this.value);return n.sign=!l,n},p.prototype.negate=function(){return new p(-this.value)},c.prototype.abs=function(){return new c(this.value,!1)},s.prototype.abs=function(){return new s(Math.abs(this.value))},p.prototype.abs=function(){return new p(this.value>=0?this.value:-this.value)},c.prototype.multiply=function(l){var e,t,u,r=X(l),o=this.value,i=r.value,s=this.sign!==r.sign;if(r.isSmall){if(0===i)return a[0];if(1===i)return this;if(-1===i)return this.negate();if((e=Math.abs(i))0?function l(n,e){var t=Math.max(n.length,e.length);if(t<=30)return M(n,e);t=Math.ceil(t/2);var u=n.slice(t),r=n.slice(0,t),o=e.slice(t),i=e.slice(0,t),a=l(r,i),c=l(u,o),s=l(z(r,u),z(i,o)),p=z(z(a,O(E(E(s,a),c),t)),O(c,2*t));return v(p),p}(o,i):M(o,i),s)},c.prototype.times=c.prototype.multiply,s.prototype._multiplyBySmall=function(l){return h(l.value*this.value)?new s(l.value*this.value):w(Math.abs(l.value),f(Math.abs(this.value)),this.sign!==l.sign)},c.prototype._multiplyBySmall=function(l){return 0===l.value?a[0]:1===l.value?this:-1===l.value?this.negate():w(Math.abs(l.value),this.value,this.sign!==l.sign)},s.prototype.multiply=function(l){return X(l)._multiplyBySmall(this)},s.prototype.times=s.prototype.multiply,p.prototype.multiply=function(l){return new p(this.value*X(l).value)},p.prototype.times=p.prototype.multiply,c.prototype.square=function(){return new c(V(this.value),!1)},s.prototype.square=function(){var l=this.value*this.value;return h(l)?new s(l):new c(V(f(Math.abs(this.value))),!1)},p.prototype.square=function(l){return new p(this.value*this.value)},c.prototype.divmod=function(l){var n=C(this,l);return{quotient:n[0],remainder:n[1]}},p.prototype.divmod=s.prototype.divmod=c.prototype.divmod,c.prototype.divide=function(l){return C(this,l)[0]},p.prototype.over=p.prototype.divide=function(l){return new p(this.value/X(l).value)},s.prototype.over=s.prototype.divide=c.prototype.over=c.prototype.divide,c.prototype.mod=function(l){return C(this,l)[1]},p.prototype.mod=p.prototype.remainder=function(l){return new p(this.value%X(l).value)},s.prototype.remainder=s.prototype.mod=c.prototype.remainder=c.prototype.mod,c.prototype.pow=function(l){var n,e,t,u=X(l),r=this.value,o=u.value;if(0===o)return a[1];if(0===r)return a[0];if(1===r)return a[1];if(-1===r)return u.isEven()?a[1]:a[-1];if(u.sign)return a[0];if(!u.isSmall)throw new Error("The exponent "+u.toString()+" is too large.");if(this.isSmall&&h(n=Math.pow(r,o)))return new s(y(n));for(e=this,t=a[1];!0&o&&(t=t.times(e),--o),0!==o;)o/=2,e=e.square();return t},s.prototype.pow=c.prototype.pow,p.prototype.pow=function(l){var n=X(l),e=this.value,t=n.value,u=BigInt(0),r=BigInt(1),o=BigInt(2);if(t===u)return a[1];if(e===u)return a[0];if(e===r)return a[1];if(e===BigInt(-1))return n.isEven()?a[1]:a[-1];if(n.isNegative())return new p(u);for(var i=this,c=a[1];(t&r)===r&&(c=c.times(i),--t),t!==u;)t/=o,i=i.square();return c},c.prototype.modPow=function(l,n){if(l=X(l),(n=X(n)).isZero())throw new Error("Cannot take modPow with modulus 0");var e=a[1],t=this.mod(n);for(l.isNegative()&&(l=l.multiply(a[-1]),t=t.modInv(n));l.isPositive();){if(t.isZero())return a[0];l.isOdd()&&(e=e.multiply(t).mod(n)),l=l.divide(2),t=t.square().mod(n)}return e},p.prototype.modPow=s.prototype.modPow=c.prototype.modPow,c.prototype.compareAbs=function(l){var n=X(l),e=this.value,t=n.value;return n.isSmall?1:A(e,t)},s.prototype.compareAbs=function(l){var n=X(l),e=Math.abs(this.value),t=n.value;return n.isSmall?e===(t=Math.abs(t))?0:e>t?1:-1:-1},p.prototype.compareAbs=function(l){var n=this.value,e=X(l).value;return(n=n>=0?n:-n)===(e=e>=0?e:-e)?0:n>e?1:-1},c.prototype.compare=function(l){if(l===1/0)return-1;if(l===-1/0)return 1;var n=X(l),e=this.value,t=n.value;return this.sign!==n.sign?n.sign?1:-1:n.isSmall?this.sign?-1:1:A(e,t)*(this.sign?-1:1)},c.prototype.compareTo=c.prototype.compare,s.prototype.compare=function(l){if(l===1/0)return-1;if(l===-1/0)return 1;var n=X(l),e=this.value,t=n.value;return n.isSmall?e==t?0:e>t?1:-1:e<0!==n.sign?e<0?-1:1:e<0?1:-1},s.prototype.compareTo=s.prototype.compare,p.prototype.compare=function(l){if(l===1/0)return-1;if(l===-1/0)return 1;var n=this.value,e=X(l).value;return n===e?0:n>e?1:-1},p.prototype.compareTo=p.prototype.compare,c.prototype.equals=function(l){return 0===this.compare(l)},p.prototype.eq=p.prototype.equals=s.prototype.eq=s.prototype.equals=c.prototype.eq=c.prototype.equals,c.prototype.notEquals=function(l){return 0!==this.compare(l)},p.prototype.neq=p.prototype.notEquals=s.prototype.neq=s.prototype.notEquals=c.prototype.neq=c.prototype.notEquals,c.prototype.greater=function(l){return this.compare(l)>0},p.prototype.gt=p.prototype.greater=s.prototype.gt=s.prototype.greater=c.prototype.gt=c.prototype.greater,c.prototype.lesser=function(l){return this.compare(l)<0},p.prototype.lt=p.prototype.lesser=s.prototype.lt=s.prototype.lesser=c.prototype.lt=c.prototype.lesser,c.prototype.greaterOrEquals=function(l){return this.compare(l)>=0},p.prototype.geq=p.prototype.greaterOrEquals=s.prototype.geq=s.prototype.greaterOrEquals=c.prototype.geq=c.prototype.greaterOrEquals,c.prototype.lesserOrEquals=function(l){return this.compare(l)<=0},p.prototype.leq=p.prototype.lesserOrEquals=s.prototype.leq=s.prototype.lesserOrEquals=c.prototype.leq=c.prototype.lesserOrEquals,c.prototype.isEven=function(){return 0===(1&this.value[0])},s.prototype.isEven=function(){return 0===(1&this.value)},p.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},c.prototype.isOdd=function(){return 1===(1&this.value[0])},s.prototype.isOdd=function(){return 1===(1&this.value)},p.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},c.prototype.isPositive=function(){return!this.sign},s.prototype.isPositive=function(){return this.value>0},p.prototype.isPositive=s.prototype.isPositive,c.prototype.isNegative=function(){return this.sign},s.prototype.isNegative=function(){return this.value<0},p.prototype.isNegative=s.prototype.isNegative,c.prototype.isUnit=function(){return!1},s.prototype.isUnit=function(){return 1===Math.abs(this.value)},p.prototype.isUnit=function(){return this.abs().value===BigInt(1)},c.prototype.isZero=function(){return!1},s.prototype.isZero=function(){return 0===this.value},p.prototype.isZero=function(){return this.value===BigInt(0)},c.prototype.isDivisibleBy=function(l){var n=X(l);return!n.isZero()&&(!!n.isUnit()||(0===n.compareAbs(2)?this.isEven():this.mod(n).isZero()))},p.prototype.isDivisibleBy=s.prototype.isDivisibleBy=c.prototype.isDivisibleBy,c.prototype.isPrime=function(l){var n=S(this);if(void 0!==n)return n;var e=this.abs(),t=e.bitLength();if(t<=64)return I(e,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var r=Math.log(2)*t.toJSNumber(),o=Math.ceil(!0===l?2*Math.pow(r,2):r),i=[],a=0;a-t?new s(l-1):new c(r,!0)},p.prototype.prev=function(){return new p(this.value-BigInt(1))};for(var R=[1];2*R[R.length-1]<=n;)R.push(2*R[R.length-1]);var H=R.length,P=R[H-1];function N(l){return Math.abs(l)<=n}function D(l,n,e){n=X(n);for(var t=l.isNegative(),r=n.isNegative(),o=t?l.not():l,i=r?n.not():n,a=0,c=0,s=null,p=null,h=[];!o.isZero()||!i.isZero();)a=(s=C(o,P))[1].toJSNumber(),t&&(a=P-1-a),c=(p=C(i,P))[1].toJSNumber(),r&&(c=P-1-c),o=s[0],i=p[0],h.push(e(a,c));for(var f=0!==e(t?1:0,r?1:0)?u(-1):u(0),d=h.length-1;d>=0;d-=1)f=f.multiply(P).add(u(h[d]));return f}c.prototype.shiftLeft=function(l){var n=X(l).toJSNumber();if(!N(n))throw new Error(String(n)+" is too large for shifting.");if(n<0)return this.shiftRight(-n);var e=this;if(e.isZero())return e;for(;n>=H;)e=e.multiply(P),n-=H-1;return e.multiply(R[n])},p.prototype.shiftLeft=s.prototype.shiftLeft=c.prototype.shiftLeft,c.prototype.shiftRight=function(l){var n,e=X(l).toJSNumber();if(!N(e))throw new Error(String(e)+" is too large for shifting.");if(e<0)return this.shiftLeft(-e);for(var t=this;e>=H;){if(t.isZero()||t.isNegative()&&t.isUnit())return t;t=(n=C(t,P))[1].isNegative()?n[0].prev():n[0],e-=H-1}return(n=C(t,R[e]))[1].isNegative()?n[0].prev():n[0]},p.prototype.shiftRight=s.prototype.shiftRight=c.prototype.shiftRight,c.prototype.not=function(){return this.negate().prev()},p.prototype.not=s.prototype.not=c.prototype.not,c.prototype.and=function(l){return D(this,l,function(l,n){return l&n})},p.prototype.and=s.prototype.and=c.prototype.and,c.prototype.or=function(l){return D(this,l,function(l,n){return l|n})},p.prototype.or=s.prototype.or=c.prototype.or,c.prototype.xor=function(l){return D(this,l,function(l,n){return l^n})},p.prototype.xor=s.prototype.xor=c.prototype.xor;var x=1<<30,k=(n&-n)*(n&-n)|x;function U(l){var e=l.value,t="number"===typeof e?e|x:"bigint"===typeof e?e|BigInt(x):e[0]+e[1]*n|k;return t&-t}function B(l,n){return l=X(l),n=X(n),l.greater(n)?l:n}function F(l,n){return l=X(l),n=X(n),l.lesser(n)?l:n}function j(l,n){if(l=X(l).abs(),n=X(n).abs(),l.equals(n))return l;if(l.isZero())return n;if(n.isZero())return l;for(var e,t,u=a[1];l.isEven()&&n.isEven();)e=F(U(l),U(n)),l=l.divide(e),n=n.divide(e),u=u.multiply(e);for(;l.isEven();)l=l.divide(U(l));do{for(;n.isEven();)n=n.divide(U(n));l.greater(n)&&(t=n,n=l,l=t),n=n.subtract(l)}while(!n.isZero());return u.isUnit()?l:l.multiply(u)}c.prototype.bitLength=function(){var l=this;return l.compareTo(u(0))<0&&(l=l.negate().subtract(u(1))),0===l.compareTo(u(0))?u(0):u(function l(n,e){if(e.compareTo(n)<=0){var t=l(n,e.square(e)),r=t.p,o=t.e,i=r.multiply(e);return i.compareTo(n)<=0?{p:i,e:2*o+1}:{p:r,e:2*o}}return{p:u(1),e:0}}(l,u(2)).e).add(u(1))},p.prototype.bitLength=s.prototype.bitLength=c.prototype.bitLength;var W=function(l,n,e,t){e=e||o,l=String(l),t||(l=l.toLowerCase(),e=e.toLowerCase());var u,r=l.length,i=Math.abs(n),a={};for(u=0;u=i)){if("1"===p&&1===i)continue;throw new Error(p+" is not a valid digit in base "+n+".")}}n=X(n);var c=[],s="-"===l[0];for(u=s?1:0;u"!==l[u]&&u=0;t--)u=u.add(l[t].times(r)),r=r.times(n);return e?u.negate():u}function K(l,n){if((n=u(n)).isZero()){if(l.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(n.equals(-1)){if(l.isZero())return{value:[0],isNegative:!1};if(l.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-l.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var e=Array.apply(null,Array(l.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return e.unshift([1]),{value:[].concat.apply([],e),isNegative:!1}}var t=!1;if(l.isNegative()&&n.isPositive()&&(t=!0,l=l.abs()),n.isUnit())return l.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(l.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:t};for(var r,o=[],i=l;i.isNegative()||i.compareAbs(n)>=0;){r=i.divmod(n),i=r.quotient;var a=r.remainder;a.isNegative()&&(a=n.minus(a).abs(),i=i.next()),o.push(a.toJSNumber())}return o.push(i.toJSNumber()),{value:o.reverse(),isNegative:t}}function Y(l,n,e){var t=K(l,n);return(t.isNegative?"-":"")+t.value.map(function(l){return function(l,n){return l<(n=n||o).length?n[l]:"<"+l+">"}(l,e)}).join("")}function q(l){if(h(+l)){var n=+l;if(n===y(n))return i?new p(BigInt(n)):new s(n);throw new Error("Invalid integer: "+l)}var t="-"===l[0];t&&(l=l.slice(1));var u=l.split(/e/i);if(u.length>2)throw new Error("Invalid integer: "+u.join("e"));if(2===u.length){var r=u[1];if("+"===r[0]&&(r=r.slice(1)),(r=+r)!==y(r)||!h(r))throw new Error("Invalid integer: "+r+" is not a valid exponent.");var o=u[0],a=o.indexOf(".");if(a>=0&&(r-=o.length-a-1,o=o.slice(0,a)+o.slice(a+1)),r<0)throw new Error("Cannot include negative exponent part for integers");l=o+=new Array(r+1).join("0")}if(!/^([0-9][0-9]*)$/.test(l))throw new Error("Invalid integer: "+l);if(i)return new p(BigInt(t?"-"+l:l));for(var f=[],d=l.length,m=e,g=d-m;d>0;)f.push(+l.slice(g,d)),(g-=m)<0&&(g=0),d-=m;return v(f),new c(f,t)}function X(l){return"number"===typeof l?function(l){if(i)return new p(BigInt(l));if(h(l)){if(l!==y(l))throw new Error(l+" is not an integer.");return new s(l)}return q(l.toString())}(l):"string"===typeof l?q(l):"bigint"===typeof l?new p(l):l}c.prototype.toArray=function(l){return K(this,l)},s.prototype.toArray=function(l){return K(this,l)},p.prototype.toArray=function(l){return K(this,l)},c.prototype.toString=function(l,n){if(void 0===l&&(l=10),10!==l)return Y(this,l,n);for(var e,t=this.value,u=t.length,r=String(t[--u]);--u>=0;)e=String(t[u]),r+="0000000".slice(e.length)+e;return(this.sign?"-":"")+r},s.prototype.toString=function(l,n){return void 0===l&&(l=10),10!=l?Y(this,l,n):String(this.value)},p.prototype.toString=s.prototype.toString,p.prototype.toJSON=c.prototype.toJSON=s.prototype.toJSON=function(){return this.toString()},c.prototype.valueOf=function(){return parseInt(this.toString(),10)},c.prototype.toJSNumber=c.prototype.valueOf,s.prototype.valueOf=function(){return this.value},s.prototype.toJSNumber=s.prototype.valueOf,p.prototype.valueOf=p.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var $=0;$<1e3;$++)a[$]=X($),$>0&&(a[-$]=X(-$));return a.one=a[1],a.zero=a[0],a.minusOne=a[-1],a.max=B,a.min=F,a.gcd=j,a.lcm=function(l,n){return l=X(l).abs(),n=X(n).abs(),l.divide(j(l,n)).multiply(n)},a.isInstance=function(l){return l instanceof c||l instanceof s||l instanceof p},a.randBetween=function(l,e,t){l=X(l),e=X(e);var u=t||Math.random,r=F(l,e),o=B(l,e).subtract(r).add(1);if(o.isSmall)return r.add(Math.floor(u()*o));for(var i=K(o,n).value,c=[],s=!0,p=0;p=0||this.changedListeners.push(l)},l.prototype.removeChangedListener=function(l){var n=this.changedListeners.indexOf(l);n<0||this.changedListeners.splice(n,1)},l.prototype.update=function(l){var n=this;if(this.id===l.id){var e=this.typeDefinition.update(l.typeDefinition);void 0!==l._label&&(this._label=l._label,e=!0),l.languageLabels.size>0&&(this.languageLabels.clear(),l.languageLabels.forEach(function(l,e){n.languageLabels.set(e,l)}),e=!0),void 0!==l._description&&(this._description=l._description,e=!0),l.languageDescriptions.size>0&&(this.languageDescriptions.clear(),l.languageDescriptions.forEach(function(l,e){n.languageDescriptions.set(e,l)}),e=!0),void 0!==l._tags&&(this._tags=l._tags,e=!0),void 0!==l._order&&(this._order=l._order,e=!0),void 0!==l._parent&&(this.parent=l._parent,e=!0),void 0!==l._widget&&(this._widget=l._widget,e=!0),void 0!==l._userdata&&(this._userdata=l._userdata,e=!0),void 0!==l._userid&&(this._userid=l._userid,e=!0),void 0!==l._readonly&&(this._readonly=l._readonly,e=!0),e&&this.changedListeners.forEach(function(l){l(n)})}},l.prototype.removeFromParent=function(){void 0!==this._parent&&(this._parent.removeChild(this),this._parent=void 0)},l.prototype.writeValueUpdate=function(l){u.pushIn16ToArrayBe(this.id,l),l.push(this.typeDefinition.datatype),this.typeDefinition.writeMandatory(l)},l.prototype.writeLabel=function(l){this._label&&(l.push("any".charCodeAt(0)),l.push("any".charCodeAt(1)),l.push("any".charCodeAt(2)),u.writeTinyString(this._label,l)),this.languageLabels.size>0&&this.languageLabels.forEach(function(n,e){e.length<3||(l.push(e.charCodeAt(0)),l.push(e.charCodeAt(1)),l.push(e.charCodeAt(2)),u.writeTinyString(n,l))}),l.push(r.RcpTypes.TERMINATOR)},l.prototype.writeDescription=function(l){this._description&&(l.push("any".charCodeAt(0)),l.push("any".charCodeAt(1)),l.push("any".charCodeAt(2)),u.writeShortString(this._description,l)),this.languageDescriptions.size>0&&this.languageDescriptions.forEach(function(n,e){e.length<3||(l.push(e.charCodeAt(0)),l.push(e.charCodeAt(1)),l.push(e.charCodeAt(2)),u.writeShortString(n,l))}),l.push(r.RcpTypes.TERMINATOR)},l.prototype.writeOptions=function(n,e){var t=this,o=this.changed;e&&(o=l.allOptions),o.forEach(function(l,o){switch(o){case r.RcpTypes.ParameterOptions.VALUE:break;case r.RcpTypes.ParameterOptions.LABEL:n.push(r.RcpTypes.ParameterOptions.LABEL),t._label||t.languageLabels.size>0?t.writeLabel(n):n.push(r.RcpTypes.TERMINATOR);break;case r.RcpTypes.ParameterOptions.DESCRIPTION:n.push(r.RcpTypes.ParameterOptions.DESCRIPTION),t._description||t.languageDescriptions.size>0?t.writeDescription(n):n.push(r.RcpTypes.TERMINATOR);break;case r.RcpTypes.ParameterOptions.TAGS:n.push(r.RcpTypes.ParameterOptions.TAGS),t._tags?u.writeTinyString(t._tags,n):u.writeTinyString("",n);break;case r.RcpTypes.ParameterOptions.ORDER:n.push(r.RcpTypes.ParameterOptions.ORDER),void 0!=t._order?u.pushIn32ToArrayBe(t._order,n):u.pushIn32ToArrayBe(0,n);break;case r.RcpTypes.ParameterOptions.PARENTID:n.push(r.RcpTypes.ParameterOptions.PARENTID),t._parent?u.pushIn16ToArrayBe(t._parent.id,n):u.pushIn16ToArrayBe(0,n);break;case r.RcpTypes.ParameterOptions.WIDGET:n.push(r.RcpTypes.ParameterOptions.WIDGET),t._widget?t._widget.write(n,e):n.push(r.RcpTypes.TERMINATOR);break;case r.RcpTypes.ParameterOptions.READONLY:n.push(r.RcpTypes.ParameterOptions.READONLY),t._readonly?n.push(t._readonly?1:0):n.push(0);break;case r.RcpTypes.ParameterOptions.USERDATA:t._userdata;break;case r.RcpTypes.ParameterOptions.USERID:n.push(r.RcpTypes.ParameterOptions.USERID),t._userid?u.writeTinyString(t._userid,n):u.writeTinyString("",n)}}),e||this.changed.clear()},l.prototype.write=function(l,n){u.pushIn16ToArrayBe(this.id,l),this.typeDefinition.write(l,n),this.writeOptions(l,n),l.push(r.RcpTypes.TERMINATOR)},l.prototype.handleOption=function(l,n){return!1},l.prototype.parseOptions=function(l){for(this.typeDefinition.readMandatory(l),this.typeDefinition.parseOptions(l);;){var n=l.readU1();if(n==r.RcpTypes.TERMINATOR)break;switch(n){case r.RcpTypes.ParameterOptions.LABEL:for(var e=l.pos,u=l.readS1();0!=u;){l.seek(e);var i=t.default.bytesToStr(l.readBytes(3),"utf-8"),a=new r.TinyString(l).data;a&&("any"===i?this._label=a:(console.log("setting language label "+i+" : "+a),this.languageLabels.set(i,a))),e=l.pos,u=l.readS1()}break;case r.RcpTypes.ParameterOptions.DESCRIPTION:for(e=l.pos,u=l.readS1();0!=u;){l.seek(e);i=t.default.bytesToStr(l.readBytes(3),"utf-8");var c=new r.ShortString(l).data;c&&("any"===i?this._description=c:(console.log("setting language label "+i+" : "+c),this.languageDescriptions.set(i,c))),e=l.pos,u=l.readS1()}break;case r.RcpTypes.ParameterOptions.TAGS:this._tags=new r.TinyString(l).data;break;case r.RcpTypes.ParameterOptions.ORDER:this._order=l.readS4be();break;case r.RcpTypes.ParameterOptions.PARENTID:var s=l.readS2be();if(this.manager)if(0===s)this._parent=this.manager.getRootGroup();else{var p=this.manager.getParameter(s);p&&(this._parent=p)}break;case r.RcpTypes.ParameterOptions.WIDGET:this._widget=o.parseWidget(l,this);break;case r.RcpTypes.ParameterOptions.READONLY:this._readonly=l.readS1()>0;break;case r.RcpTypes.ParameterOptions.USERDATA:this._userdata=new r.Userdata(l).data;break;case r.RcpTypes.ParameterOptions.USERID:this._userid=new r.TinyString(l).data;break;case r.RcpTypes.ParameterOptions.VALUE:default:if(!this.handleOption(n,l))throw new Error("parameter option not handled: "+n)}}},l.prototype.setDirty=function(){console.log("set dirty: "+this.label),this.manager&&this.manager.setParameterDirty(this)},Object.defineProperty(l.prototype,"label",{get:function(){return this._label},set:function(l){this._label!==l&&(this._label=l,this.changed.set(r.RcpTypes.ParameterOptions.LABEL,!0),this.setDirty())},enumerable:!0,configurable:!0}),l.prototype.getLabelLanguages=function(){return this.languageLabels.keys()},l.prototype.getLanguageLabel=function(l){return this.languageLabels.get(l)},l.prototype.clearLanguageLabels=function(){this.languageLabels.clear(),this.changed.set(r.RcpTypes.ParameterOptions.LABEL,!0),this.setDirty()},l.prototype.setLanguageLabel=function(l,n){this.languageLabels.set(l,n),this.changed.set(r.RcpTypes.ParameterOptions.LABEL,!0),this.setDirty()},l.prototype.removeLanguageLabel=function(l){this.languageLabels.delete(l),this.changed.set(r.RcpTypes.ParameterOptions.LABEL,!0),this.setDirty()},Object.defineProperty(l.prototype,"description",{get:function(){return this._description},set:function(l){this._description!==l&&(this._description=l,this.changed.set(r.RcpTypes.ParameterOptions.DESCRIPTION,!0),this.setDirty())},enumerable:!0,configurable:!0}),l.prototype.getDescriptionLanguages=function(){return this.languageDescriptions.keys()},l.prototype.getLanguageDescription=function(l){return this.languageDescriptions.get(l)},l.prototype.clearLanguageDescriptions=function(){this.languageDescriptions.clear(),this.changed.set(r.RcpTypes.ParameterOptions.DESCRIPTION,!0),this.setDirty()},l.prototype.setLanguageDescription=function(l,n){this.languageDescriptions.set(l,n),this.changed.set(r.RcpTypes.ParameterOptions.DESCRIPTION,!0),this.setDirty()},l.prototype.removeLanguageDescription=function(l){this.languageDescriptions.delete(l),this.changed.set(r.RcpTypes.ParameterOptions.DESCRIPTION,!0),this.setDirty()},Object.defineProperty(l.prototype,"tags",{get:function(){return this._tags},set:function(l){this._tags!==l&&(this._tags=l,this.changed.set(r.RcpTypes.ParameterOptions.TAGS,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"order",{get:function(){return this._order},set:function(l){this._order!==l&&(this._order=l,this.changed.set(r.RcpTypes.ParameterOptions.ORDER,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"parent",{get:function(){return this._parent},set:function(l){void 0!==this._parent&&void 0!==l&&this._parent.id===l.id||(this.setParentDirect(l),this.changed.set(r.RcpTypes.ParameterOptions.PARENTID,!0),this.setDirty())},enumerable:!0,configurable:!0}),l.prototype.setParentDirect=function(l){this.removeFromParent(),this._parent=l,void 0!==this._parent&&this._parent.addChild(this)},Object.defineProperty(l.prototype,"widget",{get:function(){return this._widget},set:function(l){this._widget=l,this._widget&&(this._widget.parameter=this),this.changed.set(r.RcpTypes.ParameterOptions.WIDGET,!0),this.setDirty()},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"userdata",{get:function(){return this._userdata},set:function(l){this._userdata!==l&&(this._userdata=l,this.changed.set(r.RcpTypes.ParameterOptions.USERDATA,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"userid",{get:function(){return this._userid},set:function(l){this._userid!==l&&(this._userid=l,this.changed.set(r.RcpTypes.ParameterOptions.USERID,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(l.prototype,"readonly",{get:function(){return this._readonly},set:function(l){this._readonly!==l&&(this._readonly=l,this.changed.set(r.RcpTypes.ParameterOptions.READONLY,!0),this.setDirty())},enumerable:!0,configurable:!0}),l.LANGUAGE_ANY="any",l.allOptions=(new Map).set(r.RcpTypes.ParameterOptions.VALUE,!0).set(r.RcpTypes.ParameterOptions.LABEL,!0).set(r.RcpTypes.ParameterOptions.DESCRIPTION,!0).set(r.RcpTypes.ParameterOptions.TAGS,!0).set(r.RcpTypes.ParameterOptions.ORDER,!0).set(r.RcpTypes.ParameterOptions.PARENTID,!0).set(r.RcpTypes.ParameterOptions.WIDGET,!0).set(r.RcpTypes.ParameterOptions.USERDATA,!0).set(r.RcpTypes.ParameterOptions.USERID,!0).set(r.RcpTypes.ParameterOptions.READONLY,!0),l}();n.Parameter=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(27),o=e(15),i=e(4),a=function(){function l(l,n){this.x=l,this.y=n}return l.prototype.toString=function(){return this.x+", "+this.y},l.prototype.clone=function(){return new l(this.x,this.y)},l.prototype.add=function(l){return this.x+=l.x,this.y+=l.y,this},l.prototype.sub=function(l){return this.x-=l.x,this.y-=l.y,this},l}();n.Vector2=a;var c=function(){function l(l,n,e){this.x=l,this.y=n,this.z=e}return l.prototype.toString=function(){return this.x+", "+this.y+", "+this.z},l.prototype.clone=function(){return new l(this.x,this.y,this.z)},l.prototype.add=function(l){return this.x+=l.x,this.y+=l.y,this.z+=l.z,this},l.prototype.sub=function(l){return this.x-=l.x,this.y-=l.y,this.z-=l.z,this},l}();n.Vector3=c;var s=function(){function l(l,n,e,t){this.x=l,this.y=n,this.z=e,this.t=t}return l.prototype.toString=function(){return this.x+", "+this.y+", "+this.z+", "+this.t},l.prototype.clone=function(){return new l(this.x,this.y,this.z,this.t)},l.prototype.add=function(l){return this.x+=l.x,this.y+=l.y,this.z+=l.z,this.t+=l.t,this},l.prototype.sub=function(l){return this.x-=l.x,this.y-=l.y,this.z-=l.z,this.t-=l.t,this},l}();n.Vector4=s;var p=function(l){function n(){return null!==l&&l.apply(this,arguments)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),void 0!==l._minimum&&(this._minimum=l._minimum,e=!0),void 0!==l._maximum&&(this._maximum=l._maximum,e=!0),void 0!==l._multipleof&&(this._multipleof=l._multipleof,e=!0),void 0!==l._scale&&(this._scale=l._scale,e=!0),void 0!==l._unit&&(this._unit=l._unit,e=!0)),e},n.prototype.handleOption=function(l,n){switch(l){case i.RcpTypes.NumberOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MINIMUM:return this._minimum=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MAXIMUM:return this._maximum=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MULTIPLEOF:return this._multipleof=this.readValue(n),!0;case i.RcpTypes.NumberOptions.SCALE:var e=n.readU1();return ei.RcpTypes.NumberScale.EXP2?this._scale=i.RcpTypes.NumberScale.LINEAR:this._scale=e,!0;case i.RcpTypes.NumberOptions.UNIT:var t=n.readU1();return this._unit=r.default.bytesToStr(n.readBytes(t),"UTF-8"),!0}return!1},n.prototype.getDefaultId=function(){return i.RcpTypes.VectorOptions.DEFAULT},n.prototype.writeOptions=function(l,e){var t=this,u=this.changed;e&&(u=n.allOptions),u.forEach(function(n,e){switch(e){case i.RcpTypes.NumberOptions.DEFAULT:l.push(i.RcpTypes.NumberOptions.DEFAULT),t.writeValue(l,t._defaultValue);break;case i.RcpTypes.NumberOptions.MINIMUM:l.push(i.RcpTypes.NumberOptions.MINIMUM),t.writeValue(l,t._minimum);break;case i.RcpTypes.NumberOptions.MAXIMUM:l.push(i.RcpTypes.NumberOptions.MAXIMUM),t.writeValue(l,t._maximum);break;case i.RcpTypes.NumberOptions.MULTIPLEOF:l.push(i.RcpTypes.NumberOptions.MULTIPLEOF),t.writeValue(l,t._multipleof);break;case i.RcpTypes.NumberOptions.SCALE:l.push(i.RcpTypes.NumberOptions.SCALE),t._scale?l.push(t._scale):l.push(i.RcpTypes.NumberScale.LINEAR);break;case i.RcpTypes.NumberOptions.UNIT:l.push(i.RcpTypes.NumberOptions.UNIT),t._unit?o.writeTinyString(t._unit,l):o.writeTinyString("",l)}}),e||this.changed.clear()},Object.defineProperty(n.prototype,"minimum",{get:function(){return this._minimum},set:function(l){this._minimum!==l&&(this._minimum=l,this.changed.set(i.RcpTypes.VectorOptions.MINIMUM,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"maximum",{get:function(){return this._maximum},set:function(l){this._maximum!==l&&(this._maximum=l,this.changed.set(i.RcpTypes.VectorOptions.MAXIMUM,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"multipleof",{get:function(){return this._multipleof},set:function(l){this._multipleof!==l&&(this._multipleof=l,this.changed.set(i.RcpTypes.VectorOptions.MULTIPLEOF,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"scale",{get:function(){return this._scale},set:function(l){this._scale!==l&&(this._scale=l,this.changed.set(i.RcpTypes.VectorOptions.SCALE,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"unit",{get:function(){return this._unit},set:function(l){this._unit!==l&&(this._unit=l,this.changed.set(i.RcpTypes.VectorOptions.UNIT,!0),this.setDirty())},enumerable:!0,configurable:!0}),n.allOptions=(new Map).set(i.RcpTypes.VectorOptions.DEFAULT,!0).set(i.RcpTypes.VectorOptions.MINIMUM,!0).set(i.RcpTypes.VectorOptions.MAXIMUM,!0).set(i.RcpTypes.VectorOptions.MULTIPLEOF,!0).set(i.RcpTypes.VectorOptions.SCALE,!0).set(i.RcpTypes.VectorOptions.UNIT,!0),n}(u.DefaultDefinition);n.default=p},function(l,n){function e(){return l.exports=e=Object.assign||function(l){for(var n=1;n=this.size},n.prototype.seek=function(l){var n=Math.max(0,Math.min(this.size,l));this.pos=isNaN(n)||!isFinite(n)?0:n},Object.defineProperty(n.prototype,"size",{get:function(){return this._byteLength-this._byteOffset},enumerable:!0,configurable:!0}),n.prototype.readS1=function(){var l=this._dataView.getInt8(this.pos);return this.pos+=1,l},n.prototype.readS2be=function(){var l=this._dataView.getInt16(this.pos);return this.pos+=2,l},n.prototype.readS4be=function(){var l=this._dataView.getInt32(this.pos);return this.pos+=4,l},n.prototype.readS8be=function(){var l=this.readU4be(),n=this.readU4be();return 0!=(2147483648&l)?-(4294967296*(4294967295^l)+(4294967295^n))-1:4294967296*l+n},n.prototype.readS2le=function(){var l=this._dataView.getInt16(this.pos,!0);return this.pos+=2,l},n.prototype.readS4le=function(){var l=this._dataView.getInt32(this.pos,!0);return this.pos+=4,l},n.prototype.readS8le=function(){var l=this.readU4le(),n=this.readU4le();return 0!=(2147483648&n)?-(4294967296*(4294967295^n)+(4294967295^l))-1:4294967296*n+l},n.prototype.readU1=function(){var l=this._dataView.getUint8(this.pos);return this.pos+=1,l},n.prototype.readU2be=function(){var l=this._dataView.getUint16(this.pos);return this.pos+=2,l},n.prototype.readU4be=function(){var l=this._dataView.getUint32(this.pos);return this.pos+=4,l},n.prototype.readU8be=function(){return 4294967296*this.readU4be()+this.readU4be()},n.prototype.readU2le=function(){var l=this._dataView.getUint16(this.pos,!0);return this.pos+=2,l},n.prototype.readU4le=function(){var l=this._dataView.getUint32(this.pos,!0);return this.pos+=4,l},n.prototype.readU8le=function(){var l=this.readU4le();return 4294967296*this.readU4le()+l},n.prototype.readF4be=function(){var l=this._dataView.getFloat32(this.pos);return this.pos+=4,l},n.prototype.readF8be=function(){var l=this._dataView.getFloat64(this.pos);return this.pos+=8,l},n.prototype.readF4le=function(){var l=this._dataView.getFloat32(this.pos,!0);return this.pos+=4,l},n.prototype.readF8le=function(){var l=this._dataView.getFloat64(this.pos,!0);return this.pos+=8,l},n.prototype.alignToByte=function(){this.bits=0,this.bitsLeft=0},n.prototype.readBitsInt=function(l){if(l>32)throw new Error("readBitsInt: the maximum supported bit length is 32 (tried to read "+l+" bits)");var n=l-this.bitsLeft;if(n>0)for(var e=Math.ceil(n/8),t=this.readBytes(e),u=0;u>>o;return this.bitsLeft-=l,r=(1<=t&&(u=0);return e},n.processRotateLeft=function(l,n,e){if(1!=e)throw"unable to rotate group of "+e+" bytes yet";for(var t=-n&8*e-1,u=new Uint8Array(l.length),r=0;r>t;return u},n.prototype.mapUint8Array=function(l){if(l|=0,this.pos+l>this.size)throw new r(l,this.size-this.pos);var n=new Uint8Array(this._buffer,this.byteOffset+this.pos,l);return this.pos+=l,n},n.createStringFromArray=function(l){for(var n=[],e=0;e0,n}();n.default=i}).call(this,e(179).Buffer)},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(27),o=e(15),i=e(4),a=function(l){function n(){return null!==l&&l.apply(this,arguments)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),void 0!==l._minimum&&(this._minimum=l._minimum,e=!0),void 0!==l._maximum&&(this._maximum=l._maximum,e=!0),void 0!==l._multipleof&&(this._multipleof=l._multipleof,e=!0),void 0!==l._scale&&(this._scale=l._scale,e=!0),void 0!==l._unit&&(this._unit=l._unit,e=!0)),e},n.prototype.handleOption=function(l,n){switch(l){case i.RcpTypes.NumberOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MINIMUM:return this._minimum=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MAXIMUM:return this._maximum=this.readValue(n),!0;case i.RcpTypes.NumberOptions.MULTIPLEOF:return this._multipleof=this.readValue(n),!0;case i.RcpTypes.NumberOptions.SCALE:var e=n.readU1();return ei.RcpTypes.NumberScale.EXP2?this._scale=i.RcpTypes.NumberScale.LINEAR:this._scale=e,!0;case i.RcpTypes.NumberOptions.UNIT:var t=n.readU1();return this._unit=r.default.bytesToStr(n.readBytes(t),"UTF-8"),!0}return!1},n.prototype.getDefaultId=function(){return i.RcpTypes.NumberOptions.DEFAULT},n.prototype.getTypeDefault=function(){return 0},n.prototype.writeOptions=function(l,e){var t=this,u=this.changed;e&&(u=n.allOptions),u.forEach(function(n,e){switch(e){case i.RcpTypes.NumberOptions.DEFAULT:l.push(i.RcpTypes.NumberOptions.DEFAULT),t.writeValue(l,t._defaultValue);break;case i.RcpTypes.NumberOptions.MINIMUM:l.push(i.RcpTypes.NumberOptions.MINIMUM),t.writeValue(l,t._minimum);break;case i.RcpTypes.NumberOptions.MAXIMUM:l.push(i.RcpTypes.NumberOptions.MAXIMUM),t.writeValue(l,t._maximum);break;case i.RcpTypes.NumberOptions.MULTIPLEOF:l.push(i.RcpTypes.NumberOptions.MULTIPLEOF),t.writeValue(l,t._multipleof);break;case i.RcpTypes.NumberOptions.SCALE:l.push(i.RcpTypes.NumberOptions.SCALE),t._scale?l.push(t._scale):l.push(i.RcpTypes.NumberScale.LINEAR);break;case i.RcpTypes.NumberOptions.UNIT:l.push(i.RcpTypes.NumberOptions.UNIT),t._unit?o.writeTinyString(t._unit,l):o.writeTinyString("",l)}}),e||this.changed.clear()},n.prototype.constrainValue=function(l){return void 0!==this.maximum&&l>this.maximum?this.maximum:void 0!==this.minimum&&l0)&&!(t=r.next()).done;)o.push(t.value)}catch(i){u={error:i}}finally{try{t&&!t.done&&(e=r.return)&&e.call(r)}finally{if(u)throw u.error}}return o};Object.defineProperty(n,"__esModule",{value:!0}),n.Validator=void 0;var u=e(18),r=e(18),o=e(20),i=e(33),a=e(38),c=e(30),s=e(30),p=function(){function l(){}return l.isWithinRange=function(l,n,e){return l.greaterOrEquals(n)&&l.lesserOrEquals(e)},l.isValidAsnNumber=function(n){var e=this.isWithinRange(n,o.zero,this.THIRTY_TWO_BIT_SIZE);return[e,e?[]:[l.invalidAsnRangeMessage]]},l.isValid16BitAsnNumber=function(n){var e=l.isWithinRange(n,o.zero,l.SIXTEEN_BIT_SIZE);return[e,e?[]:[l.invalid16BitAsnRangeMessage]]},l.isValidIPv4Number=function(n){var e=this.isWithinRange(n,o.zero,this.THIRTY_TWO_BIT_SIZE);return e?[e,[]]:[e,[l.invalidIPv4NumberMessage]]},l.isValidIPv6Number=function(n){var e=this.isWithinRange(n,o.zero,this.ONE_HUNDRED_AND_TWENTY_EIGHT_BIT_SIZE);return e?[e,[]]:[e,[l.invalidIPv6NumberMessage]]},l.isValidIPv4Octet=function(n){var e=this.isWithinRange(n,o.zero,this.EIGHT_BIT_SIZE);return[e,e?[]:[l.invalidOctetRangeMessage]]},l.isValidIPv6Hexadecatet=function(n){var e=this.isWithinRange(n,o.zero,this.SIXTEEN_BIT_SIZE);return e?[e,[]]:[e,[l.invalidHexadecatetMessage]]},l.isValidIPv4String=function(n){var e=n.split(".");if(4!=e.length||e.includes(""))return[!1,[l.invalidOctetCountMessage]];var t=e.every(function(n){return!!l.isNumeric(n)&&l.isValidIPv4Octet(o(n))[0]});return[t,t?[]:[l.invalidOctetRangeMessage]]},l.isValidIPv6String=function(n){try{var e=a.expandIPv6Number(n).split(":");if(8!=e.length)return[!1,[l.invalidHexadecatetCountMessage]];var t=e.every(function(n){return!!l.isHexadecatet(n)&&l.isValidIPv6Hexadecatet(o(parseInt(n,16)))[0]});return[t,t?[]:[l.invalidHexadecatetMessage]]}catch(u){return[!1,[u]]}},l.isValidPrefixValue=function(n,e){var t;return i.IPNumType.IPv4===e?[t=l.isWithinRange(o(n),o.zero,o(32)),t?[]:[l.invalidPrefixValueMessage]]:i.IPNumType.IPv6===e?[t=l.isWithinRange(o(n),o.zero,o(128)),t?[]:[l.invalidPrefixValueMessage]]:[!1,[l.invalidInetNumType]]},l.isValidIPv4Mask=function(n){var e=u.dottedDecimalNotationToBinaryString(n),t=l.IPV4_CONTIGUOUS_MASK_BIT_PATTERN.test(e);return t?[t,[]]:[t,[l.invalidMaskMessage]]},l.isValidIPv6Mask=function(n){var e=s.hexadectetNotationToBinaryString(n),t=l.IPV6_CONTIGUOUS_MASK_BIT_PATTERN.test(e);return t?[t,[]]:[t,[l.invalidMaskMessage]]},l.isValidIPv4CidrNotation=function(n){var e=n.split("/");if(2!==e.length||0===e[0].length||0===e[1].length)return[!1,[l.invalidIPv4CidrNotationMessage]];var u=e[0],r=e[1];if(isNaN(Number(r)))return[!1,[l.invalidIPv4CidrNotationMessage]];var o=t(l.isValidIPv4String(u),2),a=o[0],c=o[1],s=t(l.isValidPrefixValue(Number(r),i.IPNumType.IPv4),2),p=s[0],h=s[1],f=a&&p,d=c.concat(h);return f?[f,[]]:[f,d]},l.isValidIPv4CidrRange=function(n){return l.isValidCidrRange(n,l.isValidIPv4CidrNotation,u.dottedDecimalNotationToBinaryString,function(l){return r.cidrPrefixToMaskBinaryString(l,i.IPNumType.IPv4)})},l.isValidIPv6CidrRange=function(n){return l.isValidCidrRange(n,l.isValidIPv6CidrNotation,c.colonHexadecimalNotationToBinaryString,function(l){return r.cidrPrefixToMaskBinaryString(l,i.IPNumType.IPv6)})},l.isValidCidrRange=function(n,e,t,u){var r=e(n);if(!r[0])return r;var i=n.split("/"),a=i[0],c=i[1],s=o(t(a),2),p=o(u(parseInt(c)),2),h=s.and(p).equals(s);return h?[h,[]]:[h,[l.InvalidIPCidrRangeMessage]]},l.isValidIPv4RangeString=function(n){return this.isValidRange(n,l.isValidIPv4String,function(l,n){return o(u.dottedDecimalNotationToBinaryString(l)).greaterOrEquals(u.dottedDecimalNotationToBinaryString(n))})},l.isValidIPv6RangeString=function(n){return this.isValidRange(n,l.isValidIPv6String,function(l,n){return o(s.hexadectetNotationToBinaryString(l)).greaterOrEquals(s.hexadectetNotationToBinaryString(n))})},l.isValidRange=function(n,e,u){var r=n.split("-").map(function(l){return l.trim()});if(2!==r.length||0===r[0].length||0===r[1].length)return[!1,[l.invalidRangeNotationMessage]];var o=r[0],i=r[1],a=t(e(o),2),c=a[0],s=a[1],p=t(e(i),2),h=p[0],f=p[1],d=c&&h;if(d&&u(o,i))return[!1,[l.invalidRangeFirstNotGreaterThanLastMessage]];var v=s.concat(f);return d?[d,[]]:[d,v]},l.isValidIPv6CidrNotation=function(n){var e=l.IPV6_RANGE_PATTERN.test(n);return e?[e,[]]:[e,[l.invalidIPv6CidrNotationString]]},l.isValidBinaryString=function(n){return/^([10])+$/.test(n)?[!0,[]]:[!1,[l.invalidBinaryStringErrorMessage]]},l.isNumeric=function(l){return/^(\d+)$/.test(l)},l.isHexadecatet=function(l){return/^[0-9A-Fa-f]{4}$/.test(l)},l.IPV4_PATTERN=new RegExp(/^(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/),l.IPV4_RANGE_PATTERN=new RegExp(/^(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(0?[0-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\/)([1-9]|[1-2][0-9]|3[0-2])$/),l.IPV6_RANGE_PATTERN=new RegExp(/^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/),l.IPV4_CONTIGUOUS_MASK_BIT_PATTERN=new RegExp(/^(1){0,32}(0){0,32}$/),l.IPV6_CONTIGUOUS_MASK_BIT_PATTERN=new RegExp(/^(1){0,128}(0){0,128}$/),l.EIGHT_BIT_SIZE=o("1".repeat(8),2),l.SIXTEEN_BIT_SIZE=o("1".repeat(16),2),l.THIRTY_TWO_BIT_SIZE=o("1".repeat(32),2),l.ONE_HUNDRED_AND_TWENTY_EIGHT_BIT_SIZE=o("1".repeat(128),2),l.IPV4_SIZE=o("4294967296"),l.IPV6_SIZE=o("340282366920938463463374607431768211456"),l.invalidAsnRangeMessage="ASN number given less than zero or is greater than 32bit",l.invalid16BitAsnRangeMessage="ASN number given less than zero or is greater than 16bit",l.invalidIPv4NumberMessage="IPv4 number given less than zero or is greater than 32bit",l.invalidIPv6NumberMessage="IPv6 number given less than zero or is greater than 128bit",l.invalidOctetRangeMessage="Value given contains an invalid Octet; Value is less than zero or is greater than 8bit",l.invalidHexadecatetMessage="The value given is less than zero or is greater than 16bit",l.invalidOctetCountMessage="An IP4 number cannot have less or greater than 4 octets",l.invalidHexadecatetCountMessage="An IP6 number must have exactly 8 hexadecatet",l.invalidMaskMessage="The Mask is invalid",l.invalidPrefixValueMessage="A Prefix value cannot be less than 0 or greater than 32",l.invalidIPv4CidrNotationMessage="Cidr notation should be in the form [ip number]/[range]",l.InvalidIPCidrRangeMessage="Given IP number portion must is not the start of the range",l.invalidRangeNotationMessage="Range notation should be in the form [first ip]-[last ip]",l.invalidRangeFirstNotGreaterThanLastMessage="First IP in [first ip]-[last ip] must be less than Last IP",l.invalidIPv6CidrNotationString="A Cidr notation string should contain an IPv6 number and prefix",l.takeOutOfRangeSizeMessage="$count is greater than $size, the size of the range",l.cannotSplitSingleRangeErrorMessage="Cannot split an IP range with a single IP number",l.invalidInetNumType="Given ipNumType must be either InetNumType.IPv4 or InetNumType.IPv6",l.invalidBinaryStringErrorMessage="Binary string should contain only contiguous 1s and 0s",l.invalidIPRangeSizeMessage="Given size is zero or greater than maximum size of $iptype",l.invalidIPRangeSizeForCidrMessage="Given size can't be created via cidr prefix",l}();n.Validator=p},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.hexadectetNotationToBinaryString=n.binaryStringToHexadecimalString=n.colonHexadecimalNotationToBinaryString=n.hexadecimalStringToHexadecatetString=n.hexadecimalStringToBinaryString=n.bigIntegerNumberToHexadecimalString=void 0;var t=e(20),u=e(38),r=e(18);n.bigIntegerNumberToHexadecimalString=function(l){return l.toString(16)},n.hexadecimalStringToBinaryString=function(l){return t(l,16).toString(2)},n.hexadecimalStringToHexadecatetString=function(l){var e=n.hexadecimalStringToBinaryString(l);if(e.length>16)throw new Error("Given decimal in binary contains digits greater than an Hexadecatet");return r.leftPadWithZeroBit(e,16)},n.colonHexadecimalNotationToBinaryString=function(l){return u.expandIPv6Number(l).split(":").reduce(function(l,e){return l.concat(n.hexadecimalStringToHexadecatetString(e))},"")},n.binaryStringToHexadecimalString=function(l){return t(l,2).toString(16)},n.hexadectetNotationToBinaryString=function(l){return u.expandIPv6Number(l).split(":").reduce(function(l,e){return l.concat(r.leftPadWithZeroBit(n.hexadecimalStringToBinaryString(e),16))},"")}},function(l,n){l.exports=function(l,n){l.prototype=Object.create(n.prototype),l.prototype.constructor=l,l.__proto__=n}},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(4),u=function(){function l(l){this.datatype=l}return l.prototype.readMandatory=function(l){},l.prototype.parseOptions=function(l){for(;;){var n=l.readU1();if(n===t.RcpTypes.TERMINATOR)break;if(!this.handleOption(n,l))throw new Error("TypeDefinition option not handled: "+n)}},l.prototype.writeMandatory=function(l){},l.prototype.write=function(l,n){l.push(this.datatype),this.writeMandatory(l),this.writeOptions(l,n),l.push(t.RcpTypes.TERMINATOR)},l.errorMessage={invalidDefaultValue:"Invalid defaultValue provided."},l}();n.TypeDefinition=u},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.IPNumType=void 0,function(l){l[l.ASN=0]="ASN",l[l.IPv4=1]="IPv4",l[l.IPv6=2]="IPv6"}(n.IPNumType||(n.IPNumType={}))},function(l,n,e){"use strict";var t=e(213),u="function"===typeof Symbol&&"symbol"===typeof Symbol("foo"),r=Object.prototype.toString,o=Array.prototype.concat,i=Object.defineProperty,a=i&&function(){var l={};try{for(var n in i(l,"x",{enumerable:!1,value:l}),l)return!1;return l.x===l}catch(e){return!1}}(),c=function(l,n,e,t){var u;n in l&&("function"!==typeof(u=t)||"[object Function]"!==r.call(u)||!t())||(a?i(l,n,{configurable:!0,enumerable:!1,value:e,writable:!0}):l[n]=e)},s=function(l,n){var e=arguments.length>2?arguments[2]:{},r=t(n);u&&(r=o.call(r,Object.getOwnPropertySymbols(n)));for(var i=0;i0)&&!(t=r.next()).done;)o.push(t.value)}catch(i){u={error:i}}finally{try{t&&!t.done&&(e=r.return)&&e.call(r)}finally{if(u)throw u.error}}return o};Object.defineProperty(n,"__esModule",{value:!0}),n.isIPv4=n.IPv6Mask=n.IPv4Mask=n.IPv6=n.Asn=n.IPv4=n.AbstractIPNum=void 0;var r=e(64),o=e(29),i=e(20),a=e(18),c=e(18),s=e(18),p=e(18),h=e(33),f=e(18),d=e(48),v=e(30),m=e(38),y=e(30),g=function(){function l(){}return l.prototype.getValue=function(){return this.value},l.prototype.toBinaryString=function(){return p.leftPadWithZeroBit(this.value.toString(2),this.bitSize)},l.prototype.hasNext=function(){return this.value.lesser(this.maximumBitSize)},l.prototype.hasPrevious=function(){return this.value.greater(i.zero)},l.prototype.isEquals=function(l){return this.value.equals(l.value)},l.prototype.isLessThan=function(l){return this.value.lt(l.value)},l.prototype.isGreaterThan=function(l){return this.value.gt(l.value)},l.prototype.isLessThanOrEquals=function(l){return this.value.lesserOrEquals(l.value)},l.prototype.isGreaterThanOrEquals=function(l){return this.value.greaterOrEquals(l.value)},l}();n.AbstractIPNum=g;var z=function(l){function n(n){var e=l.call(this)||this;if(e.bitSize=32,e.maximumBitSize=o.Validator.THIRTY_TWO_BIT_SIZE,e.type=h.IPNumType.IPv4,e.octets=[],e.separator=".","string"===typeof n){var t=u(e.constructFromDecimalDottedString(n),2),r=t[0],i=t[1];e.value=r,e.octets=i}else{var a=u(e.constructFromBigIntegerValue(n),2);r=a[0],i=a[1];e.value=r,e.octets=i}return e}return t(n,l),n.fromBigInteger=function(l){return new n(l)},n.fromDecimalDottedString=function(l){return new n(l)},n.fromString=function(l){return n.fromDecimalDottedString(l)},n.fromBinaryString=function(l){var e=o.Validator.isValidBinaryString(l);if(e[0])return new n(s.parseBinaryStringToBigInteger(l));throw Error(e[1].join(","))},n.prototype.toString=function(){return this.octets.map(function(l){return l.toString()}).join(this.separator)},n.prototype.getOctets=function(){return this.octets},n.prototype.nextIPNumber=function(){return n.fromBigInteger(this.getValue().add(1))},n.prototype.previousIPNumber=function(){return n.fromBigInteger(this.getValue().minus(1))},n.prototype.toIPv4MappedIPv6=function(){var l="1".repeat(16)+this.toBinaryString();return E.fromBinaryString(l)},n.prototype.constructFromDecimalDottedString=function(l){var n,e=u(o.Validator.isValidIPv4String(l),2),t=e[0],c=e[1];if(!t)throw new Error(c.filter(function(l){return""!==l}).toString());return n=l.split(".").map(function(l){return r.Octet.fromString(l)}),[i(a.dottedDecimalNotationToBinaryString(l),2),n]},n.prototype.constructFromBigIntegerValue=function(l){var n=u(o.Validator.isValidIPv4Number(l),2),e=n[0],t=n[1];if(!e)throw new Error(t.filter(function(l){return""!==l}).toString());var r=c.bigIntegerNumberToBinaryString(l);return[l,this.binaryStringToDecimalOctets(r)]},n.prototype.binaryStringToDecimalOctets=function(l){return l.length<32&&(l=p.leftPadWithZeroBit(l,32)),l.match(/.{1,8}/g).map(function(l){return r.Octet.fromString(s.parseBinaryStringToBigInteger(l).toString())})},n}(g);n.IPv4=z;var b=function(l){function n(e){var t=l.call(this)||this;if(t.bitSize=32,t.maximumBitSize=o.Validator.THIRTY_TWO_BIT_SIZE,t.type=h.IPNumType.ASN,"string"===typeof e)n.startWithASprefix(e)?t.value=i(parseInt(e.substring(2))):-1!=e.indexOf(".")?t.value=i(t.parseFromDotNotation(e)):t.value=i(parseInt(e));else{var r=i(e),a=u(o.Validator.isValidAsnNumber(r),2),c=a[0],s=a[1];if(!c)throw Error(s.filter(function(l){return""!==l}).toString());t.value=r}return t}return t(n,l),n.fromString=function(l){return new n(l)},n.fromNumber=function(l){return new n(l)},n.fromBinaryString=function(l){var e=o.Validator.isValidBinaryString(l);if(e[0])return new n(parseInt(l,2));throw Error(e[1].join(","))},n.prototype.toString=function(){var l=this.value.toString();return""+n.AS_PREFIX+l},n.prototype.toASPlain=function(){return this.value.toString()},n.prototype.toASDot=function(){return this.value.valueOf()>=65536?this.toASDotPlus():this.toASPlain()},n.prototype.toASDotPlus=function(){var l=Math.floor(this.value.valueOf()/65535);return l+"."+(this.value.valueOf()%65535-l)},n.prototype.toBinaryString=function(){return f.decimalNumberToBinaryString(this.value.valueOf())},n.prototype.is16Bit=function(){return u(o.Validator.isValid16BitAsnNumber(this.value),1)[0]},n.prototype.is32Bit=function(){return!this.is16Bit()},n.prototype.nextIPNumber=function(){return new n(this.value.valueOf()+1)},n.prototype.previousIPNumber=function(){return new n(this.value.valueOf()-1)},n.startWithASprefix=function(l){return 0===l.indexOf(n.AS_PREFIX)},n.prototype.parseFromDotNotation=function(l){var n=l.split("."),e=parseInt(n[0]);return 65535*e+(parseInt(n[1])+e)},n.AS_PREFIX="AS",n}(g);n.Asn=b;var E=function(l){function n(n){var e=l.call(this)||this;if(e.bitSize=128,e.maximumBitSize=o.Validator.ONE_HUNDRED_AND_TWENTY_EIGHT_BIT_SIZE,e.type=h.IPNumType.IPv6,e.hexadecatet=[],e.separator=":","string"===typeof n){var t=m.expandIPv6Number(n),r=u(e.constructFromHexadecimalDottedString(t),2),i=r[0],a=r[1];e.value=i,e.hexadecatet=a}else{var c=u(e.constructFromBigIntegerValue(n),2);i=c[0],a=c[1];e.value=i,e.hexadecatet=a}return e}return t(n,l),n.fromBigInteger=function(l){return new n(l)},n.fromHexadecimalString=function(l){return new n(l)},n.fromString=function(l){return n.fromHexadecimalString(l)},n.fromBinaryString=function(l){var e=o.Validator.isValidBinaryString(l);if(e[0]){var t=p.leftPadWithZeroBit(l,128);return new n(s.parseBinaryStringToBigInteger(t))}throw Error(e[1].join(","))},n.fromIPv4=function(l){return l.toIPv4MappedIPv6()},n.fromIPv4DotDecimalString=function(l){return new z(l).toIPv4MappedIPv6()},n.prototype.toString=function(){var l=this.hexadecatet.map(function(l){return l.toString()}).join(":");return this.hexadecatet.length<8?"::"+l:l},n.prototype.getHexadecatet=function(){return this.hexadecatet},n.prototype.nextIPNumber=function(){return n.fromBigInteger(this.getValue().add(1))},n.prototype.previousIPNumber=function(){return n.fromBigInteger(this.getValue().minus(1))},n.prototype.constructFromBigIntegerValue=function(l){var n=u(o.Validator.isValidIPv6Number(l),2),e=n[0],t=n[1];if(!e)throw new Error(t.filter(function(l){return""!==l}).toString());var r=c.bigIntegerNumberToBinaryString(l);return[l,this.binaryStringToHexadecatets(r)]},n.prototype.constructFromHexadecimalDottedString=function(l){var n=u(o.Validator.isValidIPv6String(l),2),e=n[0],t=n[1];if(!e)throw new Error(t.filter(function(l){return""!==l}).toString());var r=l.split(":").map(function(l){return d.Hexadecatet.fromString(l)});return[i(y.hexadectetNotationToBinaryString(l),2),r]},n.prototype.binaryStringToHexadecatets=function(l){for(var n=v.binaryStringToHexadecimalString(l);n.length%4!=0;)n="0"+n;return n.match(/.{1,4}/g).map(function(l){return d.Hexadecatet.fromString(l)})},n}(g);n.IPv6=E;var T=function(l){function n(n){var e,t,c,s=l.call(this,n)||this;if(s.octets=[],t=(e=u(o.Validator.isValidIPv4Mask(n),2))[0],c=e[1],!t)throw new Error(c.filter(function(l){return""!==l}).toString());var p=n.split(".");s.octets=p.map(function(l){return r.Octet.fromString(l)});var h=a.dottedDecimalNotationToBinaryString(n);return s.prefix=(h.match(/1/g)||[]).length,s.value=i(h,2),s}return t(n,l),n.fromDecimalDottedString=function(l){return new n(l)},n}(z);n.IPv4Mask=T;var M=function(l){function n(n){var e,t,r,a=l.call(this,n)||this;if(a.hexadecatet=[],t=(e=u(o.Validator.isValidIPv6Mask(n),2))[0],r=e[1],!t)throw new Error(r.filter(function(l){return""!==l}).toString());var c=n.split(":");a.hexadecatet=c.map(function(l){return d.Hexadecatet.fromString(l)});var s=y.hexadectetNotationToBinaryString(n);return a.prefix=(s.match(/1/g)||[]).length,a.value=i(s,2),a.value=i(y.hexadectetNotationToBinaryString(n),2),a}return t(n,l),n.fromHexadecimalString=function(l){return new n(l)},n}(E);n.IPv6Mask=M,n.isIPv4=function(l){return 32===l.bitSize}},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.collapseIPv6Number=n.expandIPv6Number=void 0;var t=e(18);n.expandIPv6Number=function(l){var n=function(l){return l.map(function(l){return t.leftPadWithZeroBit(l,4)}).join(":")};if(/(:){3,}/.test(l))throw"given IPv6 contains consecutive : more than two";if(l.includes("::")){var e=l.split("::"),u=e[0],r=e[1],o=u.split(":").filter(function(l){return""!==l}),i=r.split(":").filter(function(l){return""!==l}),a=function(l){for(var n=[],e=0;e0},n.prototype.writeValue=function(l,n){void 0!=n?l.push(n?1:0):this._defaultValue?l.push(this._defaultValue?1:0):l.push(0)},n.prototype.getDefaultId=function(){return r.RcpTypes.BooleanOptions.DEFAULT},n.prototype.getTypeDefault=function(){return!1},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.BooleanOptions.DEFAULT))&&(l.push(r.RcpTypes.BooleanOptions.DEFAULT),this.writeValue(l,this._defaultValue)),n||this.changed.clear()},n.allOptions=(new Map).set(r.RcpTypes.BooleanOptions.DEFAULT,!0),n}(u.DefaultDefinition);n.BooleanDefinition=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(15),i=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.ENUM)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),void 0!==l._entries&&(this._entries=l._entries,e=!0),void 0!==l._multiselect&&(this._multiselect=l._multiselect,e=!0)),e},n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.EnumOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0;case r.RcpTypes.EnumOptions.ENTRIES:for(this._entries=[];;){var e=new r.TinyString(n).data;if(0==e.length||""===e)break;this._entries.push(e)}return!0;case r.RcpTypes.EnumOptions.MULTISELECT:return this._multiselect=n.readU1()>0,!0}return!1},n.prototype.readValue=function(l){return new r.TinyString(l).data},n.prototype.writeValue=function(l,n){void 0!=n?o.writeTinyString(n,l):this._defaultValue?o.writeTinyString(this._defaultValue,l):o.writeTinyString("",l)},n.prototype.getDefaultId=function(){return r.RcpTypes.EnumOptions.DEFAULT},n.prototype.getTypeDefault=function(){return this._entries?this._entries[0]:""},n.prototype.writeOptions=function(l,e){var t=this,u=this.changed;e&&(u=n.allOptions),u.forEach(function(n,e){switch(e){case r.RcpTypes.EnumOptions.DEFAULT:l.push(r.RcpTypes.EnumOptions.DEFAULT),t.writeValue(l,t._defaultValue);break;case r.RcpTypes.EnumOptions.ENTRIES:if(l.push(r.RcpTypes.EnumOptions.ENTRIES),t._entries)for(var u=0;u-1)},Object.defineProperty(n.prototype,"entries",{get:function(){return this._entries},set:function(l){this._entries=l,this.changed.set(r.RcpTypes.EnumOptions.ENTRIES,!0),this.setDirty()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"multiselect",{get:function(){return this._multiselect},set:function(l){this._multiselect!==l&&(this._multiselect=l,this.changed.set(r.RcpTypes.EnumOptions.MULTISELECT,!0),this.setDirty())},enumerable:!0,configurable:!0}),n.allOptions=(new Map).set(r.RcpTypes.EnumOptions.DEFAULT,!0).set(r.RcpTypes.EnumOptions.ENTRIES,!0).set(r.RcpTypes.EnumOptions.MULTISELECT,!0),n}(u.DefaultDefinition);n.EnumDefinition=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(32),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.GROUP)||this}return t(n,l),n.prototype.didChange=function(){return!1},n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n.prototype.update=function(l){return!1},n}(u.TypeDefinition);n.GroupDefinition=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(24),r=e(44),o=function(l){function n(n){return l.call(this,n,new r.BangDefinition)||this}return t(n,l),n.prototype.doBang=function(){this.setDirty()},n}(u.Parameter);n.BangParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(32),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.BANG)||this}return t(n,l),n.prototype.didChange=function(){return!1},n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n.prototype.update=function(l){return!1},n}(u.TypeDefinition);n.BangDefinition=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(15);function i(l){return("0"+l.toString(16)).slice(-2)}function a(l){if(!l.startsWith("#"))throw new Error("not a valid color: "+l);for(;l.length<7;)l+="f";var n=l.slice(1,3),e=l.slice(3,5),t=l.slice(5,7);return parseInt(n,16)+(parseInt(e,16)<<8)+(parseInt(t,16)<<16)}function c(l){if(!l.startsWith("#"))throw new Error("not a valid color: "+l);for(;l.length<9;)l+="f";var n=l.slice(1,3),e=l.slice(3,5),t=l.slice(5,7),u=l.slice(7,9);return parseInt(n,16)+(parseInt(e,16)<<8)+(parseInt(t,16)<<16)+(parseInt(u,16)<<24)}var s=function(l){function n(){return null!==l&&l.apply(this,arguments)||this}return t(n,l),n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.ColorOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0}return!1},n.prototype.getDefaultId=function(){return r.RcpTypes.ColorOptions.DEFAULT},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.ColorOptions.DEFAULT))&&(l.push(r.RcpTypes.ColorOptions.DEFAULT),this.writeValue(l,this._defaultValue)),n||this.changed.clear()},n.allOptions=(new Map).set(r.RcpTypes.ColorOptions.DEFAULT,!0),n}(u.DefaultDefinition),p=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.RGBA)||this}return t(n,l),n.prototype.getTypeDefault=function(){return"#00000000"},n.prototype.update=function(l){var e=!1;return l instanceof n&&void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),e},n.prototype.readValue=function(l){return function(l){var n=l>>8&255,e=l>>16&255,t=l>>24&255;return"#"+i(255&l)+i(n)+i(e)+i(t)}(l.readU4be())},n.prototype.writeValue=function(l,n){void 0!=n?o.pushIn32ToArrayBe(c(n),l):this._defaultValue?o.pushIn32ToArrayBe(c(this._defaultValue),l):o.pushIn32ToArrayBe(0,l)},n}(s);n.RGBADefinition=p;var h=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.RGB)||this}return t(n,l),n.prototype.getTypeDefault=function(){return"#000000"},n.prototype.update=function(l){var e=!1;return l instanceof n&&void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),e},n.prototype.readValue=function(l){return function(l){var n=l>>8&255,e=l>>16&255;return"#"+i(255&l)+i(n)+i(e)}(l.readU4be())},n.prototype.writeValue=function(l,n){void 0!=n?o.pushIn32ToArrayBe(a(n),l):this._defaultValue?o.pushIn32ToArrayBe(a(this._defaultValue),l):o.pushIn32ToArrayBe(0,l)},n}(s);n.RGBDefinition=h},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(15),i=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.URI)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),void 0!==l._filter&&(this._filter=l._filter,e=!0),void 0!==l._schema&&(this._schema=l._schema,e=!0)),e},n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.UriOptions.DEFAULT:return this._defaultValue=new r.LongString(n).data,!0;case r.RcpTypes.UriOptions.FILTER:return this._filter=new r.TinyString(n).data,!0;case r.RcpTypes.UriOptions.SCHEMA:return this._schema=new r.TinyString(n).data,!0}return!1},n.prototype.readValue=function(l){return new r.LongString(l).data},n.prototype.writeValue=function(l,n){void 0!=n?o.writeLongString(n,l):this._defaultValue?o.writeLongString(this._defaultValue,l):o.writeLongString("",l)},n.prototype.getDefaultId=function(){return r.RcpTypes.UriOptions.DEFAULT},n.prototype.getTypeDefault=function(){return""},n.prototype.writeOptions=function(l,e){var t=this,u=this.changed;e&&(u=n.allOptions),u.forEach(function(n,e){switch(e){case r.RcpTypes.UriOptions.DEFAULT:l.push(r.RcpTypes.UriOptions.DEFAULT),t.writeValue(l,t._defaultValue);break;case r.RcpTypes.UriOptions.FILTER:l.push(r.RcpTypes.UriOptions.FILTER),t._filter?o.writeTinyString(t._filter,l):o.writeTinyString("",l);break;case r.RcpTypes.UriOptions.SCHEMA:l.push(r.RcpTypes.UriOptions.SCHEMA),t._schema?o.writeTinyString(t._schema,l):o.writeTinyString("",l)}}),e||this.changed.clear()},Object.defineProperty(n.prototype,"filter",{get:function(){return this._filter},set:function(l){this._filter!==l&&(this._filter=l,this.changed.set(r.RcpTypes.UriOptions.FILTER,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"schema",{get:function(){return this._schema},set:function(l){this._schema!==l&&(this._schema=l,this.changed.set(r.RcpTypes.UriOptions.SCHEMA,!0),this.setDirty())},enumerable:!0,configurable:!0}),n.allOptions=(new Map).set(r.RcpTypes.UriOptions.DEFAULT,!0).set(r.RcpTypes.UriOptions.FILTER,!0).set(r.RcpTypes.UriOptions.SCHEMA,!0),n}(u.DefaultDefinition);n.UriDefinition=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(15),i=e(63),a=e(20),c=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.IPV4)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),e},n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.Ipv4Options.DEFAULT:return this._defaultValue=this.readValue(n),!0}return!1},n.prototype.readValue=function(l){return new i.IPv4(a(l.readU4be()))},n.prototype.writeValue=function(l,n){void 0!=n?o.pushIn32ToArrayBe(n.value.toJSNumber(),l):this._defaultValue?o.pushIn32ToArrayBe(this._defaultValue.value.toJSNumber(),l):o.pushFloat32ToArrayBe(0,l)},n.prototype.getDefaultId=function(){return r.RcpTypes.Ipv4Options.DEFAULT},n.prototype.getTypeDefault=function(){return new i.IPv4(a(0))},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.Ipv4Options.DEFAULT))&&(l.push(r.RcpTypes.Ipv4Options.DEFAULT),this.writeValue(l,this._defaultValue)),n||this.changed.clear()},n.allOptions=(new Map).set(r.RcpTypes.Ipv4Options.DEFAULT,!0),n}(u.DefaultDefinition);n.IPv4Definition=c},function(l,n,e){"use strict";var t=this&&this.__read||function(l,n){var e="function"===typeof Symbol&&l[Symbol.iterator];if(!e)return l;var t,u,r=e.call(l),o=[];try{for(;(void 0===n||n-- >0)&&!(t=r.next()).done;)o.push(t.value)}catch(i){u={error:i}}finally{try{t&&!t.done&&(e=r.return)&&e.call(r)}finally{if(u)throw u.error}}return o};Object.defineProperty(n,"__esModule",{value:!0}),n.Hexadecatet=void 0;var u=e(29),r=e(20),o=function(){function l(l){var n;n="string"===typeof l?parseInt(l,16):parseInt(String(l),16);var e=t(u.Validator.isValidIPv6Hexadecatet(r(n)),2),o=e[0],i=e[1];if(!o)throw Error(i.filter(function(l){return""!==l}).toString());this.value=n}return l.fromString=function(n){return new l(n)},l.fromNumber=function(n){return new l(n)},l.prototype.getValue=function(){return this.value},l.prototype.toString=function(){return this.value.toString(16)},l}();n.Hexadecatet=o},function(l,n,e){"use strict";var t=this&&this.__read||function(l,n){var e="function"===typeof Symbol&&l[Symbol.iterator];if(!e)return l;var t,u,r=e.call(l),o=[];try{for(;(void 0===n||n-- >0)&&!(t=r.next()).done;)o.push(t.value)}catch(i){u={error:i}}finally{try{t&&!t.done&&(e=r.return)&&e.call(r)}finally{if(u)throw u.error}}return o};Object.defineProperty(n,"__esModule",{value:!0}),n.isIPv4Prefix=n.IPv6Prefix=n.IPv4Prefix=void 0;var u=e(29),r=e(37),o=e(18),i=e(33),a=e(30),c=e(48),s=e(20),p=function(){function l(l){var n,e,r;if(this.type="IPv4",this.bitValue=s(32),e=(n=t(u.Validator.isValidPrefixValue(l,i.IPNumType.IPv4),2))[0],r=n[1],!e)throw new Error(r.filter(function(l){return""!==l}).toString());this.value=l}return l.fromNumber=function(n){return new l(n)},l.fromRangeSize=function(n){var e=n.equals(s.one)?32:32-f(n,u.Validator.IPV4_SIZE);return l.fromNumber(e)},l.prototype.getValue=function(){return this.value},l.prototype.toString=function(){return this.value.toString()},l.prototype.toMask=function(){var l="1".repeat(this.value),n="0".repeat(32-this.value);return r.IPv4Mask.fromDecimalDottedString(this.toDecimalNotation(""+l+n))},l.prototype.toRangeSize=function(){return s(2).pow(this.bitValue.minus(s(this.getValue())))},l.prototype.merge=function(){return new l(this.value-1)},l.prototype.split=function(){return new l(this.value+1)},l.prototype.toDecimalNotation=function(l){return o.parseBinaryStringToBigInteger(l.substr(0,8))+"."+o.parseBinaryStringToBigInteger(l.substr(8,8))+"."+o.parseBinaryStringToBigInteger(l.substr(16,8))+"."+o.parseBinaryStringToBigInteger(l.substr(24,8))},l}();n.IPv4Prefix=p;var h=function(){function l(l){var n,e,r;if(this.type="IPv6",this.bitValue=s(128),e=(n=t(u.Validator.isValidPrefixValue(l,i.IPNumType.IPv6),2))[0],r=n[1],!e)throw new Error(r.filter(function(l){return""!==l}).toString());this.value=l}return l.fromNumber=function(n){return new l(n)},l.fromRangeSize=function(n){var e=n.equals(s.one)?128:128-f(n,u.Validator.IPV6_SIZE);return l.fromNumber(e)},l.prototype.getValue=function(){return this.value},l.prototype.toString=function(){return this.value.toString()},l.prototype.toMask=function(){var l="1".repeat(this.value),n="0".repeat(128-this.value);return r.IPv6Mask.fromHexadecimalString(this.toHexadecatetNotation(""+l+n))},l.prototype.toRangeSize=function(){return s(2).pow(this.bitValue.minus(s(this.getValue())))},l.prototype.merge=function(){return new l(this.value-1)},l.prototype.split=function(){return new l(this.value+1)},l.prototype.toHexadecatetNotation=function(l){return l.match(/.{1,16}/g).map(function(l){return c.Hexadecatet.fromString(a.binaryStringToHexadecimalString(l))}).map(function(l){return l.toString()}).join(":")},l}();function f(l,n){var e=n.greater(u.Validator.IPV4_SIZE)?"IPv6":"IPv4";if(l.greater(n)||l.equals(s(0)))throw new Error(u.Validator.invalidIPRangeSizeMessage.replace("$iptype",e));try{return o.intLog2(l)}catch(t){throw new Error(u.Validator.invalidIPRangeSizeForCidrMessage)}}n.IPv6Prefix=h,n.isIPv4Prefix=function(l){return"IPv4"===l.type}},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(28),r=e(4),o=e(15),i=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.INT32)||this}return t(n,l),n.prototype.typeMax=function(){return 2147483647},n.prototype.typeMin=function(){return-2147483648},n.prototype.readValue=function(l){return l.readS4be()},n.prototype.writeValue=function(l,n){void 0!=n?o.pushIn32ToArrayBe(n,l):this._defaultValue?o.pushIn32ToArrayBe(this._defaultValue,l):o.pushIn32ToArrayBe(0,l)},n}(u.NumberDefinition);n.Int32Definition=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(15),o=e(4),i=function(l){function n(){return l.call(this,o.RcpTypes.Datatype.STRING)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),void 0!==l._regex&&(this._regex=l._regex,e=!0)),e},n.prototype.handleOption=function(l,n){switch(l){case o.RcpTypes.StringOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0;case o.RcpTypes.StringOptions.REGULAR_EXPRESSION:return this._regex=this.readValue(n),!0}return!1},n.prototype.readValue=function(l){return new o.LongString(l).data},n.prototype.writeValue=function(l,n){void 0!=n?r.writeLongString(n,l):this._defaultValue?r.writeLongString(this._defaultValue,l):r.writeLongString("",l)},n.prototype.getDefaultId=function(){return o.RcpTypes.StringOptions.DEFAULT},n.prototype.getTypeDefault=function(){return""},n.prototype.writeOptions=function(l,e){var t=this,u=this.changed;e&&(u=n.allOptions),u.forEach(function(n,e){switch(e){case o.RcpTypes.StringOptions.DEFAULT:l.push(o.RcpTypes.StringOptions.DEFAULT),t.writeValue(l,t._defaultValue);break;case o.RcpTypes.StringOptions.REGULAR_EXPRESSION:l.push(o.RcpTypes.StringOptions.REGULAR_EXPRESSION),t._regex?r.writeLongString(t._regex,l):r.writeLongString("",l)}}),e||this.changed.clear()},Object.defineProperty(n.prototype,"regex",{get:function(){return this._regex},set:function(l){this._regex!==l&&(this._regex=l,this.changed.set(o.RcpTypes.StringOptions.REGULAR_EXPRESSION,!0),this.setDirty())},enumerable:!0,configurable:!0}),n.allOptions=(new Map).set(o.RcpTypes.StringOptions.DEFAULT,!0).set(o.RcpTypes.StringOptions.REGULAR_EXPRESSION,!0),n}(u.DefaultDefinition);n.StringDefinition=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(15),r=e(4),o=e(25),i=function(l){function n(){return null!==l&&l.apply(this,arguments)||this}return t(n,l),n.prototype.constrainValue=function(l){return void 0!==this.maximum&&(l.x>this.maximum.x&&(l.x=this.maximum.x),l.y>this.maximum.y&&(l.y=this.maximum.y),l.z>this.maximum.z&&(l.z=this.maximum.z)),void 0!==this.minimum&&(l.xthis.maximum.x&&(l.x=this.maximum.x),l.y>this.maximum.y&&(l.y=this.maximum.y)),void 0!==this.minimum&&(l.xthis.maximum.x&&(l.x=this.maximum.x),l.y>this.maximum.y&&(l.y=this.maximum.y),l.z>this.maximum.z&&(l.z=this.maximum.z),l.t>this.maximum.t&&(l.t=this.maximum.t)),void 0!==this.minimum&&(l.x0},l.prototype.connect_=function(){t&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},l.prototype.disconnect_=function(){t&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},l.prototype.onTransitionEnd_=function(l){var n=l.propertyName,e=void 0===n?"":n;a.some(function(l){return!!~e.indexOf(l)})&&this.refresh()},l.getInstance=function(){return this.instance_||(this.instance_=new l),this.instance_},l.instance_=null,l}(),p=function(l,n){for(var e=0,t=Object.keys(n);e0},l}(),M="undefined"!==typeof WeakMap?new WeakMap:new e,_=function(){return function l(n){if(!(this instanceof l))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var e=s.getInstance(),t=new T(n,e,this);M.set(this,t)}}();["observe","unobserve","disconnect"].forEach(function(l){_.prototype[l]=function(){var n;return(n=M.get(this))[l].apply(n,arguments)}});var O="undefined"!==typeof u.ResizeObserver?u.ResizeObserver:_;n.default=O}.call(this,e(23))},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(41),o=function(l){function n(n){var e=l.call(this,n,new r.EnumDefinition)||this;return e.enumDefinition=e.typeDefinition,e}return t(n,l),n.prototype.setStringValue=function(l){return!!this.enumDefinition.contains(l)&&(this.value=l,!0)},n}(u.ValueParameter);n.EnumParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(24),r=e(42),o=function(l){function n(n){var e=l.call(this,n,new r.GroupDefinition)||this;return e.children=[],e}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.addChild=function(l){void 0!==l&&(this.children.indexOf(l)>=0||this.children.push(l))},n.prototype.removeChild=function(l){if(void 0!==l){var n=this.children.indexOf(l);n>=0&&this.children.splice(n,1)}},n}(u.Parameter);n.GroupParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(45),o=function(l){function n(n){return l.call(this,n,new r.RGBADefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){return!!l.startsWith("#")&&(this.value=l,!0)},n}(u.ValueParameter);n.RGBAParameter=o;var i=function(l){function n(n){return l.call(this,n,new r.RGBDefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){return!!l.startsWith("#")&&(this.value=l,!0)},n}(u.ValueParameter);n.RGBParameter=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(46),o=function(l){function n(n){return l.call(this,n,new r.UriDefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){return this.value=l,!0},n}(u.ValueParameter);n.UriParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(47),o=function(l){function n(n){return l.call(this,n,new r.IPv4Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){return!1},n}(u.ValueParameter);n.IPv4Parameter=o},function(l,n,e){"use strict";var t=this&&this.__createBinding||(Object.create?function(l,n,e,t){void 0===t&&(t=e),Object.defineProperty(l,t,{enumerable:!0,get:function(){return n[e]}})}:function(l,n,e,t){void 0===t&&(t=e),l[t]=n[e]}),u=this&&this.__exportStar||function(l,n){for(var e in l)"default"===e||n.hasOwnProperty(e)||t(n,l,e)};Object.defineProperty(n,"__esModule",{value:!0}),u(e(189),n),u(e(37),n),u(e(18),n),u(e(48),n),u(e(30),n),u(e(33),n),u(e(38),n),u(e(64),n),u(e(49),n),u(e(29),n)},function(l,n,e){"use strict";var t=this&&this.__read||function(l,n){var e="function"===typeof Symbol&&l[Symbol.iterator];if(!e)return l;var t,u,r=e.call(l),o=[];try{for(;(void 0===n||n-- >0)&&!(t=r.next()).done;)o.push(t.value)}catch(i){u={error:i}}finally{try{t&&!t.done&&(e=r.return)&&e.call(r)}finally{if(u)throw u.error}}return o};Object.defineProperty(n,"__esModule",{value:!0}),n.Octet=void 0;var u=e(29),r=e(20),o=function(){function l(l){var n;n="string"===typeof l?parseInt(l):l;var e=t(u.Validator.isValidIPv4Octet(r(n)),2),o=e[0],i=e[1];if(!o)throw Error(i.filter(function(l){return""!==l}).toString());this.value=n}return l.fromString=function(n){return new l(n)},l.fromNumber=function(n){return new l(n)},l.prototype.getValue=function(){return this.value},l.prototype.toString=function(){return this.value.toString(10)},l}();n.Octet=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(66),o=e(4),i=function(l){function n(n){return l.call(this,n,new r.RangeDefinition)||this}return t(n,l),n.prototype.valueConstrained=function(){return this.typeDefinition.constrainValue(this.value)},n.prototype.setStringValue=function(l){return!1},Object.defineProperty(n.prototype,"value1",{get:function(){if(this._value)return this._value.value1},set:function(l){l&&(this._value||(this._value=new r.Range(0,0)),this._value.value1!==l&&(this._value.value1=l,this.changed.set(o.RcpTypes.ParameterOptions.VALUE,!0),this.setDirty()))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"value2",{get:function(){if(this._value)return this._value.value2},set:function(l){l&&(this._value||(this._value=new r.Range(0,0)),this._value.value2!==l&&(this._value.value2=l,this.changed.set(o.RcpTypes.ParameterOptions.VALUE,!0),this.setDirty()))},enumerable:!0,configurable:!0}),n}(u.ValueParameter);n.RangeParameter=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(28),i=e(191),a=function(){return function(l,n){this.value1=l,this.value2=n}}();n.Range=a;var c=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.RANGE)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&(l.elementType&&this.elementType&&(e=this.elementType.update(l.elementType)),void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0)),e},n.prototype.constrainValue=function(l){return this.elementType&&(l.value1=this.elementType.constrainValue(l.value1),l.value2=this.elementType.constrainValue(l.value2)),l},n.prototype.didChange=function(){var l=!1;return this.elementType&&(l=this.elementType.didChange()),this.changed.size>0||l},n.prototype.readMandatory=function(l){var n=i.createTypeDefinition(l.readU1());if(n.readMandatory(l),!(n instanceof o.NumberDefinition))throw Error("RangeDefinition: wrong element type: "+n.datatype);this.elementType=n},n.prototype.parseOptions=function(n){if(!this.elementType)throw new Error("cannot parse elementType options without elementType");this.elementType.parseOptions(n),l.prototype.parseOptions.call(this,n)},n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.BooleanOptions.DEFAULT:return this._defaultValue=this.readValue(n),!0}return!1},n.prototype.readValue=function(l){if(!this.elementType)throw new Error("could not read from elementType");return new a(this.elementType.readValue(l),this.elementType.readValue(l))},n.prototype.writeValue=function(l,n){if(!this.elementType)throw new Error("could not write value without elementType");void 0!=n?(this.elementType.writeValue(l,n.value1),this.elementType.writeValue(l,n.value2)):this._defaultValue?(this.elementType.writeValue(l,this._defaultValue.value1),this.elementType.writeValue(l,this._defaultValue.value2)):(this.elementType.writeValue(l,void 0),this.elementType.writeValue(l,void 0))},n.prototype.getDefaultId=function(){return r.RcpTypes.RangeOptions.DEFAULT},n.prototype.getTypeDefault=function(){return new a(0,0)},n.prototype.writeMandatory=function(l){if(!this.elementType)throw new Error("RangeDefinition without elementType!");l.push(this.elementType.datatype),this.elementType.writeMandatory(l)},n.prototype.writeOptions=function(l,n){if(!this.elementType)throw new Error("RangeDefinition without elementType!");this.elementType.writeOptions(l,n),l.push(r.RcpTypes.TERMINATOR),(n||this.changed.has(r.RcpTypes.RangeOptions.DEFAULT))&&(l.push(r.RcpTypes.RangeOptions.DEFAULT),this.writeValue(l,this._defaultValue)),n||this.changed.clear()},n}(u.DefaultDefinition);n.RangeDefinition=c},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(19),r=e(4),o=e(63),i=e(20),a=function(l){function n(){return l.call(this,r.RcpTypes.Datatype.IPV6)||this}return t(n,l),n.prototype.update=function(l){var e=!1;return l instanceof n&&void 0!==l._defaultValue&&(this._defaultValue=l._defaultValue,e=!0),e},n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.Ipv6Options.DEFAULT:return this._defaultValue=this.readValue(n),!0}return!1},n.prototype.readValue=function(l){throw l.readS4be(),new Error("Method not implemented.")},n.prototype.writeValue=function(l,n){throw new Error("Method not implemented.")},n.prototype.getDefaultId=function(){return r.RcpTypes.Ipv6Options.DEFAULT},n.prototype.getTypeDefault=function(){return new o.IPv6(i(0))},n.prototype.writeOptions=function(l,n){throw new Error("Method not implemented.")},n.allOptions=(new Map).set(r.RcpTypes.Ipv6Options.DEFAULT,!0),n}(u.DefaultDefinition);n.IPv6Definition=a},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(51),o=function(l){function n(n){return l.call(this,n,new r.StringDefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){return this.value=l,!0},n}(u.ValueParameter);n.StringParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(28),r=e(50),o=function(l){function n(n,e){var t=l.call(this,n,e)||this;return t.numberDefinition=e,t}return t(n,l),n.prototype.valueConstrained=function(){return this.numberDefinition.constrainValue(this.value)},n}(e(17).ValueParameter);n.NumberParameter=o;var i=function(l){function n(n){return l.call(this,n,new u.Int8Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseInt(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Int8Parameter=i;var a=function(l){function n(n){return l.call(this,n,new u.Int16Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseInt(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Int16Parameter=a;var c=function(l){function n(n){return l.call(this,n,new r.Int32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseInt(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Int32Parameter=c;var s=function(l){function n(n){return l.call(this,n,new u.Int64Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseInt(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Int64Parameter=s;var p=function(l){function n(n){return l.call(this,n,new u.Float32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseFloat(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Float32Parameter=p;var h=function(l){function n(n){return l.call(this,n,new u.Float64Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseFloat(l);return!isNaN(n)&&(this.value=n,!0)},n}(o);n.Float64Parameter=h},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(52),o=e(25),i=function(l){function n(n,e){var t=l.call(this,n,e)||this;return t.vectorDefinition=e,t}return t(n,l),n.prototype.valueConstrained=function(){return this.vectorDefinition.constrainValue(this.value)},n}(u.ValueParameter);n.Vector3ParameterBase=i;var a=function(l){function n(n){return l.call(this,n,new r.Vector3F32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<3)return!1;var e=parseFloat(n[0]);if(isNaN(e))return!1;var t=parseFloat(n[1]);if(isNaN(t))return!1;var u=parseFloat(n[2]);return!isNaN(u)&&(this.value=new o.Vector3(e,t,u),!0)},n}(i);n.Vector3F32Parameter=a;var c=function(l){function n(n){return l.call(this,n,new r.Vector3I32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<3)return!1;var e=parseInt(n[0]);if(isNaN(e))return!1;var t=parseInt(n[1]);if(isNaN(t))return!1;var u=parseInt(n[2]);return!isNaN(u)&&(this.value=new o.Vector3(e,t,u),!0)},n}(i);n.Vector3I32Parameter=c},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(192),o=function(l){function n(n){return l.call(this,n,new r.ImageDefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){return!1},n}(u.ValueParameter);n.ImageParameter=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(25),o=e(53),i=function(l){function n(n,e){var t=l.call(this,n,e)||this;return t.vectorDefinition=e,t}return t(n,l),n.prototype.valueConstrained=function(){return this.vectorDefinition.constrainValue(this.value)},n}(u.ValueParameter);n.Vector2ParameterBase=i;var a=function(l){function n(n){return l.call(this,n,new o.Vector2F32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<2)return!1;var e=parseFloat(n[0]);if(isNaN(e))return!1;var t=parseFloat(n[1]);return!isNaN(t)&&(this.value=new r.Vector2(e,t),!0)},n}(i);n.Vector2F32Parameter=a;var c=function(l){function n(n){return l.call(this,n,new o.Vector2I32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<2)return!1;var e=parseInt(n[0]);if(isNaN(e))return!1;var t=parseInt(n[1]);return!isNaN(t)&&(this.value=new r.Vector2(e,t),!0)},n}(i);n.Vector2I32Parameter=c},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(17),r=e(25),o=e(54),i=function(l){function n(n,e){var t=l.call(this,n,e)||this;return t.vectorDefinition=e,t}return t(n,l),n.prototype.valueConstrained=function(){return this.vectorDefinition.constrainValue(this.value)},n}(u.ValueParameter);n.Vector4ParameterBase=i;var a=function(l){function n(n){return l.call(this,n,new o.Vector4F32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<4)return!1;var e=parseFloat(n[0]);if(isNaN(e))return!1;var t=parseFloat(n[1]);if(isNaN(t))return!1;var u=parseFloat(n[2]);if(isNaN(u))return!1;var o=parseFloat(n[3]);return!isNaN(o)&&(this.value=new r.Vector4(e,t,u,o),!0)},n}(i);n.Vector4F32Parameter=a;var c=function(l){function n(n){return l.call(this,n,new o.Vector4I32Definition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=l.split(",");if(n.length<4)return!1;var e=parseInt(n[0]);if(isNaN(e))return!1;var t=parseInt(n[1]);if(isNaN(t))return!1;var u=parseInt(n[2]);if(isNaN(u))return!1;var o=parseInt(n[3]);return!isNaN(o)&&(this.value=new r.Vector4(e,t,u,o),!0)},n}(i);n.Vector4I32Parameter=c},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(15),u=function(){function l(l){this.id=l}return l.prototype.write=function(l,n){t.pushIn16ToArrayBe(this.id,l)},l}();n.IdData=u,n.parseIdData=function(l){var n=l.readS2be();return new u(n)}},function(l,n){var e,t,u=l.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function i(l){if(e===setTimeout)return setTimeout(l,0);if((e===r||!e)&&setTimeout)return e=setTimeout,setTimeout(l,0);try{return e(l,0)}catch(n){try{return e.call(null,l,0)}catch(n){return e.call(this,l,0)}}}!function(){try{e="function"===typeof setTimeout?setTimeout:r}catch(l){e=r}try{t="function"===typeof clearTimeout?clearTimeout:o}catch(l){t=o}}();var a,c=[],s=!1,p=-1;function h(){s&&a&&(s=!1,a.length?c=a.concat(c):p=-1,c.length&&f())}function f(){if(!s){var l=i(h);s=!0;for(var n=c.length;n;){for(a=c,c=[];++p1)for(var e=1;e=0)return 1;return 0}();var u=e&&window.Promise?function(l){var n=!1;return function(){n||(n=!0,window.Promise.resolve().then(function(){n=!1,l()}))}}:function(l){var n=!1;return function(){n||(n=!0,setTimeout(function(){n=!1,l()},t))}};function r(l){return l&&"[object Function]"==={}.toString.call(l)}function o(l,n){if(1!==l.nodeType)return[];var e=l.ownerDocument.defaultView.getComputedStyle(l,null);return n?e[n]:e}function i(l){return"HTML"===l.nodeName?l:l.parentNode||l.host}function a(l){if(!l)return document.body;switch(l.nodeName){case"HTML":case"BODY":return l.ownerDocument.body;case"#document":return l.body}var n=o(l),e=n.overflow,t=n.overflowX,u=n.overflowY;return/(auto|scroll|overlay)/.test(e+u+t)?l:a(i(l))}function c(l){return l&&l.referenceNode?l.referenceNode:l}var s=e&&!(!window.MSInputMethodContext||!document.documentMode),p=e&&/MSIE 10/.test(navigator.userAgent);function h(l){return 11===l?s:10===l?p:s||p}function f(l){if(!l)return document.documentElement;for(var n=h(10)?document.body:null,e=l.offsetParent||null;e===n&&l.nextElementSibling;)e=(l=l.nextElementSibling).offsetParent;var t=e&&e.nodeName;return t&&"BODY"!==t&&"HTML"!==t?-1!==["TH","TD","TABLE"].indexOf(e.nodeName)&&"static"===o(e,"position")?f(e):e:l?l.ownerDocument.documentElement:document.documentElement}function d(l){return null!==l.parentNode?d(l.parentNode):l}function v(l,n){if(!l||!l.nodeType||!n||!n.nodeType)return document.documentElement;var e=l.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING,t=e?l:n,u=e?n:l,r=document.createRange();r.setStart(t,0),r.setEnd(u,0);var o=r.commonAncestorContainer;if(l!==o&&n!==o||t.contains(u))return function(l){var n=l.nodeName;return"BODY"!==n&&("HTML"===n||f(l.firstElementChild)===l)}(o)?o:f(o);var i=d(l);return i.host?v(i.host,n):v(l,d(n).host)}function m(l){var n="top"===(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",e=l.nodeName;if("BODY"===e||"HTML"===e){var t=l.ownerDocument.documentElement;return(l.ownerDocument.scrollingElement||t)[n]}return l[n]}function y(l,n){var e="x"===n?"Left":"Top",t="Left"===e?"Right":"Bottom";return parseFloat(l["border"+e+"Width"])+parseFloat(l["border"+t+"Width"])}function g(l,n,e,t){return Math.max(n["offset"+l],n["scroll"+l],e["client"+l],e["offset"+l],e["scroll"+l],h(10)?parseInt(e["offset"+l])+parseInt(t["margin"+("Height"===l?"Top":"Left")])+parseInt(t["margin"+("Height"===l?"Bottom":"Right")]):0)}function z(l){var n=l.body,e=l.documentElement,t=h(10)&&getComputedStyle(e);return{height:g("Height",n,e,t),width:g("Width",n,e,t)}}var b=function(l,n){if(!(l instanceof n))throw new TypeError("Cannot call a class as a function")},E=function(){function l(l,n){for(var e=0;e2&&void 0!==arguments[2]&&arguments[2],t=h(10),u="HTML"===n.nodeName,r=O(l),i=O(n),c=a(l),s=o(n),p=parseFloat(s.borderTopWidth),f=parseFloat(s.borderLeftWidth);e&&u&&(i.top=Math.max(i.top,0),i.left=Math.max(i.left,0));var d=_({top:r.top-i.top-p,left:r.left-i.left-f,width:r.width,height:r.height});if(d.marginTop=0,d.marginLeft=0,!t&&u){var v=parseFloat(s.marginTop),y=parseFloat(s.marginLeft);d.top-=p-v,d.bottom-=p-v,d.left-=f-y,d.right-=f-y,d.marginTop=v,d.marginLeft=y}return(t&&!e?n.contains(c):n===c&&"BODY"!==c.nodeName)&&(d=function(l,n){var e=arguments.length>2&&void 0!==arguments[2]&&arguments[2],t=m(n,"top"),u=m(n,"left"),r=e?-1:1;return l.top+=t*r,l.bottom+=t*r,l.left+=u*r,l.right+=u*r,l}(d,n)),d}function V(l){if(!l||!l.parentElement||h())return document.documentElement;for(var n=l.parentElement;n&&"none"===o(n,"transform");)n=n.parentElement;return n||document.documentElement}function L(l,n,e,t){var u=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=u?V(l):v(l,c(n));if("viewport"===t)r=function(l){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=l.ownerDocument.documentElement,t=w(l,e),u=Math.max(e.clientWidth,window.innerWidth||0),r=Math.max(e.clientHeight,window.innerHeight||0),o=n?0:m(e),i=n?0:m(e,"left");return _({top:o-t.top+t.marginTop,left:i-t.left+t.marginLeft,width:u,height:r})}(s,u);else{var p=void 0;"scrollParent"===t?"BODY"===(p=a(i(n))).nodeName&&(p=l.ownerDocument.documentElement):p="window"===t?l.ownerDocument.documentElement:t;var h=w(p,s,u);if("HTML"!==p.nodeName||function l(n){var e=n.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===o(n,"position"))return!0;var t=i(n);return!!t&&l(t)}(s))r=h;else{var f=z(l.ownerDocument),d=f.height,y=f.width;r.top+=h.top-h.marginTop,r.bottom=d+h.top,r.left+=h.left-h.marginLeft,r.right=y+h.left}}var g="number"===typeof(e=e||0);return r.left+=g?e:e.left||0,r.top+=g?e:e.top||0,r.right-=g?e:e.right||0,r.bottom-=g?e:e.bottom||0,r}function C(l,n,e,t,u){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===l.indexOf("auto"))return l;var o=L(e,t,r,u),i={top:{width:o.width,height:n.top-o.top},right:{width:o.right-n.right,height:o.height},bottom:{width:o.width,height:o.bottom-n.bottom},left:{width:n.left-o.left,height:o.height}},a=Object.keys(i).map(function(l){return M({key:l},i[l],{area:(n=i[l],n.width*n.height)});var n}).sort(function(l,n){return n.area-l.area}),c=a.filter(function(l){var n=l.width,t=l.height;return n>=e.clientWidth&&t>=e.clientHeight}),s=c.length>0?c[0].key:a[0].key,p=l.split("-")[1];return s+(p?"-"+p:"")}function A(l,n,e){var t=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;return w(e,t?V(n):v(n,c(e)),t)}function S(l){var n=l.ownerDocument.defaultView.getComputedStyle(l),e=parseFloat(n.marginTop||0)+parseFloat(n.marginBottom||0),t=parseFloat(n.marginLeft||0)+parseFloat(n.marginRight||0);return{width:l.offsetWidth+t,height:l.offsetHeight+e}}function I(l){var n={left:"right",right:"left",bottom:"top",top:"bottom"};return l.replace(/left|right|bottom|top/g,function(l){return n[l]})}function R(l,n,e){e=e.split("-")[0];var t=S(l),u={width:t.width,height:t.height},r=-1!==["right","left"].indexOf(e),o=r?"top":"left",i=r?"left":"top",a=r?"height":"width",c=r?"width":"height";return u[o]=n[o]+n[a]/2-t[a]/2,u[i]=e===i?n[i]-t[c]:n[I(i)],u}function H(l,n){return Array.prototype.find?l.find(n):l.filter(n)[0]}function P(l,n,e){return(void 0===e?l:l.slice(0,function(l,n,e){if(Array.prototype.findIndex)return l.findIndex(function(l){return l[n]===e});var t=H(l,function(l){return l[n]===e});return l.indexOf(t)}(l,"name",e))).forEach(function(l){l.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var e=l.function||l.fn;l.enabled&&r(e)&&(n.offsets.popper=_(n.offsets.popper),n.offsets.reference=_(n.offsets.reference),n=e(n,l))}),n}function N(l,n){return l.some(function(l){var e=l.name;return l.enabled&&e===n})}function D(l){for(var n=[!1,"ms","Webkit","Moz","O"],e=l.charAt(0).toUpperCase()+l.slice(1),t=0;t1&&void 0!==arguments[1]&&arguments[1],e=K.indexOf(l),t=K.slice(e+1).concat(K.slice(0,e));return n?t.reverse():t}var q={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function X(l,n,e,t){var u=[0,0],r=-1!==["right","left"].indexOf(t),o=l.split(/(\+|\-)/).map(function(l){return l.trim()}),i=o.indexOf(H(o,function(l){return-1!==l.search(/,|\s/)}));o[i]&&-1===o[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var a=/\s*,\s*|\s+/,c=-1!==i?[o.slice(0,i).concat([o[i].split(a)[0]]),[o[i].split(a)[1]].concat(o.slice(i+1))]:[o];return(c=c.map(function(l,t){var u=(1===t?!r:r)?"height":"width",o=!1;return l.reduce(function(l,n){return""===l[l.length-1]&&-1!==["+","-"].indexOf(n)?(l[l.length-1]=n,o=!0,l):o?(l[l.length-1]+=n,o=!1,l):l.concat(n)},[]).map(function(l){return function(l,n,e,t){var u=l.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+u[1],o=u[2];if(!r)return l;if(0===o.indexOf("%")){var i=void 0;switch(o){case"%p":i=e;break;case"%":case"%r":default:i=t}return _(i)[n]/100*r}if("vh"===o||"vw"===o)return("vh"===o?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;return r}(l,u,n,e)})})).forEach(function(l,n){l.forEach(function(e,t){B(e)&&(u[n]+=e*("-"===l[t-1]?-1:1))})}),u}var $={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(l){var n=l.placement,e=n.split("-")[0],t=n.split("-")[1];if(t){var u=l.offsets,r=u.reference,o=u.popper,i=-1!==["bottom","top"].indexOf(e),a=i?"left":"top",c=i?"width":"height",s={start:T({},a,r[a]),end:T({},a,r[a]+r[c]-o[c])};l.offsets.popper=M({},o,s[t])}return l}},offset:{order:200,enabled:!0,fn:function(l,n){var e=n.offset,t=l.placement,u=l.offsets,r=u.popper,o=u.reference,i=t.split("-")[0],a=void 0;return a=B(+e)?[+e,0]:X(e,r,o,i),"left"===i?(r.top+=a[0],r.left-=a[1]):"right"===i?(r.top+=a[0],r.left+=a[1]):"top"===i?(r.left+=a[0],r.top-=a[1]):"bottom"===i&&(r.left+=a[0],r.top+=a[1]),l.popper=r,l},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(l,n){var e=n.boundariesElement||f(l.instance.popper);l.instance.reference===e&&(e=f(e));var t=D("transform"),u=l.instance.popper.style,r=u.top,o=u.left,i=u[t];u.top="",u.left="",u[t]="";var a=L(l.instance.popper,l.instance.reference,n.padding,e,l.positionFixed);u.top=r,u.left=o,u[t]=i,n.boundaries=a;var c=n.priority,s=l.offsets.popper,p={primary:function(l){var e=s[l];return s[l]a[l]&&!n.escapeWithReference&&(t=Math.min(s[e],a[l]-("right"===l?s.width:s.height))),T({},e,t)}};return c.forEach(function(l){var n=-1!==["left","top"].indexOf(l)?"primary":"secondary";s=M({},s,p[n](l))}),l.offsets.popper=s,l},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(l){var n=l.offsets,e=n.popper,t=n.reference,u=l.placement.split("-")[0],r=Math.floor,o=-1!==["top","bottom"].indexOf(u),i=o?"right":"bottom",a=o?"left":"top",c=o?"width":"height";return e[i]r(t[i])&&(l.offsets.popper[a]=r(t[i])),l}},arrow:{order:500,enabled:!0,fn:function(l,n){var e;if(!W(l.instance.modifiers,"arrow","keepTogether"))return l;var t=n.element;if("string"===typeof t){if(!(t=l.instance.popper.querySelector(t)))return l}else if(!l.instance.popper.contains(t))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),l;var u=l.placement.split("-")[0],r=l.offsets,i=r.popper,a=r.reference,c=-1!==["left","right"].indexOf(u),s=c?"height":"width",p=c?"Top":"Left",h=p.toLowerCase(),f=c?"left":"top",d=c?"bottom":"right",v=S(t)[s];a[d]-vi[d]&&(l.offsets.popper[h]+=a[h]+v-i[d]),l.offsets.popper=_(l.offsets.popper);var m=a[h]+a[s]/2-v/2,y=o(l.instance.popper),g=parseFloat(y["margin"+p]),z=parseFloat(y["border"+p+"Width"]),b=m-l.offsets.popper[h]-g-z;return b=Math.max(Math.min(i[s]-v,b),0),l.arrowElement=t,l.offsets.arrow=(T(e={},h,Math.round(b)),T(e,f,""),e),l},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(l,n){if(N(l.instance.modifiers,"inner"))return l;if(l.flipped&&l.placement===l.originalPlacement)return l;var e=L(l.instance.popper,l.instance.reference,n.padding,n.boundariesElement,l.positionFixed),t=l.placement.split("-")[0],u=I(t),r=l.placement.split("-")[1]||"",o=[];switch(n.behavior){case q.FLIP:o=[t,u];break;case q.CLOCKWISE:o=Y(t);break;case q.COUNTERCLOCKWISE:o=Y(t,!0);break;default:o=n.behavior}return o.forEach(function(i,a){if(t!==i||o.length===a+1)return l;t=l.placement.split("-")[0],u=I(t);var c=l.offsets.popper,s=l.offsets.reference,p=Math.floor,h="left"===t&&p(c.right)>p(s.left)||"right"===t&&p(c.left)p(s.top)||"bottom"===t&&p(c.top)p(e.right),v=p(c.top)p(e.bottom),y="left"===t&&f||"right"===t&&d||"top"===t&&v||"bottom"===t&&m,g=-1!==["top","bottom"].indexOf(t),z=!!n.flipVariations&&(g&&"start"===r&&f||g&&"end"===r&&d||!g&&"start"===r&&v||!g&&"end"===r&&m),b=!!n.flipVariationsByContent&&(g&&"start"===r&&d||g&&"end"===r&&f||!g&&"start"===r&&m||!g&&"end"===r&&v),E=z||b;(h||y||E)&&(l.flipped=!0,(h||y)&&(t=o[a+1]),E&&(r=function(l){return"end"===l?"start":"start"===l?"end":l}(r)),l.placement=t+(r?"-"+r:""),l.offsets.popper=M({},l.offsets.popper,R(l.instance.popper,l.offsets.reference,l.placement)),l=P(l.instance.modifiers,l,"flip"))}),l},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(l){var n=l.placement,e=n.split("-")[0],t=l.offsets,u=t.popper,r=t.reference,o=-1!==["left","right"].indexOf(e),i=-1===["top","left"].indexOf(e);return u[o?"left":"top"]=r[e]-(i?u[o?"width":"height"]:0),l.placement=I(n),l.offsets.popper=_(u),l}},hide:{order:800,enabled:!0,fn:function(l){if(!W(l.instance.modifiers,"hide","preventOverflow"))return l;var n=l.offsets.reference,e=H(l.instance.modifiers,function(l){return"preventOverflow"===l.name}).boundaries;if(n.bottome.right||n.top>e.bottom||n.right2&&void 0!==arguments[2]?arguments[2]:{};b(this,l),this.scheduleUpdate=function(){return requestAnimationFrame(t.update)},this.update=u(this.update.bind(this)),this.options=M({},l.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=n&&n.jquery?n[0]:n,this.popper=e&&e.jquery?e[0]:e,this.options.modifiers={},Object.keys(M({},l.Defaults.modifiers,o.modifiers)).forEach(function(n){t.options.modifiers[n]=M({},l.Defaults.modifiers[n]||{},o.modifiers?o.modifiers[n]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(l){return M({name:l},t.options.modifiers[l])}).sort(function(l,n){return l.order-n.order}),this.modifiers.forEach(function(l){l.enabled&&r(l.onLoad)&&l.onLoad(t.reference,t.popper,t.options,l,t.state)}),this.update();var i=this.options.eventsEnabled;i&&this.enableEventListeners(),this.state.eventsEnabled=i}return E(l,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var l={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};l.offsets.reference=A(this.state,this.popper,this.reference,this.options.positionFixed),l.placement=C(this.options.placement,l.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),l.originalPlacement=l.placement,l.positionFixed=this.options.positionFixed,l.offsets.popper=R(this.popper,l.offsets.reference,l.placement),l.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",l=P(this.modifiers,l),this.state.isCreated?this.options.onUpdate(l):(this.state.isCreated=!0,this.options.onCreate(l))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,N(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[D("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=k(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return U.call(this)}}]),l}();Z.Utils=("undefined"!==typeof window?window:l).PopperUtils,Z.placements=G,Z.Defaults=$,n.a=Z}).call(this,e(23))},function(l,n,e){"use strict";var t=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;l.exports=function(){try{if(!Object.assign)return!1;var l=new String("abc");if(l[5]="de","5"===Object.getOwnPropertyNames(l)[0])return!1;for(var n={},e=0;e<10;e++)n["_"+String.fromCharCode(e)]=e;if("0123456789"!==Object.getOwnPropertyNames(n).map(function(l){return n[l]}).join(""))return!1;var t={};return"abcdefghijklmnopqrst".split("").forEach(function(l){t[l]=l}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},t)).join("")}catch(u){return!1}}()?Object.assign:function(l,n){for(var e,o,i=function(l){if(null===l||void 0===l)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(l)}(l),a=1;a=0&&t>=0&&u>=0)return!0}return console.error("version missmatch!"),!1},l.prototype.initialize=function(){if(this.transporter.isConnected()){var l=new r.Packet(o.RcpTypes.Command.INITIALIZE);this.sendPacket(l)}else console.log("initialize: transporter not connected")},l.prototype.update=function(){var n=this;try{this.transporter.isConnected()?(console.log("this.dirtyParams: "+this.dirtyParams.length),this.dirtyParams.forEach(function(e){var t=o.RcpTypes.Command.UPDATE;l.serverVersionGt("0.0.1")&&(e instanceof c.BangParameter||e.onlyValueChanged())&&(t=o.RcpTypes.Command.UPDATEVALUE);var u=new r.Packet(t);u.data=e,n.sendPacket(u)}),this.dirtyParams=[]):console.log("transporter not connected")}catch(e){throw e}},l.prototype.getParameter=function(l){return this.valueCache.get(l)},l.prototype.setParameterDirty=function(l){this.dirtyParams.indexOf(l)>-1||this.dirtyParams.push(l)},l.prototype.getRootGroup=function(){return this._rootGroup},l.prototype.sendPacket=function(n){var e=new Int8Array(n.serialize(!1));l.VERBOSE&&console.log("client writing: ",e),this.transporter.send(e)},l.prototype._update=function(n){if(this.valueCache.has(n.id)){var e=this.valueCache.get(n.id);e&&e.update(n),n.dispose(),l.VERBOSE&&e&&console.log("CLIENT: updated paramter: "+e.label+" ["+e.id+"]")}else n.parent?n.parent.addChild(n):n.setParentDirect(this._rootGroup),this.valueCache.set(n.id,n),console.log("CLIENT _update: "+n.logChanged()),n.clearChanged(),console.log("CLIENT _update1: "+n.logChanged()+" dirty: "+(this.dirtyParams.indexOf(n)>-1)),this.parameterAdded&&this.parameterAdded(n),l.VERBOSE&&console.log("CLIENT: paramter added to cache: "+n.label+" ["+n.id+"]")},l.prototype._remove=function(n){var e=this.valueCache.get(n);void 0!==e?(l.VERBOSE&&console.log("CLIENT: remove: "+n),e.removeFromParent(),this.valueCache.delete(n),this.parameterRemoved&&this.parameterRemoved(e),e.dispose()):l.VERBOSE&&console.log("CLIENT: no parameter to remove with id: "+n)},l.VERBOSE=!1,l.rcpVersion="0.1.0",l}();n.Client=f},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.IP)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.IpWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.DIRECTORYCHOOSER)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.DirectorychooserWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.FILECHOOSER)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.FilechooserWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.TABLE)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.TableWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.COLORBOX)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.ColorboxWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.RADIOBUTTON)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.RadiobuttonWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.DROPDOWN)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.DropdownWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.RANGE)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.RangeWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.SLIDER2D)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.Slider2dWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.TABS)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.TabsWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.LISTPAGE)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.ListPageWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.LIST)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.ListWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=e(27),i=e(15),a=e(98),c=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.CUSTOM)||this}return t(n,l),n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.CustomwidgetOptions.UUID:return this._uuid=new a.UUID(n.readBytes(16)),console.log("custom widget: uuid: "+this._uuid),!0;case r.RcpTypes.CustomwidgetOptions.CONFIG:return this._config=new r.Userdata(n).data,console.log("custom widget: config: "+o.default.createStringFromArray(this._config)),!0}return!1},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.CustomwidgetOptions.UUID))&&(l.push(r.RcpTypes.CustomwidgetOptions.UUID),this._uuid?this._uuid.data.forEach(function(n){l.push(n)}):(i.pushIn64ToArrayBe(0,l),i.pushIn64ToArrayBe(0,l))),(n||this.changed.has(r.RcpTypes.CustomwidgetOptions.CONFIG))&&(l.push(r.RcpTypes.CustomwidgetOptions.CONFIG),this._config?(i.pushFloat32ToArrayBe(this._config.length,l),this._config.forEach(function(n){l.push(n)})):i.pushFloat32ToArrayBe(0,l))},Object.defineProperty(n.prototype,"uuid",{get:function(){return this._uuid},set:function(l){l&&16===l.data.length&&(this._uuid.compareRaw(l.data)||(this._uuid=l,this.changed.set(r.RcpTypes.CustomwidgetOptions.UUID,!0),this.setDirty()))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"config",{get:function(){return this._config},set:function(l){this._config!==l&&(this._config=l,this.changed.set(r.RcpTypes.CustomwidgetOptions.CONFIG,!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(u.Widget);n.CustomWidget=c},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=new(function(){return function(){this.byteToHex=[],this.hexToByte={};for(var l=0;l<256;l++)this.byteToHex[l]=(l+256).toString(16).substr(1),this.hexToByte[this.byteToHex[l]]=l}}()),u=function(){function l(l){this._data=l}return Object.defineProperty(l.prototype,"data",{get:function(){return this._data},set:function(l){this._data=l},enumerable:!0,configurable:!0}),l.prototype.toString=function(){if(this._data.byteLength<16)return"";var l=0,n=t.byteToHex;return n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]+"-"+n[this._data[l++]]+n[this._data[l++]]+"-"+n[this._data[l++]]+n[this._data[l++]]+"-"+n[this._data[l++]]+n[this._data[l++]]+"-"+n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]+n[this._data[l++]]},l.prototype.compare=function(l){return this.toString().toUpperCase()===l.toUpperCase()},l.prototype.compareRaw=function(l){if(this._data==l)return!0;if(this._data.byteLength!==l.byteLength)return!1;for(var n=0;n!=this._data.byteLength;n++)if(this._data[n]!=l[n])return!1;return!0},l}();n.UUID=u},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.DIAL)||this}return t(n,l),n.prototype.handleOption=function(l,n){return l===r.RcpTypes.DialOptions.CYCLIC&&(this._cyclic=n.readU1()>0,!0)},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.DialOptions.CYCLIC))&&(l.push(r.RcpTypes.DialOptions.CYCLIC),this._cyclic?l.push(this._cyclic?1:0):l.push(0))},Object.defineProperty(n.prototype,"cyclic",{get:function(){return this._cyclic},set:function(l){this._cyclic!==l&&(this._cyclic=l,this.changed.set(r.RcpTypes.DialOptions.CYCLIC,!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(u.Widget);n.DialWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.SLIDER)||this}return t(n,l),n.prototype.handleOption=function(l,n){return l===r.RcpTypes.SliderOptions.HORIZONTAL&&(this._horizontal=n.readU1()>0,!0)},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.SliderOptions.HORIZONTAL))&&(l.push(r.RcpTypes.SliderOptions.HORIZONTAL),this._horizontal?l.push(this._horizontal?1:0):l.push(0))},Object.defineProperty(n.prototype,"horizontal",{get:function(){return this._horizontal},set:function(l){this._horizontal!==l&&(this._horizontal=l,this.changed.set(r.RcpTypes.SliderOptions.HORIZONTAL,!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(u.Widget);n.SliderWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=e(28),i=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.NUMBERBOX)||this}return t(n,l),n.prototype.handleOption=function(l,n){switch(l){case r.RcpTypes.NumberboxOptions.PRECISION:return this._precision=n.readU1(),!0;case r.RcpTypes.NumberboxOptions.FORMAT:return this._format=n.readU1(),!0;case r.RcpTypes.NumberboxOptions.STEPSIZE:var e=this.parameter;if(e){var t=e.typeDefinition;if(!(t instanceof o.NumberDefinition))throw new Error("numberbox widget with non-number-parameter: can not read stepsize!");return this._stepsize=t.readValue(n),!0}case r.RcpTypes.NumberboxOptions.CYCLIC:return this._cyclic=n.readU1()>0,!0}return!1},n.prototype.writeOptions=function(l,n){if((n||this.changed.has(r.RcpTypes.NumberboxOptions.FORMAT))&&(l.push(r.RcpTypes.NumberboxOptions.FORMAT),this._format?l.push(this._format):l.push(r.RcpTypes.NumberboxFormat.DEC)),(n||this.changed.has(r.RcpTypes.NumberboxOptions.PRECISION))&&(l.push(r.RcpTypes.NumberboxOptions.PRECISION),this._precision?l.push(this._precision):l.push(2)),n||this.changed.has(r.RcpTypes.NumberboxOptions.STEPSIZE)){l.push(r.RcpTypes.NumberboxOptions.STEPSIZE);var e=this.parameter;if(e){var t=e.typeDefinition;if(!(t instanceof o.NumberDefinition))throw new Error("numberbox widget with non-number-parameter: can not write stepsize!");t.writeValue(l,this._stepsize)}}(n||this.changed.has(r.RcpTypes.NumberboxOptions.CYCLIC))&&(l.push(r.RcpTypes.NumberboxOptions.CYCLIC),this._cyclic?l.push(this._cyclic?1:0):l.push(0))},Object.defineProperty(n.prototype,"precision",{get:function(){return this._precision},set:function(l){this._precision!==l&&(this._precision=l,this.changed.set(r.RcpTypes.NumberboxOptions.PRECISION,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"format",{get:function(){return this._format},set:function(l){this._format!==l&&(this._format=l,this.changed.set(r.RcpTypes.NumberboxOptions.FORMAT,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"stepsize",{get:function(){return this._stepsize},set:function(l){this._stepsize!==l&&(this._stepsize=l,this.changed.set(r.RcpTypes.NumberboxOptions.STEPSIZE,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"cyclic",{get:function(){return this._cyclic},set:function(l){this._cyclic!==l&&(this._cyclic=l,this.changed.set(r.RcpTypes.NumberboxOptions.CYCLIC,!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(u.Widget);n.NumberboxWidget=i},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.TEXTBOX)||this}return t(n,l),n.prototype.handleOption=function(l,n){return l===r.RcpTypes.TextboxOptions.MULTILINE?(this._multiline=n.readU1()>0,!0):l===r.RcpTypes.TextboxOptions.WORDWRAP?(this._wordwrap=n.readU1()>0,!0):l===r.RcpTypes.TextboxOptions.PASSWORD&&(this._password=n.readU1()>0,!0)},n.prototype.writeOptions=function(l,n){(n||this.changed.has(r.RcpTypes.TextboxOptions.MULTILINE))&&(l.push(r.RcpTypes.TextboxOptions.MULTILINE),this._multiline?l.push(this._multiline?1:0):l.push(0)),(n||this.changed.has(r.RcpTypes.TextboxOptions.WORDWRAP))&&(l.push(r.RcpTypes.TextboxOptions.WORDWRAP),this._wordwrap?l.push(this._wordwrap?1:0):l.push(0)),(n||this.changed.has(r.RcpTypes.TextboxOptions.PASSWORD))&&(l.push(r.RcpTypes.TextboxOptions.PASSWORD),this._password?l.push(this._password?1:0):l.push(0))},Object.defineProperty(n.prototype,"multiline",{get:function(){return this._multiline},set:function(l){this._multiline!==l&&(this._multiline=l,this.changed.set(r.RcpTypes.TextboxOptions.MULTILINE,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"wordwrap",{get:function(){return this._wordwrap},set:function(l){this._wordwrap!==l&&(this._wordwrap=l,this.changed.set(r.RcpTypes.TextboxOptions.WORDWRAP,!0),this.setDirty())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"password",{get:function(){return this._password},set:function(l){this._password!==l&&(this._password=l,this.changed.set(r.RcpTypes.TextboxOptions.PASSWORD,!0),this.setDirty())},enumerable:!0,configurable:!0}),n}(u.Widget);n.TextboxWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.INFO)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.InfoWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.BANG)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.BangWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.PRESS)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.PressWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.TOGGLE)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.ToggleWidget=o},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(12),r=e(4),o=function(l){function n(){return l.call(this,r.RcpTypes.Widgettype.DEFAULT)||this}return t(n,l),n.prototype.handleOption=function(l,n){return!1},n.prototype.writeOptions=function(l,n){},n}(u.Widget);n.DefaultWidget=o},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(15),u=e(4),r=e(24),o=function(){function l(l){this.command=l}return l.prototype.serialize=function(l){var n=new Array;return this.write(n,l),n},l.prototype.write=function(l,n){if(l.push(this.command),this.command===u.RcpTypes.Command.UPDATEVALUE){if(!(this.data instanceof r.Parameter))throw new Error("wrong data in updatevalue packet");this.data.writeValueUpdate(l)}else this.timestamp&&(l.push(u.RcpTypes.PacketOptions.TIMESTAMP),t.pushIn64ToArrayBe(this.timestamp,l)),this.data&&(l.push(u.RcpTypes.PacketOptions.DATA),this.data.write(l,n)),l.push(u.RcpTypes.TERMINATOR)},l}();n.Packet=o},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=e(15),u=e(1),r=e(4),o=function(){function l(l,n){this.version="0.0.0",this.applicationid="",this.version=l,this.applicationid=n}return l.prototype.write=function(l,n){t.writeTinyString(this.version,l),this.applicationid&&""!==this.applicationid&&(l.push(u.RcpTypes.InfodataOptions.APPLICATIONID),t.writeTinyString(this.applicationid,l))},l}();n.InfoData=o,n.parseInfoData=function(l){for(var n=new r.TinyString(l).data,e="";;){var t=l.readU1();if(t===u.RcpTypes.TERMINATOR)break;switch(t){case u.RcpTypes.InfodataOptions.APPLICATIONID:e=new r.TinyString(l).data}}return new o(n,e)}},function(l,n,e){"use strict";var t=this&&this.__extends||function(){var l=function(n,e){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(l,n){l.__proto__=n}||function(l,n){for(var e in n)n.hasOwnProperty(e)&&(l[e]=n[e])})(n,e)};return function(n,e){function t(){this.constructor=n}l(n,e),n.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e(40),r=function(l){function n(n){return l.call(this,n,new u.BooleanDefinition)||this}return t(n,l),n.prototype.setStringValue=function(l){var n=parseInt(l);if(!isNaN(n))return this.value=n>0,!0;switch(l.toLowerCase().trim()){case"true":case"yes":return this.value=!0,!0;case"false":case"no":case null:return this.value=!1,!0}return!1},n}(e(17).ValueParameter);n.BooleanParameter=r},function(l,n,e){"use strict";n.__esModule=!0,n.default=n.EXITING=n.ENTERED=n.ENTERING=n.EXITED=n.UNMOUNTED=void 0;var t=function(l){if(l&&l.__esModule)return l;var n={};if(null!=l)for(var e in l)if(Object.prototype.hasOwnProperty.call(l,e)){var t=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(l,e):{};t.get||t.set?Object.defineProperty(n,e,t):n[e]=l[e]}return n.default=l,n}(e(22)),u=i(e(0)),r=i(e(16)),o=e(2);e(112);function i(l){return l&&l.__esModule?l:{default:l}}var a="unmounted";n.UNMOUNTED=a;var c="exited";n.EXITED=c;var s="entering";n.ENTERING=s;var p="entered";n.ENTERED=p;n.EXITING="exiting";var h=function(l){var n,e;function t(n,e){var t;t=l.call(this,n,e)||this;var u,r=e.transitionGroup,o=r&&!r.isMounting?n.enter:n.appear;return t.appearStatus=null,n.in?o?(u=c,t.appearStatus=s):u=p:u=n.unmountOnExit||n.mountOnEnter?a:c,t.state={status:u},t.nextCallback=null,t}e=l,(n=t).prototype=Object.create(e.prototype),n.prototype.constructor=n,n.__proto__=e;var o=t.prototype;return o.getChildContext=function(){return{transitionGroup:null}},t.getDerivedStateFromProps=function(l,n){return l.in&&n.status===a?{status:c}:null},o.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},o.componentDidUpdate=function(l){var n=null;if(l!==this.props){var e=this.state.status;this.props.in?e!==s&&e!==p&&(n=s):e!==s&&e!==p||(n="exiting")}this.updateStatus(!1,n)},o.componentWillUnmount=function(){this.cancelNextCallback()},o.getTimeouts=function(){var l,n,e,t=this.props.timeout;return l=n=e=t,null!=t&&"number"!==typeof t&&(l=t.exit,n=t.enter,e=void 0!==t.appear?t.appear:n),{exit:l,enter:n,appear:e}},o.updateStatus=function(l,n){if(void 0===l&&(l=!1),null!==n){this.cancelNextCallback();var e=r.default.findDOMNode(this);n===s?this.performEnter(e,l):this.performExit(e)}else this.props.unmountOnExit&&this.state.status===c&&this.setState({status:a})},o.performEnter=function(l,n){var e=this,t=this.props.enter,u=this.context.transitionGroup?this.context.transitionGroup.isMounting:n,r=this.getTimeouts(),o=u?r.appear:r.enter;n||t?(this.props.onEnter(l,u),this.safeSetState({status:s},function(){e.props.onEntering(l,u),e.onTransitionEnd(l,o,function(){e.safeSetState({status:p},function(){e.props.onEntered(l,u)})})})):this.safeSetState({status:p},function(){e.props.onEntered(l)})},o.performExit=function(l){var n=this,e=this.props.exit,t=this.getTimeouts();e?(this.props.onExit(l),this.safeSetState({status:"exiting"},function(){n.props.onExiting(l),n.onTransitionEnd(l,t.exit,function(){n.safeSetState({status:c},function(){n.props.onExited(l)})})})):this.safeSetState({status:c},function(){n.props.onExited(l)})},o.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},o.safeSetState=function(l,n){n=this.setNextCallback(n),this.setState(l,n)},o.setNextCallback=function(l){var n=this,e=!0;return this.nextCallback=function(t){e&&(e=!1,n.nextCallback=null,l(t))},this.nextCallback.cancel=function(){e=!1},this.nextCallback},o.onTransitionEnd=function(l,n,e){this.setNextCallback(e);var t=null==n&&!this.props.addEndListener;l&&!t?(this.props.addEndListener&&this.props.addEndListener(l,this.nextCallback),null!=n&&setTimeout(this.nextCallback,n)):setTimeout(this.nextCallback,0)},o.render=function(){var l=this.state.status;if(l===a)return null;var n=this.props,e=n.children,t=function(l,n){if(null==l)return{};var e,t,u={},r=Object.keys(l);for(t=0;t=0||(u[e]=l[e]);return u}(n,["children"]);if(delete t.in,delete t.mountOnEnter,delete t.unmountOnExit,delete t.appear,delete t.enter,delete t.exit,delete t.timeout,delete t.addEndListener,delete t.onEnter,delete t.onEntering,delete t.onEntered,delete t.onExit,delete t.onExiting,delete t.onExited,"function"===typeof e)return e(l,t);var r=u.default.Children.only(e);return u.default.cloneElement(r,t)},t}(u.default.Component);function f(){}h.contextTypes={transitionGroup:t.object},h.childContextTypes={transitionGroup:function(){}},h.propTypes={},h.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:f,onEntering:f,onEntered:f,onExit:f,onExiting:f,onExited:f},h.UNMOUNTED=0,h.EXITED=1,h.ENTERING=2,h.ENTERED=3,h.EXITING=4;var d=(0,o.polyfill)(h);n.default=d},function(l,n,e){"use strict";n.__esModule=!0,n.classNamesShape=n.timeoutsShape=void 0;var t;(t=e(22))&&t.__esModule;n.timeoutsShape=null;n.classNamesShape=null},function(l,n,e){"use strict";n.__esModule=!0,n.default=void 0;var t=i(e(22)),u=i(e(0)),r=e(2),o=e(208);function i(l){return l&&l.__esModule?l:{default:l}}function a(){return(a=Object.assign||function(l){for(var n=1;n=0||(u[e]=l[e]);return u}(l,["component","childFactory"]),r=s(this.state.children).map(e);return delete t.appear,delete t.enter,delete t.exit,null===n?r:u.default.createElement(n,t,r)},t}(u.default.Component);p.childContextTypes={transitionGroup:t.default.object.isRequired},p.propTypes={},p.defaultProps={component:"div",childFactory:function(l){return l}};var h=(0,r.polyfill)(p);n.default=h,l.exports=n.default},function(l,n,e){"use strict";var t=Object.prototype.toString;l.exports=function(l){var n=t.call(l),e="[object Arguments]"===n;return e||(e="[object Array]"!==n&&null!==l&&"object"===typeof l&&"number"===typeof l.length&&l.length>=0&&"[object Function]"===t.call(l.callee)),e}},function(l,n,e){"use strict";var t=e(35);l.exports=t.call(Function.call,Object.prototype.hasOwnProperty)},function(l,n,e){"use strict";var t=function(l){return l!==l};l.exports=function(l,n){return 0===l&&0===n?1/l===1/n:l===n||!(!t(l)||!t(n))}},function(l,n,e){"use strict";var t=e(116);l.exports=function(){return"function"===typeof Object.is?Object.is:t}},function(l,n,e){"use strict";var t=Object,u=TypeError;l.exports=function(){if(null!=this&&this!==t(this))throw new u("RegExp.prototype.flags getter called on non-object");var l="";return this.global&&(l+="g"),this.ignoreCase&&(l+="i"),this.multiline&&(l+="m"),this.dotAll&&(l+="s"),this.unicode&&(l+="u"),this.sticky&&(l+="y"),l}},function(l,n,e){"use strict";var t=e(118),u=e(34).supportsDescriptors,r=Object.getOwnPropertyDescriptor,o=TypeError;l.exports=function(){if(!u)throw new o("RegExp.prototype.flags requires a true ES5 environment that supports property descriptors");if("gim"===/a/gim.flags){var l=r(RegExp.prototype,"flags");if(l&&"function"===typeof l.get&&"boolean"===typeof/a/.dotAll)return l.get}return t}},function(l,n,e){"use strict";e.d(n,"a",function(){return t});var t={BLACK:"#10161A",BLUE1:"#0E5A8A",BLUE2:"#106BA3",BLUE3:"#137CBD",BLUE4:"#2B95D6",BLUE5:"#48AFF0",COBALT1:"#1F4B99",COBALT2:"#2458B3",COBALT3:"#2965CC",COBALT4:"#4580E6",COBALT5:"#669EFF",DARK_GRAY1:"#182026",DARK_GRAY2:"#202B33",DARK_GRAY3:"#293742",DARK_GRAY4:"#30404D",DARK_GRAY5:"#394B59",FOREST1:"#1D7324",FOREST2:"#238C2C",FOREST3:"#29A634",FOREST4:"#43BF4D",FOREST5:"#62D96B",GOLD1:"#A67908",GOLD2:"#BF8C0A",GOLD3:"#D99E0B",GOLD4:"#F2B824",GOLD5:"#FFC940",GRAY1:"#5C7080",GRAY2:"#738694",GRAY3:"#8A9BA8",GRAY4:"#A7B6C2",GRAY5:"#BFCCD6",GREEN1:"#0A6640",GREEN2:"#0D8050",GREEN3:"#0F9960",GREEN4:"#15B371",GREEN5:"#3DCC91",INDIGO1:"#5642A6",INDIGO2:"#634DBF",INDIGO3:"#7157D9",INDIGO4:"#9179F2",INDIGO5:"#AD99FF",LIGHT_GRAY1:"#CED9E0",LIGHT_GRAY2:"#D8E1E8",LIGHT_GRAY3:"#E1E8ED",LIGHT_GRAY4:"#EBF1F5",LIGHT_GRAY5:"#F5F8FA",LIME1:"#728C23",LIME2:"#87A629",LIME3:"#9BBF30",LIME4:"#B6D94C",LIME5:"#D1F26D",ORANGE1:"#A66321",ORANGE2:"#BF7326",ORANGE3:"#D9822B",ORANGE4:"#F29D49",ORANGE5:"#FFB366",RED1:"#A82A2A",RED2:"#C23030",RED3:"#DB3737",RED4:"#F55656",RED5:"#FF7373",ROSE1:"#A82255",ROSE2:"#C22762",ROSE3:"#DB2C6F",ROSE4:"#F5498B",ROSE5:"#FF66A1",SEPIA1:"#63411E",SEPIA2:"#7D5125",SEPIA3:"#96622D",SEPIA4:"#B07B46",SEPIA5:"#C99765",TURQUOISE1:"#008075",TURQUOISE2:"#00998C",TURQUOISE3:"#00B3A4",TURQUOISE4:"#14CCBD",TURQUOISE5:"#2EE6D6",VERMILION1:"#9E2B0E",VERMILION2:"#B83211",VERMILION3:"#D13913",VERMILION4:"#EB532D",VERMILION5:"#FF6E4A",VIOLET1:"#5C255C",VIOLET2:"#752F75",VIOLET3:"#8F398F",VIOLET4:"#A854A8",VIOLET5:"#C274C2",WHITE:"#FFFFFF"}},function(l,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=Object.assign||function(l){for(var n=1;n=0||Object.prototype.hasOwnProperty.call(l,t)&&(e[t]=l[t]);return e}(l,["innerRef","onResize"]));return(0,r.createElement)(n,t({},e,{measureRef:this._handleRef,measure:this.measure,contentRect:this.state.contentRect}))}}]),o}(),e.propTypes={client:o.default.bool,offset:o.default.bool,scroll:o.default.bool,bounds:o.default.bool,margin:o.default.bool,innerRef:o.default.func,onResize:o.default.func},s}}},function(l,n){l.exports=function(l,n){if(null==l)return{};var e,t,u={},r=Object.keys(l);for(t=0;t=0||(u[e]=l[e]);return u}},function(l,n,e){var t=e(209),u=e(211),r=e(212),o=e(221),i=e(222),a=e(228),c=Date.prototype.getTime;function s(l,n,e){var f=e||{};return!(f.strict?!r(l,n):l!==n)||(!l||!n||"object"!==typeof l&&"object"!==typeof n?f.strict?r(l,n):l==n:function(l,n,e){var r,f;if(typeof l!==typeof n)return!1;if(p(l)||p(n))return!1;if(l.prototype!==n.prototype)return!1;if(u(l)!==u(n))return!1;var d=o(l),v=o(n);if(d!==v)return!1;if(d||v)return l.source===n.source&&i(l)===i(n);if(a(l)&&a(n))return c.call(l)===c.call(n);var m=h(l),y=h(n);if(m!==y)return!1;if(m||y){if(l.length!==n.length)return!1;for(r=0;r=0;r--)if(g[r]!=z[r])return!1;for(r=g.length-1;r>=0;r--)if(f=g[r],!s(l[f],n[f],e))return!1;return!0}(l,n,f))}function p(l){return null===l||void 0===l}function h(l){return!(!l||"object"!==typeof l||"number"!==typeof l.length)&&("function"===typeof l.copy&&"function"===typeof l.slice&&!(l.length>0&&"number"!==typeof l[0]))}l.exports=s},function(l,n,e){"use strict";function t(l,n){return function(l){if(Array.isArray(l))return l}(l)||function(l,n){var e=[],t=!0,u=!1,r=void 0;try{for(var o,i=l[Symbol.iterator]();!(t=(o=i.next()).done)&&(e.push(o.value),!n||e.length!==n);t=!0);}catch(a){u=!0,r=a}finally{try{t||null==i.return||i.return()}finally{if(u)throw r}}return e}(l,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}e.d(n,"a",function(){return t})},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(l,n,e){"use strict";var t=e(83),u="function"===typeof Symbol&&Symbol.for,r=u?Symbol.for("react.element"):60103,o=u?Symbol.for("react.portal"):60106,i=u?Symbol.for("react.fragment"):60107,a=u?Symbol.for("react.strict_mode"):60108,c=u?Symbol.for("react.profiler"):60114,s=u?Symbol.for("react.provider"):60109,p=u?Symbol.for("react.context"):60110,h=u?Symbol.for("react.concurrent_mode"):60111,f=u?Symbol.for("react.forward_ref"):60112,d=u?Symbol.for("react.suspense"):60113,v=u?Symbol.for("react.memo"):60115,m=u?Symbol.for("react.lazy"):60116,y="function"===typeof Symbol&&Symbol.iterator;function g(l){for(var n=arguments.length-1,e="https://reactjs.org/docs/error-decoder.html?invariant="+l,t=0;tS.length&&S.push(l)}function H(l,n,e){return null==l?0:function l(n,e,t,u){var i=typeof n;"undefined"!==i&&"boolean"!==i||(n=null);var a=!1;if(null===n)a=!0;else switch(i){case"string":case"number":a=!0;break;case"object":switch(n.$$typeof){case r:case o:a=!0}}if(a)return t(u,n,""===e?"."+P(n,0):e),1;if(a=0,e=""===e?".":e+":",Array.isArray(n))for(var c=0;cthis.eventPool.length&&this.eventPool.push(l)}function pl(l){l.eventPool=[],l.getPooled=cl,l.release=sl}u(al.prototype,{preventDefault:function(){this.defaultPrevented=!0;var l=this.nativeEvent;l&&(l.preventDefault?l.preventDefault():"unknown"!==typeof l.returnValue&&(l.returnValue=!1),this.isDefaultPrevented=ol)},stopPropagation:function(){var l=this.nativeEvent;l&&(l.stopPropagation?l.stopPropagation():"unknown"!==typeof l.cancelBubble&&(l.cancelBubble=!0),this.isPropagationStopped=ol)},persist:function(){this.isPersistent=ol},isPersistent:il,destructor:function(){var l,n=this.constructor.Interface;for(l in n)this[l]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=il,this._dispatchInstances=this._dispatchListeners=null}}),al.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(l){return l.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},al.extend=function(l){function n(){}function e(){return t.apply(this,arguments)}var t=this;n.prototype=t.prototype;var r=new n;return u(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=u({},t.Interface,l),e.extend=t.extend,pl(e),e},pl(al);var hl=al.extend({data:null}),fl=al.extend({data:null}),dl=[9,13,27,32],vl=G&&"CompositionEvent"in window,ml=null;G&&"documentMode"in document&&(ml=document.documentMode);var yl=G&&"TextEvent"in window&&!ml,gl=G&&(!vl||ml&&8=ml),zl=String.fromCharCode(32),bl={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},El=!1;function Tl(l,n){switch(l){case"keyup":return-1!==dl.indexOf(n.keyCode);case"keydown":return 229!==n.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Ml(l){return"object"===typeof(l=l.detail)&&"data"in l?l.data:null}var _l=!1;var Ol={eventTypes:bl,extractEvents:function(l,n,e,t){var u=void 0,r=void 0;if(vl)l:{switch(l){case"compositionstart":u=bl.compositionStart;break l;case"compositionend":u=bl.compositionEnd;break l;case"compositionupdate":u=bl.compositionUpdate;break l}u=void 0}else _l?Tl(l,e)&&(u=bl.compositionEnd):"keydown"===l&&229===e.keyCode&&(u=bl.compositionStart);return u?(gl&&"ko"!==e.locale&&(_l||u!==bl.compositionStart?u===bl.compositionEnd&&_l&&(r=rl()):(tl="value"in(el=t)?el.value:el.textContent,_l=!0)),u=hl.getPooled(u,n,e,t),r?u.data=r:null!==(r=Ml(e))&&(u.data=r),W(u),r=u):r=null,(l=yl?function(l,n){switch(l){case"compositionend":return Ml(n);case"keypress":return 32!==n.which?null:(El=!0,zl);case"textInput":return(l=n.data)===zl&&El?null:l;default:return null}}(l,e):function(l,n){if(_l)return"compositionend"===l||!vl&&Tl(l,n)?(l=rl(),ul=tl=el=null,_l=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1

      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

      8!u!V|Du=87ciH1-98ssV?kV+@=7k1?6 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�_p_{%;|k9k?j1=R-!gvBN9F-~KP*s`h{%Ho-nxg{~y{;|lKGUSvn zEPs3;xXt0SeQi8v&#bO>fk!37OEl_0W7N?F#Vr3Dg(V6$b0}vx zpOSxZ#kOFLV2A}%wax#=?$?gqj0c``FkDw{Sbow`Iqre1_<@Vu2@*vc3XB_;W!F2G z>omK)t7DY5S#v;;{oDNshkG5fg&lh{ADn#pU_(;dmamP9AGj}BC$p@dm5|V2I>mAE z+MET<^Zqwp7id`K=-|!fklp8C{i5Nu+yUO&ya%`BFGQ&a@N;i@@k@M*;t5tC<^?6E zxO%i7u=4WwELb@se!*iuheEcPW)_*6->g=v8s#V5``_%Y*0_*uiQ`2cslUu~zp~8w z#PHSI!ThNKqkH_#hUZna?0s(k*~D@dl*#`v6TNWj7Uuirbcic1%m%=Vu#m$Ag|aeBhy7s3VGU(FOgF6q+~ zA|Vpu;t;+a&+tRBp<%(FheCar-GAteWGweMah5pi2K|7^BcpT zF|N1!ed5H24>z+P=&BxiAbU3HK=D%-*ZEA>57s9C`0!fs@J;XEl1r9Mm3VjeKZA^{ z&6$GN_naSCxumtlA8_va|K~wsf;d~O<+rYfq95MuC_cc;J?G3Lp8a;r=lNLHC06sw znEv`9d?VsnQfkHDkNg`J9^|#*YG>Y&=+e+QRodd$*&lKh>hHNfFrJ>ZD(b*z#(D#TVS7~#OJB&R4IG9Y4CXx=T};wVHdQ+aRa1kjnKc$|;`-+d_OSGQ^P4&I=!UAhUTssm&l$wn7Yp6c z_>wSVV}T{Jy1`xz=`JIiimwtCeu^m@n&fvZmbsGfh+$njd+fq*f)!8t7z}#rVFhzy` z5}lDJS=q4o$$_eGXWyIiEa3HMveDtmZ{$r@b9~Tv`@kXgEqa1moSvxf_`_nhuAz`E zN`^Vgn?LG5x75ru=6S)Kw-|qYexCm!Q)U4-hr?_=hh}D-19SKPZwziz;F;z3hjY)d z_v{9;8~-qxaWuYbTYH%;)N+BK=Z7^n_sbvn!;_=I@cL-{g5MJwpK51hGJLq<^Po^` z{{iDUYYzN+c|8Au&t3TwQB`UeG?jRGCPenyKd3IM-@xd;u5qqZ+J$3IX%__D4{Y{y z?6pm}mCV%Z<|v)@-=UPXpjk}$g@r|e>Oc0H5XlYin6H^HFfMSM4K5{_1!NWohFq}R zb>Q2n`}2Dq6vsNI^E0=lCpm6OE3nzvahqKJDORyWc!ePADo=+}rVMsN^A|Iu9=uSkSggUEV!&W>fYojj z+l%-QVxb9@XLzz?n(lnzH*!A4pm)5nRGgdpi<(?QE9;v5k&UIY(l1_lET})&>;6FR z-}(IejHfrhe^4f@!ROF>cm0C9=MQ{%l=v`}L4GH@mGactGas6-n9GzS^FRG*@(*^M z*9YBCHJ)QmVSan&ANxJkbDS~pznOPj<~3RUjr~R+)7G61%iSAhY3z5D7IZ9s*W6ay zp!`v%{-AD|+ldpb1`Y?73;b>Ov2L;w+@O0+!7O7*2WQMjr)BRQbkE#BVA^!Xq20*Y z{i(#lpamj_IPOj5^jWpvaj$qn9fK*u!OIJJ9++w@2(w&a#1`Mf%jJ-8TJ8wjdd(mF zFI63?9(M#v6y*0XT4gayJ#5@`a5alVFGI$9o-Gsp>aPfA-POdkCK?f+;iSfLp)9V#@~`o!M?AMNYW6Ay8$){R7TYcl3-~9hAZdA&%NqoybMw3(QR@ay(70fvBkwN+> z>w9NL)fl%EQ&fI5WPIp&T>qg&<;lII6CywU|DSMALSxRs!#5Xbu=Za2$Jl$r=@P$% zc7xc72Br?dU2biRo64BxOp{n}S!@B@cl#GxEHiF>kzW$P_>*~$8~>FZ=_w4)H6tRL zFCVP$xG#C&nStSfwyTc+7;}9XOkX-)R(+t|)zE7CBF8g;S$xyBDUwFF*tYO*c_O|= zL(=BY2@Xpx&MkUkB5n(sXDAjjMjk)O^6qcb9VR~mo(q=~BoltJZ>d| zFjLydl`qQvhrGU7Nb(IQc2T%S_$;f-j4t=x(V)_cc3a+iE~Z~I{Hnnyeb&NeULc9e*j zYbx2qyjQ~E`pibR`6>;2)5F5z+N#U8gSBGy2c!dTSTx?YXSbTa4gY2DZp&ia* zC3ARI6tba{`#tvto++$;<K0AB@Zy3->Hqq_pGx z7m+JJn0LK?w|6$r`S=>PylW3w*2ghE{e1s`l1Rz+4MGLCzMofr;PLkK@dGQrlt0ic zH8nM5yD;~De4||Thc{--{Q~R-!4njk6$(N=+@1WLXTk0&$Hh-B85td5WKVGZ#$IrZ zbH=iG2J`AWJ4%Ij1V)Nj96H8$r}JO`L!N@(=ZAk^mpIb!-QHb9)#yd$3gb1u80TF3 z%N}FIU?as=a@J(Uo?|+K#moDhHTG3>zZ zg^kT33m#1uuF&Dr{;==Ke~_tv_1;|J`0zFLz$U($Q;ZwlFv~XZNd0xvtDf*WC*bBm zj;P=4IR~1gzAa#5$WUN3`N}Po%T{{I@%WC$d2eA-b4$&XCAQi)B|7XLqxv|y$bTY>CJ9=-LB%%(aITJsj1 z;@vcb`;Ghs4Ydsq4{_KPG8uJ$;hr(EuGvk#F;%Fhj3w$=v-{nKXNRtJ9R9;OE0m@6 zqy38)Vi{|#HEI-?<9!}Xw7IZCZbco7|9+<1JPRfZJ8U+2vq071fZ##@1G9@9+}#@A zC9pj$kEm$6^g2JGs%>pGyZk@CsAtCxG2LV3)tZ0PadXvz(!K@OlNWxq*fFo|8smoO z#SX?ZdJf!l4X9QivosiNXBg;PP?{D@ze3Ir5tD~Ux#GSbXP8%&+-AlQ+1Sf*;RWX#zW9LE zvP;-S4nDZ3>~`UnL4fs4Mk|$n(;H=LCbOqV30`sj!MtYAKZbVSe+=!Rk&Uml_tpG5 z#jtC)u+38TTb?{JQy;N~b~*gs-^@3M<=5x?_9u32_+PKcE3#p^M1u472PXsBA|7*F zS#!pP@Z8$LWOtPHO2S|Moy{$soMk+GC5PE7WaWiZm|2*YFdpTIUBYd5R>tHJ*DD1B zhp&vr@+*q@ZgKG5Uv!=&b3)T{amfRoJTfaEw3(%d8ZrM6NDuIqxgx=^wwPIUf&Kpj zq6!teWJ}_WGXnKj%ss`BC1GUb@NE14=IVk6Z6Xy#5|?f<9XX!_On-S^y=;=YQvdH?VuMZ-Ywi-Z_+!UD@Yk&2%uqgS?@`6L zlhGuKZ3}9d|(%KQ~27m;F!t|6UKWp4zQF-R&a@5S;p2Y)m&uxVqZL) z$6~HI+Y%D_ecvo_;x7?5>0q0i#h>-3v1;-H<{ge7e{kQ}{Wzf|=U4*!()tDa=0EtV z&BHTcv77>{%$uf)4fh?hB@dRH7&VALaOUDk`*2I(f-fV_giGvuz6plxXqtAiDM&|y z%Q0NB>F0x9`30zQktH=P*|z!H%)@Ykk7n zKk^n;e6Ln~DBj0B@8j{q1%I9tw!IejH(sI9X{g~*#BhBF*b0n&DdfA%=f&vd-Jd=O$Wrjk5?7iv-9Jk*7=5K8G z`p@3?r8ceN(-YYO_2>2vK5Ffkh_h#rd;0OO1arod@8$(1Y%fY5yg4ENK#jrg!IaGw zhtEdyOT4=u$tbfliCymhC-xnB@0FRY&$}ilKW1nO*|jzU60JPV3{*fAWnY?vMPkEwi#7o)Vh!rld^ zKTK^{Txw*ry@9v0{D9X3{bq#^3F!e#k8`Y9<5($G62iOY6I1NpZ;!9LCnWdGeYl%L zp80lo+JlXT{*CUl?y$sd{?`BS+~abd_-pTzCkRewU6)$I`YxsRc)`C%mTZQamJc4D zS#x0P>_t4^^Xn5BN@M;ty16ziKBC05=fTB8$?e~bB{EJJ?qLf{Sddw8K`Kn_!LP0S z2i)Xd>%tzDQU-aI>0R9*5k)acVj+xKV;sZ$TP>8MNabzZ^h9& z;U6+Ir3^mdy`noNYA79?f6&8yuA_6~ z%!g-R@8>yH#Kgn5?cIU7R}V<`+@Ig@TK8+iLp9zvOBjl8obP{-&G$B^N8;O?+iW7t z*LV*IYB4INvB{=#K4_cM&+{$Jjpw-E-Lw_!<4!zyS1|kF{hJdVqZoGt|9r{Xc4>*g zgRRZ;8(v%T8%yk--EdvubN42u<*)7={rPc-$HvT^X~!Ri9U{y#>KxZ5UHG};!ELnz zj1;k1j#;~W|JU#+ZTHj9yHOy_NEd%Mt&J>BlYGAXtIwX~Kshne(STKl>V8cBQD zuHa?jD!5=^ae{w=r0<2seG3BRBbWu&@J+cVsgTamSgn>|mQpUZB9QGPdrk>YNC$(k zIJe5dCbtDM7Fut2=+6D$=-&0uvCQ@GVQC{(o?CPO%HNrg%C!C~i>v}qp7FnyFGm#e zm`sl~@QMcTG4{`Cn*D0RS&n+ey_^?T=u}7vy)X!HWO!+9;BeVQMYrJ)ONp$&iUSEO zVLuce|1)w96KXoY>o>ckB6Da*{XyP6|9K`fZrJ~zdAeg&Vt3j>+gS)U7~n-mH! z^y!J6Fl2qOdyVAG1=I7L-Ax)Lxvms4_Qo}BzuElvI76H)gO#zs6F;{Pn^-fJG8+At zPhmH!VVTRg=^*=*X9vQ+89H;77D%y(2OQAh?=ik`v%0>{*zf~``{tPql?)N{4Q!a@ z_WY5kIDPmqyT7E}3opYHjQPJGFt1}~ihcT(&tkc{_R#|g?;jjsu&Vuk@AY{ebN+Ws z_ZAfPJ`^p;5-NGQZ|O#>5C0N4Kb#Oa{lA}Qp`#y9(WWRKE-tSFZOjID8m5|wo68@b ze*Hk7Xn|x$LxVtbW24|<=?6@&?jJbD_9Cs>y1Zd~2*dIz@^-by4lwRu?DR)4zf{3>#;Qm(=vC9?pCqyX(%I z1IHu^DnzF2s;l|QV)H<5$1}klzgbNlF&Odh*~eb7?9Og;{f2gK=IvPp9ENk)*EL%g z{9q}#%*_1ZhhSRU?CbX#@-=oIdBC`5nZHK}Q^nMKylwN(%QKkY#2Gc zznitcIrmIticns`T<)E{@|5A7eMMqBw7**)=1JkhRdFF-W*`F+wdoaJ@zT*n|T~uMMfMyWAYdJvJXhx+A%F> z*>CvCV9xHE-iMdYvLEP`ThO|9L8fck1HV`KJWL0+Xlec6uTWFj(8%p`Jm$cs>!&=} zcU*j;-z-sZHmzcUEwjD8@&>`Wc1IVVSr0`wY^wPGPqo>g;4{Yx=XWnN&lfznP}+9* z_&ehahVlv7CpC>KEFze?f93Pc@rmJStdrweAHR-0Z-eErgyp9XJ&=EN^aHC!*2xc_ zb)CzWm>-@xd%5I4hR5-;6`N08ehM#Xb4_4zhUv>1z&g0 z|MxeAVQx74yoHS4zs-2C{cD5Ugd2^)9SbIkeNZ#IpdotU{r*OG-v+Jtf<}fj8`d0% zJ@+Q(&I4Yt1=%-mH1aY(xD=Pr{93(WCd-Qx(kDc;S8(!1$@51|Kf(6qhf`j95?kMr z|Lp7QnN8&mr1vyQiSS&Ilu9_rIcpJ{>AX4yZt)968W$!y9GJTIz*F}FZg{hz7ar^IvM?4{-O{XFQ=5k7HWHw*pa9DSN z@;is%s|#KyE=**~``y41Fq8k*&eJ^6!F*EYEj>9+=RMfgb2EXC-96BpX5esq<{zfm zQl>q%6GeA@oWdEiy_x?eBkvxDw+yk?oK{(ES2S4W-sHT+z_F`b{K^fs*gOWSMO-E~ z*!CsyOQG+N@wMQ7=fD#%eN&J?;U= ztV5{{GCmxi3^KlnZP_cc#ah&66Z@GL^^uCVPdJ9!W_0nC>@sJ+@OVM&)D3M4CT|;- z&pRO9)Y!_Q!632la@2wZ#_tmj@*b>z(CqQQ>3m-E97gu8k{d~p7cw}1ZPBin(k@vf z&3Z%T!aCCj9LgDAx_f!IC<#tsj8sTJ*eKO_fQ>8T)_Zeb2niLFKpuMNC`R7;U(?bQBgW?pW}(-seEmgo&&o z%l;oo?`jgi#&nr)g#&}Ru4A_F!QRXhC6+7hb7ie*y1v@Lpke* zbV}Yi@Rxbcu^-&ID;kfR9DMz*fmOQTmY|9BNA4YJlNz6jr#SOm*r;=1Yt4d2j}IZ| z?4QKeCG8zq53uLc5{9Uk8>_Xy_1#xB?`i+MqYtjun82L&b zOypbR!?WRH?hQ5Ng456CmpnhoVI?7bMKY18x8i@Z*>A<(x`2vertAOyF!`-*TKDGH zPyQPU%(54L%NJd=&v2j3u_2Io*H-o&2`mvi>rw@n?yZ#)mp_%jWOMHE#lOFK)X&{Z ziP)ZIUXXh)yctgY6Ud}q&;_ai|# z(W3gB;o+;^{f%F*D1T7UT;Z&zarUT!vOc?w`#bi-cdO4g^zMIuz57BuoHB2jeIxBy^uGOPol`ZHVI4Eu z(W}xAI3)E8uK4p<`2G>vVaT*)rz=B+-~Dd$e90?Ymr7dftY}o8B`>+8Q8(j)iO>t7 zvJ19H7o3y)5h46QjV~}Tv7n~uT597b8}1Fpf8};?&w8u>VTW`AGk?g!JB;tLSoyXv z^6RkWO<}y(TKn^n?t>HeOWAl!10O8B+I1lN#670vyY?HdVC3IWR<t{-2D^ z-RuR6k1klh_Sk`M(iQ5)8$KT6+OxA|cDz7E+5(9UjAgPlZIb#0S^sPcYClUSIQNR) zcrht7h<#l;%e%UL-{(HOzIr>)g5DSU^X<|qm~%dC{`>!&f~qQ`-SPfb;T;d;X2{vv z#7drv-+R2^*BxCp$p=;eVhQdZJQY`G^=Qa9@1D$Cu;rEVhK)b@cAV?)et2kW^@GNS z-TZMzbC~aK{KHd`dM7?%`O6C%Kl6mO`x#eAoM`OlXFkick@<97K(c(u%)J#q*(#>q zO@46YYyE|y7`6+~%rDH!yD;Hb{sSRK$p>mu`42?4DHJ&KWN7wJooRP?^6~SMc?|uh ze|~*x$-KKqrujy>--Ed)V|doApLu}2k-MYNa8KRmE=Q-!Jqx#(OmED76~)F}%J@L` zlD&k5!_@5)SPmcNHka7Zn4aJ_E9$&K^*J9lzkT0%^5tWb1*U~2{ovhm)P?5;M_#5! zVg$R*@j!u!Wy>ba(>$E}px0`F;O6}YwuUcQoTQTa^g!XCcW>F*#2&1xP@8b`%mg>K z6@e^SElpP69;n`5PC6S;D2%M zW&eT2l@3qYfB0P8-{D)lK=94}3w$asGUNl=AHTmZe?fB9f1U}RE&F-a9GGYyaPzC^ z3_pkMf{ku(_A%ve`pI)Akx$FRAzR|$>|Y0rofcf0$7%GJBQ~GUN{DxhwP?umCaJ6k zhdUiNhc5Wl!f9l{Y$q*Xvg-?fNV}t1t3jjniU||#C)i}j+G-qbUT)`jdENhosnQ#^ zu!R4$lSEU5nKnAyTxqI5F;L1YWhg3Jg1A1tll@lZZmKhwc|{~vaK z<)&GC9`q_d5VmQU_)Yjq2+LCCgi8KdZES7o8C&MDO4RARS>W5tGl6&Qg4-Sk(hdKm zHsoyjdz?XP&JX69@7Vc*n%nmNYp#;&nQ&1#;E02}?txy`gv0%kJElFbpTH(M#lDeS z-_gCTA)L9P?5vSNQ@Kr}R#iX~ldF|<#uDx=t&%3T+=mWGFub*6HrI3PwGZ%rV83KK zqvbK?7m5k_Tp}yi^z=NKyyyS_<{p_QV~!U-GHgB!S%S@Ci~lpQF_>>CJj^5whxD9E-iiQPnr znTP*^?6C!bR&Fmk)GDs@b3O_WNahe}Sg^7v;7C*1s|G&1w3HUPaOSwkeOB4)j9F*@|K{c_KVju`;*af*9nt~4M_IB@8Z=b1FX-b~@%($g zppgz=)`G_6+Ztc}b2^{>hdplIF^+ek8yL?gFsHWdKk#+>g1NnC66zV(OEBq1u&F)S ze_-w31wzbwjy$k0*&#LOv%=+j540crb6&RAv8>rhD5IWVxa3OTOZ^?%EP6Eu%1w+L zg=CF)Ol8ZO@}JSP!Eu(u+Sr2QZ{;gqN!3`hotPKDAiLS2eKnKtXL*lyd|I=h7r=AjM_SpY~ ziT)3Pw6qKBG}#IoKr{24v%dZ3jXKQewRi#R`2)vzSBUe;on_72!?1gXppe;vxetAK z9vsZQurB)po6>~V1xGJDC`e)x|FU47Rfg6d`3hgH3Jc+w6$hsaHawczDL8L|qfS7{ z;cLJDw6-z6X{q|KGoq(QLy|${{Tl^)rnd}p-M{}4{qRaRA^F4K^)ZS>V|0B?(KHWlMM=Dbqv*AW5FI(^pjgFiCiMd0Bj2CL9Pnj}Z(!%DPx-;cb+|rW;veJkxt0yz-~3|}bFgoG zy}DuZ5}x!1cHQ~=YuXvN{OcFqu_890quWus;=bPe1ty2Ttz~bxyd_^^Uwu*v!(E|I zoEBTpaL<{=pnrnREa5*x_SNtMu`A}^V=RBjbXxcVuibpR{fzURj~`0N(Lea$ZT7hj z;w2etw;43=?d2?}3goeH{mE3}a#phK`}zBg+`gKgacpr9Op8uw8S$K#+n-qR|DANf z+&k)R?*0FaJvufsm2>Q8Zg#0hzmm8frSr}svofYlYX!+KHz<% z)D4Fk_MAISQVk1|%kMF-Kal)fkZE1N2%{XsUzr;Velpsm2TX0`txA*6&{cbJpz^^v z<_8O}$MD=a@QF3zl2L;jqhoq~A;Wpbny-IY59=pba@^|GWRcUX-_pc&`1tyIiF1tn%h+W9erC6r_3MXbK{CgNi^q8GZ1^r}vHCMx#q84` zji)!f?rmtdWX|`m;+L7qGS~Q3%F+W03^`l=vCaF$>*deI#l^E~*8#zhiNz0Y8y$IC zDq+zmYwg!||G?L!IXqIUjCkz#?PK+0+|TTHxSPp5eoyKSW*dfIKX0$+Nk3=HF4wKh z;}b34xO;28v5ZaCB*$=`9T&MRvc3tIbm$iB@^*1)X`JZJVDYz>zryB%{)3rmb9n0a z|4m|e>%l6j8k2LNH|#*8pxgsBu}aRk54yn%E>?!RS_XtM_uZPCQ1SB(XLHXY3Fa5m z*aO^HdL8On?|nJQle3_hLAoEbPUcg4$>N3I8fMbG{fdS^F)hIdbYt!$Z{#jl5P;yd~#!cWAJPZCg;qY;u&%l9AaW zlsoG{Ltkf7T4IB&1n)dP)@L90`%Jj07*NS7^@kz%5yRZ+CmHYX{(1J?+9UFlaM4z& z38;b-&Of^P^+K{|iekc^32>)cd2+>e_-d?u@AdEA}z3 zJK;mS?xvVWgr+jEsoB5r}fkMI0O?5y`v*ym(1`JUdyXzuc-eeM7BUq>0N z#CW!7NZ7b?XJs2WPHS%LJNb)!&3y;y)C1m29e8~MY#7)Z972U&%u9$^%r)hkEJdJ;m_pyG#)2e#K zQvDTc8O~f@u(D9>!ksVm35|?dZ=0nGe0=^N6wX<&_C?Qw8?7cL2X-en@M>H*AoSyw zs2|^nX-NT{{5&OW7fQ4;cJbd4V(&fgaILRVN?^e;!5{ms**~zI_~4YV*>&DCKY141 z4VZAzDB&?z#Svy}<`)~h!wRy$N`DB+xu7Ajf{7)3RlP#^*+1>qS`}&+oDwp5`djwK zY}VMbtgEd5|7}|1%QE*U%dA(wm~(pmG0Lvuh&g?T#pYGh#BSM3w|_FmJ>uk(2ykKv zz3{;6mwZabPx~F#2U+}BH<+e9czw`;m+3;4V}TRPx>AN|r~cPBhgCVcv;A+Z@~C&z ze*0jt*8(1{EQ6*nuBO{A4+8Bx7#U9WEXXcW$Yr|V#=`dFgut4M40$&Unr6#B(5!S@ z!ges;?Zq+X3^$hb-b`5uOm{m^Ggy5Po*~qr+`GWJ#gUV>u8N+*Qqa zMUUyLnPVaUtImc)j8}x2Qd|B{h*P>T{r^HsVUw=!{JYliYkZWCc-U~=qM_Yf^1xm- zwu0AeQ;ZrDxuWz>d=S5LF@fn7t0Z#}*Q>RS;-8q@iydc9ketEyzhNCClkedsw`fVl z%S#m&JM7-%c>PJEU&;UDEbp!xHY{s6$iD1f`@FqJj&N)g+rltY@XBvCGdl;rf9#$X z3+~CU2>8K&?&yNY{0+VCYyr$dGcGzda_Vex2$nstRE1|j8`p~I{P!%Fcd<4IUMg%f zNnJQsK4Br}EtL<=`Vscv|9hUr!%|68AiOI#7M1{IFiV+@O$)@}L4S7K}ZAtBxDfuP2l z2foq^+`cI%96f)8N9w6ynui|`!#y*`7-_Y$ymOeUk9~N;`l0Ur>;8k*7b9o#;7``=WsS@q3fys?Z~u4B!S1#8!zU$8`rMMn1)SB^#v%R4nTx%dNz z4l}&k(#U6#&a%$o*+UjTU#9-u72kg;S3H@{T@iaL{J|AHjj7tFJq=vk*^E7y`TwS} zm0kH)_n#-mfX606q9R{bzhKG}#SdA=2_G1jH%m&`?A;<6b9Zh7?_PPH-3{G;*2nHV z{ejQImG{ka!w-z^CuTIxc6BJ^*dn_pv5CDxPin=+FZ@#P7PLvOC}5TStHftBK_cd0 z{QhGf-u(1#TYliIVShvTg~qZX`-&eDHKjABv{*LteK;|}|3I5&My#TI!E@OahI~=S z7>u~5h&eu*-{2iGqwy*43c<3^-*g{T$>y=~nu;bUe`WfyjmI&8oz=waBZtM*zb|I; zTv*$6;Pq#VgVG28HSzU6`^6Y@`q+sB>~}sSu2_7G!D=o;$=vz7xHcGa%$ZildB^dG zbVbGYjhm-Sth-lzMuE#_$*=dVr$N1`1j`4anNA0s*UaDl^GLz3Q>AUp>W#b(55D~6 zfAH%?{DIfcMMR%SFzs=8uHfY)cADAx;+q4L z>-R9%y7Z8Q zif?~qne{j5R58n>*0AK5G)alwIUp?Vz|6Sd7_Y|a=4l5S`uZ7jS^n_Zc+7cdzeJgL zk)w30gKTcVL}ocomSubQABbeX;ARx?kL}zmru-W}4<6uOV|pXp~QZ!CK;KXSnd+yK~zPNI}TV_mFkEgft7FDsWuw|4w$P};3 zK5Ow`{#lHzXSABkjy7Z|Oo(>mHNH?f&F6q7(}k(!4<@?16_oPYF*23Jo2_9yae^sw z_xUgEB~yisnRCS7+h@#W$+Bp?CfxMO`NPkq1ev>+SXW4;D-n3T!9X@8|N&TE@n^ph3O8;k0*z1FzeIiT)QR zMh6t~OZ{a&D$LP*hUI$9e}%828h;#1rB+BD<+Ey#xpIJ!FXK-d)A~s)?Z!DTMJre& zB&IJ&mDbsRL(;*RcYni2P<_*vo6O=@Xw1y6ccY=X%)T+Z!m+pZ!&~(OyC*m*A3CEm zVY0SE<|NiDGZKGruUzoYNjh}FORW!4ObN&Sd}c3PWwN7{_YA{=;w*=@rs#_YT#qj> zt>0E5*j zhN3#r46aF>Z_F-O)=&6$*Z#x@Q)Xf25X*|?LKVX2?LROvuwBRy%LtccjyYTZ;g;Y9 zBjyh$Udo@abY0LVxFV2c-l@O*oZN01&Rln1uzr2w(Chr*#l!LkJ4+sLA92if`ltMe zy+%*7|ScQ7~gl>9xRdCVf|UUKz6D`bB~DmhI4Fj_c?5w9>2bR zo#)K^{RSOgo<~&+c0%$O z?hhxF-5vWwmw7+KyK}XSGMpl;^Rm^sW8A-sSeTyTw|V638!5LV@v$MZ@P`bJ0Ljwl zmqH)hYrlWs?wWkbI%fX0&z`0+zFQQ=7XSB~u*KIijB}KpGtDh$>#@I3r4+D~K`OR} z)uy_K*~01!zs%0vTsZ+;+#8KDR;@OiV_VqHSkkJjo^e-AxIkCF;K?iD3-RaU_a!jM zdgyWFY$-Be?tjV9x9w9=ag(%NeWP{Ef5xkY4Q8E;=kNb!ka=1A`=RjRoyyB4w!O3D zc=K!{)B2w30|n2%aI-}_=dxYUU?^x*J-oi$UP6v>dENTEbsRbD4DSCMrRyD}pWKMB zGiq4IEZKN@4by=wwg1jkKG<5bUn1`wd*2Mk%Uf1%v^%W)K=1Bv{yamC+0sTY7_UFv zTgMPnuFmUYePC0cWJKS-y3f28r?}3rzB$lqc|bGo!im*O6!;JOCn*0jE@-s1F1TyD zf|*Ziy<_4R@g1v$Ox_-6T{EZUr)y)j&i#h+gPWM8=P(^e&hz0lmFU@$B5Bg-exjiJ zW5YFDhWAy|QhqSXEPT%JF5?Qzy{OOfH&*^-J!3w~LZ+!XRykJRK zWc*}DFTX}clg*zPcCeMb-IdO>?%On;1=W4`nag9m7~L&IL+3GKb@ZR`6$tf9`(I-BzM(p#Mck#Tz)@0MeTaFe>GCfUh*!|+Bgu`N& z1;ys?@9boa5!XI@;Gp&ihFy1AO&+n!eNFnoF84Hj1^={F`eUD>^0ajpZe z;)fuE1+w)EzDoU&aS%JPN#}x*g#vZ;%lwsBF-`d4tob zlz_*aCaUL{vJ9G}92|Irely9$rZ)9)H61(daC}L_^q9t1E*A=m63iK{TQ)5#aWv0q zFym-qi~Q&KO6tNQ%L^PTKbRQYR!D50FGlkP0`tsf*Co%b!ctu>?JbiE_vFV={N#&gq|W51nYc_UfCV5o7i>6%!B zn@2<=d(q#2-|=`FV?T4h;h*QpX$)T{)iJgE&TQmm zGfU8ap#Q;xHEhA{{TrK)PdV^-*@CZ;3wHeA&&m12+8e@X_~Mhv1=i;aj?U0oF!_2T zC&QL!+$PWY?|3oDyn)%WUeFEn(r*u5ghkQRY%EnDXFr|M~}a;})C}Dfz;-!u^}{7US3E8w}Zb-sd0S z5>xrkeyf4${VX=#GA3@%vV_IFTNd-#+~Ud6Y(AHq!nBNcfx+SU1gpQ?bA*`IZ)|us zFPUMjKg+D2vKCr@#4TL;qKvs-Eo|2M{Qp7e;sq;t#2(C?zJPgtqamZtg$8vAqZ;Ucx}fLrz%qP+s>FgX$ByvJ z$TH27|Mpe%u>L%Ko;?S8<+xr=;t@O6_Mp0YKSTK~ySmc(58t*==UMhhj3-`>X}Qb& znuG^a6WIHv)H2=M$!X&=4_xsRsarN}=jl4F65014}AIQGdFjuine!=1$4YTbe8q@YAOkj|!|HL2Lcyb)}v95DxKKH<=fh$Mv!G@N#+YJw= zf9vN_-^SQq`15zi!IO*@uQard7kv98-WDz&Z`g26Yt{@+gN)V8yG8!rXIh?IXMAVp z->$@me`0z3<^Qwz9p1zw?XthIjxp@gfg=7?-kE%^LZ&1tTy?#kA%!}4EE;S@p-zq#g9X5G5de8?szR*k?>yr z!7|naOD(n>n<7T-aJhu_|F{bdvkMnoK3e|Z*46I^1b3f4kerux?*6$CU&RZgCj8Vt z-0Yq%S<#r;BwR6dcE3LRhQ?BM3)?@<54j57-u`aB;H5&q;!o@a;=0lWYaenaEcu)G zjpi?{*#Y-M`#AqAiWVn-0vLB6+V_D>6au z_YbxmiA-A_KD4(kuzhUL#w+_EuQ<^3L1mM9J3udU?r^#_!DBOxL&BReqiNkaxqLTigE1 z92S01b@I)jiniK9x$EMWO<|G{T}`~hF&)SK%L4NWO64yYS+IeZsAuCs}TO`6zEQ z_qX(okIYFALbM86m6%@yR9)~5{@+;n!2ZQ9{|9drwRa?+J#>IcXaCKH*M;>ArvooM zytaVXDaK)cWB>U?wz<})&oIpT^^gD72F^7Z^^Dhr>Qfok-DWRe)%Z)&@&L2;0%Otr zOyy0Vnf>(=nB^?~%SIe)PV2hS@KQdc{@>sKyfxAMFLLYy{xU@^JIE<>^#|*mUY7eW zSVE4o%zBo}SXyRh+~DS9+3-_n%Nq788`*T@nR`15o8INJ%kl9=B{9B|`M`MncTt1B z_>Z#;R`&&K{>mMe|DY-HpiS<@ny>^bwyVku%=j|CO_|y`m2uORPR=SW_9e-DyG$7O z{NRb`Z;(n|P&(^Duyn&$krzIx7ZMKWCtPmkwpjIve~+;EjXnmwcxL^z$xL_od2%9{ zmv438HNUX6{(nTn^na{9+jm7NGK4$mtj_uu> z84mxIE?CK?Tp)a3|AMc*y+V6&GutHxY1e;Dx0&J{(=&@0-aD{-?Qq#0#NT@RRu4)wTadbDC zv0(S&1=3aPw@f5 zG8RX;-qbdWPd925QrIw&rAOexEW;0?rUy<5U6KCJc<<}s0}PU!NvxL_9OGJ{$~W7M z)m3^$AnQF5<}B8xDvt$Xy22$c+*1l?Is{LDaP>FO0$-U0KD=B)A2Jj-G_a*IJb1b0 zz-3W~Wb*^UKN?vXnME4PKRUUuIB@-hfkPGdhu|9r57+-cxVHYsTg?T5hxbn?&3#ai z*wh!%RHewX;G$>R2g8yFtLq(d?E<>zu@?2oW;njRUq9iZ#|aUmFLP|u(%4QY#hwT- zzw!V7LP+umTV+bFfq;a~WJx1tM-?>eO0G`b}@&J^6UTk1+6 z!?&{ke-oI}3j!({FEOP2lHcSp?Vex}MY!^=(4RK?b`6th1IK z>~3)U*~C~RuVH+lR_DwFO}+w~=IXQm4=SH|z-E}iZYr!2cR=~z0uwf_@)I)F8Oy|N z!no#cZCj$Ec47(lj~cxMDc0DjEJ6<-K2Bqh&Hcc+{GjPuNYFy1H-O!@KswP?m0 z<{h`Ec0c6zu-}mMo9&L^AK{9{9Lff=Ma<=s|1s(n{b%gqzo4<0>4O=krlDX0b7yPf z^Utz83rw4h9{u5wIq)?x=)mGIhw_uMR&{e8-urr;=T#Qd0p+BBhHq}yHzuB5#>|s+ zKw92KwNc%2Gqd^Df=;6X#=m^CPVKLH%C+HRx%`fWj5}Vk+<3WpyLr-t;At%8N)FjA ziPnD{cE|j0DDVEy?w8Ef*#CgR_wPN1dtyr5bN;d3?_-z}9uSoBqv*eQ#VdD~8y0`g zm&oRbW$@}`RDJ(=S^Yq1!Gh8(A07p}jPlRn4^~{)e!wQ7_&{;r`Udx9Hg#qE6(YR? z1tQ(-GVdR3=5JK4QadpB)b|GKr1?zCr)@O}Ik4Ds!6q(~?JTPp94{X_bAaoO`G!qt z?7mMK$|dXnG03cB_hbIYHtlTwea3tSMzKfX>+Z9zYfoW#`;E!G$x(Kr{(*BJo@yWH zRh_=h_=Z)Mfz6(B`5n@;L~R7Vf4;8%;UN10-$<@aNe?DA_a8X+YVPgtl6nkR?W-Br z)ZDN$jA1?Y@woqchh!ax+WN-Dd!9G)YDcn7h~CF!z4iS(yHtz1R~F1G4)d*vZwS5~ z!&Bc_{6D^dS4i=}M?)z%=BTJ)CDzx3u<%p54^02dtl`$n($*) zhNh86*G6L*+lr2Z0pXJ!`76Rdls`~>cwiaRhf}-FdBPjt{o>qnwXIjQWd29<2OYP$ z*)oGG6Ba))KD@Fxyup3f9#(zz${#-@n|oyBnNP^q+x%nfZ@mC5oxWhxWX34-##6=ti@9Px7#KQ9SuIF4 zIdIN?#af14kA!UIa@w8dk67Q}*Tk@j`MGfbv#`};CM#8@8a<8^JQoDSR@gC|oyK_C z+(WnGy4Hp}zq!}!c4St#-*{Tw;aQW}`UWX)h4O}LT1L&Uk{0|vsGiT@zH#OO<-Ru) zx`iA<^)kv>uRLSWoysV7ZNcwZj#&<+wkK>ZST-;CI&%S=@Crtbxa%A;H<)%ZZn-CL zX9CmRc>bu>oF(!r{21{2h7s)S7h`B!q!aQxMH zeRtD2-GBetYYzN5pFcrWa6{D>{VjSdt&%S!R?I&TnE#>B;lMBMC-N68Pb=76&i9B) z4f|-G$DpggGS`%K*E{Z#iS{pe_Rc>r_3r(K=&c z1jWzNJNB_|nIIAK(a>R;jN@0c9Sd1!DKY5wq%^FV`0G4FWHiU3gXNzXg#|O>KDG|c5uEs=RgOOz8QO8Tw~OmHwRww`N>^ieYyXjF zYK7_s$tkj1w)G3nQI>GvWGj)Asc2?nPI;)aVmeFY6%HxR78#b)JbU{%O=@`eRXw)P zSSEa>fH8LcF^+Xt6kp$O;N^Xwp^%XwVe^E$#JuAl_qhdnM>6o7+_T_e;t9Xh zfN;($Y>e|Cu}FEPHThT?HK-TQJYa6wP{psa;P7@y2lcuJBRk`YzdSD(F8+UTgrh{< zU}N(i=6g?BZ#`tqbvanZ+U&;Hn4HU#bAX2{>OA+nTTN*K0UH|5mHlCtUDmGSl-6)w zs#!>Cg(PRDyrUc2LFUp0$9~6u_$0R=d!hIg=F1E@+bvY`|FFLgVKS9dXq8$rg?YEA z#V77nDvmFw@tUM^-W4@+P@#kK3Z$dmMd$8uX7 z+8PCG^prDH^(%HsURlwm>ygs3#+>E$X_m-(W;>A{L8Gsy&oJe>7&|^tdvU&I4={`@P~2kd{(`X|Hd`UzrHGO2tUier?!DVLb5sUrXZ`_&yQji zJtyTJltw)Fk536;maAC9V59WJd_&Mv_PlEhy)ia>%G()B0<1F5_{dps3BP!KXu+!G ztTE!H^Bx{(wC1UIc*qsy%_8^m52MX7*9J$93hl$z55DI3&#zC}QSnl&;;pRwe2Wh< z+vN{D_N+6UF>@93`ujz!a%*bDb`<=VyRd)1eq!yDW$|4C+;EB#&E;!?q%6RK^(>W%Co z%;wu{*yJw#{(L^2&9t)g!PI=42c>JCpN~zpD1OG6u~T@5p@6^}#y$5VraUzKpkwtx z)c?Sd?_ZDef2d4bprWCrbxMI{&bwO1I}D6k-|HC4y_^1U?K&Uk;4y)*B<5oHgA-gC zPXtQh-+dNe-%!Vp7sB}Ml_RT}eu1o_{09k%3!*g(c85Az|Eg$M+%> zz3G*=u4K7k!7^_FPtW7~2QF4!_-L}=a6T(*tAs;u7$;{UTd?s1E1N>a4<5YI8}?Lv z|EJ8HvDRRIg8_4fqD02dW53JSADGK~fp7o)16&VIz7{_)@ydFh<9_!Ochr8@W!5g> z`Y3M_+q~}mANDmarVYK?xu%*AV)xB&_%2b;9{2Ja%Z|2J{LK>=N;OYf#L#Rw;Td~h z6Gyiv!}`zF=Qn&m;QHXK2G4`l-|TAH`}COI%^bf+H=h$uX6oBjz*N4cY1x|p3}^pw z`J|t3+?^)R#4lRUIfsocw8_RitopLe<&7*Fx- zllmaOq4)!^h-P|)tcQYQb#?bkjSWMno?V_+~=`Cy@B$7lGUv~0UX9)r2H;U9L{Hl{TX8?5~; zZ|*ZpS;}hY;=YsdFlWWKCwt2eNM~0_^1Zb?rl8AuCxOL=>G{dU=?4T84IlhmaNrIf z5BCMOKK1u;%+kFFCZ<_NZjj&4wEW{iQN0Wofe?`Kq^~?0;`Dwhm^(x=5G@$8h`$iE>OPY{@|EqSwiwm(GEvx5y#mx_BHzLWtgVA zV50toNpb5O1=~!y8z=&thk*DS*?Rs14802s8SaFMQc`W|KEv?e2a=~La2iY(WXAX-tzP0lY^ztP%bCz^*yy&tCd%&Tf{i4U^#;)uO zXN0t$G$dVM<2bQ(MZosPOIj-~vdLJonKImTygX^a)2IbTVi9ajmtu;!re;? ztVB00;l6Y(fyMlvLpDd_SGyMxdTJ+THZL$^5dL8%sP^IJwlh5wy4dc_VEQFovqa3` z&4KNo8MyN-sZ7gzp;W1;~Sn;Mp#a|k}LfaMrVRwz^X;y*0D zt&FqZ{%>?%Y2Wbt#a|XZkH4RvvNLDMUX#CYMN&EC3&)jb4SX#PyA>Wxv(iXvkf<@? z6khU><@N?fyLdj8BRo61`D}FfayB+^FEVxxYipeLsCm1(agz<}&4-*`HVYOet9@wl zWc$#;yF!vzY9izN8rHS%IMr%{>pSl^wsDXV?m_ID3#m_HXkVb{5$uKV~ytxxnnp+s*`9?RUjEJhMGNjz_A8{OIeJKo{G#O(EDe}m-j^ZFjnKlw9q)mJbu?PA;$$YSxA z{WW8wnN_1y@B&|-1*V=0w#F`a%J%7A9BI3gQHo3*@%fa-zMlQ*K&VRy}5*b_7UfZ9D^1fl}w4mV6Uw$JY zu5aQMujDHjExEOsm(+fjFOv9Lf1*t*AX#ckyrc9M1<+x1c8#z9J3P;+{q?c)A-{)w zLFZ9%h1v2uwy~G|lg`+D)O$^dxVN zg%_jy2RYkc961Lz8g?+czstK*$)A&9!@hp&M%(&6w2qQ0&9D{_g4e4E*0i(bnt_yg;DXtQ?hNl5AX`> z9MI(Tdl1^TKw9(KI$I8z)Ia<(l}}PD{(n$qK5hKqYW$?E1D_u>JU`87o>arAC(6Kk zm2o;B^YWRI5?{WCN-j}hk(kFMt^Vgg>!$_h9*aNdP+3v;i`TY`BV=mpm z4ZDNv4Q&|KF^aI|&0(1PpWSY;&FoFe&efF-vhEl9uKoY7 zklo+fc)a}&i`YJ$1*x(J1ow#_FrBc#=>OaHd>(%JI|&t^zVJ5hnPXAlbxSHJjA41f zT$!~Jag5SM3l7h8RBpfDz@BW(eEQb)1FyB~8BRakf8eR^q^1L_-!-`3`@_C&CX1}> zN0A*1n_HXPAL+i&j&CNJ3+RM{mw zc6Ij_jYzCXui(A&GKbfOsbjYA77-SUyWBBC2N~~tJ;7w-%)f%QB-M)f37g!56T%nd zE}Y7Zi@Tt~tzB^HhwWkUz`O??SJfYMEMqB{a<=2)YkA4G@9}2L<|4I;3~IIyZuvfN zJX@y56E@9?XZ}5#6o%NP$Jy?5GN0N%zfrk*!6~sRZH}V4FZ!Ow?~gOim|0;|z~MJcnUjaEMj;WX6)%d&LhP ze9>RQ`fDq>=bWppkh@`- zAdti`_v?x!2abPu^i-YA@n8IbHYMifoztY6H4N&DIsYVf@EftOoBikLhexLThx`50 zC5|-Cm32<|5qf2-fyRrO#w%vbHvYrbXJG&P+oXr;uXP_J-rX*#(ir}6rj!)(_56RV zud12tcKngfxc0z4WwLz61(q!(3^j)sU*uS2R5GqIK9K&1@w>_{Sr7k>UElB3Saq%Cg3@__$-kM{&C-{3NoU`50!E#>H@IV@? zBdWMyuSX|MEuC%=gYP>dbcRbrN9X&H9`C zfT{hc_=8<%>L0wCD`<0x<6a7r&I`#z<5>?FS=~NNOn7k7{(}zxhgo3>cbZ?xU*NS; zC{(*~fLS@^0Y}I|W5>I!b`CG>Q(my$ImoUn#Clb9!PlMzTi+d+dBlE!_REG$#y#rH zJK8#>cgQeodDG4MMC?M^sr?g-bN(|==lsi7W>e2(?Y*FRpQHDey2fem8?R3^YUoc% zN=|Cyo5FBAae?k#o(HC!XC5p(`G3JFVUt75F%M3&*jPRK{rmj^;h&AKBN~*O)*LwU zMf}Etzo(gQGBEg+)c<$XuJcG}vgMY#$I5^GU%UTQr!pU-2JxfK?X``Zd{aCePdSK6 z2tT&ZSjsN7?jLhhG@o22b8ktbo1Mf0QB7f!2ad%*7t9UQIWu9Jsm23`T;&UrWeZM; zZF$UpCHn`bR1PEW;U-o^PR2bP!Z$ovb)Tg&_H!9Fyua|9zt`tP8N-6^#+f2h8V>A^ zI@p_ZBJk zn0c8TrK;->mK!ulXC82B72F}$J5lhW8S`pJ(*^(jv-|&N=s(9IKat_onF)(K1bbaQ z4vWn2Xb|Ok5f^>pmurH5tE34d!<$Nj#=c<2v_tg^E=E7twZC3K_`q`xrnBtt7qFSW zkeGRZyUFq42^LLphw1X5d5RkiQ*A0%J+yu!qaD%6UTVCBog>Pb>s70vgY?1$O>BD< zAL}1+xX_g8vA9!kk0FQ2QAW8&mcEw1%-3=jTyzXbXSC@$#uBxLC&q~3O=(l!M8OXK8R(Qzo z%3?7&^__c#{3XLCnXk+-k9c{?6C6(;V!Fw~bZaJSl=~FdlUl_e)1c28qrZIF(vu6+R-gFL z^qlnrL+XRZo#*d2`)^PG@r8BI?y1r{)_HL3_+Y1XhW*Czq(p&d;_PO#mPpv`sXzST z*-vA(O3lIt3wMeg&^#l5;PBFTV~)-)0}cjlXU0Un2fvoiKXB1h@xj7FYj_F|NQ<-_ zN!_&9<4;~)gFL5QLakqJF<44Av&J~$j%-nDG^DLOV zz3ITjE%^ud4*5T5%Fug|xPC#KeZ~~#EpconzP!718A5(FT>r!%x!!TQntck>FITxc zg4OJIG7d7waIaXjjBii4c*Xs_N=o9jvRGuJig#hB7>~n->;v= zAIxmcZ*+fGleDAkvmo<}16gtR+Ih;3u^nhL5&p2pI> z7#+-5bM{W}>Tro0joBLi}q0~>cA^g0hwI&09Q62Xl>mN!LI~(;r%(9fsG%UE4`uq{|JjS0) zCT9;EV9rUXXZ3Uc%b=&iI(Iq8uB6v5g%jEvxh2XE1e#Rp>V7BlHcXkRk&zfk*{QK%_p6l;znEXQTCscfVXI+r1xHvSvl+!g;$3C!C+0$gRMt9;O9Sf z8>wR)`~p zDCZetd&hJUg9fRdHwSp#7d#F)P^u_huvjr8Sm4D9vkT8!tZ)&Rm#j;P#F3+lr0cszHyd6rIk1Fh@W|FG_jmkTlf!?HG#_QENrWJAt1UsG<7I=?_t z^FrebhujCI(>BcXJ0W>!f)(GMO2HXy4$V^@WQRFUwboR( zwa75$d$F(P*#84NWfKl1Ft3yR^ZhS-#Y>Tl|4c7(oC`wvdDJiPVL zHm)n{7~ZzAoz-l<_HA>+x**265&y*{W-r(#B3;m^CcL5ix46aL-|`hR9`HX9IT)Ux zQ1_27%7VuxnD%cQ*dR&aSsY zmc`1L^UjA~>^JXn+?x4W{!RhY`V~nG_ir=Y`}$LUPpy2(MpNStVp%8j)B}>Gtwh<2 zn2nYH@I_o$Cw<|=8~GOt4=y;SYyM%5$_1yS3ntnt(%5HyWQ@4cSf#gMVx#?mqiY{r zvouc0;)~g7+|VSoW!?nIn3GMvBo{nP2uK#N(fPx_jgbn$rxq|Up8VT7uateKwTK1R4{4(;&ZubitglVwB8}Hvjhy-ne{yFz zFd1gB2wkaQny=6LYG;EHdj+rBi>^Yk4bcj|87F4wR2!055CS-xGYky&|Amm z;l|#tbhyfC!NV!`6TUD>`LgITu~Vf)(Eb5&aW;A8c)`S3ErN!M#h<_fLq^ z-Efgh>LuIP1joy77Hmjhe|w8%S2u4&gAwz2??24@a{kKi_yta&pMPKv%bkm>R;Y02 zyfI)l54K^wzkM~soPB>kKV?3AReHN*-5&eHAFg@`-|!G&@(b2Bl6aMEe5d{g=Zk;- zJPTH;n}t146H3_k`^!(;<{cKw&E1<>3z$2!KJ@HKKj15U;I~PmvU<<~wuL$Z^=xus zyito;XL>|%u?$s%=*c^X%clP!NTURbH_0n>%Z(Nprk6F5N z!6}w4n}6L^zhGK@=RmaOK7*Q{|M)FfdFJ^2{Ul#=;PXT0p=o{!X zKIEKrc0%YRW;wsJEG6d31y6V?Vpt678l_VjUw^#OU_HN8lBIQLL$Bh3{f)e{ujj`b zb}(HxFJh1uU30*f^^VP-1DVNk4_3U5Zd-rA&0>X-7^B?oPd~XgZ2tM(_(R5m`3D5! z`Pe)aT;A^{IVqfDSu^owrZ{O^3bad-@XuVUfDC4a&v(4cBGj_WYXg@WssU2b9a|7|&<@ z;fl%DI5WQwAYKKqr2TM-N-+%5v;bXhzjk*SLB|jzCe3g-07iW96;L#1w56@IsGb11P z-K*zWKR-V42eZt~mfjByr!2$*Sef;-XDU9Q)gWbhfJv$()Bc6Uw)z9}?$|%rl@*qd z$`ciL;3)eS=@%9P34ed^n^YfWdS%_*XU%w3W5G2cY?nEaD{OE2SUX@_2ifM#Knu3z8TmwaT&y3zFKG@DE;7Mu$JnaB;~leUo}==fH4`)wPCPhVe_~?R0jt07^-u7~KUr6iu=fN@ zW@qz?{}U!Eu?6fr#}j3CkR>YqXFp@nH-!t27aY^p=x;O&{l|87 zbu*c+S|2F+{QI!{g@suM4z}NaklY;6=*{lXoBW}b*`qF<@!K1R(=iU;ns3ED&<<^U z*%f)yfAvH27gbUhJOl%nrB}Fe%}QtUo8GW2roM5T?|;@_EynYK%wG*0+nt+gKJZ(K z{^m9cV(YU>&}evFuI90rQABdV5q_!Iq_(ccHa|!8s%9zP1!49XwcOGbCqDC6Xv%8j zZe)&{dBtRof_K09GlE%DrVCei|Ea(5^S(f}!}0J9%-m%s1l89(D8B9R zlSd>X=YZy|`}GH^|4S%ziUE}GiQyO+=<)=EoWKY`8sPQ2Plh~O#jb*CpwWK zeBb|rpBBh5RdoEZ&u~=Vu>SLVd5cGm*Q*<^ooTGPedfVL&xD68J_--EcK7f+5L60q z{$gJc@txmb;vdE~%NG%i|LYU2OC%1K|84wp{0PU{8w*zYeBc%TFL6MZIbbuF%*F|( zB@T-v91=Ni6|!bMXsTsDH;3neU~Jifx(Tx*A{`QsvhXqoB)16O@%sN!+{o;AKjS0w z33VT$YzmZE*PcvaUY*?ZEzGe~WXo&O8VOC|9iFEd@(qj}W-Zuoj9cTKV>X||>u85w z*$Z1(xhsBKYNtrZZ{cH^anpg(^>J z%yy}ODb|ZmYs-OP!2^e+ugqZezie#Ouzv1u=3TEiWHfpVt{XO7fBl!am0$UZg#3cp z5skt8YYvpKM>Vr9a^N zmWsXFQ+V&G{^c*ar}U#jCgVWkt-A|Wx||R(Qr=O>X!k>8#<%*0va8K*j*XV$b223r zl;1u$X1YR!)o=12)~Oc`xIK;k@R9d`VDy6(TJjqjkFzd`Y+RfXb6}!Ez^p%$Ht-5(FUT{Xu`TzE{d&1EZ+;h@eea;#fH!m~XXV9?hjiYktg0_B* z5A$Le6IyHj-im#2weWePvg7`S*$(%N8qB6|U_Q-S`Cu7SXlf)|;DcROaS6#U4_iMF zQNEz(_aHCgLR(w@fztLh2j+I}IpFn?|HGYi@9+OJp0l?`wqo{i=C;Gt>lyk#R~%8$ zR6W8ljeVZ~PY#Q#zkeN7|L{pj?ZdN$^AEW38aH<~ay3t$t65S0>Ug=n#68C4ruUiG z=Oi=xIdd|UpJ|dxyWb!i=2$1#R({~{gPRSTB^R*Wa({5k*zZA!hQ>UH*A118yLlXC z*MC2t{l+2IKT|Wa?fn5SfhqePKYr%Eu^?!|bmn=^-#IHzpJZpdA=-Jqaq;5w4T~Gz zH!8Qj($eBtu=!iu{#s_6n%~AB(l{S*h-^qKd4Ev3O*=f#z-AY_$bSZ#Q(Pqn#4~KQ zKJe)>+depQM*XHliEsDNKF~4{rt@>c$)tm({wI3KdEO>nQ zhQ*G9|AfURr~F{(nIC?@c}YCu`J9-&dD4e_qrXc!NN;m#TztMM$%*I90ok?t>+0Cn z>9XFlVD8z!{=n8w_J-{x4PQPmFF(G&`IC8uC~L-Ck$|}y4%oA?v)4XoeAvdb;G?74 z1IM%a_v({xZ2HY~xVL?N<9CbxQ7z{F@kTYwrI%(Zv|sqodTsTBNNqE*XEh)-13y``{yAvCxD$gIT!Zxk1Ji;TJRBA5fLA zZ=A~=;4Wdamg$xa`>Z;)UWP-b3N~2w@J#TQmpJhJPvd%H=C_IoiEU-a4#u(QA5LTS zk7v3b#+)f2Z8M9@YAv&f9M1$srVmlI3A5SutdlL-s=MMJ%hZDlHi^%8?~q;Y$jr9D z?@IoISs@n^m|pBFxbVyR1Oxk%xVQ@*>L)566n}4EWRu&=d~I>h1!1QH#!(L>^<%F4@2k z`<5+h`=6hjR;CgX`wlcN-f#cEDSf*`wo@fbrJ}S$W2J!ESDsaT4yC%rB^TP5cPPtV zQDj;xpTd5wrSUG)oU@OgF_kWJ)XiCNv&(K3?}Cfw0k4Hj)}G?ZG5EuJZ!Y&C9fxoE z0gL$~b~Jp;ZR(3lV7S}Nz9!1?a`Xb@EC2rgW0zHIG*OXQs9dzbOV;Mq7x_(WTw4^I zS*^RTLV;uIu^4kA{(!mFUPdF6U|7|q+a^TfL&d>bJI|{k1;yGS~eVA1*7Vw_$PI?N1 z{4<_iw|Gsq@OuS3IL6A%tYYmTwP}ItGSGVJaArI07xqgGxw_;p9NZVvGvVmQ1&PH! zG!&Rq+{ITM{rg#d$wT%}zwKA-Kj`ax!GLqcMBX0b4^0p21%5k}J2x5gtzb!H^iBNZ zoXOC1UEp7PE(a6e)MmHq4Yt}BN^KTs24AQWENJ@6FQ=W#aQFWS7F`8LUX_4d4PRy` zW;-}Wf4`Z)dtm?n1FzK_AM)%w_T2o18f!rQ^qGuT7#WUQ|CrHNf1!!*#rgXOOcy-p z_5JTC$!+nK%a)nb#Fsa#rJjA=O(xL;3u4O`Y@V&a8ydhbyeoUI;3hEvk#>dcjn!2= zJP$NQ17@-HPBS)E68qoe);;q8>#O;pW>5``n zy({| z*2=9A{Ks7qU|bNwU9wNwfR)*uQB|^qRka~_`+?G?1KHE$n9DQY-P}I;A>#)(R=EdP z^b2l_7r4A(KOFeLP)YpU9@e?KJZl>F8EUNbU|N3hiNrjcYUVqYRZ|~+-hKbUJf4hN zS@nYQmHYMyHP7s1Yu?o*^TTG}e0zuRi?xiV-I5O3aSkuv=oYlRdwcu)0k%$w4;+*B z9}u)iU}mx~;#wu((Cc!+gN?o57t58Cf0);3v@|SsSc8Amn z8zwMR$lexDc+6q*fU&1J+Poon;`MjNd)V`u9x}%TvahVDXXfAY?+AlkiP(&Z`FHmo zFL?FFvTZrP9mDc34KKwio-wZwJaXnww_|iPr-jqegA7sp-=%g;d}MFX|DVmQLqBE* z>zqw>JTjJl7-P6OHU0lHEZ;Zt#y^Jji-OtuI_wf7_Woixocln~WWnn*DUIx@+)VsW z#DoNx<&HANbZeeDw}5AlqI0mUg)QftEOC*v#0jFoEbHuRPBBQmWcTHqZ&Ay(gY%Kl z;gye{Hx{zodALf6YfkD<_8bGI{?m->ehP~Ur3VCuBm_(mPQJh>SGaiPN+ugN_a4SA zi5<*0IFeGE?r?n(uIT1`u^}$;fnJfEqFr15{QE{WHNPf2Wc#4APdA$1=*`V?c8k_u zf;PH(dU^~oTnuymvGql4V!r;T$?Vi0#$Pj8cYOPx{Nc>C$Li;p&rf7&6E9f%acapZ_l{fqmWoJ+-ej4+}o{wg3A3M)x;=*j6&jZU6Gz z_VDB5;SzInbtQK+a6gM|$X0rPZ~x&B3^xkcx7}~7{BB>Mt0~Vcyx|YS+RG`-$36!? z$oQ51V3tx|!tqDy8$R>h%J}^6Z~cR+tJViHixk-+Q#ISd^XD5ksd4KF0f(l z+t>6yn{}CV!14L5ot%64xNCL`u25lD(+Xf`y>fwpw`T*x^Bl+JIv<$dGWT-rW7hk` z{+Yq)-kk=1eW?)t{#ry5uBeaMu*z^1Uok!2!IJgjC-LZV&1| z5Ua^>=KX`aZw|=*Ua&ImLgT#!YziydezULp{;!!m=|D5nfi9Ul3t0G+ z{{CX0xsWNoh4D>D^O+y4SsM(Ursp-j3JS3O%O0fO^oMm;D&zI?3z|wFB%A9M)vFt( zYc#$KV$)>rE&KbIf8HZ@{nX$8`D^^%<|i!f7rjx*vXr{nf$O`P&afZn7OrSuzOs>3cE>;I9e35;0gbOjqCO|PUScLuqgM!7l|KyHVG_@{cBj_R-EOOlVmvi z)%ZVK=$ZwA`~j{1$#49Xm{*E=vW z&5B83m=}DQOJ?Ga@4w|MSXx9Y8ZFuF#ShyjG$pahnS5ovF`0SoLIzi^3<=>azb7+? zbTqU%H?rzUXY7?_&iKnwaD;Eix(E6hvfL}af0f;n&K_gXELF6i_-e!q#pkPP8S`>} z^3Li@VVQg9EKl5I)_u$~B)7=QZxMTJ{NqtYf!lBXCBr#eh=InIJ+#-%4NkYMQj!BEY%K#)Of!S4#k^qj`N zJ_c2}06x}tYRPP2rxd<7w{5@KIC*W)g5CKCoj>|KxZPN9z|`-`mYbKr*VjM1~cOP2+ul?&X&pPX}d`@mFwp~Fan zx!FzaW`lK*V|SIK^$~|e{w%4cYp#D7cfGgQ)_7)lfO+dS%_UQcr9%`ecG+A@#1#6!biUVWn%OTiwd!)zAv zj8=CqhW@yNX5gi@gFo8*G&KZUw#QQL!W;FKYz(N z<&3o=6)X~0KC>-j_Y=EtGv&ZU-Ulykmp_QI5=)TaVz3T*bm$IG%z@LF^Y89Fy&>x^ zW83QT{f2L>tL8KcM*NhVp}|~!*@$_0T4VaW*qv;14zb?lK7I56>z$NOk`<-WFHWdk zu$&tH-Yz9#LkaWY!|4Y;u+3Zf?dw3MgOcd+bXIY2zvDT)kNJAT<(l&cPg~{Ptvp)r=0|QD|NTbmPmS&|wd``wpCqh5 z|3E&0bC2R<(Zk!m9+x~PU(J}4(L61%;hkS6=F_^jCXfO}h!(4XELDWk9 zgF`0ogFubg7;x|Ci&=R&JYDuM7*Wyi+Y$JFj5^2lEm| zc1g$S46&??XS^3Y_GD@N{;KJd(TW82(h`S{3P&_K_AUO+TyXfP@dJ}5m(hv%Q1MH=*ye4$sL=2K=WTckJT?Jo=sdv3yz-Q zQ9H0>0@FLawDe~Q0?cMR95Vl&eSMy%{9R4rjlJAER(}&K;C*&mo+qeFh)3<%u>%*k zp66MxS|i{DYsX>UaJ#JtZ4j&9QZ>+0hkkQ<8=EDcU4;+j3#~ff&F7SQ&I{v`Qm*ody z4{GsLMYSE^^*FFux$)s)W|@^&#UQd$+muN zG7qXkSRb5tVg6v}B%=eW+&ngi4)igq8{Fw*lwNZFKzdnI*_6!;=LKuo_ekG76EMT^ z@FAfJ|F5NOso8vnIk#(jA0AHUOL*?cSn*HZ-r!xN ztH;LP+0jvl+1_B^THhxU>*n7*uW;hnQ3cIKd^s%plM{reCH&yMqxet0;@UI*2PWnj zwJ-G(Vn55ySngQFKRDx_Q)S_ zdc$AfZY5kG%qacBM(o82kri1?xem;_7Z_uOPchuVI+i zV^!m`hCJg$_R>ub>2gfdJvaVKOl2rlIH*Nc) z0UI8tH%Lm<2y=MYW;AR4_~myY?|%IS<#Q4T($_XgPdKnk*5m=p?AV{YR^FmFWlNUQA0*=d=Y-X8d$2Rq&&Vj0_ zqBmBy=`}{4D>4sxvj+?8`)Eu~ImN1v;juw}We#2K;gLQSx z>`VVKq-!|1zus8GG%bIDou0uwhwQ5dg@2z}z-IDcPv`^Fnl%f)em$@wnN2t659>_Z zB-TEG&CJsaHxx5U@BiO;Jg@N<=K%}GqwLx_wRQ$IGaFuCjyzEQj`92q)?JOPHdP;Egg3vTV{VRU!6alrgpqq$N;U*k{iS>IT%&TwEp z=*_U8*D4^Gdyh>6r%@JD)|E|7WgZUES0BW#InctjZ(ggQkrBtONj!GSosvdAd_i2Z z)c!Kx%i_Cfa)?E?m9e*@;aH>Nvxf7sEUHl#R!D5{Jjvu|?(=|Y0%JsF^ST8O+0IS= zpZ1H(zWb7g~T;iZ|z=W;M3+8E5>^xK-pv-Eu>oh~B zc0fdfyQkzq;bRk`eg6GRZSeiswEWzEM#%2l=cs2en2_i4W7E|gf9$g{6m zWJjC$p53AqEk~M<^EWIm2;%v#(wJO+fa{57!R;sW=~WL~jRe!9Tv4-bzgw@r3`Zy00onZ?5PoA8e8 z8I2Fmtv!BVvDrO?ntu$pGPcwOX^;R^b_y72{1)2tdlLJLK_XJo6FZ3#Oy0=ekfZI;?G>Mr*lIC;|~k*3$;tX zzq3nVSUPvPzMSz2=IgIGKYJQ9T${4*CyPyp%#N4LCaJ7eY?Fj5eDB;YmzS(7_?yCT zcZ$*h{yVkYcWVFfR!E=zsr_Bz+Z)?M1+NYnv#AACvEDQP_WOMJgP*R(uca|NRI+jI{No2UoxA44UlVdN^y23O z&gZ{2Dj(i-pz9ldvw*sWG2>+O4G;BHjvRjQ_Su0CKaU%>J)S;~`MO?Rq5zZGx*rXv zSsk*K4yJN{_;M|I`Fh67s?0y?9=H3;8CO)^GLX>nG?-&qKl7n{!I$26fgOn~7016# zGmZq9m5X z_7@rz1?(HyRT36^{Quu*-tKTp?!qyf7im5pGNcPQ`8Uk@#dXENj;$ zGx4u$uzL64YoUX=lUbls+60HMyg4ocDP}w3esjO-aGX~2mu((1x75QwTsdRqpxYJ4Jg!9~k}#UdrDng(JAQ`IxBafF07zs_#^&$GdR)!(=I zTr~^dvxa4vl8TLo8Ke{v803GmN=Y!9-I7pvYV)MVJz>sYmTBJ>Jgr>d$Qcm*i2uo+ zs0%ObGBl;xR~R$;q%W9zV1dP7P96S#%=&v6N_iZN^B2rCx$sHtL!se;#Jqs$Hr6e{ ztW$0{NSiubKJb9+qx=&a(+eWk_y4aynEmR81NSq>#l;I`r~Y4Xdt)OXd;TF7Q!R-D z7mqMx?QE8+TOcSE(0YpH-8Kehu984|;U_=DFBIsm*vdPPi7oBL{Rf#T38@T4Hai-b ztQP!}PdOo8GC^(y6YI7wGb8Gqu1Oj=XxApZ7Ovs6Ua^rQtK&~HL%+{ob~UxK1m!8h zCYRW)EJRCADlw;AW?Ny$&cD~GJ;ib2p&zoF=JoKF>=S=cQgGqh@BbG{J;C;8YN&E}bUv8;brn$G-Zyn`{`phy* zi0voel?Ta9R=k%wn9ZI#7Jih!^nsao{{PgLoHY!-flZ%uUYv@5F!9!d?9~pEOjAxc zX6rfHMqbbmUt`3&Ry?JFXT4#=GAYN`)(5P&IKE>S_4zNbJI|4kN3N3b7H<%<4@1KD z=5T+9$J~4F@tN43I>NKB>Ye?My5xXnflY$X^bH)1{x;6hWSQrd(B|XZEGAUXDksXc z%TDCV<3Hcow=5H#q35`Jw}bU92lw3#RqYGD79E(UWh||ovR5VJ`MvrNGc+o$n=o%F zX3o3S%*Aj)gyF?8u>i%-@;1S&?_8T7N#B{ryfpTM?5!T23FmkXavJN{{aKr(jwsX{ zI9Q86@H<>zAjcFt`v}h#ZkweXc{`hxni)4`aEOHOR|saQIl#vH;+ymZUF!ue**-|I zF0jeCdp7+6hw$_{Qa=Qq`yV)Ve*gXjrppcl+CDh6dA~z_J+s^^9x2}4rLR>B_TH*x z(=`o!@XOYajq&341Ie~=1~rU*HhUP>J$}sOm+r~6$>0y;H=p_%J6=0KrY&47BH>I2 zdfB*E1s#~X+FW8DWB;ukb$=BLl$i?(?T+g|IB~9$t?q%y)85wy+Ri?g=UH(1$I^!2 zYMTSR{Pq88nC=#_uVHYg`*m&szf5OfxHxOyzrD=wUrc3RXI{OG<<8zU9CspDt~#=S z$wueqkuxF@j`qnGRZnCNzkU5(^4xq&_B*X-PBI9w-*qVX`^}b(l~?vb8oOs(|ADQE z^BZmN-If1vp8K4$lej@g!u@BV+|thmGXVTag-$i@RF+1Uc_zm+VIn%>*bxg$A* zV~-oV%~@t0@q0|=+ndaWk%`j_YLmz8r&2d zdxIy;T=2JGe_cK6{Wz9ejK5wo7tB@NAgH0Jc1A(@^w|$D{)InSagzT7FFVtLxjS+W ztiIr|S$e+RKK8yIrsdv^nOq_38r^2vG4M}FW0}?{b3pI`yTksbX=e(V-bbXe+%v3t z|Ihn@WT(GmPw$q7#c}&3{O0dxmGS(`y@#)l)yDMytGDcIdHiK<{Il*$wlpq|{NM0Y ze8oquRUUS=e-3?Ms_59dXO*GBz4^@Mj~MdP8SZ`f$iAbIF@$duqxCo@T(|E2_;|SZ0bj`jLz7ujJWNgpUO#EbmSMfIpLzYW$%z7w znB{62c&@+Cw_{$vqWZ`IeZ><8`1d?JfAn6{L-7l>K03!6pNHK`31H}oX0n#?-{%=Lq$|(c^Z)pVM^|hg@CF^Yn5rq?w){YHWyJcsi2-5HQUnNSOrp zPC=Wm|KvCE$VlwBKluD0<8rH+3c;289b_W|cAjLh;unuN-;}*6UrEW*hD4lX5JGlZc@r86T|TS zSt`rfHGiA0L@zLIas0}<;@}VQqAfB%ysQ`eKCrvnu~mNqGfUJq=Gz5K^IDm<+8;Q* z*MZk3pq;TMhI@nTx7m%7GvXZ%ev+>d)kyXRn%e>$ZACBmd3@kFod4m@FZmCC ziehXRY>YEPp39fCu-b%h`mikMV!QHyd3#W#go3otj6^|>q95`fY_~r!{v#ow@LBJ{ zv19cgg3JOIKjF{VsFATk$j0jvzs@;cnMtB-?+*MveTs8WO!HL6l6g1vUu5uRh)Zf4 zG&VoqDd{jhjoG}i;S7W9grDM48vhl#V;fJ-V%&0%(M0F~i`>?f7PIh$yv7OsOf_Oc z8Q1wr?Bw4}|39I1<$|vr3&e~oX2_M8DFv9XSbCo86vKixjTJ`hub6#rZ*tNuC`)KP z&zs}XaOb=Doz001_thA@UM$Fr|F9@GVG(=po<^z337Z|cI~}qdd6n2s=tX=ucWt>_hPgAlDfm^{{Q5@r^P4Lo7~vv*I1>j(=#El@B-7_`UhwD zETj4ENHfcaGexFw?Rv_5r{zDpWGBmA4F;`T2j&okYKL^ers|moj__HA2w!^4beE4g z>qT?>4afFs=EF>TUb1YFW07!MP})D?n7|56W~slw`E3^om^gi#&uCJ_`AW6fy|Ixu zJs^rjcOUzADaZ6+#`Z^%3tu})EJ);x%x8-H&7LLRR6X}W>4^!c91rfEUEss{Mc?{G zQjyz*o&Ng|t}VInMQ+7GmMoU$m?KQD4mR-$T9l*H>}fP zD&0GC!S&OOSDPp4X;?N~PieX~!^q*<{6l859kzX9UcRsK*#`z~jtflj0f(hZrrw=@ ze?l?q!MXYgc2k~+r3kQ^J+Rwb$uASjc<&s8&7L2!AD*=*AJ=DI&-?ob!>n2C@=<@@ z+E%=sJ879!!Sfg550URb}!jyaA(iQ84q7SujiTbX3v3RLLaU% zU0D17fDOwoW3d~8=?Uy@YuE5dJI6F}H*Yj72-m+bcYcF%z@Y=Bsh1A;@>m^<;<>g> zjAy~zT|Ebq6Sn2rAJ|aw(W-6w0p;9zc0W%Y&^~c+!SeJ2A7m_^mcP0a$rftr%VziB zqsIKkz43kzM1EvHSa|AwWBRL)%*)Fiy@l+U%3m}+5-FMfM*qS^g99sdJs&*d4@_Vd z*rNGH_=AO5z*6p6V!u9oRAzo5;}iElLv{rZCcP<=Y*;VzLzd|M0$*IHfzC*X8FR#Vk6KuDp zuxh=UAu*3xI>^7_c$*EY*%Q0^U&k0cA9ZWed_EmltwMZ)Kcxd;bOtA35!E@^ydzBm?a7-8ZuuA*F zyJ$1Lx;AI`^Nh=XG)iB#_|XvgTfE{`xaYj-j^5G27GHn0Cw{)h%yYbvJ$L`_AMzD7 zr?VeSG_P+Ap7XzPaXlAL(jle;E5rQQE<9z(Z&dCRIv{&=!CA*g2R2lG`^3pCAMnq# zK$-7^{Q3BO%+FruAIMC7AQe(u_#nzj^})k)2cl;;^nQGQAnw)I+vg?x=GC+9iD9;2 zI>I2M%CxSS>1_}TZ&WRNo}18<^pt>bmUne!nqBzm=riFM|B9DfQhE%r_Zap`iAF7NoVI6!f%EfM z4(;a5UmN&-v9CA$&p-DNt7(!Wuk{5twg6e~TYEUN&KNrAu`!e`aX78+(4O?4>D!cl z%>Ex4uKOBt}TB!w{XeTyi>~fDI{Fd#0JH;d${hku6dy!{SlV5B$(Y#Lz-PBG*W-ZX5|_Z85UwDNB@Xd=?P_A;e6s6 z@SeS5mp*gG6rqw%<_cHo4Z1w@pDzez~Ds^go;VhJ)6*jgq`q1X#?U%$RW?*=K=i?*0S3wI>R!SDa?;vtN*Z z(A&N79Yee`d)A4+tvw-)Rq77}9bOzfx8R=Qk7Ysu$&x0b|Kv9*GVSq}idfKaNNCUF z*_@Xc(iv{^WPWKBb8nW~TJOMXdqGV?fo-ksPxi9Q@*iXmED)Sw{~)nCA&tqb&p|w@ z`I_kgsZ$dQ5?E$)-Mhmq)y2ZQweb%}R%X*1R&%zQ2j>cY&@eDq=QvZ;M3v!|BkQe~ z+)`&5%99#YnKhW3FI|X#;bHV+#+?2854LwSEz5D7z4%}A;qT%RJT*u7xR(U8cMWZxp!(#!3%?*{GZmnhK5!bV4>NEOi)bLK1_3a@M;m2(Adf8+&8T+K> zu-rRT_~eIcTeA8)qdQD_Uw*L6S^tz#&u6-bczVTWwk>{dnKvx_!ER!5Y5|+f&fxHH zmU-g8BrCX2gtJ9jR#v^mTRj1Oc#_?o-mtIwYUch@PH=Ev`0nU|@- zC)Zoef9EClE~hu#1tK4eKUCRHke}JWE^%7x1QWj&Tizaqcazw9-!*VW=3Ur(?SRP_ z<{fNbxL;HVK9G~Lw9I7VSkKRm=PNa+YZ;LFbR417>oGv~nL_zKA?&)>-v zGrL@7g}j9o$DDgrUtTaauk7S(-m*o3`GkGUfnE!DzWMC$Zv11CyU0+wrNOwLC+vW9 z^p-|mhYP-ut>hM-NE_pOLq1u!;F>Q4E#UDQUsX%j8A)d zH%PzWm)oCa!Mx`obIG$eNnl4`dimSh13v?_rf&p8PiB_y?{EnTwap&r9Bz zc~oK^^L6#QpI;_9O5C`?P`bnQsH!B3>(j=$)9iVg4$Qr{;L%I&jB?8jj0{oyytfJ% zq*ngt*17N48yDdFU;2hLQ|YIhj*ByM7JT|;&YU6e#JnKu7jMD#AMzPDzcHI|9plL2 zVb~tX_}VStInR}af7xeov0mM~pr}pqk|o9_-dea? ziVLYM=1~WpPhxuen>EMeA0xloU&iUPbuPHczmTvvu}SVih{=*b7AY16@w*R>$!9Qh z3f|FUdaKTmdx80^OVca1fMTAI>CSzRnS4E&&%3ku=Qj8CH0R{8n11_b;G~vR-`w^z z!ohsjpSBXE1BvW1vdm`N>=`~AC}#+38NX1FOwehx`nlk&(SbIVjABjp4{K}#Vp+5P zG@31JG;cI;n)bqBRr~`To&ehwjBJ(%nXI^3Wd(ll=j>@JV=!>Iu4Cjd{Z+#u_AOU9 z?r@|wzOiNKo!4}|rP<7e>2&RfEe66Vp3)W54Kk*Ew0|OH&-cKn^S^_AW15=7^q4{U+-NjA^yd%j%u7uCTbq{!&zvcdV7=YJ*6Krv zmd58s?=$}w7?&P+y-VVz!(KhLj2x%3$&KeWF`IHl+;nW$Wxg!3VIhOmH+IvL2ds}f z@MldWgm0RZH^5andIWw%_1rt zcpV;0u+li&VCLNTr76#XK~!kL52lsOOIa_3aIRqF_S(N@fe)Ka9P^eN;&-&!pPHw6 z+%axw|KqrQfk9LMQ--yTjB9VQeLXwVAz0(T!fW3d4v{P(hZNY294?7xnA@$G$Yr;I zeM<;aNt;N<-xK}$JpK1>@_s52ZRv#q#{0}@fwH?18p(K>~ww$O`d- zkmq`b4>m8CWI3`!;z;AvIRXVCM^B!UinwW?{@|flDueFw8(Yh*4}a&6;aQ*@)xi9S zXW6q)57Z|Awb?p|6&!F$!id)>_&XY(~IXDBc-Xh<`dBJ#6g_um;3-`?2s+*xpdUGC{m zHkq@vKVC6@xMA>MifKW!@CxIPvKF&`b6Wi6d?mrjwA{zB@H0onHR&D69BZb?G2Hxf zU~c2ASqCmUKUi@o`9YxOf|uH635h?uUm7#N*i=#YU>VniJ}9uxrb!#jb9nu=!Bppim5p-2{>j1?U%9h3bTBWMwQT6#zMpaV z-x-bGE)M1Uiav82aWLOKa{9N>jflx946%{NIp>IlvB}vh^U9-v&GAl1mt*|t8I2#mTR%9)QK!J>$IN_LhrK{6T(Cm9YwujU!?_RGW?lEcZ@hT3~?(~*2R~-0p`?69t`i5Qdr;hq%iiasb!w_b}rw8U0x)Lc5SobWOH&Jkp%47Bw$>%vNcX5SuG>QLe zU`shrD)8dPTKflV%0EtsiUoLbTD3BFH1_&jh)TGScxZuXgTgQSjF&C?M=Icxqs zmfvvmfFsj_S@9R77am}CUhuiw@wrUXvV2G7i3>`f_e@y4#bGw@|0cJ{e+^P@`w!%b zeNen~X2QiS>ks^%HM2pv8w|ENAICtRnhyTuQ37YvsQ0v z@Vm~!E7q`z>B1$O0Cstk>>sc7D@+BnzsxZD5c_#S;HCQ$ez45<;-0sbIZV&z|39Mx z+ENP`AFxjOuejLd!6}|Aiy78-GOc9&%F%GRYr*Rk4vRGwEKK+iV4Sh&h5iZQ1Bs9R zFJL)zgke`IV@bKri)~B+P3-z%?5Y9@DSuO2dLA`Aahxi@BAj8L7`H^mf>Uqw3*H`h z?|*>x;-3AI4Id9N1RX!fGi&{SW=SvhDxoXge_8H4WZAV_!laAw9_wfROIrU~_dFLg zdGdEY>y{s%%y(>Lh+NGUna(aXmwA54Klu`7mXupOB4rOWtrM0p#b4k(Be-B5Lq+q6 z`}Gq7eLpZMUf9_*!Fkcl1KA1<7kO`;XBlQm{o_8Du%L(cz7n4Z`&qpP@x4vU)EgJ~B$yeWFcEuTWnXqe(qVy{ z`UXap+Xl?}SDeH-n#T(oxyt zK`GmR#a_M%J2z}CU*OOnTf>vd{uK)8t>;_QC6yHi8vQdjJ6%$G@hR_uXu|&gj(HA@Uw24220vKP#2lfyk@@Z) z=^dA4Qp746?J~kGH?Xs1t!S)1wO|Kx(uGo|{f)c3|2OYG?XaKuFVC)LFXUG^@@Kgm zmdf&(a7dzJjx6(wO9dCCq5`T|zMp7JWH1t+B420pw|z}7<6RAAuZ9I~h8qgG-b^uS z$Y*1?E5+Qy{vpt4LEugM317GTU!{>2tkjT4bG9A1Yss$R4|!T4ms>35EM&zIkC ze13{?`L&3~xhjeeo-qV0R9DhHrJ#ELaKZm$;cOQy8z%&I)$^3g*(C0$d(3wDWbyU} zUik#YBRo>3EcdQ4oKd>p$a_j${~crgn+XXU*x%ilI#HB$ey%2O%=+&yZ%4C9K4{## zAof{)WA@&bR?EicT>lb(u-O#zR-}kF@18E`oUudw!<@b6d7hsuGBo)Ao3E!xtZjlo zG@IrF%dGG6`w}buvRQoP*~9$9@DtrFP4sIR4Sq~QHW=LdYZo*%e-BLCo1;S7&& z!W%9!NuAlpwI}HOB@doG%U&uM2zSmgDd1grM3~L-!Mh0WVqdoUdTTaQR@S!Z2ddlR zng4#0vruBXvw$};_%YTM9 zqFx&n#P2`;!Ka~_v1FZ+zPUB?3pT-Yc4s!n2YCk`@7U0^&9A{sn8EmkdjhjBgT+!lsjk1DUo#gh zk+GP?kt6cw|9{CH^CxsS@~7xmtP+XnWS-t7bGvrNL&gsZS(1gk9_~Nii?dzuHQ0C0 zjAzrO7#{aNnM8|y&*ctp?Jky-TDGL&`n5XNX_CwHW0>_Tf1c*NrE#1qtJAoltk=m* zktzJe#>TR`y3`7Op4a^c{JKRn_J3;Vi~n_=L9UVgZt@9+mrt6?Ry+6YVG4VCz=-9F zBYXTwHY>BI{29g^8EY*z97u1z#&zbwMA;8*4j+10l~ZP3^G~?TKQFdX>o@;gCbq5Y z2cAzmv^>R;nZM@&A8*B3i!FUkceEIDR2toW)itLHHRe3K&-0-9zhlw?HnEI&h7S^K zYym&HZCE*Hq&sd_TCj~N!)r2Y(HG7YGJp7^PV?r7G@5rXyl-afGumYA*rw)cV(0}2wu~vFC2UXZFRV0s;HVsMlWV3b^Llpn zRqVaaO=)NTIk|H=UNy>a;4Nz5%g9v~{;{F>LMz(=Ho*&VW^5Nu=u2-1=9Ikgllzt- zW8UkAOKd+DFdHV|&V*(!Yn_S|#Reg|2?hvbK)&lN}jt_a|ERtHblsL|u z&s#BvDWgKR=Dd8yExujCtXC$n&Y#FGCH9Ly@-nMjD|405m4syWTp`9jk47o|1=CC` zKC>F9u&ZbEitpIY_)VvPg)d@dv;UKS{87)(@kl;oymgo%W%=+h(-Rgy+XnFsOxkIF4<_hoY;N3E+$;Dt3u$D znK4B)Me~J(;)TlA1=j>KbU(-ku>E1bbN8pP(MDdL11>1w2 ztHmW|G%8!K+7!f-v?z#&YgHFd*D5X^{sv{?1z$MlbS6Jw*W3Bv(KGfuo{F;!QC=tb zbOh@EKTTm+Tl<*7Z)#-p4C97tQ~v(@%Uj{6P;gvLe#3;+Ck*eHSl5bIpJcFl<^B0iu><3^6>h=ygsRzrLW{q@{Y>Cf(5zKAHMNksEk;U{kcI| z>C~!EJX!}bpKngrYZ5=k-Q8upW7iI5bNx993}5^1HDCM3cv?$Nj<3L(&xDmH>ISb? zx5M-^%~DbC8+o}e^f?%E7Jj(3%KgCH`3i*>IKFy6;EN7e{89abU2J8-jK)*z@(+Aq zHa+sAaq6ddMYa!99@{5yJ9AX{8)Wo~Wz;?}fAB&xscAE#{CYQdjmmJXBpj7?$l`iuOxrg5m$ZlRB-Tmar6Nwgl|Kgh7_{P(x7%OAYvp4q4jnxRgu;Jd@~ zS#SqKsLO=*MsW+#Wy?Tq-k9(MY&y&3Z7WZHnEq4x@Y&zzCG{Aj>vay8`rmKterEqa zm9=kj4SU=T6|OT%3yPmPY*sz6fmKiN2a8PZKeil}n-Mb&WtiuQR{Z;<-M0V!eg=2Z z#@*HpPfz7P@R_DjPFWnl1^+i558cS% zzGy~+a)l7nBc7j;$B!Upw+k1u4)m#fu<;3)&A7>Prr=T?_UXsZOz`bn z@Q2GveX?K#dvlwuLwZILQ@?#83tvpbD~=N-2F3-MY~~e~qC0XKvw9l0Z8vUao9+;N z;y_@`1HFP1J9j698#YL}DSWPQaL-^YZ(`nF!uY=F-zkP!r3uf369gE`7#!P=*0VkH zy%4!zzXP+#e?{df3xYiyzDoaCbM5|wM(GW+9Un4Fx&A%PakH8IQS6u~W-llguP|uo>}1^L&up@kXVw3Mmk%zuxWE2F?9qVTj^6WTh@MrI za?q9eU|{$nsq#ZuUfKi2)dx-q+^}ZiJ!{O&9rq#0l`UZTQ~4be8M-1aOpVBS!1U9; z!iB9wob$!Lhzo0la~@n&NvM~dVYH8l|1!(m+As1u?!B}(XmV`-(d3ra7%8*kgj5E9 zhL-T1M~v_O{bk+tU><9Q-86=R*R};*96O?UO=NhYn!id{G}%7Zzn~$!BKq(t1}o8j zhnJT>2s4y^(Ufyx@A`U2PSG89+&fMPU1?7J!??^I%DBH# z)W&+lL*^`o2D6+7F8dEnehChZVvS8=75^B-%odzgmN~$~vyYRhCiPzY1IOL<5;q!V zeis)m_%2=GB64M0GD}?fQJymgbPo7%?FwWqvAt!VAn}hO_8iZy*J36{%uyU%bABZ; z@+EI>IwW0jPgYtuT#xcRIK^0!&Guo5+k>R^4}W_O9OM1)EQIZXfr;@3#XsyN(~S+3 zoANw=aLiek$hvFt%%A!xueCBdn5`bMCpAeOs6QZniFr9!1FzDD*aHUy-3uPGN=)-P zpegy`*^K`aybn3@dS7^}Q2(#Fiuu3<=GZu1BdH2Kr4<)Hao?EnpHt>4Yih^^DXRxv zJZ^@8KpgY4K)^r)Rf+!Z*oHI=CS~oVjD>;fUZ~ns?Rm~Pvz^frJ0>|vYO z%~}-9Bb>q|v&Tc?MY>vo%pX?07thk3r7`sWYc$i{$h3T#L-r8|=|G3QNf&vI5wmom70&|c zo{As;jqdDaxwC|E4T~cyFT1$1vqua2;nUasCDz64IsW0L?uGd}3rsloOk}E9xUYS- zZ1W_gf>*pd?7X6!q$&dc#XtBscfG{EI>vPye;(wwQR5A6@X7MGU{X}G+Mt4oQ;zkW};MddTO!$-N-H@F|Q zNvL4FbAxf$goC%QO76(>X?S?(?rNUj-{Tn8@jqo;r_U1i_~`e^j*c^#E8efy`M@E{ z*;f5MuW`L&(Z_%*eB`K*W`6M|AYuRHhuj}(Z22DiteM}~TNf~+`Mdz@H17qx z@(aFt-fs}qDbTklcy9RNm08$@oB2XK_Zw!r|6`JV65sgrSgZGSiFfmMa^_5_V``hp z!kn>+ucTa4`-Me7g4+bfzM4UZ+IzY6UC9UAZ`br)hRcL9X}s2eF%7~&U5F08>fE8EXfMD z`3CYIWb7WO&HsO3v(J8p^~R4G^90%M3NTvz`FrN4^nu>O1GbB64hZ@^IPoC*!OfQQ z4U3mAcq*Z@;4JrnixKMV-VZ!k|2Oh_1t!SUCOvqZm|}2YV(NtHPnrFuH+`GEiD`Yr z|FZ`;Wu~UEhH=?9F0T4h^Isw*r9zUWG5mb(zptH&7h)$Lym_v}F)pOzp?(2#FGE4{ z+3*MFGV&f|+)qzX-H~$Eux;~nxrS+`#tiI14JYR}KYVQc;AYF4{f)E38`?|jD;eGt za4?#`-NSlpy2^&4M@bc*KAAGxf8eswtPFgxscHU$*gJa;^zzR+Fwv>hGLbEALG1p9 zyDz%^?;FJI_$Rlczq57hvGV5+u*^Bd+AH&y$;>5}S5$J1@0G^ajOz_QcrdyP zH@4T@-(AYg#}u_Y8Ll2jwjb4hlbTVECM$&{4-~wxS{1+VLZUohaj#mF(LJC2l$zPjxuo zz$WysVcF}(%~AFLoTfE4KG*->IDJmzyF355qc$;1%}q&R%HP5|RdvBl=L-#={U1zX zd|>G}L4b+Brs10pL-wEl3ohIKWBC2!3=fl%&4FHT9Ul3{xjGjVgkI!4*?+)M{DNTF znFE2PY#+8Z={#^#%>@;1V`{;q`j{^;Cyl)$ppO$c(eZ0Q;{Xf>b;+(TK z|7VRe=g7(4(6H=PgQ%2niM6SLVS`v;liNE7ULCcvu!2_pC}*}P|D(U8Lw5dQyFZyd z?`Bh5#ec{0;3l^Whv3Wg{~MQIba0k?P~0owxK}*k{`33tA6BrWtoo$Stn$#PVY%hO zq3KBVMDe50XI(Nis`}z zH~+Nil(F7T<+*o?XHFc8x!FI(WzGki?>#UTpRl#^|AD)fCj@jqc}Q1q+pIXqduu9h zoHS!pH^ZKJ+!YD$${*Zf)k}-}@bbU?fnN6uy9~qF!d`6AGTx%jVaUHFlI@1YPxg)c z+w6FkJQLp_c<^ICt5Fu~mCyWErDs}9J{@O~o7nm$g0=Tn(_Q|oHGkWCel=D(JecV8 zVv5F|?TnjbOrHMvtiR(U)9Y7_f4H+!n)xoabQ(If%~4#OwV;W8mm`ab+bPyH0*>rc zo2(cXkl!lzn+l7l5Q2? z%2TAQVcc-7qL%fY0!!~ULj$MtRV+JMr-UuM{nzoOpvffuqQ~(Go?o6num3QGHKS4g zM@k*rg$^_2iuCLD0gNY^qO5pJWHVfZMEDoP?pwec;IrVO=ZRk@>i;WbXC#WxYA!Eh z)-Jzbdvt$ed%e-Y%L*C3;=(%|xufh4bLd`i%*_dCXT8F~p1*=o)`T}}3iDm2R}23& z`Aux-D`o1HYkbQnHe*yZat!7(zn%kg|b^TPx8f_WBfjl18_Yj|O2 z>8k^$K3re#dtjw;TtOl0t9!MKVw1%6W6}yX@TNX^{xqfH_a|-U70L&Xs-OAr;b3vw z@9z!ee9YH(on+uIn>I<9@!oZ9zMRFM3}bee^*$6WnBpB8DYs*t=ZuHu1+TvAd{CRX z`@rW{cWmEE)G<#lonv3le1n0-%))Vd9D}WwxIZ{Lm4MGH?zA{Z^QL> zolW9*nynlbM0V#ND4mh>=D}kjiF>xy++V)?KDf0v{(u3CT=%D+)&)yGa~_s{u*-DW z{`-=5=B#Z97p-HLJN{X=W`{*a?S=A$x~fki6%pnIzd~GkIvryeCEWj89B@x7WaR$C zf56vdfo8e4ckP2Kn=P6-3QmcXT;HlvFx_~?<#X(JSkJNF5%|Qm;~sxWm~w|chm371 zbDx6Mt=mR6%*RB<3t}HVjV_ls)6*+)r{`+J?h}=g`}Wr#R$z`<@?Gl2g`ey`*B4k% zx^MrR(dN^0UFHHa*@}OP>;<8m8%}fWX=St6aOi`e#Ju^9)~UXwy%G+W&vSWo9Vnf{ zFA>qGTg>?2;q5gCm|Na6z2_Dan!+Y$^mppRu*oA{n?Im4UB^%OX z>X_w1&TxLwF4!eiG3WS71BAmgr0P76{@a@jsqm8E$k zvsY>gX{>K#5B_I-DBat^yKKgRN&%Bt?wbaO80ENFu5CT=jXC4mgqea{xFv5W{AQo) znf!xYj*)fxOoz!c4nDOg;F5ij^5K$nz+Cn-{xJvIjIB#bzL;OJe^AA0CB@EX9B}s& zyU7|R8Ai6XkJA&_^iMO)w_(&tKJa?S|NqSKil>-%b+T^hZ(t6wXENW;B%QUt;UU+) zkZB+Fe?%y|@wv5qkH2To&@ao(C(@ulD}g0{Im=ddNe5obfVE6^eLPXe8&`{85K>b+ zaZ3M#ZukO8#R=68r?<{fczrW5RdmNW=CgnPw6E!8Z#A!w`}f`c!&|%m{|Xz|pJ$%= zS=yqA@80qQ94jX~eAUjl_E^8>vEB-2{#y!1n09_?;)Bjv3-13C(S>|BW4(p7Uokv#glNzD2?$l{@Q(VN?GlhTIMYQ=flM>jD|gPW)qV z*LUn>-}8)XOI?@XuGbtZ#7(ZU&GKW5^=0lVyKwT&g3k{fl(iIW7q|&=R~!+lIA*`0 z{lKsOsf;G9Ec>*@=QuX-Mm})h$#D5>Z=n32T~?Uc%J_}AL5#ypp%>@oADCzzu*BHd zX;$chj#NhTy8q3G`L>Ah*6`~nr}(ldn>;=!#PH(;e*%9a=Z*mRl4r6RzL(@5ct{x+ zSes{@J@j2(UeaNc3BssxMw|MeH*~6tHsv) z)UesDrM}6EVS+M;L}MYB)l4}d_WzP~4e!EP^HUgg+gU|bd>(8w&#>jm5Saq1S5lAE z+b^`f=&;r@;qh1gjK87Te5oC6>?T!wvv#pAOT5rHWkJC|ZY_s~#E;TfRLn6J4$;u*m_^cwOqiaqH(#2Jyp`NyWzjFgI_*-T1J9JqghVlDKh~! zUazL<(G1$V_8*Add_dQP=fUF&hhPQ=^M%o zcI&=`!)CTO2LvNRA6!(csabQtS5g0>V4;c@|t|bqJ1Iu=z*c{XeG}vUW($l3-r$t}1EaxR~d_rZ>C=xsR51UvId|U!Wqg zL(|dIa~`9~)Bo%dW{vL+*`H}%*qO6nsnmkZgbRX(3u1d0tSk;V{QCBEeV+XIJxp@F z%r{%l@a8x)TkX+r*eyBIMZ{%E>k5_{h@#?Q;Un`J*-6LDj^ zAbV_q?A<#DwlK{~uKFfqp;X4Wqj~mg?dCJVaSu3*`7565z37nS+qRmg%czOR%$XFF54!wKNQ-K`1jvi z^#^y)+dTNXSS{)j&w}bX^X=DeU_urRz zcjq6^n++QnuNQw}F0cN~u>5vtWACeU9`~}lOl_C-*xo0kvkB@6wryV^D4p=Uoppys zpQwb|0gsd)%rT$8$yWS1qn@z*zxam4&rB73kE<`Fu{Z}{3`uq zmRE!`W6XQT)6N3_kH>qs%bRRwmb$^vJFihnT4uq@^t2N}x&_VxTXa}UxL7i(q@&s! z%a1pOZD^2MGGP_NCT|I=2!>U!6T(+Ey>npWG;U;PXz-rg@T{Ty*FSdIg)COw6Ig9* zx%56aq!l(?YiA06TAr|%%W5U_6^0bXYy0c#8rAmJJDPDY@wUkPKg6?BmNlZT+5JYt z!{6`uUmRh5VCC%gB1ETR^P~6=YC6~C*E|pwc6e&OB9A@yQ8J6!0f%(%|A~xSe?!@*=~(;+xonH~CGR$yijxy5b|N6|c~i=*RjNZ~iw(@0}ofeuApU z|AWa&53FQt7BD_xu739a;OnOfynp^LSXmJe`&+)~kMxQCZw{Odk~vVip}ui5-~NWv z$qvTT9zK!Cm(JCU3pm)< z8Z+dsV2dqe*(Jnhv*EM+o;uMz*LaOmcy2Ya>~Z5U$vMqnX)^tz{tF%J2PL=sU!0Q- zNM^CP#gfI)#P7&rHleQhoETFZ>x&8QHyR%-IKqC5?WcT1=RdZvO>h279QgcA!E}LT z#f4`L{~x%ptxdcu3X9XYleBd`)#TNCLS!ycF*}cunb~-4RFK{zk z;>a1ooOhOa`JP5o9(Lm;k$khfSl+HlVQOd2SR%A*v*?Ti|Cy8-Os2BmTKZG`#*M%H zYf>T_7q>t7d|jg6;Lm@?J;zvIlwDY&x1yaXucA?^{J)}j?BTpzhVQ}+e2o3eoT}L$ z%+{Ep&?#CJV4NW;ld?mi#7}GmBhS9ItWy>`W-B*Z%9N}VUa^qxlYGV!_8K0}5*2euyHE?oUdO$i{V!`g7#@37a8H@}?m+LRAGh6WAfjz(JaW~_o+bq2Sjc$|v zZ*p)u=^!bz=U8W}WQ`2li!O@~&qM?A`AxWZW%jk-6+d(47?a(@zv>$T7)+}U<}r#I z{8udGFo;+u}D0h@QA@giesi6gQ&L7gm2o+KiC)( zW;B{*G*&e};5!q4;%4`Pij+Uxk=Hr%M3}hEF0d&Fs51+x^*ngHAmMxC^411%Yo_HV zTpFeAB`o3%YyR`(TwpX;oWmG*?fv`bOflWhj~7(@H)E^RRBY2fU|NxMVDtGmxjv2T zf906+ijx`MTdoEa==m>i(Yj>mk~1H^%6{18l)!)I;MHl4q0#dm8h$wN zlKsHemIW7CEL|lFn3+nJe-?irG;#WYi;4lu{R235*l|nnZ;-a1u~3#LVBQbDc}=Y{ zllWe}XuQVKbnW+ERLh`Fo?9pDT_t%z9PHAM^hx zyG7Zi8iZ+!iBAA|YszdsmfsV1cT;F`0E@$SVRf)zhLTt0qY^2wCO z?{Ap=nHXA?Kf8yqU05r}bD)hmL;TBU@%%=1iTWglwUJXM2qYI2ZexFUZd%#{=DbY; zVhnTpxo&0hMy+PK`ICLsj{CKL_+lPc%2%Ab@15}Yjrw8H2Of)77-VeWuV^s)@Qv?5 zr22tv90f@-5qd_<(waQ`cSy7}>VEJ)U{lUt;lGaIL(kFl1I7RLF>0@uKA_F&s9d_| z!0K=N{f-IbrV0k+x&?rQcQ4y3X@VCoQGzu%~!xr~W9y|#|= zvgnH*Gc&yl99kO;`R=eVTd8rCB(uEubJX9#yg4sS@X_xBAGl4jSl`TGoF2m@og~B4 z_%H6jXO-SY-ZT0<^BZMfD5vKe-KqRH@!_Xt@dvAU;+e0D@B6)RhGY0=gM#Bm>dh+` zN)>$n8QkWtKaU~*>x1NquRr(>zkcp7q0=}!?n#QOBuj%gOMT6+gA7sD+_OGa{}wE% zWRfpn|0Le#d_3Rqhx$*W4v%gI{W8I#Ej zmN;p?9Fc#`KJy*S`Wu!T%y4w>d0?8iz)?CaVHeZc0}WEPJ_}~LUC?0@&R8N|(ackD zQ{=@D(F-BQ8OIHGx!$3ary`$0_y*qx2CfVB3sl7x7=5~4f8yu* z2iDgczh1NdaCPN@PhvBs{bMW_+su63pn2NU2Da3Hjn|W#K5=Ipbn|e&986# zDp7HPV@Jpf^MZsf;fiZ28uB&izu97#x$l^q=8AgHxkmfHGuwBEYJP`8&c5t~h+1~D zhW!kWMYqWGvzjC^&w9-^|0L_`C6bZ{FUKVGH@aCj*fGu(=r!ytENO8c>ekiqr4rL)o%VPt5{9n z)cs>$%g(ZHEpuO4BcB(GsgT3#LkGHVH?EDmk*9iLqr?KP8N4$D9KNq@`u3qIJk!uo z?W98|e^I$!!9}|b8(H?9W0hFHKsnw)+4%oWhhBcM0;d$VcMMM%@``@4?NMbixy~Qu z%(`nY%M{B4>WiA&7DOJbEj6%w`POmaoq;9wuX1XEb=|PJv;%)!ZPRnE6&z(=#;sn(5xbH zL093y>Wl_n6*IO6x0n{xJ4lL}=>8YB&^gR$6Cr-3g6%bPmHZY}`6(yro24}ugs}5S zez;bU#&&}7(1A8)gEJ2|GhoX|18@>^R0!a>FI>b z$K?l|k4s8AIR9VZx^clu7Pk*GgAWKWhpGLa5piJht^ak+VUET|8<@qP|7S1_YPdWx z=gon~&JA}fFNEl8Q5bHRs3ofE9b7z?hvl)sR_;P>2v)^8oMD`z;g@)Xpv ztx#q#5jOeDd~U^qCea%PES-NFW#U<)&U3xX`PQ@_Xt>E%BfwjXLROQ`+zz0uLbsi84^4(AR{mI`<64@&>?54=32eW1GDnJGrX zM8xvo)JypfcI^m1&=nW!*>%vvf6BvOt>1YTB#J-S`G#jfw6KGDSOL>@o7!K8jud>q z=>1@pWkMpa%tc1iN0yfLh8|u_=XWv7O=hxc_^$U^`N3JC{Rg{`JMxAEL^SlRdBh-h zPe)gkH75Fd-@}J{j~`&}+;7xy&Oul-Ep5ZLu=ELRa`hiy9Av)WW?taz6cp0ZD7>Su zPrQQXxc!4g1!VzCnM^#GEQB&xV)pQBIn*%LCFvcKd#_`8`??`(yzh z=Zh^20gETISA1s6IPy+=gHVg9lsz*)%RlaSSDB@o4p{v7C@V4jfW;ryU0?oP4{m#Y zzQMge;+4?~hW8(zGW+>6vhQdNUiZIYcf?Oghu6jb8O`l%cmAC5@XF5D2Lw0gJN&*W z>0r*(!PGy6ajkS{-~@&^Pqsa?zgibqiR~zx#2X>ke28aD@vk2%KOazT{AbL;+%NEm zNp6)cpG;ufwkqAj{0}Po7G%G4NIfi`pzIOVG*{8?ki13FGQOAsHk+e-5uHuTuGlkM zv&1)CzJB|gY??*QBelbq!w=YT8N6@4mbI^fv&Z<^v_{G+j$5`$5=0N7P`3EHX?GOA}wMgaAgQr>N74+12(rkoZP;#_5^ym%xuWc;%!d^-^m+Unv$g!0^6hqh zm%3z_nkbaEqw>4<;l0uB5^r>`NHR5~c}Fqzt5tFAImcHq`_$(2^9L^fS+M$>1GDnK zeSSRQ`Sz(6oHCuPrnmkvE#K10k|Hs0|E?n&a_+{lZ5JqKOZS&=OZE0+Fh6mJsc%)5 zQABhVlQ|1xc#)Nd@45K=Si-Z-<(no75p+s zMTA-PzBA^X`}OlJ@8S3h$M_%Y$_%LF)%q;CaI>k-14;1{YNiF2j5?DJJbkl&|ARj3 z6_?qoAT5c{1^Xg@9}ATnsB;jL8{1;Ga(Ng z__xUYWRJ6Bo|TrulCRP-XT@oTNISMUz0C2O4)Da9pXHgkF*&jI!~aIJod!{HfyP^$51hjs)|x1=J-xku!Pbcj0tGL$@;dBquo7I*=^r4?C?dAtvarKz8Ao^f z#`SG1+rBt%4$3*OwL#|q4_6p--V=poI}(kX7kpsJXJO%;!XWMbK=Q=@o(Y%b9A3*y zIv!-S66$3%;XHeQ$8Hzfm4)orDibO_4)bm~EWW3QeTO7xNPUyuM25A}?72S@S=XIR zW8U>w{6m=1g~-DTo+|n*`1FBn(V381^T3wjKx)c@ zy#hKPrrC36Ea~L6>EVp3W?eUBX2bCf4Q@vroZB7To29ijWJV;+Vqg_}VIgs0gY<^| zCmCkRv#a}D5Kv}TuDEEkVmY@|Fq7)^}$@jdd1_34N?j`3uJd**c$$T?@;^+ zJ?#tYcE~T#w0^Ng@kbcn1gi&8l5QWYWYpOB9_TsRJ#fmqur+eRMfn652JyV6zrXm6 zjF_`B8l*%vl=3ckSb4!s{6cA-%z@0p4gVXW?>jy}x3Q_Ll}Y$ZdBT#WL(C?wEL_PG zW*=ND;O2JX=FI>9nx#_~%;U{)J`(?8g{;QI#_Nw7rR*1E#)y4*V#S=Xg=5>X_x4`| zqAzR|J&?k3GnK{X&4V_@6${UDMSkHd(mx?_Ax|qnS!zp{K#dFUhJ{>Gj8E9!nX!m# zD7f1HH*}C{JisjEz#UfKc+HccU-&1t)nX0{AHJ;q#_N?vPGwq+Rpkdh{Ny~7u)ukm zI|1m60`5|rfRzdbITT#mLAxV%xERHrH{4buVlqrS>ckk%EB48D$>l{8-y88DJ?(8Dt8*x%z^k<+=XW<9ju@SWGkjb{Oq zP{@bIYr;)ZQVQFP9IQ?ZnP0XBJ$Hz97i5Kr=dlopX!XSMiiwjSNLI z;U8K@?;q%WyTEjledFu<5e?j56sNZ~t4IB7lzLq+`9OC4{|me29AAF8pI^`~Xu`{H z^^9%HW!XLV#4OHo#eHU%v1C|k81Puy}hG>RkD2W<<-^Y z{gMu{yW$VbO@4hnCvAiI)f9tEL8%FUKhJ&m^YC{b`$pc-#DwFAt~ktlcy+Nq&jPp3 zrZoy5P8r0qc|Op16rXVT6WfP3JG-anGcIpzbf3|%?k$t-M246Y-d%GY1LI~nij+w1 z`)L25YH##`>_hh$^slk6D`)as%xoTFw1T0$DoTRk`rD6x({Jqm%JMIahr6X&a6O>T}3m-j6w5-$D`lp zKRmr&&356-1^EX)XWSn|7ERB$OR*?=B~)-$=EE$V2L_TaCj8@%uaNw4K9+Ib-5>o2 zFS+pBw4UOPxyP`}=$+{YuKm{j_Zjo|{b0LuW#QQa$GC00j$P?_`1^9(r{-3>~&SW1??w`Q_Yp4jLZ z@85QiwPFoVMoV9(;0_K>3!`7MJGg(c8l3yjX#TqP51W-yk7&h%O$N*vf7LR?o{JV_ z{rUBD_kqR>|9OmNMe$6MIWM^`em|E@n#ZJv+68~V?p!^+vHZ^|qZtw}nXaFgVz9PY zE#VhmeMmup$BOBx@`oStY7c@s(|Opx$)<(c2O8Nf%sjrJh^@p-^M`{+LhEN{3)K@0+S?s@ z^%8zD>#k+uH)6P{b3su3L&oL$6Kj}q#6HNEm~n*YG+w*cc>N5MweN$=+6_-lcKGwH z5&y?@`C9+`1=jN$OW87N6$`#_*IZLz-jR8d!LF}?(c}e_)fb5!n*1iEXLzI(8K%wk zSzx=7=fUlT3a6(#d}ZSPu|oYqk9fve>5N@sA!>h_&1URxG*e^xdzj5;S$i{kMW~ka z3T9rJvY+fy4;iCavltrN?n)?ROFH&ieQ03F$dp=P!dRBaJZl2nOiOCCi zSNS~HI%`2e3X|?%CR3(^o2N|(){2)PX7d6zqoT*sTWnZO zPI2DiVcNyXyQNrW&mN8|3s}x>VqCt*QQD=x>D)=i+=!HR8GV*j?+=PwG&HepVVovg z^uQ#enLCB$gF5qxe4Pi0p&zd0vwe7(rC@iWc|o(iqcZn_JQ?N}E4VLg%ex@(A-^D> z!APEWSF_laU2L-JII<4>Wj4=q=;X+dG*0pAW!)h?iFc2+aKuhV>G}nlSJpoWRDNK{ z+%w^#=7+5@{~ec`Gn{2Lo#Svh_W_$gLA&S%_0t@4f>N2@YyIW7lVdZ9;gY(S%ChZ| z;^kczHb0H{?|f}mW7L-ge%u=ZKTHxBJt0N1aoSnC0schs8S#X?5 zY$wGYq0k^Ldm%GEppjFqFohvkn89qGgY~R`&3%U$?{YA&n$ggEa{mHm3&F*+7kpuT zx3lS5!G^|bQ3ValwH5cOJTOtRF34);ULj}U^nLzE^&Q9AziD5{yU@$#v*4oqg;~~a z8(a_Ys-1bTn#pnTzW)c60}qtS9`Ir=>9S_u;Pjv0YSRn*j9NDB3XZ?_1%A_HZ@hTU z8fLS=O*JEg{fgmF<~1(=4Gfzu^Ji?dVa`~=mBG3qkS9x~;SaCYl^X}rgEux?TQ3Oo zxUkdjL21>3Oi{KIPIv3=|2sRege+)UCgsqox+0P9)dR+}EXR!}{NvQgaR_c*v%vVc z!}3?g4cFY6sy`mENM$MOahScRuCYAQSxl{YlF15XRw-R}(b)^mdMv0c4tUD=Zeo+0 zZX+w-i*x<~63y1a2Uc%)uz`Y}}fpy32V4fSALg@l5?^J#q|Izob`D*@yiTd&qIzGG-B2ydPPcXbc|A%SK zj`{m*4i|j=mEE@gfT`O8&4LSUP4WiAaVZz=gF;&y!MRy!Vk=yTEny8?zsgoZ<`dn&e;hX7`AbqK2?YGDeK0l0W{=N<&mZg<+@Jkp?C*HUkf+C#U&Ac+$VXoCK)PNX zW8aqz%%AOENV#9wyNl_7W^`FXbHDVAxF?O;13EW2gGeCCQ3rYmND7vAA5aAPII zG|l__>Jk|8&oCb|m$oio>6EO{5!_J3q^r-c){*6{5!=+O^7geU6<>c@GV5;;{LVka zd_9x&+vWN($rT^}=@+~burOkYxqOD})rr6C_fFURlWI2okY(cc;MODY1CI;-{cH3w ztYg~sT4=+<^XE=7?-Bm4eb|2)KabIY9rw5A%QL@l$dOHbka*?5%Hj)CLl(%@CrmJA z&Pf0JHCkNKj`_U>oA1Y!nXe2xytJ9kdl=3yX1SNmz3Rn(#?M+Afwmb_gs#{z%6|OB ze1r2Zmrj2kvwK4P-r92tnx_wZc&b@Y$zagDkxBZ|o&%eLgPrFoTAFn{lrNa_>CsDJ zo^#jk@w~~YZ&aRjzA^mGNrua>jM>t~i`h6MEg#rkVLC8*W1aB|ja3GJnB>}zFvNWS z{ZIHs+JyNBG9SqE+;`+Tm-^uDcUR>&uGc0~eo}07d?1Pt?M-H6( zG3nvm!?zEV3eJ}lQQaw_qq{{SEN9oT4Mjht*rav&*w~Go*-9fHZ29nUHqY;P+eC)B zIow(Qo242SxbeSO#u2dljs1pm%(CvESZ@UW{`*?KqD!*{PizG z*`fo|jt=Z0%&(aO)cK8mFlO2`AL2B*@P+$EL~GA7CAMS-<>?CMO>8$B8V@rVNl$q$ zd2s3(`wzE@Z~Q#6;G+Emi;Vru!Ye-Wm)!CHa7_L}0ON-({1>boUN~ImPgwjzJ>#9| zjb{vJH~jn0D&_KnJ1?~PyNSc{`HsuW8l+Y&P*r}wD4O6bViCY(+k-035%Gec(X#8rM2oCb-7MFs=4q&Pr2fusm0@Fx2q1i^=xS`oP1BL^Z4NB z;})UMaN_}E@1MqH?v2rh9S`4K(86!E`-OPHLgg2$q%XYuy&zCFKnb*S{wsIH#pY|z z8l@B#eBOM(TE)>?&QX0XQ@OQMne#vP`TLpUvcJjSdCSlr+$5E6U>J~kl4EMK>bv>_ zv8g%x>zndVFt{syxKtLfn7d@Ue#H^N85d_X%&Mzr&rM|PO=$3Y$7Yu0U|!OoReB*q zWXE=fok{JoS6;BTu~yXHu0LVL9dM_~?XJT*rd&4${+q_m=k74yU&Cbch_S@dIOhwG zO%0Ec_>INPYi}kp>q)Si8d)~1traWCe=W|O5vadIo#|E!1CKS|gFiAEr#`Z095>K- zyxFNwv$2)ML$~6W^bG;_`_i0I<%~HW8uIiW2&5+c;3zrof1xtzz%k|wZTlA;G8e2= zFU*~~ph>`_lsD@^^I?ulUM$}W4%7sk@8&dG#h$gHA-{!jmwd@{uB!Wy@G1S&}MV@mHMvu>1oL&J~5Hm~ssMFq%zskd}@( za91S3p5e+5)~<~WVpBJ7YOvn9V53Obg`IT=R$7-CJZo8F%D9s~X(mGP^&Q__Z)C#sEs zi_0xxMw7e2Ohx6!1&4S{v^Z}Y{^vGnXVh|WoGY|ID&QdZuDNX=?Nf@+xIbVj$xCQt zwhE9fd1P6kA~9o|MU9#%zhmfzThtH;OKX|?LFRP#OzPfKx z7O&X$ypXe)`{}9fhbohVTfvNZB^Cevi8XK3{7}aFz|7w|;qcqz=lgjU>^a4@$9r14 zJA=(6UaJ+edmEW;dKphmTCg%OG9j6BOW;e{$Lx2~ggojtR3@2M`Y1G4j+couB=&up=ZBPv>* z`Oefe3s*A5+|XxwBmS3Z-RJ7lA3i>=W(#mUf9eG5y_bLZEMmUOT5&1y?a@0g@k0JW z?9L#YMLhD2-!FA>oNl=LSJEPgZI)gg_nnnoRwZG9o?<)t-b*ucOBYNxzEC^sz**yW z>%@4xJ}pQtZAjNG@@AA)yf5MKlA|QS+`fQuslxy02YxvT?!pz3_AhqK)sMf|d_AI&JY`wfYY<)_Mzb76rWBpL$kl@aC z=D@2UQk zwU9c;ZnNzfe*y0+^#_8sO^1?rPHEX3n4M(Dyu7GY(yspRQG?oFIte#F^&UKNVnU;* zL&w8w7o!jSo>wWU(rDiEfq6Q^iWMgeS1`W+TwC>r8P?rSN&4~SgWlov2NTV?4jkU(nElXUd635mFXM(~hu7cR zb6P-5_T+=?{38j8ibp?iMuh*V`8q{W_txCTcF_v%)6LmD`{&!R$bIC@gI$gyvpaKyeshJGogxqb)OcIAoPILK(4 z^RL0`+JP#eC2f)xp?q=4oVWgPuF-bLOJT@;!rZs#u-;OJpA$J_%$)OXH1TvW_A4<@ zyZvBykKKNxWvdm&-xXQUeGwp`s znFXq@6WmNnp7Dre_)M538B*7Ln0JSzm`yc1PjLXVm`K`!4@}p49dZ{m@?WsrvA}t^ z<4ai+0mdxlzbvbsGfk6RV7hI8!)wWd%&rS0{nak;<#{mwvA^`i_DN6Ni6Yex9?B~k z*JLQ)V<=)-(aN_=pYMthd+c(yTdG`9*V(dkYMJv&8tyFQvN`)tKEv3&;H~h6kE~LC zPZ&dQEjT8>LMV;R^hg8ui^i$OFZO6NK5*Q$K)2<=+`R`TdR~ySzmOqc@!H~r#OC`8 zjIaM|s&??nnIO2he#14bf>|%kH#}hSo&TZeGh=z!-;{=P*nd8hwj&CdM?TIbwvv^}sML_3-{JBWKWwWT{Q zpVP>f_m@lOkE3q-1;^8C6!tSj=e;>lDzV?O-Q_>~-5(5651HO=V=@(JketYRLpho4 zn^r~R%tqE3FD)F|LyeoR?O~KwK2X_Zf8ghj_Xjro<2-X>euKMxgO+gGg|&(cveOzw zSv4G+qn`MzS@3zsfoLZQhsD+lJXlP7EF98{8Ko<74!8*!XJm+%)bLeY>0z#Ew9h!g zdZjsmRqiE2)P(>1H+D1Wim}P&Gi7ZlWI8-q+Cu0UhmGui^9}8%PjEy~|k>L{**mAzXAx_=Onjg@?8aqCFg> zKSnk>UwY%P`G0d%bkBpgx(hz9ki5~jaz5*g*T4TuTC8F`^Jc-tr}GbVvF_Q%cVoqG zW}f!{2Mm~F*BoZx%1=mU*%Qp0Az2~IVo=<8=Nxm)-@o!EMGSXXn6fPXGVS8s68B#I zMU6+opa0Bee`Yi)U;1y+$jkdcL|VI`g}KB{NczPY?+Yd-8&nuYg=7x6USG2yyUJm& z)&;*u_xB&nc6VHSx11Yk_Q*BebC2VV)aY9!2L;nfV03Bx2Nyz zKUhV6czEr=OWC*w6Q%9u7?ktW#=-w!*lFc70-f9b-x6QhGnjftn*AZC?4hA zv-N>=LE^vO*X9SUHEuRM-@2FW-JLu9d)VF?e#kj^pJ$T8|2n2ue~&C!cZ?-2dnsQ| z%0I?;H)3`dvLAkQc6ozxdAvkKL-5p9lRohn9oU@{`LCYY?=$0h%gK!QW^(ngS8B4h zc~8$XzO(Cp)5CL%(+|WRDwk+!%s%7NV4iHi^!ea#d56CTOtjQ=&wXH=@qK1vo=wdk zCT8j78qFmMFh7-E@qxuGp|X+JDlK8x|6f1FKR6@>COkdQy2tv5RKbJ!y^c{{ zVmBn1^OzXk#fh@Ssej|UVep&Nh9@d0Vh*E85Kq)JUEVuBimWyr6Idkzat;KF`8|lT znPB~-A&+(KauIQ1_Gk8fZPxsa=F9HvJYMiw>w_8hgQ;o!@(k{wj*@Z}@6YlT^VnC&;$$lSsi7|5=T!7H3a$&AIpY=U>xi z*$)X%et5{Ui9U#|SRfd3!AMv!A?Dw&Z;U%mKI3iHD9ByX(4kTg+#;~!a@EsY%n4in zN$ya5D$iUnVbVb+i`wj@42C(EQj&M@+jRW?xVoLk=YWw*SZF7sNiWN;_ut;__2>Ct zU(6_d=zy>Efu$ln_jfcd7pzI0AePK7f9))r%*v;1dYy@^an|41B>b%V zd3t{%{|Y~*3XAOm1%FrVnx^yNjCrb(~KIS{-3 zK;Rnt`!gjgZaC~-xS!$rzm<&A(c2~8F+FzSwRlwf^;m4%*=T-)JM8xybJE^($n;K0 ztN8K3?(kaf@P_Sq4Ch}Y3#SOM^vN05RUdtjy8e*Blhi{DR>B`2&Q(7U`|!ZrhX?ph zZS3ZkTxav+-xg9|RIFT)mk7fXz>Lb%&vWh9`ryVobec zOG`!LLoS`e4ZVeY&#v>_x4V;G@&A?n;nU{-CGIiv@7cELQgTJvYp!O!54UU-857$U zPhW3X!?>(}{((Tw3%WXY_Uz#~;5+xgu(9=Uz*Rkwcd&6 zvyEkZ6L6x+>Vxgh1HX8#=>7cn*g9p4bVRxl6FZB9L#on-i40jR&F1Y4cTay2Em70| zkRb0C!2VwTu=oRq6Y>dnnNEq!InW!kKrfF=JR?_A zo4aDK(u)UKAM)ZZ`0&1PC{6hL@9**G4>MQ(ZwyzcW7qrqi}Q}aPvISv>?J>0GS*rc ze_$vI*vl>T4BSz z?jM+#dcoIn!BK{u1->f}m^SQ*=e12P%CRxfNG+CSi}x!+LAZM~tkXc53HaODxZ{;%}58=O+# z+SYh8_&+mjC_C5S#u?dY8}&hU_JY#vH52CQ#@jVtQ*G2begA>+pM>kZjbECj@)tBP z>b_yS_@H=_L-4c(FHiq}a7~r@#iyJLQk((FlZAI2?qR>tUBz#;h{575=Kun;U~KEs&EaxXYGd!e{dI(8&`g7;f%lp1F+qogm}9Uwkrq znZ))ic=-LlL+$;>!`JRN?)AOE7k6P7?}aOZKh7vz@Q^Pk;kFTF<%tf+XEiy>Va+<1 zxn!XYcZStmNtuZcUIt&d@vQ#Bx!d&7nz?K$vVTJ5v`4fuP3y!{8VA{Olo>azP9*r9g<_jCx10)@H z-)ej=$RvILft$h#^W!|XN?C51a^ERo{9>LFsBdgx${^kH|G?_o2duX^q%~NHEO6oY zZ2y8G`NSH%jMer9DuOTgE->A_f8gSD`vZq~w{%OF6sTrw7tJVUHBgW^Ajx<|gK2Kt zfAL9i4#D>mc%82KG5HwRH?lHjh=|wJiDo2zoPU3UV6xi@OFxDCjel5o2eQ`$vse6M zGdp{pL2@Ij*opD9FE<9TdeFSzqp2~gW z2GhC&Y;!-JW7y@$Ub5u~_k(vQo!Rvm`gMMuVYtPquXKQK&b&X2d(?0AD(abWMbs5A zXx|s-IUTkp-J>yIUM7Zh!0WoWsZzYgXn6x!|4f%HNWntvQ5~_=C+Jy!Ks(GzTW0(@1K`+;ledW zKhI4DHdWtP_PBL1ZjofR@H)Y}XJxar#ozzJ5gWJ|^UWE1tM)Me;@tA=y|h8>UdDO9 zzcWW{nri$0YR@#GjwD^H{;ZKcx@8=K4$8F}vSQZP=aa%iAk)<%viGuRLV z^$kMoYmJ{UlqJONtvq;uQ>IXW-OTUcT(=8btT!zF^p*RCz&m}OPex8W%harRraf!p znUvJTvmi73Le--51A-com9A_7?%XB&-=CZ;-WYzYmRWx$!`m8`yKaYg-l%Te+|+mL z$592ngJ%!0-ua`bz52ul(H(Yqf7{;j?B<`BSn=nDc*acA3a(kbPx%Wb_c0WR_{miW z=xYD4+WY=M?o)X?hWA=*W&DoHt6oL1@$@(LKKk44&t$zdhR3>0HepBIbGzooiIN4! zcQPDa&aW@Y(ir?{!PmKB2c(l^-ky~>(#Wf3_h6DpWWr(ok_3Yc6W7qdnT{ee*i;+; zv8{DCxnR!luIX9Y4lbMMPqG^x^35t_ILo!S_OF~p*EjhZ`7f)>^$%t~W!vzvjJe{; zg`?WnC9mb)Ib87NL@3*Zxfi@n9S}@TV4o&x!~J>s!z(j?A4p|8peOp_hiK@7gHK+b zROFd9&59>x!S5}N)|*-zz8lsvndx26wLP?<^u6Q*wpp_eeCC_kP|m$S#iIJ1(uXt= zxiDf&8 zC7-BPHkNa98{1TV<=kQE-S<#`!_!*f9c5GbZ%lg5I4w55QQ7NIQ__KzulgTohe|f4 z^1sjt`M?*WcELw_hx{pqRq2k|pB)y5#y4jE($2VUn;|uWannxLnDtH54m5O$xV`Wy zxbTKE!;NLeF-LZj<}XcB_76U_wMy1}Q?J;@8d2AD%JD*m@CrMY=`$BZ&iT*tU~{Zv zspN~4=KBYZ-PC_@LgL4r{q+k}-40AS&0}fFT*Irg;v&Zt_Is9RI4nQR;N7y3&tx&j ztrMIj;w$c@vHy||X=|Q-cFM9CVy9Jh&_Ce{oxKY#P)EcnNK_F3b3AJ%Q*5{k@953(H{6Pcrg zIiwtav#-4G@Larknptz%yk_(MrnFp#X72^(%wH6-Cqy#6(kN_5TRTIsJ>{^OYm=5h zfU}rL--4O@|6h2T@F3DKfuq^o&2jMthyRT|Eax@;ww`&^a7%T;Oydt{j`r8{ED#L3 zkfCW@BFvt#pkpGZ)V>1@jJ+G0&#=aBV6YMwGf7}tWqe?9hXZ@Vt-u9r7V-t3#WJpZ zd^>wPPkqC~gX}u$kq*6E-!E9K?XbJHQH~|NY{3!cE|UvWI1Ls=9tiGU5W!^Xa^v7c zeyNF!Z$p?&4IHvxI81BKOJ|7P#UGW-E)|-@;JcpDm|26#p?tGZquR~?j%B+KT-$Bv zz?j3%`{b6y2Opy!2TtZ6n5cGvLw<)Nm(QF9fvfTl2rk^eAnfh^{|`2wKM-8FV9F_u zThAD7#V|${ALEH@W{6tB8TE%hi^YK1-Pu8uqe6=JN&$0!$foAy)eg4W7ak>FxMhCf z>FEVsvxKiSJb0YM@HNR{w}GRzq@!-S+k;!O7p@o-sM;3j@?PM5&?PPLJ-8>e~g11s4otRy<{k z(q|}97k{y+_`wOCj9JfxKg?2f)bvYW=d}366~(}xD@SzM-7L-uJ4peT(BmF1gT@6b8Aurx|XA{$#$f;^%Q5E0fRm%o!|FS2$AG z#4h!mnV?wo-~$iylYo#Dzq|riPcy~b|M*@!W2)?i@4Pxb2W8DB9J8OWy00PquYm*G z%$uO~=Kq*QUA ztqWW}*b0AmvzPw?o8F1S1zS^W4rrPrCvzqwzfnJYSN*$$1NVz~rsX~N_xxd5bL41) zvef}W(+3{27BO)*H}5rV?$~5?cwX;qiEC@_A1wI)Go9_2z085^{Su9f&Eh5F7?>;D>oitXnCOJlJ3%0i1-}f8Fu*J>$|Ic{EgT#ajpF$D@rU#~2)PFTQypp?I z;@jK1d~wn%va^mVsAwH7DF5x)maadKdA-zQ#&6#mU*BvnX0=)1JhO4`3jPC{{(gP= zJPVwDYHzsAn&pz2kzrs{_ea8__Ahfqgn{^vj=AjzN*fm)I6TYoa_)lC88!z_MaTGb zFqUj)e-R-Z(ELGsgA;3SL({tpsqB4q91PdF|FO;$W00~H7ffW(-BZtZ=LUn8vE$tv z@&_&oT~Mldpc{PP(KGcA&v?t&K7_^`sQLcrC^uW3qUQt4LVn40ar@ZkykqgptF1nD zfO}8xp%CwW$2jL150AS)$Y9QBw=Rj(4RFyE}vJhM}%)bd8-;yp=^_V6tD!#!&mt88x3d&Lh5&y=4_%H3g)o5<m_nlTVs#d$iuZuP=L`@h-T{ z-QUho#$wydhsp)*CMz}{RW6v~$WkHV<1)d%nP3k4srsc5#XwJu|ljz8b%&Bi0)V0~#lQ~oCb zX0s`FOzv&(@9aLzASKEqC(L6L@Z0k6y}RlXdCb?tnb;>ZzK)HQ%wuwYH%<5683pyz zhaWtCdraWL<1-9V-8(7{3bI{zwxnl@2pe`$Udvdmp5j(J&osgpIrKl z(icpJcjwRH(QnL7v;WWbOgh14BeOf-_4f>V`3%d_BPBH-v`Hj5^X<@i`1G{ihtGlLO$TK^*H6g4>hQ8pcE>_q zlM1$13{7TV8V#0Y9$;Aa#L+wHz*)P3+T#pz+KlnN-^5G$WLEr3X^oLR#vm!mBD;uR zOZs3s6Z2)87Y(HsOe~nUIC9$A@!E7V?wZFlqkm!fy=J!q77f`C4`xquR1d9TEo*Sx z9dy(2sZ7CN-3|X3Wm{QSbvtq|IAE>=+Q;~WxqyAH;3hutkaNwi?$sZd9W>*BG()6h zo$+6m{)FbVg%J&N4FVp^?#bjg5oUUGrAf+mfuz`lwHiDNe3u6!yGeG)3UZXMvttZ8dzr&HYMC`*Gjui(_vgFKea7%SOEc9UR_4Xnl&YID5 z?T=xD^(&qS-JB1^3m8u4UzlWY;gWp7W42R*;cTCS|IwB#Vpx)EKHY>v6`GpM) zZPk(sMU^(lv6wbE>^)q6;cM*wnTpc|n$;{0wsSO}o6qb!zj4~G=CZV=WtSWF3SCfR z`LMJ6K;l(&?^vQ(q^7duHnYVZKCF1~5JQwU%d4+V?mi8Y0#~?G+2`dSWz4zx znR&UByAIb`ssfo_gP2rux7rM zDJ-T8j?V871X^6kQ#lc$dEvLt1)eYLMN_3d*Lyr^GK*<2_iSii;Bb;-ld$BKj$h{) z?ml6%-5_!0^Kb5ZsytnR7eur6AH3W@VfEjC&HYjjQXeKXtgTF8Sy%gj@J#UaZ!@FxC!z$w2crh#$GZJ9047&Fu| zPKn;gV83g`6vTXJ!QvW+ms}+)G*&Qj*q!FO@|o!td)AglKd*E~*)-m)2mhF5uQOY@ zNSi2e_#9YpPwz!R{s$}n1-btn!#6cbJ#h$ja1L6)rg*`AgRks^MCS`ujtg4<|8u<7 zVAOnxYsK=DEU!$NA4@zbXS;Bbhi8IekQ>{J#6=5w=hh!=`v3nA<8=82N!%uT`QyS* za-8JvdB7NY!H9dp&z=X|*Bp0GbA0{x!1D;k&sr6VW*Mt~o1f4>P#w_tQnF<73Hb%H z?HKZ-Dn7rGY~HlU?87NtJ2ue=>u&!4Z)d!x@^b^D$(heG6@7B-A2MV-BUvBx91VYP zHTV4ibHNSF?)yv{Uq4`pvrXSo_EeAAxM0;Q{(`@+@)O*Bf~Phss_P3@G;C2RxcV>s z!3uuq!2kh*mG@RWbDBS{xvcG_*aso@G`0_4ryZEPOzDu$felj=AF#b+`p23hV8pQ8 z-cecod}Hup`?}2rdul%N)v%o2|9^o|f9u0*Po;UvOY<0)Gfi#m4NI8C{7hBt!3z0| zD*h?^9l7^78XMU+$j-fgfbUuU1CP_%4=PLkFeM!@{@<|J?*Q}eoel3Ug-uUn*!lPW zeSe+>I){&IbKLPzKJr24M$^?9pFLE@W((p}Q zQX5xgfc9%NjA}466_P1ulg*SDoc?_lrrb`0zvY@Ymn+k}a(klK&V_pF2Cd z%-}|(wDFJKH<`dG|}YR76S^3H_B! zX>Dv~IMBR!ZR6!l`x}%S{pa0DzYsVv=>hw^`X8UyOMKWdU7Ux1KGXG#Pn=Ar?H*jT zzWn;#_kT_9Y>viW2dbD&wsL8yIe14n z%)WjgyM5*Y>wtr$-|Pz>Gn&+VVBg`xb)|vDw5rbO`rT$W28GXB^^y+WPIb+BD-+nh z&S>Noc2JHyP{g|B3fC4h$vc&4Eo;{hT}X2oPxHGy?7b;X?S~wkjU28w z-{PwO-`GEaX};%g@uD=%7j0@6^6CQGC9edqmTqGMYFa zVLY??!Q+z>5(2XsX8vnlKjRN~&WpxdYzu67q->ejKV~mG=kV2vdxP@7muIcn0+Pk< zl`&pzz7Xj0VXE+gUwk6pd=_kys<2gAq05k^-zZghU;|69(59v||CtWF-{cpl=`v@0 z6Ea!EnI+Rai}69QnS-&%fdYp0kCU0^@*Lt=XYX*Fy)pf&gYuCB*Nl}bx5#m0 z;1B<-du)9P4Qzo9(nlN$S#H1Je#N`NfKfVq!98Z328UAFA42JD9<5xf{y4663pmVC zGlx@n$w5}G4fPAM*ELKPt@t5$X9?T`DgT-)2evnFa46$#zNXj2FU6)7=azP1ie*8U;0=X8>^%~G4=&hea7mgx zVwY-V`MT(!_1b@qd=dZnV|H`A;{5Z6KU1Nhx_UvW!kG!J^B&ChSg;6e#+sd7PPcT=>G`0;Jzsi?< zQ+)BM=D{!53rT5w3CVIMjvu*8Cg`u2$ddJ)=`iP(X2~lvSneO@j+w%5_n+%UTEO8i z_9aXBO}?IHvij9JQSgo+!*b(*KTO)8Y5~nsGv*%P)elG(w_rNKH>-|)+1~vJ6e~W6 zIvzN~XSY=DN(8Gf?|-KCPAu=5T21T@N*g&`{=DE~zy-;P{}mTkEcn4xDsUkE|6j)U zdy^Ra!~e94+}U5((AW8odEZX9k{afW=`Za+IOPT?&l22okTImKfh#*ed&blA@df7d zUYaj4#SNN-GK zTVefGe8Pp!tE@Lg+vH4M*0w>T2rzHj8;HVt7_CJZJv)!nJ{S z@A7_mLyzvy4DOqEG?>q=No6={EUmrbK?;MM@*(~=8<^HFNN&Hw_klNJU!&dx_P0W8 zy?S*leVaNN`WH={J~^R+?@ofkf%C@}tX|HVBeB6KBTJLH4+kNO3l&o?Yybim@zkAK#O_ul?4xg}Jjk=INwq4^)Xg^t5(!+NIAr`#9F z|7X5@+5EwY`}q$__%al2GB)D8OlFvO4>S~o3%Y_Bc0}Lykhl2C zbEn|*v$xg{E~>qk%wt}jbCCJcg4rc?PHyiGdM7nlf0@s0-CHitVIc8Z(y*h0ae2!6 zxYP>HI~rf)Egl!VdnDT?x_Z08o|^CNj63pKES8=*&u~kTH>;tDx%^(U*{3~ha_i2p z$B3WgwmI+b8OvC4x?9%UogGr3`?x|&Q_uD z`}%Pndx`zVHmvtD4s*+NK4)1MUt9iPui4~-+>7l8wx;JSXg=I1ZR^l0ePPzC_ywu~ z2aNcy9Qe(?rhR9_rv+!rbPoJrd;21lwJgbjS1>@1;r#~IX^S8DDZcP94S398HIrFy zwL`CZ!og3%GwK{p_c=^=Y%u%V@T&fT$F=$eaUa@D7RdQ6u$|D`Qh#vv0gHdejn|u+ z{U86}&pgn0D|LYtW6gi7j4t7li2wE{de}Aeo1_`{l9 z_g(vTzW&5njRW5pxPN?bUGV%L({koIW^FFE2QtzpCayUkyy>9xtOEzw*BbxeirUJ( zs?%ZOsS_M|U;ibu<;JBm%712#y26(=xk)PaL9F9~V;lt&wK8@IgcvrvPjpx*Y|_gr z*T?3&(=qDK0v2vhp#ZyzTS7t;7Cd3S^_A;ZET@*s0q*dFi-RUuGdbFd1|&2}u{{tz zeem+e2`_Cfd=t9hz?-p|J!1m9jVZg7A=A=p`yYI>WPZUAc43j90DsKo4UT-z{xZ)A zV~Rbf!VnX|H*3>xewmd_U(ZBXIPA8aDdAw9@1R>;7FPE`O)Mbs1NV!{3ssx}{hTFg zVj1poD;|CqHhJ_zxJKIOLkCMjMdP|~=C$XUp7E3|h(D06{?B>)#O7u99Bt(SoS9bi z|76cd)GSEh-@zbJ@|N48+1RNpqS5HucKZcf6F6<0*rc|y`U?L4f1Ga}heNis1G`S+ zc}b>kXX+V*U#CC#D7>IeX+bitVqpRJ!H6<+vaTJcwQg*tOr^al^ACqjh*`fN2C zMk_vYdZix_Y3XA7Xm~xaM&t~HWgC_UO5(kU- zFDR|_d0?u%;0KdGKZCJlMwEPwg82^dqdfZ}gy-= zJ^%PBYM2bx8!(%5I+PhT_oXtNJ#6IYw%u_eb9D7#o?AA|QjG0$y!fL6*k1)0{$-aH z#s~hwq7|UMlS)1Fq*yy~3L;CH%Old`Wd?z}rUc68Xa6QH! zbDwF}BZgQ}_O9%}2O{sI6Ap`)=<8{(H{+&mrn#teyH)GA+9n~ zv+aUFe8N*!nN$|J`$|kUlRrp**bw?5wD^E@lSSj=x$o^9&dIQxo$`nI*+csSH+dcu znLOC?ApL`($%31G?Edmb9)HBrf3Vz{_M3MH=PUjdn^@QV{LLrR_?tCm58tk%Oj}OR z6yH%MX|k4Q*CAg9i>RM(kEdVw>3yJSUiU-c0+Y7~r_MfLnq@92x0fwXfzi)fQ=@TN zXKy3#_xb~}HxD@X=if_V=(YJ!WNg%MF7L|aAhx*f@3MO~xp+lQa%9@^uZ1L~Eb4r-qiTQKjwrj)g$j0)G>uzrl-NDGZYzH$`uP1R518M5VfPI-X1J{M;??W>2V{SR>oL1O zZ(ucju`c04-pl<59=_Xt;M7-nZvFysYvsdVcOQ^FbKuzL-}>SbaeFJyDzMs2dU3S9 z{ea-hcAjNyrw&xF`YPcN+%vzCz23O-{LkkJ45kx)Haxwlo>23T`CiT;ykz!uHs!@5ZmJ!c_ zxwB8Fy?0)v2jpo>ubvd3s zF{|+1P~k6P$DZz~A72i-%ZdzG}HT>A_8|3k=8Z-=DDeP`%^c zw1k~3a~K)d$}^i!Xb?SL{=kRnM_ja8#!bF8n;mxN);CFM_)Iukuz+{Tf|bAbKUnNt z*ZBPDf!zs?#<4vMikTXpF)eR%tY&hM{^RgfG9y70TyW z&)mPk0Ph*(PyGw0m0k6#hvm5yjVxK6~H|7~7w!IT)*jjyXv&;f9 zoeOIh%sq3!TKS;&vm1?Ne;CizHL$xluP3_nP(Iv0YPqaMR;L zhen2%@D^v*Ef4$o^`!Po2q9xS~wO>T!B zx^F4&Wemvr+it-kI3vIzk=1L?1KlS+6V@^=V4b*NYte&f*MH5^Ym6GoeT|&nKV|N> za9noGA^Vd<@5cQx2Ob7z9AaO4p7H%5R?{5~Q&pbug@`3YOIbWQ!(ls#Wsjej$s1lP zS(z8=A5QQYS6IlJ++y_;aQNR)Uc_|vC$9#4!#q7Vkf5RF4(}Bf1T~8nRS!`3sJjzhEi+uHhoGegSc)=37gYO@a=SM4ACI{iPu{@+ht+iI>EF%26}G3=W9 znES(?jr9jwa~3pjah%KcA=LeV+#UZ1jT_&rIiM+XVVA#KN9=>MItRSuOTr{ICO2<8 z-dx7e%;(B_|K~^kJv$m0H=X+;e`4i>Gi-6{oH-heZl?82+6Dp5-I6;D9;;{EWhqcJ z&Jf`(5nU$;EZUeUxJ8V0ODCJjDdyWMOj$P^ z!@QcLp8l7VSjZ~0Bau&!=Ya6f1*r-TlD#DUIjuXw9Q&VD>L#14GH=$sW-FBkheI59 zZ*ZKdVz9^|{7Ivkfg$r{g^Z78D^j`b%oxnHIB(rKe28b>BKGoU4$ngv-Ro}H8ygoG z6*BRcwE4t0|KYO==C)YLYNHb=xr6UL^Wn$O-#0#IF=D>{b8qsFn&0vT(_b62y|q0q z(WA3g(vR7^$Y#%Hp$N|W1dYeuZ0pR8+274$zL(9t$Ip+U;)mXfHGjT7HD#7AFkd`r zibXTahQgw5&I(t_0u`ApYI-(@+76z&)${Px)!zqZ3+*#zn9gH#XZQb}hqeVPSu#wX zUR_=O;6uQaNeKbr6B+L1{$;FDS1+P&y=+A<+NJPZ!+r~V~i2QuC?r2L>NtkG{v`dOL+65J_W#CgPkY9GO~%-R zELNwvON!YtCbMTOKD&OtyoAH+*IP`cG$>ctH?nKivt8S&b6_%eL-)zXsazR~mKm|H z%@YC4qvuVy#V(Q)X|L;$^9WS49Ghg@5W4jP#f8iv@`o_f1 z9}ly$UD$h^XTf5t$HeR}>UQ+#>2?eZp8fE|(q}fD*Lbhx2@SCnE6ZE^j5eq>i_=9 zuQ}ggaq)xA5skXJ7mQQ{*sk7OFwy3MhvbSm4Ea(&xNU#2MzA&eon*K#!z4AAX{qK1 z6V-yJDjW7N$b0a z*SgmqDEg+oA?62*%}OSd00x=<^ai)794VC6G2V0Pc^INLn(;Oqp6IMGoDlf2aY)+Vv{NRR! z#lhtT4AWB_PKRC44S&$6qV}T5G(na*%VlHZyGv}-0{1sgPy53*SDxpHLFs}r!3C1R6?d2PhZB$LPY9V6$Z};ZU_RU;yk+7P<{fO}7R79N zHJcpLyd58MuKKTd`Ck3O?AbFLn9CN-o$Bm|4BMzBV(~yO2y<(Mm0vu-E1bktb44uEtFWJ&a-9dJD#gdPGtyR zwqW6%`uGFOE1KVHvGTGrGqc^1U|G+dz%u_l`>G|1yF(O|!ylA#^6)$eA~H} z4(yFeLRW;@RV@M%8qA^_+%p^wPd%{B`o}iD3lq#YI5eAVQs8y{pvDlu#9;c*QC1@3 zv2e)-rHbb=KU9idY|zMf^2|OZn0bXM-#&YB3C0E1!Ux0E82@rhsU|R~t$Tmqnu%~h z??wBBXAHi)&1GNzFn;rKT)b<6b>n}=jq48@P%o`7k=@?J&^KceUP|9zG1203UdZ4E|wxb0cMQ@2d>|0 z^lM=^WpF&L_|Mq6s$juAIgaKslcqVGxAt8i*XW~h& zGZhO~T77Ve3_Ee~_5q`2#w}*7`-){|>~r|YzH1@d7Cn}b2aWC<{x|zgWH&!8nQ&d+ zQR>M5gW2~Fd_2k_`7o`;PqbO8uinwyz+v$e9s!29BE~l_H!?kzwBbF$5UI>1HyQv^cRy!=y(1ib`y;= z`xx}kK4&Y7+tG0O{({yI3qEr>8jIg=m@9r^X5E4&f0i4HRsVi)ZaDax^N#0Kq3H<; z4_m(Mv1|&af@rN#J*;?xeasOC;WFj9#+eAPI43Da!beU$3HMl@2~msM=WOBs#RLXcXoc} zx#3aGyz4;+up%=fKdkS-y z#DU#R^Y{KZqoDo2k1<57?%yZI8!G}C-$guSyr=PLjw8zsvCrBYHvQ#^vEZ2Xi1n`R z-;3}2xAFyl4{+VNvvA?ULksw9eC9~+F#dJ# z?CJx|Q>HfTF3@MXp16u3*wVUL;=_yu?EP{^clMM|cf9MtUc<=v;=}F!1DOwBAIL1a zFvUo};MX_lg79{W59^-KKOlQuzoFOuf+~l7L+ab;1@b>wBPAT32S`c0GPbEG5SsJd zA$4nCo5Y7GM@Ke!efNZ4k5d?OnUdJ@CS1C-H93K$&nSKmmyF@wFRVL+XU%+gygFg- zx9?U3TJbXvUS+FLRVt|Z^V{-J4y|W zf)RRLOxy&zl3Lvmd-H2)m#uePEqpfb5H790Bfv zHIw-_Br<4~|8MpeZdfxny}?ZGAJcT@#$|sj8W(#{Fg^AE06V{NqxC|c2U}Yf_=#E@ z?Ek~mx1%w=rNLNZ!OH9F5Ad2km?;@>T<*pOwzE?j3|9E1vF3@fT>bmsVQqZCO#UtG zA@>`kA{QJJ&EVw9_{MT2E14yaD<$Ru0B(3k?3SM+N?6w>i$WYQMu^&qIX0b9~^($@I_5#9h(~1*c(JutvBrZ$Ck7GPt&@I z>}$8O-_8EdUXdd3;tIRp0;>x`EERC(Fxl69_CouBlJz+Th>SjYt+yfI1?TkL*8%h6|W7v0REd48cV=~jy@C%l83l4AD&%8YPX5;l=4d?TizB)AY>ZE<>VBWBhqi4$e z1DfFh=cP=n82z>{Nc2odX1%h5p|_~X>~TYxR8v?`gVf3eak4M|s08fT*tp5Sz-B+w zU#3}oOm{sPcPR^$cy5*XAjX*cAkR$f!7Z~7dm9fNJ2TmxU&7(|^9{_>4EGy5Ik)WV zUkO-T(Y$TDPA?G-82f+y`B){|dWz zJAPkS$A0Q>GOMWWfypwB-x{y&-N+#AtaE^eS?X(}$*IQVm;()eS=a1w{BGWK?Px7y zo8=1`=L@s0zds;2GyZ@y`@g0>2Bvwr-`^e zPsQ}R`WI$#Jt#Cku!VQm(`WJplXv5z;>`OF1yz=w+hUfg7 z7_PtG%M$j%h9~b_ACHog5YO&@`P2&DJ*&SSH-8YQcwkS$0(}-6vo_%y4Fbsz1g9kb zV2N=*&J?rYC$q)W-|`Y}HbPE3P6uAz;LpErU=cCPkcDNX!HmdggBY8_=ERqO-tx>j zvxld?p)esu(8lJ2QFy z{^mX#M%mm$$3MtMY;5S8$?*0~{pVk-8w3w9ep$}Z+%rd~S)kzVYJq~anlC)G1CFzA z*)g|ss&qyC8};Z_wD&s3 zyLUPYSA5vkwutHQWp@9@)7}lIqa!LM-Z8!RytnVYNWt6N%4`>|ruNU$3R2# zl<^9N<%W*mAJwt;N!{C5&TY|k{;&c^j?7+$yh}Ity;dmTy`TPIS5RV`|Nh3_*aso1 z=Heg1coNpGX0bUDAzHEFYxIMV%_;R5r#ljE)J@6{%x z^2mH-$y-g*(GnjK zZf0?V^NoJm483iI%+cQUjq2Y2S<6a%8s0Ilef^t1X5FXHpQYL2zUA{IZF+Oyv%-Gk zCuwX<*L6-Y^Z$ItENAn#^P$j&gU1TE8je+YuhaT&d{cgW6$JYyBP|S*^~|B z8O+x+Twbzd3rE41kJilU1)e@GAqLDZrcLwD&od4YJ7UbTV>aX2=gAwk1+d+_^smj4 z;l>RymOPK2UmjW?j((u4;U9mO-OqP6^W~$_ZHwF2GhMgzVqWk1gmsqcfda0IIu+%D z$(<{A$sBIo-7ir#-|F}W-WwLbId!yCMVB;$3o!L>WxQ8#knzsnKXMjXr+MEjs9`QM zI#7Pc*ikR>0rRex`Wah9XRz*LKK*3-fwLA1v`ri@Pg(Fd^1yE2|4!HPH#PfxW|&*g zW#`T+(RZMTFJ%8lMsu0MhI65;eIB*!zLT4+><@5#5YDKT`mlvN>_M(fd_yVEi(dwM z2^EcbyMKLuZ~ntYkL`kB{(+kY7fcK*-b%gc2@R;_@Co1VV9v{USwOnL)-)rHy`=1w zeL^zNmf7MZcB(&=7%phoZrJ$c>0kD?`3D|fs$(>dtzmr@dSToC{QnM%+Ya3JYv8rK zV5qj>VNrnW59u2TOuDy!alX-ER5zD!P`7QkCTPSwUACc%!R^5XRpASD7fdUhVh*UO zt@y*f&BoE2*Fjp*QCe?jLXck(KeA{7pP($AZCR4|V zhUXnd%%`Ku68?S@zahsIo6I@0mgVZM1Kp|($}8&|zN){dkT*+cJ;`Ym$9JQH)pVJn zF`s;6vcZIG-~UYRa*nym7cw;tOnrEOPt)K&L;9H=jo#`GrzK}JoR;~~DBE`bfYnFc zg2&P?rkPz>${FAAR?#dW@+hwiV+vcDgM;<-{mlI4&za6W`o#FSm35C@H>b(oa~yJ# zNo{<_O?ubZd$k&#-)@|0_M^>uL9=D!RQ`+?!cPP*h=^9WueC3*Fp3byhltFz_{r>~DsUHq~|NnpC zW2FPrKGvTI%L_R8OZ-X{+gx$>n90Yu?wn+e`@(Cri}{8CtNx6XwjPs1=jJfKZ%RsN z@HcLLcIm%!fA~WtUVG+hg)=?>4<0`KAk!;gF4HZM5Bys;i*4b1tIj6_n1JAH|p|Q*c7L^YX9ENNG$t+v+`nhj7u!%le@Ohzw_5+9B+zV^j7hJSA zOHeRozW%=9kW|S$>5QXn8EYk9v^Ccs_!_w2o?wOxz68f3oH;B_e5(JL zd~PgQn0+Df&Y1^u4=iZbb!-(&(PYfXmB^^JS+Sk{T_fXTu98-Mm7M>K=^q@q85D( zGo2PWLs9v}g0CG5UM790b*-0lxGcS3Wx@qNlL@u<4y|GZCheRvPS!VkvthFKUBJXX zXJ5lyUcL`TE&C5h%gi(8V7mT|gR|41K}v)Dn@oZQtBw4-XLH*R-0eQ_`f7u6(zgQ> zd6^$nmMmDxx|{EPQpLw7vL6=2v9Wm@tFqb0>nAMyBDd#TAGd|j@%2kieBdilFu70{ z_MmC$`U9)i?)Vug*>otT@nt}-W00&x=%0VAhfk+}cYHjLXF=)K0|$j4=ml7QDB|H< zVBPemrjh$;gdP?Lz3(`3>$p1x(ib3%(SH?^qo!cH@8`gIU{qX7{v~##TA`4{SUaCTcA(c*G=D zF()aBN5AoPVnu`KB9#JJg%vsiY-V#D+`IlVhOyZkIQCsUA*P<8%-}xb^6vL{s}C?- z`p;Rhd_z~0O~GBs0uuoX;gA0gyR%&|F<23Po>!;F(K@WYaUCCXpHq{Xn}c%40@JGV z^O&^76I3->VuU$v=_Dm5AAj)V$q9yAYk90@J>&dv%T!ZSlI?`Z?R>TiJEzwlw6%3> zJ3U?Bcn`B#PeY{Oj?01;T*p65b(FA}^@BG;va#5zt~}H_Tb^Eo(o6+>(8@IwITNVD}iAb5_eSmRQe#}RQ4ct_n!m2Dr+9xy}G~Q z^-Gt=%}JE8pfH5DdGZz>xA*X!`-@6GaRO ztSnLw*-GdAW3pbl;K&#L8=QZbP58Im=d4(3*{tz_$6YQ#{h?$*RV333v%N12+V~H& z37T(EUaF&h^aD%9^et)yB0^i{i9C_JaPEiq0ok|Zjfoty?mc7an^40TC-dR?bM*(2 z?LIuK4oJJ(F9VG;WBJtVKK6)trx9mIh*=GWWVa++tcMG_SLZT9@^C4 zU&*j`H}hR{-Yk}l|Jc@gC$aT2HEMaMz3AlKFw^G3)~pSFni-!tD%^Sm%U&I;|FFVp z#XN?o)(d9JUC7J2;2>3@th7Rob?x)CgoK8;C-??nR8* znh8HyqTCKLM7?IS@)t0f!N?OV_Mt-gMOH*wfh_l|i%eH7?HjFcJLYnJm}u-X;gev< zx2C@QB$n!K$(a7XENkUiVl}y0oL3X60`?ALJ z*GIq}Wu zT8^*R9oXFOV7friGT<%;*W~pJUNbg6Ji@hVb0e?w2gY*;zH-_-dLL_eIhlQinxlG@ z!T&VI{saG${_yF2cXH9s9Hu3$}?cui49-H`}0Lx@3d9<^TWe?Ft#PNk~EI7SbLSeJI&H~G# z3%8gqyiv)x!n@}gXUPgh1LcNuU5^>eavZ)j2#FYH{5IQQ_?f>ZO(DgK&t%tk*$NSs z3`1q@3|=ATlw0Ck&heX^I{ruABy1|oqaRJWkS3dk;mO03fJ0pRWue9;ngJ!L&4_}lo*e{5)&bX+b;lfw)%3_5e z>#mC|S57crd~kGugZ06+`7f-T-5$IU&ft~EI3ZqQ@uWUrJ>wM*maWZ^j^#Ii`DBB#eX&5I=^6dnxlEWfm8X4hieu z+NZD!WaKjb@N-PK@sUZI&E9dlD}#4USwg;RP>@tb|7ro|inD4L`p)0qXRwE@FQTC@ zoZ%~vWaIO9jc%`IH1HZ+xL~hb@TFO@Kyc&mCfDFN!f_*~UwjJR8_ZQ5+b=jO@A&ViT=4(k*=V*4J6m}U%(MQm zz~I3wn}j{h{F~U!4n#PxJ2CSz%5LGYYGSrn%5T*mxrLF<#OaT8i4TK;aAC7s>A}mw z6TU7>h?aC@Rr;_l`@%*`odfrbUaXJ{STAey>m-XDCyV8K`5zy00|MD{o-m4EXr5-+ zz-Pz)egpg3L{_tJ4&Q~F`{S7Wwl|mk`^PTJ%EaS+AusfTh@NKI75QDe?LQ<{f{RfeJ?a|v)Q`VwY}GmGwfh=uX?noM#7G1dC~e9JI*^B zPo948PU_GH?j5^7{g`_DKpUfVGuMX~JQwoZ_2M2py!46bfbq?L4eKr>GUz@wFbiUx z_g(Ew!K)+DY}vx5Z07FL56<$w;qi~V!+wvC=}s@_oVML%ztuj>*&}_xSMYtqVzU^Y zm7IY*zx(GTSg`KteRR2fKhLJ1MLfIimo~UxX5e4I_Ri=T)4Kd>-aQikwF@@4cC?r< zXH5Ue{Xq5in=_!sNjuj+#&z5xEPY8uA2u2_@Y%91WoCS!c+=>>Y}p?U%1aK!u8(iH zJbyv+q{@beUw^ZInB|c0r}@&q^V<*H-FaZ;iRTBHdmY)G_E-Mos<1x7&z8&U`#`eH z=|FAb8lLwJy-s!yBugG-T76KQo5QofnDyZ6jK-sXUYj2{+~gn6EVoyQd(SPN3I?MB zXXX`wCmCg)PMs#091t=o@y5o#(i`HB9b%CB`rrZE+XgWv^L389zsuX!9{TW@yCBxY zVC{dlz7>BN*0I)p{$+f4clm)p+XX*;4ouvz|Gz~8Z#(~im*;jLC{0u1IhJr zB+tb&`8hIaKiGdjQ0_uy;e7i)EO`ei*zS}loMPB@nzJPCQF_9UJ%7JVOg#JSEl>7! zS?0cFMg|fu3XT7;^)VGOY@fbbld+t~n9*EiL#9E8w>M*X8#Dg{_Gy3X8>Y%;h%#BL zf0&o{VAl5I2L#usr|U8I*H#`b5UBWJyrM5KRFrvrJIgyGmU~B6A6&4Sb5AXs1@FI) zck@pyGfJon3JPPquV3@;Q0@c2&$}OdR&bo_ae?Fi+353<4!tp)4?0##6qK*&F_Aw! z`S|<;;gg%bi4_$#Uvp-R<~(q&cV3@O^X9dJ1yzv~9|{+2o-k_?SHYGbmYTQ++uILZ z46`hKFmcO&375v>4;kK1PieUGgGs9MFN06LeWSbBUBQ=Pvpqz?^bedc}PPE$sunTlP;dO$R`(CIalJTD ze}Qdo{eoWp1y5UY7OeKWDJkK=D|w-Te?t$ODNB80UJ=u@&kIVIJxGpgczQ!W;k9&3 zc=Hto_l5udvB(xO?P}uN@=vZphreJ8_m+MZ3+8hSvly9muQJVNIK-g!yrGaS#*X2Y zNHe>f!|C%8itd$vTl<`v+*U?3Dp%Mn;0=Fc!!tq9@xnjP3$c

    ^iWBP%Ee|zrw*LSY{*vrP)kl)yF{^IrggAMwBswEmObpC#irrc-`uLpQ`i&;aB(_*3OG- zn3X=&xcl{+x9<~;TxH8mnj&5GL75+?UW2Ue?QG6t-mTnHD>nniEep$J6A85^DL=ylhzyI6E6Z< zR+R@`-8N-<-<%u#8aA(gOv-(FlIf-^gNrnu%;T$@&FZIrf5U4S?(+UxVDRr2uaDt; z`L~iE>acS;Y4L8D89CEx^M>#{g|hh)p3i1=*<3Pu>672Y_Ss|cvlDlADB8Yy;{HAI zeZzsjZ&ORS+P{CAfBx?Ndmlgd$(}OWUwh=zgs!{K|L(uXu)ZyVLGJ$vp6|2E8*7qU z#V(gJ?{H%L#MUc$WTSOunmO;1(rnpvWx2X%GkB(H<@a5RYHWCNjXje2aqrpO8D|80 zW)^cGh3#KhdpYVoBP$N$5Y?3tPlQMBer2(SMj56_YBq5l{?d(Us&{_ zZtq;1t&0-x-TYjdP<7x!ysbkGPe9a`mA}`ehcZ07vow0%;^YTP5my3^mxx_aT2X0N za_YFW`e7+%rfE|%kDs&sc~`aL-`@Ib4QE*1rLJ^c_uFJ?(=o1-EE!y-AD;y)Y+85p zYP8SiS+mZqdTH;&cw)7i;kA$dc_r8Tok);n--*}F=`+h5>-fxEPQV_5JOr8TL{ zEwYT^TfUmVskpzf@o;6tEBE!mdl$cm6x`|?@hWz{-8Jhcdu<=qS21kg?*D6+VwL{X zZ#L%@-d|s^zrU_3;o$b~=KmXOKfbbMUSfX!Ek~k7wb039`9dB15AON@ytZY^S5t1A zbkQHhX0Z;p<-gXvog3;~$h%CM+3s?Rk)?rb#4nM_YcKz8Gwry*utZa*ROh^b+B^~UlYd(Qmd6@Tx4)zs^^ zZr_N1{yKb)+Jq0+|GU?hyxzV3^^esj?#Fij{`vaT_I&+!+jq=)7H)Uv(XB@bCgo@H zSM%|2ojB*-0k3z4QmmHhI(>c&0o<2E7EZb-JgZRP=DtZ83Lo}}LZdUu^l&-@n->z-^1e;m#eVEgha&^2x|V5V^mRd5!)<@z>rWF;d9{{(XOsGLcA4I>L*o9c+>?(?ypo;O9GU&mZNF)=u%aovSu>W8mAGnl<_(W9Wow~VuxS3W-a%rxuZ`k#AF z?s&I$vcaJ{=R*9dtNVJS-cP7XSi4U9`@Hobx~GzLS5>C?Ry@DG|9<>mP6Z>6*HU`E z<+9P?akjs{KIT60Gh^cn;qZL@#=UPAJCae|G`R}>zPt^xMfBoru8?W3~ zPq5q`r^miPZgo`w|Me9-%(HDCtUC3i-)>{m;_kX7+t^ncYG2Ls%&Xnh_|@V(Q_FF- zUq4o8+$rA5FJ^LK=8TT zF6r2I@z&za%vQ0{=}eNWY+gOrzul{Qy6^VO))R)>DYJhn^-Ma-z_9tX`t3{eZ35=H zd<$M9a#D9koS)u~`8@|*ey8qA&%JJ;ZuO5TS4cGc6kFa~KYqsJ$szS8*Z1GMzHhU9 zTt8#`u5%c8qmEfgBA>kCx)1lFH>J^R6jx{0-4f8U6;`(C=g>h34enB&0=cK%2Hm##m3 zzpj`6^n)tatMwP{tp2ag{(g&XDx1xliZ2|CdndYYcYHrNOLfY6^CNCiUB#Jf^F(R{ zH+eUoeEwLB;e8E*P4#V_DM1+xZl{~?ywG`jXvK=(ai&iE?Z@{ZLV{(S%Q?CYo7 zqWaD@^}TZ7U%%$>e!0f?%4f26n?I>q8oz7)zVqyU+_%`4-%01M_)@ETx0Wj>c&11E z)ka1~zDAk4Z?+d3PcnYh*f68Pi1GWnvmJNVMV#S3uy^^Iyf;}^U*1N(FxB?7TXIPT3&gb*cke5KbKoCgWooXdyx-qTn~C5dE|4q!7aY$uEo{L(3)j-#kA@MPBm5#McK5J>GQtn?_tNn6Y6A8?(u&{D!-prx&m1 zONi*JG?n_fFXdjo!CsxI?~Ga32F%@GbzpfyWUX_KFxS@yi?1Z?~sCxO!z~PLX*p zZ_aDksL*zO7S@Ke9?=Q4OI}nL-seB|Xvcr=2PezleibcNEo)pb^~sIKMfVup%>Am$ zb{T%ScE11m)4G`7h1Z|XZMkz-J~8tA!PA|3>zQo@9;B|AE?U37_05iNU)EE68>Gjr(JKS2*{wCj(*UXZWxMpjdyK~p`r)uWGn<_(MTMv~ARjfMmQor$~ zVAjJ^3Okb$7_#m^xfj0h!InGQv!lJar8+rZ_lL`F%bkBt#$&$PC+q+I503w5%Ua7- z5Ig-*&T^+`KI*sco&WY)A?Nn3&(kB6>-K)RzGHv16~l*cbybJ!<_B;7-L%eH$b4Vm znNEE}-vrH@`Ci}aV^`TH^!=YZw?67r`NCiNx5~5pI?Dg4Kg(~=@p`{^e@e=x8HN*{ zZCl9c`<2ViuSX=!?QfGLZ)x(4Ai<^;8j&oS=d8LhmAbTAG?)X9esEH#UB_@^rc93K_K=Hv zCj@f;S}9d^_s)wL*Y9U$-CkuUkilU7ztYumSD{Eny2c8vuMU#^tJLN;UX5o8e}3*^ z0LS@WZ~tK3j88HDpOvrPC@mH2Ry%uIKAHIrO?#QOHU!mF?K?f31Hm#DlPb3TG8NbbicqwDUXdv$(X z=i=*+YR+E2zh=qjZMLqtQ#RYQF5SHBdacV&cIhWM)s@$!)|_LK4lcT#{dimBXQ>(L z`PK>i%lz2ZE3&_Z8!zohT9r!6mg=lHZSH+tUEO{AcfX4cCPw9v+;BM7N&)tUvzE1C-Hmzra2d`?Ybp-r#M|A;qgJO_5FR4Z{%u3HSSp7 zv6XmzebfIvdVBBH%jfZCtmiISru;Pb-L3r$>~qiPGc;Xzsdj7q%m;oG>ZBVtv3=qS zH9wo~uybQD^MQoJx9yqS82`jbUs}lYN7ZBN|D=sU0!fMyJa)HFh9{~Y)74tMn8~&J zf%^Yhlkd*m=oEJT_U2G!kK{|tFS@U=_;p0Ax+vXgP`g_C&a(?|W7pk2eTlI_UrqJF zy6e(QS!xdc$>-Pl7rHy?`}=LDnZL$=f9>rfoT15(@ASQ1c$NK!UxEL32mKWf&oD9h zKPzK_*1gY;NKJu^@C&-~=K=f7ma@eQ&TDH#r} z=Vq@BsnFq_E!X><`>gVzT9-5VkLF!_p1JD9ucg_IlPr^2EZ%+inSQGC>h~v8uB5Zg zKAf2K{;E^)VIdQ)rLL*|b}XmbE(Vt6lwP)qQ~In{dxZOJVuayxp*1aWLUUJYTg5N_ z%QNMqWnpvrac;(@DY{L?pEulfZp+nhd6XP2{ng?^-lr^)*1yyLh@E=v)R$6HQY`1( zy(wkOivXqA8o}Dq&k=WaoN(Z0Fqokz8)MyW8=!XO)bH7Id*gKu+;Xi`J~%V^&8&MT zJ|BK~yJU^f?&(*P7tD%#pSnLNSk>G8)??YDtZR2gm;cIHFW;2CU2kiAb{(%({^XO- z9UkW`d;I?M-sPeK?8biTr!E|~SJAMFUZR%U_~_hb{+>0i_7)SrhVKx28q#C#5GU-> z!Q#qp)oHw8X5;-I^~~q*D=iS6oh)p0lgZ0=;o+548b%@95{h<<)P(}hSAM@3W4~@! zmF$bJw*{uXj;@L~6;(Ok#Zxu+)m)zUE?+;b&{)sj_oq6puX^u&`{VYDU%7vuH784d zww%L?Y%`ts%M;U7Z`946!6V1?>SL;^rMr)`f5x!f~qZB(tny>*_^ni=WC9B?9UU=ODm5XJ-iV2(dui$yF2fz{HFRh{(Jb% zw0Mod#{1k%8xlO5UI#gZ-!ctrVB);Aav{SF=ASY*TFPWzz1#P;*h(^^H1|Q-v%}1# z%d#R*hWYkfIM4X?&-*R;zYNu)^(!CjJHOz_{(s*a`2Q_?Bk^ zvhu1g53as&RJpm-|D~-N*U>|2FZA#INPWq0;JH612Wxzs7ej%@gZKwueG7{AuQ@$? z!&AQbKX=8mdhh*gx&B8~;QzbIzrU*q)<5{V_@Cf<@sI1nEk13p*1fPZ$nR6Mf5Tbc ztkTe@uT}HzT(wM52@HKAD$8_6LSLJS`?|x;jTvEEd~Mwy=-0FFuv7FnpwVGA-!ai% zD@$>eXzaIp_1k(KTT6cRo^rpZd}hZ)!)3mL7JVXO46FI)KD@qb--0RJ2QC;V$5}bs z3Qdps{Y7T$;b7)|Np(9ZE}fSz?G~|_Gz<6C{nr1LzM@`>#q!-Wlfqhq%MH;_ubtmv z`XIYDb)rUSahO*_-_x0Xx=BjU?b(wToY9gvdN#=QtV(bZ-=$W|@UJJ-q!wFjtnL?| zmK|+W@Qv~Io+L$etACl#SJbSOTvwewzzAIzv@?|yGa(C>%O zT-U!(T(0C{_S&NV8H38Q4Oc!to2zqX&w8b0mYcRYlw3SK^H)z>iH6xWyK*6^vzzL`?~by$`^6LAGP>rX?}Ws zyE^A>Hs5voht-SEdM{ZxL*n46H*ZWBDwB`B__iZj%CL=b(3Yr4cYsq^NP&yYsh7)`?tOEr-TA}NpLyALt^fA5IS!>~dGAPl*r@#3k2O1o7Th^_XSe3ti^S>EA$-z2Y|>J;CTpHUl>E0ypw=j1AOy}fhX zzeibJN?Y&VTz&TS)uTI1H|F-ZsXzYvm-U$Lt+;6qG6f>~o?6+PZEvuAKXa4i`q_R{ z?F?>SxBp)sy)f-zG<>FonE3^}Ffs70VaG-8_wKo(nF0oj9FE{H{~6M_=ffwSr3T z{A{_dS%-7C|M|ml>PbMV<+@!)_rIV2-nP6x&s3|w#?O8B%XxApGy3ni|K)Nf-&EUO zopJ2(-hRoaf~p2HH}Bn*V_DH9_r~wGO^?&b#G+4!>-m5D$iF>@=cb=BM^3xadq$U+ zr7i-!Npn}~J}z~2cB;I1!REJVx=t`dbUiIr|Ej1N_UEcOhE1$di>1_tq zxr=Rc*LW=9YM5)2eDy`}gEu=}xwi9bPG{Yk^>st}=PKu{;!Q8srl&60@as#8X3*~K zb0%+L{q{WL%=9}vcPlfhO1q|XHdL)i;XB(ovG2>p>h~$XD}#NRWSjlTi=rQ8_+(S5}>LS!*jWEqlfF)p5(K+U4%1f4yaRbC0in6~pT5)Bi?&wYu29 zGu~axOH-^rokz}_-($m~zR6!!-A)$pS*P}0_3CVf(k!{g*W1rp-do?ex!-r$IyvUo z(hnZ)XVKe#x`Fw!-SZ49Be5%0VyZ>CN2f_emI|jPeeHQ~%&YkJEZ?=jlbdQoGzz2| z-&+2D$mUxs!@28feV&g^!d?G&Yke5_Hoe)nSp0c1pME+MLwO3*o+jQ8Rz3~ug{2*w zzlQ&D$ul6|L5@F_iT;T%Nyw=41Xna(DMHZ(!Up`*Huf?(Ju0&G}!_ zyz9hcK8wmkwkKz;54dDK>@qnpq4Dc9uX$l%9P6eXxECm}{lGKUfNM))<}L_R>Nh`o zqVr2xam&TMZol*Vde|oWMR#A=>B%N|L+0#F5#PXLvv;3zutwUbCdn>ylx#adfk1)GWfB*5MF?3t;t-2Dke{$pZ`V{GVCKno< zUVCVsS^nH&Rg#`Zve;e;<`28;3-;P?NX;o>XlEJEjWfI)ZR+U-|Q`v|M}*BW^l-t>*qV??>31%vTjG|1KvkcM;8_xIl1Uk?!gWEvQsZu zUwgNhy=}?#%&&p_zkj-KU2*Tg7q@liec#FcVXb(+@A2=o_orGeI=$U`=ebITv){K$ zU3~n|=IZaPw-(GneLfD=zAx1kvR^&1Y>-Z<$~gDmWYRt_^~|+4`9>*ix(Bs3#JQP0 zS3Xp%tb6Wa(8I>9O%w>T5qnHNGvaFZX-F=pixpOh??ilIH2nrrhmWuY$_$ug*Q$ znf>`n<1UtU-d6j>zgxLHo6Wx7X2ZhkRqQemryjof_3-Jx8MTe;cvogOvoGD7qpov( z#sBD{I-ZV`ch56jUR`(ghZ*}mjcaa&Zqaw6IaeH$J@`S}JN&Hrfur9wKO02OWADye zU*>Q_h~b7%PA}VrCdQ@-It*q;6Q=6P8tAzRmA(>aFcNlH8qg=ctb3|f@Q(MZ9Eu*M zXzt}an#C=${k+b)>x_&=lRq!Mp54GO-(2-Usm)Q)wo$+vnts?HU@ zzwjb||Hr4%ZO>Rn}O?`FpM8s^dJDliA#~&i-7{$8q~< zclgt!;#rb&zaM8ibzyf^2H&YVUzK?i7tYAs5y-|iPuG6p--*f9X`E#tkLp+qm~K~J zdoe+`Na?w=NowvEb>o%Q8DHfd95cAI;>ySLtp&n|A8-BVq8Pe$Ls9XTGQB>gpe>HG z1>Y}ja(SFGF~(J;lqEpdV%qK3Q^nS7e8Urbw)vNm^R?6Ay=P<#SELApd71O|I<4^S zY3Q+D+{8ZP;KP2~D<}E>)~)+?F2c$$uJGHr`usm%bDMteVPC)M&91sbcNd$RnYt-Y z%l)2RQNh--@atywy;asnzn^9c3<6olf6rABEKddT@-S8<;j10wk5|F8!(HN zOkp|3alpmsK-&I=f6nCAu9-JWPwv2;A2<8tna>!W&Nj~AKFBGXEHx?cc~BhCC)R+QyZ^^~0w z5#CD0aS=0Pk6w8uT58A`yrX0HzWF;JDF0?RY4c_I{p$Hm-2+FXN*=7x^WWMh$-eW| zRn0zc%a06!3}UUn_vo#7J5zGciDx@p*If^ocK>V9{nPd5&0aaKzi0OH?c`nV2`6nn zButxrH`(u-;oMi(H^lRQ-CQl!5~DBsN9wP>-}MIt>tB4AIB((beKXUfcdl!#@4 z`(L~GuP769pZB$2m(5RqWREjG|38BJ-K59sU-R|ZA1DsXpSJ#Nwp3HJv)A(k>3b#e zTfHhXxg)%HJ1ShTW^|7T&OEvC^r>{~BvEqx4rc zzItMCdnI=!Q{DIb+pnj@yvn&%Y2fuQFZpwLF;ncL#D~j-)0p$_{p{TOar?jeFlPsm zOp&^@Wrl?}XRxfg-p~~F)Yiy7UuyP3>&+GZbD~|;{L(b;uc_>E+4#P<=gg@cx7nZl z(B?W?d1qZfF_-dfjY$n%b*}dgKffS0;atbI_^NGg4U&S1?>}AU=IaUbPv&Dd^ff3> z)HNg}CxB(rf%X+ouQqg^lh9e=Dp;y7Inm4ZqF{ngLEwwLEVHWkq4d=xjM&sYCV-DBfu=X_iCbMt2%)IZki_u@kp*WDkU z^M6`?+ZsNl_|4nXtuloS>faly^taoUe2(xr*Ra(2N$HaNABw;8GsykD)3s;WyRUYW zUVU$~h<35x`8B*^&$~UAMOmzKvn>VR|C^E18#-B$vHrTW^)l^%%oSpeiOMDC6F2SL z^?##maQU>x@BdrZ{uNr`E_t<^^~Rr#jqfBGSR4+{k-0i6V&e;amLCFNJcW;!88l?} zg{3>Vo@cw(6WFr(fWyz3JVsZaojCZctnA`H3*F-}o0J+%7rk`rUHGi*Royb##^}3; zPxH)@i))y5XTD8Cbbs0ti)w?cD}fsgZl~Fs90*g7e8G4;#dH4TbssFQ-`RVAvq0NQ z%U5-CzgGR4A=ewRj(h#->*5DqDQ`OcAc&h~+vabb>pw1hpT59IanHGL3@v=uFWx_V z&d}fn=i74D73yXO?q-KJm|kWoeza12W_V7l?G4VMLs{{)EcHoTW=~|X1;d4^T4a%>^}vZb80ipd~R%?a=egv&tG8$ zBUk;xO{drOK0c@#{Up_t(S(1!#V-DfZ)Wa}iGLl;)S$oCtU+&oeQmYw`Wt^=ug@2f zC|HtqU=rhoe^W$1-v96`rsV%_w?BEVjaEF4LU=j;u4 z&TxD1Qog`gRP@}%H`#Al`JB#fWGnd9qa%1KY}T8eR}&gfZ;yVWHN{Pym3JSPg{X0g z@QVu@YJaDETE2PZ)XREYiEA6?S6-_$IeuDvts0&hmi_xYvvuBuPx;xmon~A6KmEGm z>jm56&G~h{ZZ~As>07Q_X<60n!F}9LG(_shgt;5fluUfm%_p{6P~eI})jGr5_ZM1d zy_7nj*|4{fS^n?B+IKe0w;N_%-?h)kz<;^$l$7;PMSH7WUA5To%xzO`!q-DQFZUST zoE0vndONRSvUjnMy4AK*v%h`5Z+$Z_f-hy+mUVhE)0&P=6a4gq`{YYE?RiH8Wtr3N zFn_n(`X}1fIaA@@NvmfGtLB=2mzG{u{p4WOYSE)V9XA$ciQKR~{Q9Lt#DQL`pO0i` z&;QGry<`nXRNvZlz2$LBoz0fqn_qiMWYW&7i)Szud^Y=is!Z(F|A-#TfXGs&`;q+# z4JTi3**O34yrb35r<=vNRVOWE-y|$lx`BOh$Z^-!^iYTOMnV~-onM#!l>dJE#ru=# zQ|z~g|FAuFeyY+gONjuhe%=q?{(0xcwpZQ*6y*<;{jyuVkhD&#s zznHgr-{Kjcd5?!ka&+nCY-*@lvgnzdgYGsd&OQ=H)4#Dk2}gzAu65V*W3De)9dW{LJT^r@4ffz<2?6f{i{z^EA~9u zyZ-mlzegAv^bdWkPu}(awZ*>!*_Qw2y}NJyk74e@jf(RsbNc-Hd>NmgNdAAVtwG(g zZMu$x1kXy@`HbT47lzsKnHV`JE1uEyij9!8ULVlg{Mvn4!gA3yO4*MJ^`*OKtz2+s zgL&#|<^M|*{yuxs>-g73?CzJ@(fb{*pRiUgx4OO0T!j6Qd;NAKh+ts;J#L+%fP zd?h8MKQt~p+dZe#!R=y%Pwp6HD>K)+#Mk` zMLNFwkpAp@iI-nz@;?zyp7*5SMtywY?(N)PB>7po3@2Yzdw$`ygxg#bLFLyIT9%zw zU~ldV>p1Iq(nVavGw7qqTm!}QjHrdLu9(bJw3t{K#I)g`zzw?$D>MEzm-gkKpY0bI z%*yojTLEJNZ}Np6pYM%JzhBWXP9+n!|;TmyA}sBKr8B_!Rq2J&@jd z?b_RwH$@aCtHm;_hx_WWZuolOpN-zr^USTY>Kl7Fb7jLV%c_o8KV#N>Cd$B7a%!0w z`#i2I)`x5bZW+(n6Z8Y;B{_}Nt5i%Er0u1em=Q%znJ8iv*!Y4h14=IdW&vbb9{xE`_tzO)~1QATw)s_ zr2TDk?dJ@>KU*@bO2tHbwlOSP`t!vRhNbml8!VpfEUmg{vLR*1vb9RLo3@&Ug-^@k zULfZx@lBtR(WJ7Rfw4iKkA-2MqQZgg4hOD3`en+%EcB22|6Tj4$NBp`OaE8x?R;F{ zASbimW=7%c$M2;lN8EV-&_80U{gw=~gtpeMl}mR@CZFQhVXb(r?v^?yRA>1Gk3^w- z!PO0|Pm2=PGD_`AO%2@lgzLoGxEV%w@0qh&<@pw#>p6F}C!uA>oiBS1-+pe&Eqw99 z_lZ8aOIGg;6kxY3F|iBEy!epe%I2J_4GeD2y>1`b)A*40m>i48y0v>BmrF+|3b^#~ z-f`neD4f-#QN!ND^euhi@6$q00#s@r9WzaN@W$9}>4qisemw`$mBeOB-!j?4aZ~<} ze#7$m4C#z{jRqGqde|0RSrmD+L33_fava^0``GaN40!z5d4=Qg}DVAYXXb1&h8TVCT!Zp(+peAg@P zv;9cl<-Oo$(p$@$7kESNg!J{sZ?~Ng_Ebslwm|b&@ATO9^BEtqm^w*(m1N9~Gh|7& zV3i0cd9Nw3&iCHZ?0_}7TQg*y*WSA!HOoBr?73z}4Z*Yz@8lUD6c+8SUX~oZ@o!R) z;-zZA!>W(R+@W}layjJ!Ny@ya*Mzu6c0l$Ctg9L<~*@KwQw|BXlaH^GVr zJN#HJ*cP&yGd<6oGAA{B%e44!ZX33%{<8VIk5{hX#ld?A_rAaBV`|&_d-I$xyUGL7 zwu=3gP&5-bWt{lO?!s-^<9}@P)iqkrTn~wuGwDe)=ew^__8z(1XK#M33g7vL>7O&p zx%o4cD#*UEBID ze&^G@>u*l|u>F5^{TH|UHK2OT>L0uLj=!G*|L?Z==WyCLiZ!7wfjiz^OmttoNH3FY ziKMp6(aT~tY#Hi4$TQ6UH$lTz)Z^BnJ%Z^cLT6Q!O;ms9mUzDYdfFRa>nkBGlYCyD zyO<@)Vo-JT{V$pN{WGuqTU^ZXv+BJ_rt#|M$EUYl!XrlAk|UrD!| z@wHeWH#I~%V*0Z`=UFBQNl$Ec)tdiLwmN=i`{fIZSpMBfe0u!V3kOMy>Z`mRX*&D< zau%#T6r-$cn(>_Z_zk=IZ%33)+wJrW+~0b+ap}d^&lxga@)Q@bSsveW=Cto_w?%sn zUOMaj=H2_bI{K?8U2hb<{rczan&i(trPeW1c9p-`ySZ3k>+|!ahFqWCZK+k?dGyiw zd*2SYE|b`70!Qi z>}q3qQK0PELsQgh({jycgaq^i{&qCgt(ec7`B&6qCa*y4pX9|;-&Gvjt+n=EPmV5E@Xx4%u3@jeq{{OQ-yOl&NF%Ku$`-Fa79{KxL>#Qo9vA3k{p{;#b45w|l{ zu==??!@4=ib{}3$u6%MVaI2x#TyX=DU0UIhZb3~)7x_v=@%>aPs%6xEw=J>m39szb zy?eL)Jo4|}{8@?7O8z=GW*5r1>`p!>#(3Fvi$H`F_W>iX3-W7)4?fD;ko>evTZij^ zVqTw0lV+Ob&V52P0s@PJxw>x4GzV&ZU;Q-gj(eJNj!u|3TZKr}mRJ4q?`H8Gc+O+9 ztMHyqH_t&^=W{NFVKe2sTN48!CQi5ie&*oiizY=MLIlk(M1(eKKfU&pWlkKUd5_7l z+THaUIvg$m>0-4Lr0u&b_sl%+Tf)U~`$co~sl@cwvvD?N?&-UhiaEzhwSLlmY;3Zt z?){Xk^PKPOt`_dwq_N6e#`N1g!IyJYYvWzn+jae;3yLD|Y+jYPgZ0#{v$YXoNw4Ro z-~YC=x@>N?xY;R%uNG$CeAXXfp7wfqe125&zum{*FuP8AHA|%UNbl71t9|co-aGNN z?55<4cV|fkZdjoscR{IEDmY)@TcFVb$=JGek5b(KzCD>H`CKgY?oN|cZ`kh3>q^d0 zGmTq(>AUm7nhz^NBv;={^b6nScKKXZ!4liKftQlP{e7RGd+vMh`*SwFGua{ikzZn8 zhUmL{v0JKzdu@CnJ45iSre8Rl#?_w+i%;u!S!@?sWaS?7S$OUhjs(5ln_Fj1<2$gi z^7`jv-j|IRF=pSXzS%T+;+D;|-=5j=$=IK))p{$}WphmV@xr#&oZ{HIe-~bC-^>vB zt#;0uwYw+oGM@c!4*Tlfg0Etw;dxf!eXmSz)hy3(4dOoT`zxl;d&z_T$#Z!O1H+hQ z6&f2abAFz4_~E@>7yQ?iaXkuJ{;Tly!SwS>G_H%4US$etxiQ<+)_FzA_pXeu;(O%e z5*pT)FEM01d3D(bzt4@1)!ZBpzM48LaPKp?W!PhztX5|KJN?zZeIN4I_t!?-YGw`O_!r%2tc+aDH~7=Ni*9N7dUqTtB~2?t9AewddQB7k&#T?yAc= zcKDxQz`2H!M7LL4ijFb75AL6F_@l3C^3Ipv+a4ZN^E#ZlePQC0MHdaX`m#FcHmGQ& zr~F9cOS93uWPQ0~vhdzm*_9&w+X}lJH&iAGI;dQk%zwq+eNDzi$Fj7ziHF+Q1VTOr z8Csa^iqT}Nd6K77^1rcXg6Mgp^US}!&Xt#a+7-REWAXvX2KT2v2W)00o7|DOU}EeP zmCedy@}!%Qd*X@GTamxz>XPQ(>Sd9SxLG9^J!RFJHFB*_if`Qfd@NH_y}!Q$U#bjYdxM85-9cdcDtxuq$PHD!IzIysio z<2&4S6;?zEy*%}0?yV@LZr@(F%+TMfdFI^OwT5SnG;_zJtxxNkH6uUQGK*j4Hm+K3 zyxe<-*qtjn$HE_Y$lJdCJkxfwYukSw<`Uys&8vQ~-?VjEDPhXw|LvlkrR~DXSuZ#A z`RSJzOWl2YP5+GGoVlOZpI*Kp()&Lb{g1TiW^g!l zpzY`3t}nhe_trE8Gk>1ts4#V|)TWnDW*_gFw%Mtk(|38=4XJa=8&c z*ZNKG*T&r_PRj6UVtMc@ciY+-!iH~nG``pVzW4v`TK%9+;cu3+Pj>nq{CNFFQSC)* zF1&Jf@m_t=>Z?`g=Qp<({mn^J**3rXWbN`-R}a)r`dYctS^SskgBNlO)5F<#8MW^o ze;u;p{g2v%w~e^}M)Cx_&XwHHX3XJJ_IS5P<)I>et1$V;5-S!Je*Sf!S;LqwbuZKN zn_bbr-v3(NaDT7GHa?}e_Pjio%y-UMbdvY3TEcvi6D6(>LL=e}Bh@%40z|5f$N3{|-6t@rcyv7h-a5h>PdXx1!j(X*oMU4BV@x82M8 z*O#q3(alqqZJ>3v>Q3^+-}=pACRcykZ@$I)+FROsO4@|ZG&x3_x-@sk%;vQdllrcg zw7J^dSE@R7)>nE#-}_ZZPi|WiusieEoCdB&iK`A_r`*N=t_`WNYE_((Y~FM%^V^E@&)=9*ST7Hzp^VcgpAIco9#iN}{;47l4JjRm|G0RL&jQCh6RD zr^4&&lUcVmbBYBnZCJXoCzWOYkMo&1++uB8^EdC`zkKoO2VdVzm0DR|%O4^2bZ_yB z-^)(+eG^{rB->Gk!TO#_3iI+;FButc#8|oe`f1Bnx-zx%%!!@xaHgI#_o@p!?%1e0 zzuL0)x>RcMYxAdOb;cYl?g^inB;s$h%(Y7o+&pz_X${w%J?uXHH@DZ$Zh!Oat(jLb zKi7*>7I*Hv-cdTy{%V(?aZ*U@`wbKn zcD;-SwJVel{HY4FZqH_p4%K!^SaaavRdu#F_YDlo=e&F%<8Z+pOfaT4gFa8 zdC5Vok{!>@j#&x+y(`Zw&hPQ~?15-|*1U63Yein3VR>g-?0xW6Y1V@o>%SfN>3-m8 z?Um%PP?;cB&hzVX&MZ4{{=P2Q)!TuIM<_4J~R z4TlO6d$hg>zA^Vb#&W1qa&6Hn4Woj9?`d0?zkB@p(nLe^xvRYAe>8d8_-j`=%aKE$ zw*1#hZmfLa$N!bDZhe2%Gsl9rAKJF0+_iqS@BGRK4Huv3zx;Nz%JuU9?yYaKqF>nA z?iR=}<-9U|v-T?k*PDlh&hTce6wuhF&ZVGtvEVu$b5Z&rrVjiTuts%rMCzsvRI{J&xwxYM@e&CuRn+v25tt#Hz9;VWMzbsk^D zJ8#kP^d)lxmw)EHSpEIy{h!}|O37|Gzwfk7j)^4SQ6B5iWd5Zmo7*;>OW)Z0?oqYc z`^3~^EsHjDcl{I%h)7OI+vweBx@!M}gR1!w$2h<0JTubkU23&={wLinCvKJQ!nBiuf^{CxLv#nHX;yPp5B^E#GY=-00HR#uLBg zw|4~0;c2j{Wb=7$vWt`LSQ6W#uhlDl?yJkIja%Qfp3!$%vZHQH>A#JP+{Saa&Hm1_ zg6rg*H5IPMXTL3C-6-C0{I`8+gJ@6VlhRf5?!Ue)b@lbFnHOioCoanqW|%Vj-dUN| zclWBvSI^~fs$FQf_q*_em-!{1ubj=dyL45`lfgs-nz_L5*N^p* zs})jLD;IyPWn*w!{nRLThP>?UImVtsoVkTYt{8li{ zD4XFEw)m3fi3ye8?G1m1OnmkHJp+Foi*=YN%kPBOdhQRN$#UyW-H_8he{p0P|E)dC zb9fY39z5aPP1s=n7)~D+iLwr z-h$I#)p8olckOdBV<^!0em^e1>@U|0#^c!xd;E^X^VTab-(UCBG^!>=aPO&?*S}hw zv%k=_=H!j3lP$P^KA(B;@wG+&KTFO%+`*iFz+F(BkNv$id+Lr&TdV&k2Vc8w9Q^6_ z_Dl;_;~%dkHr%!SyW!XOFSlBptv3JfJNKFIRDL>($B8Z) zfyeTU^Z%KywyFLsF*S7I@1KQ?vx;BNoyzh0^R(w~kEOQmGQW}L8gEl2zjbwP!4HqjU)c2cJ^S(g9^Vcr-BnXPy6;@(?Ek%u@i!;m!FO}N z>8OZHBr2(f7KK{RpZze3NtuZyBJH02N;bz$y%sr*ueV2Rotb;t;oLr}eb>%UE8db- zv>;>0u{d|3P=^DYUDG!w@~^RHU3cGHY6;iD%4v;HLXPfD5%?N9$94HN+mb`BjiOSg zve#WbS-in<6acrM+qi$IoAu1-1LPUi^RMZy#gm#oBB7TD`mf z&$GLIzuIy3+{Vez51d_`I;-cMVN&G(L*bjh)vo_ueEub)Q0;wVt{T6*{c7TleCz5h ze>SdEli(GRDidqnU)9Zbbl1i3*REpj=NxWIW`rk9oOyXZWBC2$%|9nCKKE;<=L4zI zxOX3pEb{y8tYEkOckKS`Pg7#;YaW`tPsqqgG8dDQ=jW)rxnh@xd&RSFJdDb#-Y@*? zpqZK!a%E0zn2`N%o*g#ZYt!R|17vSiz53qFn(+MJ%5%NfjSF6;*j`@vt@Eqrxq23! zlh+=e{kv4rR*ad$?0my(;{|hW?JfPX;+9ET!q*gp$YFnrdWEcF%1n%iwfH*DE{mQ_Ii%{}ANGFE{XGkz-D8h<~tW%GIc z19omDtX@BD&x;4YdHUmSJzve2?H6uT95wv7A;7r%PVs*BU%#*ZJk5K?(<`gaKmwXX1m}2gbJ*l>HNNK>rs=F6Lej@_S)~t ztr^RuKVSCVy!^qu^&h+5$xZU#&-N$kUGC0%Dqml#mEHfEy|QF~^V_3$8qS8~>}@>m z)-D-wUn1CG{*CgQiTbYJ27ftJiWf+=-HYQ2LsQ;eO98 zhF$xbPJE5ux%#?cyugE^8B8B;mHanf`s+1Y`JRv~>4qFH-+iwLetzG5XDM6ZtxJ*@ zpV@5TXtR5+zrXRz#nrzV?)_YT;OOoZ?x|CS-PSMCys;-QbaUv`IKDOgMn5tZv~73$ z__NJCg|DiHN@m8dC z&R3>{=PQ1(UbE+SQZPGQHMw#7zZ;AGDMo0y-25O{Vm0}@O3I1}!Yh)(6!w<&t+76M zsD9=FXFJ0udo_yGc1p|&T(DS>S@Rf^+Lt#?&n%uCvSPn^asOOn{q#*z85g-$DGL0V zwkN*4j?EKfdwg4HGi|{5;`by5rEL7oTh2b8;V7a_dr=CMqU+w>qnmf6iCFxc|GO z`P>Dc%Gub=DtdfN@`BQ#PT}x|D8^cbGn%%h)4WR;Z0?qubaZ0kxyoxZFV~#=x374b z^{KVf+RMFGtz-BQ|93v){vXcLhZCPkS#B(yyva4}xb!;Zb?tB1mi0f8mkxga;N;8| z3-U6OmwwaUWMxs+dEn|ytF5Pk9_^UM#<8l-i|b7L^2c>`SCy`JoYpNAd|Liktv$q~ zUe-GNW?XUf?|U~d-V;vz{ovQkt(o=bpG9x^JoEc}|22Qp_b-^|;a!}__x1=I?~bku zX$vl`W!Cxh|KI!@AA7qd%(G|CJ14z0UT{a1ONHYVIvh0nHR}?Z=v7a z_fw({mGN-!rdFL%-s5E-;+NbeqSA46+F3lyd-PA{=;{dU;n*#GXBl{ zcUw<<>-sx$QDc&oUDWZvttpxMUS~fpPj)ysA>rbWfHQWJWpdx|w4J-_=y%@)hnKf_ z80!E2=eDVLnQLWuck1ivIgD#~e#}tCzZubaYCCcjc*T>Y{TrFD}yBxIk|8 zjqUN4g|qG@Zab?Ys$I17da1~5nOUE&TU$4>dC%aTc<<1suJ!U4I2Rf!A67VUtor{3 z-nRYuZrYoa16)h?1qJjUy4k-aLb;u`S(U?b(2ausxn_t{ZHeSe*BKl|A`;g06i@UrAqqhV<9> zn@VOqGGBh({Deht5SY{!|JVUWvt{1_lYle7k__q?G_TSFfotoSK z=Pl!`=IYOB#&cf?NUvTbH&g0P)nqxYvl-!5JZ($;Lbnw8dEcDe^|9@H)2UgF{{P!v z-qqE-BkH2CqU(srrbkLYJ{GKNaNha-{8zu)x~HribQaG3Kq#`R>0nuzmHKU8ZmQ^Vfc#HT$4#enag>v$vs3 z^tZjwo){jZ8t^bEw`Qj{q@d%y#jYWZ`KnJBb*X7|Nrt}z4kb0n}C$^+Ic@5 zj@w_hyJT^q@$;_@)7Rc>Y>R&W@Wk^~d3>kq&fiU6BLAyII?m~DgwQR)Z7Z)%Se3l`#r_7}m&!L;xTc-hmY|RzH(T!$U+enH z$#<)FGMtxV`aYlex;n4P^mq5>Z}0dQ@h1M<_GX3ycO4lXbTh-I+e;Z6;w3p6uD^b? z{krTreE}YiA9Meol)roPBYVRSQOkb}d@ug3fBl0wzUOm&fxlE{=W)GMljW=3*Z&Q@ zSaJ9HF}s?dCp2OO4_NPK(39KNtNU`!=Q~PvmU^-k`wM^d-nQncJACq;ZTt++wo;9- zn-Nnte7?}Lf@9zGS&4Q_Q*)b7EGo2O|Ni~I-G?{)KmO%RR99l7ByI3g~l&tZ6vA&6S}&*Er8~x}?iCXXb^kW)ub-wbRf} zD0OBwWAd**&hzAu&67-nZ;ngO%)R$v3xnjMITDgt`y^%@+v*Y&nC39cAejGD!%i4eG_1p9} zJ>gwG@7b&C2bJo#Y+)+w+O_J#j74Qq?OY!iy^o)DUAO1sYtaoo+jeaKIs5MO$=TEQ zZ#VaQ{r5-O%XjbX<#+FY_}=q*rOsK#rrqxE-dzta`ptXveCN6w_3d*%e-0H{`RFja z+);M*?x_2r=Y7xq40Wk0oB#Rmm;KcZN(a7p-?=GsXU>hia<;77bW}Pra#mHk*fN2>*T|8!N^uNYy*?zgd z92)(%Gs%4#EB%#p`iV5N@@=p1)dyagYCc?e@|%<2kDpEls;vyKUHNCX=HKB1 z`!)oGCp@w2&+R>W>C2u)Gp<@HPF~~E?eY50X9n$@h)FLc8Rwq=CnfupVUDfw+}GFV zcLik`{pwI}`pT%hp{glrO1a|vj~o1aPo4X)T;YW0Y?&2NrK@hYEZ;Fl{;v7KH>=+q zXkK*cZwcGqSzoL|jkGG?l(ywek<$sVw$a|W?dZvE_N}U)ERLCM{cE&IxbfbWlB{~4 zMPHorWxg_OzNK*N%$skLCrjqvnzZZr71IbA;RE~mWZt+|?Yp16s#dk&(~05|S>}K$ z_Wl3o)%V>GW|~%Yr9Sg-)9?Mk9!aM>%1ZZS%z9fKob@15C*n%zPF-8)m0pjR);@dH zSX)15t;WN5OKi_KGc>$)e!Z79FOH4r$jOGT^}-w;C7n-|MvUN_WN@0zV~)cown_2w15ezL`X?mzgoXiok8FNNvSdp>m)M?8Bhwq;J# z)6Z>JcoJNXEn6sg>Qs2F?dE;wpTCvZVx<-wET*{CW7dk|y3K5S<`xfj6usyDAIkWx zsNn80>&0{LzMen%;iuynE7+t~Ijwe9(AC-QYZANp!*r$l5lZh(rFg7vz7+6{uVr|1 zuiP&$;+ubMTXDywVrlzOG5NA>nR9Cr(qH@WH@wvSmYsGamsRAM8N1SpR=?8$4X>w4 zzEkeMJ<(C>WWx=H8*WAtbJX9SUvoX-*p3n*?N*5uqHhn+YfChl66?2i-s&$Cc(#~` zu2oGhsD8ZuKu_+;TZiKr=Kou8ws5~(pQMH4od1cD8RzTY&G0!D@lhl^e}-)Fz8dR2 zj;l>Cx)+F@*IzrMe+FN7uyss*N&i8~`r_|@aux-ym+P=ftN8UNUb5$8t>^l$=gRqA zewc9_(4ONg`C#c}#`hLK?0)TI)<3WQZvOiFi>r@iZTgeNu=a-v>n(S|<0ro~Yn673 zJ}y0|v^~ypql0zYWQX(n1X>neo}rfT_sFWG_vdffaKG?+^Q9U3>V%@uI6w2yZiLd zcmDr79BeNt9Bz11k-4SR^3&||XBLK?ZC`!ADEs}fW7YFHn%3tywj}+PNq8qZ}LxE$-L){=QAw{d4mz(4I?~A>Cb^PG#kR88&HP!!$Ig%K7y=AH2 z)tKcw8!zu;JZf89aR05N#r=IHPmDvSS>61wbxzVUo3>@ar9}0K($S5x7ax>gnXm;TGLOq5L+ADb%ypC3QuzKgOgrgH*Ukwu9KL7Ghdk)7t zbt@D6b4z|*wffKQdw;g#bY;z|g|*AdyPgPyvrpOWf8xOVf4h61g(kShGOamPY+1Zq zTEy*G*`M;{i=Qh}{T7Ir##q~`?zsPD=^OTlkE-|G-)6pSnqO)i_P*nXhcnA7$p=>c zWob)7L%b#DsBSxPpyt}5`mE<~{(ZgJz_dmALB-uY_m4%-_V3m5)jc((CjNSxRr{R_ zZ?Cq$d7LA-U>9e)F~>y4oQ8^v8cSYFR=hu+_T<>fXCJ=oyqhoIxi8&$jk$fg$>uGV ztG_(oDOoYGDfqyOOtZ(#OAYzYcr9P!%a)d*^eMq@>$5|_zNtLxwwcB6eK@0N^6Ncp zc0Ugmy2pNg-^i?=UumHe^PD%#_Wb*uuAi>e9+YSL#`sKDzg8~s<$^D!%oqN?mA$-BC(^OHP42bj ztGgDNf2I~ao_qVjy!+DEZ5xcs@1HifJLSobGrS@?Qvy#GE(_k%z0K}h()|UYkG^jT zZ4`fXk%_^k`S06$)-|#XW+_IBY2Ghq`b+w1=Unc~elsg)o%iLni_(7m{Cs5dEWHbB zTN$e33g%yzSZkldX6kkP$b@%Cg80ubeJdYn6}*OF-Si`~wN|{aXI^kEcILG$j!bV^{@vDGKHo3= zs`HhnkEaEm$(!g^etxl`@VtGyOT_-p`ckx%!RhMSgN&ILeCw{6&bb?Rs`D*lq2(&M zlrOs!cg>G86SLa0rF5lfa8WXw7?We>?ki7kF;9JET>AIpCyAdw&z5HQvs><+{Qm#9 zU8m~rt=G3tlRRx2$yiuBy=bfd>8(${E|9<6vDEMDn~C>szQ2E6;>Y*&3wq~DUTtQ! zPtLynNF#)eY1xUN2PWNoGM_OZ{&d`qjrYT&AKbOiujSjYlf%4hl7r>O`bNLC5&F~L zKYXyOJoW#t%Zz`fTAbInmUXzk+K-dt@ap%0$A611XW4V^>$2r6d){#}GTi$!h2ep= zz2<>Vn}|2{Bdw$7|5hCSamvW7n7aVq(2@jUHC z)wkaAvQ(DpC zo%?q~^6V#10*>3&@3-_Re#14_QsL(7ts*Bl951_ezt6|2meM} z^ldyT=5<`=^8JM;_g>%J?7T}mVwX{Z)Dr3U@==KgSQx&~X?7P-yZFNIV0q!7r;S|khL5sb%sF?Kr!i_=+IcX=JyR{zon>(dzd_{JgiSMa zIC6VbR%d1%$V{AdZ%6dG<5Q-6`OUiE?UMu68MY^`y)QrhCBAWKH-mdCX1r>kRk)Pu%f>OA`FXU= GqK==YwG_aPbI!*%Kej^xs}Z*Vn?x&?XR1^S+?1; zzWaY7i19$Mf!gykZJbjjIc3-x8+JD`y!^GEfumqaZY{$Xy>PC027wRSyFfc!cb$Ii zo$jyx=j;EE^0IXm-Bm2-rS0GLP1pbQUCr{}->41if-Ar2I+uS-| z&Pm@MnVmdmcioXrK4IA_yJlKFj+HLa+R*ikVNusr&8-UC3cvgPKjF4)CR=X*j`CyC zreQY@T(&Lv?=1E!xaCCX7Ppiw`Rq@OrJr9_4JZ@)JIic^<^98b6Sq&CdW8K_tmIAo zC)`SAKSTZ+ximdA$FT;&Tm+p^K5;6VAR9rvf2DOTRL&q-d-7+`3o-)*u`Zjg>#ycZT!cyoDQ+@31Y~`jl7f z{e$24SNrTJTe7aUq4)l*&}Z3OOd{%^O_W|Cq3oj2cIMT?gAw)zE;+RSj?JBO_d%#~ zcd_*D_iPOLwyAX~S#Hmj-X8dRRXVrvbwFR=B1f&bvb~vn?fHw@nM|K?A2{-|H=<{g z&DsFjy;qkqPU*TN&)lZOs3~jMCTz9Wc*8z}c9|Z(tG~qa&gB=E6n(E^Wnm5ovvKot z-RI|f{#b7Jvu6kG?B{MZ3pw7mprWcx4zp zke#-x{ldinyVBl2mOF)2_qhFgQee3EjJU*?kmm<>28e!ibXYvwzELjpsmJ=@?|sG} z{>{Hx*cV*FAa$$Q+w6Gajhhv1Oh=X*~5d&XkfJX0lfz94@c?r!tG- z@CvchiyXAtXtyuhael=w*S^J&s&(rA^yC)t$v2TqU!-rSFOmW-w4&-iS zythQ}fcc{-3<)c1>RPWqKWMmbZ`}Juda>tztnYgFzf$?%F1!BE_1TyEE&l)F`+J-9 zYSiHeb2seD+;skMaYAkGv9D9!%vkf+a^*zM8Sgf)2r@ig^HqkUnql>|bGq3qHb2+7 zZfWig3e{4{`E38&wR=@p+MDxgea7bY*Y*2X=*M;I8Xdi@tM_#0v_sXGBENa%-q2&5 z-nviuZPeBLbg3wTRr1kK7&B(~|Ee}-^51v;pI*kM(8W)+=LJhQRwREmoXfb|*lk+H z`^;9aTG?%G=~q_${QFWJ$8|m)8Mip`HsRmK>N@9y*R$SWn6g&V>T&Vv!-bz#7Ekc* zZmMore?Ld~deqcxMb&eWVOP8ZZ!hPc#dqqigxuo))pH*O>oUzc!)pFM$~fz{lGW7d zwMshkC-23ZDNldJUO2IpZAJJqhB)!^y0%Fte7t|^JDXYk#Eh?P-N&?M8JE(A+UW`W?@fgrx?0bj z_r2{e_g`km&&I~2^Y`4wKWZj-yrZt_f>*qFbh<)(=S8&4Tm9Ayo&+gf(@7Pv({MLE#3liD4 z&Zp0~(^xEg;!O27y~c3!w&L>jaxd5#3~t12jc8^OU2NRe*SM7->!R)ds=N6=@+%T` z412$BVR{yt%puFLH)lbL#@TKE?SI{Pb4arwe=%?PuJ={Z=a^qDte!Ug;t{@)ULgZpE}fYSUmvyHJI2D$PEr)J>(0OaBfmH9(I4j1UoUCr|KEPD>e|dh4#wLqyR5S8 z-Til0ttGRBopDvwEpwBQQ@h2UFI>3u`;;}8WOOvk_uu4u_j~5-bdNm2XJRjzGZq+W ztx9T;d-#QQbrV9-7JA_-y^H`I5$2$dbCZ$Ux#DG-MU*_G@?rLP9z1Sl-`-7d*D3J z&4#&|4z@E6nxTjX7?)c)JM>-zJb zzhC@tY*gGX_vik}+HK|&9=_w3kCg7=P_7pexEA&>+X&pWhXycb==!g_hZk!}%_8mi z#Eoxnx4ny;)E_is_1WJ%Jt04xs^-1ovNL}py<n z`wZ6OTb`BbNGcWlV%o9eeFB*jOTWUpJ1+YyJ*f;=aQ^b(JXI}cJ;}Z69zM5s?V=Dr~S1r zJ(JP9_I+vpmv6tAU%li!Aa|o~dhztA-N_GUJ@Qmzat$_nY{jruK_kJZN9yI$M-zjW zFnTfG&^$l0RDA+3%cpZGbJgGZ*V$&o)XX{(m%VGtx8~f{pW`FC8?xCNAFrr%d9Ly+ z{nNhgD@@l-*K_x~J{Nx=Jk9Fr>lewJUhaR+eLr+sXMFb+UC*NxE32FQes`X|#<5|m zZ5+c(t{eOFt8;d2JfA0jYesMN?At3}Pmb?C{_F1R!%ynI<+%24zOH}iVy$fJng30j zE1PDQpa1evov~tX>6xA1a;LpHubfrr_Vm2>`5%?CclRFJ#~5&R9k<%)&o2%%ek|Cx zSMI~7d#7VsZdP;^z5b&4QoXTdCT~wkUMNq&j$&Al@87uV_ZZh zuHvf8%3aIAn%URYan0`7(t`$j474&>vJP%DiVnGRpSv^U$)U<;&jdXU&)@kmMLE8I zN73Jpm6sWm*-Vx_4(&d~d#YYlJMrj>v}Z^37TGxHGPNf0^u*|VvftZ2D|$6YQA2LU zYTbhO;dr!#L%i-6rEzQ_=tzExF%VEQY zZSBw4c8PyIaMJiPr)5O#bwdBt=2n>)Y0ypEZ;l}V?I;atYl zpN-r6UuRsq7kK?WBTN0=&wu}kU%26NZ(;ePtr6FEX0M-jQG9Vrb==m#2d`pF)?ZKG zq;F-kjj6jav*=u)o^Zjhg_eIMe7AjDe&C(qhUycA+_||wzExD8xy^K7lU!TL^81@@ zq7S`}sMkOLPvh=;L5l@-t25H)Rwo>E`1tm!+>P_WjISnMRNb<;UR7IT8{6+gi=EAC zx7H;#MK;|`5YGPJu-rp)X)Yh{j4KkEbM~BJ@V>vUN&C#heuLk+?=NvFSzGaMX})pO z+K@4!w?b6-L1<3HZ~LQj*Tq(vN6*~)n3ihCs)=f(EklK%hTd)m7Oqp)v1PfpA{ zlWkmcJlptPiUZ5D!$+?;v`XA4lj_X6eB{Ee@~+Ui`;`8flvT5*|3ARf@O7zV_tFXb zj?MYb@a(+hVM}(a&39HfJ&1TVjrq@qV4bdT#%bT}&*benZszxtMfaAp&q^)V2Y;Tg zcco<( zRj-ZInd?$!c=Iv!F1UL;-OUVi2B>DsH0@4a}lI6f=8#kEst?y5I)R`lqVE|6yb-}C0*LEF>Ksk^uS zeJ%d>-IZfcpPlK^wcplUET!}`%~W1$&AzkucD839&OKMrYq5LZOAXDh>zA*y`xC70 z?x4L&jBozK{m*YdJ$|D9>K#V8uhkb_+_G#AE~SSvxeBXXG>lB(Q#t zvHorOt&cb1yYxebu7+8CBBvJ~T>X0mgT{g9-CADG<+t1iVcUV8J5w`tDaVgbfGHf(-&kAC;~XcxVGs{QU(g3DR+y@x#_r~29M z-&EKCu95k<*Y~^pY%NnHHD;S}GVyQ8zxO*+`-b}Q`~stuPUV^GXZjg!49w2XYyHp0 zRaE-q`<0c_5AFrOeh~jBdfKa{QYN>oxdIOvY)`g0sx{Fj)%+dfvzC~D+bj*^V!Sh6 z>XfdXY9?Mcmvu{t`pb})=cni%kC}gYhUdKynYHD1%=5)JzqILr%KW!A*m37|>)b}M()W^V$8#1Ptyp-OlX+&)#l}so?h@?YE2Y=--?q1y@b}58 zlTrK|!WhIOL=t)3Z!NoC?Kbh)Ddtsi?_Ykux>+o7{U-x+$&T3HHAnVOSLA<@60nY) z{obyfvyVNU7vCstRQK%QrP)l3zgH{{HD)whD$Jr_SK2UrcTK(b_nO8))4ff-*G`)6 z^}8DC_WOI3!hzcrFTc7rGJwwy(r0I^dmGHOkCmxz?)sMfAMO7vzW)1^p~p|v=`#QI z7aurs{pe5jiju(0iQl3eJdS>9a+UUGd$eoo;)0%#Ba7D+yWW&cbYn4NtoSqiz|+TR z0_}Ge&6-!XV$X-D(kiE=PnT!7UCrwD`rM!K_D%1qT^HSoe@&eq-%yq#wm90@vD?9Y z<+EvNVhb-#Ojwev&0ZeZaIR9NxySK&=E@ts9cu%m8Qz?WUDExaIYqHx!}BBQpVJjm zEBvmxU6d5%)xIcmd^S6az$8&Yp5;E>4?c%XdG(LoA#(Avjxd*du6;Fu`cJ=Cr~6;L zb5fGkj_KZeR=cFW1f#Nl-rlk|*H3$_HD$kB&W|&V?*EV6P&#N_{CrPg(d_2;iv#O= zfA0T%V(LB{W6>qoybI<}bbP`cUD^D7hSjT;3rgn(PCF8GV$SE9B)-3^V`yX?^$o-i~$2XUuJUx4QAACu?{tJ;(C5hO5UsWcSl8In%rE zEX-c5RsH>FYagSe)n29bxjkxEZ(Ml2(AC8?^?U~3kBw*dHYu*k;eGboiy_pakb6yi zreL~0cPn2-?=JS&?|r5<%y}-*c>ni(X8He$@%_9Znt2aB^{;K=c-8C4p!M~@hTKiF zZq$pm+iXkoGT0j`vmmY^O2;&#FY$c0!QEM*mltiQP&^)dysp!C!B^!C+Yf9M4Ps8o zx-vJRk4rx8uCcqb;Hek4)^_}MxuP}srl8xp*%#(Ks(Pb&dy73|o|(=ZvBcw+^JWoo*PlZp`mTmk*CS?V*Ovu z4ZEsNzKsi%DfoLPYxkX}RiT9kuIma&h#zI1zEo@?S6=Yb^w0w z3N2|J6^j?RKly#1Ip^~yzRanA{lxYfN6zi~{np#iI$1GdiS=d2)qw(4Tpyc~?IQyB z9NEQPko)mi@cjKN=LcV3H!JMnuXU$hPTlq1Y=_;dsg=p<+t{yE#@=I$Tf*J4bYV~9 z`T4o?OdTi9zkEL7=$f!QPgr$6#xpo7Flnc5HL=?(`1bj#@^inx+bS<9&l8Z1*rwhv zaheY&zr%sr`~9;IG|vk)y5Mk@acdvbhAGh(BbE26UscvvQyI9rth{)osjOs^PIGt3 z=@;(Nw-5J~{NMXGc(hN~qoU%ciY@whS)ukr`<(EXA)H!L zKP1xB?_a#;=BMVosP+1*_X;1nmj!b__hx=uy5Z8cntS_s9PT>1pUm3Z5ct8d^|hCD zvFl8wseMXMuL?dBTySw|{ZFTDq8}z-deqY4sK6NZ~A_nrHuUq86>_rEP0P2(z< zPX_mtvE1Ji#dK3~_PZWyBa3ScWmD$*W@o&AAb5Y5NZj)KIOq^MY;Z>yF$%Tv; zZ)#iRZDfm)Iq~HCMF#KPv;1zq4pqDJXKB(_bA#=|9G^0FnH{(mb*60Bfs(XCPm}bw z$Hkj)fVN2gee=%YKzOCsf!9q8`9)p_W;ZY#5NBbk;b!@>E4F;j+3N*QQm@op45_c* zyYln@ORu>L{xvS!a!Ky%3F)V+diDY z>cqvr>o%@%6}r0qf>}i&Q^)h!3i~!R&3>s_ z@XK4_?v21n&IXZDZv$2@KfEpy#@($2u4@l?u;HZ#4y z#>T(jbG@5wx0C5wj|zY6ZKgMKo@*`FI~3Ir_SAOawcr(|E-PjiZTtR+*I?g<_vint zXPC-6P3DI{tbHk$$1SO^n=%YC3a1~^Fy>uh!!X@GV%=sYx1Bfi7*~ZZfA;j&)WRjF z{$K6n;a$M9p>D1I?OSu(#on?owwrvsS-tM&rA7C;_RNp_U~2dM$tk&2rP0c}1;0kD zJ!`7vtl52##VTOV8K>v_t*lCpJyE#wON2=-W=rhjYp+E&&QKCByS3?kUT)~$)$e(H z`Nj3RT%IpzV7QdRv+eb9U86XT5S6~Qmp0g(c%6Flv2du{PdA6^dF+?Pey_ffImdo~ z-Ir<>0~_UpM-gUH8ol@b*%kcaZqjD?_f+1%g@Z+4zx@aDMt z>+D>=yUdMWT^C)xZ^a~4%>B;he=bv8-kSK*v+3X7PkqU-p`;=H_>_k0d-nyFGB&Jt z^=i=L52~x)dr>t0@3+?qcJZ4Y^Vb;9`CpmvaYM$rX=SaGB3ih-ozuK@rJl>O?*93y zRPoo>JI`e2&bn~V-?-q@9j@4;H(yLM%D8SF{Asa%$P^B?H)l^w-8?r<`^A(w=G&_8 zm^t0s5Oid47HAc%Ysad%$s=k{Z4-Hwtp9gmyttal>YP3bKa#TrVh=L z3x016^!Z&pW9vit?v(Vtw>wx382jyWn(KZAUn%K+UH&yur|ZSkOB#QQ()KQVC|D_? zbSmTGCe~KTwQo7i)K9&BzxYYli>`a~zd6i{t+!0Gyz%Fq`GMd6H4DB?KX%HaT1x&@ ztZZzu<;i_@4eVljsy?`7zV(i~v&@Qz)6DsTd^@oN1zbYSx z9sBj=KwqbH)74aq|Arr~$wxmll>EANo|{62V|w_RiC4aEHjhbNb9k%!|7XgzUjuL6 znto~CM77CR9V@@PKRfRJH*H4XGMNW;%ySv<+&TW})8o}Omu-8V=}Xo3vTbT+b*r5h zp0`eBv${y}s*v3Z?`AXFsV953p5!X+yXkPk$-t1sD#>P({)Sh3t}WCP4Vjv=Qok|x zUBBYxU0nvxovor;&wDYPvo~CxvSUkfwBrW{%Pmp!8Lu7VD0X@*w{_jA0~|BsnAiMk zVb{MB#;|q6{Vf|mzTJL(?xH6wmj!wkng})6&27B@+nvRhX}`cPvpl85j4u zuqegKNBhCEmf|b**G|TjK6`TGfWy@-?C0i9OntPfVH(4oJ$wJeJ(CLV66JVurZ6%- z*@Zo2qay3Kw)N{5dK+~noQw8tbV%0leOG5FC9q`ko2_L>Z_L=afhujvFRc6kCaT@b4^%XM&PdX;e8v{^m|lGUin)q z)tJA1`(&jYUp{N;|Fg?`c+KrMlz#qJf9%k7o3)A?9;+7E&+%Qps?7bq*w*MxtG<0v z*zoP>o4WPC-6Q(aU83hRhMB9sZTwoc(%ME$@=kH6`^sfWWyzbY-E9lmGj{PU-B|o7 z$7*#7L-z91N1thkt@Zz{wz{sKqo6E$o9VIxle6qwPcqz_(0Kpn@fGTcS44Pj<$B3? z#q#}#z1z6EiQ&L{b&d~9udwc5<*2x;-5Nh1w9kW;>E4ejPp$*mR{!Eza`_<)xyhf_^X|-b^K^?fYyQOl@A?7v`r~H1 z?pmG?*1I#o^D9ZRMuR(PiURg7597M(mQxI9Vp>sGBsqrzTAxS zHB-z!SLXKj;&Kxgciq`)l$RmM+sIgC@TZM8g1P0^YTJ7=LrXM+j(I1fsF>~A*#EDE zgGX@3cfo?s1wZ4K<{7>J`^a23D|E)Wb^l{+|e`-GBAiysSIxS6A_`6Xh?{*lu&6XO9ne1gmW6dAqKN`SWM(d&67V zpfGp(%1h6x3;m^fx!nz=6$H0U`@K6p@!*FQg1e90xy<|FT>o2%W3#uf{d-vW^wx8W zEpJw`tdpB~@v!3zv)r8e5B!bG?Q{D2w|Cl1xN^DVsX&I`gJXFU*Pqw;^J}MJQCqg# z+M|6Bo^*NjKUuV}@nX*R$g{z$J~7e1_ogYnPTW~`DW}-@((cZMmYeMVR3C7!pKke| zb;ln+<_}E4^Vi95|HirDO2r!eoU_WtU3xbcoeMm?C+_RHtRMe3f6w2$E%$bn#Fwj4 z(XaRR-`=zS^uBqUzu$bGHb1%Mjl}b1A4KL=Fg!K?a7b8)gHzSxd1FIMON)aC%R&zi zj<^GbDW};cJGdxt9`UPrlaM3-e)IRJ>i1i(#TB3Zz2nQh=yAS@|{JNr~R5fDFf^O~16*0zFPoJ!P zdysv@|5FP$@i<voCHSpR*g<1UuN8-Kif+IrvL>iy9p9eHmn zY!@te>a4N%uKC&=nMdcoU6kOdxh2oso}Oa7*3v8{-|*b`6%D5G6B9YPe7ei@B}Ey1 z`9E$7sidk+acoe#*%|ZHNx74B?tb>Z)IzB+GT&g_Br!zeF2ULxf5~gD{h5q z{AMjWk}k12UrFUb>L(@}U6lu+pO|X0otYX=cijqq@{7smV*V-759{aZPCIy7>RhnN*Ko62}-mUr~8(clOMx+lJfDO0$JmatTGr}6 zw>GQP{Mq;Y%?rE#KaGMvUt+kno6Vd}*7Vp%u9??GwReYHE7SNL^^En|(pgq#J_R25 zelYUKy&K;zh1I^>Fu_!2jnr+)IYrSviZa!=^>0e@$0f$UVr4X0^fI%{ukd4o-`7Wt z4q}_PiC#YL`l;VX{?2r3vd{3!UwDyyOF+Y+A7!=ce*BeLt8e@L-;;Cm zr_5##c<;|Vli}vO_;va3e||mIe4k&Uv044VQN!O8EY%&>-q*dU-I`yU`0>lB@&~*^ zXD4f1)Dq@uVq41an(@ZEb!ItxCeBcstg0#Pt*8?8-&8|z?Ib2~cTctM<0pP9gvKoECSbe6y^Qfk)I=?FP?R;W$xDU1fdIc`3{>7e6=uZcKp2S&S}PP^EPaM zvN|#Q^KC&HjXCdk#ojp9$@|IZYW0?Bi#$ICy|&!-|4XEA(W`&42|1l7YoA@ea_PhO z+#OzKF{usNaldkw+G$^SdadZrZM&IOP5K-6?w?SlzwJU%O`~P-TQ4@2Sv=o32+ zFAnRPzWVF_OXn8V9p4wQ-sAZjZQ*ac($dErZfbv9GRfujoA<0=bXRJ=s}hWkTxfRp z$DitcyXtTE+aKPnum5vcJVRi8XvMGlr?|IVjsK|m?bxr%dw;dp{rxP#624`v%brW7 zdo{2Be17In-PG5*0w3;ZpR2FU{si)88eh!1(!y_l)4u*9PL=Zf#9o z-TpTx@i}^3Xrs!>Nq7Y}t<;oU>m9oW8ChI7Kd`Nt54}vBArQ`H_h9)S?bpI`mFaaZ|ci8 z>#Ry-_5Tr5c}Ht;^IPpV>0fnZB4+P8>2=AsbLqAndQ*-@c!|X9uif@~?G3S;^LAdV z^5T8M$ttl@ab?dm^DomE^j~W!67N|je=p(utLsUAHg`8`^>lB2_WrxQt>{f{PdR}Z zcZ^?4_4&VaXDCxQd*6C2wD+X?g)399sqy=Wq&k#8X!w5YVC^%Ca>x%HH)Ss*QTK4gVsZ-WUTZ->K zruX^Vgr3(-lb8Qap69xE?%KPNx2sv-?ls!7WV6myP5X5-i=!?yFzMI7zNi1TI&NP@ z!qxd#>-t~(^Hvakwkh}KwV8$I@3a3a5@k-05#00aR?v>NJ?}WUB^Q-%n(S>To-m$G` z@5!B!FBBS$_8J@VEwtYJ*S=6lMEo9qZtwDTwrws|7mg<<$N3yRu%*+=``sG(+3p8^ z*%ci4#$R+zhd;4=Z^umq+rO?~KIJEQ95@}fUP$PJRVCxT%$OOvIZIZP37JKH~W8t&-X+L(JS#^p*;OF=Gk!P1Yc5n+#{zc;$SpRs(^hXcJc&o5iF zD2p%CXsH?BGLwGx6`o~HdrodK`Fmrk(^0E)y+L22r-Z7$IJJe%s!8~h$QR|`d$YO} zld9kSYU*OS?qoWNJ1vy;kHkU=-wo1@e-~E1wowf|m3qqI&aA>`Q`a*YTWngqkooLp z-NS8_3muNPrxwSby{+88RcqnugV$m&9hPuYsxoPan!6p-s6nlS{n`*p8xD}%rT=_?!CQW&baN!Pt#LxkNja!-f-K*;Cy)Eg*kDehYUU!`TI^w{}*kzXX;7Az|8Y3 zq3#c!h##0Ne|quEg53P z)MRpLszTA(piJlcH{_zyZ$(!sCNsS}_&RuY@rGBYwn!YdxK;CXtF`tV8_i&5gFS)k zK7LP+VZY43?5xb3&(%qq{aTv^_zuMU@xA}Oq3JsFwA{~|l;R54PrtjbsIA^FRewjV z(zj{#ZSNm{lKl6cNpsoJ=W~C{S^P7MX1aX$>(7~s();q}Ov+x*eypaiEog^-21I@>f?Ki(d%5)Tjej+FXEi|1`IU;O`9`+>Xj7fhQo@5qcvHq007 zlfEk02UZxWHOy~Mk5%0-smAaj$Lzpq1IC8sn;GM#aWd>lWv&su$#5Xr?SN?bf&FD4 zn>PPb?YVba;=g{%59at;ALH-5e8TULP*{;7cVdr!`}`Gij8lwuF>6YHdbfH1_nn$~ ztAhVF*K^c-X#etVZKni(&u0BEyZm+eiYp_sdcNFy)u?&)a;xk8X$u^8J$f&z+ck5$ zH1Exxn@LC6W^7z|QaUM^XZ6Ggz2hNzf;DG%nsc#CJ8^qy^G4|zTQp|4*SyNT$6t0p zFEZ@wUABn)=T|PST63ycCG~2izIRlSzu7SXUrToW>b1Rvyi;P6Q+<5QI4_0#=1!=# zuxB}x#FLd{Gwa~IR_0x0ooUkCynoK|eK44Lu+t$woMnS~z$t0=)5RGtd0%BLxKi~{ zMqk9(?^D`3k&NEZ5s!BW+J^AaOlbhH5XE)UE2fs->_|!IP`<%~azkcsEdb)D^ zy@-!qg=OdGRlbbfZ_`>@`Tk7DjAz;B?uXw#J3rP?;OzH}wa4bKp?mB*(*7PG1Q*QSk7z6T`np|D}Gg|3ABp-O2EqL)`2)Lbp8^+R8on zxSzS0KmTs=I{)yq>v@FUcFxi`E1PyoJ#g=@qYP&fQ_nQ^DJHfWg{FJQ2D5JVdCzop z+Ut!{T{}0<4$7Q=brsWONiFr|2Q(k|f4Awsbncv5BXi-CpK`LzT_VMd3=wZkw>noF z@P6yr^4NISF$oP$iJfA*7;nh#>J@KTy!*gUUgq{cG6pUC-)=VQ57f_ds0nhJo9lV+ z!Hr`PCOId=Ho9&RUmwL>_ea^sudmQfp3CrdPGfg3^Mk!M#lK@~i(_X??mqa{&@blj zTxOMZOgnBU@GE7kyHsLX-_LNYsm!kWfa~|FT7E%iIF*Z;dl<}&sz(;uvL zVC*%&kg_epH8w3~dvzcC8r#R|H@7jhoh^t_y%3V+pWeHDJKwgF6aj_;GWR;?l(|Kkw+hPUX)4~=%8p>T^GjsM_kDkB zzqU+eTfyQsFDcIRLsvHEbl$^<%G<7p-1Ml*oOR>)xjn9jPig$W{r=YGZPLNhT3_{_ zvJN<7A!j{(fv=ZK-aLQJwf8n$uFy)}=B58leA_?2e&59N7jIpTz2MNd#<(U;Zd-Tx ztzDn)IiF2ln#2@gy;PfL+q6$<`@S7b5@@w9?7Mi`dg`-k_w(Psq|OgHS3U8MRIncV z+SxL*g|x2C_j3C6-cxgSWsHIUf|b?3f)`9!w=zJoWm{j-!gf`r#M?cAl7gl3pX*QC z9o~Dn`dPzHCbQ30iR-RRbG83dEOd~&(U{|Nx!&`$+Ul>j+on6mm2dKEvu{W|S0b^q%-V2)hId$x zqn~)#`(JNj>+H9EI)uhiDY?6gN*B9EsgdbRkJ zqSNhyu4>`D&63|zn(N*cew=AH<}N8Re>Cr@6P(Jd~Ir1^nocB04L@Xfvy!SywP z$9JP(chafczaENVM(d;Zv(!C)Kl{?Rd-pdNzB=D)xBGTLrDCt%IJf zZ5TPk&#k_EJF0I6vq2QUC6ggzwmWNNT1C8;;H~smw=YF+{IYC{Oa8{-SE&lix=(Yx zd{QT8yXouWsW)B;UQXBY_f*|`P5ZfpqDj`12MrSr9b;?q<;st=C`;SF`-+$`|2m$1 zB}e~y^ZW8DUi@)MdJad>(!Y0%<86-@c>WM$|5b@b32n`4<$rHnl~G9$+PPBl|Hgva z+_TKpg_rk9c(BU<+)#VIC~xORTcug;;R~51Sz?@xcf9^#<+cM`v~+a^up zd%l!Ol6Cs3294v*Li}vyGhV&<(OiH3+3y#60yFRA+n8AHOf|Z3g3sUNpJ{ny1Jh@w z3KMf*HU$~u`K|2BH)nr#@vnX&VY4r<*7o0#dvlErpS^IPw~qhKI>yz70y3b6(9Y7C34%I zc!md?;wNdB{;P22e>aiQRJ?)xg^fr1(PC3MsoSd7i8`NuM)MwcWtUZCbN1z?{SC|l z>l`Xo)tP4h$yd>5_%QVh?}BX2@cpgfhvxq_ z|M%n5ak+PY7Da#IHT(Cs`j4Vs>PEK5mHr_{hbv=l@8{+(7IBs^_Mh()_4#A^mw6|w z`@U5#GFlyB_&$(1!@^CCZT6eHttM}xX0h?=c(k^w&6%!tp@W|6F;*vCp!vyGeTdmD}-ehw9f; z2YZ%mdN!lvn~mn#r8n+7q#fAdru+5A!b-+zalD~A7o^tCn}1P(YUbkca%Y~c2 zKH*_|zjlvFe3J6Zy?iVl&%^9YVkhLylaV-daAt&JYH=GE!%s_&gWnb&^9=d^s&$!r z$Wocd^BAs|8qcV;o51ic^PR1##@QTiB@d>JtGvB2z960mc-r%QPx!U>5EF!A2->l{J`Z4oh29_&JwsSUFBf{`6iW?YdPkzNiAlXv_+5qeKg1XC%<#<2G9HHWnEDJ-EZWD{e^Hv59_QJPxOL4=Hy@pD_+`96y5X>` zHunNs<+jtW*PS|GU|-Ih+I;PXj{1?L=86SnH_ttd6H2(y$`)mJ_SW^Ps%aBLC5nFS z$+oE3Sk#!mC`6$leHvHI!W8y>{dztt?dE%~i(eL^(6By!rNe_w0>8TA;wPQ_{j{u7 zjOl}F|AB6)|A$X2WW+N*uK(Hhq>B3uiAf;?WvMRx1HO$)u*&7TV2_@Qu;JHU+rJc(Dm{{V5j^}w7vZ<0|YKSSh=_H{G}VVr>(E;Og|m1$Glv+vDy8=w-(OV%gpi^S$xW- znP@iOTM$}3KjTGbr$qJ(hG)4~=lFNqRUf?=d~mPho0Si4HJ|<&r8Rq(```Iu_0jYG z$GN}o`urz5=kE`{?)vKff0GIeLhGNjuKxY8>*I&XlFn-oIwyNR?DZy1HSe#y{9pa|?dxp*6it@7ct>SB-)pHfrLg+S#n!w2f7urz;l?37{p`xM z-xub`9Y0}sYU9b%hBN00Ynr4b9Q6n|Gxz1bxpB*Wo&RI;!;bxWdaFxStmErzr$b_^ z&Odqgu~=N(eyjVHXZyBviU0G7`KGNquUIr7Zt_~aZ;SMP_UzfWY`)$8h8eNUeLDw7$J*ohz5lEBYChg?bNI*g zg;jqpXhhDucgtdCQ^*vtX(!$v)QtLe&B*`T6vy|r$Gz|AX+D~F?3rlmiT|F0U%0a8 z1f0I1B6X5UL;wBl-~Jt~-yJx8 zslcgj)pV!OD2{U>$(Pn1Rh?z;+U=?Pp!m3DSF};V+j)QMO5{1BA3R$hvD(JkwTvl@ zf9)!#|3}t3{=4$K?E0Gd-bd;?&-fc`NPP2lZddcPgYla0SZYJUW8Yu8^*K8*S;2Lg zyYoHmy_;@qp4OFd_HM(@q{qiEtLvRUx#_s`1D{PBzqK9P@#xp=hO@TWE!VCV^ zUpG{y2pg}x-gj_M{&oAJYI8HLO4j}tw$q=-zv1s)YBST@%k0{d-lml{Co1P@0v+Nsv<5Mil6*AbFaE0@p0+feZ8#=NgJQ<0dgYws$|Ty@@P!%v3SlG73r=BG>QoLA>>(R;eeo_+7!XN;jI z%j?xD5+n+KrtFv&Dpz@^=FYY6&(rf5yxsGk7r$Sx)jU5*nx~*LZrl8=4rw#BRhX;FEW#Uc@{!Hc4LbM!zw>XrtGmyA0n;r;P5*?J?CF6ihxMZ8{BzK%S^D&}w!-2bu1TkK8}EI-sO@*|@#Lc5S$*%! z`VViJSzWisacdomgXFo#F@YcA?nq>?9OB_heINEL>F)BX{e=v6f0b9aue;POy-71f z&nI^+d;WD1`}c_}=XLtz$L59HTd?)ni_X2#<~z-wW?3w0U$yum!|&Q#5&zxO>inL6 z<55*yb4YK?wye26=RQqVTDphn?g3Nd2~6kquin+LJhH0)(xu>s?>QOj-mhn#|99Ww zY^$SJwJ*h;+;uAW@%E6$w=<*dS=*9Vf48&P_4&j{(TEGVjm`cmXBb~O(*CjI*_s&E zLKd^?-+R=1cSz~Xd9YOczgBC;&zU{)rFkz^x#sjgN;z88<7D{3VEtV86${jMYA5Ce z{M@P8J^%E!-#=|CSQ3oyH%~qJ_*#Qp2vb`30z2)SH#Bord{dpdsOHx@nI{uJDxA09 z(ZBp&Yev965%#`imril`?QPtkkh-_6x5e!JP80pS2Gt9DzHvWz#P+}M*s=*ep&nCt zz6f0K>RQHT!!l#fOZO`*Q!`C|mVLS5Rm{Y|F{vs!({Wg^F_aeT$Ekg=BD?k9~W5k6}Yy z#AI6o0h7onCRdrl{&g|zE?<+PCac}^JT@;#ey9gdn?$iUiK6k#WDoAaHr3TE!xp@j({gG%RIJ!%17_Ndk+1$zIkio?n8&ySxkxWVwyi&&AOyz&$SBQbOoLAm+R|S zU(9;_P;r%<{rQQ8KScx*O#b&k9iQ~#uw_Yx_|EF5ubJ%vO+4JAhXE*Q(CyOmD$gFufQS;in z%+%T`2Pb%X^R7E{af=aaZ0El{Nzx6g9#lR}dij#K`@G2J@FeC$u7s1b+!pk#;QZI7 z9Q>{ST~z%tm*&#M8{*sBtj;an(1Kl;u-+*55y9 zS@2qX+wtG(x%RL3yeh1e^Jb6va=?UPb@dk+@wV2M%IdxAHhkHmc`;aaGRNtn{%`+Y zOZ*ay!Q3VZW+Ct3qKk6o{TCFUzoIT>;KI9Z$_qzrv^~pu~e0cNJ=9`-RE#G?U94D{5<*a&crZQ8!VB{P|>i%(Ut=Pd|M6{?vH44ZGN%s`CuTtjnIww^3+L+E6;naf8L}A2rXH zo2|dQ&DQ<>R|f}M@#fGr362w`)>mBS{ENEuT>q(qqp`--?|bGoD^5LVyro^M@L|x@ z$;mreyw63?@2phqdm8cb`K1fjm+t$$VWZCkqtDMKoc$Pdy$xE#)4X#m3~_TfAKdE zs(CKYz<+OZA-9Q(lj4u9runar{Ca)3ZC-%M`bqV9cY}`}Vr`Q?@UG>|lm|U5XTEO~ zvHdTzHQsC56tDF&s^35QB{!j8uX^I1<$9kF9{jtzZ?m+wzWlT+$@lB>ul)2rDYAL9 zn%6Ap3wC*RH_Pw8d#tXrTJpJ%hMlLYcm0f+`-kZO@9qEY(UbkPCa+r3 z8JvDbu6JQiWur_d_rq)F8~>Ubzk6*rP2Jdo}}x>ad84n)HnVSIVoZO5Yvf z+$uBYn#+Pa*ZzHcz3!UX_xaiPz3vIe@B}mO+WT>T%8VEGZ&~-(Z{b^4%ahYD{n)27 zw0&#i``;-Cj{PjXeywAskVJw=QDy9BsTcOj8mA@7&&Pbu4o%;czIEmM;EXqmJj7bh zot8*g8h$tC`>b^J;JtydUzxUlx9M0{?3sSR$SQ2I3UY16O#e)`#@KK!Kq z|2bC|Zc`j1 z)`c#6T%#SzY?$*gM6Kany_~Q^XUY8Zr`56#PNnZv5N4<_R6B6_2E+P8EIYb*1&-XQ zqVo-VdwZz0KE_W~g|o_**M3UXI~|(y{*=4(VL}R=i&SUp?fsi}x34untkXD{5A^?YUeJGF@$9n!eMb)ooXeYBbn3iW z|B3@vPim?gB>$RScrANyUr>f@&Rfaf&Y$^K{M#blaF0Pl;i>f7c~WTyE^nUT6_cIF zZY-d9K-r>spU>P7Yw_!1{hvB_C&rz+w7s(b z+>H39kf0bwCM_n1F2>|f$4+)XyUE0$<-4QF;gd@6#HymhPfpD$+U;qh&AOUOX@P;c=Z_Z^3#CHVK1=yly+@dq3U4u;cTI zQxS2Zhu`1dxrVPOG@_xttYvZi?!OyDn5NI$+01k2PjEstw{g^Fp*c!AJQh;d>fT)W zcTV#}R`%K~!<{?1-`Q{;D7RyncPHn8cVlI+QtvdwtzS2?Xn&b0QnS|8C1USqmM`Le z%p>Ex%5J^S;V+Lqy}(ZH^Zhpkd|{c&0-8I&rccX%^89~M^y6TLdp|{P$jM8_sN4VYI|=TjNrcf>s1}MNN2_a@2}gm_U$WXP&+^M z(n6#COaa2$*S5+=SBuJpHAsmqTFspsU$Hn_GkJBo-Hea%OwMaNR%pJfd-e9aQu3VH zk=03T45`NxIL+Fb!dTYnHLgCuYQlOYXvx%HeQ7bGddqwSeA6fK9CdK8^W9J*+*kSV z>x*6XbN&RBir?M-Oma=ScIOKJYcs_k>jbzh%==z<{g8T@d)l4w=MEbUrO`Tvu4niOx*dEW8q-s#}=-eD?NBKpnLqj?vqdqs&o-B_8zbRf1gsB>~}umRI;pv(YxaGQ}+&> zV$RH;a(GkQMUTyrKMyag4fI^$re&b5b~*Ze4xe7wS>dHEw!;435BxiNrf27uTcu0S z#y|Tm#Cv9OvD&Gq*-Tg2gM&Wau+f*i_Ut3e)|B~sWP=|4mdzG4E^%1;>B-5?4R(GZ ze3$P{`M%~`x$nc!y#=9_AC7H2W-8jPdw1zKzO(L;f1dNssyeXR%V|U5*)1iZQx~Qj z+jNSdd)b49v!x6EUU+op@2sf{7ySsUmsnjAu=LjH&CzE%W-giWmRDtEtsA%QiGwS? zCG1(#FfZ@)Db{ztjTi6Q@-_ba@gx&OSJ|L+d$^G~c>f9uWWN9S!8tb2QU=ZDva-be5F&d#XM z{kZm<5BsZ_r>A}(#xuY3Jfh*Sfo>Lg}HhP%g8re9T%Tzm1a z*o~aV7b@}|MgQRR?!mwZ86-=`6s!Uf9tB+7}z&xx&N3W5ND>&#JbgF zZM1V@77wS+F9Yk@JLR1pMm_y0^o@<gr>oJf$efj(Jw$q_)XC{3txGFmDtNVnfUz+&#JimD+ ze!CWWXHIZa9XtZ@BB#o59Jd~Xf*{##kQTrF7n?bht|*^f`( zxb)BSb^U*i8-Juc{BIr6vlTIBZR0$s^jXVA%4AjW+8s~)QeQTR{ad&ry)WI~^1aK( z%K0(^!Cl4)#mNQ<=l`)8|4BAvRuh_Y@Rd<$^p^ZrQqTN&TzO0S#Y;AN*iWD4jl^f7`aykV?1qJ@rglMmgv5>aS&N3y(b= zV5XY*Nv_iWVE?=Pd&#DsKP0bv5t~}U{=LU3+xBOG*qPKR;UU(I#Tjk;mUHP#TtA;; zc%b%q9cb({?1&$TaG?Cs(C z%%AVfv-d0hCvGb3dGkq;h1uf&hx&G@=5;A8!Ta{ubDhbsx8C@?)AY-OHroyLOfvOp zn>O!e*md4#r7i=XJ!7BUQ=5wppJx8peQ~WUUqRu2xtDi!559}NpZ|%Sb*sr@`S6o( zCp0$m2N)krW-*)3u=@9$D=$CoeDgf$4AaRo0Y75a?LAbisIjJ1x`yeg%I}%YYh9lf zOlXwbzG7-sQCan^li`h#SA(r2Jem{ggCqAzu9z`f?ozMr6_=(^JA z{q&;;t`yJG_Yp64NY%_wGTipymt4V*&ujFGs%rFcXCK%8Jmm`+pFw1dt*K- z_SOp{`(xYGpL+{G?qxb9aU(LCkyW>4W$(?;>r{U~T(!C--9EWXKTpE$ywFdj)hv6? zeBGkOxPF#+!c6H0rJtB;bXT)5#LvFNuuJdc)%EAU9&KZ&3GS({_lUiD{<`76##t%; ze?J^^*6-TMcdI4xA7eekxmyiC8O4^)RnK0UJ^C#%--BidE z^6dA;mb(4sM*|`^8aFmM+{!$0;FsQq5A9zVE+x(eB_x_@7%Z?u?$?07mIsc{Y z?1WP}I^XtwW!+GDM@T~HlJP^4WewlnbEI9IX5MycmzV6Zl$~sD)9lxL-F@+xx^FQ{ zsNn?R%x8>g4*cdP0yqx5GSn))rrx<)Zu*6cxeFPz+iXu5S3Xu=yh&a}TT!fWR>8(& zPukrszngK}aVk@a$+M1G8+RAv`^;JIP_kGgSjpKwe2$gWhkY^$%h)*>HL|nK-4@vA zN^VfTzE0%cDudV=;TbD)LbK8`le^b3dWSle#BI&XKi@BY;HWRR<;gXF`$9jng`Kjz zIQ?Sagx|6o_U66zmb2dfU0<`TAmQAVXIY-!Wq!AB7B4V;u;t8Zn}yy24n=6hFdBxuDi!re_~0~=8xX`Mq;&}i%n*Tx@a{O-8T^!iSp&cgiS1!rDy{e6`ov0lHy|KFswJ3A#`dK>)=b@;iupo8Pc zaT7CZ_FHVXl@r~s@i{KdOIOW4d?aO&@Pzdr->BVoe6!B#Tut26mkPJL+pc;v1b;kP z`u9V1Vb*T}2Uh!K!qw?_-)AQWD16{aUJ+1Gef)Ho3)2Hei<+iLi3?fhkCZcSu-m@v z>RL2~m?;udW$RT3>!eb)gmL5CB5B9vf z=&&{}dsTL>_R)EqOcN6wxKl6N6&VFTjLTGV-EY9&cCM~!0`rMEuXzeA_vc=DIZ0yL zw(a{k=WuT*R{30gDLbSxsk%qX@7dGY>{ZjlMRq*@zGJfEzuj^sYafLq%$UsTy;Jq3 zl~-Mh<>Dt=W(~KtY-w)uoqSyGi>UOW{l@yY9!_3z?#ayE?$1q=W(PO?%E?Oiyz9)m zc?0+T@2l56zg6nD&hD+&0iF8u#d2S#a&T76EMRzW_9-jF2Q!rgd@TETQF zoU>k^kKu=!X|e()N5(RT>r>I(U0G{w*Na8Tv#jbkv=VV*X@m8 z0Qp`}&oVx7jsas}h)!#f6oZ1SOggbjaW}0d&`(wB8@0CJ9Qm=WA9h&4c z(@1zu!!eUae$~QL(hSwR%eQ7fo^O8OW;MgPl@~t#+$+H*IJIb{MTJNc+m{2HJ7@SU z6J5EnQ{-0ke1ks+cD`L4+?4%Ot?y)sgF#Duc%{7Rj!$k2i&PaBT(x=DIO!AUs1t__87&# zVd(O?FXw*FeWAEZNurd|((GKl8S4`-7@NCZIrB`BVYd3VYl{wSOnU1*S@y~9*A6#k z%#rASvru?)p_FZmuJ3Q}6rJJ>kuuxc(0LQ7UTdDTE9KVF{mkDtZ~C#i&!)&Y zf_1`*kffx(DFHb(O0#nGWuGm5))YN?aiAY76IVcJQrOh@-NM@10c!Dkl6#tFG#)T^ zNc|_0rD!&TCxtQJ^2WVM%Z+w?ye=0no-Cf@FIBKuBJ1cJ@srIBvzEqBHZ56^aG|LF zn(4XpQj=q>VMp$KnX-_%tle)VuWnvFXIMxY*K_A&4F^pI)0TAxCVme+UI$OR9lGd5 z@NY}mEw#^6SDjlqhbLlgpUxVUAibly0en15PS#pCTe17R^vVfOT6wg}?1PSLf}eO3 z_l!3+GUf+<>M}@kThEC27tS10QC9xE_v{3Y8)^G0ym(6{oOx%+p1UY}IeSy+T(t$9 zOPAjH{M%&l+0IGQ-tQ`ZiX{}A#3hzg%-qbdr|5x6vm8?@1Sg|GV+}bPGE10ZTRxbE9r~RzM(n%&4SJk|_GH2Gu z`71N}^&Tcjo&7OIiC3#i*!JV$W4~5UYLRGo|7WJAg7A*f}vnJ#Fe`lV(vY_W+th?HwTVA1mKm6|vb6sfB&-GhevT31Fgz|G`t`g2%8<)TO zdzob~Oxg5MÐ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�!$}u@=kon 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�KmCZ)) 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