Let me play with implementation of that function. It seems to me that will be much cleaner than current solution.
If user actually wanted to do anythin with className - let the overriding speaks. On Wed, Feb 28, 2018, 21:51 Alex Harui <aha...@adobe.com.invalid> wrote: > On 2/28/18, 12:27 PM, "Harbs" <harbs.li...@gmail.com> wrote: > > >OK. I think that will work for DML components, but what if there’s a bead > >which needs to add class names? What would be the “right” way to do that? > >A bead cannot override the function on the strand. > > Do we have beads that manipulate className? > > IMO, the principle behind how to handle that is knowing whether you are > sharing something or not. There may not be one right way to handle it, > but if I had to handle it, I would have the bead set something in the > model or presentation model of the component. And the component would > override computeFinalClassNames to take that into account. > > > Although having just written that, maybe this computeFinalClassNames > should be in the view instead of on the base class so it is replaceable > instead of overridable. > > Thoughts? > -Alex > > > >> On Feb 28, 2018, at 10:17 PM, Alex Harui <aha...@adobe.com.INVALID> > >>wrote: > >> > >> I think you are missing that the element.className is set to > >> computeFinalClassNames. So the user is welcome to manipulate the > >> UIBase.className however they see fit. They can assign it a whole new > >> space-delimited list if they want. But what gets set on > >>element.className > >> is computed from typeNames and className by default, and MDL would > >> override it to factor in fab, raised, colored into the computing of the > >> final classnames. > >> > >> I would prefer that we don't make requirements on users as to what they > >> can or can't do with the className property, like requiring them to use > >> addClassName/removeClassNames. MXML and States might set className, as > >> could any other AS logic. I think folks may even be used to setting > >> className in JavaScript. So letting UIBase.className be the "variable" > >> part and having computeFinalClassNames be the way the "fixed" part is > >> handled makes sense to me. > >> > >> Of course, I could be wrong... > >> -Alex > >> > >> On 2/28/18, 12:03 PM, "Harbs" <harbs.li...@gmail.com> wrote: > >> > >>> The problem which sparked this whole issue is like this: > >>> > >>> 1. We have some components (i.e. in MDL) which add “pieces” to the > >>>class > >>> names (such as “fab”, “raised”, “colored”, etc. > >>> 2. The client might subsequently set the className to something else. > >>> 3. When the component sets the “pieces” first and the client sets the > >>> className later, the client will overwrite these “pieces” which were > >>> added by the component. > >>> > >>> My suggestion to have addClassName() and removeClassName() was to have > >>>a > >>> “safe” way to add class names which would get computed together with > >>>the > >>> className when the className is replaced. > >>> > >>> The way you have it seems to just be modifying the existing className > >>> property. If that’s overwritten by a client, the logic falls apart. > >>> > >>> It feels like only having typeNames which are set inside the component > >>> and className which is set outside the component is not really enough. > >>> (Unless I’m missing something.) > >>> > >>> Harbs > >>> > >>>> On Feb 28, 2018, at 9:31 PM, Alex Harui <aha...@adobe.com.INVALID> > >>>> wrote: > >>>> > >>>> On 2/28/18, 10:44 AM, "Harbs" <harbs.li...@gmail.com> wrote: > >>>> > >>>>> If it’s not public, I don’t see how a utility method could call it > >>>>> though. > >>>> > >>>> I didn't think the utility methods like addClassName/removeClassName > >>>> would > >>>> need to alter computeFinalClassNames(). > >>>> > >>>> AIUI, for most UIBase subclasses, the final element.className is a mix > >>>> of > >>>> the className property and the typeNames. The typenames are thought > >>>>to > >>>> be > >>>> "fixed" and the space-delimited list of names in className are the > >>>>ones > >>>> the user wants to manipulate in their code. So, I would expect them > >>>>to > >>>> write: > >>>> > >>>> org.apache.royale.utils.addClassName(myComponent, "pinkStyles"); > >>>> > >>>> > >>>> addClassName should just do something like: > >>>> > >>>> myComponent.className += value; > >>>> > >>>> That will call the className setter that will run: > >>>> > >>>> element.className = computeFinalClassNames(); > >>>> > >>>> If you call > >>>> > >>>> org.apache.royale.utils.removeClassName(myComponent, "pinkStyles"); > >>>> > >>>> removeClassName should just do something like: > >>>> > >>>> Var s:String = myComponent.className; > >>>> Var c:int = s.indexOf(nameToRemove + " "); > >>>> If (c != -1) > >>>> s = s.substr(0, c) + s.substr(c + nameToRemove.length + 1); > >>>> Else > >>>> { > >>>> c= s.indexOf(" " + nameToRemove); > >>>> if (c != -1) > >>>> s = s.substr(0, c); // remove last item > >>>> } > >>>> myComponent.className = s; > >>>> > >>>> > >>>> > >>>> It seems like it should be that simple. What am I missing? > >>>> > >>>> -Alex > >>>> > >>>> > >>>>> > >>>>>> On Feb 28, 2018, at 8:21 PM, Alex Harui <aha...@adobe.com.INVALID> > >>>>>> wrote: > >>>>>> > >>>>>> > >>>>>> > >>>>>> On 2/28/18, 9:50 AM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com > >>>>>> <mailto:piotrzarzyck...@gmail.com>> wrote: > >>>>>> > >>>>>>> Ok Understand, but do you agree that computeFinalClassNames - is > >>>>>>> something > >>>>>>> which is in the UIBase ? > >>>>>> > >>>>>> Yes, and probably protected instead of public. The one in UIBase > >>>>>>just > >>>>>> appends typenames to className. It gets overridden in MDL where > >>>>>> needed > >>>>>> for shadow and other attributes. > >>>>>> > >>>>>> My 2 cents, > >>>>>> -Alex > >>>>>>> > >>>>>>> 2018-02-28 18:47 GMT+01:00 Alex Harui <aha...@adobe.com.invalid>: > >>>>>>> > >>>>>>>> I think that in the shadow setter, it would change _shadow and > >>>>>>>>call > >>>>>>>> setClassName(computeFinalClassNames()); > >>>>>>>> > >>>>>>>> On 2/28/18, 9:33 AM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > >>>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Alex, > >>>>>>>>> > >>>>>>>>> So we are getting back to the idea where you proposed to have > >>>>>>>>> function > >>>>>>>>> which computes everything. > >>>>>>>>> > >>>>>>>>> override public function computeFinalClassNames():String > >>>>>>>>> { > >>>>>>>>> return super.computeFinalClassNames() + " " + _shadow; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> Where does that function should be placed ? Does that function > >>>>>>>>> should > >>>>>>>> be > >>>>>>>>> called in addedToParent plus whenever someone change _shadow ? - > >>>>>>>>> > >>>>>>>>> Because I really don't know how to handle scenario where you have > >>>>>>>>> some > >>>>>>>>> property isActive = true/false and I need to add/remove class. - > >>>>>>>>>In > >>>>>>>>> the > >>>>>>>>> first launch I use computeFinalClassNames, but how to handle > >>>>>>>>> changing > >>>>>>>> ? > >>>>>>>>> > >>>>>>>>> Thanks, Piotr > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> 2018-02-28 18:26 GMT+01:00 Alex Harui <aha...@adobe.com.invalid > >: > >>>>>>>>> > >>>>>>>>>> Hi Piotr, > >>>>>>>>>> > >>>>>>>>>> I think am I not communicating the principles effectively. > >>>>>>>>>> > >>>>>>>>>> First, IMO, addClassName and removeClassName should not be in > >>>>>>>>>> UIBase. > >>>>>>>>>> Lots of apps can be written without needing these methods. I > >>>>>>>>>> think > >>>>>>>> they > >>>>>>>>>> can be written as utility functions. > >>>>>>>>>> > >>>>>>>>>> Second, the computation of the final element.className should > >>>>>>>> represent > >>>>>>>>>> the state of the component, so I don't get why you need an > >>>>>>>>>> _internalClassName or should ever set it to "". The computation > >>>>>>>>>> for > >>>>>>>> a > >>>>>>>>>> component with a shadow would be to check the shadow property > >>>>>>>>>>and > >>>>>>>>>> if > >>>>>>>> it > >>>>>>>>>> is > >>>>>>>>>> true, add a className for the shadow to the list. Then I think > >>>>>>>>>> you > >>>>>>>>>> wouldn't have the problem you showed in the animated GIF. When > >>>>>>>>>> the > >>>>>>>>>> classname property is set from the outside by > >>>>>>>>>>MXMLDataInterpreter > >>>>>>>>>> or > >>>>>>>>>> even > >>>>>>>>>> user-written code, those classNames are added to the list with > >>>>>>>>>>the > >>>>>>>>>> typeNames and the shadow className if shadow is true and then > >>>>>>>>>>set > >>>>>>>>>> on > >>>>>>>> the > >>>>>>>>>> element. > >>>>>>>>>> > >>>>>>>>>> Finally, for addClassName and removeClassName, and all other > >>>>>>>>>> Royale > >>>>>>>>>> code, > >>>>>>>>>> we don't want to do much if any parameter checking. That is > >>>>>>>>>>also > >>>>>>>>>> just-in-case code. The production code should not be passing in > >>>>>>>> null or > >>>>>>>>>> other bad values. And once you fix that, then the checks that > >>>>>>>>>>you > >>>>>>>> have > >>>>>>>>>> written do not add value. I have proposed that there are > >>>>>>>>>> debug-only > >>>>>>>>>> code > >>>>>>>>>> that does parameter checking. There is a goog.DEBUG flag you > >>>>>>>>>>can > >>>>>>>>>> use > >>>>>>>>>> for > >>>>>>>>>> that. > >>>>>>>>>> > >>>>>>>>>> HTH, > >>>>>>>>>> -Alex > >>>>>>>>>> > >>>>>>>>>> On 2/28/18, 12:40 AM, "Piotr Zarzycki" > >>>>>>>>>><piotrzarzyck...@gmail.com> > >>>>>>>>>> wrote: > >>>>>>>>>> > >>>>>>>>>>> Hi Alex, > >>>>>>>>>>> > >>>>>>>>>>> Sorry about that. Let me show you code and I recorded GIF with > >>>>>>>> problem > >>>>>>>>>>> debugging. > >>>>>>>>>>> > >>>>>>>>>>> *Code in UIBase which I have implemented:* > >>>>>>>>>>> addClassName and removeClassName [1]. > >>>>>>>>>>> addedToParent what is happen with internal field which I have > >>>>>>>>>>> added > >>>>>>>> [2] > >>>>>>>>>>> > >>>>>>>>>>> *Code for Testing* [3] - I'm adding first className, than > >>>>>>>>>>>shadow. > >>>>>>>>>>> > >>>>>>>>>>> *GIF* [4] We are starting from the constructor. Pay attention > >>>>>>>>>>>to > >>>>>>>>>>> the > >>>>>>>>>>> moment > >>>>>>>>>>> where className is being wiped out, later I have to use my > >>>>>>>>>>> internal > >>>>>>>>>>> variable to get it back. > >>>>>>>>>>> > >>>>>>>>>>> Does that more clean now ? > >>>>>>>>>>> > >>>>>>>>>>> [1] > >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2Fpaste.apa > >>>>>>>>>>> che.org%2FEumG&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d > >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% > >>>>>>>>>> 7C636554040718214998& > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>>sdata=cDT88OF63TdBMPxYY2vwMSIRxD%2FP3DvwHupj%2BQHsofw%3D&reserve > >>>>>>>>>>>d= > >>>>>>>>>>> 0 > >>>>>>>>>>> [2] > >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2Fpaste.apa > >>>>>>>>>>> che.org%2FArmU&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d > >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% > >>>>>>>>>> 7C636554040718214998& > >>>>>>>>>>> sdata=m6whImrP70u7kzRxCbErlxCHWef8TKNejwm4Sr7bw7g%3D&reserved=0 > >>>>>>>>>>> [3] > >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2Fpaste.apa > >>>>>>>>>>> che.org%2FKrxq&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d > >>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% > >>>>>>>>>> 7C636554040718214998& > >>>>>>>>>>> sdata=tpeUYSQIXGXtES8hyr7zSeet528ZTczSltcNccqRGDo%3D&reserved=0 > >>>>>>>>>>> [4] > >>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2F1drv.ms%2 > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>>Fu%2Fs!ApVpLyjpHDC2hPtoCi65kIZZPwjSpQ&data=02%7C01%7Caharui%40ad > >>>>>>>>>>>ob > >>>>>>>>>>> e > >>>>>>>> .com > >>>>>>>>>> %7C > >>>>>>>>>>> ee5c84b4e3ff4ddb578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>> cee1%7C0%7C > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>>0%7C636554040718214998&sdata=eX%2FgZ0MA%2BdQJjcpYtMkk1pw3r0iVkdR > >>>>>>>>>>>a% > >>>>>>>>>> 2F6TWRTG > >>>>>>>>>>> 10OY%3D&reserved=0 > >>>>>>>>>>> > >>>>>>>>>>> Thanks, > >>>>>>>>>>> Piotr > >>>>>>>>>>> > >>>>>>>>>>> 2018-02-27 23:31 GMT+01:00 Alex Harui > >>>>>>>>>>><aha...@adobe.com.invalid>: > >>>>>>>>>>> > >>>>>>>>>>>> Hi Piotr, > >>>>>>>>>>>> > >>>>>>>>>>>> I could not understand this explanation. Might be better to > >>>>>>>>>>>>show > >>>>>>>>>> actual > >>>>>>>>>>>> code. For example in #3, there is a cssClass variable that I > >>>>>>>> don't > >>>>>>>>>> know > >>>>>>>>>>>> about. Also you mention at the bottom setting something as > >>>>>>>>>>>> empty, > >>>>>>>>>> but > >>>>>>>>>>>> I'm > >>>>>>>>>>>> not sure what that is. > >>>>>>>>>>>> > >>>>>>>>>>>> However, IMO, this code should be in utility functions, not in > >>>>>>>>>> UIBase. > >>>>>>>>>>>> I > >>>>>>>>>>>> think plenty of useful applications can be built without > >>>>>>>>>>>> changing > >>>>>>>>>>>> classNames at runtime. > >>>>>>>>>>>> > >>>>>>>>>>>> I'm off-line for the next several hours so we can pick this up > >>>>>>>> again > >>>>>>>>>> in > >>>>>>>>>>>> your morning. > >>>>>>>>>>>> > >>>>>>>>>>>> Thanks for working on it, > >>>>>>>>>>>> -Alex > >>>>>>>>>>>> > >>>>>>>>>>>> On 2/27/18, 2:21 PM, "Piotr Zarzycki" > >>>>>>>>>>>> <piotrzarzyck...@gmail.com> > >>>>>>>>>> wrote: > >>>>>>>>>>>> > >>>>>>>>>>>>> Here is how I'm thinking to resolve that issue. I would take > >>>>>>>> Harb's > >>>>>>>>>>>>> proposition and add to UIBase addClassName() and > >>>>>>>> removeClassName(). > >>>>>>>>>>>> Next > >>>>>>>>>>>>> I > >>>>>>>>>>>>> would add internal field _internalClassName:String. > >>>>>>>>>>>>> > >>>>>>>>>>>>> addClassName(value): > >>>>>>>>>>>>> 1) Will check if provided class name exits in _className and > >>>>>>>>>>>>>in > >>>>>>>>>>>>> _internalClassName. > >>>>>>>>>>>>> 2) Will add to _internalClassName += value > >>>>>>>>>>>>> 3) Assign to the element.className in the following way: > >>>>>>>>>>>> element.className > >>>>>>>>>>>>> = cssClass + " " + _className + " " + typeNames; > >>>>>>>>>>>>> > >>>>>>>>>>>>> removeClassName(value) > >>>>>>>>>>>>> 1) Will check if provided classs name exists in _className > >>>>>>>>>>>>>or > >>>>>>>>>>>>> in > >>>>>>>>>>>>> _internalClassName > >>>>>>>>>>>>> 2) Make a replace to empty string if css class name exists. > >>>>>>>>>>>>> _className.replace(value, ""); > >>>>>>>>>>>>> 3) Assign to the element.className: element.className = > >>>>>>>> _className > >>>>>>>>>> + " > >>>>>>>>>>>> " + > >>>>>>>>>>>>> typeNames; > >>>>>>>>>>>>> > >>>>>>>>>>>>> In added to parent we are computing _internalClassName with > >>>>>>>>>> _className > >>>>>>>>>>>> and > >>>>>>>>>>>>> typeNames. Then it's being set as empty. > >>>>>>>>>>>>> > >>>>>>>>>>>>> element.className = _internalClassName + " " + _className > >>>>>>>>>>>>>+ " > >>>>>>>> " + > >>>>>>>>>>>>> typeNames; > >>>>>>>>>>>>> > >>>>>>>>>>>>> I have implemented it and it seems to be working. Waiting for > >>>>>>>> your > >>>>>>>>>>>>> thoughts > >>>>>>>>>>>>> on that solution. The last step where we are adding all three > >>>>>>>>>> fields is > >>>>>>>>>>>>> the > >>>>>>>>>>>>> most important. Points 3 in addClassName and removeClassName > >>>>>>>>>>>>> are > >>>>>>>>>>>>> necessary, > >>>>>>>>>>>>> because user may want to more dynamically manipulate classes > >>>>>>>>>>>>> once > >>>>>>>>>>>>> component > >>>>>>>>>>>>> is created. Ex. "is-active" class is removed and added on > >>>>>>>>>>>>> demand. > >>>>>>>>>>>>> > >>>>>>>>>>>>> Thanks, Piotr > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> 2018-02-27 13:38 GMT+01:00 Piotr Zarzycki > >>>>>>>>>> <piotrzarzyck...@gmail.com>: > >>>>>>>>>>>>> > >>>>>>>>>>>>>> I think I have analyzed everything and have some > >>>>>>>>>>>>>> implementation > >>>>>>>>>>>>>> proposition. I will try to provide it later today. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Thanks, Piotr > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> 2018-02-27 13:35 GMT+01:00 Harbs <harbs.li...@gmail.com>: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> ExpandableSearch broke too. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki > >>>>>>>>>>>>>>> <piotrzarzyck...@gmail.com> > >>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Harbs, > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> If you are using something more than MDL Dialog in your > >>>>>>>>>>>> application > >>>>>>>>>>>>>>> it > >>>>>>>>>>>>>>>> would be great to get feedback whether I didn't break for > >>>>>>>> you > >>>>>>>>>>>>>>> anything. > >>>>>>>>>>>>>>> :) > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> -- > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Piotr Zarzycki > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Patreon: > >>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>>>> https%3A%2F%2Fwww.pat > >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > >>>>>>>>>>>> %7C45a065853ba1 > >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>>>> cee1%7C0%7C0%7C6365536 > >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK > >>>>>>>>>>>> 9liXcy%2BPg%3D&rese > >>>>>>>>>>>>>> rved=0 > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>>>> https%3A%2F%2Fwww.pat > >>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > >>>>>>>>>>>> %7C45a065853ba1 > >>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>>>> cee1%7C0%7C0%7C6365536 > >>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK > >>>>>>>>>>>> 9liXcy%2BPg%3D&rese > >>>>>>>>>>>>>> rved=0>* > >>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> -- > >>>>>>>>>>>>> > >>>>>>>>>>>>> Piotr Zarzycki > >>>>>>>>>>>>> > >>>>>>>>>>>>> Patreon: > >>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>>>> 7C45a065853ba14a > >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 > >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK > >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved > >>>>>>>>>>>>> =0 > >>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>>>> 7C45a065853ba14a > >>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 > >>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK > >>>>>>>>>>>> 9liXcy%2BPg%3D&reserved > >>>>>>>>>>>>> =0>* > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> -- > >>>>>>>>>>> > >>>>>>>>>>> Piotr Zarzycki > >>>>>>>>>>> > >>>>>>>>>>> Patreon: > >>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>> 7Cee5c84b4e3ff4d > >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>> cee1%7C0%7C0%7C6365540407 > >>>>>>>>>>> > >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs%2FqOkmxROz58p7VvQ%2B0EK8VPPc > >>>>>>>>>>>% > >>>>>>>>>> 3D&reserv > >>>>>>>>>>> ed=0 > >>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>>>> 7Cee5c84b4e3ff4d > >>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>>>> cee1%7C0%7C0%7C6365540407 > >>>>>>>>>>> > >>>>>>>>>>>18214998&sdata=VYtgB8rsurZAHpO%2FVs%2FqOkmxROz58p7VvQ%2B0EK8VPPc > >>>>>>>>>>>% > >>>>>>>>>> 3D&reserv > >>>>>>>>>>> ed=0>* > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> -- > >>>>>>>>> > >>>>>>>>> Piotr Zarzycki > >>>>>>>>> > >>>>>>>>> Patreon: > >>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>> 7Cda0fd75922c94d > >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>> cee1%7C0%7C0%7C6365543602 > >>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>>95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0oJqA6J42ZuhcA%3D&rese > >>>>>>>>>rv > >>>>>>>>> ed > >>>>>>>>> =0 > >>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= > >>>>>>>> https%3A%2F%2Fwww.patr > >>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% > >>>>>>>> 7Cda0fd75922c94d > >>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de > >>>>>>>> cee1%7C0%7C0%7C6365543602 > >>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 > >>>>>>>> oJqA6J42ZuhcA%3D&reserved=0>* > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> -- > >>>>>>> > >>>>>>> Piotr Zarzycki > >>>>>>> > >>>>>>> Patreon: > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>* > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww > >>>>>>>w. > >>>>>>> pa > >>>>>>> tr > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww > >>>>>>>w. > >>>>>>> pa > >>>>>>> tr> > >>>>>>> eon.com > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Feon > >>>>>>>.c > >>>>>>> om > >>>>>>> > >>>>>>> > >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com > %7C75519f53f52b4fde36b108d57edb > >>>>>>>59 > >>>>>>> 03 > >>>>>>> > >>>>>>> > >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636554402926763835&sda > >>>>>>>ta > >>>>>>> =G > >>>>>>> > >>>>>>> > >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>%2Fpiotrzar > >>>>>>>zy > >>>>>>> ck > >>>>>>> i&data=02%7C01%7Caharui%40adobe.com > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2F40a > >>>>>>>do > >>>>>>> be > >>>>>>> > >>>>>>> > >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com > %7C75519f53f52b4fde36b108d5 > >>>>>>>7e > >>>>>>> db > >>>>>>> > >>>>>>> > >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636554402926763835 > >>>>>>>&s > >>>>>>> da > >>>>>>> > >>>>>>> > >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D&reserved=0>%7Cf2 > >>>>>>>5d > >>>>>>> bf > >>>>>>> 20138f47 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365 > >>>>>>>54 > >>>>>>> 37 > >>>>>>> 41 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQSetW7oghI4s%3D&rese > >>>>>>>rv > >>>>>>> ed > >>>>>>> =0 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww > >>>>>>>w. > >>>>>>> pa > >>>>>>> tr > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww > >>>>>>>w. > >>>>>>> pa > >>>>>>> tr> > >>>>>>> eon.com > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Feon > >>>>>>>.c > >>>>>>> om > >>>>>>> > >>>>>>> > >>>>>>>%2F&data=02%7C01%7Caharui%40adobe.com > %7C75519f53f52b4fde36b108d57edb > >>>>>>>59 > >>>>>>> 03 > >>>>>>> > >>>>>>> > >>>>>>>%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636554402926763835&sda > >>>>>>>ta > >>>>>>> =G > >>>>>>> > >>>>>>> > >>>>>>>P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>%2Fpiotrzar > >>>>>>>zy > >>>>>>> ck > >>>>>>> i&data=02%7C01%7Caharui%40adobe.com > >>>>>>> > >>>>>>> > >>>>>>>< > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2F40a > >>>>>>>do > >>>>>>> be > >>>>>>> > >>>>>>> > >>>>>>>.com%2F&data=02%7C01%7Caharui%40adobe.com > %7C75519f53f52b4fde36b108d5 > >>>>>>>7e > >>>>>>> db > >>>>>>> > >>>>>>> > >>>>>>>5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636554402926763835 > >>>>>>>&s > >>>>>>> da > >>>>>>> > >>>>>>> > >>>>>>>ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D&reserved=0>%7Cf2 > >>>>>>>5d > >>>>>>> bf > >>>>>>> 20138f47 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365 > >>>>>>>54 > >>>>>>> 37 > >>>>>>> 41 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQSetW7oghI4s%3D&rese > >>>>>>>rv > >>>>>>> ed > >>>>>>> =0 > >>>>>>>> * > >>>>> > >>>> > >>> > >> > > > >