public Cleaned.BillStatus Convert(Original.Bill source, Cleaned.BillStatus destination, ResolutionContext context)
        {
            Cleaned.BillStatus bill = new Cleaned.BillStatus();

            bill.Number   = source.BillNumber;
            bill.Congress = source.Congress;
            bill.Title    = source.Title;
            bill.ConstitutionalAuthorityStatement = ParseHelpers.ParseAndStripHTML(source.ConstitutionalAuthorityStatementText);
            bill.Type             = source.BillType;
            bill.OriginChamber    = source.OriginChamber;
            bill.UpdateDate       = ParseHelpers.ParseNullableDateTime(source.UpdateDate);
            bill.IntroducedDate   = ParseHelpers.ParseNullableDateTime(source.IntroducedDate);
            bill.CreateDate       = ParseHelpers.ParseNullableDateTime(source.CreateDate);
            bill.Actions          = context.Mapper.Map <Original.Actions, IReadOnlyCollection <Cleaned.BillStatusAction> >(source.Actions);
            bill.Amendments       = context.Mapper.Map <Original.Amendments, IReadOnlyCollection <Cleaned.BillStatusAmendment> >(source.Amendments);
            bill.Summaries        = context.Mapper.Map <Original.Summaries, IReadOnlyCollection <Cleaned.BillStatusSummary> >(source.Summaries);
            bill.CalendarNumbers  = context.Mapper.Map <Original.CalendarNumbers, IReadOnlyCollection <Cleaned.BillStatusCalendarNumber> >(source.CalendarNumbers);
            bill.CBOCostEstimates = context.Mapper.Map <Original.CboCostEstimates, IReadOnlyCollection <Cleaned.BillStatusCBOCostEstimate> >(source.CboCostEstimates);
            bill.CommitteeReports = context.Mapper.Map <Original.CommitteeReports, IReadOnlyCollection <Cleaned.BillStatusCommitteeReport> >(source.CommitteeReports);
            bill.Committees       = context.Mapper.Map <Original.Committees, IReadOnlyCollection <Cleaned.BillStatusCommittee> >(source.Committees);
            bill.Cosponsors       = context.Mapper.Map <Original.Cosponsors, IReadOnlyCollection <Cleaned.BillStatusCosponsor> >(source.Cosponsors);
            bill.LatestAction     = context.Mapper.Map <Original.LatestAction, Cleaned.LatestAction>(source.LatestAction);
            bill.Laws             = context.Mapper.Map <Original.Laws, IReadOnlyCollection <Cleaned.BillStatusLaw> >(source.Laws);
            bill.Notes            = context.Mapper.Map <Original.Notes, IReadOnlyCollection <Cleaned.BillStatusNote> >(source.Notes);
            bill.PolicyArea       = context.Mapper.Map <Original.PolicyArea, Cleaned.PolicyArea>(source.PolicyArea);
            bill.RecordedVotes    = context.Mapper.Map <Original.RecordedVotes, IReadOnlyCollection <Cleaned.BillStatusRecordedVote> >(source.RecordedVotes);
            bill.RelatedBills     = context.Mapper.Map <Original.RelatedBills, IReadOnlyCollection <Cleaned.BillStatusRelatedBill> >(source.RelatedBills);
            bill.Sponsors         = context.Mapper.Map <Original.Sponsors, IReadOnlyCollection <Cleaned.BillStatusSponsor> >(source.Sponsors);
            bill.Subject          = context.Mapper.Map <Original.Subjects, Cleaned.BillStatusSubject>(source.Subjects);
            bill.Titles           = context.Mapper.Map <Original.Titles, IReadOnlyCollection <Cleaned.BillStatusTitle> >(source.Titles);

            return(bill);
        }
        public static void Initialize()
        {
            if (isInitialized)
            {
                return;
            }

            if (config == null)
            {
                config = new MapperConfiguration(x =>
                {
                    #region Itemized Collection Mappings

                    x.CreateMap <Original.Titles, IReadOnlyCollection <Cleaned.BillStatusTitle> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Titles, Cleaned.BillStatusTitle, Original.Item> >();

                    x.CreateMap <Original.Sponsors, IReadOnlyCollection <Cleaned.BillStatusSponsor> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Sponsors, Cleaned.BillStatusSponsor, Original.Item> >();

                    x.CreateMap <Original.Sponsors, IReadOnlyCollection <Cleaned.BillAmendmentSponsor> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Sponsors, Cleaned.BillAmendmentSponsor, Original.Item> >();

                    x.CreateMap <Original.RelatedBills, IReadOnlyCollection <Cleaned.BillStatusRelatedBill> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.RelatedBills, Cleaned.BillStatusRelatedBill, Original.Item> >();

                    x.CreateMap <Original.Notes, IReadOnlyCollection <Cleaned.BillStatusNote> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Notes, Cleaned.BillStatusNote, Original.Item> >();

                    x.CreateMap <Original.Laws, IReadOnlyCollection <Cleaned.BillStatusLaw> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Laws, Cleaned.BillStatusLaw, Original.Item> >();

                    x.CreateMap <Original.Cosponsors, IReadOnlyCollection <Cleaned.BillStatusCosponsor> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Cosponsors, Cleaned.BillStatusCosponsor, Original.Item> >();

                    x.CreateMap <Original.BillCommittees, IReadOnlyCollection <Cleaned.BillStatusCommittee> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.BillCommittees, Cleaned.BillStatusCommittee, Original.Item> >();

                    x.CreateMap <Original.CboCostEstimates, IReadOnlyCollection <Cleaned.BillStatusCBOCostEstimate> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.CboCostEstimates, Cleaned.BillStatusCBOCostEstimate, Original.Item> >();

                    x.CreateMap <Original.CalendarNumbers, IReadOnlyCollection <Cleaned.BillStatusCalendarNumber> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.CalendarNumbers, Cleaned.BillStatusCalendarNumber, Original.Item> >();

                    x.CreateMap <Original.Actions, IReadOnlyCollection <Cleaned.BillStatusAction> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Actions, Cleaned.BillStatusAction, Original.Item> >();

                    x.CreateMap <Original.Actions, IReadOnlyCollection <Cleaned.BillAmendmentAction> >()
                    .ConvertUsing <BillAmendmentActionsTypeConverter>();

                    x.CreateMap <Original.Links, IReadOnlyCollection <Cleaned.Link> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Links, Cleaned.Link, Original.Link> >();

                    x.CreateMap <Original.Amendments, IReadOnlyCollection <Cleaned.BillStatusAmendment> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Amendments, Cleaned.BillStatusAmendment, Original.Amendment> >();

                    x.CreateMap <Original.LegislativeSubjects, IReadOnlyCollection <Cleaned.LegislativeSubject> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.LegislativeSubjects, Cleaned.LegislativeSubject, Original.Item> >();

                    x.CreateMap <Original.Activities, IReadOnlyCollection <Cleaned.CommitteeActivity> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Activities, Cleaned.CommitteeActivity, Original.Item> >();

                    x.CreateMap <Original.Activities, IReadOnlyCollection <Cleaned.SubcommitteeActivity> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Activities, Cleaned.SubcommitteeActivity, Original.Item> >();

                    x.CreateMap <Original.Subcommittees, IReadOnlyCollection <Cleaned.Subcommittee> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Subcommittees, Cleaned.Subcommittee, Original.Item> >();

                    x.CreateMap <Original.BillCommittees, IReadOnlyCollection <Cleaned.BillStatusCommittee> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.BillCommittees, Cleaned.BillStatusCommittee, Original.Item> >();

                    x.CreateMap <Original.BillSummaries, IReadOnlyCollection <Cleaned.BillStatusSummary> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.BillSummaries, Cleaned.BillStatusSummary, Original.Item> >();

                    x.CreateMap <Original.Notes, IReadOnlyCollection <Cleaned.BillStatusNote> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.Notes, Cleaned.BillStatusNote, Original.Item> >();

                    x.CreateMap <Original.CommitteeReports, IReadOnlyCollection <Cleaned.BillStatusCommitteeReport> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.CommitteeReports, Cleaned.BillStatusCommitteeReport, Original.CommitteeReport> >();

                    x.CreateMap <Original.Committees, IReadOnlyCollection <Cleaned.BillStatusCommittee> >()
                    .ConvertUsing(src =>
                    {
                        return(mapper.Map <Original.BillCommittees, IReadOnlyCollection <Cleaned.BillStatusCommittee> >(src.BillCommittees));
                    });

                    x.CreateMap <Original.Summaries, IReadOnlyCollection <Cleaned.BillStatusSummary> >()
                    .ConvertUsing(src =>
                    {
                        return(mapper.Map <Original.BillSummaries, IReadOnlyCollection <Cleaned.BillStatusSummary> >(src.BillSummaries));
                    });

                    x.CreateMap <Original.RecordedVotes, IReadOnlyCollection <Cleaned.BillStatusRecordedVote> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.RecordedVotes, Cleaned.BillStatusRecordedVote, Original.RecordedVote> >();

                    x.CreateMap <Original.RelationshipDetails, IReadOnlyCollection <Cleaned.RelationshipDetail> >()
                    .ConvertUsing <ItemizedTypeConverter <Original.RelationshipDetails, Cleaned.RelationshipDetail, Original.Item> >();

                    #endregion Itemized Collection Mappings

                    #region Item Mappings

                    x.CreateMap <Original.Item, Cleaned.Subcommittee>();

                    x.CreateMap <Original.Item, Cleaned.LegislativeSubject>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusCalendarNumber>();

                    x.CreateMap <Original.Item, Cleaned.BillAmendmentSponsor>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusNote>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusSummary>()
                    .ForMember(dest => dest.ActionDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.ActionDate)))
                    .ForMember(dest => dest.UpdateDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.UpdateDate)))
                    .ForMember(dest => dest.LastSummaryUpdateDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.LastSummaryUpdateDate)))
                    .ForMember(dest => dest.ActionDescription,
                               opts => opts.MapFrom(src => src.ActionDesc))
                    .ForMember(dest => dest.Text,
                               opts => opts.MapFrom(src => ParseHelpers.ParseAndStripHTML(src.Text)));

                    x.CreateMap <Original.Item, Cleaned.BillStatusCosponsor>()
                    .ForMember(dest => dest.IsOriginalCosponsor,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableBoolean(src.IsOriginalCosponsor)))
                    .ForMember(dest => dest.SponsorshipDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.SponsorshipDate)))
                    .ForMember(dest => dest.SponsorshipWithdrawnDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.SponsorshipWithdrawnDate)))
                    .ForMember(dest => dest.District,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableInt(src.District)));

                    x.CreateMap <Original.Item, Cleaned.BillAmendmentAction>()
                    .ForMember(dest => dest.ActionDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.ActionDate, src.ActionTime)));

                    x.CreateMap <Original.Item, Cleaned.BillStatusAction>()
                    .ForMember(dest => dest.ActionDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.ActionDate, src.ActionTime)));

                    x.CreateMap <Original.Item, Cleaned.SubcommitteeActivity>()
                    .ForMember(dest => dest.Date,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.Date)));

                    x.CreateMap <Original.Item, Cleaned.CommitteeActivity>()
                    .ForMember(dest => dest.Date,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.Date)));

                    x.CreateMap <Original.Item, Cleaned.BillStatusRelatedBill>()
                    .ForMember(dest => dest.RelationshipDetails,
                               opts => opts.MapFrom(src => src.RelationshipDetails));

                    x.CreateMap <Original.Item, Cleaned.RelationshipDetail>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusLaw>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusSponsor>()
                    .ForMember(dest => dest.District,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableInt(src.District)));

                    x.CreateMap <Original.Item, Cleaned.BillStatusTitle>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusCommittee>();

                    x.CreateMap <Original.Item, Cleaned.BillStatusCBOCostEstimate>()
                    .ForMember(dest => dest.PublishedDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.PubDate)))
                    .ForMember(dest => dest.URL,
                               opts => opts.MapFrom(src => new Uri(src.Url)));

                    x.CreateMap <Original.RecordedVote, Cleaned.BillStatusRecordedVote>()
                    .ForMember(dest => dest.Date,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.Date)))
                    .ForMember(dest => dest.URL,
                               opts => opts.MapFrom(src => new Uri(src.Url)));

                    #endregion Item Mappings

                    x.CreateMap <Original.Link, Cleaned.Link>()
                    .ForMember(dest => dest.URL,
                               opts => opts.MapFrom(src => new Uri(src.Url)));

                    x.CreateMap <Original.Amendment, Cleaned.BillStatusAmendment>()
                    .ForMember(dest => dest.Actions,
                               opts => opts.MapFrom(src => src.Actions != null ? src.Actions.InnerActions : null))
                    .ForMember(dest => dest.Congress,
                               opts => opts.MapFrom(src => ParseHelpers.GetFirstStringOrEmpty(src.Congress)))
                    .ForMember(dest => dest.CreateDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.CreateDate)))
                    .ForMember(dest => dest.ProposedDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.ProposedDate)))
                    .ForMember(dest => dest.SubmittedDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.SubmittedDate)))
                    .ForMember(dest => dest.UpdateDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.UpdateDate)))
                    .ForMember(dest => dest.Number,
                               opts => opts.MapFrom(src => ParseHelpers.GetFirstStringOrEmpty(src.Number)))
                    .ForMember(dest => dest.Purpose,
                               opts => opts.MapFrom(src => ParseHelpers.GetFirstStringOrEmpty(src.Purpose)))
                    .ForMember(dest => dest.Description,
                               opts => opts.MapFrom(src => ParseHelpers.GetFirstStringOrEmpty(src.Description)))
                    .ForMember(dest => dest.Type,
                               opts => opts.MapFrom(src => ParseHelpers.GetFirstStringOrEmpty(src.Type)));

                    x.CreateMap <Original.AmendedBill, Cleaned.AmendedBill>();

                    x.CreateMap <Original.AmendedAmendment, Cleaned.AmendedAmendment>();

                    x.CreateMap <Original.Committee, Cleaned.BillActionCommittee>();

                    x.CreateMap <Original.SourceSystem, Cleaned.SourceSystem>();

                    x.CreateMap <Original.CommitteeReport, Cleaned.BillStatusCommitteeReport>();

                    x.CreateMap <Original.Identifiers, Cleaned.Identifiers>();

                    x.CreateMap <Original.PolicyArea, Cleaned.PolicyArea>();

                    x.CreateMap <Original.Cosponsors, Cleaned.BillAmendmentCosponsor>();

                    x.CreateMap <Original.LatestAction, Cleaned.LatestAction>()
                    .ForMember(dest => dest.ActionDate,
                               opts => opts.MapFrom(src => ParseHelpers.ParseNullableDateTime(src.ActionDate, src.ActionTime)));

                    x.CreateMap <Original.Bill, Cleaned.BillStatus>().ConvertUsing <BillStatusTypeConverter>();

                    x.CreateMap <Original.Subjects, Cleaned.BillStatusSubject>()
                    .ForMember(dest => dest.LegislativeSubjects,
                               opts => opts.MapFrom(src =>
                                                    src.BillSubjects != null &&
                                                    src.BillSubjects.LegislativeSubjects != null &&
                                                    src.BillSubjects.LegislativeSubjects.Items != null
                            ? mapper.Map <Original.LegislativeSubjects, IReadOnlyCollection <Cleaned.LegislativeSubject> >
                                                        (src.BillSubjects.LegislativeSubjects)
                            : null))
                    .ForMember(dest => dest.PolicyArea,
                               opts => opts.MapFrom(src =>
                                                    src.BillSubjects != null
                            ? src.BillSubjects.PolicyArea
                            : null));
                });
            }

            if (mapper == null)
            {
                mapper = config.CreateMapper();
            }

            isInitialized = true;

#if DEBUG
            //config.AssertConfigurationIsValid();
#endif
        }