String compressor isn't working well enough

I was looking around for a string compression module, however, the ones I was finding weren’t compressing the strings far enough, or were unable to be decompressed. I decided to create my own and I am currently testing it on a string that is 2978002 bytes

This is the string

'{"<Instance> (LeftUpperLeg)":{"ClassName":"MeshPart","Size":"v3(4,8,6)","CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754264","<Instance> (LeftHip)":{"WorldCFrame":"c0(109 6 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-2,0)","metaData":{"sig":"1E46F8BA-AFE8-4CDB-A78D-64A62B221A20"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftKneeRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"72FA0FC8-67E7-4FD7-87D7-B4CA8B4963E9"}},"Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","<Instance> (LeftKneeRigAttachment)":{"Stiffness":"1","Name":"LeftUpperLeg","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593600","metaData":{"sig":"FE4AB577-ECDA-43BE-A6A7-A5B60572015F"}},"<Instance> (LeftHipRigAttachment)":{"Part1":"6178E3F6-26B1-4544-8EF7-E3EECAF6F2CA","C0":"c0(-3 4 0 0 0 0)","Name":"LeftHip","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"F4078504-A56A-4C93-864B-BE8417033B71","metaData":{"sig":"57A93214-890A-48B0-87E7-69A39721B509"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(109 8 4 0 0 0)","Name":"LeftUpperLeg","<Instance> (LeftUpperLeg)":{"Value":"v3(4,8,6)","metaData":{"sig":"C630E469-9032-4A95-A91B-5FA482D8C5C6"},"Name":"OriginalSize","ClassName":"Vector3Value"},"TextureID":"http://roblox.com/asset/?id=547751954","<Instance> (OriginalSize)":{"WorldCFrame":"c0(109 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"EA5AF69A-0216-49D1-95CB-8EA9899AEA18"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftHipRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"71E4B715-B68F-46F6-8BD6-510F73F4B56E"}},"metaData":{"sig":"6178E3F6-26B1-4544-8EF7-E3EECAF6F2CA"}},"<Instance> (RightUpperLeg)":{"Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","<Instance> (RightHip)":{"Value":"v3(4,8,6)","metaData":{"sig":"5877CDEA-0A33-42D3-A66F-4D33DCBC0F63"},"Name":"OriginalSize","ClassName":"Vector3Value"},"<Instance> (RightHipRigAttachment)":{"WorldCFrame":"c0(114 6 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-2,0)","metaData":{"sig":"1E899A06-536C-4ECD-83FC-3A49FE6A5312"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightKneeRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"CBF7E4C7-3449-4421-AE51-C1DAAFB69C1C"}},"<Instance> (RightUpperLeg)":{"WorldCFrame":"c0(114 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"FD910D21-5F78-463D-9770-72356B868E89"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightHipRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"00E906E6-C102-484A-BF5A-95D670AA8FB2"}},"ClassName":"MeshPart","Size":"v3(4,8,6)","<Instance> (RightKneeRigAttachment)":{"Part1":"AC08F478-9245-4E8B-A3C0-2AAE12B9E680","C0":"c0(2 4 0 0 0 0)","Name":"RightHip","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"F4078504-A56A-4C93-864B-BE8417033B71","metaData":{"sig":"3292CB17-939D-4C05-91E9-8417F21FF157"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754279","RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(115 8 4 0 0 0)","Name":"RightUpperLeg","TextureID":"http://roblox.com/asset/?id=547752159","<Instance> (OriginalSize)":{"Stiffness":"1","Name":"RightUpperLeg","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593667","metaData":{"sig":"42D16C94-C7BA-40D2-BF4C-3E25537F20E2"}},"metaData":{"sig":"AC08F478-9245-4E8B-A3C0-2AAE12B9E680"}},"<Instance> (LeftHand)":{"<Instance> (LeftGripAttachment)":{"Part1":"C746C1AD-8C3A-41A2-B3D8-B10C468E7350","C0":"c0(0 -3 -1 0 0 0)","Name":"LeftWrist","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 1 0 0 0 0)","ClassName":"Motor6D","Part0":"91F3C324-738E-4A12-A347-33FDB5F9286C","metaData":{"sig":"69907A97-F292-4EDC-9619-56DCBB22C6D2"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754226","<Instance> (LeftWrist)":{"WorldCFrame":"c0(104 11 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,1,0)","metaData":{"sig":"B266A345-0397-4EBB-A8FF-A71410222B70"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftWristRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"C20FB9E7-0957-457C-B549-54A10E4CF330"}},"<Instance> (LeftHand)":{"WorldCFrame":"c0(104 10 4 -8 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,0)","metaData":{"sig":"559AE20E-EB81-449A-8C31-F232C0E92877"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftGripAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,0,-5)","metaData":{"sig":"C5262F14-D0DE-4D4B-AE70-AE5F21CC282E"}},"<Instance> (OriginalSize)":{"Stiffness":"1","Name":"LeftHand","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593545","metaData":{"sig":"F64CA558-9739-4B98-AF72-F146C8A1779D"}},"metaData":{"sig":"C746C1AD-8C3A-41A2-B3D8-B10C468E7350"},"<Instance> (LeftWristRigAttachment)":{"Value":"v3(4,5,5)","metaData":{"sig":"D7083E52-9AB9-4FF7-8A76-0214557B99E6"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","ClassName":"MeshPart","Size":"v3(4,5,5)","RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(104 11 4 0 0 0)","Name":"LeftHand","TextureID":"http://roblox.com/asset/?id=547751836"},"<Instance> (RightUpperArm)":{"ClassName":"MeshPart","Size":"v3(6,6,4)","<Instance> (RightShoulderAttachment)":{"Stiffness":"1","Name":"RightUpperArm","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593663","metaData":{"sig":"22AF8628-C4EA-4C8C-AFB4-0886BB9DEFBA"}},"<Instance> (RightUpperArm)":{"WorldCFrame":"c0(119 15 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(2,-2,0)","metaData":{"sig":"AC6F5C3F-31FA-4F8C-9517-DC04D3A78383"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightElbowRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"7FAA725B-66F3-42AC-8FC5-8E70AD28AE43"}},"<Instance> (OriginalSize)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"FF12A80A-A7D1-48C5-8898-159D37056D1A"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(117 19 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"RightShoulderRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"7F7DBEC7-6407-492B-BE95-3A5F81BF303A"}},"<Instance> (RightShoulder)":{"Value":"v3(6,6,4)","metaData":{"sig":"EDE7057F-4BD4-4AE5-8461-75DE353E8317"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (RightElbowRigAttachment)":{"Part1":"877CE21F-8D82-41EF-9AD6-49B0CFC2F4A2","C0":"c0(5 3 1 0 0 0)","Name":"RightShoulder","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"A9241B6F-BF1F-49F5-9123-375C77C88FE4","metaData":{"sig":"9D3284E4-5B94-4AD4-BEC9-5E5306000C89"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754246","<Instance> (RightShoulderRigAttachment)":{"WorldCFrame":"c0(119 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(2,3,0)","metaData":{"sig":"64F57D42-203C-4F8D-9AC4-04EAC468A43D"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightShoulderAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"1EB3C5CF-3103-4B9A-9CF4-0B850D809CB4"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(117 17 4 0 0 0)","Name":"RightUpperArm","TextureID":"http://roblox.com/asset/?id=547752057","metaData":{"sig":"877CE21F-8D82-41EF-9AD6-49B0CFC2F4A2"}},"<Instance> (LeftFoot)":{"<Instance> (OriginalSize)":{"WorldCFrame":"c0(109 1 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,0,1)","metaData":{"sig":"7C03D41B-6DD8-4410-A8EE-C139F4917A24"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftAnkleRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"6FE00431-6B3C-4698-B6E7-A3F6F89CACFE"}},"Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","<Instance> (LeftAnkleRigAttachment)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"LeftFootAttachment","ClassName":"Attachment","WorldCFrame":"c0(109 0 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,1)","metaData":{"sig":"5E5245F2-537E-4AC3-8A61-C62547AF879F"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"AE58CECA-5919-44C0-B30A-75A6FE979289"}},"<Instance> (LeftFootAttachment)":{"Stiffness":"1","Name":"LeftFoot","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593535","metaData":{"sig":"D7645144-5684-49CE-9F43-0C90BD08738A"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754259","<Instance> (LeftFoot)":{"Part1":"2A4B15B3-0AB1-452E-BCBD-E2CBF81B7402","C0":"c0(0 -2 0 0 0 0)","Name":"LeftAnkle","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 0 1 0 0 0)","ClassName":"Motor6D","Part0":"39ABB446-DCA7-4E3E-B9F1-3C59587BC061","metaData":{"sig":"A0C39449-22A0-4A25-BF95-50767FF02D9A"}},"ClassName":"MeshPart","Size":"v3(5,2,7)","RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(109 1 3 0 0 0)","Name":"LeftFoot","<Instance> (LeftAnkle)":{"Value":"v3(5,2,7)","metaData":{"sig":"A9565AF4-25EE-44CF-9299-3A94195F7279"},"Name":"OriginalSize","ClassName":"Vector3Value"},"TextureID":"http://roblox.com/asset/?id=547751954","metaData":{"sig":"2A4B15B3-0AB1-452E-BCBD-E2CBF81B7402"}},"<Instance> (RightLowerLeg)":{"<Instance> (RightLowerLeg)":{"WorldCFrame":"c0(114 1 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-2,0)","metaData":{"sig":"A48F661B-8BB6-41D4-B768-56B7895A61EA"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightAnkleRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"6308560B-5CDE-49D7-A657-F4AF37205B2F"}},"<Instance> (RightKnee)":{"Value":"v3(5,5,5)","metaData":{"sig":"C78E5A61-6B2C-456D-B15B-50CA560C9065"},"Name":"OriginalSize","ClassName":"Vector3Value"},"<Instance> (OriginalSize)":{"Part1":"8FBFAD9B-3922-4156-97C4-6C757324D09C","C0":"c0(0 -2 0 0 0 0)","Name":"RightKnee","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"AC08F478-9245-4E8B-A3C0-2AAE12B9E680","metaData":{"sig":"933E1CC9-6DB8-4ACB-A19C-6391D4E518B3"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(115 3 4 0 0 0)","Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","<Instance> (RightAnkleRigAttachment)":{"WorldCFrame":"c0(114 6 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"516B14C6-D5F0-4387-B17B-458A33358FE4"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightKneeRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"6A2537A2-A797-4E79-9243-2D9DD8CF05AB"}},"<Instance> (RightKneeRigAttachment)":{"Stiffness":"1","Name":"RightLowerLeg","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593658","metaData":{"sig":"6B9A78DD-FF04-471B-A6EC-C72CAECD5FC6"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754271","ClassName":"MeshPart","Size":"v3(5,5,5)","Name":"RightLowerLeg","TextureID":"http://roblox.com/asset/?id=547752159","metaData":{"sig":"8FBFAD9B-3922-4156-97C4-6C757324D09C"}},"<Instance> (SnowmanHead)":{"AttachmentRight":"v3(5,0,0)","AttachmentPos":"v3(0,1,0)","AttachmentForward":"v3(0,0,-5)","AttachmentUp":"v3(0,5,0)","Name":"SnowmanHead","ClassName":"Accessory","<Instance> (ThumbnailConfiguration)":{"Name":"ThumbnailConfiguration","ClassName":"Configuration","<Instance> (ThumbnailCameraTarget)":{"Value":"331706F2-6C14-453D-8D94-29295D086340","metaData":{"sig":"4C7A4BEA-3D04-4602-A4D3-670D76E521B8"},"Name":"ThumbnailCameraTarget","ClassName":"ObjectValue"},"<Instance> (ThumbnailCameraValue)":{"metaData":{"sig":"90E8CABB-98B6-480D-9C77-9414EB74004E"},"Name":"ThumbnailCameraValue","ClassName":"CFrameValue"},"metaData":{"sig":"864F0420-C121-487A-AC1E-6948503668EC"}},"<Instance> (Handle)":{"<Instance> (HatAttachment)":{"Value":"v3(5,5,5)","metaData":{"sig":"C9685870-0267-43D7-BDF4-66E528A6EAE4"},"Name":"OriginalSize","ClassName":"Vector3Value"},"CanCollide":false,"<Instance> (SpecialMesh)":{"Part1":"05B082A7-C917-428C-AB88-BFDEC1CC38AE","C0":"c0(0 1 0 0 0 0)","Name":"AccessoryWeld","Part0":"331706F2-6C14-453D-8D94-29295D086340","ClassName":"Weld","C1":"c0(0 3 0 0 0 0)","metaData":{"sig":"6ED3CAC1-887E-461B-B323-C2927E946095"}},"<Instance> (AccessoryWeld)":{"Value":"Classic","metaData":{"sig":"4B715742-C45F-4522-96AB-293663777AB9"},"Name":"AvatarPartScaleType","ClassName":"StringValue"},"CFrame":"c0(112 25 5 0 0 0)","<Instance> (OriginalSize)":{"WorldAxis":"v3(5,0,0)","Name":"HatAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","WorldCFrame":"c0(112 26 4 0 0 0)","metaData":{"sig":"CF4A6FB6-DA29-4344-95E5-2DD2FD28D5C4"}},"<Instance> (AvatarPartScaleType)":{"Name":"SpecialMesh","MeshType":"e(MeshType FileMesh)","ClassName":"SpecialMesh","MeshId":"rbxassetid://8068922432","TextureId":"rbxassetid://8068924380","metaData":{"sig":"DCA36F3E-4B67-4CA6-B62F-AB4F6F354E9A"}},"Name":"Handle","Size":"v3(5,5,5)","ClassName":"Part","metaData":{"sig":"331706F2-6C14-453D-8D94-29295D086340"}},"metaData":{"sig":"5765C2E1-3BB9-461B-B41E-692905EE0DB7"}},"<Instance> (UpperTorso)":{"ClassName":"MeshPart","Size":"v3(12,11,11)","<Instance> (WaistRigAttachment)":{"<Instance> (OriginalPosition)":{"Value":"v3(-5,3,1)","metaData":{"sig":"9AF2F7A5-0461-4C09-8E4F-F3E60F4B2AE0"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(107 19 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"LeftShoulderRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"3081A7FF-B810-46BF-866A-2E4185A26E98"}},"TextureID":"http://roblox.com/asset/?id=547752244","CFrame":"c0(112 16 4 0 0 0)","RenderFidelity":"e(RenderFidelity Precise)","<Instance> (RightCollarAttachment)":{"WorldCFrame":"c0(112 15 7 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,3)","metaData":{"sig":"6981DEFF-CF5F-4A31-8650-E5C9EB8B0718"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"BodyBackAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"845436AE-1F9F-45CA-9198-F1A5057A7D43"}},"<Instance> (NeckAttachment)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"BodyFrontAttachment","ClassName":"Attachment","WorldCFrame":"c0(112 15 2 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,-2)","metaData":{"sig":"3BF780C7-548C-49BE-AF1E-95D48358EDAD"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"31497BB4-4161-4D71-BD00-C5424D3C3120"}},"<Instance> (LeftShoulderRigAttachment)":{"Stiffness":"1","Name":"UpperTorso","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=6925067368","metaData":{"sig":"F1B6E042-9D59-45D4-B5A1-CC0DB6C449C8"}},"<Instance> (Waist)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"RightShoulderRigAttachment","ClassName":"Attachment","WorldCFrame":"c0(117 19 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(5,3,1)","metaData":{"sig":"84DAF528-1EA8-49C0-BCE5-5516BFA64EBA"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"753CD251-F4AD-4619-B832-B019E0F02DF4"}},"<Instance> (OriginalSize)":{"Part1":"A9241B6F-BF1F-49F5-9123-375C77C88FE4","C0":"c0(0 6 0 0 0 0)","Name":"Waist","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 -4 1 0 0 0)","ClassName":"Motor6D","Part0":"F4078504-A56A-4C93-864B-BE8417033B71","metaData":{"sig":"FA494CC3-AEDC-458B-91E9-0F6BF58578FE"}},"<Instance> (UpperTorso)":{"Name":"LeftCollarAttachment","WorldAxis":"v3(5,0,0)","ClassName":"Attachment","WorldCFrame":"c0(107 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(-5,4,1)","metaData":{"sig":"EBFC42DB-35ED-4CE2-8EE0-7B582283E7A5"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"A926A79D-BD1F-44E6-82E0-43C2AD886E3C"}},"<Instance> (BodyBackAttachment)":{"Value":"v3(12,11,11)","metaData":{"sig":"2AF16615-0DD9-4A15-8121-EAA640177447"},"Name":"OriginalSize","ClassName":"Vector3Value"},"<Instance> (NeckRigAttachment)":{"WorldCFrame":"c0(112 12 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-4,1)","metaData":{"sig":"BA43CD0C-AA56-4E7C-926C-30C017CFFDF8"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"WaistRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"A30FC4AA-4750-422A-9BF4-AA2F5130CA69"}},"<Instance> (BodyFrontAttachment)":{"Name":"RightCollarAttachment","WorldAxis":"v3(5,0,0)","ClassName":"Attachment","WorldCFrame":"c0(117 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(5,4,1)","metaData":{"sig":"4B17D0EF-26EB-4E1D-B4A4-F51E69FADD1C"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"8A5A449B-A3EC-45A7-9B1B-551EB793A0D9"}},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (LeftCollarAttachment)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"NeckAttachment","ClassName":"Attachment","WorldCFrame":"c0(112 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,4,1)","metaData":{"sig":"933AE1FC-7B0B-4A90-A1B6-D47287DD0387"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"80CE2D2B-4335-455F-8FB7-F3AC134C644B"}},"Name":"UpperTorso","<Instance> (RightShoulderRigAttachment)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"NeckRigAttachment","ClassName":"Attachment","WorldCFrame":"c0(112 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,4,1)","metaData":{"sig":"97A03BD7-F1FE-4634-8233-7E46447BDEB9"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"8F7B8850-6EF0-4628-A1B8-1160A9E75ACF"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754254","metaData":{"sig":"A9241B6F-BF1F-49F5-9123-375C77C88FE4"}},"<Instance> (Head)":{"<Instance> (HairAttachment)":{"WorldCFrame":"c0(112 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-2,0)","metaData":{"sig":"1BEBBBFD-A74B-4160-AA0E-9B84A7B78428"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"NeckRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"06E03974-A875-44A3-9241-084C81FF353F"}},"<Instance> (FaceFrontAttachment)":{"Name":"Mesh","ClassName":"SpecialMesh","Scale":"v3(6,6,6)","<Instance> (OriginalSize)":{"Value":"v3(6,6,6)","metaData":{"sig":"FFCF9C08-0464-4000-B1E2-B52D95C2F895"},"Name":"OriginalSize","ClassName":"Vector3Value"},"metaData":{"sig":"2ED3D61F-C136-49E3-8EC3-E2E0338E8B7F"}},"CFrame":"c0(112 23 4 0 0 0)","<Instance> (OriginalSize)":{"Value":"v3(10,5,5)","metaData":{"sig":"E2994023-3FB1-4C5E-BDB3-B915B9CB5B34"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (HatAttachment)":{"WorldCFrame":"c0(112 23 1 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,0,-3)","metaData":{"sig":"0D0F3F21-03CD-48AD-8224-A0FF37F48BA5"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"FaceFrontAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"503EAAE5-35B5-48B2-A246-AB4047F8A2A1"}},"<Instance> (Mesh)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,3,0)","metaData":{"sig":"E75F802B-5659-44FE-A24E-FB5238079F37"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(112 26 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"HatAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"DDE718CC-32BE-401D-BD28-E48611D4DCEA"}},"ClassName":"Part","Size":"v3(10,5,5)","<Instance> (NeckRigAttachment)":{"ClassName":"Decal","Texture":"rbxasset://textures/face.png","metaData":{"sig":"1EC03BBA-B63F-47AA-9064-897E9A091C29"},"Name":"face"},"Name":"Head","<Instance> (FaceCenterAttachment)":{"WorldCFrame":"c0(112 26 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,3,0)","metaData":{"sig":"988A26BC-E43E-4EFE-ACCB-1DDE0DEF1022"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"HairAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"7D599A77-9DD0-45C2-8AE8-B83226AD584A"}},"<Instance> (face)":{"Part1":"05B082A7-C917-428C-AB88-BFDEC1CC38AE","C0":"c0(0 4 1 0 0 0)","Name":"Neck","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 -2 0 0 0 0)","ClassName":"Motor6D","Part0":"A9241B6F-BF1F-49F5-9123-375C77C88FE4","metaData":{"sig":"115152EB-CF1A-434F-8AC1-644A3766AA55"}},"metaData":{"sig":"05B082A7-C917-428C-AB88-BFDEC1CC38AE"},"<Instance> (Neck)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,0,0)","metaData":{"sig":"5BD589BB-253A-4A3A-A7BD-42E2CE053923"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(112 23 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"FaceCenterAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"0EF152C1-7F76-4C94-A9B7-AE62BD3A5C23"}}},"<Instance> (RightHand)":{"<Instance> (RightGripAttachment)":{"Part1":"EB5D1091-72C8-4736-9D47-442AC83BA029","C0":"c0(0 -3 -1 0 0 0)","Name":"RightWrist","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 1 0 0 0 0)","ClassName":"Motor6D","Part0":"DCDEF39C-70FF-4B2B-9083-4458430E0EB7","metaData":{"sig":"FFFBE9FE-9A48-45A4-8509-3720D1CB4C05"}},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (RightHand)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,1,0)","metaData":{"sig":"8A2F08E9-7C21-4A6F-8993-04C51996E4B4"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(119 11 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"RightWristRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"101462B9-EBBB-4554-96AB-93810A9C42EE"}},"Name":"RightHand","<Instance> (RightWrist)":{"WorldCFrame":"c0(119 10 4 -8 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,0)","metaData":{"sig":"BD7DBD1C-F80D-45DB-8A0B-94521DBA3B40"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightGripAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,0,-5)","metaData":{"sig":"4A076591-5B29-4BB8-ABBB-29F866B2E48D"}},"<Instance> (OriginalSize)":{"Value":"v3(4,5,5)","metaData":{"sig":"43F60B6F-32FD-47C2-BA7A-1A66E67A3234"},"Name":"OriginalSize","ClassName":"Vector3Value"},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754237","ClassName":"MeshPart","Size":"v3(4,5,5)","<Instance> (RightWristRigAttachment)":{"Stiffness":"1","Name":"RightHand","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593613","metaData":{"sig":"2DD39368-8143-4E99-9DB7-1EC38BD8DA77"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(119 11 4 0 0 0)","TextureID":"http://roblox.com/asset/?id=547752057","metaData":{"sig":"EB5D1091-72C8-4736-9D47-442AC83BA029"}},"<Instance> (LeftLowerLeg)":{"<Instance> (LeftKneeRigAttachment)":{"Stiffness":"1","Name":"LeftLowerLeg","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593583","metaData":{"sig":"E68B157A-DD86-4C13-A64A-FD42B48D8D96"}},"ClassName":"MeshPart","Size":"v3(5,5,5)","<Instance> (OriginalSize)":{"Part1":"39ABB446-DCA7-4E3E-B9F1-3C59587BC061","C0":"c0(0 -2 0 0 0 0)","Name":"LeftKnee","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"6178E3F6-26B1-4544-8EF7-E3EECAF6F2CA","metaData":{"sig":"C22AEEB4-AB70-454C-8CDD-FD4DDDF4E0AA"}},"<Instance> (LeftLowerLeg)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"DF3B050D-9718-4E2E-803A-686BAF5D0268"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(109 6 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"LeftKneeRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"6AAEAFC0-AB8F-472D-9E25-A9BDAA875725"}},"<Instance> (LeftAnkleRigAttachment)":{"Value":"v3(5,5,5)","metaData":{"sig":"5AC826A6-5CC4-421D-B43A-ED2825F580C7"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754262","<Instance> (LeftKnee)":{"WorldCFrame":"c0(109 1 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-2,0)","metaData":{"sig":"22274A59-90C1-4840-B59E-101909CB671F"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftAnkleRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"8A6A6011-F65B-4FBD-9314-F49897581ACF"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(109 3 4 0 0 0)","Name":"LeftLowerLeg","TextureID":"http://roblox.com/asset/?id=547751954","metaData":{"sig":"39ABB446-DCA7-4E3E-B9F1-3C59587BC061"}},"<Instance> (LeftLowerArm)":{"<Instance> (LeftElbow)":{"Part1":"91F3C324-738E-4A12-A347-33FDB5F9286C","C0":"c0(-2 -2 0 0 0 0)","Name":"LeftElbow","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 1 -1 0 0 0)","ClassName":"Motor6D","Part0":"522D05FD-DC32-47F7-BF6E-3A942DBB12DB","metaData":{"sig":"A37F27F3-C46E-4D32-B7A7-F3AB317D84A9"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754229","TextureID":"http://roblox.com/asset/?id=547751836","RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(104 14 5 0 0 0)","<Instance> (OriginalSize)":{"WorldCFrame":"c0(104 15 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,1,-1)","metaData":{"sig":"931EE813-1DC0-45D8-A2C4-0CF22BF6F30E"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftElbowRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"FBB55C8D-579E-47D2-ACE6-C1C3ED0074FE"}},"<Instance> (LeftLowerArm)":{"Stiffness":"1","Name":"LeftLowerArm","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593567","metaData":{"sig":"6A7B7C17-363F-4CAC-A5AF-22588E0F7F32"}},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","ClassName":"MeshPart","Size":"v3(4,5,4)","metaData":{"sig":"91F3C324-738E-4A12-A347-33FDB5F9286C"},"<Instance> (LeftWristRigAttachment)":{"Value":"v3(4,5,4)","metaData":{"sig":"09724CE8-F966-44D2-A269-A6D155065B98"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Name":"LeftLowerArm","<Instance> (LeftElbowRigAttachment)":{"WorldCFrame":"c0(104 11 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-3,-1)","metaData":{"sig":"111F399D-CD7B-4DCD-A1A3-1166408C64FA"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftWristRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"29A2DBE9-2C4B-4A11-B916-F6EA7372187F"}}},"<Instance> (RightFoot)":{"<Instance> (RightAnkleRigAttachment)":{"Value":"v3(5,2,7)","metaData":{"sig":"601ADEEB-18A9-4A2F-B396-4B483AC6DB23"},"Name":"OriginalSize","ClassName":"Vector3Value"},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754269","ClassName":"MeshPart","Size":"v3(5,2,7)","Color":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","<Instance> (RightFootAttachment)":{"WorldCFrame":"c0(114 1 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,0,1)","metaData":{"sig":"06745F4A-0A5A-4EFA-9343-28CF0C4B2655"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightAnkleRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"BEBE5B98-0561-40FF-93D5-FECA498B8D2D"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(115 1 3 0 0 0)","<Instance> (OriginalSize)":{"WorldCFrame":"c0(114 0 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,-1,1)","metaData":{"sig":"5C272201-EA56-4BF0-AB77-812AAF457902"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightFootAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"B8A0C829-2758-48C8-AB9A-2CDC963FCC4F"}},"Name":"RightFoot","<Instance> (RightAnkle)":{"Part1":"B8129241-CBDE-4B6C-A733-BB156901A079","C0":"c0(0 -2 0 0 0 0)","Name":"RightAnkle","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 0 1 0 0 0)","ClassName":"Motor6D","Part0":"8FBFAD9B-3922-4156-97C4-6C757324D09C","metaData":{"sig":"3D5C99C0-B065-488E-9F2C-7B19BEE830F8"}},"TextureID":"http://roblox.com/asset/?id=547752159","<Instance> (RightFoot)":{"Stiffness":"1","Name":"RightFoot","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593601","metaData":{"sig":"7CDB9D90-B485-4AFE-9D94-339D1B95E647"}},"metaData":{"sig":"B8129241-CBDE-4B6C-A733-BB156901A079"}},"<Instance> (LeftUpperArm)":{"Size":"v3(6,6,4)","ClassName":"MeshPart","Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (LeftElbowRigAttachment)":{"Part1":"522D05FD-DC32-47F7-BF6E-3A942DBB12DB","C0":"c0(-5 3 1 0 0 0)","Name":"LeftShoulder","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 2 0 0 0 0)","ClassName":"Motor6D","Part0":"A9241B6F-BF1F-49F5-9123-375C77C88FE4","metaData":{"sig":"3A5DBA02-63BA-45C8-B63E-098F63B979A4"}},"<Instance> (LeftUpperArm)":{"Value":"v3(6,6,4)","metaData":{"sig":"921A1AEB-EA41-4BD3-A9BD-CB1A52053AE1"},"Name":"OriginalSize","ClassName":"Vector3Value"},"<Instance> (LeftShoulderRigAttachment)":{"WorldCFrame":"c0(104 15 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(-2,-2,0)","metaData":{"sig":"CB5D1CDE-8A9B-46F4-AA3F-901E0E016588"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftElbowRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"B7B8DB41-7774-48EC-83E7-AB4F45943D89"}},"<Instance> (LeftShoulderAttachment)":{"WorldCFrame":"c0(104 20 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(-2,3,0)","metaData":{"sig":"95064A36-BE69-4301-B517-D0796DFC0C30"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftShoulderAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"19E9715A-5CFC-4BB5-AD1D-81ABD8370A27"}},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754234","<Instance> (OriginalSize)":{"Stiffness":"1","Name":"LeftUpperArm","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593607","metaData":{"sig":"8207FF4B-4C99-492B-BEE9-7B8256DFBC38"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(107 17 4 0 0 0)","Name":"LeftUpperArm","TextureID":"http://roblox.com/asset/?id=547751836","<Instance> (LeftShoulder)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"LeftShoulderRigAttachment","ClassName":"Attachment","WorldCFrame":"c0(107 19 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,2,0)","metaData":{"sig":"A4C3355F-0EDB-4108-8CCB-1B00DA00AC9E"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"389B8086-4A67-4110-B539-A7DE16341F32"}},"metaData":{"sig":"522D05FD-DC32-47F7-BF6E-3A942DBB12DB"}},"<Instance> (LowerTorso)":{"ClassName":"MeshPart","Size":"v3(16,13,16)","<Instance> (RootRigAttachment)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,6,0)","metaData":{"sig":"C523EE39-79A2-44F7-8DC9-0F1414A3CC5B"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(112 12 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"WaistRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"7CA39369-2316-433B-8D8C-A63A4D25081C"}},"<Instance> (WaistRigAttachment)":{"Stiffness":"1","Name":"LowerTorso","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=6925067367","metaData":{"sig":"ADB02312-950C-497C-BB90-6F47EDD8A57B"}},"TextureID":"http://roblox.com/asset/?id=547752244","CFrame":"c0(112 6 4 0 0 0)","RenderFidelity":"e(RenderFidelity Precise)","<Instance> (Root)":{"Part1":"F4078504-A56A-4C93-864B-BE8417033B71","C0":"c0(0 -5 0 0 0 0)","Name":"Root","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 4 0 0 0 0)","ClassName":"Motor6D","Part0":"B3B2373A-39E9-44D8-88E4-1CDCF99B47FE","metaData":{"sig":"5953633B-C40B-4906-8BED-857A682CB34A"}},"<Instance> (WaistCenterAttachment)":{"WorldCFrame":"c0(114 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(2,4,0)","metaData":{"sig":"F1BE5A5F-48EF-4051-BDC0-6CB9DA2CF350"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RightHipRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"3FCC28FA-516F-4DCF-BA12-E26F7F7390E2"}},"<Instance> (LowerTorso)":{"Value":"v3(16,13,16)","metaData":{"sig":"B5A61FD0-5AF7-4F46-A219-0AD2FD09AFB4"},"Name":"OriginalSize","ClassName":"Vector3Value"},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754284","<Instance> (OriginalSize)":{"WorldCFrame":"c0(112 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,4,0)","metaData":{"sig":"365FAA8E-0D78-4E16-87C5-7BC713E9D3D4"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"RootRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"2CE3D696-A767-42E1-B0FA-D5084FA953FC"}},"<Instance> (RightHipRigAttachment)":{"WorldCFrame":"c0(109 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(-3,4,0)","metaData":{"sig":"3820F7EA-2727-4761-806A-0532CB946253"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"LeftHipRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"6C3EFA58-35E8-455A-9AC4-FDBB7F818EAF"}},"<Instance> (WaistBackAttachment)":{"WorldCFrame":"c0(112 10 2 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,4,-2)","metaData":{"sig":"9C304073-DE2D-47B3-A4F2-37C54F871D70"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldAxis":"v3(5,0,0)","Name":"WaistFrontAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"BD090FFB-D0ED-4DFE-96D7-79D2DABA2A8F"}},"<Instance> (LeftHipRigAttachment)":{"Name":"WaistCenterAttachment","WorldAxis":"v3(5,0,0)","ClassName":"Attachment","WorldCFrame":"c0(112 10 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,4,0)","metaData":{"sig":"3F0EA667-595E-48EA-A6C1-ACD2C4956CDE"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"A694D833-167B-4A5E-A7F2-21076761D764"}},"Name":"LowerTorso","<Instance> (WaistFrontAttachment)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,4,3)","metaData":{"sig":"64CC4CE9-F928-4A8A-ADCD-82C9AF7B0578"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(112 10 7 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"WaistBackAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"4CE6D0E0-C4B8-45F8-918C-5085FE0211DA"}},"Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","metaData":{"sig":"F4078504-A56A-4C93-864B-BE8417033B71"}},"<Instance> (RightLowerArm)":{"<Instance> (OriginalSize)":{"Part1":"DCDEF39C-70FF-4B2B-9083-4458430E0EB7","C0":"c0(2 -2 0 0 0 0)","Name":"RightElbow","MaxVelocity":"0","DesiredAngle":"0","CurrentAngle":"0","C1":"c0(0 1 -1 0 0 0)","ClassName":"Motor6D","Part0":"877CE21F-8D82-41EF-9AD6-49B0CFC2F4A2","metaData":{"sig":"E69CCA08-0EC2-4724-BA69-E3A6CB2E4F13"}},"<Instance> (RightElbowRigAttachment)":{"Value":"v3(4,5,4)","metaData":{"sig":"D7EE4A9A-6FEA-4B06-A6B7-667F02CAF730"},"Name":"OriginalSize","ClassName":"Vector3Value"},"CollisionFidelity":"e(CollisionFidelity Box)","MeshId":"http://www.roblox.com/asset/?id=547754242","TextureID":"http://roblox.com/asset/?id=547752057","ClassName":"MeshPart","<Instance> (RightLowerArm)":{"WorldSecondaryAxis":"v3(0,5,0)","WorldAxis":"v3(5,0,0)","Name":"RightElbowRigAttachment","ClassName":"Attachment","WorldCFrame":"c0(119 15 4 0 0 0)","<Instance> (OriginalPosition)":{"Value":"v3(0,1,-1)","metaData":{"sig":"707FFD31-9FC8-4FF4-853B-3FD44AB3E03C"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"metaData":{"sig":"E960DD86-5D76-4552-9699-317A2235B774"}},"Size":"v3(4,5,4)","Color":"c3(0.9725490212440491 0.9725490212440491 0.9725490212440491)","<Instance> (RightWristRigAttachment)":{"Stiffness":"1","Name":"RightLowerArm","ClassName":"WrapTarget","CageMeshId":"https://assetdelivery.roblox.com/v1/asset/?id=9500593654","metaData":{"sig":"5E2BEA7A-CD3E-4061-B659-E2EF38155454"}},"RenderFidelity":"e(RenderFidelity Precise)","CFrame":"c0(119 14 5 0 0 0)","Name":"RightLowerArm","<Instance> (RightElbow)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,-3,-1)","metaData":{"sig":"4B1F45A5-FDC3-4420-B2CF-6474E6A01088"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(119 11 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"RightWristRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"415BB202-7EA2-430C-98E2-58EF9C450C5D"}},"metaData":{"sig":"DCDEF39C-70FF-4B2B-9083-4458430E0EB7"}},"<Instance> (Body Colors)":{"metaData":{"sig":"89478C5F-B1B3-46F8-B7C2-096C672AE37E"},"LeftLegColor3":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","TorsoColor3":"c3(0.9725490808486938 0.9725490808486938 0.9725490808486938)","RightArmColor3":"c3(0.9725490808486938 0.9725490808486938 0.9725490808486938)","HeadColor3":"c3(0.9725490808486938 0.9725490808486938 0.9725490808486938)","Name":"Body Colors","ClassName":"BodyColors","RightLegColor3":"c3(0.06666667014360428 0.06666667014360428 0.06666667014360428)","LeftArmColor3":"c3(0.9725490808486938 0.9725490808486938 0.9725490808486938)"},"<Instance> (HumanoidRootPart)":{"<Instance> (OriginalSize)":{"<Instance> (OriginalPosition)":{"Value":"v3(0,0,0)","metaData":{"sig":"2B5BBE57-8C22-4C3C-8A8C-885C6219B7EF"},"Name":"OriginalPosition","ClassName":"Vector3Value"},"WorldCFrame":"c0(112 10 4 0 0 0)","WorldAxis":"v3(5,0,0)","Name":"RootRigAttachment","ClassName":"Attachment","WorldSecondaryAxis":"v3(0,5,0)","metaData":{"sig":"7621E90C-9ABE-4162-86EC-38514CFEBBAB"}},"CFrame":"c0(112 15 4 0 0 0)","Transparency":"1","Name":"HumanoidRootPart","ClassName":"Part","Size":"v3(10,10,5)","<Instance> (RootRigAttachment)":{"Value":"v3(10,10,5)","metaData":{"sig":"D15F3249-7C74-4746-ABCA-CDEF510EF828"},"Name":"OriginalSize","ClassName":"Vector3Value"},"Anchored":true,"metaData":{"sig":"B3B2373A-39E9-44D8-88E4-1CDCF99B47FE"}}}'

I was able to compress this to a string that is 572192 bytes. Is this good enough or should I continue to make my string compression function better? The code I am currently using is below:

local MaxBit = 3;
local Seperator = string.char(MaxBit);
local Bit = string.char(1);
local RepeatingFormat = "%s+";

local oplus, tplus = RepeatingFormat:format(Bit), RepeatingFormat:format(string.char(2));

local function RLE(extra)
	local first_char = extra:sub(1, 1);
	local byte = first_char:byte();
	local len = extra:len();
	if len > MaxBit and byte + len < len*byte then
		return first_char .. string.char(len);
	else
		return extra;
	end;
end;

local function compress(str)
	local binary = {};
	
	for _, char in ipairs(str:split("")) do
		local binary_str = "";
		local byte = char:byte();
		while byte > 0 do
			binary_str ..= string.char((byte % 2) + 1);
			byte = math.modf(byte / 2);
		end;
		local char8 = binary_str:gsub("^", Bit:rep(math.clamp(8 - binary_str:len(), 0, 8)));
		table.insert(binary, char8);
	end;
	
	local res = table.concat(binary, Seperator):gsub(oplus, RLE):gsub(tplus, RLE);
	return res;
end;

In the above code, the string is turned into binary, 0’s are represented by 1-byte characters and 1’s are represented by 2-byte characters. Each compressed character is separated by a 3-byte character. If any character is repeated 4 or more times all the characters, that chunk of characters is replaced with one of that type of character with a number of bytes equal to the number of times the character was repeated, unless doing so results in more bytes than leaving the chunk alone.

Thanks in advance to those who reply their suggestions!

1 Like

What is the string compression for?

String compression is basically a way to compress all the data needed to store a string into a smaller size. It’s useful for when you have set limit on the data you can store, like a DataStore.
Sorry, misunderstood their question.

To OP:
You might want to compare your string compression to other string compression modules to see whether you should improve it further.

I know, but I am interested in what you intend to use it for. What is the problem that you are trying to solve with string compression?

By the way, the LZW algorithm might be of good use.

2 Likes

I am working on a serializer, however, for larger models, like the one I showed in the post, I would be serializing the model to a string that can be millions of bytes. I’m creating the string compressor in order to reduce the amount of space the serialized strings take up.

I actually compared it with 1waffle1’s text compression, which could only get the test string down to 1333713 bytes. I also tried zlib and deflate, this was working, however, the module was unable to decompress the compressed strings, and the compressions are too complex for me to figure out how to decompress them on my own.

Hi, I was the one who ported zlib and deflate to Roblox. Could you please send me some examples of what you were trying to compress/decompress when the module failed (the example you gave was successfully compressed/decompressed for me)?

My test code:

local compression = require(script.Parent.Compression)
local inputString = require(script.Parent.InputString)

local configs = {
	level = 3; -- integer 0 -> 9 where 0 is no compression and 9 is most compression
	strategy = "dynamic" -- "huffman_only", "fixed", "dynamic"
}

print(inputString:len())

local t = os.clock()

local compressedString = compression.Zlib.Compress(inputString, configs)
local decompressedString = compression.Zlib.Decompress(compressedString)

print((os.clock() - t) * 1000)

print(compressedString:len())
print(decompressedString:len())
print(decompressedString == inputString)

Output:

  39916 -- uncompressed length
  12.905200012028217 -- compression time (ms)
  8158 -- compressed length
  39916 -- uncompressed length
  true -- check if initial input == decompression output

I was using compression.Deflate, should I have been using Zlib?

compresion.Deflate is working well for me as well (on your input). Can you send me some sample inputs that failed for you, and potentially some accompanying code so I can validate that as well? (you can dm me if you’d like)?

I should probably also validate, were you storing this in a datastore and then attempting to decompress it afterwards? It is worth noting that only 127 characters are supported by Datastores, and only 93 of these are actually one byte long when stored in a Datastore. My module does not compress for datastore usage (using all 256 characters provided by string.char/string.byte), but could be easily modified to do so.

The compression and decompression are working for a little test script I made just now, however in my implementation of the module to what I’m working on it isn’t decompressing. I’m actually not creating a data store but creating a plugin where the selected model is serialized and then that serialized string is put into a module:

encoded = Compression.Compress(HttpService:JSONEncode(encoded));
	
local new_map = Instance.new("ModuleScript");
new_map.Name = selected_map.Name;
new_map.Source = string.format("return %s", encoded);
new_map.Parent = DecodeModule.Maps;
	
do
	local corrected = new_map.Source;
	corrected = string.format("return %s", "[[" .. corrected:sub(7, corrected:len()) .. "]]")
	new_map.Source = corrected;
end;
	
Selection:Set{new_map};
ChangeHistoryService:SetWaypoint("Encoded map");

When I require the module script the plugin creates and decompress that, it gives me “nil -1”

Roblox’s script.Source does not support non-ascii characters. You’d have to do something like Base64 encoding on top of compression.

The following worked for me (Note that the semicolons were added so that I can run it in the command line):

(Here’s the Base64 encoding module I used)

local compression = require(game:GetService("ServerScriptService").Compression);
local inputString = require(game:GetService("ServerScriptService").InputString);
local base64 = require(game:GetService("ServerScriptService").Base64);

local configs = {
	level = 3;
	strategy = "dynamic";
};


local compressedString = compression.Deflate.Compress(inputString, configs);
local base64CompressedString = base64.encode(compressedString);

print(inputString:len());
print(compressedString:len());
print(base64CompressedString:len());

local targetModule = Instance.new("ModuleScript");
targetModule.Parent = workspace;
targetModule.Name = "CompressedData";
targetModule.Source = string.format("return [[%s]]", base64CompressedString);

local requiredCompressedEncodedString = require(targetModule);
local requiredCompressedString = base64.decode(requiredCompressedEncodedString);
print(requiredCompressedString == compressedString);

local decompressedString = compression.Deflate.Decompress(requiredCompressedString);
print(decompressedString == inputString);

Output:

39916
8152
10872
▶ true (x2) 
1 Like

I tried it out and it works, thanks for the help :smile:

1 Like

Here boboo

function compress(s)
    local last = s:sub(1,1)
    local count = 1
    local r = ""
 
    for i = 2, #s do
        local c = s:sub(i,i)
        if c == last then
            count = count + 1
        else
            r = r .. last .. count
            last = c
            count = 1
        end
    end
 
    return r .. last .. count
end