FWIW, the AVM (ActionScript Virtual Machine) has sealed classes (not modifiable at runtime) on purpose: to secure your code from hacking. Polyfills are dangerous. A good one helps, but the mere fact they work means that others can inject capabilities into your classes at runtime.
Also, consider that we want to leave the door open to target other runtimes/platforms. Many will not support polyfills and other runtime class modifications (eval). So, while it is fine to access a polyfill via bracket syntax. And I would do so if I was in a hurry, IMO, for a more future-proof support, you should consider what the polyfill does and what is its closest language construct. Polyfills sort of mimic Aspects and/or multiple inheritance. But there is no guarantee those things are supported in all runtimes/platforms. Another thing similar to polyfills are actually beads, if you can get yourself away from trying to access features on concrete instances (UIBase or whatever). As I mentioned upthread, use of interfaces and "has" provides more flexibility and, while I've never actually tried it, might work for polyfills as well. So, instead of assuming that a polyfill adds a property/method to an instance (yes, I know that is actually what it does), its Royale API surface can be a bead or interface. That is more code for sure, but that pattern future-proofs the Royale code. IOW, we shouldn't really encourage people to write indicator_content["animate"]. Yes, I know they can. But we probably should encourage them to access a bead. So then you would write: var animateBead:IAnimateBead = indicator_content.getBeadByType(IAnimateBead); animateBead.animate(); The AnimateBead's JavaScript implementation would call strand["animate"](). But then it makes it possible to mimic adding some animation engine at runtime on other runtimes/platforms since beads should be implementable on every runtime/platform we are interested in. My 2 cents, -Alex On 5/3/19, 3:39 PM, "Josh Tynjala" <[email protected]> wrote: ActionScript does not provide a mechanism for taking an existing class and adding new methods or properties to it. In this case, I don't think you have any other option than to use bracket syntax, like indicator_content["animate"]. - Josh On 2019/05/03 21:08:56, Carlos Rovira <[email protected]> wrote: > Another more question I just found and don't know how to solve. > > if I have a polyfill like Web Animations API that adds "animate" method to > any Element object. > Can someone post an example of an @extern file for a case like this? I > don't imagine right now how can this be done, and maybe right not it can't > be done. > > Example code I'm using now with brackets notation is: > > indicator_content["animate"]({ <this is an object with animation data to > pass to animate method> }); > > so I want royale user can do instead: > > indicator_content.animate({...}); > > thanks > > El vie., 3 may. 2019 a las 23:03, Carlos Rovira (<[email protected]>) > escribió: > > > Hi, > > > > I now Greg is busy now with an important update > > I can try to do it myself if Alex point me to the code I should look, for > > me it would be part of the task to make this blog example in the best way > > possible. > > thanks > > > > El vie., 3 may. 2019 a las 22:58, Greg Dove (<[email protected]>) > > escribió: > > > >> 'I'm pretty sure externs are not scanned for inject_html. Volunteers are > >> welcome to teach the compiler to do so.' > >> I am happy to look into this sometime in the next few days. Just trying to > >> finish up something else first... > >> > >> > >> > >> On Sat, May 4, 2019 at 8:54 AM Alex Harui <[email protected]> > >> wrote: > >> > >> > Hi Carlos, > >> > > >> > I'm pretty sure externs are not scanned for inject_html. Volunteers are > >> > welcome to teach the compiler to do so. > >> > > >> > -Alex > >> > > >> > On 5/3/19, 1:50 PM, "Carlos Rovira" <[email protected]> wrote: > >> > > >> > Hi, > >> > > >> > while putting the pieces together for the blog example I'm finding > >> the > >> > following. > >> > > >> > For classes that wraps a js code that is an intrinsic file needed to > >> > make > >> > the code function I think inject_html should work but I'm trying it > >> and > >> > seems this is not working. The code is like this: > >> > > >> > package > >> > { > >> > /** > >> > * @externs > >> > */ > >> > public class hljs > >> > { > >> > /** > >> > * <inject_html> > >> > * <script src=" > >> > > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fhighlight.js%2F9.12.0%2Fhighlight.min.js&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649559063&sdata=QRYYGpcZx5oBdEwa%2BMHOiTWxgLIpoXhzRRsFe3L4ctU%3D&reserved=0 > >> > "></script> > >> > * <link rel="stylesheet" title="Atom One Dark" href=" > >> > > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fhighlight.js%2F9.12.0%2Fstyles%2Fatom-one-dark.min.css&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649559063&sdata=KhyWmwmUnES0f7P7BJXgUg08oyW9iUZmJqmMOhM%2Bbac%3D&reserved=0 > >> > "> > >> > * </inject_html> > >> > */ > >> > public function hljs() > >> > { > >> > } > >> > > >> > public static function highlightBlock(block:Element):void {} > >> > } > >> > } > >> > > >> > So instead of add the inject_html in the code that calls the > >> methods in > >> > this step, I think it should be here > >> > > >> > Make this sense? > >> > > >> > > >> > > >> > El vie., 3 may. 2019 a las 9:38, Carlos Rovira (< > >> > [email protected]>) > >> > escribió: > >> > > >> > > Hi Alex, > >> > > > >> > > for me is difficult right now think about what would be better for > >> > > TypeScript. I think all will depend on how people interact in the > >> > following > >> > > months/years to show us what't the best for Royale in the long > >> term. > >> > > I think bringing TS to Royale as a first citizen language will > >> make > >> > us > >> > > more accesible and people will considere us more since TS is the > >> > language > >> > > people choose over AS3 (although I for example like AS3 more and > >> if > >> > we get > >> > > few things like generics we'll be great to compete with TS), but > >> > this is a > >> > > very complex task, so I know this hardly be done unless someone > >> > comes with > >> > > time and knowledge to make it happen. And if we think about things > >> > that are > >> > > complex and hard to add and see the importance/value it will > >> bring to > >> > > Royale I think a WebAssembly target will be over TS since it > >> clearly > >> > > enhance the Roayle purpose of generate multiple sources. > >> > > > >> > > In the other hand, make TS just to do TypeDefs, again maybe users > >> > should > >> > > express here if it could be needed, I can't say right now how much > >> > this > >> > > could be important for Royale, so maybe time and users will let us > >> > know > >> > > what to do. > >> > > > >> > > > >> > > > >> > > El jue., 2 may. 2019 a las 22:44, Alex Harui > >> > (<[email protected]>) > >> > > escribió: > >> > > > >> > >> The word "package" has many meanings. In AS3 it is a way of > >> > avoiding API > >> > >> name collisions. AIUI, an AS3 package in SWF code has no object > >> or > >> > >> function representation. It effectively just creates a longer > >> > "qualified > >> > >> name". IOW, in a SWF, if there is a class "mx.core.UIComponent", > >> > there is > >> > >> no "mx.core" object you can iterate to see all of the classes. > >> > >> > >> > >> For Royale's JS output, an AS3 package has an object > >> representation > >> > in > >> > >> debug mode because we use the same pattern as Google Closure. So > >> > there > >> > >> really would be an "mx" Object with a "core" property object > >> with a > >> > >> UIComponent function that serves as the constructor. However, in > >> > >> production, these package objects are often collapsed, so it is > >> > best to not > >> > >> assume the objects exist. > >> > >> > >> > >> Then there are Node/NPM packages and modules and other sorts of > >> > >> "packaging". But in this thread I was only referencing AS3 > >> > Packages. > >> > >> > >> > >> Also in this thread I mentioned TypeScript. While Royale could > >> > support > >> > >> TypeScript as Carlos mentioned, as an alternative to writing > >> AS3, I > >> > only > >> > >> mentioned it because the existence of a TypeScript definition > >> for a > >> > library > >> > >> indicates that the library can have a strongly-typed API surface > >> > which > >> > >> means it is highly likely you can create Royale typedefs for that > >> > library, > >> > >> and because I thought that Josh's converter was still working. > >> > Supporting > >> > >> TypeScript as an alternative programming language in Royale is a > >> > >> significant chunk of work and is not something I plan to work on > >> at > >> > this > >> > >> time. But I was only mentioning using TypeScript to generate > >> > typedefs, > >> > >> which is a different effort and could be a smaller effort and > >> give > >> > us > >> > >> access to a huge set of typedefs. I have no plans to work on > >> that > >> > at this > >> > >> time either, but I could imagine myself working on that if there > >> > was enough > >> > >> demand for it. > >> > >> > >> > >> HTH, > >> > >> -Alex > >> > >> > >> > >> On 5/2/19, 11:24 AM, "Dany Dhondt" <[email protected]> > >> > wrote: > >> > >> > >> > >> Hi Josh, > >> > >> > >> > >> Aren’t most of the packages just functions? > >> > >> In ES6, you’d import packages as > >> > >> Import { myFunct, myVar } from ‘my-package’ > >> > >> In older javascript you’d: > >> > >> const myPackagePointer = require(‘my-package’) > >> > >> > >> > >> So your ‘fun’ example sounds like heaven to me! This is > >> exactly > >> > what > >> > >> we need. > >> > >> > >> > >> About Typescript: do we need that at all? I think, but maybe > >> > this > >> > >> goes beyond my technical knowledge, all node packages are > >> compiled > >> > into > >> > >> plain old javascript functions. Typescript is only needed for > >> > authoring the > >> > >> packages. Once compiled there’s no trace of Typescript at all. If > >> > this is > >> > >> indeed true, then we shouldn’t bother about Typescript at all, > >> and > >> > just > >> > >> concentrate on incorporating the pure javascript libs. > >> > >> > >> > >> Dany > >> > >> > >> > >> > Op 2 mei 2019, om 19:57 heeft Josh Tynjala < > >> > [email protected]> > >> > >> het volgende geschreven: > >> > >> > > >> > >> > Just for fun, here's another way that you could create a > >> > typedef > >> > >> for hljs so that the highlightBlock() function is directly in a > >> > package > >> > >> (similar to flash.net.navigateToURL), instead of as a static > >> method > >> > on a > >> > >> class: > >> > >> > > >> > >> > > >> > >> > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2FkhVI&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649559063&sdata=HWvr1rRp8wS2Xr9Ca2J%2BZe9t3pBTx%2FoWP2AeWYM5C50%3D&reserved=0 > >> > >> > > >> > >> > If you did it this way, you'd need to import it before you > >> > can call > >> > >> the function, like this: > >> > >> > > >> > >> > import hljs.highlightBlock; > >> > >> > > >> > >> > Or this should work too, if you prefer: > >> > >> > > >> > >> > import hljs.*; > >> > >> > > >> > >> > And then you can call the function directly (without the > >> hljs. > >> > >> prefix): > >> > >> > > >> > >> > highlightBlock(block); > >> > >> > > >> > >> > As you can see, the way that you choose to expose a JS > >> > library to > >> > >> ActionScript is pretty flexible. Some JavaScript libraries are > >> just > >> > a > >> > >> function, and some have APIs that work more like classes. > >> Depending > >> > on the > >> > >> library, one way may work better than the other. > >> > >> > > >> > >> > - Josh > >> > >> > > >> > >> > On 2019/05/02 17:48:49, Josh Tynjala < > >> [email protected]> > >> > >> wrote: > >> > >> >> Exactly right. When you create a typedef class, you're > >> > trying to > >> > >> simulate how you would access the API as if you were writing in > >> > plain > >> > >> JavaScript. You call hljs.highlightBlock() in JavaScript, so you > >> > need a > >> > >> class that works the same way in ActionScript. > >> > >> >> > >> > >> >> Another option for organization would be to keep all of > >> your > >> > >> typedefs in a separate folder from your app's source files, and > >> > reference > >> > >> the typedefs folder using the source-path compiler option. > >> > >> >> > >> > >> >> - Josh > >> > >> >> > >> > >> >> On 2019/05/02 16:23:45, Alex Harui > >> <[email protected] > >> > > > >> > >> wrote: > >> > >> >>> Hi Carlos, > >> > >> >>> > >> > >> >>> I don’t think hljs is in a package called "externs". In > >> > Josh's > >> > >> example, hljs was in the top-level package. And that's because > >> > hljs is > >> > >> found at runtime off of the global window object, not some > >> > sub-object > >> > >> called "externs". So, the hljs.as file containing the externs > >> has > >> > to go > >> > >> in the root of a source-path, not in some folder called "externs" > >> > (which is > >> > >> why some folks will take the time to create a separate typedefs > >> SWC > >> > so as > >> > >> not to clutter the root of their application's source directory). > >> > >> >>> > >> > >> >>> Then instead of "import externs.hljs", it should be > >> "import > >> > hljs" > >> > >> (or shouldn’t be needed at all). > >> > >> >>> > >> > >> >>> HTH, > >> > >> >>> -Alex > >> > >> >>> > >> > >> >>> On 5/2/19, 9:11 AM, "Carlos Rovira" < > >> > [email protected]> > >> > >> wrote: > >> > >> >>> > >> > >> >>> Hi, > >> > >> >>> > >> > >> >>> in my latest commit I added hljs extern class like > >> Josh > >> > show > >> > >> in package > >> > >> >>> externs in TDJ > >> > >> >>> > >> > >> >>> Then I didn't commit the following since is not > >> working > >> > for me: > >> > >> >>> > >> > >> >>> 1.- In HighlightCode class (in utils package TDJ) > >> > >> >>> > >> > >> >>> added: > >> > >> >>> > >> > >> >>> import externs.hljs; > >> > >> >>> > >> > >> >>> changed the method highlightBlock to: > >> > >> >>> > >> > >> >>> COMPILE::JS > >> > >> >>> /** > >> > >> >>> * block is the element (WrappedHTMLElement) inside the > >> > >> component (the > >> > >> >>> <code> tag) > >> > >> >>> */ > >> > >> >>> public function > >> > highlightBlock(block:Element):void > >> > >> >>> { > >> > >> >>> hljs.highlightBlock(block); > >> > >> >>> } > >> > >> >>> > >> > >> >>> and running it I get: > >> > >> >>> > >> > >> >>> Uncaught ReferenceError: externs is not defined > >> > >> >>> at utils.HighlightCode.highlightBlock > >> > (HighlightCode.as:53) > >> > >> >>> at > >> > >> >>> > >> > >> > >> > > >> WelcomeSection.components.ExampleAndSourceCodeTabbedSectionContent.dataReadyHandler > >> > >> >>> (ExampleAndSourceCodeTabbedSectionContent.as:138) > >> > >> >>> at > >> > >> services.GitHubService.goog.events.EventTarget.fireListeners > >> > >> >>> (eventtarget.js:284) > >> > >> >>> at > >> > Function.goog.events.EventTarget.dispatchEventInternal_ > >> > >> >>> (eventtarget.js:381) > >> > >> >>> at > >> > >> services.GitHubService.goog.events.EventTarget.dispatchEvent > >> > >> >>> (eventtarget.js:196) > >> > >> >>> at > >> > >> >>> services.GitHubService.org > >> > >> .apache.royale.events.EventDispatcher.dispatchEvent > >> > >> >>> (EventDispatcher.js:71) > >> > >> >>> at > >> > >> services.GitHubService.services_GitHubService_completeHandler > >> > >> >>> (GitHubService.as:54) > >> > >> >>> at > >> > >> >>> org.apache.royale.net > >> > >> .HTTPService.goog.events.EventTarget.fireListeners > >> > >> >>> (eventtarget.js:284) > >> > >> >>> at > >> > Function.goog.events.EventTarget.dispatchEventInternal_ > >> > >> >>> (eventtarget.js:381) > >> > >> >>> at > >> > >> >>> org.apache.royale.net > >> > >> .HTTPService.goog.events.EventTarget.dispatchEvent > >> > >> >>> (eventtarget.js:196) > >> > >> >>> > >> > >> >>> What I'm doing wrong? > >> > >> >>> > >> > >> >>> thanks! > >> > >> >>> > >> > >> >>> > >> > >> >>> El jue., 2 may. 2019 a las 18:02, Carlos Rovira (< > >> > >> [email protected]>) > >> > >> >>> escribió: > >> > >> >>> > >> > >> >>>> Hi Josh, > >> > >> >>>> > >> > >> >>>> I think this piece of knowledge you just exposed here is > >> > key for > >> > >> the > >> > >> >>>> success of Royale. > >> > >> >>>> > >> > >> >>>> I'll try to use this in TDJ to experiment with it and > >> will > >> > use > >> > >> in the blog > >> > >> >>>> example I plan to do. > >> > >> >>>> > >> > >> >>>> thanks! > >> > >> >>>> > >> > >> >>>> > >> > >> >>>> El jue., 2 may. 2019 a las 16:36, Josh Tynjala (< > >> > >> [email protected]>) > >> > >> >>>> escribió: > >> > >> >>>> > >> > >> >>>>>> Users can't do this, they required that Royale > >> framework > >> > devs > >> > >> add > >> > >> >>>>> typedefs to the typedefs repo and wait to next SDK > >> > release. > >> > >> What does not > >> > >> >>>>> seems very useful. > >> > >> >>>>> > >> > >> >>>>> Users can create their own typedefs from scratch. > >> > >> >>>>> > >> > >> >>>>> I just created a quick example for hljs, that exposes > >> the > >> > >> >>>>> highlightBlock() function: > >> > >> >>>>> > >> > >> >>>>> > >> > >> > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpaste.apache.org%2FdIq0&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649559063&sdata=e7eVL0od3je0k9CR7f%2FPqgE94Wu67pQ0PzU3VCYGUlA%3D&reserved=0 > >> > >> >>>>> > >> > >> >>>>> Basically, the class needs an asdoc comment with the > >> > @externs > >> > >> tag (this > >> > >> >>>>> is something that comes from Google Closure compiler, > >> > which we > >> > >> use to > >> > >> >>>>> create release builds) and the compiler should handle > >> the > >> > rest. > >> > >> >>>>> > >> > >> >>>>> As I understand it, you don't even need to create a SWC > >> > library > >> > >> for > >> > >> >>>>> custom typedefs. Recently, Alex mentioned that the > >> mxmlc > >> > >> compiler is smart > >> > >> >>>>> enough to handle a source file as long as it has the > >> > @externs > >> > >> tag. > >> > >> >>>>> > >> > >> >>>>> - Josh > >> > >> >>>>> > >> > >> >>>>> On 2019/05/02 09:34:37, Carlos Rovira < > >> > [email protected]> > >> > >> wrote: > >> > >> >>>>>> Hi, > >> > >> >>>>>> > >> > >> >>>>>> to sumarize (let me know if I'm wrong), the current > >> ways > >> > to > >> > >> integrate an > >> > >> >>>>>> existing library are 3: > >> > >> >>>>>> > >> > >> >>>>>> 1.- access vía brackets notation: This is the most > >> easy > >> > and > >> > >> direct, an > >> > >> >>>>>> example is TourDeJewel in class utils.HighlightCode > >> > >> >>>>>> > >> > >> >>>>>> var hljs:Object = window["hljs"]; > >> > >> >>>>>> hljs["highlightBlock"](block); > >> > >> >>>>>> > >> > >> >>>>>> but this one is not what we really want since we are > >> > going > >> > >> with Roayle > >> > >> >>>>> and > >> > >> >>>>>> AS3 to get type checking and strong typing. So this, > >> > although > >> > >> useful is > >> > >> >>>>> not > >> > >> >>>>>> what we really want to use in out Apps, but since we > >> > want to > >> > >> maintain > >> > >> >>>>> the > >> > >> >>>>>> dynamic aspect of the language it could be very useful > >> > >> sometimes > >> > >> >>>>>> > >> > >> >>>>>> 2.- using typedefs > >> > >> >>>>>> > >> > >> >>>>>> This will be the next step to use a real type and dot > >> > >> notation, but > >> > >> >>>>> seems > >> > >> >>>>>> not easy or direct. > >> > >> >>>>>> Users can't do this, they required that Royale > >> framework > >> > devs > >> > >> add > >> > >> >>>>> typedefs > >> > >> >>>>>> to the typedefs repo and wait to next SDK release. > >> What > >> > does > >> > >> not seems > >> > >> >>>>> very > >> > >> >>>>>> useful. > >> > >> >>>>>> > >> > >> >>>>>> In the other hand we'll need to know how to extend > >> > current > >> > >> typedefs > >> > >> >>>>> since > >> > >> >>>>>> don't know if we have docs about this. Until now I > >> added > >> > to > >> > >> "missing.js" > >> > >> >>>>>> file fo now, but this doesn't seems a valid path since > >> > it lacks > >> > >> >>>>>> organization, separation, and a way for all people > >> > >> contributing to know > >> > >> >>>>> wha > >> > >> >>>>>> we have, what can be added and where, if not we'll > >> find > >> > in > >> > >> time lots of > >> > >> >>>>>> code very difficult to maintain. > >> > >> >>>>>> > >> > >> >>>>>> Yishay and Josh talked about to use TypeScript, but > >> > seems that > >> > >> is > >> > >> >>>>> already > >> > >> >>>>>> explored by Josh but not a valid path since will be > >> very > >> > >> difficult to > >> > >> >>>>>> maintain. > >> > >> >>>>>> > >> > >> >>>>>> 3.- wrapping libraries > >> > >> >>>>>> > >> > >> >>>>>> This is how we did with MDL. This will be recommended > >> > when we > >> > >> want to > >> > >> >>>>>> integrate existing libraries with Royale to make it > >> work > >> > with > >> > >> our APIs > >> > >> >>>>> in a > >> > >> >>>>>> more seamless way. But the problems is that this is > >> very > >> > >> laborious. Can > >> > >> >>>>> be > >> > >> >>>>>> useful for some concrete libraries and we should do > >> when > >> > >> needed (the > >> > >> >>>>> case > >> > >> >>>>>> is MDL). But the problem is that this not solve the > >> > problem of > >> > >> our users > >> > >> >>>>>> that need to integrate a existing library themselves > >> in a > >> > >> quick way. > >> > >> >>>>>> > >> > >> >>>>>> Let me know if you know other way. > >> > >> >>>>>> > >> > >> >>>>>> For me method 1, is ok to do the work, but doesn't > >> make > >> > us > >> > >> justice. > >> > >> >>>>>> method 2 should be the main one if there's a fast and > >> > easy > >> > >> way... I'm > >> > >> >>>>>> missing something here? Can users create typedefs > >> > themselves? > >> > >> >>>>>> method 3 can be useful for us or for users (doing > >> their > >> > own > >> > >> libs, and > >> > >> >>>>>> eventually can share with us to add to official royale > >> > repo > >> > >> and sdk) > >> > >> >>>>>> but is something not fast at all and not as convenient > >> > and > >> > >> direct as > >> > >> >>>>> method > >> > >> >>>>>> 2, and will require maintenance as libs change. > >> > >> >>>>>> > >> > >> >>>>>> Could we agree that this is the currently available > >> ways > >> > in > >> > >> Royale now > >> > >> >>>>> to > >> > >> >>>>>> use external JS libs? > >> > >> >>>>>> > >> > >> >>>>>> thanks > >> > >> >>>>>> > >> > >> >>>>>> -- > >> > >> >>>>>> Carlos Rovira > >> > >> >>>>>> > >> > >> > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > >> > >> >>>>>> > >> > >> >>>>> > >> > >> >>>> > >> > >> >>>> > >> > >> >>>> -- > >> > >> >>>> Carlos Rovira > >> > >> >>>> > >> > >> > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > >> > >> >>>> > >> > >> >>>> > >> > >> >>> > >> > >> >>> -- > >> > >> >>> Carlos Rovira > >> > >> >>> > >> > >> > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > >> > >> >>> > >> > >> >>> > >> > >> >>> > >> > >> >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > > > >> > > -- > >> > > Carlos Rovira > >> > > > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > >> > > > >> > > > >> > > >> > -- > >> > Carlos Rovira > >> > > >> > > >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > >> > > >> > > >> > > >> > > > > > > -- > > Carlos Rovira > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 > > > > > > -- > Carlos Rovira > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C2ffc116355b14bd2667708d6d0183019%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636925199649569068&sdata=gQuv7RVxp1jF6%2BC%2FJa1c4mjvU31wIxEQNSW%2B3ugKTF8%3D&reserved=0 >
