cx_Freeze icon indicating copy to clipboard operation
cx_Freeze copied to clipboard

MacOS freezing works, but Library not loaded error on other Mac computers.

Open PerfXWeb opened this issue 4 years ago • 37 comments

I am able to successfully build a Python v3.8.3:6f8c8320e9 program as a console application, and it works on my Macbook Air, yet when I send it to another Mac computer that has Python not installed it shows the following error:

dyld: Library not loaded: /Library/Frameworks/Python.framework/Versions/3.8/Python
  Referenced from: /Users/Rene/Desktop/init_bet
  Reason: image not found
Abort trap: 6
logout

On further inspection (using vim or nano), the frozen binary file itself has that exact absolute path /Library/Frameworks/Python.framework/Versions/3.8/Python stored in it. It seems like it is not referencing to the Python that comes with the cx_freeze binary.

As setup.py I use:

from cx_Freeze import setup, Executable

build_exe_options = {}

setup(name = "DCapp" ,
   version = "2.0" ,
   description = "" ,
   options = {"build_exe": build_exe_options},
   executables = [Executable("init_bet.py")])

And I simply build it with: python3 setup.py build

This error does NOT occur on windows! I successfully froze it on my Windows computer and transferred it to another one that has Python not installed, so it's a pure MacOS problem....

I've already tried freezing it using virtualenv as a virtual environment, I've tried adding base="Console" or base=None, I've tried including packages in the setup.py (although I don't think that would change anything), tried using cxfreeze-quickstart, but nothing works...

Help would be much appreciated! Unfortunately, installing Python on the other computer (where the binary doesn't work) is not an option for me.... Or is there any alternative/quick fix (it must work with Python 3.8)?

PerfXWeb avatar Jul 07 '20 10:07 PerfXWeb

cx_Freeze 6.2 has just been released. Please, try it out.

marcelotduarte avatar Jul 09 '20 06:07 marcelotduarte

Having a similar problem here. I'm using cx_Freeze 6.2 and while it works for me, if I rename the ~/.pyenv directory, I get an error similar to #399 As you can see from the screenshot below, it seems to take ~/.pyenv for all the paths, which may be why it's not working.

image

I'm using pyenv because when I tried with the official 3.8 installed, the generated app from cx_Freeze fails to load with this error instead : image

Is there any way to actually get a mac build working? I'm not a mac user, and spent 12 hours yesterday fixing one problem after another in trying to get this to work and I'm getting desperate. Thanks

kakaroto avatar Aug 04 '20 22:08 kakaroto

@kakaroto Can you test with the current master? pip install -U git+https://github.com/marcelotduarte/cx_Freeze.git@master

marcelotduarte avatar Aug 04 '20 23:08 marcelotduarte

Note: After doing codesign --remove-signature on the Python executable, it finally worked with the native 3.8 python. Unfortunately removing /Library/Frameworks/Python.framework directory caused it to fail loading (.app/Contents/Frameworks is empty by the way).

I've now tried master as suggested, and it works! (after manually removing Python signature with codesign, so that's still something that's missing) I do get these warnings in console now when I start it, but they seem inconsequential : image

The problem though is that when my app tries to create a Tk window, I get these new errors, which (considering they refer to library in /Library/Frameworks/Python.framework) seem to indicate the fix isn't complete unfortunately. image

I went back to trying with pyenv as well, and I still get the same error as before with it trying to reference the paths in ~/.pyenv, so that one didn't get fixed.

Thank you very much for the fast and efficient response! I hope this last hurdle with the Tcl/Tk dependencies can be fixed quickly as well 👍

EDIT: Silly me! I had installed master with pip in the official python, not in pyenv, and forgot to run pip again when I reverted to pyenv, which is why I saw no difference. I've tried master now in pyenv, and it works, including the Tk window, so all is good now for me! Thank you very much again!

kakaroto avatar Aug 04 '20 23:08 kakaroto

@kakaroto With pyenv I have information about success, using --enable-shared

marcelotduarte avatar Aug 04 '20 23:08 marcelotduarte

@marcelotduarte you probably read my response before I edited it, sorry about that! Yes, it seems to be working for me now with the pyenv environment. I haven't used --enable-shared but I had used these instructions to build it with tcl/tk support in pyenv : https://stackoverflow.com/questions/60469202/unable-to-install-tkinter-with-pyenv-pythons-on-macos

I'm rebuilding all from scratch now to test on a clean mac install just to be sure it's all working as expected.

kakaroto avatar Aug 04 '20 23:08 kakaroto

@marcelotduarte I am (for some magical reason) unable to test on a mac clean install because Mac is acting up in VirtualBox. I had someone else test my build on their machine and they reported an issue due to Tcl/Tk not being installed. I can reproduce this locally as well, if I rename /usr/local/Cellar. I've made a small PoC to reproduce this : tst.py :

from tkinter import Tk
from tkinter.filedialog import askopenfilename

t = Tk()
askopenfilename(parent=t)
t.update() 

setup.py :

import sys
from cx_Freeze import setup, Executable

executables = [
    Executable('tst.py', base=None, targetName = 'tst')
]

setup(name='tst',
      version = '0.1',
      description = 'test',
      options = {},
      executables = executables
      )

Building with python setup.py bdist_mac generates a working .app but once I rename /usr/local/Cellar, I get an error about the missing tcl/tk libraries. Note that I couldn't get the chance to test with the official Python package, but I expect the same would happen. I see that libtcl and libtk are copied into Contents/MacOS but I think the basic *.tcl library dependency files are missing. I tried changing my file chooser to use wxPython instead of tkinter, but I just get segmentation faults with wx on mac, so I've given up on that for now. Until this is fixed, at least, just requiring mac users to brew install tcl-tk is an acceptable compromise for me, though I wish it wasn't needed. Thanks

image

kakaroto avatar Aug 05 '20 22:08 kakaroto

Can you check if tcl.init is getting included in the .app bundle somewhere (or upload a copy so we can take a look). If so, I think it might be possible to fix this by replacing the options={} line with something like:

options={"build_exe": {"constants":["TCL_LIBRARY=XXXXXXXXXXX"]} }

(Where XXXXXXXXX is the appropriate relative path under Contents/MacOS)

cainesi avatar Aug 05 '20 23:08 cainesi

It doesn't look like it is, since those directories are runtime dependencies of tcl/tk. It's a good idea to do the inclusion manually and setting the environment variable as a workaround. I'll give that a try later, for now, I figured out what made wxPython crash (using window.Raise() segfaults on mac, so I removed it), and I'll test now with wxPython instead. It does require me to use the official python instead of the pyenv version since wxpython is not compatible with pyenv (🤷‍♂️) so I'll have to do a trick to remove the code signing before the dmg is created. But I think I'm getting there... finally... Thanks for all the help!

image

kakaroto avatar Aug 06 '20 01:08 kakaroto

Interestingly, it looks like there is a hook (load_tkinter) to include the tcl and tk directories in the frozen application (and then also sets the library location in BuildConstants)--but the hook will only get triggered on windows.

I wonder if the assumption, once upon a time, was that on OSX people would be using the built-in version of Tcl/Tk?

cainesi avatar Aug 06 '20 18:08 cainesi

That's most likely the cause, as tcl/tk/python comes bundled with Mac OS X as far as I know, but in this case, it's the wrong version for all 3 dependencies, which is why it's not working. I suppose it means it would be a simple fix (relatively speaking) to get it to do the same for Mac OS X.

kakaroto avatar Aug 06 '20 18:08 kakaroto

Not sure. We'd need to figure out a robust way of locating the tcl and tk libraries, if they are not in the standard spots...

cainesi avatar Aug 06 '20 19:08 cainesi

I don't understand why we have to do codesign --remove-signature on Python file into app ?

In my case, I compile a PyQt5 application into .app on Mac OsX Mojave 10.14.6 / python 3.8.6 / cx_freeze 6.3. I have to use virtualenv (It fails with conda env I don't know why but maybe I changed to many things). It works only with 3.8.6 version (other 3.8.x doesn't work, I cannot compile...)

my tests :

  • For testing only on Mac developer : python setup.py build not distributable because path not good for shared libs in executable ( to be checked with otool -L /xxxx/build/my_executable_file

  • To be deployed :

  1. python setup.py bdist_mac
  2. Don't forget to change included Python executable code signature with : codesign --remove-signature /xxxx/build/My_APP.App/Contents/MacOS/Python
  3. You can distribute your My_APP.App file
  • python setup.py bdist_dmg (doesn’t work because I dont know how to remove code signature into a DMG file)

jeugregg avatar Oct 31 '20 00:10 jeugregg

@marcelotduarte I'm using cx_freeze version 6.6 and have the exact same issue as @PerfXWeb. Is there any fix for this?

The frozen app works on my machine, but it doesn't work on other Macs because it doesn't resolve properly to the python bundled by cx_freeze.

dyld: Library not loaded: /opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.9/Python
 Referenced from: /Users/archit/Downloads/Dashboard Builds/M1 Macs/exe.macosx-11-arm64-3.9/built-app
 Reason: image not found

Any help would be appreciated.

Archit-AL avatar Jun 10 '21 14:06 Archit-AL

Can you try creating and running an app bundle instead? (Via the "bdist_mac" command.). The exe.macosx directory may well not work if you copy it to another machine.

cainesi avatar Jun 10 '21 15:06 cainesi

@cainesi The app bundle doesn't work at all, not even on my own machine. Here is my setup.py

from setuptools import find_packages
from cx_Freeze import setup, Executable
import pkg_resources
from os.path import join, basename

def collect_dist_info(packages):
    """
    Recursively collects the path to the packages' dist-info.
    """
    if not isinstance(packages, list):
        packages = [packages]
    dirs = []
    for pkg in packages:
        distrib = pkg_resources.get_distribution(pkg)
        for req in distrib.requires():
            dirs.extend(collect_dist_info(req.key))
        dirs.append((distrib.egg_info, join('Lib', basename(distrib.egg_info))))
    return dirs

options = {
    'build_exe': {
        'packages': [
            'asyncio', 'flask', 'jinja2', 'dash', 'plotly', 'pkg_resources'
        ],
        "include_files": collect_dist_info("brotli"),
        'excludes': ['tkinter']
    },
    'bdist_mac': {
        'iconfile': 'logo_new.icns'
    }
}

executables = [
    Executable('app.py',
               base=None,
               targetName='built-app', icon='logo_new.icns')
]

setup(
    name='built-app',
    packages=find_packages(),
    version='0.2',
    description='test',
    executables=executables,
    options=options
)

Archit-AL avatar Jun 10 '21 15:06 Archit-AL

What error do you get when you run the app bundle?

cainesi avatar Jun 10 '21 15:06 cainesi

@cainesi "App quit unexpectedly"

And this is an excerpt from the automated debug info generated by MacOS.

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (Code Signature Invalid)
Exception Codes:       0x0000000000000032, 0x0000000100c98000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    Namespace CODESIGNING, Code 0x2

kernel messages:

VM Regions Near 0x100c98000:
    __LINKEDIT                  100c94000-100c98000    [   16K] r--/rwx SM=COW  /Users/*/built-app-0.2.app/Contents/MacOS/lib/_json.cpython-39-darwin.so
--> mapped file                 100c98000-100c9c000    [   16K] r--/r-x SM=PRV  Object_id=4ec11347
    __TEXT                      100cc4000-100d44000    [  512K] r-x/r-x SM=COW  /usr/lib/dyld

Application Specific Information:
dyld: in dlopen()
/Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/_hashlib.cpython-39-darwin.so

Archit-AL avatar Jun 10 '21 15:06 Archit-AL

There is a regression in 6.6 that I fixed recently. Can you try it out? pip install cx-freeze==6.7b3

marcelotduarte avatar Jun 10 '21 15:06 marcelotduarte

What happens if you run it from the command line? Ie go into the app bundle / Contents / MacOS and run the main executable?

Best, Ian

On Jun 10, 2021, at 11:57 AM, Archit-AL @.***> wrote:

 @cainesi "App quit unexpectedly"

And this is an excerpt from the automated debug info generated by MacOS.

Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Exception Type: EXC_BAD_ACCESS (Code Signature Invalid) Exception Codes: 0x0000000000000032, 0x0000000100c98000 Exception Note: EXC_CORPSE_NOTIFY

Termination Reason: Namespace CODESIGNING, Code 0x2

kernel messages:

VM Regions Near 0x100c98000: __LINKEDIT 100c94000-100c98000 [ 16K] r--/rwx SM=COW /Users/*/built-app-0.2.app/Contents/MacOS/lib/_json.cpython-39-darwin.so --> mapped file 100c98000-100c9c000 [ 16K] r--/r-x SM=PRV Object_id=4ec11347 __TEXT 100cc4000-100d44000 [ 512K] r-x/r-x SM=COW /usr/lib/dyld

Application Specific Information: dyld: in dlopen() /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/_hashlib.cpython-39-darwin.so

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

cainesi avatar Jun 10 '21 16:06 cainesi

@marcelotduarte installation of this version is failing. The error is this -

ld: unknown option: -export-dynamic
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  error: command '/usr/bin/clang' failed with exit code 1
  ----------------------------------------
  ERROR: Failed building wheel for cx-freeze

Apparently, the export-dynamic flag is invalid on MacOS.

@cainesi Running the main executable from command line just outputs this -

Killed: 9

Archit-AL avatar Jun 10 '21 16:06 Archit-AL

pip install cx-freeze==6.7b4

marcelotduarte avatar Jun 10 '21 16:06 marcelotduarte

pip install cx-freeze==6.7b4

Tried it out. Bundled app still crashes with this version of cx-freeze.

Error is this -

Exception Type:        EXC_BAD_ACCESS (Code Signature Invalid)
Exception Codes:       0x0000000000000032, 0x00000001022dc000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    Namespace CODESIGNING, Code 0x2

Archit-AL avatar Jun 10 '21 16:06 Archit-AL

The note in https://github.com/marcelotduarte/cx_Freeze/issues/684#issuecomment-668882026 doesn't help? When I guess to try the beta version, is to discard this possibility. I think that Ian is the best to help you.

marcelotduarte avatar Jun 10 '21 16:06 marcelotduarte

Running otool -L on the executable gives -

built-app:
        /opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.9/Python (compatibility version 3.9.0, current version 3.9.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1775.118.101)

So the python version is being bundled correctly in lib, but is not being used.

Also, warnings of this type are generated towards the end of the build which may point to the code-signing issue.

/Library/Developer/CommandLineTools/usr/bin/install_name_tool: warning: changes being made to the file will invalidate the code signature in: /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/readline.cpython-39-darwin.so

Update:

The executable inside the .app gives the correct path for python when running otool -L. But it won't work even after code sign --remove-signature

Archit-AL avatar Jun 10 '21 16:06 Archit-AL

@Archit-AL

Okay, I do not use homebrew, but here is my guess of what is going on:

  1. Homebrew is signing the binaries that it installs (that seems to be the implication of this PR: https://github.com/Homebrew/brew/pull/9102 -- apparently a change to accommodate Big Sur requirements)
  2. When we change the dynamic linking information (necessary to freeze into an .app bundle!), that breaks the signature and results in the "EXC_BAD_ACCESS (Code Signature Invalid)" when you try to run the app.

(I emphasize: just a guess! probably >50% it's something else)

So a few questions:

  1. Are you running Big Sur?
  2. When you run "codesign --verify --verbose /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/_hashlib.cpython-39-darwin.so" does it report a signature problem?

Could you try re-signing the app with the following command, and see if it will run then. Please let me know.

codesign --deep -f -s - /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app

This would apply an ad hoc signature, so I expect will not run easily on other machines.

cainesi avatar Jun 12 '21 15:06 cainesi

@cainesi

@Archit-AL

Okay, I do not use homebrew, but here is my guess of what is going on:

  1. Homebrew is signing the binaries that it installs (that seems to be the implication of this PR: Homebrew/brew#9102 -- apparently a change to accommodate Big Sur requirements)
  2. When we change the dynamic linking information (necessary to freeze into an .app bundle!), that breaks the signature and results in the "EXC_BAD_ACCESS (Code Signature Invalid)" when you try to run the app.

(I emphasize: just a guess! probably >50% it's something else)

So a few questions:

  1. Are you running Big Sur?

Yes.

  1. When you run "codesign --verify --verbose /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/_hashlib.cpython-39-darwin.so" does it report a signature problem?

Yep. This is what it says -

built-app-0.2.app/Contents/MacOS/lib/_hashlib.cpython-39-darwin.so: invalid signature (code or signature have been modified)
In architecture: arm64

Could you try re-signing the app with the following command, and see if it will run then. Please let me know.

codesign --deep -f -s - /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app

This would apply an ad hoc signature, so I expect will not run easily on other machines.

This did not work. The following error was received -

built-app-0.2.app/: replacing existing signature
built-app-0.2.app/: bundle format unrecognized, invalid, or unsuitable
In subcomponent: /Users/archit/Dev/AL-Dashboard/build/built-app-0.2.app/Contents/MacOS/lib/jedi/third_party/typeshed/stdlib/3.7

Archit-AL avatar Jun 16 '21 10:06 Archit-AL

I either have the same or a related issue as I am getting an "image not found" when trying to run my app.

I am running cx-freeze==6.7b4 on Big Sur with python3.9 and using QT5.

My setup.py looks like:


from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["PyQt5.QtCore","PyQt5.QtGui", "PyQt5.QtWidgets"], "excludes": ["tkinter"]}

base = None
if sys.platform == "win32":
base = "Win32GUI"

setup(
name = "UVANDA",
version = "0.1",
description = "URSA UAS/CUAS UI application!",
options = {"build_exe": build_exe_options},
executables = [Executable("UVANDA", base=base)]
)

If I build normally and try to run the application, I get:

Praha:exe.macosx-10.9-x86_64-3.9 kovar$ ./UVANDA Traceback (most recent call last): File 
"/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/cx_Freeze/initscripts/__startup__.py", 
line 81, in run module.run() File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-
packages/cx_Freeze/initscripts/Console.py", line 36, in run exec(code, m.__dict__) File "UVANDA", line 14, in <module> File 
"<frozen zipimport>", line 259, in load_module File "/Users/kovar/work/UVANDA/URSA/UVANDA/Gui/UApplication.py", line 
18, in <module> from URSA.UVANDA.Windows.UAboutWindow import UAboutWindow File "<frozen zipimport>", line 259, 
in load_module File "/Users/kovar/work/UVANDA/URSA/UVANDA/Windows/UAboutWindow.py", line 21, in <module> from 
URSA.UVANDA.Gui.UWindow import UWindow File "<frozen zipimport>", line 259, in load_module File 
"/Users/kovar/work/UVANDA/URSA/UVANDA/Gui/UWindow.py", line 20, in <module> from PyQt5.QtCore import Qt 
ImportError: dlopen(/Users/kovar/work/UVANDA/build/exe.macosx-10.9-x86_64-3.9/lib/PyQt5/QtCore.so, 2): Library not 
loaded: @loader_path/../../../MacOS/../Frameworks/QtCore.framework/QtCore Referenced from: 
/Users/kovar/work/UVANDA/build/exe.macosx-10.9-x86_64-3.9/lib/PyQt5/QtCore.so Reason: image not found

If I build with bdist_dmg it seg faults in QTCore:


Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000008
Exception Note: EXC_CORPSE_NOTIFY

Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [46878]

VM Regions Near 0x8:
-->
__TEXT 109659000-10965d000 [ 16K] r-x/r-x SM=COW /Users/*/UVANDA-0.1.app/Contents/MacOS/UVANDA

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x00007fff2052e73e _CFGetNonObjCTypeID + 10
1 com.apple.CoreFoundation 0x00007fff2040a080 CFBundleCopyBundleURL + 14
2 QtCore 0x0000000109d7a6ec QLibraryInfo::location(QLibraryInfo::LibraryLocation) + 1260
3 QtCore 0x0000000109d7a93e QLibraryInfo::location(QLibraryInfo::LibraryLocation) + 1854
4 QtCore 0x0000000109ec8296 0x109d64000 + 1458838

An aside: Why do we need to do codesign --remove-signature Python and is that requirement documented?

Thank you very much.

kovar-ursa avatar Jul 07 '21 19:07 kovar-ursa

facing similar issue any solution for it would be appreciated

sai3010 avatar Jul 19 '21 17:07 sai3010

cx_Freeze 6.8b1 has just been released with fixes for pyqt5. Please, try it out and report. pip install cx-Freeze==6.8b1

marcelotduarte avatar Jul 19 '21 17:07 marcelotduarte

cx_Freeze 6.8 has just been released. Can you check if this has been resolved?

marcelotduarte avatar Sep 07 '21 06:09 marcelotduarte

Tested on 6.8 - Same issue. Runs fine on my machine, but when ported to another Mac without Python installed, no luck.

matty-articulate avatar Sep 08 '21 15:09 matty-articulate

@matty-articulate Are you using python setup.py bdist_mac to build? If you run, what is the message or traeback if you run from terminal?

marcelotduarte avatar Sep 08 '21 17:09 marcelotduarte

cx_Freeze 6.11 has just been released. pip install --upgrade cx_Freeze

Can you check if this has been resolved?

marcelotduarte avatar Jun 06 '22 14:06 marcelotduarte

Tested on cx_Freeze 6.11, not fixed.

Archit-AL avatar Jun 07 '22 11:06 Archit-AL

@Archit-AL Can you update me? Are you using python 3.9 or 3.10? Tkinter? When you install cx-freeze it install from wheels? Can you put your setup.py and traceback?

marcelotduarte avatar Jun 07 '22 14:06 marcelotduarte

Hi @marcelotduarte

I'm using python 3.9.

Basically the issue is that .app does not work at all - it says there is an issue with code signature. The standalone version works on my own machine, but when I run it on other macs, it asks to verify every single file in lib.

setup.py

from cx_Freeze import setup, Executable
import pkg_resources
from os.path import join, basename

def collect_dist_info(packages):
    """
    Recursively collects the path to the packages' dist-info.
    """
    if not isinstance(packages, list):
        packages = [packages]
    dirs = []
    for pkg in packages:
        distrib = pkg_resources.get_distribution(pkg)
        for req in distrib.requires():
            dirs.extend(collect_dist_info(req.key))
        dirs.append((distrib.egg_info, join('Lib', basename(distrib.egg_info))))
    return dirs

options = {
    'build_exe': {
        'packages': [
            'asyncio', 'flask', 'jinja2', 'dash', 'plotly', 'pkg_resources'
        ],
        "include_files": collect_dist_info("brotli"),
        'excludes': ['tkinter']
    },
    'bdist_mac': {
        'iconfile': 'logo_new.icns'
    }
}

executables = [
    Executable('app.py',
               base=None,
               targetName='app', icon='logo_new.icns')
]

setup(
    name='app',
    packages=find_packages(),
    version='1.0',
    description='app Version 1.0',
    executables=executables,
    options=options
)

Archit-AL avatar Jun 07 '22 15:06 Archit-AL