Validate resources

Short description:
Add test to validate resources definitions.
More details:
We prefer to use api_group and not api_version
This test validates that if resource can use api_group is should use it
This test validates that the resource is defined as namespaced resource or not.
What this PR does / why we need it:
Which issue(s) this PR fixes:
Special notes for reviewer:
Bug:

/approve

/verified

/approve


Fix regression where default path is no longer applied

Problem: Crumbs with no path specified does not work anymore.
This seems to have been removed in this commit.
https://github.com/chrisfarber/ember-breadcrumbs/commit/946eea4646bc1134df4c3a35e7ec74100164388f
I'm assuming it was accidental since otherwise defaultPaths is never used.

Man. This project desperately needs tests. Thanks for the pull request.


[BUG] Problem in save method

Bug in action of save method
I wanna save my document to database and use it after insert but I have problem with this situation:
This is My code
class Child(BaseModel):
    child_field: str

class Sample(Document):
    field: Dict[str, Child]

  instance1 = Sample(field={"Bar": Child(child_field="Foo")})
  print(instance1)
  await instance1.save()
  print(instance1)

Expected behavior
# first print :
id=None revision_id=None field={'Bar': Child(child_field='Foo')}
# second print:
id=ObjectId('636b9d2997bb72433b944ef4') revision_id=None field={'Bar': Child(child_field='Foo')}

But I got this:
# first print :
id=None revision_id=None field={'Bar': Child(child_field='Foo')}
# second print:
id=ObjectId('636b9d2997bb72433b944ef4') revision_id=None field={'Bar': {'child_field': 'Foo'}}

field={'Bar': {'child_field': 'Foo'}} != field={'Bar': Child(child_field='Foo')}

It's okay when I wanna fetch from db and my field filled by Child model but when I want to save to db, this situation happened!!!

Your code looks right, when you initialize the Sample document the id will be set to None. Once you call the instance.1save() attribute mongodb will automatically generate an ObjectId which is bson object. The fields inside instance1: Sample will be populated.

my question about field, It's okay about id.
field={'Bar': {'child_field': 'Foo'}} != field={'Bar': Child(child_field='Foo')}

Can you give me an explanation on why you need the object `Child?
If you really need it that way, try to have a copy of your variable before saving.
class Child(BaseModel):
    child_field: str

class Sample(Document):
    field: Dict[str, Child]

  instance1 = Sample(field={"Bar": Child(child_field="Foo")})
  copy_instance1 = instance1
  await instance1.save()

  print(copy_instance1)
  Sample(field={'Bar': Child(child_field='Foo')})
  print(instance1)
  #{'field': {'Bar': {'child_field': 'Foo'}}}

Once you call .save() it will automatically convert to to dictionary.
if you want to convert copy_instance1 to a dictionary just do copy_instance1.dict()

Ok, This is my full example:
class Child(BaseModel):
    child_field: str

class Sample(Document):
    field: Dict[str, Child]

  instance1 = Sample(field={"Bar": Child(child_field="Foo")})
  await instance1.save()
  instance1.field.child_field == "Update foo"
  await instance1.save()

I do this pattern more than once, with lot of save and update

Ok, This is my full example:
class Child(BaseModel):
    child_field: str
    def do_something(self)
         ...

class Sample(Document):
    field: Dict[str, Child]

  instance1 = Sample(field={"Bar": Child(child_field="Foo")})
  await instance1.save()
  instance1.field["Bar"].do_something()
  await instance1.save()

AttributeError: 'dict' object has no attribute 'do_something'

I do this pattern more than once, with lot of save and update

You're doing it differently, this is how you should do it:
This is just a scenario:
class Child(BaseModel):
    child_field: str

    def do_something(self)
         #capitalize
         self.child_field = self.child_field.upper()

class Sample(Document):
    field: Dict[str, Child]

  child = Child(child_field="Foo")
  # this will capitalize the child_field: str
  child.do_something()
  instance1 = Sample(field={"Bar": child})
  await instance1.save()

Initially, you wanted to process the Child class first before passing it to Sample

Anyway, this issue needs to be closed as it is not a bug from Beanie after all. My advice is to read the Pydantic documentation first and learn how it works.

I am talking about after save, your are telling me about capitalize ?
When I call save function, it changes my models and I can't work with that model

Hey,
Thank you for the catch.
The thing is dict is mutable, and it was changed during encoding (to pass a dict object to the db driver).
I'll publish the fix in ~ half an hour

Fixed in 1.15.3. @miladvayani please, try.


Fixed up some code

Added config file
Cleaned up code
Code is still messy but idc 😂

Added config file
Cleaned up code
Code is still messy but idc 😂

Thanks lol


"Open Windows Terminal Here" in the context menu is missing

Windows Terminal version (or Windows build number)
1.6.10571.0
Other Software
i am using windows 10 home 20h2
Steps to reproduce
Install Windows Terminal.
I tried to install windows terminal via released package in github, via Microsoft Store, via scoop, but they all lead to the same result.
I also tried to install the most recent pre-release version on my another computer, but that does not work either
Expected Behavior
Show the "Open Windows Terminal Here" at the same place of "Open Powershell Window Here".
Actual Behavior
I notice that v1.6.10272.0 has released the "open windows terminal here" shell extension. but i cann't find that in my context menu anywhere. The "Open Powershell Window Here" works perfectly.

The "Open in Windows Terminal" entry in the context menu will only show when you right click the blank space in the File Explorer. Can you confirm if this works?

The "Open in Windows Terminal" entry in the context menu will only show when you right click the blank space in the File Explorer. Can you confirm if this works?

I tried  both "shift + right-click" and "right-click" in my desktop and file explorer, the "open windows terminal here" is missing.
below is "right-click" in the file explorer

below is "shift + right-click" in the file explorer

below is "right-click" in the desktop

below is "shift + right-click" in the desktop (FYI, i disabled the git gui in this one, normally git gui context menu would show up here)

for me, it works, even when I right click a folder

for me, it works, even when I right click a folder

yeah, i find it weird, the "Open PowerShell window here" works just fine, the windows terminal shouldn't be like this😥

take a look here or here .
Maybe try with this small script
I hope this helps!!!

take a look here or here .
Maybe try with this small program
I hope this helps!!!

These links would definitely work, but......, actully i have waited for a few months, trying to get the official support for this function
on my computer by reinstalling windows terminal once in a while.😂
And you can see that I installed wsl2 on my computer, which has successfully added a "Open Linux Shell here" entry to my context menu.
Now I just wanna know why this context menu doesn't show up on my computer by default.
I'll try with the links if i failed to find the reason, thanks a lot!!!😁

Also FYI, you might need to reboot after installing the version of the Terminal that includes #6100. explorer.exe caches the results of context menu entries, so the Terminal won't show up when it's first updated to v1.1+

Also FYI, you might need to reboot after installing the version of the Terminal that includes #6100. explorer.exe caches the results of context menu entries, so the Terminal won't show up when it's first updated to v1.1+

ohhhh, it is the explorer cache problem! i replaced the install source to scoop every time before rebooting.
so, scoop install windows-terminal didn't get me the context menu...
thx a lot!

Sorry, this may be a scoop problem. Scoop is installing Terminal manually (!!!!!) which it should NOT HAVE DONE. When it installs Terminal manually, it is missing the entire shell extension.


Introduce "close all tabs to the right"

Having gotten used to this very handy feature in Chrome, I keep wanting to use it in VS.  It's easy to get swamped with too many tabs open, and you would like to keep a couple open rather than use the 'close all but this option'

@bmills74 Is this a VS product feedback or any docs site page you refer to?


[WIP] GPU Support in VMs

This PR adds support in vSphere CPI to attach GPU on a Esxi host as a passthrough devices onto a VM.

It currently assumes that there are no anti-affinity DRS rules set up on any cluster thus selection of a host (with GPU) for placing a vm will not fail while cloning for any affinity related reason.
It only supports GPU in passthrough(direct) mode.
It handles scenarios where some hosts in a cluster have enough available GPU but are not accessible by any datastore (otherwise accessible from the other hosts in the cluster).
It supports specifying number of GPUs required by a BOSH VM

Logic for filtering placements is in place. Logic for selecting a placement and reconfiguration of vm post creation is WIP


feat: update cardano node version

Description
This PR updates the cardano-node version that is hardcoded on /network/options
Testing
yarn test

The failing check is a false negative


[TextField] When switching to another browser tab or window and then going back, all text on TextField is selected automatically

Steps to reproduce
Could work with any text field as far as I know. Here is a dart pad : https://dartpad.dev/?id=c1df1f23d5be833eb2f45004a2c37d63&channel=main

ensure the field is focused (by clicking on it)
switch tab or window
go back to the demo tab

The whole text field content is now selected.
Expected results
The cursor stays at the same position as before, or at least not all the text is selected
Actual results
all the text is selected, leading to accidental text deletion
Code sample
Code sample
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: TextField(
          autofocus: true,
          controller: TextEditingController(
            text: 'Some text I do not people to accidentally delete',
          ),
        ),
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration
https://github.com/user-attachments/assets/89409723-0dff-47c7-b71e-ead985a97ea9

Logs
Logs
[Paste your logs here]

Flutter Doctor output
Doctor output
[✓] Flutter (Channel stable, 3.22.2, on Fedora Linux 40 (Workstation Edition)
    6.10.11-200.fc40.x86_64, locale fr_FR.UTF-8)
    • Flutter version 3.22.2 on channel stable at
      /home/thareau/Logiciels/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 761747bfc5 (il y a 4 mois), 2024-06-05 22:15:13 +0200
    • Engine revision edd8546116
    • Dart version 3.4.3
    • DevTools version 2.34.3

[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
    • Android SDK at /home/thareau/Logiciels/AndroidSdk
    • Platform android-35, build-tools 35.0.0
    • Java binary at: /usr/bin/java
    • Java version OpenJDK Runtime Environment (Red_Hat-<IP_ADDRESS>.7-2) (build
      17.0.12+7)
    • All Android licenses accepted.

[✗] Chrome - develop for the web (Cannot find Chrome executable at
    google-chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.

[✗] Linux toolchain - develop for Linux desktop
    ✗ clang++ is required for Linux development.
      It is likely available from your distribution (e.g.: apt install clang),
      or can be downloaded from https://releases.llvm.org/
    ✗ CMake is required for Linux development.
      It is likely available from your distribution (e.g.: apt install cmake),
      or can be downloaded from https://cmake.org/download/
    ✗ ninja is required for Linux development.
      It is likely available from your distribution (e.g.: apt install
      ninja-build), or can be downloaded from
      https://github.com/ninja-build/ninja/releases
    • pkg-config version 2.1.1
    ✗ GTK 3.0 development libraries are required for Linux development.
      They are likely available from your distribution (e.g.: apt install
      libgtk-3-dev)

[!] Android Studio (not installed)
    • Android Studio not found; download from
      https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup
      for detailed instructions).

[✓] IntelliJ IDEA Ultimate Edition (version 2024.2)
    • IntelliJ at
      /home/thareau/.local/share/JetBrains/Toolbox/apps/intellij-idea-ultimate
    • Flutter plugin version 81.1.3
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] Connected device (1 available)
    • Linux (desktop) • linux • linux-x64 • Fedora Linux 40 (Workstation
      Edition) 6.10.11-200.fc40.x86_64

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 3 categories.

I'm actually wondering if it is on purpose, it follows the same pattern as when a field is focused (when switching fields for example). However, it seems a bit unnatural, using regular HTML it wouldn't happen.
Even if it is on purpose, I couldn't find a way to disable this behavior. I'd be quite happy to use a specific flag or even a params to disable the behavior, either globally or per field.

I wonder if this is the culprit? https://github.com/flutter/flutter/pull/119583
Is the behavior different if the field is multiline vs. single line?

I wonder if this is the culprit? #119583
Is the behavior different if the field is multiline vs. single line?

I see the issue will not occur in multiline TextField. Looks like that is the culprit:
https://github.com/flutter/flutter/blob/389846308afd7c2ae19ecd6eaf95b32f40d09bec/packages/flutter/lib/src/widgets/editable_text.dart#L4375-L4390

@gspencergoog Is it possible to know that the browser window or tab has been focused? Not sure if you're the right person for that question but I have a vague memory of you doing app lifecycle work...

@gspencergoog Is it possible to know that the browser window or tab has been focused? Not sure if you're the right person for that question but I have a vague memory of you doing app lifecycle work...

It is the case that if you have an AppLifecycleListener, you'll get notified with an AppLifecycleState.inactive when the tab loses focus, and AppLifecycleState.resumed when it gains focus again.

I wonder if this is the culprit? https://github.com/flutter/flutter/pull/119583

https://github.com/flutter/flutter/pull/119583, is the PR which introduces this behavior for web.
https://github.com/flutter/flutter/pull/154916, is the one which replicates it for desktop.
Selecting the entire content is the expected behavior when 'tabbing' between fields but it is a wrong behavior after when regaining the focus due to a browser tab or window switch.
Based on @justinmc and @gspencergoog, I filed https://github.com/flutter/flutter/pull/156968 as a WIP to discuss a solution based on querying the resumed state.
Ideally, a more robust (but probably complex) solution would be to propagate the cause which leads to a focus change.

Fixed by https://github.com/flutter/flutter/pull/156968

Thanks @bleroux!


Fixes #372

Thanks. It's great that you say which issue you fixed, but please also give a brief description of what you did.
Did you test that all the tour stages still work properly? I remember some of them not showing when I tried fixing this.

It seems that the bug stemmed from an unnecessary tour.restart() call.
Removed it and changed the following start() to a restart().
Al stages were tested to appear in order.

We can also change it inline here directly once it's merged..

I deleted the comment manually


No Hardware Decoding

GPU:
Intel i7-7700k (HD630), NVIDIA GTX1080TI
Renamed GFX0 to IGPU, injected Intel with 0x59120003 (connector-less)
IOVARendererID presented under nvAccelerator (under PEG0@1 → IOPP → GFX0@0)
GVA info:
GVA info: Successfully connected to the Intel plugin, offline Gen95
AVDCreateGPUAccelerator: Error loading GPU renderer
VDADecoderCreate failed. err: -12473
An error was returned by the decoder layer. This may happen for example because of bitstream/data errors during a decode operation. This error may also be returned from VDADecoderCreate when hardware decoder resources are available on the system but currently in use by another process.
VDADecoderCreate failed. err: -12473

No overrides
Mac model as iMac18,3 (Board-ID: Mac-BE088AF8C5EB4FA2)
		<key>Mac-BE088AF8C5EB4FA2</key>
		<dict>
			<key>facetimeDecode</key>
			<true/>
			<key>forceOfflineRenderer</key>
			<true/>
			<key>hwe</key>
			<true/>
			<key>hweBGRA</key>
			<true/>
			<key>ke1</key>
			<true/>
			<key>pp</key>
			<true/>
		</dict>

Have shikigva=12 in boot flags (Lilu 1.2.1, NvidiaGraphicsFixup 1.2, Shiki 2.1.2)
I think it could be the same issue as https://github.com/vit9696/Shiki/issues/10 but I don't know enough so I opened a separate ticket.
Further debugging:
~
❯ DYLD_PREBIND_DEBUG=1 DYLD_SHARED_CACHE_DONT_VALIDATE=1 ~/Downloads/VDADecoderCheckerSierra
dyld: warning, unknown environment variable: DYLD_SHARED_CACHE_DONT_VALIDATE
dyld: image not prebound, so could not use prebinding in /Users/ethan/Downloads/VDADecoderCheckerSierra
dyld: image not prebound, so could not use prebinding in /Library/GPUBundles/GeForceMTLDriverWeb.bundle/Contents/MacOS/GeForceMTLDriverWeb
dyld: image not prebound, so could not use prebinding in /System/Library/Extensions/AppleIntelKBLGraphicsVADriver.bundle/Contents/MacOS/AppleIntelKBLGraphicsVADriver
GVA info: Successfully connected to the Intel plugin, offline Gen95
dyld: image not prebound, so could not use prebinding in /Library/GPUBundles/GeForceVADriverWeb.bundle/Contents/MacOS/GeForceVADriverWeb
AVDCreateGPUAccelerator: Error loading GPU renderer
VDADecoderCreate failed. err: -12473
An error was returned by the decoder layer. This may happen for example because of bitstream/data errors during a decode operation. This error may also be returned from VDADecoderCreate when hardware decoder resources are available on the system but currently in use by another process.
VDADecoderCreate failed. err: -12473

Hi, due to hardware acceleration supported on 10.13 as a mere hack it is enabled on per-process basis based on their names. VDADecoderChecker is OK, but VDADecoderCheckerSierra is not in the list. You could check the names in Patches.plist in this repo.

Oh that’s a good point. I actually knew it was per process on HS but I forgot that the download for VDADecoderChecker is different from the patches. I will rename and test this. Thanks!

Unfortunately I still have the same issue after renaming VDADecoderChecker.
❯ /Applications/VDADecoderChecker ; exit;
GVA info: Successfully connected to the Intel plugin, offline Gen95
AVDCreateGPUAccelerator: Error loading GPU renderer
VDADecoderCreate failed. err: -12473
An error was returned by the decoder layer. This may happen for example because of bitstream/data errors during a decode operation. This error may also be returned from VDADecoderCreate when hardware decoder resources are available on the system but currently in use by another process.
VDADecoderCreate failed. err: -12473

[Process completed]

Also, not sure if this is related, but when I use NvidiaGraphicsFixup.kext in my system I see:
Hardware encoding Supported: NO in MacX Video Converter Pro. When removing NvidiaGraphicsFixup I see Hardware Encoding Supported: YES. So it seems that injection of IOVARendererID in nvAccelerator (or some other aspect of NvidiaGraphicsFixup causes Quick Sync issues whereas removal fixes them. Is it easy to patch IOVARendererID without NvidiaGraphicsFixup or is it best to try to achieve working hardware encoding / decoding with NvidiaGraphcisFixup present?

I did some further digging and found a related thread that mentions the loss of Quick Sync when using IOVARendererID injection through NvidiaGraphicsFixup. I was able to confirm that I am able to get Quick Sync back with shikivga=12,ngfxpatch=pikera,-ngfxnovarenderer but I still have the same error from VDADecoderChecker leaving me unsure whether hardware decoding is working properly. See https://sourceforge.net/p/nvidiagraphicsfixup/tickets/3/ for further info.
Is there anything else I can provide you @vit9696 to aid in debugging?

Now that you said it I realised that you have iMac18,3 model. And this model does not have forceBoostOff in Info.plist. This property is required for nvidia from what I remember. Make an AppleGVA.framework backup and add it with true value.
If it works, will see what I can do to make it work without file invasion. You are the second person asking for forceBoostOff...

@vit9696 I attempted using your patched Shiki framework. How can I confirm whether or not it properly added forceBoostOff? I still have the same error from VDADecoderChecker.

I do not think there is a way without running a debugger, if you still have an error it is worth trying to patch AppleGVA.framework itself or change your macmodel to NVIDIA e.g. iMac14,2.
I could inagine myself forgetting to make a target list for the chane in the uploaded kext.

After manually patching AppleGVA.framework and reverting to Shiki 2.1.2 (built myself) I get VDADecoderChecker pass.
❯ /Applications/VDADecoderChecker ; exit;
GVA info: Successfully connected to the Intel plugin, offline Gen95
Hardware acceleration is fully supported

[Process completed]

So I guess we need to upgrade your patch to include iMac18,3 in the target list.

Egh, I rechecked everything and it is very strange. I uploaded the latest sources of Shiki to github. Please make a debug log with Shiki and Lilu with shikigva=48 (-shikidbg -liludbg). To be honest, I expected it to work just fine. Also, it may well be a good idea to try 10.12 with the same configuration.
If you are familiar with debugging, I guess you could try running VDADecoderChecker and see if forceBoostOff in AppleGVA.framework is replaced with ke1. If not… we could try to make something up…

Using https://github.com/vit9696/Shiki/commit/92a0f39acfbac5a06b1b4ebcdfb22955e92011cd withshikigva=48 -shikidbg -liludbg I get VDADecoderChecker failure. Seems to be the same as with unpatched AppleGVA.framework.
Attached logs as requested. Anything else I can do to help?
shiki.log
If you are familiar with debugging, I guess you could try running VDADecoderChecker and see if forceBoostOff in AppleGVA.framework is replaced with ke1
Not really sure where to get started with that request. Run VDADecoderChecker in debug on Xcode?

Actually maybe I didn't understand. I just checked /System/Library/PrivateExtensions/AppleGVA.framework/Resources/Info.plist and
                <key>Mac-BE088AF8C5EB4FA2</key>
                <dict>
                        <key>facetimeDecode</key>
                        <true/>
                        <key>forceOfflineRenderer</key>
                        <true/>
                        <key>forceBoostOff</key>
                        <true/>
                        <key>hwe</key>
                        <true/>
                        <key>hweBGRA</key>
                        <true/>
                        <key>ke1</key>
                        <true/>
                        <key>pp</key>
                        <true/>
                </dict>

So it looks like injection did occur but VDADecoderChecker fails without manual patching.

I checked the debug log and saw nothing. Did you even attempt to run VDADecoderChecker before saving the log? It is not supposed to patch the Info.plist, but it should replace forceBoostOff with ke1 in AppleGVA binary.
If you run lldb on VDADecoderChecker and then use memory find to find something like preferredBGRA you will see something close to the following in hexdump:
00000000000ddb18                        db         "preferredBGRA", 0
00000000000ddb26                        db         "", 0
00000000000ddb27                        db         "", 0
00000000000ddb28                        db         "", 0
00000000000ddb29                        db         "", 0
00000000000ddb2a                        db         "", 0
                                    aForceboostoff:
00000000000ddb2b                        db         "forceBoostOff", 0           ;this one should be replaced by ke1
                                    aInterlacedoff:
00000000000ddb39                        db         "interlacedOff", 0

Ugh, just realised what the issue is. It is a CFString, not a C string, which makes it have a size. As a result even after I patch the underlying content to be shorter, it still fails to find the value, because it is remains 13 symbols long instead of 3, and due to dyld shared cache having different string offsets the actual location will be very uneasy to find.
I am afraid the best approach for nvidia is to use a 14,2 mac model. But I have an idea to try patching board-id in AppleGVA itself. If it works one could select the model for AppleGVA but not for the rest of the system. Give it a try? Same flags (shikigva=48), and I need the debug log (-shikidbg -liludbg) with Shiki output in it as well. The last log was Lilu-only.
2.1.3 (DEBUG) r2.zip

Thanks for all your work on this!

[shiki.log](https://github.com/vit9696/Shiki/files/1489503/shiki.log)

Well, the log looks to me (at least the stuff that is present in it). Did this actually work for you?

No it doesn't work unfortunately. Are you expecting more output in the logs? The logs I provided are after a run of VDADecoderCheck. The output is still AVDCreateGPUAccelerator: Error loading GPU renderer

Yes, I did expect more output, but the issue is that most likely macOS eats a large amount of them.
I think that you might have dyld shared cache invalidated after manually patching AppleGVA.
Consider disabling Shiki, rebuilding the cache, and trying again. Or maybe use a clean os. I do not see a reason for this to fail.
If it still fails I guess I will try to check it out tomorrow myself under a debugger.

Thanks again for digging deeper. Just to make sure I did the following:

Remove Shiki.kext and reboot
Ran

sudo su
update_dyld_shared_cache -force

Put back Shiki.kext and reboot

I did notice something curious in the Lilu logs. Not sure if it's related.
2017-11-20 21:36:41.102525-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) patch for /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox in 7FFF33B88000 7FFF33F01000
2017-11-20 21:36:41.102531-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) done reading patches for 4962E
2017-11-20 21:36:41.102535-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) patch for /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox in 7FFF33B88000 7FFF33F01000
2017-11-20 21:36:41.102540-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) done reading patches for 49683
2017-11-20 21:36:41.102544-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) patch for /System/Library/PrivateFrameworks/AppleGVA.framework/Versions/A/AppleGVA in 7FFF3723E000 7FFF37321000
2017-11-20 21:36:41.102548-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) done reading patches for D19BE
2017-11-20 21:36:41.102552-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) patch for /System/Library/PrivateFrameworks/AppleGVA.framework/Versions/A/AppleGVA in 7FFF3723E000 7FFF37321000
2017-11-20 21:36:41.102556-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) done reading patches for C7D2C
2017-11-20 21:36:41.436324-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 0 of<PHONE_NUMBER>202020
2017-11-20 21:36:41.436329-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 1 of<PHONE_NUMBER>202020
2017-11-20 21:36:41.436334-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) failure not matching 2 of 10000434E435600 to expected<PHONE_NUMBER>202020
2017-11-20 21:36:44.112864-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 0 of 3D20657079742074
2017-11-20 21:36:44.112869-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 1 of 4C5F454D41524620
2017-11-20 21:36:44.112874-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 2 of 4553555F4C455645
2017-11-20 21:36:44.112877-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 3 of A415441445F52
2017-11-20 21:36:44.112884-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found what we are looking for 62 6F 61 72 64 2D 69 64
2017-11-20 21:36:44.112888-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) restored write permssions
2017-11-20 21:36:44.194331-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 0 of<PHONE_NUMBER>202020
2017-11-20 21:36:44.194336-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 1 of<PHONE_NUMBER>202020
2017-11-20 21:36:44.194340-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 2 of<PHONE_NUMBER>202020
2017-11-20 21:36:44.194343-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found a possible match for 3 of<PHONE_NUMBER>202020
2017-11-20 21:36:44.194351-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) found what we are looking for 0 6B 65 31 0 FF FF FF
2017-11-20 21:36:44.194355-0500  localhost kernel[0]: (kernel) Lilu:    user @ (DBG) restored write permssions

Hm, sorry, just realised that I gave you the wrong boot arg. Forgot that you have nvidia 1080, should be shikigva=60 of course (4 for compatible renderer, 8 for vda whitelist, 16 to fix iTunes crashes, and 32 to replace the board id).

It is working now as far as I can tell. I have the same behavior as manual GVA patch.

Good. Now let's get that chromium issue resolved. Please tell me whether the hacks are actually needed (and work) in Shiki for chromium/chrome.

@vit9696 FYI hardware decoding stopped working when I updated to 10.13.2.

@esetnik hi, ugh, the code does not look like it changed anyhow.
Please create a new issue and attach a debug log with the latest Shiki.
Also, I may want the output of VDADecoderChecker.

Hi, my config is similar, i7 7700 (non-k), GTX1060 as primary (DP as output), but I cant get QuickSync and hw encode/decode to work. Attaching my configs output files from relevant sources + my EFI folder. Can someone give me advice on how to enable HW encode/decode with my config? Thanks!
report_Clover_EFI.zip


Assertions are slow when running on Windows with a debugger attached

Description
Assertions are slow when running on Windows with a debugger attached.
The reason is the unconditional call of OutputDebugStringA which takes a comparatively very long time when a debugger is attached.
In my case the difference in execution time was dramatic. E.g. one test took over a minute when started from the IDE (with the debugger attached), while it takes less than a second when running without a debugger (same Debug build).
Also, in Visual Studio, the frequent calls of OutputDebugStringA with an empty string seem to overflow some buffer every now and then - Visual Studio periodically prints *** Output truncated by debugger *** in the debug window.
When I added a check so that OutputDebugStringA is only called when there's actually something to print, the execution time went down to about the time when running without a debugger (< 1 second in my case) -- and the *** Output truncated by debugger *** messages are gone too.
I've prepared a pull request.
Steps to reproduce

Write a simple test that does a lot of assertions (100k+) in otherwise trivial & fast code.
Compile for Windows with Visual Studio, Debug configuration
Start outside of Visual Studio without any debugger attached
Start from inside Visual Studio with debugger attached

Extra information

doctest version: v2.4.3
Operating System: Windows 10 x64 1909
Compiler+version: Visual Studio 2019 16.8.6
Configuration: x64-Debug

The windows-2016-gcc and windows-2019-gcc tests fail because the package http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-expat-2.2.9-1-any.pkg.tar.xz is no longer available. Unfortunately I have no idea where those tests are defined, so I also don't know how (where) to fix it.

I'm closing this as it has already been fixed (again thanks for reporting) - will release an official version soon!

Sure! Thanks for the library :)


Any way to check if the usage is supported on native platforms?

Description
I'm using NativeWind to build iOS and Android apps and have noticed significant differences between web and native platforms. I want to identify all the incompatible usages so that I can address them.
Expected behavior
A tool or plugin to identify all "Web only" usages in the project.
Screenshots

This is a oss project build the tool or plugin and contribute.


feat: read cells-per-row option.

Fixes #99

Hi @icio ! Thank you for this feature work. Would you please open an issue to correspond to this work? Thank you.

@telpirion Done: #99. Referenced from the PR description.

Worth retrying?

@telpirion Merge conflict resolved so this might be good to go now.


change card rendering - any tNote check whose reference contains the current bcv will be included in the tN cards for current verse

(see useTsvItems.getTsvItems() in tHelps-rcl).
The card and current item that is in focus determines what is shown in the scripture pane.
DoD:
If the user chooses a verse that has a TNs with a reference range that includes that verse, that TN will be displayed.
Details:
Chris H and Abel did similar lookup work in tCC.

Notes:

it looks like the fix needs to be in  useTsvItems.getTsvItems() in the tHelps-rcl.
also will have to pull in  bible-reference-range which has a method doesReferenceContain() that can be used to see if current chapter:verse is contained in the ref which could be a reference range.

test procedure

the fixes are in gatewayEdit in v1.2.0 build 9ebcb5b
test in unfoldingword org - en - PHP - 1:15
open tcCreate production - unfoldingword org - -tN- en - PHP - 1:15
edit the first note and change the reference to 1:14-18 and put some Greek words in the quote

screenShot 1

save the changes
open gatewayedit
select unfoldingword org - en - PHP - 1: 15 and you should see all the verses from 14 to 18 such as below.
screenshot 2

@elsylambert

Looks good in v1.2.0 build 9ebcb5b

Looks good and is working properly. Tested with v1.2.0 build 1f1cfb0 QA.


This is not really useful in any way in it's current form (String obfuscation).

In it's current form, the string obfuscation is pretty useless. I was lead to this after reversing a js program and seeing this inside the package.json.
How to use:
Simply open the script in a node.js environment with a seperate console window.
Paste this code inside it and replace 'scriptinquestion.js' with the js file you are running:

fs.readFile('scriptinquestion.js', 'utf8', (err, data) => {
    let str = data.substring(data.indexOf("_0x"));
    while (str) {
        for (let start = 0; start < 15; start++) {
            if (str[start] === '=') {
                for (let eol = 0; eol < 15; eol++) {
                    if (str[start + eol] === ',' || str[start + eol] === ';') {
                        let first = str.substring(0, start - 1);
                        let second = str.substring(start + 2, start + eol);

                        let callStr = str.substring(0, start + eol + 1);

                        console.log("first:" + first + ", second:" + second + " from: " + callStr);

                        if (second.startsWith("_0x")) {
                            remaps.push({from: first, to: second});
                        }

                        break;
                    }
                }
            }
        }

        let strIndex = str.substring(10).indexOf("_0x");
        if (strIndex !== -1) {
            str = str.substring(strIndex + 10);
        } else {
            break;
        }
    }

    str = data.substring(data.indexOf("_0x"));

    for (let index in remaps) {
        let remap = remaps[index];
        console.log("remap " + remap.from + "," + remap.to);
    }

    let newString = data;

    while (str) {
        for (let openBracket = 0; openBracket < 10; openBracket++) {
            if (str[openBracket] === '(') {
                for (let closeBracket = 0; closeBracket < 8; closeBracket++) {
                    if (str[openBracket + closeBracket] === ')') {
                        let callStr = str.substring(0, openBracket + closeBracket + 1);
                        let originalCallStr = callStr;

                        // chained obfuscation.
                        for (let i = 0; i < 3; i++) {
                            for (let index in remaps) {
                                let remap = remaps[index];
                                callStr = callStr.replace(remap.from, remap.to);
                            }
                        }

                        if (callStr.includes("!")) break;

                        let result = eval(callStr);

                        console.log("found call:" + callStr + " eval: " + result);

                        newString = newString.replace(originalCallStr, "'" + result + "'");

                        break;
                    }
                }
            }
        }
        let strIndex = str.substring(10).indexOf("_0x");
        if (strIndex !== -1) {
            str = str.substring(strIndex + 10);
        } else {
            console.log(newString);
            fs.writeFile("out.js", newString, function (err) {
                process.exit(-1);
            });
            return;
        }
    }
    process.exit(-1);
})

How does this work?
It simply evaluates inside the scripts context (after you run it), finds strings in sourcecode and simply evaluates them in-place. There (should) be virtually no way to block eval effectively.
How would I defend against this attack?
I am not am not knowledgeable in javascript, however, I would include a rolling number to encrypt and decrypt array offsets at function start and end with a call stack analysis, I would first execute the script and analyze which functions call what by adding start and end loggers to each function which would generate something like this.
a() calls b() calls c()
that means that it would have to call a() deobfuscation and then b() deobfuscation for the string offsets in order to be able to eval the strings inside function c().
This would make it extremely time-consuming as you would have to use a debugger, which this obfuscator already provides protection against. While it would still be possible to add in logstart and logend to just run the program to generate your own call stack, it could still be improved in a way which would trigger other protections unlike the one I specified above.
Closing notes:
I do understand that javascript has it's limits, however, currently this offers near zero protection. This is just an example, you can apply the same concept to remove opaque predicates(dead code), string splitting and what-not.

Your code does not work even for simple obfuscated code:
var _0x10ea = [
    'log',
    'foo',
    'bar',
    'baz'
];
console[_0x30d2(0x1a5)](_0x30d2(0x1a6));
function _0x30d2(_0x472b23, _0x10eaa4) {
    _0x30d2 = function (_0x30d28b, _0x12949e) {
        _0x30d28b = _0x30d28b - 0x1a5;
        var _0x7311bb = _0x10ea[_0x30d28b];
        return _0x7311bb;
    };
    return _0x30d2(_0x472b23, _0x10eaa4);
}
console[_0x30d2(0x1a5)](_0x30d2(0x1a7));
console[_0x30d2(0x1a5)](_0x30d2(0x1a8));

I Will keep it open for the next few days, I want to see a working code that can deobfuscate the current obfuscator.io obfuscated code.

var _0x10ea = [
    'log',
    'foo',
    'bar',
    'baz'
];
console['log']('foo');
function _0x30d2(_0x472b23, _0x10eaa4) {
    _0x30d2 = function (_0x30d28b, _0x12949e) {
        _0x30d28b = _0x30d28b - 0x1a5;
        var _0x7311bb = _0x10ea[_0x30d28b];
        return _0x7311bb;
    };
    return _0x30d2(_0x472b23, _0x10eaa4);
}
console['log']('bar');
console['log']('baz');

let remaps = []

let fs = require('fs');

fs.readFile('sample.js', 'utf8', (err, data) => {
    let str = data.substring(data.indexOf("_0x"));
    while (str) {
        for (let start = 0; start < 15; start++) {
            if (str[start] === '=') {
                for (let eol = 0; eol < 15; eol++) {
                    if (str[start + eol] === ',' || str[start + eol] === ';') {
                        let first = str.substring(0, start - 1);
                        let second = str.substring(start + 2, start + eol);

                        let callStr = str.substring(0, start + eol + 1);

                        console.log("first:" + first + ", second:" + second + " from: " + callStr);

                        if (second.startsWith("_0x")) {
                            remaps.push({from: first, to: second});
                        }

                        break;
                    }
                }
            }
        }

        let strIndex = str.substring(10).indexOf("_0x");
        if (strIndex !== -1) {
            str = str.substring(strIndex + 10);
        } else {
            break;
        }
    }

    str = data.substring(data.indexOf("_0x"));

    for (let index in remaps) {
        let remap = remaps[index];
        console.log("remap " + remap.from + "," + remap.to);
    }

    let newString = data;

    while (str) {
        for (let openBracket = 0; openBracket < 10; openBracket++) {
            if (str[openBracket] === '(') {
                for (let closeBracket = 0; closeBracket < 8; closeBracket++) {
                    if (str[openBracket + closeBracket] === ')') {
                        let callStr = str.substring(0, openBracket + closeBracket + 1);
                        let originalCallStr = callStr;

                        // chained obfuscation.
                        for (let i = 0; i < 3; i++) {
                            for (let index in remaps) {
                                let remap = remaps[index];
                                callStr = callStr.replace(remap.from, remap.to);
                            }
                        }

                        if (callStr.includes("!")) break;

                        let result = eval(callStr);

                        console.log("found call:" + callStr + " eval: " + result);

                        newString = newString.replace(originalCallStr, "'" + result + "'");

                        break;
                    }
                }
            }
        }
        let strIndex = str.substring(10).indexOf("_0x");
        if (strIndex !== -1) {
            str = str.substring(strIndex + 10);
        } else {
            console.log(newString);
            fs.writeFile("sample-out.js", newString, function (err) {
                process.exit(-1);
            });
            return;
        }
    }
    process.exit(-1);
})

...?

Additional node:
local variable redefinition such as:
let _0x1 = _0x2;_0x1(0x0) will be resolved as _0x2(0x0)

Yeah, I see.
eval within the obfuscated code context can show original values, but for this cases, I added more variants with
  stringArrayWrappersCount: 1,
  stringArrayWrappersChainedCalls: true,
  stringArrayWrappersParametersMaxCount: 2,
  stringArrayWrappersType: 'variable',

options.
Right now your example is very code-specific, it won't work with many cases of obfuscated code (chained calls, mangled generator).
Please try to adapt your code for this:
var R = [
    '2UMhYCy',
    '6BELvZn',
    '880870EQpTQx',
    'Hello\x20World!',
    '1291816wjtjst',
    '955419bgVbuD',
    '3554872eQPmKA',
    'log',
    '1TyirKR',
    '820514hhyTRn',
    '194869hEPSJu',
    '1YaWnoo',
    '530177wNNdlJ'
];
(function (x, z) {
    var l = function (x, z, X, c, Z) {
        return B(Z - 0x39a, z);
    };
    var d = function (x, z, X, c, Z) {
        return B(Z - 0x39a, z);
    };
    while (!![]) {
        try {
            var X = -parseInt(l(0x4b0, 0x4b1, 0x4ae, 0x4b6, 0x4b0)) * parseInt(l(0x4b3, 0x4ae, 0x4ab, 0x4a9, 0x4ac)) + parseInt(d(0x4b1, 0x4ad, 0x4aa, 0x4b0, 0x4ab)) * parseInt(l(0x4a6, 0x4ad, 0x4ac, 0x4b0, 0x4ad)) + parseInt(l(0x4b0, 0x4b0, 0x4ba, 0x4b7, 0x4b7)) * -parseInt(l(0x4af, 0x4b5, 0x4bb, 0x4b5, 0x4b4)) + -parseInt(d(0x4b6, 0x4b0, 0x4aa, 0x4ad, 0x4af)) * parseInt(d(0x4aa, 0x4b1, 0x4aa, 0x4ad, 0x4ae)) + parseInt(l(0x4b4, 0x4ac, 0x4ae, 0x4ae, 0x4b1)) + -parseInt(d(0x4b8, 0x4b6, 0x4b5, 0x4b4, 0x4b3)) + parseInt(l(0x4ba, 0x4b1, 0x4b2, 0x4b2, 0x4b5));
            if (X === z) {
                break;
            } else {
                x['push'](x['shift']());
            }
        } catch (c) {
            x['push'](x['shift']());
        }
    }
}(R, 0xbe4bd));
function hi() {
    var n = function (x, z, X, c, Z) {
        return B(x - -0x172, X);
    };
    var i = function (x, z, X, c, Z) {
        return B(x - -0x172, X);
    };
    console[n(-0x56, -0x5a, -0x50, -0x5a, -0x5c)](i(-0x5a, -0x5d, -0x57, -0x53, -0x5e));
}
function B(x, z) {
    B = function (X, c) {
        X = X - 0x111;
        var l = R[X];
        return l;
    };
    return B(x, z);
}
hi();

I want to see, how this code will look like, to collect more information.
But in general, I have to think about how to prevent code evaluation within the obfuscated code context.
For example, we can break eval (with a new option, for example).

For the specified example, I'll just have to build regex for pattern matching string obfuscation, for local evaluation I would just throw the entire local variable into eval instead of replace(). I'll see how difficult this is to write it out in code, currently have other work, but from initial view it doesn't look too hard.
As I said, breaking eval the best way is to turn it into a somewhat "virtual machine", that means that there is a virtual context floating every time that a string is referenced. The virtual context allows you to add things such as:
context.mode = 0x1234;
methods[make_string()](); // calls some_function();

function some_function() {
  context.mode |= 0x4020;
  ... some strings ..
}

We can't just shift array based on function calls graph, because mostly js code is not evaluated linearly.

Did you mean something like this?:
var _0xc1ed = [
	'log',
	'foo',
	'bar',
	'baz'
];
var mode = 0;
var lastOp = +1;

function _0x2b5c(_0x273bd6, _0xc1edef) {
	return _0x2b5c = function (_0x2b5c74, _0x53f2af) {
		_0x2b5c74 = _0x2b5c74 - 0xaa - mode;
		var _0x1184c5 = _0xc1ed[_0x2b5c74];
		return _0x1184c5;
	}, _0x2b5c(_0x273bd6, _0xc1edef);
}

function foo() {
	var modifier = 5 * lastOp;
	lastOp = -lastOp;
	mode += modifier;
	var _0x435306 = _0x2b5c;
	console[_0x435306(0xaa + mode)](_0x435306(0xab + mode));
}

function bar() {
	var modifier = 17 * lastOp;
	lastOp = -lastOp;
	mode += modifier;
	var _0x25919c = _0x2b5c;
	console[_0x25919c(0xaa + mode)](_0x25919c(0xac + mode));
}

function baz() {
	var modifier = 233 * lastOp;
	lastOp = -lastOp;
	mode += modifier;
	var _0x25919c = _0x2b5c;
	console[_0x25919c(0xaa + mode)](_0x25919c(0xad + mode));
}

foo();
bar();
baz();
foo();
bar();
baz();

Something like that, would have to analyze control flow for that thought which can be rather difficult and can break easily, but for those you would just fall back to non control flow string obfuscation.

The problem with the example above is that we can replace with RegExp constructions like 0xaa + mode just on raw 0xaa and replace _0x2b5c74 = _0x2b5c74 - 0xaa - mode; just on raw _0x2b5c74 = _0x2b5c74 - 0xaa; and it will work as before.

I was thinking of having a branched execution context (similar to stack) where the values would not even be resolvable until they are reached. I will make an example of how it would possibly work when I finish whatever I am working on right now.

Also, your deobfuscator will be completely useless with
stringArrayWrappersType: 'function'
and
stringArrayWrappersChainedCalls: true
Because each intermediate function shifts index based on the previous intermediate function.

var a = [
    '24137SbXvep',
    '1YNxjQz',
    '1DxvZEK',
    'baz',
    'bar',
    '327059dVGLDp',
    '459181nTxxUm',
    '1332619KTcEhN',
    '1iAlPAm',
    'foo',
    '30STvubf',
    '10NKUsGD',
    '102582MItdGI',
    '785941QKWpvE',
    'log',
    '556444KFIGcH'
];
function b(c, d) {
    b = function (e, f) {
        e = e - 0x147;
        var g = a[e];
        return g;
    };
    return b(c, d);
}
(function (c, d) {
    var g = function (c, d) {
        return b(d - 0x393, c);
    };
    var h = function (c, d) {
        return b(d - 0x393, c);
    };
    while (!![]) {
        try {
            var e = -parseInt(g(0x4e4, 0x4e7)) * parseInt(h(0x4e4, 0x4e5)) + parseInt(g(0x4e7, 0x4e9)) * parseInt(h(0x4d9, 0x4df)) + -parseInt(h(0x4d9, 0x4de)) + parseInt(g(0x4d8, 0x4dc)) + -parseInt(g(0x4e1, 0x4da)) * -parseInt(g(0x4de, 0x4db)) + parseInt(g(0x4d9, 0x4e1)) * parseInt(g(0x4eb, 0x4e4)) + -parseInt(g(0x4e7, 0x4e0)) * parseInt(h(0x4e3, 0x4e6));
            if (e === d) {
                break;
            } else {
                c['push'](c['shift']());
            }
        } catch (f) {
            c['push'](c['shift']());
        }
    }
}(a, 0x7da7e));
function foo() {
    var i = function (c, d) {
        return b(d - -0x277, c);
    };
    var j = function (c, d) {
        return b(d - -0x277, c);
    };
    console[i(-0x12d, -0x12d)](i(-0x11d, -0x122));
    function c() {
        var k = function (c, d) {
            return j(c, d - -0x28c);
        };
        var l = function (c, d) {
            return j(c, d - -0x28c);
        };
        console[k(-0x3bb, -0x3b9)](k(-0x3b9, -0x3b3));
        function d() {
            var m = function (c, d) {
                return l(d, c - 0xe);
            };
            var n = function (c, d) {
                return k(d, c - 0xe);
            };
            console[m(-0x3ab, -0x3a7)](m(-0x3a6, -0x3a9));
        }
        d();
    }
    c();
}
foo();

This actually works for previous example even better with a proper regex and function / variable recognition.
Also to keep in mind, can1357 made an entire deobfuscator for assembly that reverses everything that vmprotect does, however, it took him years to do so, this just needs to get to a point where someone with enough js knowledge still would not be able to do this in less than a couple of hours and would take at-least a day.
As I said, hopefully I will find time this weekend to draw up a theoretical solution that would accomplish just that :)
One change instead of remapping we just redefine locals as globals since that is the same vulnerability as the last example had, except I just used replace since they were not functions, this would work even better just requires renaming globals into tmp_<global_name> and a regex to find variables / functions to push into global scope, this is hard coded for the sole reason so that people can't just copy paste.
Code:
let fs = require('fs');

// let's not make it *that* easy for people to copy paste alright?
function findNextFunc(str) {
    if (str.indexOf("= function") !== -1) return str.substring(str.indexOf("= function"));
    return undefined;
}

// let's not make it *that* easy for people to copy paste alright :)?
function findNext(str) {
    let i = str.indexOf("i(");
    let k = str.indexOf("k(");
    let m = str.indexOf("m(");
    if (i < k && i < m) return str.substring(i);
    if (k < i && k < m) return str.substring(k);
    if (m < i && m < k) return str.substring(m);
    return undefined;
}

fs.readFile('sample.js', 'utf8', (err, data) => {

    // globalize locals, ideally would rename and store it in some map to prevent globals collision

    let str = findNextFunc(data);

    while (str) {
        let index = data.indexOf(str);
        for (let openBracket = 0; openBracket < 30; openBracket++) {
            if (str[openBracket] === '{') {
                for (let closeBracket = 0; closeBracket < 100; closeBracket++) {
                    if (str[openBracket + closeBracket] === '}') {
                        let callStr = "var " + data[index - 2].substring(0, 1) + " " + str.substring(0, openBracket + closeBracket + 1);
                        //                     ^ scan backwards until var is found for actual tool.

                        console.log("calling: " + callStr);

                        eval(callStr);

                        break;
                    }
                }
            }
        }
        let nextStr = findNextFunc(str.substring(10));
        if (nextStr) {
            str = nextStr;
        } else {
            break;
        }
    }

    // deobfuscate

    str = findNext(data);
    let newString = data;

    while (str) {
        for (let openBracket = 0; openBracket < 10; openBracket++) {
            if (str[openBracket] === '(') {
                for (let closeBracket = 0; closeBracket < 30; closeBracket++) {
                    if (str[openBracket + closeBracket] === ')') {
                        let callStr = str.substring(0, openBracket + closeBracket + 1);
                        let originalCallStr = callStr;

                        if (callStr[2] === "\"") break;

                        try {
                            console.log("found call: " + callStr)

                            let result = eval(callStr);

                            console.log("eval: " + result);

                            newString = newString.replace(originalCallStr, "'" + result + "'");
                        } catch (e) {
                            // invalid call
                        }

                        break;
                    }
                }
            }
        }
        let nextStr = findNext(str.substring(10));
        if (nextStr) {
            str = nextStr;
        } else {
            //console.log(newString);
            fs.writeFile("sample-out.js", newString, function (err) {
                process.exit(-1);
            });
            return;
        }
    }
    process.exit(-1);
})

result + ran intelliJ idea tool called code cleanup 5 times to remove any dead and unused variables:
function foo() {
    console['log']('foo');
    function c() {
        console['log']('bar');
        function d() {
            console['log']('baz');
        }
        d();
    }
    c();
}
foo();

function a(stack, func, arg0, arg1, arg2, arg3, arg4) {
    return func(stack, arg0, arg1, arg2, arg3, arg4);
}

let decrypt = function(arg0, stack0) {
    // here we would use arguments in the stack to decrypt whatever we are trying to access, we can use function name, size and other variables.
    return arg0;
}

let s_2 = function (arg0) {
    return arg0[arg0.length - 1];
}

let z_1 = function (stack) {
    return decrypt(console, stack);
}
let z_2 = function (stack) {
    return decrypt('log', stack);
}
let z_3 = function (stack) {
    return decrypt('foo', stack);
}
let z_5 = function (stack, func) {
    return func(s_2(stack));
}
let z_6 = function (func) {
    return func();
}

function do_something() {
    const stack = [];

    function _0() {
        function _1() {
            a(stack, z_1)[a(stack, z_2)](a(stack, z_3))
        }

        stack.push(_1);
        a(stack, z_5, z_6);
        stack.pop();
    }

    stack.push(_0);
    a(stack, z_5, z_6)
    stack.pop();
}

do_something();

A simple concept I came up with, this would make running eval very difficult as we would have to find the entire path that the codeflow takes and the javascript stack is very confusing as all the parameters are abstracted away. However, this does have the vulnerability of just adding console.log to various stages of the z_* calls and rebuilding what it does essentially getting a:
console
log
foo

output, however, that can be some-what protected against by having random junk code all over the place which tests 2 identical functions for modification randomly through the code and gives a fighting chance against it. Obfuscating a larger js file with this would most likely make me give up on static analysis and would just use a debugger with some kind of a bypass against detection.

@DeprecatedLuke thank you for examples

Released 2.16.0 with some improvements of stringArrayWrappersType: 'function'.
Anyway now i have to think about how to implement something that will defend against moving wrappers and calls to the global scope.
The problem is that your example works fine but this is a very small example, for a feature I have to think about some algorithm that will work with any code and can't break with asynchronous code. And this algorithm should be done through AST-traversing.

Well, it would remain function-scoped so it avoids any asynchronous issues since callbacks are new functions altogether.
With the original code, I was working with a ~3.5k line file and it doesn't have to work perfectly, just good enough, although since it had one of the weaker options it worked on the entire file.

What about something like this?
(function (i, j) {
    var q = {
        r: '227',
        t: '511',
        u: '0x1f7',
        v: '510',
        w: '0x1fb',
        x: '0x1f9',
        y: '502',
        z: '499',
        A: '509'
    };
    var k = i();
    function n(i, j) {
        return b(i - q.r, j);
    }
    while (!![]) {
        try {
            var l = parseInt(n(q.t, '0x1ff')) / 0x1 + parseInt(n(q.u, q.v)) / 0x2 + -parseInt(n(0x1fe, q.w)) / 0x3 * (parseInt(n(q.x, 0x1f9)) / 0x4) + parseInt(n('0x1f4', '0x1f3')) / 0x5 * (-parseInt(n(q.y, '0x1f9')) / 0x6) + parseInt(n('0x1f5', q.z)) / 0x7 + parseInt(n(0x1fb, 0x1fa)) / 0x8 * (-parseInt(n(0x1f8, 0x1fd)) / 0x9) + -parseInt(n(0x1fa, q.A)) / 0xa;
            if (l === j) {
                break;
            } else {
                k['push'](k['shift']());
            }
        } catch (m) {
            k['push'](k['shift']());
        }
    }
}(a, 0x628c8));
function b(c, d) {
    var e = a();
    b = function (f, g) {
        f = f - 0x110;
        var h = e[f];
        return h;
    };
    return b(c, d);
}
function p(i, j) {
    var B = { C: '242' };
    return b(j - B.C, i);
}
function foo() {
    var D = {
        G: '0x2bd',
        J: '420',
        K: '0x1a8',
        L: '429',
        M: '0x1b1'
    };
    var i = {
        'd': o(-D.J, -D.K),
        'f': o(-D.L, -D.M),
        'g': function (l, m) {
            return l + m;
        },
        'h': function (l) {
            return l();
        }
    };
    function o(i, j) {
        return b(i - -D.G, j);
    }
    var j = i['f'];
    function k() {
        var l = i['d'];
        return l;
    }
    return i['g'](j, i['h'](k));
}
function a() {
    var N = [
        '869812sdkLpc',
        '9TpxUIS',
        '584236zpXoPw',
        '2101820vEPapC',
        '2758592vkFGmQ',
        'baz',
        'log',
        '9YuVCUN',
        '500223rwwjIt',
        'bar',
        '835OYMxDz',
        '4703741FRsjxm',
        '7554lQOCpV'
    ];
    a = function () {
        return N;
    };
    return a();
}
console[p(0x20e, '0x20c')](foo());

Regex would definitely be a lot harder, but I was more hoping that eval execution wouldn't really work, introducing some kind of non trivial variables would make it a lot harder. I'd just load the script and analyze AST at that point.

I'd just obfuscate the entire call such as
const obj = [
    console
];

(function (i, j) {
    var q = {
        r: '227',
        t: '511',
        u: '0x1f7',
        v: '510',
        w: '0x1fb',
        x: '0x1f9',
        y: '502',
        z: '499',
        A: '509'
    };
    var k = i();
    function n(i, j) {
        return b(i - q.r, j);
    }
    while (!![]) {
        try {
            var l = parseInt(n(q.t, '0x1ff')) / 0x1 + parseInt(n(q.u, q.v)) / 0x2 + -parseInt(n(0x1fe, q.w)) / 0x3 * (parseInt(n(q.x, 0x1f9)) / 0x4) + parseInt(n('0x1f4', '0x1f3')) / 0x5 * (-parseInt(n(q.y, '0x1f9')) / 0x6) + parseInt(n('0x1f5', q.z)) / 0x7 + parseInt(n(0x1fb, 0x1fa)) / 0x8 * (-parseInt(n(0x1f8, 0x1fd)) / 0x9) + -parseInt(n(0x1fa, q.A)) / 0xa;
            if (l === j) {
                break;
            } else {
                k['push'](k['shift']());
            }
        } catch (m) {
            k['push'](k['shift']());
        }
    }
}(a, 0x628c8));
function b(c, d) {
    var e = a();
    b = function (f, g) {
        f = f - 0x110;
        var h = e[f];
        return h;
    };
    return b(c, d);
}
function p(i, j) {
    var B = { C: '242' };
    return b(j - B.C, i);
}
function foo(id) {
    var D = {
        G: '0x2bd',
        J: '420',
        K: '0x1a8',
        L: '429',
        M: '0x1b1'
    };
    var i = {
        'd': o(-D.J, -D.K),
        'f': o(-D.L, -D.M),
        'g': function (l, m) {
            return l + m;
        },
        'h': function (l) {
            return l();
        }
    };
    function o(i, j) {
        return b(i - -D.G, j);
    }
    var j = i['f'];
    function k() {
        var l = i['d'];
        return l;
    }
    if (id === 0x123) obj[0][p(0x20e, '0x20c')](foo(0x124));
    return i['g'](j, i['h'](k));
}
function a() {
    var N = [
        '869812sdkLpc',
        '9TpxUIS',
        '584236zpXoPw',
        '2101820vEPapC',
        '2758592vkFGmQ',
        'baz',
        'log',
        '9YuVCUN',
        '500223rwwjIt',
        'bar',
        '835OYMxDz',
        '4703741FRsjxm',
        '7554lQOCpV'
    ];
    a = function () {
        return N;
    };
    return a();
}
foo(0x123);

Closed. Btw, stringArrayCallsTransform option was added.


Rxjs Observable Issue

With the current library on line 3 of ngx-breadcrumbs.es5.js:
import { Observable as Observable$1 } from 'rxjs/Observable';
giving error:
ERROR TypeError: rxjs_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable.of is not a function
at McBreadcrumbsService.push../node_modules/ngx-breadcrumbs/ngx-breadcrumbs/ngx-breadcrumbs.es5.js.McBreadcrumbsService._resolveCrumbs
and breadcrumb not shown.
But after changing into:
import { Observable as Observable$1 } from 'rxjs';
It's doing good again.

Thank you @forvy


Monarchy in Brazil

In the year 1993 had a referendum in Brazil, asking for the people choose between a republic and a parliamentarian monarchy. I think that would be a good idea to put it in the mod.

Nice idea, I will add an event


Fix submenu flickering

Problem
Submenus flicker and are generally unusable, as shown in #2706.
There are two separate causes for this:

Menu Areas were being created with both constrain and fixed_pos. These two properties fight with each other as they are both trying to position the menu in a different position.
MenuState::area_contains uses it's own logic to determine if the pointer is inside of the menu but this logic is not the same as Context::layer_id_at.

(1) causes flickering when the submenu is constrained and ends up on top of the parent menu
(2) causes flickering when the pointer is 5px away from the submenu
Solution
(1) seems fully solved, although there might be a better solution
(2) I hard-coded a value for resize_grab_radius_side for now, which fixes the issue unless someone tweaks this value. Feedback on how to properly solve this would be appreciated. Left some comments explaining the issue
Closes #2706

I found an issue with (1). If the menu is constrained once, but the window is resized to be bigger, the menu stays in the constrained position when it's opened again.
A solution would be clear the memory for the menu once it closes or two somehow make constrain and fixed_pos get along.

Thanks for the fix!
I think we should consider re-defining what keeps a sub-menu open.
The current behavior is, as far as I recall, "keep sub-menu open while hovering it or any child". This leads to sub-menus closing very easily when the mouse strays outside their active area.
I think we should change this to "remain open until another sub-menu-button is hovered, unless is is a descendant UI". That's how most menu systems work.
This is of course a bigger change, and this PR is a good band-aid in the mean-time.

OK; I'll convert this to a draft for now then!

Closing since it doesn't seem to be happening anymore: https://github.com/emilk/egui/issues/2706#issuecomment-1615800751


Only allow crawlable content in contentSitemapUrls response

Development:

Production:

Development:

Production:

This should correct issues in which noIndex content is returning in the XML sitemaps, alongside potentially returning some content isn't currently retrieved at all.

 MNET - URLs not in site map


[Workers] Update deploy button action YAML example to 2.0

Changes

Update cloudflare/wrangler-action to 2.0
Fix passing accountId

Tested on my own worker template.

Questions

Does it make sense to have pull_request action? For example, if someone opens a PR you don't necessarily want to deploy a new worker 🤔 It's not like Pages with deploy previews, right?

Thanks!


feat(test): add reconfiguration completion detection plugin

Summary
Unlike the previous implementation, this one does not require changes
to Kong and its proxy path.  It works based on the assumption that the
order of admin API changes is preserved.  The admin API client marks
the end of the changes that it needs to see propagated to the data
plane(s) by changing the configuration of this plugin, setting a
particular configuration version number.  On the proxy path, a header
X-Kong-Configuration-Version is sent with that version number.  The
plugin's access handler verifies that the version number configured in
the plugin (on the dataplane) matches the version number requested by
the client.  If the version numbers do not match, a 503 error is
generated, which causes the client to retry.
The plugin is available only to busted tests.  It needs to be enabled
when starting Kong.
A new busted test helper function make_synchronized_clients is
provided that automatically synchronizes a proxy client and an admin
API client.  The the test can freely mix invocations to either
endpoints.  Whenever a change is made through the admin API, the proxy
path request is delayed until the change has propagated to the data
plane.  spec/02-integration/13-vaults/06-refresh-secrets_spec.lua has
been updated to use the function as an illustration.
Checklist

[X] The Pull Request has tests
[ ] A changelog file has been created under changelog/unreleased/kong or skip-changelog label added on PR if changelog is unnecessary. README.md
[ ] There is a user-facing docs PR against https://github.com/Kong/docs.konghq.com - PUT DOCS PR HERE

Issue reference
KAG-3265

could we rely on this behavior of sequential application of the changes?

I think the mechanism is reliable enough.  It is still that further synchronization is needed, i.e. when testing plugins that perform asynchronous configuration operations, but for most tests, this should be good enough.


Key pressing issues

When i pres S it does not scroll to start of the S country. But in general this i've noticed it's so random. Is there full support on keyboard key press?

Yes the version 3 is weird with keyboard support but 2 is stable but does not have keyboard support. Also v2 is faster to open list

So still having same issue both on new version and old for example pressing D it selects Algeria or Germany so whats up with that?  @viclafouch

So looks like its doing this based on the ISO code and not the Country actual name


Aniwave not working

Source information
Aniwave
Source language
English
Steps to reproduce
Watch anime or update new anime released episode from Aniwave extention.
Expected behavior
Play video / update new anime episode
Actual behavior
Doesn't play video - "Error 404" or update new anime release - "Failed to bypass Cloudfare"
Aniyomi version
<IP_ADDRESS>
Android version
Android 11
Other details
No response
Acknowledgements

[X] I have searched the existing issues and this is a new ticket, NOT a duplicate or related to another open or closed issue.
[X] I have written a short but informative title.
[X] I have updated the app to version <IP_ADDRESS>.
[X] I have updated all installed extensions.
[X] I have tried the troubleshooting guide.
[X] If this is an issue with the app itself, I should be opening an issue in the app repository.
[X] I will fill out all of the requested information in this form.

Follow the cloudflare section in the troubleshooting guide that you acknowledged you've read. If it doesn't help, wait until they lower protection or migrate to another extension.


No module named 'generators'

Since this commit : https://github.com/sigma-geosistemas/mommy_spatial_generators/commit/a9923549ae65dd8240528a3c3790ce326e8fcd87
When i make
from mommy_spatial_generators import MOMMY_SPATIAL_FIELDS
i get this error:
File "/usr/django/src/mommy-spatial-generators/mommy_spatial_generators/__init__.py", line 2, in <module>     from generators import MOMMY_SPATIAL_FIELDS ImportError: No module named 'generators'

Hello @fletort . Check the new version. I updated it and then forgot to keep this in __init__.py, but I quickly fixed it.
Can you test this again ?
I just made new virtualenv and did the following:
Created new venv:
(geoadmin) george@winterfell ~/projetos $ mkvirtualenv mommy
Using real prefix '/usr'
New python executable in /home/george/projetos/.virtualenvs/mommy/bin/python2
Also creating executable in /home/george/projetos/.virtualenvs/mommy/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/george/projetos/.virtualenvs/mommy/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/george/projetos/.virtualenvs/mommy/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/george/projetos/.virtualenvs/mommy/bin/preactivate
virtualenvwrapper.user_scripts creating /home/george/projetos/.virtualenvs/mommy/bin/postactivate
virtualenvwrapper.user_scripts creating /home/george/projetos/.virtualenvs/mommy/bin/get_env_details

Installed Django and Model Mommy
(mommy) george@winterfell ~/projetos $ pip install django model_mommy
Collecting django
  Downloading Django-1.10.2-py2.py3-none-any.whl (6.8MB)
    100% |████████████████████████████████| 6.8MB 146kB/s
Collecting model_mommy
  Using cached model_mommy-1.3.0.tar.gz
Collecting six (from model_mommy)
  Using cached six-1.10.0-py2.py3-none-any.whl
Building wheels for collected packages: model-mommy
  Running setup.py bdist_wheel for model-mommy ... done
  Stored in directory: /home/george/.cache/pip/wheels/b3/81/ca/387a31885c6bedcbdc2a4efd3a3808db244415388088ecdc48
Successfully built model-mommy
Installing collected packages: django, six, model-mommy
Successfully installed django-1.10.2 model-mommy-1.3.0 six-1.10.0

Installed Mommy Spatial Generators
(mommy) george@winterfell ~/projetos $ pip install -e git+https://github.com/sigma-geosistemas/mommy_spatial_generators.git#egg=mommy_spatial_generators
Obtaining mommy_spatial_generators from git+https://github.com/sigma-geosistemas/mommy_spatial_generators.git#egg=mommy_spatial_generators
  Cloning https://github.com/sigma-geosistemas/mommy_spatial_generators.git to ./.virtualenvs/mommy/src/mommy-spatial-generators
Installing collected packages: mommy-spatial-generators
  Running setup.py develop for mommy-spatial-generators
Successfully installed mommy-spatial-generators

Testing:
(mommy) george@winterfell ~/projetos $ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mommy_spatial_generators import MOMMY_SPATIAL_FIELDS
>>> MOMMY_SPATIAL_FIELDS
{'django.contrib.gis.db.models.LineStringField': <function gen_linestring at 0x7fea32e659b0>, 'django.contrib.gis.db.models.PolygonField': <function gen_rectangular_polygon at 0x7fea32e65b18>, 'django.contrib.gis.db.models.MultiPointField': <function gen_multipoint at 0x7fea32e65938>, 'django.contrib.gis.db.models.PointField': <function gen_point at 0x7fea32e65848>, 'django.contrib.gis.db.models.MultiLineStringField': <function gen_multilinestring at 0x7fea32e65aa0>, 'django.contrib.gis.db.models.MultiPolygonField': <function gen_rectangular_multipolygon at 0x7fea32e65b90>}

it is not ok for me:
root@adea552c15c0:/usr/django# python
Python 3.5.2 (default, Aug 31 2016, 03:01:41)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mommy_spatial_generators import MOMMY_SPATIAL_FIELDS
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/site-packages/mommy_spatial_generators/__init__.py", line 2, in <module>
    from generators import MOMMY_SPATIAL_FIELDS
ImportError: No module named 'generators'

In fact generators is not a module so it can not be imported.
Your import line in your init/py file should be:
from mommy_spatial_generators.generators import MOMMY_SPATIAL_FIELDS

I was importing it before using relative notation and when I "fixed" I must forgot the dot.
The weird thing is that it's working for me here.
I'll change it and let me know if works for you.

@fletort added a test case for importing this also. please check and thanks for the bug report.


Schema Sync feature

What is currently missing?

Sync schemas from SR cluster to Klaw metadata
Sync schemas from Klaw metadata to SR cluster (latest schema)

How could this be improved?

Sync schemas from SR cluster to Klaw metadata
Sync schemas from Klaw metadata to SR cluster (latest schema)

Is this a feature you would work on yourself?

[ ] I plan to open a pull request for this feature

@muralibasani I think this is completed and fully merged?


New dataization result of While object

@yegor256 please, check

@Graur see above

@yegor256 Can you check again, please?

@Graur one minor comment above

@yegor256 Thanks! Can you check it one more time, please? I fixed this title

@Graur thanks!


Switch from news & blog posts to news & press mentions

DO NOT MERGE YET -- action needed first.
Instead of having collections of 'posts' and 'news' we now have collections of 'press' and 'news'.
'press' consists of mentions of RF on other people's websites that were previously mixed in among the news articles on our own website. Those have been separated out, both behind the scenes, and for public viewing in a new section at the bottom of the news page.
'news' consists of everything else that used to be in the news section, plus everything that was previously classified as a blog post. The distinction between these two things was artificial and not really necessary. They're all news from the Rust Foundation and we shall call them all news.
As a consequence of the abolition of the concept of 'posts' we should put redirects in place for old /posts/* URLs; they are now at /news/* and it would be better if existing links didn't break.
That's not something we can currently do within CloudCannon, so I'm submitting the PR at this point. Don't merge it until the redirects issue has been addressed.

I got to think how best to do this. The brute force way is to just keep all posts and add header information about how to redirect. The better way would be to have any url with post in it automatically be replaced with news (trying to figure out how to do that client side). The best way is to have our site served on something that allows server side redirects (Netlify or CloudCannon, for example). Let me play around a little more.

Going to land this and then follow up quickly with a PR for a client-side redirect hack I found for eleventy after a bit of searching.


Possible to loop PageView?

Is it possible to loop the PageView after reaching the end of the list?

not support


Style Y053  - Function Declarations to Hide Implementation Details

Why bother with defining a variable to return, can we simply return an object?
var service = {
      getAvengersCast: getAvengersCast,
      getAvengerCount: getAvengerCount,
      getAvengers: getAvengers,
      ready: ready
  };

  return service;

//instead

return {
      getAvengersCast: getAvengersCast,
      getAvengerCount: getAvengerCount,
      getAvengers: getAvengers,
      ready: ready
}

sure. that works too. i like the variable so it is easier to debug and stop on it. but you can certainly do this.
thanks for asking


Lib did not support ads for web flutter

Lib did not support ads for web flutter

Closing this as a duplicate of https://github.com/googleads/googleads-mobile-flutter/issues/208.


bug fix(polymorphism): Adding a workaround for the Parameter

polymorphism

Thank you random stackoverflow user! https://stackoverflow.com/questions/62398858/deserialize-json-into-polymorphic-pojo-with-json-b-yasson


Magnifier / Zoom stops working after page resizing

Description:
The image zoom in the product page stops working when the the browser was shrinked to mobile view and back. It is OK when only one image is associated to the product. But when a gallery of images is added the zoom works on initial loading. When you resize the browser to the mobile view and back to PC view, the hover zoom is not available anymore.
Environment: Tested in a fresh install of Shopware <IP_ADDRESS> with the default theme and added additional images to a product.
Steps to reproduce: See above.
Expected result: The zoom works after resizing, as it is with only one image in the product.
Actual result: After resizing the zoom does not work.

[public] Automated response: This issue is linked to the internal issue https://shopware.atlassian.net/browse/NEXT-34311.
[created from NEXT-34311, comment 485911]

[public] Hello,
Within our company roadmap and work capacity, we try to address each bug or improvement request but admit that not each one will be resolved. To continue our culture of honesty and openness, we are closing this issue to focus on our roadmap on behalf of all Shopware users.
If you feel like this issue is still impacting you, please create a new issue and let us know. Thank you again for your valuable feedback.
[created from NEXT-34311, comment 501227]


Fixed Breadcrumb to Display Detailed Name Instead of ID

Proposed Changes

Fixes #9197
Change breadcrumb to display person's name instead of ID.
Update breadcrumb component to fetch the correct name field from the data.
Ensure breadcrumb updates dynamically based on the person’s name in relevant sections.

@ohcnetwork/care-fe-code-reviewers

Summary by CodeRabbit

New Features

Introduced crumbsReplacements for enhanced breadcrumb navigation on the Sample Details and Shift Details pages, displaying the patient's name.
Updated clipboard functionality in Shift Details to improve user experience.
Conditional rendering of the logo in printed data based on specific properties.

Bug Fixes

Updated the patient_name property type in the SampleTestModel for better data handling.

@rayyjeb Ensure that other changes are in staging though.

Should I reopen the pull request once again since, the it is showing as closed

@Jacobjeevan Should I reopen the pull request once again since, the it is showing as closed

Yea

@rithviknishad Could you please review the PR again? If there's anything, Do let me know

@rithviknishad Could you please review the PR again? If there's anything, Do let me know

He already approved it 🤔  and there hasn't been any changes since approval.

@rayyjeb It's queued for testing. Nihal would do QA and mark it as tested. Once that's done, we are good to merge it.

LGTM