From 99ca137a41f30f84149491c84c61c8972c82b9a6 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 10 Dec 2020 09:28:15 +0100 Subject: [PATCH] Extend Blueprint documentation (#15873) Co-authored-by: Paulus Schoutsen --- plugins/configuration.rb | 4 +- source/_docs/blueprint/schema.markdown | 142 ++++- source/_docs/blueprint/selectors.markdown | 552 +++++++++++++++--- source/_docs/blueprint/tutorial.markdown | 6 + source/images/blueprints/selector-action.png | Bin 0 -> 8370 bytes source/images/blueprints/selector-boolean.png | Bin 0 -> 3148 bytes source/images/blueprints/selector-device.png | Bin 0 -> 6121 bytes source/images/blueprints/selector-entity.png | Bin 0 -> 6287 bytes source/images/blueprints/selector-number.png | Bin 0 -> 5155 bytes source/images/blueprints/selector-target.png | Bin 0 -> 9206 bytes source/images/blueprints/selector-time.png | Bin 0 -> 1644 bytes 11 files changed, 595 insertions(+), 109 deletions(-) create mode 100644 source/images/blueprints/selector-action.png create mode 100644 source/images/blueprints/selector-boolean.png create mode 100644 source/images/blueprints/selector-device.png create mode 100644 source/images/blueprints/selector-entity.png create mode 100644 source/images/blueprints/selector-number.png create mode 100644 source/images/blueprints/selector-target.png create mode 100644 source/images/blueprints/selector-time.png diff --git a/plugins/configuration.rb b/plugins/configuration.rb index fc599102e64..e1e65355220 100644 --- a/plugins/configuration.rb +++ b/plugins/configuration.rb @@ -5,11 +5,13 @@ module Jekyll 'device_class' => '/docs/configuration/customizing-devices/#device-class', 'template' => '/docs/configuration/templating/', 'icon' => '/docs/configuration/customizing-devices/#icon', + 'selector' => '/docs/blueprint/selectors/', } TYPES = [ 'action', 'boolean', 'string', 'integer', 'float', 'time', 'template', - 'device_class', 'icon', 'map', 'list', 'date', 'datetime', 'any' + 'device_class', 'icon', 'map', 'list', 'date', 'datetime', 'any', + 'selector', ] MIN_DEFAULT_LENGTH = 30 diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown index 9bc993f26b1..c78a404d47c 100644 --- a/source/_docs/blueprint/schema.markdown +++ b/source/_docs/blueprint/schema.markdown @@ -3,37 +3,132 @@ title: "Blueprint schema" description: "The schema for a valid blueprint." --- -Schema of the blueprint metadata: +The configuration schema of a blueprint consists of 2 parts: -```ts -interface BlueprintInput { - name?: string; - description?: string; - selector?: Selector; - default?: any; -} +- The blueprint high-level metadata, like its name and a description and + the input the blueprint needs from the user. +- The schema of the thing the blueprint describes. -interface Blueprint { - blueprint: { - domain: string; - name: string; - input?: Record; - description?: string; - source_url?: string; - } -} +The first part is referred to as the blueprint schema and contains mainly the +blueprint's metadata. The second part depends on what the blueprint is for. + +For example, in the case of creating a blueprint for an automation, the full +schema for an [automation](/docs/automation/yaml/) applies. + +This page is mainly set up to describe the configuration schema of the +blueprint metadata. Try our [blueprint tutorial](/docs/blueprint/tutorial/) +in case you are interested in creating your first blueprint. + +## The blueprint schema + +The only requirement for a blueprint is a name. In its most basic form, +a blueprint would look like: + +```yaml +blueprint: + name: Example blueprint + domain: automation ``` -The [built-in blueprints](https://github.com/home-assistant/core/tree/dev/homeassistant/components/automation/blueprints) are great examples. +And this is already a valid blueprint. But typically, one would need +more. For example, user inputs or a description to describe the blueprint's +functionality. -Here is the built-in motion light blueprint: +This is the full blueprint schema: + +{% configuration %} +name: + description: The name of the blueprint. Keep this short and descriptive. + type: string + required: true +description: + description: > + The description of the blueprint. While optional, this field is highly + recommended. For example, to describe what the blueprint does, or tell more + about the options inputs of the blueprint provide. New lines in this + description are displayed in the UI, so paragraphs are allowed. + type: string + required: false +domain: + description: > + The domain name this blueprint provides a blueprint for. Currently, only + `automation` is supported. + type: string + required: true +input: + description: > + A dictionary of defined user inputs. These are the input fields that the + consumer of your blueprint can provide using YAML definition, or via + a configuration form in the UI. + type: map + required: false + keys: + name: + description: The name of the input field. + type: string + required: false + description: + description: > + A short description of the input field. Keep this short and descriptive. + type: string + required: false + selector: + description: > + The [selector](/docs/blueprint/selectors/) to use for this input. A + selector defines how the input is displayed in the frontend UI. + type: selector + required: false + default: + description: > + The default value of this input, in case the input is not provided + by the user of this blueprint. + type: any + required: false +{% endconfiguration %} + +## Blueprint inputs + +As written in the above schema, a blueprint can accept one (or multiple) +inputs from the blueprint consumer. + +These inputs can be of any type (string, boolean, list, dictionary), can have +a default value and also provide a [selector](/docs/blueprint/selectors/) that +ensures a matching input field in the user interface. + +Each input field can be referred to, outside of the blueprint metadata, using +the `!input` custom tag. + +The following example shows a minimal blueprint with a single input: + +```yaml +blueprint: + name: Example blueprint + description: Example showing an input + input: + my_input: + name: Example input +``` + +In the above example, `my_input` is the identifier of the input, that can be +referred to later on using the `!input my_input` custom tag. + +In this example, no `selector` was provided. In this case, if this blueprint +was used in the user interface, a text input field would be shown to the user. + +A blueprint can have as many inputs as you like. + +## Example blueprints + +The [built-in blueprints][blueprint-built-in] +are great examples to get a bit of a feeling of how blueprints work. + +Here is the built-in motion light automation blueprint: ```yaml blueprint: name: Motion-activated Light description: Turn on a light when motion is detected. domain: automation - source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml input: motion_entity: name: Motion Sensor @@ -79,5 +174,10 @@ action: - delay: !input no_motion_wait - service: light.turn_off target: !input light_target - ``` + +Additional examples, provided by the community, can be found on the +[community forum][blueprint-tag]. + +[blueprint-built-in]: https://github.com/home-assistant/core/tree/dev/homeassistant/components/automation/blueprints +[blueprint-tag]: https://community.home-assistant.io/tag/blueprint diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index 1e26730569a..a67a244039b 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -3,112 +3,490 @@ title: "Selectors" description: "Documentation on available selectors." --- -Selectors can be used to specify what values are accepted for an input. +Selectors can be used to specify what values are accepted for a blueprint +input. The selector also defines how the input is shown in the user interface. -## Entity Selector +Some selectors can, for example, show a toggle button to turn something +on or off, while another select can filter a list of devices to show +only devices that have motion-sensing capabilities. -Pick an entity. The chosen value will be an entity ID. +Having the good selectors set on your blueprint automations inputs makes a +blueprint easier to use from the UI. -```yaml -entity: - # All fields are optional - integration: zha - domain: binary_sensor - device_class: motion -``` +The following selectors are currently available: -## Device Selector +- [Action selector](#action-selector) +- [Area selector](#area-selector) +- [Boolean selector](#boolean-selector) +- [Device selector](#device-selector) +- [Entity selector](#entity-selector) +- [Number selector](#number-selector) +- [Target selector](#target-selector) +- [Time selector](#time-selector) -Pick a device. The chosen value will be a device ID. +If no selector is defined, a text input for a single line will be shown. -```yaml -device: - # All fields are optional - integration: zha - manufacturer: Philips - model: Remote X1 - entity: -``` +## Action selector -The `entity` option will limit devices that have an entity matching the entity selector. +The action selector allows the user to input one or more sequences of actions. +On the user interface, the action part of the automation editor will be shown. +The value of the input will contain a list of actions to perform. +![Screenshot of an action selector](/images/blueprints/selector-action.png) -## Target Selector - -Pick a target for service calls. Will be a dictionary containing optionally `entity_id`, `device_id` or `area_id` keys with the picked values. - -Meant to be specified as the `target` property in a call service step in a script sequence. - -```yaml -target: - # All fields are optional - entity: - integration: zha - domain: binary_sensor - device_class: motion - - device: - integration: zha - manufacturer: Philips - model: Remote X1 -``` - -## Number Selector - -Pick a number. - -```yaml -number: - # Required - min: 0 - max: 100 - # Optional - step: 5 - unit_of_measurement: seconds - mode: slider # other valid value 'box' -``` - -## Boolean Selector - -Pick true or false. - -```yaml -boolean: -``` - -## Time Selector - -Pick a time. - -```yaml -time: -``` - -## Action Selector - -Enter a script action. Will be a list of action steps. - -Meant to be specified as the `action` of an automation or any syntax that accepts actions, like `choose`. +This selector does not have any other options; therefore, it only has its key. ```yaml action: ``` +## Area selector -## Area Selector +The area selector shows an area finder that can pick a single area. The value +of the input will be the area ID of the user-selected area. -Pick an area. The chosen value will be an area ID. +An area selector can filter the list of areas, based on properties of the devices +and entities that are assigned to those areas. For example, the areas list could +be limited to areas with entities provided by the [ZHA](/integration/zha) +integration. + +In its most basic form, it doesn't require any options, which will show +all areas. + +```yaml +area: +``` + +{% configuration area %} +device: + description: > + When device options are provided, the list of areas is filtered by areas + that at least provide one device that matches the given conditions. + type: map + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of areas that + provide devices by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false + manufacturer: + description: > + When set, it limits the list of areas that provide devices by the set + manufacturer name. + type: string + required: false + model: + description: > + When set, it limits the list of areas that provide devices that have + the set model. + type: string + required: false +entity: + description: > + When entity options are provided, the list of areas is filtered by areas + that at least provide one entity that matches the given conditions. + type: map + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of areas that + provide entities by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false + domain: + description: > + Limits the list of areas that provide entities of a certain domain, + for example, [`light`](/integrations/light) or + [`binary_sensor`](/integrations/binary_sensor). + type: string + required: false + device_class: + description: > + Limits the list of areas to areas that have entities with a certain + device class, for example, `motion` or `window`. + type: device_class + required: false +{% endconfiguration %} + +### Example area selectors + +An example area selector only shows areas that provide one or more lights +provided by the [ZHA](/integrations/zha) integration. ```yaml area: - # All fields are optional entity: integration: zha - domain: binary_sensor - device_class: motion - - device: - integration: zha - manufacturer: Philips - model: Remote X1 + domain: light +``` + +Another example uses the area selector, which only shows areas that provide one +or more remote controls provided by the [deCONZ](/integrations/deconz) +integration. + +```yaml +area: + device: + integration: deconz + manufacturer: IKEA of Sweden + model: TRADFRI remote control +``` + +## Boolean selector + +The boolean selector shows a toggle that allows the user to turn on or off +the selected option. The input's value will contain the boolean value of that +toggle as a boolean value, being `true` or `false`. + +![Screenshot of a boolean selector](/images/blueprints/selector-boolean.png) + +The boolean selector can be incredibly useful for adding feature switches +to, for example, blueprints. + +This selector does not have any other options; therefore, it only has its key. + +```yaml +boolean: +``` + +## Device selector + +The device selector shows a device finder that can pick a single device. +The value of the input will contain the device ID of the user-selected device. + +A device selector can filter the list of devices, based on things like the +manufacturer or model of the device, the entities the device provides or based +on the domain that provided the device. + +![Screenshot of an device selector](/images/blueprints/selector-device.png) + +In its most basic form, it doesn't require any options, which will show +all devices. + +```yaml +device: +``` + +{% configuration device %} +integration: + description: > + Can be set to an integration domain. Limits the list of devices to devices + provided by the set integration domain. + type: string + required: false +manufacturer: + description: > + When set, it limits the list of devices to devices provided by the set + manufacturer name. + type: string + required: false +model: + description: > + When set, it limits the list of devices to devices that have the set model. + type: string + required: false +entity: + description: > + When entity options are provided, the list of devices is filtered by devices + that at least provide one entity that matches the given conditions. + type: map + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of devices that + provide entities by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false + domain: + description: > + Limits the list of devices that provide entities of a certain domain, + for example, [`light`](/integrations/light) + or [`binary_sensor`](/integrations/binary_sensor). + type: string + required: false + device_class: + description: > + Limits the list of entities to entities that have a certain device + class, for example, `motion` or `window`. + type: device_class + required: false +{% endconfiguration %} + +### Example device selector + +An example entity selector that, will only show devices that are: + +- Provided by the [deCONZ](/integration/deconz) integration. +- Are a Philips Hue Remote of Model RWL021. +- Provide a battery [sensor](/integration/sensor). + +And this is what is looks like in YAML: + +```yaml +device: + integration: deconz + manufacturer: Philips + model: RWL021 + entity: + domain: sensor + device_class: battery +``` + +## Entity selector + +The entity selector shows an entity finder that can pick a single entity. +The value of the input will contain the entity ID of user-selected entity. + +An entity selector can filter the list of entities, based on things like the +class of the device, the domain of the entity or the domain that provided the +entity. + +![Screenshot of an entity selector](/images/blueprints/selector-entity.png) + +In its most basic form, it doesn't require any options, which will show +all entities. + +```yaml +entity: +``` + +{% configuration entity %} +integration: + description: > + Can be set to an integration domain. Limits the list of entities to entities + provided by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false +domain: + description: > + Limits the list of entities to entities of a certain domain, for example, + [`light`](/integrations/light) or + [`binary_sensor`](/integrations/binary_sensor). + type: string + required: false +device_class: + description: > + Limits the list of entities to entities that have a certain device class, + for example, `motion` or `window`. + type: device_class + required: false +{% endconfiguration %} + +### Example entity selector + +An example entity selector that, will only show entities that are: + +- Provided by the [ZHA](/integration/zha) integration. +- From the [Binary Sensor](/integration/binary_sensor) domain. +- Have presented themselves as devices of a motion device class. + +And this is what it looks like in YAML: + +```yaml +entity: + integration: zha + domain: binary_sensor + device_class: motion +``` + +## Number selector + +The number selector shows either a number input or a slider input, that allows +the user to specify a numeric value. The value of the input will contain +the select value. + +![Screenshot of a number selector](/images/blueprints/selector-number.png) + +On the user interface, the input can either be in a slider or number mode. +Both modes limit the user input by a minimal and maximum value, and can +have a unit of measurement to go with it. + +In its most basic form, it requires a minimal and maximum value: + +```yaml +number: + min: 0 + max: 100 +``` + +{% configuration number %} +min: + description: The minimal user-settable number value. + type: [integer, float] + required: true +max: + description: The maximum user-settable number value. + type: [integer, float] + required: true +step: + description: The step value of the number value. + type: [integer, float] + required: false + default: 1 +unit_of_measurement: + description: Unit of measurement in which the number value is expressed in. + type: string + required: false +mode: + description: This can be either `box` or `slider` mode. + type: string + required: false + default: box +{% endconfiguration %} + +### Example number selectors + +An example number selector that allows a user a percentage, directly in a +regular number input box. + +```yaml +number: + min: 0 + max: 100 + unit_of_measurement: "%" +``` + +A more visual variant of this example could be achieved using a slider. +This can be helpful for things like allowing the user to select a +brightness level of lights. Additionally, this example changes the brightness +in incremental steps of 10%. + +```yaml +number: + min: 0 + max: 100 + step: 10 + unit_of_measurement: "%" + mode: slider +``` + +## Target selector + +The target selector is a rather special selector, allowing the user to selector +targeted entities, devices or areas for service calls. The value of +the input will contain a special target format, that is accepted by +service calls. + +The selectable targets can be filtered, based on entity or device properties. +Areas are only selectable as a target, if some entities or devices match +those properties in those areas. + +![Screenshot of a target selector](/images/blueprints/selector-target.png) + +Its most basic form, doesn't require any options, which will allow the +user to target any entity, device or area available in the system. + +```yaml +target: +``` + +{% configuration target %} +device: + description: > + When device options are provided, the targets are limited by devices + that at least match the given conditions. + type: map + keys: + integration: + description: > + Can be set to an integration domain. Limits the device targets that + are provided devices by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false + manufacturer: + description: > + When set, it limits the targets to devices provided by the set + manufacturer name. + type: string + required: false + model: + description: When set, it limits the targets to devices by the set model. + type: string + required: false +entity: + description: > + When entity options are provided, the targets are limited by entities + that at least match the given conditions. + type: map + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits targets to entities + provided by the set integration domain, for example, + [`zha`](/integrations/zha). + type: string + required: false + domain: + description: > + Limits the targets to entities of a certain domain, + for example, [`light`](/integrations/light) or + [`binary_sensor`](/integrations/binary_sensor). + type: string + required: false + device_class: + description: > + Limits the targets to entities with a certain + device class, for example, `motion` or `window`. + type: device_class + required: false +{% endconfiguration %} + +
+ +Targets are meant to be used with the `target` property of a service call in +a script sequence. For example: + +```yaml +action: + - service: light.turn_on + target: !input lights +``` + +
+ +### Example target selectors + +An example target selector that only shows targets that at least provide one +or more lights, provided by the [ZHA](/integrations/zha) integration. + +```yaml +target: + entity: + integration: zha + domain: light +``` + +Another example using the target selector, which only shows targets that +provide one or more remote controls, provided by the +[deCONZ](/integrations/deconz) integration. + +```yaml +target: + device: + integration: deconz + manufacturer: IKEA of Sweden + model: TRADFRI remote control +``` + +## Time selector + +The time selector shows a time input that allows the user to specify a time +of the day. The value of the input will contain the time in 24-hour format, +for example, `23:59:59`. + +![Screenshot of a time selector](/images/blueprints/selector-time.png) + +This selector does not have any other options; therefore, it only has its key. + +```yaml +time: ``` diff --git a/source/_docs/blueprint/tutorial.markdown b/source/_docs/blueprint/tutorial.markdown index 318d763f1a8..97011da201b 100644 --- a/source/_docs/blueprint/tutorial.markdown +++ b/source/_docs/blueprint/tutorial.markdown @@ -12,6 +12,7 @@ For this tutorial, we use a simple automation. The process for converting a comp To create a blueprint, we first need to have a working automation. The automation we're going to use in this tutorial, which controls a light based on a motion sensor, looks like this: {% raw %} + ```yaml trigger: platform: state @@ -27,6 +28,7 @@ action: target: entity_id: light.kitchen ``` + {% endraw %} ## Create the blueprint file @@ -65,6 +67,7 @@ For the light, we can offer some more flexibility. We want to allow the user to Inputs are not limited to strings. They can contain complex objects too. So in this case, we're going to mark the whole `target` as input: {% raw %} + ```yaml action: service: > @@ -75,6 +78,7 @@ action: {% endif %} target: !input target_light ``` + {% endraw %} ## Add the inputs to the metadata @@ -164,6 +168,7 @@ By limiting our blueprint to working with lights and motion sensors, we unlock a After we have added all the steps, our blueprint will look like this: {% raw %} + ```yaml blueprint: name: Motion Light Tutorial @@ -198,6 +203,7 @@ action: {% endif %} target: !input target_light ``` + {% endraw %} ## Use it via the UI diff --git a/source/images/blueprints/selector-action.png b/source/images/blueprints/selector-action.png new file mode 100644 index 0000000000000000000000000000000000000000..25d4c17c539453b6bc83109390e754124c2b38e3 GIT binary patch literal 8370 zcmai4WmuHm)}En6O1dPayBjI#28WbV$)Q_%5RsA)q`R4+O9Z4uKw88BhDHPgq#1_h z8(z=*p7WjW$9G-Nk9F;5&sux0y`Q!2weE@0*Ht6Lqs0RN0E8Oq%7y>{Mgjl;B*4W$ zkMvy@oB;q#0UFARpcla33&7Wyio}sC9XAMZVy2&fBZY8M%1qaF3>ld=>?QxG=`I{3 z5)%+yCk4d;l+fNjNnn5i42XUJ=pksRTz=xfYG~JzTg#pk0P=R0Wd7{}$r2efw8KiH z?cyqQZxR4tX+{fttERl?d)Yyik^4U7z``$L`(z;iRDp<5C-_dbLfVDs7JZ@rMp zKZgF;`peK?=J}KVWjuV9-6ffD**%$VgSV8{*hgB!zx^(LjWdE4 z$Gs!tjvCapn76lgy{Yz9!ra`GuBF;*Ml3~QBm9>Y(sV@W>FIjf+QE&l%d4Q!7`-h= z(YE*R%dW|;uC6vVHZ+M}xm)LIX=%m9#c?UanQ)81YskRzva+r1?a57_nzQ5Mrj8DJ zyvPb`D=TpciQ%E4_wU~)5B}`!eWcq01#KN4i&7KxuX--De*E~ctE;@VvGM5oy5>+) zQc^H`baHZXo&*0-uh84ypDIRq#?#j~wa3!#soJh>SeW(FB4Z*GIR(X4D)1?fK{Hb{ ztlr7hb?4~F+ueO{Wu?$Bj!vG&YKL$p|$6wV(7#SI-r>EoN z z1RMHm2c@vgL@G*3PRQ5nO*&)|xT!juGH&hHuU}e5n7tB;(#Gte8|XFaJqA4Tb9Uyz zrri7WtIn>XvXbSl$xE~+BR?rJi2PWC!ML?3U;ZjBWji;nME?H$Tg~WbNM1@x16Zh! zn`(Gz1wT4EvR!s{b$zS;(;Bw8umC@jPVo_>eq$F95@Pg^CU*10f#QaooE*VT!_%wl zm6a6`H}d4kXokpnuOIk4;5lsN>tyw^Z01lZh32tDp+4o`? z8}4S12oTi_>gtXEP>xV1)k45>;wq9h79?B%UGrInX#!%4PJ2eq}J+psYM8 zy6IJZejkGU0UZ+bCcmRXt|3;_zH|e}SpUQn%4K=1652Yz9ViZOcPZ_ym<~e9GC?i71; z_25P4JIzwVN@M7E*zlUL`kNIG)7t4BmiEnfk*fRLY*j=x3d?{o5&|6OW?CSJ7mg2E zjxI;I>7JiV?YJjZY^;;bc|1&Cyn{1zD$7l*ww)5!C4R#1csxRjywzQ z=R#dPtOJ)%2DC4X@Ljj=Kac92a1o!}6t#47xvzDf07rDhyOj<|?G!j|n-soSJW-*~ znL*&u)PUdxisuj7W^4gaS$g^79C|VgiE(`ohT9kT%Xp|0t!g*CT4#6sWEmXvnC7+P zIF*xi%O68QFI;Rayy$HmcqxxAu2@TqlGIr_kJ)#Sfu(`X=4(*%YRbJ-%~FC?+j`S4 z3&C=F6ai|fTjhV8C$;{pH-ju{%u!T2e|(hB=GzRjJ-hL=qv*b65awlAW&dzYq30LU zoa7@;q5KcIbY-PqUBrVBfT*sR!cRX~ajY%5Q)l>RoEUk5aZch`yd-!W^cZO#b?od8 ztfZOR?C#%UjaIjxjk}nga`T5u($zUg17Fk7;$poTJG=icpEbk9nDuU+?-9sS;1>yA zx5(z*!N9;M!c$;RPhOanaHFgP;^kj_nLX$+BNkQu^*>73|teZqux54^mw zPtf?3$<@_=C5_HqOAOIk{_w7}BJ)y1(9s+0{ob)%lsqj_)N54*DmuI-UMc#77((8#&Y3i((6*w)YrxN)E?ahE?O3J7xT zs%CZvmOWaAb$XrpQMfvFay$j?wr{m&Epw4&X*#kDi6ukd>Q(e4t6*?2T^xpeq5c5f_7v&{lv3ZA{4nybfRYc+SkShZ68=zR~ui(?3A@QcP)9x z@}>-$@! zxMl9lfbU~e=i=LE_39-3=r4MgZc0;3JULu?wQR>(I`;%;!)r!#P(vT{xi|gBk(rl!tz$g9 zQdgJ?^^%$%Td(1h1K~1bRl2qXxBRiE%_rq6{M+B%Pqw>7!UYpn_iutB3aoeq04#C^ z8>YK2Rf?EE8hA#U7zJ~QjR?W}ZIANqfELr2w^!qDE`JV){(}V#`TpR?zfof?Iw2&1 z1shrKBpovTjWi)3t-m1U-#`*si2=naLFbFxOaX-Ah+rn6(?)^g|G}gBqEH+t&h1MD zSkDL=mY2|S{vU`+NUn%}$&ffOr+0BBccs;}B%eRdrH_WwP~Bu(LF$iT=hZ!NeMNAv zU4B&W%9__;7X3F1Alg_+ht;IJZuz8Nd;A6x4IUTV4u%h2yt(7wY>v*d2flLoOM56} zApHT+@S0c4TwiMKb|sv9^zJPrK5(o7aZfC}wLIZYC5q~`Z**#zTk~q2-tG$z>|hAU z(`JuXEk?K`46Gttj4R;{+qt?NGADEpQ16`}|AInO^6saXX0HwGmY7L#nZNRo2fmzr zX$*NuiASyy12)3IR@PU>V#34vnl^;!N*HzNeJ?Wk-fZb!4vl{n{;K!56p8?9oY9p- zj)$GSWx?+tz?nXL6>1%Ua7i1q6_qSEk8tOpr6YFxq(4+Q+UY#YT>Or*^RB1DQ;1 zFk@!Nhsn(umEAB*^pQwbyEGy!g4OO$t~L*Qvp(^c zLaW+o>GvZHPjMii8xH7Hr`bi@7X5EjkT=WR&Xh&5Ke!Q5mCF^vvA-vcF4lCWLe5hM zR)ze@iK572UIoNCiqaC`j52=JAdl<&lz=||@eL8i;(OZVlUB8;vopjVY8#1IvZ#8@ zk)M~x&rrAMH;3Max^E@iOFB1>Ds6a;rQDqC4f<$z{PfBnd&i3(t3Du+F%}+Jtv}09 zU?RqgJg!83uEJ!eaM8ItF9=U>;k#APJdB10>1cP3ZFpa-*$Pht5cyS6>4}YP97(^~ zl&!RYf8AjCi{CLoX; zxN+ShMbsU{*gM3h2Uwg_Y->fdc0{^6xcl38bS~|2I%%!j%FRMY#pq<&#IS6hR2!!c zM>Yyc!#sUEtUM3#Z#xOXTXJ zaSrt_L+;cs{lV=E&+0Rz?_=)o>&ZJb(sUi2(XBnJ@BX0Axy(4+yV6}cBal9<&xx+x zOn3B34TX0AnFQGM4DqTj@S}Rkbq*iWN56E){Xq~Uom&G3EB8u11%*^h5z74*C&Q&} z__?@;qIr@Gsyt9m%yhhNpa$I+diJ?MnwlWAWANxqS&!CsUtwN@q!8SUr)EG(sI`9Q zl_4ZX86yoJ7Ne%JwCQ7-TQ*f&ko$z3g|w;Lra6_DG$vXv5}bz}q^v>5h>Ha(fW8`v zkViKqq9~ooyAQ@m0dGl}nN%=X4OqEUBz}?_F<}|~!e{-EKA)ImSn=uvlh-C3n~D+= z6h?=7krl9k2te)HckD@-9*xP0crPLXHp0fFHe^{W#)psju_Czgf0eo>&24fn+eJpG zdlj7zBr-M~;*`|gbDRIrql^n`C$C>TKs@MNRRG2c8QUJyBd}6h^RAd97=}k^pW{?8 z+{=K9FHqk()*iiz-wxQGst(h{gKsmju|Z^Q_ zv(3)+BiV@&ufBYk1mnTKONN{`MG{DAg+6BnO>$4mtjAFaP)>!mJAU163$NIFkTHJf zp{V5D^P0)0C=lFT1D+i6t%@!fCe>p}8zfzsc-t9lNQg$#K|N_4B2pL~uXvvK#aQj1iNt01e%W!dRMzM) z-oS8ZZAv|dZCU!eAmsWupk&(DrFa2iKpYERIL<#JGI}J^cF*$8;pjzxj#+unn`$KGO3h5 zfwN=&kVCYS!}{7HJI8aRSZuN_4O`ro-V=9qAH&jB#84Cb`qM>O`GH64qX{s38+*>n ziRkspFX{NtIFbj^YeScx<@(jHHxdz`+hUM? z!K5a`$s?kzZYDX~qTsnr7CShmSWWZm83!?5>Oc&@R7G_3xi!;tI3M@dqAVgD`JfZ+ zu_pnvx|0D!Fn>S489avK*g>`oOB%ZPkbJoiO)_WMkRW&CBj(o)VQ zFJEWaO=wcYy-|`k@9n8Ys29=eo-u0`ql3+m&NE0j-`&0IDI@uy>|Rzqd8EC8K`MrM zY|+z^21)@Z%RA|#@nWwcnfZ3^PskeRlnfq>2XY*W8F&-HVqUbnuPC1&1w*dReF5-= zll_(655nO;rz-Pk1=U>hL^DM zP8PV6!ZSgz**V(Tsoc!1-cp%wnh_CVCl`FWT)dQy6~9H6Za4OG!+oifB9`o`!M$kK zoo`9EziwaD#uoRx!RG2f;#29z3J)|wU7Pm?i;x0qK03Tx1{A^OnxuUDWR4b`;xu&< zeUeo@eb+H81xWc5Gmi*?v7%GKx2y5XXS2d%)K&rG#ZWO`6_vMDdK^0i zv$=j7WAtU!&s72QZ_T_2%+%hG@Y)adSpnVadCs3eW|WcWPcQ`gZdnS4o*{MM#gH;1 zi@_!|`t!tMN6>VBMzm+x<*8?Sv|<%$DIrA0i2!Xmud>`}lHzEZx;mzf`FpPZ+(7D{ zEU!7EpYAl>@)|aSJr_u8O+h8F;=w}_tA?s)y$i!$L#)wqr;cqR?B;j~!~Tpxegi`D zeY#w78b8vPpZID#W}?^Y>tn1tiQ#_JKLq$w3*RXtB>`g*sEK1`n(A;X#R3H}>Zt3> zAhY{fsMK(sI?2 zw>x$Sz=f{JegDLr~ zJLiqDWBHEygk<#Nb7`2~evD=T6zXUSi^yVLYAR3`nLA-vZRtm+hJYg2aAbl)=?lH| z={8_eUy~(6>g-x^(YF4H}D$c)PniGK|n;|8> z9&P#^LxzSx4-bk49Q%6b&8N6AAfC{Dfq_igi9;5a6-^?29R(27M)Jq1<;b>#s#x3H ztA;~GZ~f5&_#46UDsAfd8{o%agU%G8%qRI&T$<{X*B-(9X`88J#eLu~q1AV8!*s zEvUW7~$KTRZI zcnA;Px2b!_#0Zl9jvVH2_Zaq075_@h{*;7fY|LKeiSg_!>2EWwaT+c~LU+Av?&X|U zBv2}T7M3%d@JNMQ%^wTFfJUUVX1_Bk#u}BD~S*V z?JBrhOx=u?-e+L}PJdJm$Vnyz77CRQG}XkYXrV9oO@n`wsT-yuxe6-BS5=u)PEA3O zk%IeM0lg#fGqz%!)gaV95>(MeiY8;Gt*yGamRpH#E5v`-lGko%%I2@4aclc8N#p_; z>~Ba|1MW8ZuTu4v;OL;er8>~K{oe#fEzWQE;C5|2=-K^x{`a)9fD$o!YXsq zzyMRdzv-ZVGfywx{zU-&n-Q}5-;C7j)UhMkgy%~r*SS!Pj}B;FX(@44a{MuD#p?MR z)`f=~!RXO3#DYdYwILx22HOqAu$W#jVuO3svhHq%;ka$HqQ`|_rFKgw|0%)$RN2d6 z|3&Tm|2w~XTkj`8U3C{SmQ>w}qVliD!NF(tZE;Cf>-rgMT zIck1YKTv<9-<%`zblFwEC9TJ6W@k}zx@9^$6=e?BAMQGF+TTC%+8hrZZRpJzh$k#b z+^j2(Jk@vrx=>{$EzD}Fn3d`CnyXo%rTX+DSi8-`JZ)b$F3_tCf>=5i6-U0P{-`E< z@0GPB>(i}HO+;TwdILK_6++_eJvO$q=hI{L^C`YV_=H1Nck9-LPmBF1YWHfB>+!8| zYrB5?l=BZ!)pDg}ko;b7BlP!=41SXNib_C&yKwCJ1>;rC_>zzF3!d$P58opax_3OUxud!79GzUr5i_+Iyz*E&iRltq(dVU0aM zoE%KHGGq=t+wmBc49o@XUa8)jsHn*ksb9_q=7!*XbbTV6c{DfR5yY|I7^_pk4!XDx zzuh;My1Zq1@O1S~%9qMA3D}(%aR-tZ@UMkjmzER_T7EpZ7<_!7=98NT)>=a>vd1Y1=yI6E#4 z(gWq^@fA7kI59q^+K3a(lW^+B*p}{^E%{A4;53z1Oq>2`hq^cB_2@VMs+%^gI1h%+ zYXc_?ywg9b!){eGtzB!#LRz${ydRa)ismL&If4cVHWe%pZ%E>|geE?bw{!A>s>9!f zY?w}86A8^9(73VZif&O?W&3O72*c0|0JLN$Y>jw2D6YKQHa!3EypEjVwTwK=+%MDB z=cKSJv|D17E7X4@; z>QL!^A-1Quhu1k%@H_iUW3h!48IgrE<_oJSml=5;HDzDgmJ|`o1~+L~&w_}zGIb2i z)D7deL=7_jFJxlF#jN{5T{w^bV~Y~0n!KZSEWf0q^8A&?Lab_{!6Gbf#Bjyar!urN zzZ8PXeqXR1>cP1RS(qdeWE!>L`~u`}y%}>xM)1uKgcp{%BhBf=Wox3Ydm}`(fg!w4}*3;u_i3JQob6nwe0#lopPNz#L zJWYBER}a_!p^OX(#|Un_e&J645m5j1|7`xFv$y=G*+QY+(Fw@ehj{HY3clIiy0{nhb+stoxRf8P)YeK01IX@iG mU2>=V?|%yXH-UeO{khcwd!&6e0{veEfQE{$a*dMB%l`rI)8%9U literal 0 HcmV?d00001 diff --git a/source/images/blueprints/selector-boolean.png b/source/images/blueprints/selector-boolean.png new file mode 100644 index 0000000000000000000000000000000000000000..55dae046c971a09ba20220f7291a0e288ce422c2 GIT binary patch literal 3148 zcmZu!c{r3^8-K=<5Q+$|rA3r|o0K(s8pdb_H7HBgv5dTocs0nB${=OSlGGU6B$;6( zTiKVW852g9gcxa5hzZ~L`rhw*|M;HkzMkv8&iS4DoacUi*M0xaEf~~RL`YT$000rY zGgjvSfG3UXBX{#~-!6q}xd5<7!p_PZ5e-^=5Ax&F*&jbOz8x&Td+(KaLjSdah4O1SNI1Yn%!o7iE=S5&3nKx(^tP zb^Xs4S^y9v0+fPxtcU@`BYC+71jX_HzZ1Y%9MHd~MRpcdnl&~vfFjyJ_Gb26@5b^Q z?po+q&Q`Q>)5s~|qLYQ{qS*}(v)VrV?+H&otBE~Nj8SX|9HP#?s=6ux3DOK>QCXgHRb(A!z%A>($CKenvZcGHg;UC*(db79F z%bY7*LdK{%22HVRZQimz7miE;Ytv?p>SiOk2SutVYbeX>DKoI+6Ew zG=>NQfo_V*ze2b;KbZJ6*?Qgap{b63SXfvn{k^M?I=p00Rw+C*_}vphzX}?g&886@ zB{n){jRWPSq@vi9<`@j7aY9Z}aiC2%sjbZlTy1a4J5e9u@9A0eR(hRp9d?Y^z|G9; zuPE*>F3#JxtppTmk%m&isgWL9Mu8@DgHw8X@cQ?-JB)xYqm(bqx=t#cPTyEzS?&`u z!*1E{j`_)+ipEDS&_^0$4RG`G^DWnV^!)mybuXV8dG1?3T5Nr%K4R`f$S65>ZK=Ff z!6XK4_~+-rw~uY%ST4Yiyi1!rR(V11aQ9G!D={$=ZV);){LIS|9Nxw&3l5@}J69Zs zmw2{30HYA{?(8cwJzmbu*EZR`Rqpl0L`o*KE_mcssZL7la+-s(1n!R$!Jc_VKAouu zKlM1yD!3*+=qJPe&P)k7N9BZR;5((I!%*m+i4?{d4n(#;;L#A}Tp{<_t-^)$roc$A z&b|HGAVgjnz42qdQYodQ%Ob(BQZfhY>iRx^0?H*LdHSkp=`3s8i%ln_iJzq^jo7jl z3cJ%&&3Z*kz)O=#1;Y}A{762w(O*B=J(+5;tBYl9UWFp+i+!r}3RkgwHDqi|O!>FF zM{E<18e3RnG^bKjk=JE3YATVGAaWTI9B1w>lxcA3#h>$Oie|_MhN`YD;wg5DTGwBu&EBExny<)Y(yIrb0;Eg*z`oES0N_lQ5zry=SKw9vRLz@fP(vIM2- zW>bI5PW!LXu^Ruh)eG8?gWHQEH4FPW{{0UK#K?evW27=P|FV>-k&#ivSTh!@?t}q- zfEF0$TED_~lm_4r6dvI+qq)pQU=D(!1QyhenME$YrZx}bf|{bkh2BVG!ya8f5{UPY zx=1W7Jr;Q@=Y&$Jd;N1$=i8b5AUBIvHJ8eG0oaANvh*?`qo~C}qXIH8ElCoDS6F26 zL?>|hJVc9G9IlQY*S5PAtQ#K`sA{(FuUDV~ZLh=_HId8}1*In4XG&zS;_$v=F2F-VyxvSy$oJ{K+g9d ziMYZg9O$K=OlvYO&JwIR%1Vh3-^kVYJbXtIi<8I0ttg8cj+?b+ul!Mdivk`WK8oqYX=|f)h8wRmn5f24eIKpDVTiZ?J%Fa z*jIEUs#P$K73h#9=XtR%RDKE*>i+z4_dONIWBz_;ba+?KKaXDamUa4r`IGjE84;}C zQG9x*r&ehnkq&jsy3ms$5N@K0W7@JdL2uCs&5fdObk$ZGCq;D7?m-$gvYM+4L&BdX z?d~1oZ?}6g`tqt?=GBGnC?v1sbLt_@^-pa#`vdT)ie}JRJ-kGiie=C3vdgjNzB#0I z8ns#4X8N)@Y6g~Gdh$pjPF)LlRLCWY?{=YPGFcBDs?^~rOv=PC36KLZe5DANr)J(4 zUiY4(@erq!ywmD6nqx*xJ1~ zG44j$T)%p6uJ0E?Kc*1@M!+%;Wf`$`9UJ}| zrLJ*o-dqZ{U5WmRPHKLF9o{e?u6*jgceTOAeD&ClF4~vuJh1Umar)@J8NG#3e>a%P z#;A%aDs@GR$YmoJ!4tfIq5vVMNSti6sLBo1HlDAm6%S|UI?^|d(B?KWDFc0)^sdXkE-(Y`MON`E*R14eu zcvo)1J-p>O&b^pts1N3G`fpG_uazt4s z2kkHu6)SxRXK^tO4PckwLk#tem9B_JVO)pacLIR((1)9dugGSR9ZCHURsD~hTEqlW W2i@<1WqrA~1i;Q3YW38@Gx1;c5c-+` literal 0 HcmV?d00001 diff --git a/source/images/blueprints/selector-device.png b/source/images/blueprints/selector-device.png new file mode 100644 index 0000000000000000000000000000000000000000..aa75176341bb4dc3e56b9bbab0cbd6e54e8dcc2f GIT binary patch literal 6121 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 literal 0 HcmV?d00001 diff --git a/source/images/blueprints/selector-entity.png b/source/images/blueprints/selector-entity.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc8bc55d5eab7d8cfc25cb833a42478a83e2f4b GIT binary patch literal 6287 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 literal 0 HcmV?d00001 diff --git a/source/images/blueprints/selector-number.png b/source/images/blueprints/selector-number.png new file mode 100644 index 0000000000000000000000000000000000000000..8d73e0087224ae7086010ff4a6cc6a06fb844c72 GIT binary patch literal 5155 zcmchbcQjnx*T)GF5~PVF3?X{-ZZL>8gb+kal!)HV3^IC)7K|=}ASP$l!N-oM_p_B!j{eb2dTpL@>^adL9f*Vl(cBENn6#?Q~MprGL3;1C!XC?FsZ85wD5 zY3c3lEhZ+$$H!-4Vlpu?k&}}H27}kv*S~)K%EQBh$Kw|k7TDR@K_F05Q`6ks91e%` z_xBeT7G7RnR#jE~^yw2XFKKTd3kweX6EGNr+xv>gwu#{P@Ae#T673G&VMto}OM*RJ6UlO(Ky#eE2XlG*ntzIy*bd!NIY) zxw*HuCnqOIAQ1BM^0KnBrl+T+q@>*4-BBpi`}glVJ3HULeXFjnzO}U_D=TYZVIeLq zo|KgI^5siTPEJKdMNdypd3kvq9UWa=T{APY*RNj(1Ox~P32}3Cx3{;4goN1I+Mb@C zqS0sx2?;0^3IqZT3=A9{9iKmc{^re_(9lpKktiY}Vq|3W`0-b!KKpP*CvU!-sGd?EtR_M?VVz>f`5d^3~s9@*hfMWR;VXEf%;!GKbrAG#6W+OkPX7 zen>bt$$++Y1Z`$X2HRnD^D7k&srp&gx638sSNCyO(!)~~+<%khG1!xmW#Hz2-u&&s z4Uz`S0}j+6h1UV-Z>xbOcfnlm9x^SDSx1*^(3D?}O+W=JvU!V|JR1#`w2%787z_HH zm+;d!`WAMFAcV2d)GgoNQarKqHYK9o0Urx@;C&`po10iy?CsU_tK%9O$HL{FG0>Vf zvU7q}_Syb$Oog+80vN+61}G(`9V&1VUz{~^`kPNTeI;UFqOKKUk^meJkrD%feWJ>1 z?o>nMf?WelQ?QxbHkF7oB}6$HrtP(APJ^-ah`u zb4xHAu!eu_`ZNXs?(l=I%Fqi~p9FaO?q-WX^lv2qL=QEivXjIhYzYZR3^Il4@V-Al zolG3&s*J1nZ|Voh3gS1jk6L22*{qa_H)}vi9HzRH_W8P;wtHD^Frt-FPBt*8Z6U!dZ5b`Tm`!RIgj#?c znP%HIg9Hu+LeGD49@%q@6z2&rKRTiV zk@_}dUKdA=nRdOrQJ;nk=wuyhj6Y?*{)|C(D4;sKTK^MrA~EazO;>&}`Z0zo>KbnR zx<@KH-uN13S)<708YNFsGI>Gg6A=3SU1LMT%Um2LLobyblHF(TXrM#L!v?>aum05{oDe$xq*`D1LQFmUh-Yw7R;wJc#eNLUnvJ zD$6#i;sI~*ECHL3wuzD^yY7x^jt<9= zJ#heMOK@`bENB$Enwy54Y^0KzuOMo8P^Hi*{@H`305~W-J$wH=SM--S{#iPhRzwj1 z^G9+QxN-O*q7i(7e4y8E3-=U^L270Wim`<~_^;H~=1Se}rJQ z{OGUGyw!tSJHhtm`a$vnRNZK|t7kBGmnlXHueq?{$Ki?YgycG?^h$Stijil zlVA2>>^#doJaxoh<%A~y0`38?k_@^?#@6u7w*=k`;{;#iCp+-nK#TfaNxq+UqEwJK z3NO6Qp$uJqI3xSqLz#mmpqz0-?Bl6aU7h~e`#HFMz~q~}{BF6;gu~Tp0bPU@k6D)C z?TZd~6vOQZ_J8~kVNagET9p5g#sot|Y8SlL!-s4y7q&9fb$DFKn=IFfwDd{ZyMJG= zHJrTCp3rWLiwQ}`3@Dv+@<4mVxVqj|MU*2Vn(+@`sa05wTSJBeb@aTMGNJ@g$sNXk3HcJY+h*PCX{h$A;>!ib z0-!6F5<1Q+aG2b9R&DYM;}KMmEZK>+?XOGjjotr7_nxb_LroS*zK)6$QtfvD;58q zu=s;-0O4Zh;8lS20ecc2(XP~fBNm{GZQ(*km%Nl(2&jiK_c$6N9<&|G&o5Ntf2kTT zd9kfryVpO~)0d35t0bTzouvM$V;iQP4Jx*4MWFbu2v`zxs&v) zZ5#!xbYG{GqU=A+99R&-+mrO#LbTi`+%XU%>$lYbMwfKMUBvTgaVkoVziP21+tu0~Wjs3{NzSkaX8MzD0Yr~m#UUW;hCu$#9#798Bc+b|DCRwZ6q;NOPU+m>m zOt5S&7w|=xA3Z<<-r4`4lT>9@W1fWf@a&G-6WM}L!~KUGD&wQ?Gc$va56A-(L^}6W z^V*Y<0cNFTjsv7lxGsVP9by~X(x+2_yUnfh z<6xsHd7-O1)2#Jxd+r|w=kF6~IJFn$L%)HcoGXsUr907|d$Yyi>+-$JgW^QtdrcyK z1L6tQ4y0RN#d2UMrM?LMc5A^d+yI2k&j>Q+0q8%& zV>{9suGQZBbl6xnb0J|h*T*UR_N#*MET zpi%v>3rNj?f|HS_Y`o1h3`3W<(d%(_-P)~;zj6F-;{C?TPE_d zAha@y-=j2lZGjhP=L%A|X(3B~d+5g`G*;hW2k<^im553F(9#d}Uo#O0V#zJ!9cWm? zv6rpm|npzEZys(ODc^J1d3tC>tSQcSPI9v+XX zsFEU6=&*7A1%NJ+;?bFO%jw!ipsp5+wt3UoM|^$~eO;RWE86Qq=moC-0|T@Nah`2v zDmI+1U$5z9}b7vdgQX(xb zsI>K=^xFF&#||uLff_^L4NRJnTs~8c@qwO zSspi&ia3)UzX{B}Ulet91rt^9L{b zs*!KNP?xF}h0-%S!ohxgVCP2|?aM2w#ZuM|5k8jdQytK;FAaub%EdgL?R5== zD|#aia6aA*xRT01yOy3~Pm39sCOm(-e|ekNUx)|t6S+aPiTOI_XsxeUs2_knpJV>g zb0Ox%C_dxCVcx%DWE74+&rJm;)tP(kXoy{`@IOM;)}D21_dsT|=c-{&0E3L=OS&^5 z00-EPvUr2l2zjw6iTKiA6uj`*m^rr(w=hu;`W|HXo}gPCzJIzBJF8PHB-PumxU1L+@0LK+vF+?RY9YfH7)jo=pSbLgGZjkD8@pp)$&B8Tt9Ja8ic&z4N! zWmQ7Vk32Ru*p#Vs_W8<#uDd5PI_b0nNTs0=QdTmX9lobznmPn&Ws@@V(8Ox)E`idGrvT+lXn;`Jl%k~8*jgZWh55&N5*p$(; zj?xZo7k;zP5<_M#_o&waa%~GlkVDfnGMi zzE^3~4Dk;PNm%TfvBXc@P=xp>X8ZL(e$Cq0PO`frIJD%(E2M3Hv&-r5`AZa!1LT6l zC#Gyq1aw+_nq8h)(3v+gxh}ow552MP@8#Ki7rN80(gdX0yBPEP$Vr{A0-7rkzb9nSSY{Oj(}njGVjW jTu_;s{q2pvo4Ipx=(Bc0SavkqEZi#rr6PJtjr3I!@yixewTv{<0HySoR6;*{cU!CebQiUbc7CpaOz z^#9*E@7;6HX7?s%W@qoreBW#~QbSFd5RVoQ000oaee?Pw0Dzu~>U-g!qgvB0**E}z zt@G{cS6UuuhYNwBib5oEGe?jnLQEWPW(;&C-SK7CO<5V3h|_AGEMR?k4+ucr`A|TB zA4Y(mKQ~|+1dxNE0Uogb-4}HK#?vPfFzUkVHT`=mfJ{l_yf>5CxCH3lcQP_!yt3j6 z;09bVIvyboTeAg-Y;4<&fr!oDxDxHhV8*9%p&UwywTV*O;mBDJ=AL?=B+ww)CS z6+{pQ5Y}c@oYQV8=4rme5F-`393w9}g-Pq&a}tfQXzz%I)%qO>k*2&{jVOJ)aY5Jz z1*~XMk}cJ+_%}>uli@X!lxhjwt#Ea$sUPkfm~Z|u>-9{plM8Md(KXq&e=4)z0kpcg zS3*zd80ndyh! zx|}x!Q4Re!`fuQop{i@|eQ&L-4Bd94YUlbaq|IpYOq9}#WA#;=x65jLOKx6~ZS@c8 zqRUgG_?1_c^ptq&i0yl|#MqotO!K()9H*-Whz^B}t+jw9QQXam-xR_*9K8>Th;O$uNdamN1@l zeYQ2k^Qr1$yq7N#GCp=}=SD8+on?UIF`n(`hU5rb4PivjOZ%F;0n#5{CeHuRlMXx( zEUK5v0#BzxD5CQ9#CE0piH+R5?G=q3B}Tgv#&Pt}_3F$eyss+znWVigZqBx>`DRO0 z6^7&Jfc&hiK{o=%U3P07p1mQs-}|Xqyl+lTIZlVk=;(OP78$L^!9u=wE^z-&#|?SB z3~BEx#4UXFW7cpI`}@pgZq1U2D<#Etx1*%t_v!pcYn@qu^Xu+FjOAt!lf<{}Ci~@= z2J&B6Gv0|PDk>|VEY@P2b)r@U45p6kXY6v>|An%)@bio%X(c`-uej^qxy4$uR(4@t z-WW^fkA(hgC08fVsjWhmSF-)O-G?Q^J6*o_4vRH`0cf$$KK4GV-&QPf9y7lFx$Wv* zTl=jCVqx|$=+XcO;vV9U1RcyKIsJ;F;IR%a*UE&AK(CKi4VoQtd|0euixk$+REv9d z4KiO?5kbjhC$c4Gk)}7-mIKkTj56L?o1=EO-@FFwHEYIBYo%u0^SHhD}an0Z($J zy(2n2;g*5uSR^SJPl(3zWFa*iUc{}t6ItOGl^O*>Tjf%&e_t2p7V$jC$^KLISt{}w zD4d9)=-0*mY%=3pJYd8jo3Q<#hEDJ65~IJHI@T>H(Q{*LDJXAI%@X^5`)b7Z?t;av z_RD}dW`G-5*kY7c)W*bm$L;T2`AecrYSYZ;+RryYmDLlOqHI)HlbNE?)c7V0EGI*< z%ppf{EP95X3`wgjo2#BnYz#;-R9xtao!w-08lo2R?sNkq4^ziC3|%CZxLaf@8KN41 zS*}^?@T+L#yJB>O&d<>yW~}*YW5~zicRpo{Fi+O8q5vo;P5PIGKzafyk;va>rA!)> z;%6m8UYHLDIF4tE@;n9*u^b3~Giq@R?C+1@Rj7$d`1!fLX*)=jMG<}a8Ew+*`AWUy z7*=z|`d3bGQ9-1o_0$vt^SiY~Zq2Ft)?n;JzYWTh+3Oru+myz>&Xpxv|E;Nx&^jy& z`AUE$Vlo5MfDH4iV?Mx>YcsOG4znso;rLTM*LqWiV^2&N6M&`rYIXal#4+hXxVo?I z`59644>o}*Hhw!wq*}u*sH(H)^6RU<^F%;{)u0U}(#?lOYiKyW8x^u;iC&>t_K2g$ zEUeniUP?T~PYo`AdiAMB~k2|NEcwz zdV+;MC(yvoDh*>u+~@j;Nsv%9YyrJp){2V$*54orWf-T0?k}#XKVjF9F5qSQxK5UH!x=IU zc0sJZP#kGp8NP^&7{qgIAER0(gzA{nPb&>B&_plPuVabi!dR2bG^_0NZhH4;8sur^s1+JFMhujaw(tX8Mc#>TNM!Wo4oIqh&obdP~2EEyD z+^%OAWz$is`Gc;buRg$7anRg{FG12ckqJQvHY_E{oDe5NT2^M9UYZeTpsbQ7&Ae}} z`O|*qf7iPry&HZ;-u~lm7;1OC0X5Q6+9oA=U-*f6SkC7_Uhc83%y=>;>c(yTXt^2U zgXx}Ov=DGsboKqvBwa+xKbbkev-1Rce%!{y;ldOHtMeb5H9<7oU_V;}B`~PttGpsO zcYLjWgXHVbTZOQ56=?WG#nqnV+0f6gG{@m1-NdUE*_MMD!XUwDC_XZGB2?>ioJR|% z_^z7r{!0Dfz8k&C=66LbwGjHX>!FB;G6&)ZPS1lT1)eknvtqYbUyXn>#bZsFlpl9| zfb3L58WQr>I)ga|c!5Yt9}00gQciICR@QnL9>0Ifz6S+QJ5}}H<#fZ}d#v{O`bEkY zL?Fsw;ddC)vKK$E;R<=)>|1)aN_uI&%ag>~d$$F6p~h9%bl*mU?L0 zM_W8Z{=TCJ@{aWL;{!jXACifi$zdZ;Yj3g@)_(Q%j6(53`JcfblPt_w@CMGPX3{Lo zoa{on1mtGdB3sJdlAc}F`7Y^3z?}mUG5`a94gY zhwp-6eok$2ZI^55u!bY6VVEM}6Fu^-A+(fy$yAke?Ek*7KyfjH0vu9B!}-wrZ!9a1 zW$&v)RD#5#?`kKdkT%U0k}uyi>0Iu6m83r;#hsVFSSkv2UHk49PK%<=QByOui)t+2 zV*b8c_Q$_|1aA*&5!u&ER~*(*I=&wAv7n=jpf7Cub#>CpY{$_ml&Y|77jNUHtBGO< zPw`Neq5n(z|9ZDstF}Aa?ab)PZ1+hqoi`w;8s-z!^8yqmI2+mB<$WmAD1hFMXDg50 zHeQK*d**#-yn$kXXdtrElhroYF$VSP$z17nugkw9$(#bZHO!@JqZz(VEbr5JT|hpz z{&yGLu=_tB|EtU!zB_?J-nfhIWKMOY91?kRRwxqhye_etQ<%J+2Dc^ed)7^Jb9`gk z7v|LekjSRYe6!l_4x7kwzu22WgPoxGSEK#%{Cn2_&am`t@}MvEeWs{w43XE_=0Hu2 zpfefMMyoR{EIj-@L3mXmJ;dwM28FgSEXT#2cL@@=QF$A=*6IB<>Dh9l?E;FB2&SrM zi4hVhIlIDviVQM7V0m83OE_$*52^)Q(qDXPcDX-WDxo~DeC6wiv1&U!=fQXu;02Ftra{?$U|c$Ey{#BM4i2UW-? z6oj)Vgr)H6C1HdAPRB<-z7E6f=FGN0xG z_vaVPbv;pR=cF0j+{Cmre18Kn4aGkVUs2rp-Tj8$UN-q5?yQ~P-PIA@gL)QsxCqS) z%YGMut1#3HKF108Vi8h=^2R7g93*4H{vgnHp^B7P{VAXR)8CHM`LDDqv`E>BJ86v4 zW9XA}Us$Q(DBXDXg%OfLi{6rp@9&JI_g*6|)_X8mv=+yx%S_q0Q84J*(?S+Gn8&ME zhgvr8os)L=6Jdu0jOD`b->IcnTAUOrY-hfQj$k!93wMMFdExsTcll)K_a^}KEGM%) zFaQ3gyqB;VSSb4td~CB+$8OWGclXb*p;Ul3fLNXix95d$zBj{_^W5=DtFv=m=lG~u zC#TYlls^&yf_AZ2{>Ppah-QgOYcIx)`iQ!2FN!)Q@PC$6=d^i)AN=C)A*$3UVDiwv zq0>*oB>4!(1VtI3~racrE61^GQJn6F;PGjP+|dCpML6#y8hJ) zBO>6X|1IrvGflt-xboisQ8Va^ihf6%CByf}s9fPx%O(+R^Elg_v;Eq7>TZZ@%~#RH zeT#y{mnp#z8iE4PED=;#DKk(Z9adU|(EbHe*~1F1E~Qtn**L*L@%waUG3xZlZB&J$ z5LFWw3=tCcJ_mX=WkJx``&z;vii-ROO?KYIf)q!okeOE*X@fN{Q8fdKWxa~6sV;2u zy}uGt+Tf-~5NeX0Rwg<{21EFeE-yK18Vqlwsxar)DztgpA8Bc%rR>kQN2qU8A@={$ z(GEyuM|U!sf`=m+nvbe|!@hy(C?A%Ik%OQWa2%ok3xUb)hR#L@WLW)%Nj%Fo8=t26=>PO&DqAVk`x0X zb~6sop>FP{0o8Bgf7=#ZNc_*TSG!g?IYsYMqgowHzM67pJj)d{MgJ?V{nG2=&C0Z( z>ir~?x@_QG3vdhKgMql`gTGcC55tu9K8s$N7pYpb-(1wfr@_KtDdHl{8;+HcNsKLia zg^c4tYn-hex0(%9c`GQL-RQ^N1u|gN0i1Fnc+T1-ykJGzp43@Ozk`8j#Nq=Pv#`5|G8~_ zfMd;^dfO>fA=TZkog?lV5fUuT2)Jk}-sy#=VO}u8aa?e?Ri7!a`^yrE zD=7i`x&CeTgq}Ccb~F5m7aa=IC}1CJvOqlRpb+S8Ct%~nE$XR}LAn!AS;zF%8j^{# z#)h}vmp+=oDjQeBg1GLSs~#xISAG!sz5-`RaQBVhfHU+gNyaB|Woq~Ym#+_98MjpG z7h;MI&ho&N5L;q~>8*MDLyy4zr)w9D|7F-WfH2^l^Mk$VP(eD)EHkEm;w_GVXn2JdV z)*;LNFDJqzkKFbJK?2F=}+D};{Bte{8U5JqeIR!T*qSt59q16 z)`d6pv?>RJ%ObU~OF+3Fxbdf>PO%M7rMpprYX9O|4QGSUwj(DNSSfnoCbm{X`Erlq zK{Y}t%ekV>?!4q=H=DMK!#W@JsY68JqC)IXE>9^tJ8Lu*>V0mpS`hpLm$vNXhVz5`(x1VRGKDCq8poyOJrsUV%nQ?rJabsVIl zApZUl2OsJ<%qP=s?gkq_Ix(qS_URSnk6uXGzH%Dhv~m)Cv0N7_y?4sJ&@$e}$BBI9 zw>36=z!MWKf7_$|LE(ABmp}F|#daA@)Km1IcGfgMBH%eSQ%8Rz-<)rW@-UBfHn5vr zR!TouFSlArO-s1B7uGjlo_S|Y%fij28a74GT+MDL#F}b*;Qj$nPRfekI|J(c^Kvg# zxzp}OwZHn+KqSRl{Oc}^CqX`uIy5hhr6ICp$>WTM6-zF>{yxc(%K33Q2ZxR|0XL_|cbT)HXwClfi43O>yHP@k`VvZ>%5!EKH96cED8rNLWSPa=$RZW^F@8=s z$ns)>d~0r^+Bs|?loBX*EIzh=z0%1atYWfk zG%oN({F$)3ivqj~zD?>z?D#PA_8?fU4hwP;Dyl7IYxTU|&*oAxn+<;EK)A8e*kZ0cO*Xv81d1KFs zjD67LY?j-|1wkeV(i}fa(4u@@|M-Z&t3IX*3#d?St(;%Q_!22X4NLj-tNu- z>Ue-w6jb@dE`YuCd0;Ka^bb%)WMY+HQxCnmt{4*&RXSzQd+MIuq7FxDgP~EEn7J>% zf+?>rnOZxMFJ|J^Wfp~-$|u-{dwTl5``0p#rzMaM7!n+3SBNyuz~KB;Y0yVlti9cq zc1M_vXiIMj;7x=>Pk_alfwr29g1XpTHr1Ch7Aa_^5)4R*X)$6FLsJ#UhB)SmI&GR2 zP`}zRaz63ErFYou=NXAWc)3y{bP^DU%g*HH0b$=Uv+XvW&8|=3#rvSCxD)E<%nrcb zn>T~-ThqdhE-(BJ{P{07ZQP#4l=3e4*u3dbxv!I_e_9671eYZ^7?h%*m&RkzzeTR<>Qm^`N(#}EkDKP$3jd}M z4XukxI*nuzANni#E;d-v#ZTaHKRJym+)71|K5bp$CdW8AWY1mRf%-ZV@A)t1cJIj9 zm?3dW!_j;hMoE63@|Pg-vu4mBVt!^$QvzrkM1e$G_lV(jsx7BbNU5#=F} zTgH^KoZsPePIiK+b>!Dn2<(`|D9TSCOMm@-9Z?)T%pJH%;MYg`B!D!7ll6dE^_V*K z%LY|kohUYh^h0UV%DPAhpgpRVV)tXOj>6t1j3gLZFV!CV(}i2=74J=KzL$e5>n1EF z`(kYjpLH{j^>^%?_)Nyovd%c@<{`?aj^aqKsmk)g-E<3vf)@kG74p{C)~dZct~WWj z6UPBI)b^?9=Ho3$H(`Tc^`b=mwV>hWSJ`vA~Vq9%0KOck3Z z-Nmu7neWJq^Js#F*!$7C+6CvUo#1paDKpawzBG4w81FOFh%OMozhe!RIW)JRkkQ0u zrC|mvTgO>kh_CRwfbE(0)i_P<@vAKDXkT4F7xjHOn_LI3^>T2zZQi9j?$qK2WUcw% z&A^25_SW~OTT7{#V=ir15Q9#_+I(1Zg^4kZk&TS0kArM2yH0v6F|8c)ZQ@bbcEMd1 zKQqd7wgx~z|MsvzR%}Q#-K@O0(VUI0@jEqwVn-k25Wk=u;PT>NE)zK>q@ZnFPH}&V zaL$6Qleg=o=(}p!AwK@QzrqGj&i9-@1ecU@6c#_rAU%G@cX!tKlaIh}i=E!x-r{Z1 z@&`w?7@T#C4R9*$-vEXHl5D1}V5kQ2M(K6OD?QAr#E=p=or|)|DrYBHhDv)UBFzjh z?mIV4Cb?g{v9B#1ZMat3_uNQV6OnEeY_@O5Ss$W^f}v#+;l@OdM(n* zIy&@=jiK3FLg;5j&0M@cY-sUv(rXdYvV-R+%p>1>;PZ(}0iVe-Cc0JV$EK6KP>#uQ z2xKFQH*7fuZ78o_ET%4uW%f$v(klkv7-JGix+i&GoZGUrK|}y_tll;OXg(5 zklqDlgt?M^5g|YuXxUS7-N`j*?|*b49?E-vc=|-Htv-}jo?`WDE zklu49i)9S_58a`Yr}C@KGw${CixlJ$0{Wy}i#qx@xj*4i8j%dpJd-eyD)g%^2SoMI#yI5NiWvcjBXpasEGO({)==o zE8*8M4o5g2)d9lteWuuQ9jDI&9~IBT+w`V!&^kOB=aFV@>SxQ$EETDrf=B6RxKdsh z5vd=0$7~+Wxwiqh7YKc$eoMu1a`kj=@lCV6pXvFr`UVy7mwlFTUdIkld~&xtbIb04 zxKd)$Z7NXomJs`l>AIIm%(IAnz-{mt$((CD0W1An*}zJ;AG7-KYNhkkW&PT$8G&70 z@9U9lH&*oxNr8;tM6m1>m8GPiYwj8{PetumOmFMB#lYiFeoUZCv6r5vHI0tqJ zr-jRtn=Q$$ZB(Dlf!}F@Dva)WGZ99_fNdav8FdKemJo2>UZIBCJ0JzfeQB;Zo;VR2 z+;9X7pab3<#tET@TW7l3w|ts6HUMx3d5d=H=@IO@5r@f4>vy{aAfSTQOr*Cx5$aEf z61RZyPu?&HkbpXDgTVf$12vHI!vLJq{Xd01Pf8EWq66LgyiwxChWF0!ULW`mF5)7%$gf<)MQ{-p&tu=-Fkst{ zvtN8xWWj)p_4JE()DVcfUtC#3AXmS5)fl*3#6@rs7r{kb1Q&4;T*O6i5f{NlTm%#6@rs7r{kboQ5^qUKFe%3sTC)+ZEW3V^W!z6+O}=mwh`N2 z#M;T6JKssC^UQ2*?5jG1hVS^x#NV>ZLnU_~6AK`2!`>I=@MOcrr}FT$=WF51@dKD6e8+dk9)Ck%t?naTpyETWo0suu0qe1GVS{hTEG2JU$3G z53WlAT)XUtSKdR?hV%8nnecWG63Frg# z4Hz|^BE%LsOWZ-iE(05>%*HJLTCY1q@PO%oHS>3no?`@}IX4jC&x_sZz zf9s|JeSJfw!Q&&fC_A*Pylg3LK)f+5?RIxM0j0k>K@c1z4>!F#W3DELwRl6j83}Z( zwFRme)A24XYQqF^s0m#g-H*fR>A>+et|~eNj5XPiMVaXP8*t2rV=b=rMQJV!twW}%7~x@nWfF%6^ZLW|NI83`b#inYj@ z_W=l8#vaWl;%O1qo&fl4?wr8^rBzKKXtG`&YSXCSxN*85UTE>bF^Xv&1)T+o7}MYD z^F^S>w<`xcX=z=tfJ(%=7PGp18e4?#Zq{Pw?*A5Cb8At)+eRbVEzciKR`jwP>S907gvvG%b2sOxBzS8d_Sx)OG(GD(5K~NT$p3P;s?xZ?#%`(@mkp`*qE` zQY^><8Pe17o-I!A*I_mA-^oBC+1y&pp)A(o_z7TM(IW4?4$oW(X4n5aMmi<5D9v$U z0L~S$7U8`LsP#JVaa;7X$jyy|sCT!ksejWYp#H|@kWK}vtKb5LXJw5DY>pw%EJG{%a^$i>LMb>$9x(SG0&J!8aRj z{LBNWZ2AABx|`mMrBgzS(md&N+O^kU$I|{BW{2E#PHkK4Y4Ia}Psg+YqC5*x^X&lg zeFn{|QC|g8x)b$Cm5177t=Q0jCY7wk7~1mTS|mna(_tF$Lx0XT&S08Lmy|7zZEtLK zO>7Yxo0?j#!>d}X{=;Ajz6mC8tXbb@2`8OmElO8cnvH=sffRqetv1|X>=Oe|iyxT_ zlB&X2T?NX@$sedaAnF<@@#O(|G3KkY1a-c7z%~s{EuuxxB3cA3qD9amS_Cbk#n=f=cGMQf%qB2LZE?li*#P#8Ra?B) qh<5{sv98);KhPpt1TCUP_~rxHg*7jo^|7%40000