Why is IItemRendererInitializer separate from IItemRendererClassFactory?
> On Feb 21, 2020, at 12:03 AM, Alex Harui <aha...@adobe.com.invalid> wrote: > > I pushed changes that I think has everything working in Jewel by using the > same "has" pattern that is used in other component sets. > > The Lists in the ToDo examples use a regular ItemRendererClassFactory instead > of SelectableItemRendererClassFactory that is now used in most other places > (List/DataGrid/Table) > > The recommended pattern for disabling selection in a list is whether you > choose a ClassFactory that attaches a Selection Bead to each renderer. There > was an exception to that rule in one of the Table examples because it wanted > only certain renderers to not have selection. I added a bead that turns off > the selection for that case. IMO, how to deal with such an exception will be > based more on what percentage of the renderers need selection. If most do, > then add a Selection Bead to all renderers but disable selection where you > don't want it. If most do not want selection, then add the bead where you > need it. > > Thanks, > -Alex > > On 2/20/20, 11:28 AM, "Carlos Rovira" <carlosrov...@apache.org > <mailto:carlosrov...@apache.org>> wrote: > > yes, Jewel has the "structure" and is organized in SASS files, then > JewelTheme has the "styling" part and is as well SASS. > so Jewel should not need to change, and people should only need to change > JewelTheme or create a new theme one using it as a template. > > I'll add examples to ant tomorrow > > thanks > > > El jue., 20 feb. 2020 a las 20:17, Alex Harui (<aha...@adobe.com.invalid>) > escribió: > >> >> >> On 2/20/20, 11:04 AM, "Carlos Rovira" <carlosrov...@apache.org> wrote: >> >> forgot to say. Can you add missing examples to ANT? don't know where >> to do >> that >> and checking Jewel don't see the use of >> SelectableItemRendererClassFactory. >> all times ItemRendererClassFactory is used >> >> I could fix the Ant side, but I don't have time. It think all you need to >> do is add it to the examples/build.xml >> >> I didn't use SelectableItemRendererClassFactory in Jewel because I wasn't >> sure if the selection was supposed to be changeable at runtime. I think >> you've confirmed that it isn't so we can change to use >> SelectableItemRendererClassFactory >> >> I knew the themes were generated by SASS, but I didn't realize the Jewel >> one was as well. >> >> -Alex >> >> El jue., 20 feb. 2020 a las 20:00, Carlos Rovira (< >> carlosrov...@apache.org>) >> escribió: >> >>> Hi Alex, >>> >>> remember that Jewel uses SASS to create the CSS. I already pushed a >> commit >>> with ["warning"]. It's not the first time I warn about it ;) >>> You must to change SASS file. The css is just generated (like other >>> generations in compiler), and is committed since no body added SASS >> to ANT. >>> Maven has a sass plugin to compile SASS. >>> >>> I saw you response and commented there >>> >>> Thanks >>> >>> Carlos >>> >>> >>> El jue., 20 feb. 2020 a las 19:55, Alex Harui >> (<aha...@adobe.com.invalid>) >>> escribió: >>> >>>> I replied on this topic on your commit email. >>>> >>>> So I don't have to copy that into this thread, read what I said in >> that >>>> email and reply on that thread and let's figure out the right thing >> to do. >>>> I am having some weird problem with my Maven build where every time >> I try >>>> to change Jewel's defaults.css something overwrites it. I'm trying >> to >>>> figure out what is going on there. >>>> >>>> -Alex >>>> >>>> On 2/20/20, 10:47 AM, "Carlos Rovira" <carlosrov...@apache.org> >> wrote: >>>> >>>> Hi Alex, >>>> >>>> I found that TodoMVC examples was not working, so I fixed it >> removing >>>> the >>>> non existing properties (hoverable and selectable). >>>> But I found Jewel ListItemRenderer has all baked, so I created a >>>> SimpleListItemRenderer (in Jewel Simple in the normal prefix >> for a >>>> "base", >>>> "basic" or "simple" option) that hast the minimum required. >>>> >>>> So at least in Jewel if people wants hoverable and selectable >>>> renderers use >>>> the normal ListItemRenderer. >>>> If don't want that indicators, use SimpleListItemRenderer. If >> you >>>> want just >>>> show hover, but not selected state, then extend Simple version >> and >>>> add " >>>> ClassSelectorListRuntimeSelectableItemRendererBead" and >> configure to >>>> have >>>> just "hoverable" to true ¿ok? >>>> >>>> Hope I understand ok how it works. Let me know if something is >> not as >>>> expected. >>>> >>>> Thanks >>>> >>>> Carlos >>>> >>>> >>>> >>>> El jue., 20 feb. 2020 a las 18:06, Alex Harui >>>> (<aha...@adobe.com.invalid>) >>>> escribió: >>>> >>>>> I'm not sure I understand what you mean by "control". >>>>> >>>>> Before the "has" changes, every ItemRenderer contained or >> inherited >>>> code >>>>> that had hovered/selected APIs that drew visuals, and the >>>> ItemRenderer also >>>>> "had" a bead like ItemRendererMouseController that set the >> hovered >>>> property >>>>> on that item renderer, and the List's controller would set the >>>> selected >>>>> property. >>>>> >>>>> Now, every ItemRenderer "has" a bead that has the >> hovered/selected >>>>> properties, and the ItemRendererMouseController and the >> Lists's >>>> controllers >>>>> get that bead instead of talking to the ItemRenderer >> directly. I >>>> guess >>>>> that's the new way of thinking for has/composition vs >>>> is/inheritance: a >>>>> component doesn't have to have all of its APIs glued to its >> API >>>> surface. >>>>> We mainly do that for convenience in MXML, but for more >> internal >>>> stuff like >>>>> this, loose-coupling via has/composition shared more code and >>>> increases >>>>> configurability, but does add some runtime overhead in its >> raw form. >>>>> Hopefully we can optimize that away. >>>>> >>>>> HTH, >>>>> -Alex >>>>> >>>>> On 2/20/20, 5:01 AM, "Piotr Zarzycki" < >> piotrzarzyck...@gmail.com> >>>> wrote: >>>>> >>>>> Hi Alex, >>>>> >>>>> Could you provide an example how would I control >>>> hovering/selecting in >>>>> item >>>>> renderer when I don't have build in hover property etc. ? >> How >>>> should I >>>>> compose such item renderer ? >>>>> >>>>> Thanks, >>>>> Piotr >>>>> >>>>> czw., 20 lut 2020 o 03:20 Alex Harui >> <aha...@adobe.com.invalid> >>>>> napisał(a): >>>>> >>>>>> I pushed the "has" changes. TourDeJewel seems to be >> working >>>>> correctly for >>>>>> me. >>>>>> >>>>>> The principle of "has" is similar to inheritance vs >>>> composition. >>>>> Just >>>>>> like top-level components like List are composed of many >>>> beads, the >>>>> item >>>>>> renderers are now composed of more beads as well. That >>>> reduces the >>>>>> requirement to add code to a class in order to "be/is" >>>> something. >>>>>> >>>>>> There used to be copies of code that drew hover and >> selected >>>> states >>>>> on >>>>>> the item renderers in each new kind of item renderer >> that >>>> couldn't >>>>> inherit >>>>>> from an item renderer that could draw selected and >> hovered >>>> states. >>>>> Now, >>>>>> the itemrenderers compose their selection visuals. A >> single >>>> item >>>>> renderer >>>>>> like StringItemRenderer can be composed with no >> selection >>>> drawing at >>>>> all, >>>>>> or with solid color selection drawing or with alternate >> color >>>>> selection >>>>>> drawing or something new. And that means that some >> new >>>> kind of >>>>> item >>>>>> renderer, like a TextInput can become an item renderer >> more >>>> easily, >>>>> by >>>>>> composing a selection visuals bead instead of having to >> add >>>> all of >>>>> that >>>>>> code. >>>>>> >>>>>> Another place I started using "has" but didn't fully >> replace >>>> the old >>>>> code >>>>>> was in handling itemRendererParent, which is now called >>>>>> itemRendererOwnerView (to try to make it more clear >> that isn't >>>>> always the >>>>>> parent of the item renderer and is sometimes an internal >>>>>> datagroup/container). Turns out a lot of our renderers >>>> didn't need >>>>> to know >>>>>> the itemRendererParent, so in many cases we no longer >> figure >>>> it out >>>>> and >>>>>> assign it. But in cases where it is needed, the >> property is >>>>> currently left >>>>>> baked into the renderer, but in some new cases, it is >>>> composed. An >>>>>> ItemRendererOwnerViewBead is added to the strand >> instead of >>>> added to >>>>> a >>>>>> class and contains the reference to the ownerView. >> Maybe >>>> someday >>>>> we'll >>>>>> fully remove the old pattern, not sure. >>>>>> >>>>>> Ideally we would do more "has" than "is". It could >> allow us >>>> to >>>>> eliminate >>>>>> much of the required code to be a top tag in an MXML >> document. >>>>>> >>>>>> Other changes in this branch were to add "Initializers" >> so the >>>>>> RendererFactories didn't bake in code for specific item >>>> renderers, >>>>> and to >>>>>> create a few base classes with overrides so there is >> less >>>> code to >>>>> maintain. >>>>>> >>>>>> There should be little if any impact to application >> code. It >>>> should >>>>>> mainly affect the internals of how item renderer-based >> things >>>> are >>>>> created. >>>>>> >>>>>> Thanks, >>>>>> -Alex >>>>>> >>>>>> On 2/17/20, 4:33 PM, "Carlos Rovira" < >> carlosrov...@apache.org >>>>> >>>>> wrote: >>>>>> >>>>>> Hi Alex, >>>>>> >>>>>> if will be of help if you point us to different >> links >>>> where we >>>>> can >>>>>> learn >>>>>> about this modifications, since I at least can just >>>> imagine what >>>>> is all >>>>>> about, but will need to get deeper in the concepts >> to >>>> understand >>>>> the >>>>>> changes and to apply this patterns. >>>>>> >>>>>> In Jewel each "list component has its own type of >>>> renderer, so >>>>> for >>>>>> example >>>>>> List uses ListItemRenderer and DataGrid has >>>>> DataGridItemRenderer, since >>>>>> usually at that component level the user needs >> similar >>>>> infrastructure >>>>>> like >>>>>> hoverable, selectable...and some (not much) more, >> don't >>>> know >>>>> right now >>>>>> how >>>>>> all this will fit with the "has" new >> pattern....I'll try >>>> it. >>>>>> >>>>>> Just one important thing. There's actual users and >>>> clients using >>>>> Jewel >>>>>> and >>>>>> other UI sets and are with very short times for >> their >>>>> migrations, so >>>>>> just >>>>>> want to ask you to test as much as possible, since >> TDJ >>>> has many >>>>>> examples >>>>>> now. Other thing you can test is new TodoMVC to see >> how it >>>>> behaves, >>>>>> since >>>>>> it uses a List with IRs. So we can ensure (as much >> as we >>>> can) >>>>> the merge >>>>>> left things working (as much as we can) >>>>>> >>>>>> Thanks for working on this, will try all of this >> tomorrow >>>>>> >>>>>> Carlos >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> El lun., 17 feb. 2020 a las 22:35, Alex Harui >>>>>> (<aha...@adobe.com.invalid>) >>>>>> escribió: >>>>>> >>>>>>> I've pushed the "has" branch that contains a >>>> refactoring of >>>>> the item >>>>>>> renderers. Tour De Jewel and MDL Example seem to >> be >>>> working >>>>> as is >>>>>> Basic >>>>>>> List Example and MX AdvancedDataGrid. >>>>>>> >>>>>>> "has" is really just calls to getBeadByType. If >> we >>>> start to >>>>> see >>>>>>> performance issues, then we'll look into >> optimizing. >>>> The >>>>> motivation >>>>>> to >>>>>>> switch to "has" came from several bugs about >> using MX >>>>> Label/CheckBox >>>>>> as >>>>>>> item renderers. In Royale, the ItemRenderers >> were in >>>> control >>>>> of the >>>>>>> visuals of their rollover and selected state. >> That is >>>> a more >>>>> proper >>>>>>> encapsulation than the way it was in Flex where >> the >>>> lists drew >>>>> the >>>>>> rollover >>>>>>> and selected states and it was hard to override >> the >>>> visuals >>>>> for a >>>>>> custom >>>>>>> item renderer. But in the develop branch Royale >> code, >>>> it would >>>>>> require >>>>>>> that custom itemrenderers implement a lot of APIs >>>> related to >>>>>> rollover and >>>>>>> selected visuals. Instead we can now reuse/share >> code >>>> for >>>>> visuals >>>>>> between >>>>>>> different renderers because a renderer now can >> "has" a >>>>>> rollover/selection >>>>>>> implementation instead of being one. >>>>>>> >>>>>>> There are more pieces involved, but there is more >>>> sharing of >>>>> code. >>>>>> Along >>>>>>> the way I found that there were some not-so-PAYG >>>> patterns >>>>> being used >>>>>> in MDL >>>>>>> and Jewel renderers that might deserve further >>>> modification. >>>>> There >>>>>> are >>>>>>> "hoverable" and "selectable" APIs that appear to >> be >>>> used to >>>>>> permanently >>>>>>> turn off selection and hover visuals. In >> general, I >>>> think >>>>> there is >>>>>> better >>>>>>> use of PAYG and composition when functionality is >>>> "built up" >>>>> and not >>>>>>> "turned off", so with the "has" pattern the >> renderers >>>> can be >>>>> added >>>>>> to a >>>>>>> list without any selection visuals at all (for a >>>> non-selectable >>>>>> list) or >>>>>>> re-composed with custom visuals that only support >>>> hoverable, >>>>> for >>>>>> example. >>>>>>> I left it "hoverable/selectable" in the API >> surface for >>>> now, >>>>> but >>>>>> something >>>>>>> to think about going forward. >>>>>>> >>>>>>> I’m going to run a few more tests before merging >> and >>>> pushing to >>>>>> develop. >>>>>>> >>>>>>> -Alex >>>>>>> >>>>>>> On 1/15/20, 10:44 PM, "Alex Harui" >>>> <aha...@adobe.com.INVALID> >>>>> wrote: >>>>>>> >>>>>>> You are welcome to try and see how many cache >> hits >>>> it >>>>> gets. I >>>>>> think >>>>>>> in renderers, we ask once per renderer. I'm not >> sure >>>> there is >>>>> a >>>>>> faster way >>>>>>> to do the first lookup of "is", but for "has" we >> could >>>> change >>>>> the >>>>>> lookup >>>>>>> and save time. >>>>>>> >>>>>>> On 1/15/20, 10:38 PM, "Greg Dove" < >>>> greg.d...@gmail.com> >>>>> wrote: >>>>>>> >>>>>>> For the 'something is ISomeInterface' >>>>>>> I had wondered in the past if these types >> of >>>> lookups >>>>> could be >>>>>>> incrementally >>>>>>> cached on the 'is' target (after first >> lookup), >>>> that >>>>> might >>>>>> make >>>>>>> sense for >>>>>>> interfaces, which are the deepest checks I >>>> think? >>>>>>> caching result (could optionally create >> the Map) >>>>>>> >>>> ISomeInterface['implMap'].set(something.constructor, >>>>>> isResult ) >>>>>>> >>>>>>> then earlier in the interface checks, it >> could >>>> do >>>>> something >>>>>> like: >>>>>>> if (ISomeInterface['implMap'] && >>>>>>> >>>> ISomeInterface['implMap'].has(something.constructor) ) >>>>> return >>>>>>> >>>> ISomeInterface['implMap'].get(something.constructor) >>>>>>> >>>>>>> I realize its extra code, but it should be >>>> quite a bit >>>>>> faster over >>>>>>> time I >>>>>>> think. >>>>>>> >>>>>>> On Thu, Jan 16, 2020 at 7:20 PM Alex Harui >>>>>>> <aha...@adobe.com.invalid> wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> Several different threads have brought >> up >>>> issues with >>>>>> sharing >>>>>>> code between >>>>>>>> component sets. Other threads have >> offered >>>>> different and >>>>>> clever >>>>>>> ways to >>>>>>>> do various things like how MXML is >> applied to >>>> a >>>>> component. >>>>>>> Meanwhile, over >>>>>>>> in MX emulation, I was starting to copy >> some >>>> code >>>>> from >>>>>> Basic to >>>>>>> MXRoyale to >>>>>>>> get the various MX components to be >> valid item >>>>> renderers. >>>>>>> MXRoyale is >>>>>>>> using Basic's item renderer architecture >>>> which is >>>>> better >>>>>>> encapsulated: the >>>>>>>> renderer draws its hovered and selected >>>> state. In >>>>> Flex, >>>>>> the >>>>>>> List draws >>>>>>>> over the renderer, which makes it hard >> to >>>> customize >>>>> the >>>>>> way the >>>>>>> renderer >>>>>>>> will look when hovered and selected. >>>>>>>> >>>>>>>> It finally occurred to me that one of >> the >>>> reasons we >>>>> end up >>>>>>> copying code >>>>>>>> is because we are still using too many >> "is" >>>> checks >>>>> instead >>>>>> of >>>>>>> "has" >>>>>>>> checks. I'm not even sure we have any >> "has" >>>> checks >>>>> in the >>>>>> Royale >>>>>>>> framework. I was afraid of the >> overhead of a >>>> "has" >>>>> check, >>>>>> but >>>>>>> I'm starting >>>>>>>> to change my mind because: >>>>>>>> >>>>>>>> 1) The "is" check actually runs a fair >> amount >>>> of >>>>> code, >>>>>>> especially for >>>>>>>> (comp is ISomeInterface) >>>>>>>> 2) The length of bead arrays don't seem >> too >>>> long. >>>>>>>> >>>>>>>> A "has" check calls >>>> getBeadByType(ISomeInterface), >>>>> so it >>>>>>> actually will run >>>>>>>> the (bead is ISomeInterface) on >> potentially >>>> the >>>>> entire >>>>>> strand >>>>>>> array/vector, >>>>>>>> although we could speed that up by >> annotating >>>> beads >>>>> or >>>>>> keeping >>>>>>> track of >>>>>>>> what is on the strand. But the code >>>> sharing/reuse >>>>>> potential of >>>>>>> this >>>>>>>> pattern seems significant to me. >>>>>>>> >>>>>>>> For example, it could change how hard >> it is >>>> to make a >>>>>> component >>>>>>> usable as >>>>>>>> a top tag in MXML. Instead of the >> component >>>> having >>>>> to >>>>>> implement >>>>>>> certain >>>>>>>> methods, the component could have a bead >>>> installed >>>>> and the >>>>>>>> MXMLDataInterpreter could talk to that >> bead >>>> instead >>>>> of the >>>>>>> component. >>>>>>>> >>>>>>>> In the case of the item renderers, >> instead of >>>>> testing if >>>>>> the >>>>>>> renderer "is" >>>>>>>> ISelectableLIstItemRenderer, it could >> ask if >>>> the >>>>> created >>>>>> widget >>>>>>> "has" an >>>>>>>> ISelectableLIstItemRenderer bead and the >>>> logic in >>>>> that >>>>>> bead can >>>>>>> be reused >>>>>>>> in both Basic and MXRoyale without being >>>> copied. >>>>>>>> >>>>>>>> Some code, like Container overrides of >>>> addElement >>>>> probably >>>>>> can't >>>>>>> be >>>>>>>> refactored into a "has". But I wonder >> how >>>> many other >>>>>> things >>>>>>> could. I'm >>>>>>>> not sure I would move everything that >> could >>>> be moved >>>>> into a >>>>>>> shared bead. >>>>>>>> We'd have to think about the overhead >> on small >>>>> components >>>>>> and >>>>>>> apps. But >>>>>>>> for MXML support and Item Renderer >> support, >>>> it seems >>>>> to >>>>>> make >>>>>>> sense. >>>>>>>> >>>>>>>> Anyway, I will look into refactoring >> the item >>>>> renderer >>>>>> code in >>>>>>> a few days >>>>>>>> unless feedback indicates otherwise. >> Bugs >>>> like #676 >>>>> and >>>>>> #681 >>>>>>> inspired this >>>>>>>> post. >>>>>>>> >>>>>>>> Of course, I could be wrong... >>>>>>>> -Alex >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> Carlos Rovira >>>>>> >>>>>> >>>>> >>>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0> >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> >>>>> Piotr Zarzycki >>>>> >>>>> Patreon: * >>>>> >>>> >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=lM47VH2eMRha92QDljuklrrPWagubgNvaL6WurTBiwg%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=lM47VH2eMRha92QDljuklrrPWagubgNvaL6WurTBiwg%3D&reserved=0> >>>>> < >>>>> >>>> >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=lM47VH2eMRha92QDljuklrrPWagubgNvaL6WurTBiwg%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=lM47VH2eMRha92QDljuklrrPWagubgNvaL6WurTBiwg%3D&reserved=0> >>>>>> * >>>>> >>>>> >>>>> >>>> >>>> -- >>>> Carlos Rovira >>>> >>>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0> >>>> >>>> >>>> >>> >>> -- >>> Carlos Rovira >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0> >>> >>> >> >> -- >> Carlos Rovira >> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0 >> >> <https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288392599&sdata=MegTTo0lt%2Fp1zKt6gaowEYo5a9XDkuM3SHQcCccUa2Y%3D&reserved=0> >> >> >> > > -- > Carlos Rovira > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288402599&sdata=JcJWURIyUxG4bru0YjyB6xM%2FKPUEbNGfZ3zj%2FUB5jUU%3D&reserved=0 > > <https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cc5187f5b4e28463bdb1b08d7b63b1ad4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637178237288402599&sdata=JcJWURIyUxG4bru0YjyB6xM%2FKPUEbNGfZ3zj%2FUB5jUU%3D&reserved=0>