-
-
Notifications
You must be signed in to change notification settings - Fork 254
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Initial Support for MacOS IL2CPP Builds #326
Merged
Merged
Changes from all commits
Commits
Show all changes
52 commits
Select commit
Hold shift + click to select a range
7238404
Add intial framework for macos builds. Test install editor
AndrewKahr 2517e84
Fix unity hub path space
AndrewKahr 88927e6
Single quote space in path
AndrewKahr 50a3156
Escape space character
AndrewKahr 0b75d07
More backslashes
AndrewKahr d8f6c81
Move to bash scripts for setup
AndrewKahr c99854b
Add path to command args
AndrewKahr 5a00d7b
Different command to run shell script
AndrewKahr 12fc1f5
Use full path to scripts
AndrewKahr bd1602d
Unpack changeset value and fix missing escape characters
AndrewKahr 57636bc
Print changeset
AndrewKahr d6222f0
More debug
AndrewKahr 3f364f7
Remove debug
AndrewKahr 2b6e9e1
Fix script paths
AndrewKahr 7dae634
Printenv debug
AndrewKahr 0e8e980
Write environment variables to file to read in bash script
AndrewKahr 9f8003c
Debug file write
AndrewKahr 7cd4858
More debug
AndrewKahr 107d6a5
Fix missing await
AndrewKahr 45b49c7
Move back to process.env
AndrewKahr 6a9c5b7
Fix path typo
AndrewKahr e50c0a2
Add missing flags
AndrewKahr ca50770
Make directory for license activation
AndrewKahr 821ebca
Add missing sudo
AndrewKahr cdf7e5d
Give permissions to license folder
AndrewKahr 9105cc8
Fix path issues
AndrewKahr c8c5683
Add build tests
AndrewKahr b3c4dc6
Try ts setup again
AndrewKahr 4a3b6da
Try quoting path
AndrewKahr 039a8e2
Further migrate mac scripts to align with linux scripts
AndrewKahr d83c98b
print pwd
AndrewKahr 2bf0a38
Fix changeset and remove unneeded env vars
AndrewKahr 62574c7
Ignore return code
AndrewKahr f5b23d8
fix missing current directory
AndrewKahr 9bcd2f7
Fix project path
AndrewKahr 4a1bb98
pwd
AndrewKahr 40463d3
Remove project path
AndrewKahr f652a90
Revert to cwd being the workspace folder and pass action folder as an…
AndrewKahr f652650
Add blank project to use for activation
AndrewKahr beb66ba
Add blank project path
AndrewKahr 64c42a0
Fix build tests
AndrewKahr 0243fe1
Don't rebuild library on windows
AndrewKahr 4a8ee6f
Fix project path windows
AndrewKahr 1468ee8
Fix platform specific workspace env variable
AndrewKahr 9464a7f
Fix incorrect variable name
AndrewKahr fc3232e
chore: update dist files
AndrewKahr 1a45467
Update .github/workflows/mac-build-tests.yml
AndrewKahr 28e96a9
Update .github/workflows/mac-build-tests.yml
AndrewKahr d3e97a2
Update dist/BlankProject/Packages/packages-lock.json
AndrewKahr d23e37b
Update src/model/platform-setup/setup-mac.ts
AndrewKahr 80b1d4b
Update src/model/platform-setup/setup-mac.ts
AndrewKahr bc513b8
Fix formatting
AndrewKahr File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
name: Mac Builds | ||
|
||
on: | ||
push: | ||
branches: | ||
- main | ||
|
||
env: | ||
UNITY_LICENSE: "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>\n <License id=\"Terms\">\n <MachineBindings>\n <Binding Key=\"1\" Value=\"576562626572264761624c65526f7578\"/>\n <Binding Key=\"2\" Value=\"576562626572264761624c65526f7578\"/>\n </MachineBindings>\n <MachineID Value=\"D7nTUnjNAmtsUMcnoyrqkgIbYdM=\"/>\n <SerialHash Value=\"2033b8ac3e6faa3742ca9f0bfae44d18f2a96b80\"/>\n <Features>\n <Feature Value=\"33\"/>\n <Feature Value=\"1\"/>\n <Feature Value=\"12\"/>\n <Feature Value=\"2\"/>\n <Feature Value=\"24\"/>\n <Feature Value=\"3\"/>\n <Feature Value=\"36\"/>\n <Feature Value=\"17\"/>\n <Feature Value=\"19\"/>\n <Feature Value=\"62\"/>\n </Features>\n <DeveloperData Value=\"AQAAAEY0LUJHUlgtWEQ0RS1aQ1dWLUM1SlctR0RIQg==\"/>\n <SerialMasked Value=\"F4-BGRX-XD4E-ZCWV-C5JW-XXXX\"/>\n <StartDate Value=\"2021-02-08T00:00:00\"/>\n <UpdateDate Value=\"2021-02-09T00:34:57\"/>\n <InitialActivationDate Value=\"2021-02-08T00:34:56\"/>\n <LicenseVersion Value=\"6.x\"/>\n <ClientProvidedVersion Value=\"2018.4.30f1\"/>\n <AlwaysOnline Value=\"false\"/>\n <Entitlements>\n <Entitlement Ns=\"unity_editor\" Tag=\"UnityPersonal\" Type=\"EDITOR\" ValidTo=\"9999-12-31T00:00:00\"/>\n <Entitlement Ns=\"unity_editor\" Tag=\"DarkSkin\" Type=\"EDITOR_FEATURE\" ValidTo=\"9999-12-31T00:00:00\"/>\n </Entitlements>\n </License>\n<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments\"/><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"/><Reference URI=\"#Terms\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"/></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/><DigestValue>m0Db8UK+ktnOLJBtHybkfetpcKo=</DigestValue></Reference></SignedInfo><SignatureValue>o/pUbSQAukz7+ZYAWhnA0AJbIlyyCPL7bKVEM2lVqbrXt7cyey+umkCXamuOgsWPVUKBMkXtMH8L\n5etLmD0getWIhTGhzOnDCk+gtIPfL4jMo9tkEuOCROQAXCci23VFscKcrkB+3X6h4wEOtA2APhOY\nB+wvC794o8/82ffjP79aVAi57rp3Wmzx+9pe9yMwoJuljAy2sc2tIMgdQGWVmOGBpQm3JqsidyzI\nJWG2kjnc7pDXK9pwYzXoKiqUqqrut90d+kQqRyv7MSZXR50HFqD/LI69h68b7P8Bjo3bPXOhNXGR\n9YCoemH6EkfCJxp2gIjzjWW+l2Hj2EsFQi8YXw==</SignatureValue></Signature></root>" | ||
|
||
jobs: | ||
buildForAllPlatformsWindows: | ||
name: Build for ${{ matrix.targetPlatform }} on version ${{ matrix.unityVersion }} | ||
runs-on: macos-latest | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
projectPath: | ||
- test-project | ||
unityVersion: | ||
- 2020.3.24f1 | ||
targetPlatform: | ||
- StandaloneOSX # Build a MacOS executable | ||
|
||
steps: | ||
########################### | ||
# Checkout # | ||
########################### | ||
- uses: actions/checkout@v2 | ||
with: | ||
lfs: true | ||
|
||
########################### | ||
# Cache # | ||
########################### | ||
- uses: actions/cache@v2 | ||
with: | ||
path: ${{ matrix.projectPath }}/Library | ||
key: Library-${{ matrix.projectPath }}-macos-${{ matrix.targetPlatform }} | ||
restore-keys: | | ||
Library-${{ matrix.projectPath }}-macos- | ||
Library- | ||
|
||
########################### | ||
# Set Scripting Backend # | ||
########################### | ||
- name: Set Scripting Backend To il2cpp | ||
run: | | ||
mv -f "./test-project/ProjectSettings/ProjectSettingsIl2cpp.asset" "./test-project/ProjectSettings/ProjectSettings.asset" | ||
|
||
########################### | ||
# Build # | ||
########################### | ||
- uses: ./ | ||
env: | ||
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} | ||
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} | ||
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} | ||
with: | ||
projectPath: ${{ matrix.projectPath }} | ||
unityVersion: ${{ matrix.unityVersion }} | ||
targetPlatform: ${{ matrix.targetPlatform }} | ||
customParameters: -profile SomeProfile -someBoolean -someValue exampleValue | ||
# We use dirty build because we are replacing the default project settings file above | ||
allowDirtyBuild: true | ||
|
||
########################### | ||
# Upload # | ||
########################### | ||
- uses: actions/upload-artifact@v2 | ||
with: | ||
name: Build Windows (${{ matrix.unityVersion }}) | ||
path: build | ||
retention-days: 14 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
Library/ | ||
[Tt]emp/ | ||
[Oo]bj/ | ||
[Bb]uild/ | ||
[Bb]uilds/ | ||
[Ll]ogs/ | ||
|
||
# Uncomment this line if you wish to ignore the asset store tools plugin | ||
# [Aa]ssets/AssetStoreTools* | ||
|
||
# IDEs | ||
.vs/ | ||
.idea/ | ||
|
||
# Gradle cache directory | ||
.gradle/ | ||
|
||
# Autogenerated VS/MD/Consulo solution and project files | ||
ExportedObj/ | ||
.consulo/ | ||
*.csproj | ||
*.unityproj | ||
*.sln | ||
*.suo | ||
*.tmp | ||
*.user | ||
*.userprefs | ||
*.pidb | ||
*.booproj | ||
*.svd | ||
*.pdb | ||
*.mdb | ||
*.opendb | ||
*.VC.db | ||
|
||
# Unity3D generated meta files | ||
*.pidb.meta | ||
*.pdb.meta | ||
*.mdb.meta | ||
|
||
# Unity3D generated file on crash reports | ||
sysinfo.txt | ||
|
||
# Builds | ||
*.apk | ||
*.unitypackage | ||
|
||
# Crashlytics generated file | ||
crashlytics-build.properties |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,208 @@ | ||
%YAML 1.1 | ||
%TAG !u! tag:unity3d.com,2011: | ||
--- !u!29 &1 | ||
OcclusionCullingSettings: | ||
m_ObjectHideFlags: 0 | ||
serializedVersion: 2 | ||
m_OcclusionBakeSettings: | ||
smallestOccluder: 5 | ||
smallestHole: 0.25 | ||
backfaceThreshold: 100 | ||
m_SceneGUID: 00000000000000000000000000000000 | ||
m_OcclusionCullingData: {fileID: 0} | ||
--- !u!104 &2 | ||
RenderSettings: | ||
m_ObjectHideFlags: 0 | ||
serializedVersion: 9 | ||
m_Fog: 0 | ||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} | ||
m_FogMode: 3 | ||
m_FogDensity: 0.01 | ||
m_LinearFogStart: 0 | ||
m_LinearFogEnd: 300 | ||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} | ||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} | ||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} | ||
m_AmbientIntensity: 1 | ||
m_AmbientMode: 3 | ||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} | ||
m_SkyboxMaterial: {fileID: 0} | ||
m_HaloStrength: 0.5 | ||
m_FlareStrength: 1 | ||
m_FlareFadeSpeed: 3 | ||
m_HaloTexture: {fileID: 0} | ||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} | ||
m_DefaultReflectionMode: 0 | ||
m_DefaultReflectionResolution: 128 | ||
m_ReflectionBounces: 1 | ||
m_ReflectionIntensity: 1 | ||
m_CustomReflection: {fileID: 0} | ||
m_Sun: {fileID: 0} | ||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} | ||
m_UseRadianceAmbientProbe: 0 | ||
--- !u!157 &3 | ||
LightmapSettings: | ||
m_ObjectHideFlags: 0 | ||
serializedVersion: 12 | ||
m_GIWorkflowMode: 1 | ||
m_GISettings: | ||
serializedVersion: 2 | ||
m_BounceScale: 1 | ||
m_IndirectOutputScale: 1 | ||
m_AlbedoBoost: 1 | ||
m_EnvironmentLightingMode: 0 | ||
m_EnableBakedLightmaps: 0 | ||
m_EnableRealtimeLightmaps: 0 | ||
m_LightmapEditorSettings: | ||
serializedVersion: 12 | ||
m_Resolution: 2 | ||
m_BakeResolution: 40 | ||
m_AtlasSize: 1024 | ||
m_AO: 0 | ||
m_AOMaxDistance: 1 | ||
m_CompAOExponent: 1 | ||
m_CompAOExponentDirect: 0 | ||
m_ExtractAmbientOcclusion: 0 | ||
m_Padding: 2 | ||
m_LightmapParameters: {fileID: 0} | ||
m_LightmapsBakeMode: 1 | ||
m_TextureCompression: 1 | ||
m_FinalGather: 0 | ||
m_FinalGatherFiltering: 1 | ||
m_FinalGatherRayCount: 256 | ||
m_ReflectionCompression: 2 | ||
m_MixedBakeMode: 2 | ||
m_BakeBackend: 0 | ||
m_PVRSampling: 1 | ||
m_PVRDirectSampleCount: 32 | ||
m_PVRSampleCount: 500 | ||
m_PVRBounces: 2 | ||
m_PVREnvironmentSampleCount: 500 | ||
m_PVREnvironmentReferencePointCount: 2048 | ||
m_PVRFilteringMode: 2 | ||
m_PVRDenoiserTypeDirect: 0 | ||
m_PVRDenoiserTypeIndirect: 0 | ||
m_PVRDenoiserTypeAO: 0 | ||
m_PVRFilterTypeDirect: 0 | ||
m_PVRFilterTypeIndirect: 0 | ||
m_PVRFilterTypeAO: 0 | ||
m_PVREnvironmentMIS: 0 | ||
m_PVRCulling: 1 | ||
m_PVRFilteringGaussRadiusDirect: 1 | ||
m_PVRFilteringGaussRadiusIndirect: 5 | ||
m_PVRFilteringGaussRadiusAO: 2 | ||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5 | ||
m_PVRFilteringAtrousPositionSigmaIndirect: 2 | ||
m_PVRFilteringAtrousPositionSigmaAO: 1 | ||
m_ExportTrainingData: 0 | ||
m_TrainingDataDestination: TrainingData | ||
m_LightProbeSampleCountMultiplier: 4 | ||
m_LightingDataAsset: {fileID: 0} | ||
m_LightingSettings: {fileID: 0} | ||
--- !u!196 &4 | ||
NavMeshSettings: | ||
serializedVersion: 2 | ||
m_ObjectHideFlags: 0 | ||
m_BuildSettings: | ||
serializedVersion: 2 | ||
agentTypeID: 0 | ||
agentRadius: 0.5 | ||
agentHeight: 2 | ||
agentSlope: 45 | ||
agentClimb: 0.4 | ||
ledgeDropHeight: 0 | ||
maxJumpAcrossDistance: 0 | ||
minRegionArea: 2 | ||
manualCellSize: 0 | ||
cellSize: 0.16666667 | ||
manualTileSize: 0 | ||
tileSize: 256 | ||
accuratePlacement: 0 | ||
maxJobWorkers: 0 | ||
preserveTilesOutsideBounds: 0 | ||
debug: | ||
m_Flags: 0 | ||
m_NavMeshData: {fileID: 0} | ||
--- !u!1 &519420028 | ||
GameObject: | ||
m_ObjectHideFlags: 0 | ||
m_CorrespondingSourceObject: {fileID: 0} | ||
m_PrefabInstance: {fileID: 0} | ||
m_PrefabAsset: {fileID: 0} | ||
serializedVersion: 6 | ||
m_Component: | ||
- component: {fileID: 519420032} | ||
- component: {fileID: 519420031} | ||
- component: {fileID: 519420029} | ||
m_Layer: 0 | ||
m_Name: Main Camera | ||
m_TagString: MainCamera | ||
m_Icon: {fileID: 0} | ||
m_NavMeshLayer: 0 | ||
m_StaticEditorFlags: 0 | ||
m_IsActive: 1 | ||
--- !u!81 &519420029 | ||
AudioListener: | ||
m_ObjectHideFlags: 0 | ||
m_CorrespondingSourceObject: {fileID: 0} | ||
m_PrefabInstance: {fileID: 0} | ||
m_PrefabAsset: {fileID: 0} | ||
m_GameObject: {fileID: 519420028} | ||
m_Enabled: 1 | ||
--- !u!20 &519420031 | ||
Camera: | ||
m_ObjectHideFlags: 0 | ||
m_CorrespondingSourceObject: {fileID: 0} | ||
m_PrefabInstance: {fileID: 0} | ||
m_PrefabAsset: {fileID: 0} | ||
m_GameObject: {fileID: 519420028} | ||
m_Enabled: 1 | ||
serializedVersion: 2 | ||
m_ClearFlags: 2 | ||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} | ||
m_projectionMatrixMode: 1 | ||
m_GateFitMode: 2 | ||
m_FOVAxisMode: 0 | ||
m_SensorSize: {x: 36, y: 24} | ||
m_LensShift: {x: 0, y: 0} | ||
m_FocalLength: 50 | ||
m_NormalizedViewPortRect: | ||
serializedVersion: 2 | ||
x: 0 | ||
y: 0 | ||
width: 1 | ||
height: 1 | ||
near clip plane: 0.3 | ||
far clip plane: 1000 | ||
field of view: 60 | ||
orthographic: 1 | ||
orthographic size: 5 | ||
m_Depth: -1 | ||
m_CullingMask: | ||
serializedVersion: 2 | ||
m_Bits: 4294967295 | ||
m_RenderingPath: -1 | ||
m_TargetTexture: {fileID: 0} | ||
m_TargetDisplay: 0 | ||
m_TargetEye: 0 | ||
m_HDR: 1 | ||
m_AllowMSAA: 0 | ||
m_AllowDynamicResolution: 0 | ||
m_ForceIntoRT: 0 | ||
m_OcclusionCulling: 0 | ||
m_StereoConvergence: 10 | ||
m_StereoSeparation: 0.022 | ||
--- !u!4 &519420032 | ||
Transform: | ||
m_ObjectHideFlags: 0 | ||
m_CorrespondingSourceObject: {fileID: 0} | ||
m_PrefabInstance: {fileID: 0} | ||
m_PrefabAsset: {fileID: 0} | ||
m_GameObject: {fileID: 519420028} | ||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | ||
m_LocalPosition: {x: 0, y: 0, z: -10} | ||
m_LocalScale: {x: 1, y: 1, z: 1} | ||
m_Children: [] | ||
m_Father: {fileID: 0} | ||
m_RootOrder: 0 | ||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"dependencies": { | ||
} | ||
} | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"dependencies": { | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
%YAML 1.1 | ||
%TAG !u! tag:unity3d.com,2011: | ||
--- !u!11 &1 | ||
AudioManager: | ||
m_ObjectHideFlags: 0 | ||
serializedVersion: 2 | ||
m_Volume: 1 | ||
Rolloff Scale: 1 | ||
Doppler Factor: 1 | ||
Default Speaker Mode: 2 | ||
m_SampleRate: 0 | ||
m_DSPBufferSize: 1024 | ||
m_VirtualVoiceCount: 512 | ||
m_RealVoiceCount: 32 | ||
m_SpatializerPlugin: | ||
m_AmbisonicDecoderPlugin: | ||
m_DisableAudio: 0 | ||
m_VirtualizeEffects: 1 | ||
m_RequestedDSPBufferSize: 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
%YAML 1.1 | ||
%TAG !u! tag:unity3d.com,2011: | ||
--- !u!236 &1 | ||
ClusterInputManager: | ||
m_ObjectHideFlags: 0 | ||
m_Inputs: [] |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pretty cool that this works :)