private AnimationClip CopyAndNeutralize(AnimationClip animationClipToBePreserved, HashSet <CurveKey> allApplicableCurveKeys, bool useExhaustiveAnimations)
        {
            var copyOfAnimationClip = new AnimationClip {
                name = "zAutogeneratedExp_" + animationClipToBePreserved.name + "_DO_NOT_EDIT"
            };

            AnimationUtility.SetAnimationClipSettings(copyOfAnimationClip, AnimationUtility.GetAnimationClipSettings(animationClipToBePreserved));
            var originalBindings = AnimationUtility.GetCurveBindings(animationClipToBePreserved);

            foreach (var binding in originalBindings)
            {
                var curveKey     = CurveKey.FromBinding(binding);
                var canCopyCurve = _compilerConflictFxLayerMode == ConflictFxLayerMode.KeepBoth || !ShouldRemoveCurve(curveKey);
                if (canCopyCurve)
                {
                    var curve = AnimationUtility.GetEditorCurve(animationClipToBePreserved, binding);
                    if (!_doNotFixSingleKeyframes && curve.keys.Length == 1)
                    {
                        curve = new AnimationCurve(MakeSingleKeyframeIntoTwo(curve));
                    }
                    AnimationUtility.SetEditorCurve(copyOfAnimationClip, binding, curve);
                }
            }

            if (useExhaustiveAnimations)
            {
                var thisAnimationPaths = originalBindings
                                         .Select(CurveKey.FromBinding)
                                         .ToList();
                AddMissingCurveKeys(allApplicableCurveKeys, thisAnimationPaths, copyOfAnimationClip);
            }

            return(copyOfAnimationClip);
        }
        private static Dictionary <CurveKey, float> ExtractFirstKeyframeValueOf(AnimationClip clip)
        {
            var curveKeyToFallbackValue = new Dictionary <CurveKey, float>();

            foreach (var editorCurveBinding in AnimationUtility.GetCurveBindings(clip))
            {
                var curve = AnimationUtility.GetEditorCurve(clip, editorCurveBinding);

                if (curve.keys.Length > 0)
                {
                    curveKeyToFallbackValue.Add(CurveKey.FromBinding(editorCurveBinding), curve.keys[0].value);
                }
            }

            return(curveKeyToFallbackValue);
        }